ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGMyYjRmYzcuLmE5NDY1OTYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtOTMsMyArOTMsNCBAQAogVG9vbHMvbXNpL29iagogVG9vbHMvc3NsL2FtZDY0CiBUb29scy9zc2wvd2luMzIKKy52c2NvZGUvCmRpZmYgLS1naXQgYS8uaGdpZ25vcmUgYi8uaGdpZ25vcmUKaW5kZXggNThjNzNmYy4uMTUyNzljZCAxMDA2NDQKLS0tIGEvLmhnaWdub3JlCisrKyBiLy5oZ2lnbm9yZQpAQCAtMiw2ICsyLDcgQEAKIC5wdXJpZnkKIC5zdm4vCiBeLmlkZWEvCiteLnZzY29kZS8KIC5EU19TdG9yZQogTWFrZWZpbGUkCiBNYWtlZmlsZS5wcmUkCmRpZmYgLS1naXQgYS8uaGd0YWdzIGIvLmhndGFncwppbmRleCBlZDRmYzkyLi5iN2E3ZWE0IDEwMDY0NAotLS0gYS8uaGd0YWdzCisrKyBiLy5oZ3RhZ3MKQEAgLTE0OCw2ICsxNDgsNyBAQAogNzM3ZWZjYWRmNWE2NzhiMTg0ZTBmYTQzMWFhZTExMjc2YmYwNjY0OCB2My40LjQKIDM2MzFiYjRhMjQ5MDI5MmViZjgxZDNlOTQ3YWUzNmRhMTQ1ZGE1NjQgdjMuNC41cmMxCiA2MTliNjFlNTA1ZDBlMmNjYzg1MTZiMzY2ZTRkZGQxOTcxYjQ2YTZmIHYzLjQuNQorMzYzMWJiNGEyNDkwMjkyZWJmODFkM2U5NDdhZTM2ZGExNDVkYTU2NCB2My40LjVyYzEKIDVkNGI2YTU3ZDVmZDc1NjRiZjczZjNkYjBlNDZmZTVlZWIwMGJjZDggdjMuNS4wYTEKIDAzMzdiZDdlYmNiNjU1OWQ2OTY3OWJjNzAyNTA1OWFkMWNlNGY0MzIgdjMuNS4wYTIKIDgyNjU2ZTI4YjVlNWM0YWU0OGQ4ZGQ4YjVmMGQ3OTY4OTA4YTgyYjYgdjMuNS4wYTMKQEAgLTE2NSwzICsxNjYsNSBAQAogMzdhMDdjZWU1OTY5ZTZkMzY3MjU4MzE4N2E3M2NmNjM2ZmYyOGUxYiB2My41LjEKIDY4ZmVlYzY0ODhiMjYzMjdhODVhNjM0NjA1ZGQyOGVjYTRkYWE1ZjEgdjMuNS4ycmMxCiA0ZGVmMmEyOTAxYTU2MThlYTQ1YmNjOGYyYTE0MTFlZjMzYWYxOGFkIHYzLjUuMgorNTg5NmRhMzcyZmIwNDRlMzg1OTVmYjc0NDk1ZGUxZTFlN2M4ZmIzYyB2My42LjBhMQorMzc4ODkzNDIzNTUyMjNlMmZjMTQzOGRlM2RjN2ZmY2Q2MjVjNjBmNyB2My42LjBhMgpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlIGIvRG9jL01ha2VmaWxlCmluZGV4IDg3ODY4NWQuLjIwMmU4ZTEgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZQorKysgYi9Eb2MvTWFrZWZpbGUKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWNwIC1wUFIgYnVpbGQvZXB1Yi9QeXRob24uZXB1YiBkaXN0L3B5dGhvbi0kKERJU1RWRVJTSU9OKS1kb2NzLmVwdWIKIAogY2hlY2s6Ci0JJChQWVRIT04pIHRvb2xzL3JzdGxpbnQucHkgLWkgdG9vbHMKKwkkKFBZVEhPTikgdG9vbHMvcnN0bGludC5weSAtaSB0b29scyAtaSB2ZW52CiAKIHNlcnZlOgogCS4uL1Rvb2xzL3NjcmlwdHMvc2VydmUucHkgYnVpbGQvaHRtbApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2FyZy5yc3QgYi9Eb2MvYy1hcGkvYXJnLnJzdAppbmRleCA5ODNkMTEzLi5kMTVmNjQ5IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvYXJnLnJzdAorKysgYi9Eb2MvYy1hcGkvYXJnLnJzdApAQCAtMjA2LDggKzIwNiw3IEBACiAgICA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB3aWxsIHVzZSB0aGlzIGxvY2F0aW9uIGFzIHRoZSBidWZmZXIgYW5kIGludGVycHJldCB0aGUKICAgIGluaXRpYWwgdmFsdWUgb2YgKlwqYnVmZmVyX2xlbmd0aCogYXMgdGhlIGJ1ZmZlciBzaXplLiAgSXQgd2lsbCB0aGVuIGNvcHkgdGhlCiAgICBlbmNvZGVkIGRhdGEgaW50byB0aGUgYnVmZmVyIGFuZCBOVUwtdGVybWluYXRlIGl0LiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QgbGFyZ2UKLSAgIGVub3VnaCwgYSA6ZXhjOmBUeXBlRXJyb3JgIHdpbGwgYmUgc2V0LgotICAgTm90ZTogc3RhcnRpbmcgZnJvbSBQeXRob24gMy42IGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCisgICBlbm91Z2gsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCiAKICAgIEluIGJvdGggY2FzZXMsICpcKmJ1ZmZlcl9sZW5ndGgqIGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGRhdGEKICAgIHdpdGhvdXQgdGhlIHRyYWlsaW5nIE5VTCBieXRlLgpAQCAtNDA3LDggKzQwNiwxNSBAQAogLi4gYzpmdW5jdGlvbjo6IGludCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCAuLi4pCiAKICAgIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBib3RoIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQKLSAgIHBhcmFtZXRlcnMgaW50byBsb2NhbCB2YXJpYWJsZXMuICBSZXR1cm5zIHRydWUgb24gc3VjY2Vzczsgb24gZmFpbHVyZSwgaXQKLSAgIHJldHVybnMgZmFsc2UgYW5kIHJhaXNlcyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICAgcGFyYW1ldGVycyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIFRoZSAqa2V5d29yZHMqIGFyZ3VtZW50IGlzIGEKKyAgICpOVUxMKi10ZXJtaW5hdGVkIGFycmF5IG9mIGtleXdvcmQgcGFyYW1ldGVyIG5hbWVzLiAgRW1wdHkgbmFtZXMgZGVub3RlCisgICA6cmVmOmBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyA8cG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcj5gLgorICAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMgZmFsc2UgYW5kIHJhaXNlcyB0aGUKKyAgIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIDpyZWY6YHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzCisgICAgICA8cG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcj5gLgogCiAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCB2YV9saXN0IHZhcmdzKQpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0IGIvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CmluZGV4IDE5Y2JiM2IuLjIyNmI2MTkgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdAorKysgYi9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKQEAgLTMzNCw2ICszMzQsMTQgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCiAKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfUmVzb3VyY2VXYXJuaW5nKFB5T2JqZWN0ICpzb3VyY2UsIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCisgICBGdW5jdGlvbiBzaW1pbGFyIHRvIDpjOmZ1bmM6YFB5RXJyX1dhcm5Gb3JtYXRgLCBidXQgKmNhdGVnb3J5KiBpcworICAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBhbmQgcGFzcyAqc291cmNlKiB0byA6ZnVuYzpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBRdWVyeWluZyB0aGUgZXJyb3IgaW5kaWNhdG9yCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbml0LnJzdCBiL0RvYy9jLWFwaS9pbml0LnJzdAppbmRleCA2Mzk4MTljLi5kNzc4MzZhIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW5pdC5yc3QKKysrIGIvRG9jL2MtYXBpL2luaXQucnN0CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICB0cmlwbGU6IG1vZHVsZTsgc2VhcmNoOyBwYXRoCiAgICAgICBzaW5nbGU6IFB5U3lzX1NldEFyZ3YoKQogICAgICAgc2luZ2xlOiBQeVN5c19TZXRBcmd2RXgoKQotICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogCiAgICBJbml0aWFsaXplIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBJbiBhbiBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgIFB5dGhvbiwgdGhpcwogICAgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG90aGVyIFB5dGhvbi9DIEFQSSBmdW5jdGlvbnM7IHdpdGggdGhlCkBAIC0zNCw3ICszNCw3IEBACiAgICBtb2R1bGVzIDptb2Q6YGJ1aWx0aW5zYCwgOm1vZDpgX19tYWluX19gIGFuZCA6bW9kOmBzeXNgLiAgSXQgYWxzbyBpbml0aWFsaXplcwogICAgdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCAoYGBzeXMucGF0aGBgKS4gSXQgZG9lcyBub3Qgc2V0IGBgc3lzLmFyZ3ZgYDsgdXNlCiAgICA6YzpmdW5jOmBQeVN5c19TZXRBcmd2RXhgIGZvciB0aGF0LiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZCB0aW1lCi0gICAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBmaXJzdCkuICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWU7IGl0IGlzIGEKKyAgICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCiAgICBmYXRhbCBlcnJvciBpZiB0aGUgaW5pdGlhbGl6YXRpb24gZmFpbHMuCiAKIApAQCAtNDgsMTkgKzQ4LDIwIEBACiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0lzSW5pdGlhbGl6ZWQoKQogCiAgICBSZXR1cm4gdHJ1ZSAobm9uemVybykgd2hlbiB0aGUgUHl0aG9uIGludGVycHJldGVyIGhhcyBiZWVuIGluaXRpYWxpemVkLCBmYWxzZQotICAgKHplcm8pIGlmIG5vdC4gIEFmdGVyIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAorICAgKHplcm8pIGlmIG5vdC4gIEFmdGVyIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGlzIGNhbGxlZCwgdGhpcyByZXR1cm5zIGZhbHNlIHVudGlsCiAgICA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBpcyBjYWxsZWQgYWdhaW4uCiAKIAotLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRmluYWxpemUoKQorLi4gYzpmdW5jdGlvbjo6IGludCBQeV9GaW5hbGl6ZUV4KCkKIAogICAgVW5kbyBhbGwgaW5pdGlhbGl6YXRpb25zIG1hZGUgYnkgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kIHN1YnNlcXVlbnQgdXNlIG9mCiAgICBQeXRob24vQyBBUEkgZnVuY3Rpb25zLCBhbmQgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyAoc2VlCiAgICA6YzpmdW5jOmBQeV9OZXdJbnRlcnByZXRlcmAgYmVsb3cpIHRoYXQgd2VyZSBjcmVhdGVkIGFuZCBub3QgeWV0IGRlc3Ryb3llZCBzaW5jZQogICAgdGhlIGxhc3QgY2FsbCB0byA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYC4gIElkZWFsbHksIHRoaXMgZnJlZXMgYWxsIG1lbW9yeQogICAgYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuICBUaGlzIGlzIGEgbm8tb3Agd2hlbiBjYWxsZWQgZm9yIGEgc2Vjb25kCi0gICB0aW1lICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuCi0gICB2YWx1ZTsgZXJyb3JzIGR1cmluZyBmaW5hbGl6YXRpb24gYXJlIGlnbm9yZWQuCisgICB0aW1lICh3aXRob3V0IGNhbGxpbmcgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYWdhaW4gZmlyc3QpLiAgTm9ybWFsbHkgdGhlCisgICByZXR1cm4gdmFsdWUgaXMgMC4gIElmIHRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyBmaW5hbGl6YXRpb24KKyAgIChmbHVzaGluZyBidWZmZXJlZCBkYXRhKSwgLTEgaXMgcmV0dXJuZWQuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnMuICBBbiBlbWJlZGRpbmcgYXBwbGljYXRpb24KICAgIG1pZ2h0IHdhbnQgdG8gcmVzdGFydCBQeXRob24gd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCB0aGUgYXBwbGljYXRpb24gaXRzZWxmLgpAQCAtNzksNyArODAsMTUgQEAKICAgIGZyZWVkLiAgU29tZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIG1heSBub3QgYmUgZnJlZWQuICBTb21lCiAgICBleHRlbnNpb25zIG1heSBub3Qgd29yayBwcm9wZXJseSBpZiB0aGVpciBpbml0aWFsaXphdGlvbiByb3V0aW5lIGlzIGNhbGxlZCBtb3JlCiAgICB0aGFuIG9uY2U7IHRoaXMgY2FuIGhhcHBlbiBpZiBhbiBhcHBsaWNhdGlvbiBjYWxscyA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCBhbmQKLSAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBtb3JlIHRoYW4gb25jZS4KKyAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIG1vcmUgdGhhbiBvbmNlLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9GaW5hbGl6ZSgpCisKKyAgIFRoaXMgaXMgYSBiYWNrd2FyZHMtY29tcGF0aWJsZSB2ZXJzaW9uIG9mIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIHRoYXQKKyAgIGRpc3JlZ2FyZHMgdGhlIHJldHVybiB2YWx1ZS4KIAogCiBQcm9jZXNzLXdpZGUgcGFyYW1ldGVycwpAQCAtMTA3LDcgKzExNiw3IEBACiAgICBOb3RlIHRoYXQgOmRhdGE6YHN5cy5zdGRlcnJgIGFsd2F5cyB1c2VzIHRoZSAiYmFja3NsYXNocmVwbGFjZSIgZXJyb3IKICAgIGhhbmRsZXIsIHJlZ2FyZGxlc3Mgb2YgdGhpcyAob3IgYW55IG90aGVyKSBzZXR0aW5nLgogCi0gICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgaXMgY2FsbGVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgbmVlZCB0byBiZSBjYWxsZWQKKyAgIElmIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGlzIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkCiAgICBhZ2FpbiBpbiBvcmRlciB0byBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscyB0byA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYC4KIAogICAgUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIGEgbm9uemVybyB2YWx1ZSBvbiBlcnJvciAoZS5nLiBjYWxsaW5nIGFmdGVyIHRoZQpAQCAtOTE4LDcgKzkyNyw3IEBACiAgICBlbnRyeS4pCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogUHlfSW5pdGlhbGl6ZSgpCiAKICAgIEV4dGVuc2lvbiBtb2R1bGVzIGFyZSBzaGFyZWQgYmV0d2VlbiAoc3ViLSlpbnRlcnByZXRlcnMgYXMgZm9sbG93czogdGhlIGZpcnN0CkBAIC05MjgsNyArOTM3LDcgQEAKICAgIGFuZCBmaWxsZWQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhpcyBjb3B5OyB0aGUgZXh0ZW5zaW9uJ3MgYGBpbml0YGAgZnVuY3Rpb24gaXMKICAgIG5vdCBjYWxsZWQuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IGhhcHBlbnMgd2hlbiBhbiBleHRlbnNpb24gaXMKICAgIGltcG9ydGVkIGFmdGVyIHRoZSBpbnRlcnByZXRlciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlLWluaXRpYWxpemVkIGJ5IGNhbGxpbmcKLSAgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBhbmQgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWA7IGluIHRoYXQgY2FzZSwgdGhlIGV4dGVuc2lvbidzCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBhbmQgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWA7IGluIHRoYXQgY2FzZSwgdGhlIGV4dGVuc2lvbidzCiAgICBgYGluaXRtb2R1bGVgYCBmdW5jdGlvbiAqaXMqIGNhbGxlZCBhZ2Fpbi4KIAogICAgLi4gaW5kZXg6OiBzaW5nbGU6IGNsb3NlKCkgKGluIG1vZHVsZSBvcykKQEAgLTkzNiwxNCArOTQ1LDE0IEBACiAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSkKIAotICAgLi4gaW5kZXg6OiBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKIAogICAgRGVzdHJveSB0aGUgKHN1Yi0paW50ZXJwcmV0ZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHRocmVhZCBzdGF0ZS4gVGhlIGdpdmVuCiAgICB0aHJlYWQgc3RhdGUgbXVzdCBiZSB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUuICBTZWUgdGhlIGRpc2N1c3Npb24gb2YgdGhyZWFkCiAgICBzdGF0ZXMgYmVsb3cuICBXaGVuIHRoZSBjYWxsIHJldHVybnMsIHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSBpcyAqTlVMTCouICBBbGwKICAgIHRocmVhZCBzdGF0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW50ZXJwcmV0ZXIgYXJlIGRlc3Ryb3llZC4gIChUaGUgZ2xvYmFsCiAgICBpbnRlcnByZXRlciBsb2NrIG11c3QgYmUgaGVsZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIGFuZCBpcyBzdGlsbCBoZWxkCi0gICB3aGVuIGl0IHJldHVybnMuKSAgOmM6ZnVuYzpgUHlfRmluYWxpemVgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CisgICB3aGVuIGl0IHJldHVybnMuKSAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgd2lsbCBkZXN0cm95IGFsbCBzdWItaW50ZXJwcmV0ZXJzIHRoYXQKICAgIGhhdmVuJ3QgYmVlbiBleHBsaWNpdGx5IGRlc3Ryb3llZCBhdCB0aGF0IHBvaW50LgogCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbnRyby5yc3QgYi9Eb2MvYy1hcGkvaW50cm8ucnN0CmluZGV4IGJjM2E3NTIuLjc0NjgxZDIgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9pbnRyby5yc3QKKysrIGIvRG9jL2MtYXBpL2ludHJvLnJzdApAQCAtNjQsOSArNjQsMTAgQEAKIGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yaWVzIDpmaWxlOmB7cHJlZml4fS9pbmNsdWRlL3B5dGhvbnZlcnNpb24vYCBhbmQKIDpmaWxlOmB7ZXhlY19wcmVmaXh9L2luY2x1ZGUvcHl0aG9udmVyc2lvbi9gLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGFuZAogOmVudnZhcjpgZXhlY19wcmVmaXhgIGFyZSBkZWZpbmVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMgdG8gUHl0aG9uJ3MKLTpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBhbmQgKnZlcnNpb24qIGlzIGBgc3lzLnZlcnNpb25bOjNdYGAuICBPbiBXaW5kb3dzLAotdGhlIGhlYWRlcnMgYXJlIGluc3RhbGxlZCBpbiA6ZmlsZTpge3ByZWZpeH0vaW5jbHVkZWAsIHdoZXJlIDplbnZ2YXI6YHByZWZpeGAgaXMKLXRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHNwZWNpZmllZCB0byB0aGUgaW5zdGFsbGVyLgorOnByb2dyYW06YGNvbmZpZ3VyZWAgc2NyaXB0IGFuZCAqdmVyc2lvbiogaXMKK2BgJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdYGAuICBPbiBXaW5kb3dzLCB0aGUgaGVhZGVycyBhcmUgaW5zdGFsbGVkCitpbiA6ZmlsZTpge3ByZWZpeH0vaW5jbHVkZWAsIHdoZXJlIDplbnZ2YXI6YHByZWZpeGAgaXMgdGhlIGluc3RhbGxhdGlvbgorZGlyZWN0b3J5IHNwZWNpZmllZCB0byB0aGUgaW5zdGFsbGVyLgogCiBUbyBpbmNsdWRlIHRoZSBoZWFkZXJzLCBwbGFjZSBib3RoIGRpcmVjdG9yaWVzIChpZiBkaWZmZXJlbnQpIG9uIHlvdXIgY29tcGlsZXIncwogc2VhcmNoIHBhdGggZm9yIGluY2x1ZGVzLiAgRG8gKm5vdCogcGxhY2UgdGhlIHBhcmVudCBkaXJlY3RvcmllcyBvbiB0aGUgc2VhcmNoCkBAIC01NzgsOSArNTc5LDkgQEAKIGFwcGxpY2F0aW9uIG1heSB3YW50IHRvIHN0YXJ0IG92ZXIgKG1ha2UgYW5vdGhlciBjYWxsIHRvCiA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCkgb3IgdGhlIGFwcGxpY2F0aW9uIGlzIHNpbXBseSBkb25lIHdpdGggaXRzICB1c2Ugb2YKIFB5dGhvbiBhbmQgd2FudHMgdG8gZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IFB5dGhvbi4gIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZAotYnkgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucworYnkgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YC4gIFRoZSBmdW5jdGlvbiA6YzpmdW5jOmBQeV9Jc0luaXRpYWxpemVkYCByZXR1cm5zCiB0cnVlIGlmIFB5dGhvbiBpcyBjdXJyZW50bHkgaW4gdGhlIGluaXRpYWxpemVkIHN0YXRlLiAgTW9yZSBpbmZvcm1hdGlvbiBhYm91dAotdGhlc2UgZnVuY3Rpb25zIGlzIGdpdmVuIGluIGEgbGF0ZXIgY2hhcHRlci4gTm90aWNlIHRoYXQgOmM6ZnVuYzpgUHlfRmluYWxpemVgCit0aGVzZSBmdW5jdGlvbnMgaXMgZ2l2ZW4gaW4gYSBsYXRlciBjaGFwdGVyLiBOb3RpY2UgdGhhdCA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YAogZG9lcyAqbm90KiBmcmVlIGFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGUuZy4gbWVtb3J5CiBhbGxvY2F0ZWQgYnkgZXh0ZW5zaW9uIG1vZHVsZXMgY3VycmVudGx5IGNhbm5vdCBiZSByZWxlYXNlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL21lbW9yeS5yc3QgYi9Eb2MvYy1hcGkvbWVtb3J5LnJzdAppbmRleCAyOTBlZjA5Li4zZmY1NDUyIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvbWVtb3J5LnJzdAorKysgYi9Eb2MvYy1hcGkvbWVtb3J5LnJzdApAQCAtODUsOSArODUsMTIgQEAKIAogLi4gc2VlYWxzbzo6CiAKKyAgIFRoZSA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZQorICAgdGhlIG1lbW9yeSBhbGxvY2F0b3JzIHVzZWQgYnkgUHl0aG9uLgorCiAgICBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DU1RBVFNgIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHByaW50Ci0gICBtZW1vcnkgYWxsb2NhdGlvbiBzdGF0aXN0aWNzIGV2ZXJ5IHRpbWUgYSBuZXcgb2JqZWN0IGFyZW5hIGlzIGNyZWF0ZWQsIGFuZAotICAgb24gc2h1dGRvd24uCisgICBzdGF0aXN0aWNzIG9mIHRoZSA6cmVmOmBweW1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yIDxweW1hbGxvYz5gIGV2ZXJ5IHRpbWUgYQorICAgbmV3IHB5bWFsbG9jIG9iamVjdCBhcmVuYSBpcyBjcmVhdGVkLCBhbmQgb24gc2h1dGRvd24uCiAKIAogUmF3IE1lbW9yeSBJbnRlcmZhY2UKQEAgLTE2MiwxNSArMTY1LDE3IEBACiBiZWhhdmlvciB3aGVuIHJlcXVlc3RpbmcgemVybyBieXRlcywgYXJlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGluZyBhbmQgcmVsZWFzaW5nCiBtZW1vcnkgZnJvbSB0aGUgUHl0aG9uIGhlYXAuCiAKLVRoZSBkZWZhdWx0IG1lbW9yeSBibG9jayBhbGxvY2F0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKLTpjOmZ1bmM6YG1hbGxvY2AsIDpjOmZ1bmM6YGNhbGxvY2AsIDpjOmZ1bmM6YHJlYWxsb2NgIGFuZCA6YzpmdW5jOmBmcmVlYDsgY2FsbAotYGBtYWxsb2MoMSlgYCAob3IgYGBjYWxsb2MoMSwgMSlgYCkgd2hlbiByZXF1ZXN0aW5nIHplcm8gYnl0ZXMuCitCeSBkZWZhdWx0LCB0aGVzZSBmdW5jdGlvbnMgdXNlIDpyZWY6YHB5bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IgPHB5bWFsbG9jPmAuCiAKIC4uIHdhcm5pbmc6OgogCiAgICBUaGUgOnRlcm06YEdJTCA8Z2xvYmFsIGludGVycHJldGVyIGxvY2s+YCBtdXN0IGJlIGhlbGQgd2hlbiB1c2luZyB0aGVzZQogICAgZnVuY3Rpb25zLgogCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorCisgICBUaGUgZGVmYXVsdCBhbGxvY2F0b3IgaXMgbm93IHB5bWFsbG9jIGluc3RlYWQgb2Ygc3lzdGVtIDpjOmZ1bmM6YG1hbGxvY2AuCisKIC4uIGM6ZnVuY3Rpb246OiB2b2lkKiBQeU1lbV9NYWxsb2Moc2l6ZV90IG4pCiAKICAgIEFsbG9jYXRlcyAqbiogYnl0ZXMgYW5kIHJldHVybnMgYSBwb2ludGVyIG9mIHR5cGUgOmM6dHlwZTpgdm9pZFwqYCB0byB0aGUKQEAgLTI5MiwxNSArMjk3LDMyIEBACiAKICAgIEVudW0gdXNlZCB0byBpZGVudGlmeSBhbiBhbGxvY2F0b3IgZG9tYWluLiBEb21haW5zOgogCi0gICAqIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9SQVdgOiBmdW5jdGlvbnMgOmM6ZnVuYzpgUHlNZW1fUmF3TWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlNZW1fUmF3UmVhbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX1Jhd0NhbGxvY2AgYW5kCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1Jhd0ZyZWVgCi0gICAqIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gOiBmdW5jdGlvbnMgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX0NhbGxvY2AgYW5kIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgCi0gICAqIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgOiBmdW5jdGlvbnMgOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlPYmplY3RfUmVhbGxvY2AsIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxvY2AgYW5kCi0gICAgIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgCisgICAuLiBjOnZhcjo6IFBZTUVNX0RPTUFJTl9SQVcKIAorICAgICAgRnVuY3Rpb25zOgorCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmF3UmVhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmF3Q2FsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SYXdGcmVlYAorCisgICAuLiBjOnZhcjo6IFBZTUVNX0RPTUFJTl9NRU0KKworICAgICAgRnVuY3Rpb25zOgorCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX0NhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fRnJlZWAKKworICAgLi4gYzp2YXI6OiBQWU1FTV9ET01BSU5fT0JKCisKKyAgICAgIEZ1bmN0aW9uczoKKworICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAKIAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlNZW1fR2V0QWxsb2NhdG9yKFB5TWVtQWxsb2NhdG9yRG9tYWluIGRvbWFpbiwgUHlNZW1BbGxvY2F0b3JFeCAqYWxsb2NhdG9yKQogCkBAIC0zMjUsNDMgKzM0Nyw2MiBAQAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeU1lbV9TZXR1cERlYnVnSG9va3Modm9pZCkKIAotICAgU2V0dXAgaG9va3MgdG8gZGV0ZWN0IGJ1Z3MgaW4gdGhlIGZvbGxvd2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRvcgotICAgZnVuY3Rpb25zOgotCi0gICAtIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU1lbV9SYXdDYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SYXdGcmVlYAotICAgLSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SZWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fQ2FsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlNZW1fRnJlZWAKLSAgIC0gOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCwgOmM6ZnVuYzpgUHlPYmplY3RfUmVhbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5T2JqZWN0X0NhbGxvY2AsIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgCisgICBTZXR1cCBob29rcyB0byBkZXRlY3QgYnVncyBpbiB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb25zLgogCiAgICBOZXdseSBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZpbGxlZCB3aXRoIHRoZSBieXRlIGBgMHhDQmBgLCBmcmVlZCBtZW1vcnkgaXMKLSAgIGZpbGxlZCB3aXRoIHRoZSBieXRlIGBgMHhEQmBgLiBBZGRpdGlvbmFsIGNoZWNrczoKKyAgIGZpbGxlZCB3aXRoIHRoZSBieXRlIGBgMHhEQmBgLgogCi0gICAtIGRldGVjdCBBUEkgdmlvbGF0aW9ucywgZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgIGNhbGxlZCBvbiBhIGJ1ZmZlcgorICAgUnVudGltZSBjaGVja3M6CisKKyAgIC0gRGV0ZWN0IEFQSSB2aW9sYXRpb25zLCBleDogOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgYnVmZmVyCiAgICAgIGFsbG9jYXRlZCBieSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgCi0gICAtIGRldGVjdCB3cml0ZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKGJ1ZmZlciB1bmRlcmZsb3cpCi0gICAtIGRldGVjdCB3cml0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKGJ1ZmZlciBvdmVyZmxvdykKKyAgIC0gRGV0ZWN0IHdyaXRlIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIHVuZGVyZmxvdykKKyAgIC0gRGV0ZWN0IHdyaXRlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAoYnVmZmVyIG92ZXJmbG93KQorICAgLSBDaGVjayB0aGF0IHRoZSA6dGVybTpgR0lMIDxnbG9iYWwgaW50ZXJwcmV0ZXIgbG9jaz5gIGlzIGhlbGQgd2hlbgorICAgICBhbGxvY2F0b3IgZnVuY3Rpb25zIG9mIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIChleDoKKyAgICAgOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCkgYW5kIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIChleDoKKyAgICAgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCkgZG9tYWlucyBhcmUgY2FsbGVkCiAKLSAgIFRoZSBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgaWYgUHl0aG9uIGlzIG5vdCBjb21waWxlZCBpcyBkZWJ1ZyBtb2RlLgorICAgT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyB1c2UgdGhlIDptb2Q6YHRyYWNlbWFsbG9jYCBtb2R1bGUgdG8gZ2V0IHRoZQorICAgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQuIFRoZSB0cmFjZWJhY2sgaXMgb25seQorICAgZGlzcGxheWVkIGlmIDptb2Q6YHRyYWNlbWFsbG9jYCBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIHRoZQorICAgbWVtb3J5IGJsb2NrIHdhcyB0cmFjZWQuCisKKyAgIFRoZXNlIGhvb2tzIGFyZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCBpZiBQeXRob24gaXMgY29tcGlsZWQgaW4gZGVidWcKKyAgIG1vZGUuIFRoZSA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIGluc3RhbGwKKyAgIGRlYnVnIGhvb2tzIG9uIGEgUHl0aG9uIGNvbXBpbGVkIGluIHJlbGVhc2UgbW9kZS4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoaXMgZnVuY3Rpb24gbm93IGFsc28gd29ya3Mgb24gUHl0aG9uIGNvbXBpbGVkIGluIHJlbGVhc2UgbW9kZS4KKyAgICAgIE9uIGVycm9yLCB0aGUgZGVidWcgaG9va3Mgbm93IHVzZSA6bW9kOmB0cmFjZW1hbGxvY2AgdG8gZ2V0IHRoZSB0cmFjZWJhY2sKKyAgICAgIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQuIFRoZSBkZWJ1ZyBob29rcyBub3cgYWxzbyBjaGVjaworICAgICAgaWYgdGhlIEdJTCBpcyBoZWxkIHdoZW4gZnVuY3Rpb25zIG9mIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIGFuZAorICAgICAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgZG9tYWlucyBhcmUgY2FsbGVkLgogCiAKLUN1c3RvbWl6ZSBQeU9iamVjdCBBcmVuYSBBbGxvY2F0b3IKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy4uIF9weW1hbGxvYzoKIAotUHl0aG9uIGhhcyBhICpweW1hbGxvYyogYWxsb2NhdG9yIGZvciBhbGxvY2F0aW9ucyBzbWFsbGVyIHRoYW4gNTEyIGJ5dGVzLiBUaGlzCi1hbGxvY2F0b3IgaXMgb3B0aW1pemVkIGZvciBzbWFsbCBvYmplY3RzIHdpdGggYSBzaG9ydCBsaWZldGltZS4gSXQgdXNlcyBtZW1vcnkKLW1hcHBpbmdzIGNhbGxlZCAiYXJlbmFzIiB3aXRoIGEgZml4ZWQgc2l6ZSBvZiAyNTYgS0IuIEl0IGZhbGxzIGJhY2sgdG8KLTpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AgYW5kIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgIGZvciBhbGxvY2F0aW9ucyBsYXJnZXIKLXRoYW4gNTEyIGJ5dGVzLiAgKnB5bWFsbG9jKiBpcyB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgdXNlZCBieQotOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYC4KK1RoZSBweW1hbGxvYyBhbGxvY2F0b3IKKz09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIGRlZmF1bHQgYXJlbmEgYWxsb2NhdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CitQeXRob24gaGFzIGEgKnB5bWFsbG9jKiBhbGxvY2F0b3Igb3B0aW1pemVkIGZvciBzbWFsbCBvYmplY3RzIChzbWFsbGVyIG9yIGVxdWFsCit0byA1MTIgYnl0ZXMpIHdpdGggYSBzaG9ydCBsaWZldGltZS4gSXQgdXNlcyBtZW1vcnkgbWFwcGluZ3MgY2FsbGVkICJhcmVuYXMiCit3aXRoIGEgZml4ZWQgc2l6ZSBvZiAyNTYgS0IuIEl0IGZhbGxzIGJhY2sgdG8gOmM6ZnVuYzpgUHlNZW1fUmF3TWFsbG9jYCBhbmQKKzpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgIGZvciBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiA1MTIgYnl0ZXMuCisKKypweW1hbGxvYyogaXMgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIG9mIHRoZSA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCAoZXg6Cis6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBhbmQgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgKGV4OgorOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCkgZG9tYWlucy4KKworVGhlIGFyZW5hIGFsbG9jYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCiAqIDpjOmZ1bmM6YFZpcnR1YWxBbGxvY2AgYW5kIDpjOmZ1bmM6YFZpcnR1YWxGcmVlYCBvbiBXaW5kb3dzLAogKiA6YzpmdW5jOmBtbWFwYCBhbmQgOmM6ZnVuYzpgbXVubWFwYCBpZiBhdmFpbGFibGUsCiAqIDpjOmZ1bmM6YG1hbGxvY2AgYW5kIDpjOmZ1bmM6YGZyZWVgIG90aGVyd2lzZS4KIAorQ3VzdG9taXplIHB5bWFsbG9jIEFyZW5hIEFsbG9jYXRvcgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAogLi4gYzp0eXBlOjogUHlPYmplY3RBcmVuYUFsbG9jYXRvcgpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0IGIvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0CmluZGV4IGNjODQzMTQuLmU5ZThhZGQgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdAorKysgYi9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QKQEAgLTE1MCw4ICsxNTAsOSBAQAogVGhlIDphdHRyOmBtbF9mbGFnc2AgZmllbGQgaXMgYSBiaXRmaWVsZCB3aGljaCBjYW4gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGZsYWdzLgogVGhlIGluZGl2aWR1YWwgZmxhZ3MgaW5kaWNhdGUgZWl0aGVyIGEgY2FsbGluZyBjb252ZW50aW9uIG9yIGEgYmluZGluZwogY29udmVudGlvbi4gIE9mIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gZmxhZ3MsIG9ubHkgOmNvbnN0OmBNRVRIX1ZBUkFSR1NgIGFuZAotOmNvbnN0OmBNRVRIX0tFWVdPUkRTYCBjYW4gYmUgY29tYmluZWQuIEFueSBvZiB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZsYWdzCi1jYW4gYmUgY29tYmluZWQgd2l0aCBhIGJpbmRpbmcgZmxhZy4KKzpjb25zdDpgTUVUSF9LRVlXT1JEU2AgY2FuIGJlIGNvbWJpbmVkIChidXQgbm90ZSB0aGF0IDpjb25zdDpgTUVUSF9LRVlXT1JEU2AKK2Fsb25lIGlzIGVxdWl2YWxlbnQgdG8gYGBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTYGApLiBBbnkgb2YgdGhlIGNhbGxpbmcKK2NvbnZlbnRpb24gZmxhZ3MgY2FuIGJlIGNvbWJpbmVkIHdpdGggYSBiaW5kaW5nIGZsYWcuCiAKIAogLi4gZGF0YTo6IE1FVEhfVkFSQVJHUwpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL3N5cy5yc3QgYi9Eb2MvYy1hcGkvc3lzLnJzdAppbmRleCAzZDgzYjI3Li4wMzVjZGMxIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvc3lzLnJzdAorKysgYi9Eb2MvYy1hcGkvc3lzLnJzdApAQCAtNSw2ICs1LDE3IEBACiBPcGVyYXRpbmcgU3lzdGVtIFV0aWxpdGllcwogPT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorLi4gYzpmdW5jdGlvbjo6IFB5T2JqZWN0KiBQeU9TX0ZTUGF0aChQeU9iamVjdCAqcGF0aCkKKworICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbiBmb3IgKnBhdGgqLiBJZiB0aGUgb2JqZWN0IGlzIGEKKyAgIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QsIHRoZW4gaXRzIHJlZmVyZW5jZSBjb3VudCBpcworICAgaW5jcmVtZW50ZWQuIElmIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlLAorICAgdGhlbiA6bWV0aDpgfm9zLlBhdGhMaWtlLl9fZnNwYXRoX19gIGlzIHJldHVybmVkIGFzIGxvbmcgYXMgaXQgaXMgYQorICAgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdC4gT3RoZXJ3aXNlIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkCisgICBhbmQgYGBOVUxMYGAgaXMgcmV0dXJuZWQuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfRmRJc0ludGVyYWN0aXZlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKIApAQCAtMjEyLDIwICsyMjMsMjQgQEAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0V4aXQoaW50IHN0YXR1cykKIAogICAgLi4gaW5kZXg6OgotICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogICAgICAgc2luZ2xlOiBleGl0KCkKIAotICAgRXhpdCB0aGUgY3VycmVudCBwcm9jZXNzLiAgVGhpcyBjYWxscyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIHRoZW4gY2FsbHMgdGhlCi0gICBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb24gYGBleGl0KHN0YXR1cylgYC4KKyAgIEV4aXQgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgY2FsbHMgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgYW5kIHRoZW4gY2FsbHMgdGhlCisgICBzdGFuZGFyZCBDIGxpYnJhcnkgZnVuY3Rpb24gYGBleGl0KHN0YXR1cylgYC4gIElmIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgCisgICBpbmRpY2F0ZXMgYW4gZXJyb3IsIHRoZSBleGl0IHN0YXR1cyBpcyBzZXQgdG8gMTIwLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgRXJyb3JzIGZyb20gZmluYWxpemF0aW9uIG5vIGxvbmdlciBpZ25vcmVkLgogCiAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfQXRFeGl0KHZvaWQgKCpmdW5jKSAoKSkKIAogICAgLi4gaW5kZXg6OgotICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplRXgoKQogICAgICAgc2luZ2xlOiBjbGVhbnVwIGZ1bmN0aW9ucwogCi0gICBSZWdpc3RlciBhIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYC4gIFRoZSBjbGVhbnVwCisgICBSZWdpc3RlciBhIGNsZWFudXAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgLiAgVGhlIGNsZWFudXAKICAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzIGFuZCBzaG91bGQgcmV0dXJuIG5vIHZhbHVlLiAgQXQgbW9zdAogICAgMzIgY2xlYW51cCBmdW5jdGlvbnMgY2FuIGJlIHJlZ2lzdGVyZWQuICBXaGVuIHRoZSByZWdpc3RyYXRpb24gaXMgc3VjY2Vzc2Z1bCwKICAgIDpjOmZ1bmM6YFB5X0F0RXhpdGAgcmV0dXJucyBgYDBgYDsgb24gZmFpbHVyZSwgaXQgcmV0dXJucyBgYC0xYGAuICBUaGUgY2xlYW51cApkaWZmIC0tZ2l0IGEvRG9jL2RhdGEvcmVmY291bnRzLmRhdCBiL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQKaW5kZXggZTM4ODE5NS4uOGI0NjlmNCAxMDA2NDQKLS0tIGEvRG9jL2RhdGEvcmVmY291bnRzLmRhdAorKysgYi9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0CkBAIC05MjEsNiArOTIxLDkgQEAKIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I6aW50Ojo6CiBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yOlB5T2JqZWN0KjpvOjA6CiAKK1B5T1NfRlNQYXRoOlB5T2JqZWN0Kjo6KzE6CitQeU9TX0ZTUGF0aDpQeU9iamVjdCo6cGF0aDowOgorCiBQeU9iamVjdF9DYWxsOlB5T2JqZWN0Kjo6KzE6CiBQeU9iamVjdF9DYWxsOlB5T2JqZWN0KjpjYWxsYWJsZV9vYmplY3Q6MDoKIFB5T2JqZWN0X0NhbGw6UHlPYmplY3QqOmFyZ3M6MDoKZGlmZiAtLWdpdCBhL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdCBiL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdAppbmRleCBhY2Q2MGFlLi4xNTQ2YjFhIDEwMDY0NAotLS0gYS9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKKysrIGIvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CkBAIC02Nyw3ICs2Nyw5IEBACiAgICAgICAgUHlfSW5pdGlhbGl6ZSgpOwogICAgICAgIFB5UnVuX1NpbXBsZVN0cmluZygiZnJvbSB0aW1lIGltcG9ydCB0aW1lLGN0aW1lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcmludCgnVG9kYXkgaXMnLCBjdGltZSh0aW1lKCkpKVxuIik7Ci0gICAgICAgUHlfRmluYWxpemUoKTsKKyAgICAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICAgICBleGl0KDEyMCk7CisgICAgICAgfQogICAgICAgIFB5TWVtX1Jhd0ZyZWUocHJvZ3JhbSk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CkBAIC03Niw3ICs3OCw3IEBACiA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCB0byBpbmZvcm0gdGhlIGludGVycHJldGVyIGFib3V0IHBhdGhzIHRvIFB5dGhvbiBydW4tdGltZQogbGlicmFyaWVzLiAgTmV4dCwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyBpbml0aWFsaXplZCB3aXRoCiA6YzpmdW5jOmBQeV9Jbml0aWFsaXplYCwgZm9sbG93ZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiBhIGhhcmQtY29kZWQgUHl0aG9uIHNjcmlwdAotdGhhdCBwcmludHMgdGhlIGRhdGUgYW5kIHRpbWUuICBBZnRlcndhcmRzLCB0aGUgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGNhbGwgc2h1dHMKK3RoYXQgcHJpbnRzIHRoZSBkYXRlIGFuZCB0aW1lLiAgQWZ0ZXJ3YXJkcywgdGhlIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGNhbGwgc2h1dHMKIHRoZSBpbnRlcnByZXRlciBkb3duLCBmb2xsb3dlZCBieSB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLiAgSW4gYSByZWFsIHByb2dyYW0sCiB5b3UgbWF5IHdhbnQgdG8gZ2V0IHRoZSBQeXRob24gc2NyaXB0IGZyb20gYW5vdGhlciBzb3VyY2UsIHBlcmhhcHMgYSB0ZXh0LWVkaXRvcgogcm91dGluZSwgYSBmaWxlLCBvciBhIGRhdGFiYXNlLiAgR2V0dGluZyB0aGUgUHl0aG9uIGNvZGUgZnJvbSBhIGZpbGUgY2FuIGJldHRlcgpkaWZmIC0tZ2l0IGEvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QgYi9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdAppbmRleCA2OTQ3NTNlLi45YzVlMjBkIDEwMDY0NAotLS0gYS9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdAorKysgYi9Eb2MvZmFxL3Byb2dyYW1taW5nLnJzdApAQCAtODM4LDcgKzgzOCw4IEBACiBUbyBjb252ZXJ0LCBlLmcuLCB0aGUgbnVtYmVyIDE0NCB0byB0aGUgc3RyaW5nICcxNDQnLCB1c2UgdGhlIGJ1aWx0LWluIHR5cGUKIGNvbnN0cnVjdG9yIDpmdW5jOmBzdHJgLiAgSWYgeW91IHdhbnQgYSBoZXhhZGVjaW1hbCBvciBvY3RhbCByZXByZXNlbnRhdGlvbiwgdXNlCiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIDpmdW5jOmBoZXhgIG9yIDpmdW5jOmBvY3RgLiAgRm9yIGZhbmN5IGZvcm1hdHRpbmcsIHNlZQotdGhlIDpyZWY6YGZvcm1hdHN0cmluZ3NgIHNlY3Rpb24sIGUuZy4gYGAiezowNGR9Ii5mb3JtYXQoMTQ0KWBgIHlpZWxkcwordGhlIDpyZWY6YGYtc3RyaW5nc2AgYW5kIDpyZWY6YGZvcm1hdHN0cmluZ3NgIHNlY3Rpb25zLAorZS5nLiBgYCJ7OjA0ZH0iLmZvcm1hdCgxNDQpYGAgeWllbGRzCiBgYCcwMTQ0J2BgIGFuZCBgYCJ7Oi4zZn0iLmZvcm1hdCgxLjAvMy4wKWBgIHlpZWxkcyBgYCcwLjMzMydgYC4KIAogCmRpZmYgLS1naXQgYS9Eb2MvZ2xvc3NhcnkucnN0IGIvRG9jL2dsb3NzYXJ5LnJzdAppbmRleCA0NWI3OTRmLi5mZTE3NTk1IDEwMDY0NAotLS0gYS9Eb2MvZ2xvc3NhcnkucnN0CisrKyBiL0RvYy9nbG9zc2FyeS5yc3QKQEAgLTcxOCw2ICs3MTgsOCBAQAogCiAgICAgICAgICAgIGRlZiBmdW5jKGZvbywgYmFyPU5vbmUpOiAuLi4KIAorICAgICAgLi4gX3Bvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI6CisKICAgICAgICogOmRmbjpgcG9zaXRpb25hbC1vbmx5YDogc3BlY2lmaWVzIGFuIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHN1cHBsaWVkIG9ubHkKICAgICAgICAgYnkgcG9zaXRpb24uICBQeXRob24gaGFzIG5vIHN5bnRheCBmb3IgZGVmaW5pbmcgcG9zaXRpb25hbC1vbmx5CiAgICAgICAgIHBhcmFtZXRlcnMuICBIb3dldmVyLCBzb21lIGJ1aWx0LWluIGZ1bmN0aW9ucyBoYXZlIHBvc2l0aW9uYWwtb25seQpAQCAtNzc2LDYgKzc3OCwxNiBAQAogICAgICAgT25lIG9mIHRoZSBkZWZhdWx0IDp0ZXJtOmBtZXRhIHBhdGggZmluZGVycyA8bWV0YSBwYXRoIGZpbmRlcj5gIHdoaWNoCiAgICAgICBzZWFyY2hlcyBhbiA6dGVybTpgaW1wb3J0IHBhdGhgIGZvciBtb2R1bGVzLgogCisgICBwYXRoLWxpa2Ugb2JqZWN0CisgICAgICBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgZmlsZSBzeXN0ZW0gcGF0aC4gQSBwYXRoLWxpa2Ugb2JqZWN0IGlzIGVpdGhlcgorICAgICAgYSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0IHJlcHJlc2VudGluZyBhIHBhdGgsIG9yIGFuIG9iamVjdAorICAgICAgaW1wbGVtZW50aW5nIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBwcm90b2NvbC4gQW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMKKyAgICAgIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBwcm90b2NvbCBjYW4gYmUgY29udmVydGVkIHRvIGEgOmNsYXNzOmBzdHJgIG9yCisgICAgICA6Y2xhc3M6YGJ5dGVzYCBmaWxlIHN5c3RlbSBwYXRoIGJ5IGNhbGxpbmcgdGhlIDpmdW5jOmBvcy5mc3BhdGhgIGZ1bmN0aW9uOworICAgICAgOmZ1bmM6YG9zLmZzZGVjb2RlYCBhbmQgOmZ1bmM6YG9zLmZzZW5jb2RlYCBjYW4gYmUgdXNlZCB0byBndWFyYW50ZWUgYQorICAgICAgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIHJlc3VsdCBpbnN0ZWFkLCByZXNwZWN0aXZlbHkuIEludHJvZHVjZWQKKyAgICAgIGJ5IDpwZXA6YDUxOWAuCisKICAgIHBvcnRpb24KICAgICAgIEEgc2V0IG9mIGZpbGVzIGluIGEgc2luZ2xlIGRpcmVjdG9yeSAocG9zc2libHkgc3RvcmVkIGluIGEgemlwIGZpbGUpCiAgICAgICB0aGF0IGNvbnRyaWJ1dGUgdG8gYSBuYW1lc3BhY2UgcGFja2FnZSwgYXMgZGVmaW5lZCBpbiA6cGVwOmA0MjBgLgpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdCBiL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKaW5kZXggY2ZlOTg2OC4uN2E2MDE2NSAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdAorKysgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CkBAIC01NDcsNyArNTQ3LDggQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAicHJvZy5weSIsIGxpbmUgMTEsIGluIDxtb2R1bGU+CiAgICAgICAgaWYgYXJncy52ZXJib3NpdHkgPj0gMjoKLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IE5vbmVUeXBlKCkgPj0gaW50KCkKKyAgIFR5cGVFcnJvcjogJz49JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdOb25lVHlwZScgYW5kICdpbnQnCisKIAogKiBGaXJzdCBvdXRwdXQgd2VudCB3ZWxsLCBhbmQgZml4ZXMgdGhlIGJ1ZyB3ZSBoYWQgYmVmb3JlLgogICBUaGF0IGlzLCB3ZSB3YW50IGFueSB2YWx1ZSA+PSAyIHRvIGJlIGFzIHZlcmJvc2UgYXMgcG9zc2libGUuCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCmluZGV4IDk4NmQ2NzAuLmVhZDdiZGQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCisrKyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCkBAIC02Myw2ICs2Myw4IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgXCIlc1wiXG4iLCBhcmd2WzFdKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDEyMDsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvdGVzdC5weSBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CmluZGV4IDdlYmY0NmEuLjllOWQ0YTYgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy90ZXN0LnB5CisrKyBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CkBAIC0yMDQsNyArMjA0LDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCi1QTEFUX1NQRUMgPSAiJXMtJXMiICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvblswOjNdKQorUExBVF9TUEVDID0gIiVzLSVkLiVkIiAlIChnZXRfcGxhdGZvcm0oKSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogc3JjID0gb3MucGF0aC5qb2luKCJidWlsZCIsICJsaWIuJXMiICUgUExBVF9TUEVDKQogc3lzLnBhdGguYXBwZW5kKHNyYykKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0IGIvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0CmluZGV4IGFlNzJkMjYuLmUwMjM2MGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QKQEAgLTU4LDEzICs1OCwxMyBAQAogICAgICAgVGhlIGFzeW5jaHJvbm91cyBvdXRwdXQgYnVmZmVyIHNpemUgKGRlZmF1bHQgYGA0MDk2YGApLgogCiAgICBVbmxpa2UgOmNsYXNzOmBhc3luY29yZS5kaXNwYXRjaGVyYCwgOmNsYXNzOmBhc3luY19jaGF0YCBhbGxvd3MgeW91IHRvCi0gICBkZWZpbmUgYSBmaXJzdC1pbi1maXJzdC1vdXQgcXVldWUgKGZpZm8pIG9mICpwcm9kdWNlcnMqLiBBIHByb2R1Y2VyIG5lZWQKKyAgIGRlZmluZSBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUgb2YgKnByb2R1Y2VycyouIEEgcHJvZHVjZXIgbmVlZAogICAgaGF2ZSBvbmx5IG9uZSBtZXRob2QsIDptZXRoOmBtb3JlYCwgd2hpY2ggc2hvdWxkIHJldHVybiBkYXRhIHRvIGJlCiAgICB0cmFuc21pdHRlZCBvbiB0aGUgY2hhbm5lbC4KICAgIFRoZSBwcm9kdWNlciBpbmRpY2F0ZXMgZXhoYXVzdGlvbiAoKmkuZS4qIHRoYXQgaXQgY29udGFpbnMgbm8gbW9yZSBkYXRhKSBieQogICAgaGF2aW5nIGl0cyA6bWV0aDpgbW9yZWAgbWV0aG9kIHJldHVybiB0aGUgZW1wdHkgYnl0ZXMgb2JqZWN0LiBBdCB0aGlzIHBvaW50Ci0gICB0aGUgOmNsYXNzOmBhc3luY19jaGF0YCBvYmplY3QgcmVtb3ZlcyB0aGUgcHJvZHVjZXIgZnJvbSB0aGUgZmlmbyBhbmQgc3RhcnRzCi0gICB1c2luZyB0aGUgbmV4dCBwcm9kdWNlciwgaWYgYW55LiBXaGVuIHRoZSBwcm9kdWNlciBmaWZvIGlzIGVtcHR5IHRoZQorICAgdGhlIDpjbGFzczpgYXN5bmNfY2hhdGAgb2JqZWN0IHJlbW92ZXMgdGhlIHByb2R1Y2VyIGZyb20gdGhlIHF1ZXVlIGFuZCBzdGFydHMKKyAgIHVzaW5nIHRoZSBuZXh0IHByb2R1Y2VyLCBpZiBhbnkuIFdoZW4gdGhlIHByb2R1Y2VyIHF1ZXVlIGlzIGVtcHR5IHRoZQogICAgOm1ldGg6YGhhbmRsZV93cml0ZWAgbWV0aG9kIGRvZXMgbm90aGluZy4gWW91IHVzZSB0aGUgY2hhbm5lbCBvYmplY3QncwogICAgOm1ldGg6YHNldF90ZXJtaW5hdG9yYCBtZXRob2QgdG8gZGVzY3JpYmUgaG93IHRvIHJlY29nbml6ZSB0aGUgZW5kIG9mLCBvcgogICAgYW4gaW1wb3J0YW50IGJyZWFrcG9pbnQgaW4sIGFuIGluY29taW5nIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSByZW1vdGUKQEAgLTc4LDggKzc4LDggQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5jbG9zZV93aGVuX2RvbmUoKQogCi0gICBQdXNoZXMgYSBgYE5vbmVgYCBvbiB0byB0aGUgcHJvZHVjZXIgZmlmby4gV2hlbiB0aGlzIHByb2R1Y2VyIGlzIHBvcHBlZCBvZmYKLSAgIHRoZSBmaWZvIGl0IGNhdXNlcyB0aGUgY2hhbm5lbCB0byBiZSBjbG9zZWQuCisgICBQdXNoZXMgYSBgYE5vbmVgYCBvbiB0byB0aGUgcHJvZHVjZXIgcXVldWUuIFdoZW4gdGhpcyBwcm9kdWNlciBpcyBwb3BwZWQgb2ZmCisgICB0aGUgcXVldWUgaXQgY2F1c2VzIHRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZC4KIAogCiAuLiBtZXRob2Q6OiBhc3luY19jaGF0LmNvbGxlY3RfaW5jb21pbmdfZGF0YShkYXRhKQpAQCAtOTIsNyArOTIsNyBAQAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5kaXNjYXJkX2J1ZmZlcnMoKQogCiAgICBJbiBlbWVyZ2VuY2llcyB0aGlzIG1ldGhvZCB3aWxsIGRpc2NhcmQgYW55IGRhdGEgaGVsZCBpbiB0aGUgaW5wdXQgYW5kL29yCi0gICBvdXRwdXQgYnVmZmVycyBhbmQgdGhlIHByb2R1Y2VyIGZpZm8uCisgICBvdXRwdXQgYnVmZmVycyBhbmQgdGhlIHByb2R1Y2VyIHF1ZXVlLgogCiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuZm91bmRfdGVybWluYXRvcigpCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5wdXNoKGRhdGEpCiAKLSAgIFB1c2hlcyBkYXRhIG9uIHRvIHRoZSBjaGFubmVsJ3MgZmlmbyB0byBlbnN1cmUgaXRzIHRyYW5zbWlzc2lvbi4KKyAgIFB1c2hlcyBkYXRhIG9uIHRvIHRoZSBjaGFubmVsJ3MgcXVldWUgdG8gZW5zdXJlIGl0cyB0cmFuc21pc3Npb24uCiAgICBUaGlzIGlzIGFsbCB5b3UgbmVlZCB0byBkbyB0byBoYXZlIHRoZSBjaGFubmVsIHdyaXRlIHRoZSBkYXRhIG91dCB0byB0aGUKICAgIG5ldHdvcmssIGFsdGhvdWdoIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSB5b3VyIG93biBwcm9kdWNlcnMgaW4gbW9yZSBjb21wbGV4CiAgICBzY2hlbWVzIHRvIGltcGxlbWVudCBlbmNyeXB0aW9uIGFuZCBjaHVua2luZywgZm9yIGV4YW1wbGUuCkBAIC0xMTgsNyArMTE4LDcgQEAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5wdXNoX3dpdGhfcHJvZHVjZXIocHJvZHVjZXIpCiAKLSAgIFRha2VzIGEgcHJvZHVjZXIgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBwcm9kdWNlciBmaWZvIGFzc29jaWF0ZWQgd2l0aAorICAgVGFrZXMgYSBwcm9kdWNlciBvYmplY3QgYW5kIGFkZHMgaXQgdG8gdGhlIHByb2R1Y2VyIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aAogICAgdGhlIGNoYW5uZWwuICBXaGVuIGFsbCBjdXJyZW50bHktcHVzaGVkIHByb2R1Y2VycyBoYXZlIGJlZW4gZXhoYXVzdGVkIHRoZQogICAgY2hhbm5lbCB3aWxsIGNvbnN1bWUgdGhpcyBwcm9kdWNlcidzIGRhdGEgYnkgY2FsbGluZyBpdHMgOm1ldGg6YG1vcmVgCiAgICBtZXRob2QgYW5kIHNlbmQgdGhlIGRhdGEgdG8gdGhlIHJlbW90ZSBlbmRwb2ludC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdAppbmRleCA3ZWMzYWExLi44MDlhM2U3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0CkBAIC0xMDEsOCArMTAxLDkgQEAKICAgIGNhbGxlZCBhZnRlciA6bWV0aDpgY2FsbF9zb29uYCByZXR1cm5zLCB3aGVuIGNvbnRyb2wgcmV0dXJucyB0byB0aGUgZXZlbnQKICAgIGxvb3AuCiAKLSAgIFRoaXMgb3BlcmF0ZXMgYXMgYSBGSUZPIHF1ZXVlLCBjYWxsYmFja3MgYXJlIGNhbGxlZCBpbiB0aGUgb3JkZXIgaW4KLSAgIHdoaWNoIHRoZXkgYXJlIHJlZ2lzdGVyZWQuICBFYWNoIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKyAgIFRoaXMgb3BlcmF0ZXMgYXMgYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLCBjYWxsYmFja3MKKyAgIGFyZSBjYWxsZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHJlZ2lzdGVyZWQuICBFYWNoIGNhbGxiYWNrCisgICB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCiAKICAgIEFueSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhZnRlciB0aGUgY2FsbGJhY2sgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCiAgICBjYWxsYmFjayB3aGVuIGl0IGlzIGNhbGxlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdCBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdAppbmRleCA4NzhkOGRiLi40ZjVmMGYyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CkBAIC01MywxMyArNTMsMTQgQEAKICAgIHRoYW4gb25lIGxpbmUgbWF5IGJlIHBhc3NlZCBhdCBhIHRpbWUuCiAKIAotLi4gZnVuY3Rpb246OiBiMmFfYmFzZTY0KGRhdGEpCisuLiBmdW5jdGlvbjo6IGIyYV9iYXNlNjQoZGF0YSwgXCosIG5ld2xpbmU9VHJ1ZSkKIAogICAgQ29udmVydCBiaW5hcnkgZGF0YSB0byBhIGxpbmUgb2YgQVNDSUkgY2hhcmFjdGVycyBpbiBiYXNlNjQgY29kaW5nLiBUaGUgcmV0dXJuCi0gICB2YWx1ZSBpcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhci4gIFRoZSBuZXdsaW5lIGlzCi0gICBhZGRlZCBiZWNhdXNlIHRoZSBvcmlnaW5hbCB1c2UgY2FzZSBmb3IgdGhpcyBmdW5jdGlvbiB3YXMgdG8gZmVlZCBpdCBhCi0gICBzZXJpZXMgb2YgNTcgYnl0ZSBpbnB1dCBsaW5lcyB0byBnZXQgb3V0cHV0IGxpbmVzIHRoYXQgY29uZm9ybSB0byB0aGUKLSAgIE1JTUUtYmFzZTY0IHN0YW5kYXJkLiAgT3RoZXJ3aXNlIHRoZSBvdXRwdXQgY29uZm9ybXMgdG8gOnJmYzpgMzU0OGAuCisgICB2YWx1ZSBpcyB0aGUgY29udmVydGVkIGxpbmUsIGluY2x1ZGluZyBhIG5ld2xpbmUgY2hhciBpZiAqbmV3bGluZSogaXMKKyAgIHRydWUuICBUaGUgb3V0cHV0IG9mIHRoaXMgZnVuY3Rpb24gY29uZm9ybXMgdG8gOnJmYzpgMzU0OGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCB0aGUgKm5ld2xpbmUqIHBhcmFtZXRlci4KIAogCiAuLiBmdW5jdGlvbjo6IGEyYl9xcChkYXRhLCBoZWFkZXI9RmFsc2UpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0IGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdAppbmRleCA2MTY4MmNjLi41YjBmYjM4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QKQEAgLTQxLDEyICs0MSwxMyBAQAogOmNsYXNzOmBIYXNoYWJsZWAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYF9faGFzaF9fYGAKIDpjbGFzczpgSXRlcmFibGVgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2l0ZXJfX2BgCiA6Y2xhc3M6YEl0ZXJhdG9yYCAgICAgICAgICA6Y2xhc3M6YEl0ZXJhYmxlYCAgICAgIGBgX19uZXh0X19gYCAgICAgICAgICAgIGBgX19pdGVyX19gYAorOmNsYXNzOmBSZXZlcnNpYmxlYCAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAgICAgICBgYF9fcmV2ZXJzZWRfX2BgCiA6Y2xhc3M6YEdlbmVyYXRvcmAgICAgICAgICA6Y2xhc3M6YEl0ZXJhdG9yYCAgICAgIGBgc2VuZGBgLCBgYHRocm93YGAgICAgIGBgY2xvc2VgYCwgYGBfX2l0ZXJfX2BgLCBgYF9fbmV4dF9fYGAKIDpjbGFzczpgU2l6ZWRgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2xlbl9fYGAKIDpjbGFzczpgQ2FsbGFibGVgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2NhbGxfX2BgCiAKIDpjbGFzczpgU2VxdWVuY2VgICAgICAgICAgIDpjbGFzczpgU2l6ZWRgLCAgICAgICAgYGBfX2dldGl0ZW1fX2BgLCAgICAgICAgYGBfX2NvbnRhaW5zX19gYCwgYGBfX2l0ZXJfX2BgLCBgYF9fcmV2ZXJzZWRfX2BgLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAsICAgICBgYF9fbGVuX19gYCAgICAgICAgICAgICBgYGluZGV4YGAsIGFuZCBgYGNvdW50YGAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgUmV2ZXJzaWJsZWAsICAgYGBfX2xlbl9fYGAgICAgICAgICAgICAgYGBpbmRleGBgLCBhbmQgYGBjb3VudGBgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YENvbnRhaW5lcmAKIAogOmNsYXNzOmBNdXRhYmxlU2VxdWVuY2VgICAgOmNsYXNzOmBTZXF1ZW5jZWAgICAgICBgYF9fZ2V0aXRlbV9fYGAsICAgICAgICBJbmhlcml0ZWQgOmNsYXNzOmBTZXF1ZW5jZWAgbWV0aG9kcyBhbmQKQEAgLTEwOCw2ICsxMDksMTIgQEAKICAgIDptZXRoOmB+aXRlcmF0b3IuX19uZXh0X19gIG1ldGhvZHMuICBTZWUgYWxzbyB0aGUgZGVmaW5pdGlvbiBvZgogICAgOnRlcm06YGl0ZXJhdG9yYC4KIAorLi4gY2xhc3M6OiBSZXZlcnNpYmxlCisKKyAgIEFCQyBmb3IgY2xhc3NlcyB0aGF0IHByb3ZpZGUgdGhlIDptZXRoOmBfX3JldmVyc2VkX19gIG1ldGhvZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIGNsYXNzOjogR2VuZXJhdG9yCiAKICAgIEFCQyBmb3IgZ2VuZXJhdG9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhlIHByb3RvY29sIGRlZmluZWQgaW4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdAppbmRleCA0OTM2YjNhLi4xNzU4ZjMyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CkBAIC05NjQsNiArOTY0LDkgQEAKICAgICAgIGNvbnN0cnVjdG9yIHRoYXQgaXMgY29udmVuaWVudCBmb3IgdXNlIGNhc2VzIHdoZXJlIG5hbWVkIHR1cGxlcyBhcmUgYmVpbmcKICAgICAgIHN1YmNsYXNzZWQuCiAKKyAgICAqIDptZXRoOmB0eXBlcy5TaW1wbGVOYW1lc3BhY2VgIGZvciBhIG11dGFibGUgbmFtZXNwYWNlIGJhc2VkIG9uIGFuIHVuZGVybHlpbmcKKyAgICAgIGRpY3Rpb25hcnkgaW5zdGVhZCBvZiBhIHR1cGxlLgorCiAKIDpjbGFzczpgT3JkZXJlZERpY3RgIG9iamVjdHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk4NSw4ICs5ODgsOSBAQAogICAgIC4uIG1ldGhvZDo6IHBvcGl0ZW0obGFzdD1UcnVlKQogCiAgICAgICAgIFRoZSA6bWV0aDpgcG9waXRlbWAgbWV0aG9kIGZvciBvcmRlcmVkIGRpY3Rpb25hcmllcyByZXR1cm5zIGFuZCByZW1vdmVzIGEKLSAgICAgICAgKGtleSwgdmFsdWUpIHBhaXIuICBUaGUgcGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gb3JkZXIgaWYgKmxhc3QqIGlzIHRydWUKLSAgICAgICAgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KKyAgICAgICAgKGtleSwgdmFsdWUpIHBhaXIuICBUaGUgcGFpcnMgYXJlIHJldHVybmVkIGluCisgICAgICAgIDphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCBvcmRlciBpZiAqbGFzdCogaXMgdHJ1ZQorICAgICAgICBvciA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIG9yZGVyIGlmIGZhbHNlLgogCiAgICAgLi4gbWV0aG9kOjogbW92ZV90b19lbmQoa2V5LCBsYXN0PVRydWUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0IGIvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QKaW5kZXggNTExYzU4MS4uOTFiZGQxOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvY29tcGlsZWFsbC5yc3QKQEAgLTEwMiw3ICsxMDIsOCBAQAogLi4gZnVuY3Rpb246OiBjb21waWxlX2RpcihkaXIsIG1heGxldmVscz0xMCwgZGRpcj1Ob25lLCBmb3JjZT1GYWxzZSwgcng9Tm9uZSwgcXVpZXQ9MCwgbGVnYWN5PUZhbHNlLCBvcHRpbWl6ZT0tMSwgd29ya2Vycz0xKQogCiAgICBSZWN1cnNpdmVseSBkZXNjZW5kIHRoZSBkaXJlY3RvcnkgdHJlZSBuYW1lZCBieSAqZGlyKiwgY29tcGlsaW5nIGFsbCA6ZmlsZTpgLnB5YAotICAgZmlsZXMgYWxvbmcgdGhlIHdheS4KKyAgIGZpbGVzIGFsb25nIHRoZSB3YXkuIFJldHVybiBhIHRydWUgdmFsdWUgaWYgYWxsIHRoZSBmaWxlcyBjb21waWxlZCBzdWNjZXNzZnVsbHksCisgICBhbmQgYSBmYWxzZSB2YWx1ZSBvdGhlcndpc2UuCiAKICAgIFRoZSAqbWF4bGV2ZWxzKiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBsaW1pdCB0aGUgZGVwdGggb2YgdGhlIHJlY3Vyc2lvbjsgaXQKICAgIGRlZmF1bHRzIHRvIGBgMTBgYC4KQEAgLTE1NCw3ICsxNTUsOCBAQAogCiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpcj1Ob25lLCBmb3JjZT1GYWxzZSwgcng9Tm9uZSwgcXVpZXQ9MCwgbGVnYWN5PUZhbHNlLCBvcHRpbWl6ZT0tMSkKIAotICAgQ29tcGlsZSB0aGUgZmlsZSB3aXRoIHBhdGggKmZ1bGxuYW1lKi4KKyAgIENvbXBpbGUgdGhlIGZpbGUgd2l0aCBwYXRoICpmdWxsbmFtZSouIFJldHVybiBhIHRydWUgdmFsdWUgaWYgdGhlIGZpbGUKKyAgIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwgYW5kIGEgZmFsc2UgdmFsdWUgb3RoZXJ3aXNlLgogCiAgICBJZiAqZGRpciogaXMgZ2l2ZW4sIGl0IGlzIHByZXBlbmRlZCB0byB0aGUgcGF0aCB0byB0aGUgZmlsZSBiZWluZyBjb21waWxlZAogICAgZm9yIHVzZSBpbiBjb21waWxhdGlvbiB0aW1lIHRyYWNlYmFja3MsIGFuZCBpcyBhbHNvIGNvbXBpbGVkIGluIHRvIHRoZQpAQCAtMTkwLDggKzE5MiwxMCBAQAogCiAuLiBmdW5jdGlvbjo6IGNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj1UcnVlLCBtYXhsZXZlbHM9MCwgZm9yY2U9RmFsc2UsIHF1aWV0PTAsIGxlZ2FjeT1GYWxzZSwgb3B0aW1pemU9LTEpCiAKLSAgIEJ5dGUtY29tcGlsZSBhbGwgdGhlIDpmaWxlOmAucHlgIGZpbGVzIGZvdW5kIGFsb25nIGBgc3lzLnBhdGhgYC4gSWYKLSAgICpza2lwX2N1cmRpciogaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgbm90IGluY2x1ZGVkCisgICBCeXRlLWNvbXBpbGUgYWxsIHRoZSA6ZmlsZTpgLnB5YCBmaWxlcyBmb3VuZCBhbG9uZyBgYHN5cy5wYXRoYGAuIFJldHVybiBhCisgICB0cnVlIHZhbHVlIGlmIGFsbCB0aGUgZmlsZXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LCBhbmQgYSBmYWxzZSB2YWx1ZSBvdGhlcndpc2UuCisKKyAgIElmICpza2lwX2N1cmRpciogaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgbm90IGluY2x1ZGVkCiAgICBpbiB0aGUgc2VhcmNoLiAgQWxsIG90aGVyIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgOmZ1bmM6YGNvbXBpbGVfZGlyYAogICAgZnVuY3Rpb24uICBOb3RlIHRoYXQgdW5saWtlIHRoZSBvdGhlciBjb21waWxlIGZ1bmN0aW9ucywgYGBtYXhsZXZlbHNgYAogICAgZGVmYXVsdHMgdG8gYGAwYGAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdCBiL0RvYy9saWJyYXJ5L2NvbnRleHRsaWIucnN0CmluZGV4IGNmODVmY2QuLjgxMGNlYTggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbnRleHRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbnRleHRsaWIucnN0CkBAIC0xOCw2ICsxOCwxOCBAQAogCiBGdW5jdGlvbnMgYW5kIGNsYXNzZXMgcHJvdmlkZWQ6CiAKKy4uIGNsYXNzOjogQWJzdHJhY3RDb250ZXh0TWFuYWdlcgorCisgICBBbiA6dGVybTpgYWJzdHJhY3QgYmFzZSBjbGFzc2AgZm9yIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnQKKyAgIDptZXRoOmBvYmplY3QuX19lbnRlcl9fYCBhbmQgOm1ldGg6YG9iamVjdC5fX2V4aXRfX2AuIEEgZGVmYXVsdAorICAgaW1wbGVtZW50YXRpb24gZm9yIDptZXRoOmBvYmplY3QuX19lbnRlcl9fYCBpcyBwcm92aWRlZCB3aGljaCByZXR1cm5zCisgICBgYHNlbGZgYCB3aGlsZSA6bWV0aDpgb2JqZWN0Ll9fZXhpdF9fYCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgd2hpY2ggYnkgZGVmYXVsdAorICAgcmV0dXJucyBgYE5vbmVgYC4gU2VlIGFsc28gdGhlIGRlZmluaXRpb24gb2YgOnJlZjpgdHlwZWNvbnRleHRtYW5hZ2VyYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworCiAuLiBkZWNvcmF0b3I6OiBjb250ZXh0bWFuYWdlcgogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGEgOnRlcm06YGRlY29yYXRvcmAgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBmYWN0b3J5CkBAIC00NDcsOSArNDU5LDkgQEAKIGFjcXVpc2l0aW9uIGFuZCByZWxlYXNlIGZ1bmN0aW9ucywgYWxvbmcgd2l0aCBhbiBvcHRpb25hbCB2YWxpZGF0aW9uIGZ1bmN0aW9uLAogYW5kIG1hcHMgdGhlbSB0byB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sOjoKIAotICAgZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlciwgRXhpdFN0YWNrCisgICBmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyLCBBYnN0cmFjdENvbnRleHRNYW5hZ2VyLCBFeGl0U3RhY2sKIAotICAgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgorICAgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFjcXVpcmVfcmVzb3VyY2UsIHJlbGVhc2VfcmVzb3VyY2UsIGNoZWNrX3Jlc291cmNlX29rPU5vbmUpOgogICAgICAgICAgICBzZWxmLmFjcXVpcmVfcmVzb3VyY2UgPSBhY3F1aXJlX3Jlc291cmNlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jcnlwdC5yc3QgYi9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKaW5kZXggYTIxYzFlNy4uZGJkNDI3NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3J5cHQucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NyeXB0LnJzdApAQCAtNjgsNyArNjgsNyBAQAogCiAgICBBIGxpc3Qgb2YgYXZhaWxhYmxlIHBhc3N3b3JkIGhhc2hpbmcgYWxnb3JpdGhtcywgYXMKICAgIGBgY3J5cHQuTUVUSE9EXypgYCBvYmplY3RzLiAgVGhpcyBsaXN0IGlzIHNvcnRlZCBmcm9tIHN0cm9uZ2VzdCB0bwotICAgd2Vha2VzdCwgYW5kIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBhdCBsZWFzdCBgYGNyeXB0Lk1FVEhPRF9DUllQVGBgLgorICAgd2Vha2VzdC4KIAogCiBNb2R1bGUgRnVuY3Rpb25zCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0IGIvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdAppbmRleCAxZWRkZmRjLi5hZTQ1NTQ5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QKQEAgLTE2LDMgKzE2LDQgQEAKIAogICAgaGFzaGxpYi5yc3QKICAgIGhtYWMucnN0CisgICBzZWNyZXRzLnJzdApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0IGIvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CmluZGV4IDkyNTRhZTguLmNkNzg3NTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKQEAgLTYxMCw3ICs2MTAsOCBAQAogLi4gbWV0aG9kOjogZGF0ZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLmRhdGUuc3RyZnRpbWVgLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBmb3JtYXQKLSAgIHN0cmluZyBmb3IgYSA6Y2xhc3M6YC5kYXRlYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuIEZvciBhCisgICBzdHJpbmcgZm9yIGEgOmNsYXNzOmAuZGF0ZWAgb2JqZWN0IGluIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcKKyAgIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCBhbmQgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuIEZvciBhCiAgICBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlCiAgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKQEAgLTExMzgsNyArMTEzOSw3IEBACiAgICBgYHNlbGYuZGF0ZSgpLmlzb2NhbGVuZGFyKClgYC4KIAogCi0uLiBtZXRob2Q6OiBkYXRldGltZS5pc29mb3JtYXQoc2VwPSdUJykKKy4uIG1ldGhvZDo6IGRhdGV0aW1lLmlzb2Zvcm1hdChzZXA9J1QnLCB0aW1lc3BlYz0nYXV0bycpCiAKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRhdGUgYW5kIHRpbWUgaW4gSVNPIDg2MDEgZm9ybWF0LAogICAgWVlZWS1NTS1ERFRISDpNTTpTUy5tbW1tbW0gb3IsIGlmIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwKQEAgLTExNTksNiArMTE2MCwzNyBAQAogICAgICAgPj4+IGRhdGV0aW1lKDIwMDIsIDEyLCAyNSwgdHppbmZvPVRaKCkpLmlzb2Zvcm1hdCgnICcpCiAgICAgICAnMjAwMi0xMi0yNSAwMDowMDowMC0wNjozOScKIAorICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICp0aW1lc3BlYyogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbAorICAgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlICh0aGUgZGVmYXVsdCBpcyBgYCdhdXRvJ2BgKS4KKyAgIEl0IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgLSBgYCdhdXRvJ2BgOiBTYW1lIGFzIGBgJ3NlY29uZHMnYGAgaWYgOmF0dHI6YG1pY3Jvc2Vjb25kYCBpcyAwLAorICAgICBzYW1lIGFzIGBgJ21pY3Jvc2Vjb25kcydgYCBvdGhlcndpc2UuCisgICAtIGBgJ2hvdXJzJ2BgOiBJbmNsdWRlIHRoZSA6YXR0cjpgaG91cmAgaW4gdGhlIHR3by1kaWdpdCBISCBmb3JtYXQuCisgICAtIGBgJ21pbnV0ZXMnYGA6IEluY2x1ZGUgOmF0dHI6YGhvdXJgIGFuZCA6YXR0cjpgbWludXRlYCBpbiBISDpNTSBmb3JtYXQuCisgICAtIGBgJ3NlY29uZHMnYGA6IEluY2x1ZGUgOmF0dHI6YGhvdXJgLCA6YXR0cjpgbWludXRlYCwgYW5kIDphdHRyOmBzZWNvbmRgCisgICAgIGluIEhIOk1NOlNTIGZvcm1hdC4KKyAgIC0gYGAnbWlsbGlzZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSwgYnV0IHRydW5jYXRlIGZyYWN0aW9uYWwgc2Vjb25kCisgICAgIHBhcnQgdG8gbWlsbGlzZWNvbmRzLiBISDpNTTpTUy5zc3MgZm9ybWF0LgorICAgLSBgYCdtaWNyb3NlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lIGluIEhIOk1NOlNTLm1tbW1tbSBmb3JtYXQuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBFeGNsdWRlZCB0aW1lIGNvbXBvbmVudHMgYXJlIHRydW5jYXRlZCwgbm90IHJvdW5kZWQuCisKKyAgIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgcmFpc2VkIG9uIGFuIGludmFsaWQgKnRpbWVzcGVjKiBhcmd1bWVudC4KKworCisgICAgICA+Pj4gZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKKyAgICAgID4+PiBkYXRldGltZS5ub3coKS5pc29mb3JtYXQodGltZXNwZWM9J21pbnV0ZXMnKQorICAgICAgJzIwMDItMTItMjVUMDA6MDAnCisgICAgICA+Pj4gZHQgPSBkYXRldGltZSgyMDE1LCAxLCAxLCAxMiwgMzAsIDU5LCAwKQorICAgICAgPj4+IGR0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJykKKyAgICAgICcyMDE1LTAxLTAxVDEyOjMwOjU5LjAwMDAwMCcKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgKnRpbWVzcGVjKiBhcmd1bWVudC4KKwogCiAuLiBtZXRob2Q6OiBkYXRldGltZS5fX3N0cl9fKCkKIApAQCAtMTE4NSw3ICsxMjE3LDggQEAKIC4uIG1ldGhvZDo6IGRhdGV0aW1lLl9fZm9ybWF0X18oZm9ybWF0KQogCiAgICBTYW1lIGFzIDptZXRoOmAuZGF0ZXRpbWUuc3RyZnRpbWVgLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgZm9ybWF0Ci0gICBzdHJpbmcgZm9yIGEgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCisgICBzdHJpbmcgZm9yIGEgOmNsYXNzOmAuZGF0ZXRpbWVgIG9iamVjdCBpbiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nCisgICBsaXRlcmFscyA8Zi1zdHJpbmdzPmAgYW5kIHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiAgRm9yIGEKICAgIGNvbXBsZXRlIGxpc3Qgb2YgZm9ybWF0dGluZyBkaXJlY3RpdmVzLCBzZWUKICAgIDpyZWY6YHN0cmZ0aW1lLXN0cnB0aW1lLWJlaGF2aW9yYC4KIApAQCAtMTQwNywxMyArMTQ0MCw0NiBAQAogICAgYXdhcmUgOmNsYXNzOmAudGltZWAsIHdpdGhvdXQgY29udmVyc2lvbiBvZiB0aGUgdGltZSBkYXRhLgogCiAKLS4uIG1ldGhvZDo6IHRpbWUuaXNvZm9ybWF0KCkKKy4uIG1ldGhvZDo6IHRpbWUuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJykKIAogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGltZSBpbiBJU08gODYwMSBmb3JtYXQsIEhIOk1NOlNTLm1tbW1tbSBvciwgaWYKLSAgIHNlbGYubWljcm9zZWNvbmQgaXMgMCwgSEg6TU06U1MgSWYgOm1ldGg6YHV0Y29mZnNldGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCBhCisgICA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsIEhIOk1NOlNTIElmIDptZXRoOmB1dGNvZmZzZXRgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgYQogICAgNi1jaGFyYWN0ZXIgc3RyaW5nIGlzIGFwcGVuZGVkLCBnaXZpbmcgdGhlIFVUQyBvZmZzZXQgaW4gKHNpZ25lZCkgaG91cnMgYW5kCiAgICBtaW51dGVzOiBISDpNTTpTUy5tbW1tbW0rSEg6TU0gb3IsIGlmIHNlbGYubWljcm9zZWNvbmQgaXMgMCwgSEg6TU06U1MrSEg6TU0KIAorICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICp0aW1lc3BlYyogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbAorICAgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlICh0aGUgZGVmYXVsdCBpcyBgYCdhdXRvJ2BgKS4KKyAgIEl0IGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgLSBgYCdhdXRvJ2BgOiBTYW1lIGFzIGBgJ3NlY29uZHMnYGAgaWYgOmF0dHI6YG1pY3Jvc2Vjb25kYCBpcyAwLAorICAgICBzYW1lIGFzIGBgJ21pY3Jvc2Vjb25kcydgYCBvdGhlcndpc2UuCisgICAtIGBgJ2hvdXJzJ2BgOiBJbmNsdWRlIHRoZSA6YXR0cjpgaG91cmAgaW4gdGhlIHR3by1kaWdpdCBISCBmb3JtYXQuCisgICAtIGBgJ21pbnV0ZXMnYGA6IEluY2x1ZGUgOmF0dHI6YGhvdXJgIGFuZCA6YXR0cjpgbWludXRlYCBpbiBISDpNTSBmb3JtYXQuCisgICAtIGBgJ3NlY29uZHMnYGA6IEluY2x1ZGUgOmF0dHI6YGhvdXJgLCA6YXR0cjpgbWludXRlYCwgYW5kIDphdHRyOmBzZWNvbmRgCisgICAgIGluIEhIOk1NOlNTIGZvcm1hdC4KKyAgIC0gYGAnbWlsbGlzZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSwgYnV0IHRydW5jYXRlIGZyYWN0aW9uYWwgc2Vjb25kCisgICAgIHBhcnQgdG8gbWlsbGlzZWNvbmRzLiBISDpNTTpTUy5zc3MgZm9ybWF0LgorICAgLSBgYCdtaWNyb3NlY29uZHMnYGA6IEluY2x1ZGUgZnVsbCB0aW1lIGluIEhIOk1NOlNTLm1tbW1tbSBmb3JtYXQuCisKKyAgIC4uIG5vdGU6OgorCisgICAgICBFeGNsdWRlZCB0aW1lIGNvbXBvbmVudHMgYXJlIHRydW5jYXRlZCwgbm90IHJvdW5kZWQuCisKKyAgIDpleGM6YFZhbHVlRXJyb3JgIHdpbGwgYmUgcmFpc2VkIG9uIGFuIGludmFsaWQgKnRpbWVzcGVjKiBhcmd1bWVudC4KKworCisgICAgICA+Pj4gZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZQorICAgICAgPj4+IHRpbWUoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTEyMzQ1NikuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJykKKyAgICAgICcxMjozNCcKKyAgICAgID4+PiBkdCA9IHRpbWUoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTApCisgICAgICA+Pj4gZHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKQorICAgICAgJzEyOjM0OjU2LjAwMDAwMCcKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKQorICAgICAgJzEyOjM0OjU2JworCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSAqdGltZXNwZWMqIGFyZ3VtZW50LgorCiAKIC4uIG1ldGhvZDo6IHRpbWUuX19zdHJfXygpCiAKQEAgLTE0MzAsNyArMTQ5Niw4IEBACiAuLiBtZXRob2Q6OiB0aW1lLl9fZm9ybWF0X18oZm9ybWF0KQogCiAgICBTYW1lIGFzIDptZXRoOmAudGltZS5zdHJmdGltZWAuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdCBzdHJpbmcKLSAgIGZvciBhIDpjbGFzczpgLnRpbWVgIG9iamVjdCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCisgICBmb3IgYSA6Y2xhc3M6YC50aW1lYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCiAgICBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlCiAgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKQEAgLTE3NDEsMTAgKzE4MDgsNyBAQAogICBvdGhlcndpc2UgOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkLgogCiAgIFRoZSAqbmFtZSogYXJndW1lbnQgaXMgb3B0aW9uYWwuICBJZiBzcGVjaWZpZWQgaXQgbXVzdCBiZSBhIHN0cmluZyB0aGF0Ci0gIGlzIHVzZWQgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBgYHR6bmFtZShkdClgYCBtZXRob2QuICBPdGhlcndpc2UsCi0gIGBgdHpuYW1lKGR0KWBgIHJldHVybnMgYSBzdHJpbmcgJ1VUQ3NISDpNTScsIHdoZXJlIHMgaXMgdGhlIHNpZ24gb2YKLSAgKm9mZnNldCosIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAotICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgorICB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSA6bWV0aDpgZGF0ZXRpbWUudHpuYW1lYCBtZXRob2QuCiAKICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKQEAgLTE3NTcsMTEgKzE4MjEsMTkgQEAKIAogLi4gbWV0aG9kOjogdGltZXpvbmUudHpuYW1lKGR0KQogCi0gIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlIGlzCi0gIGNvbnN0cnVjdGVkIG9yIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKKyAgUmV0dXJuIHRoZSBmaXhlZCB2YWx1ZSBzcGVjaWZpZWQgd2hlbiB0aGUgOmNsYXNzOmB0aW1lem9uZWAgaW5zdGFuY2UKKyAgaXMgY29uc3RydWN0ZWQuICBJZiAqbmFtZSogaXMgbm90IHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhlCisgIG5hbWUgcmV0dXJuZWQgYnkgYGB0em5hbWUoZHQpYGAgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHZhbHVlIG9mIHRoZQorICBgYG9mZnNldGBgIGFzIGZvbGxvd3MuICBJZiAqb2Zmc2V0KiBpcyBgYHRpbWVkZWx0YSgwKWBgLCB0aGUgbmFtZQorICBpcyAiVVRDIiwgb3RoZXJ3aXNlIGl0IGlzIGEgc3RyaW5nICdVVEPCsUhIOk1NJywgd2hlcmUgwrEgaXMgdGhlIHNpZ24KKyAgb2YgYGBvZmZzZXRgYCwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCiAgIGBgb2Zmc2V0Lm1pbnV0ZXNgYCByZXNwZWN0aXZlbHkuCiAKKyAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgTmFtZSBnZW5lcmF0ZWQgZnJvbSBgYG9mZnNldD10aW1lZGVsdGEoMClgYCBpcyBub3cgcGxhaW4gJ1VUQycsIG5vdAorICAgICAnVVRDKzAwOjAwJy4KKworCiAuLiBtZXRob2Q6OiB0aW1lem9uZS5kc3QoZHQpCiAKICAgQWx3YXlzIHJldHVybnMgYGBOb25lYGAuCkBAIC0xOTExLDYgKzE5ODMsMzQgQEAKIHwgYGAlJWBgICAgIHwgQSBsaXRlcmFsIGBgJyUnYGAgY2hhcmFjdGVyLiAgIHwgJSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKIAorU2V2ZXJhbCBhZGRpdGlvbmFsIGRpcmVjdGl2ZXMgbm90IHJlcXVpcmVkIGJ5IHRoZSBDODkgc3RhbmRhcmQgYXJlIGluY2x1ZGVkIGZvcgorY29udmVuaWVuY2UuIFRoZXNlIHBhcmFtZXRlcnMgYWxsIGNvcnJlc3BvbmQgdG8gSVNPIDg2MDEgZGF0ZSB2YWx1ZXMuIFRoZXNlCittYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RyZnRpbWVgCittZXRob2QuIFRoZSBJU08gODYwMSB5ZWFyIGFuZCBJU08gODYwMSB3ZWVrIGRpcmVjdGl2ZXMgYXJlIG5vdCBpbnRlcmNoYW5nZWFibGUKK3dpdGggdGhlIHllYXIgYW5kIHdlZWsgbnVtYmVyIGRpcmVjdGl2ZXMgYWJvdmUuIENhbGxpbmcgOm1ldGg6YHN0cnB0aW1lYCB3aXRoCitpbmNvbXBsZXRlIG9yIGFtYmlndW91cyBJU08gODYwMSBkaXJlY3RpdmVzIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYC4KKworKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBEaXJlY3RpdmUgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlICAgICAgICAgICAgICAgIHwgTm90ZXMgfAorKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09KworfCBgYCVHYGAgICAgfCBJU08gODYwMSB5ZWFyIHdpdGggY2VudHVyeSAgICAgfCAwMDAxLCAwMDAyLCAuLi4sIDIwMTMsIHwgXCg4KSAgfAorfCAgICAgICAgICAgfCByZXByZXNlbnRpbmcgdGhlIHllYXIgdGhhdCAgICAgfCAyMDE0LCAuLi4sIDk5OTgsIDk5OTkgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBjb250YWlucyB0aGUgZ3JlYXRlciBwYXJ0IG9mICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB0aGUgSVNPIHdlZWsgKGBgJVZgYCkuICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCV1YGAgICAgfCBJU08gODYwMSB3ZWVrZGF5IGFzIGEgZGVjaW1hbCAgfCAxLCAyLCAuLi4sIDcgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBudW1iZXIgd2hlcmUgMSBpcyBNb25kYXkuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworfCBgYCVWYGAgICAgfCBJU08gODYwMSB3ZWVrIGFzIGEgZGVjaW1hbCAgICAgfCAwMSwgMDIsIC4uLiwgNTMgICAgICAgIHwgXCg4KSAgfAorfCAgICAgICAgICAgfCBudW1iZXIgd2l0aCBNb25kYXkgYXMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBXZWVrIDAxIGlzIHRoZSB3ZWVrIGNvbnRhaW5pbmcgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorfCAgICAgICAgICAgfCBKYW4gNC4gICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfAorKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKworCisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgIGBgJUdgYCwgYGAldWBgIGFuZCBgYCVWYGAgd2VyZSBhZGRlZC4KKwogTm90ZXM6CiAKICgxKQpAQCAtMTk3NSw3ICsyMDc1LDE0IEBACiAKICg3KQogICAgV2hlbiB1c2VkIHdpdGggdGhlIDptZXRoOmBzdHJwdGltZWAgbWV0aG9kLCBgYCVVYGAgYW5kIGBgJVdgYCBhcmUgb25seSB1c2VkCi0gICBpbiBjYWxjdWxhdGlvbnMgd2hlbiB0aGUgZGF5IG9mIHRoZSB3ZWVrIGFuZCB0aGUgeWVhciBhcmUgc3BlY2lmaWVkLgorICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIGNhbGVuZGFyIHllYXIgKGBgJVlgYCkKKyAgIGFyZSBzcGVjaWZpZWQuCisKKyg4KQorICAgU2ltaWxhciB0byBgYCVVYGAgYW5kIGBgJVdgYCwgYGAlVmBgIGlzIG9ubHkgdXNlZCBpbiBjYWxjdWxhdGlvbnMgd2hlbiB0aGUKKyAgIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIElTTyB5ZWFyIChgYCVHYGApIGFyZSBzcGVjaWZpZWQgaW4gYQorICAgOm1ldGg6YHN0cnB0aW1lYCBmb3JtYXQgc3RyaW5nLiBBbHNvIG5vdGUgdGhhdCBgYCVHYGAgYW5kIGBgJVlgYCBhcmUgbm90CisgICBpbnRlcmNoYW5nZWFibGUuCiAKIC4uIHJ1YnJpYzo6IEZvb3Rub3RlcwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kZWNpbWFsLnJzdCBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CmluZGV4IDUyOGY5N2IuLjllZGM2OTYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0CkBAIC00NDcsNiArNDQ3LDE5IEBACiAgICAgICBgYERlY2ltYWwoJzMyMWUrNScpLmFkanVzdGVkKClgYCByZXR1cm5zIHNldmVuLiAgVXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlCiAgICAgICBwb3NpdGlvbiBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCB3aXRoIHJlc3BlY3QgdG8gdGhlIGRlY2ltYWwgcG9pbnQuCiAKKyAgIC4uIG1ldGhvZDo6IGFzX2ludGVnZXJfcmF0aW8oKQorCisgICAgICBSZXR1cm4gYSBwYWlyIGBgKG4sIGQpYGAgb2YgaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGdpdmVuCisgICAgICA6Y2xhc3M6YERlY2ltYWxgIGluc3RhbmNlIGFzIGEgZnJhY3Rpb24sIGluIGxvd2VzdCB0ZXJtcyBhbmQKKyAgICAgIHdpdGggYSBwb3NpdGl2ZSBkZW5vbWluYXRvcjo6CisKKyAgICAgICAgICA+Pj4gRGVjaW1hbCgnLTMuMTQnKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgICAoLTE1NywgNTApCisKKyAgICAgIFRoZSBjb252ZXJzaW9uIGlzIGV4YWN0LiAgUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBWYWx1ZUVycm9yCisgICAgICBvbiBOYU5zLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKIAogICAgLi4gbWV0aG9kOjogYXNfdHVwbGUoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9kaXMucnN0IGIvRG9jL2xpYnJhcnkvZGlzLnJzdAppbmRleCBkMmQ4YWM3Li4yNDViNGQyIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kaXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2Rpcy5yc3QKQEAgLTMxLDkgKzMxLDkgQEAKIAogICAgPj4+IGRpcy5kaXMobXlmdW5jKQogICAgICAyICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChsZW4pCi0gICAgICAgICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGFsaXN0KQotICAgICAgICAgICAgICAgICA2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCi0gICAgICAgICAgICAgICAgIDkgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgICAgIDIgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGFsaXN0KQorICAgICAgICAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxCisgICAgICAgICAgICAgICAgIDYgUkVUVVJOX1ZBTFVFCiAKIChUaGUgIjIiIGlzIGEgbGluZSBudW1iZXIpLgogCkBAIC02ODIsOCArNjgyLDcgQEAKICAgIC4uIFhYWCBleHBsYWluIHRoZSBXSFkgc3R1ZmYhCiAKIAotQWxsIG9mIHRoZSBmb2xsb3dpbmcgb3Bjb2RlcyBleHBlY3QgYXJndW1lbnRzLiAgQW4gYXJndW1lbnQgaXMgdHdvIGJ5dGVzLCB3aXRoCi10aGUgbW9yZSBzaWduaWZpY2FudCBieXRlIGxhc3QuCitBbGwgb2YgdGhlIGZvbGxvd2luZyBvcGNvZGVzIHVzZSB0aGVpciBhcmd1bWVudHMuCiAKIC4uIG9wY29kZTo6IFNUT1JFX05BTUUgKG5hbWVpKQogCkBAIC03NjksNiArNzY4LDE1IEBACiAgICB0byBob2xkICpjb3VudCogZW50cmllcy4KIAogCisuLiBvcGNvZGU6OiBCVUlMRF9DT05TVF9LRVlfTUFQIChjb3VudCkKKworICAgVGhlIHZlcnNpb24gb2YgOm9wY29kZTpgQlVJTERfTUFQYCBzcGVjaWFsaXplZCBmb3IgY29uc3RhbnQga2V5cy4gICpjb3VudCoKKyAgIHZhbHVlcyBhcmUgY29uc3VtZWQgZnJvbSB0aGUgc3RhY2suICBUaGUgdG9wIGVsZW1lbnQgb24gdGhlIHN0YWNrIGNvbnRhaW5zCisgICBhIHR1cGxlIG9mIGtleXMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIC4uIG9wY29kZTo6IExPQURfQVRUUiAobmFtZWkpCiAKICAgIFJlcGxhY2VzIFRPUyB3aXRoIGBgZ2V0YXR0cihUT1MsIGNvX25hbWVzW25hbWVpXSlgYC4KQEAgLTkyOSwyNyArOTM3LDE2IEBACiAuLiBvcGNvZGU6OiBNQUtFX0ZVTkNUSU9OIChhcmdjKQogCiAgICBQdXNoZXMgYSBuZXcgZnVuY3Rpb24gb2JqZWN0IG9uIHRoZSBzdGFjay4gIEZyb20gYm90dG9tIHRvIHRvcCwgdGhlIGNvbnN1bWVkCi0gICBzdGFjayBtdXN0IGNvbnNpc3Qgb2YKKyAgIHN0YWNrIG11c3QgY29uc2lzdCBvZiB2YWx1ZXMgaWYgdGhlIGFyZ3VtZW50IGNhcnJpZXMgYSBzcGVjaWZpZWQgZmxhZyB2YWx1ZQogCi0gICAqIGBgYXJnYyAmIDB4RkZgYCBkZWZhdWx0IGFyZ3VtZW50IG9iamVjdHMgaW4gcG9zaXRpb25hbCBvcmRlcgotICAgKiBgYChhcmdjID4+IDgpICYgMHhGRmBgIHBhaXJzIG9mIG5hbWUgYW5kIGRlZmF1bHQgYXJndW1lbnQsIHdpdGggdGhlIG5hbWUKLSAgICAganVzdCBiZWxvdyB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjaywgZm9yIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzCi0gICAqIGBgKGFyZ2MgPj4gMTYpICYgMHg3RkZGYGAgcGFyYW1ldGVyIGFubm90YXRpb24gb2JqZWN0cwotICAgKiBhIHR1cGxlIGxpc3RpbmcgdGhlIHBhcmFtZXRlciBuYW1lcyBmb3IgdGhlIGFubm90YXRpb25zIChvbmx5IGlmIHRoZXJlIGFyZQotICAgICBvbnkgYW5ub3RhdGlvbiBvYmplY3RzKQorICAgKiBgYDB4MDFgYCBhIHR1cGxlIG9mIGRlZmF1bHQgYXJndW1lbnQgb2JqZWN0cyBpbiBwb3NpdGlvbmFsIG9yZGVyCisgICAqIGBgMHgwMmBgIGEgZGljdGlvbmFyeSBvZiBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycycgZGVmYXVsdCB2YWx1ZXMKKyAgICogYGAweDA0YGAgYW4gYW5ub3RhdGlvbiBkaWN0aW9uYXJ5CisgICAqIGBgMHgwOGBgIGEgdHVwbGUgY29udGFpbmluZyBjZWxscyBmb3IgZnJlZSB2YXJpYWJsZXMsIG1ha2luZyBhIGNsb3N1cmUKICAgICogdGhlIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbiAoYXQgVE9TMSkKICAgICogdGhlIDp0ZXJtOmBxdWFsaWZpZWQgbmFtZWAgb2YgdGhlIGZ1bmN0aW9uIChhdCBUT1MpCiAKIAotLi4gb3Bjb2RlOjogTUFLRV9DTE9TVVJFIChhcmdjKQotCi0gICBDcmVhdGVzIGEgbmV3IGZ1bmN0aW9uIG9iamVjdCwgc2V0cyBpdHMgKl9fY2xvc3VyZV9fKiBzbG90LCBhbmQgcHVzaGVzIGl0IG9uCi0gICB0aGUgc3RhY2suICBUT1MgaXMgdGhlIDp0ZXJtOmBxdWFsaWZpZWQgbmFtZWAgb2YgdGhlIGZ1bmN0aW9uLCBUT1MxIGlzIHRoZQotICAgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLCBhbmQgVE9TMiBpcyB0aGUgdHVwbGUgY29udGFpbmluZyBjZWxscyBmb3IKLSAgIHRoZSBjbG9zdXJlJ3MgZnJlZSB2YXJpYWJsZXMuICAqYXJnYyogaXMgaW50ZXJwcmV0ZWQgYXMgaW4gYGBNQUtFX0ZVTkNUSU9OYGA7Ci0gICB0aGUgYW5ub3RhdGlvbnMgYW5kIGRlZmF1bHRzIGFyZSBhbHNvIGluIHRoZSBzYW1lIG9yZGVyIGJlbG93IFRPUzIuCi0KLQogLi4gb3Bjb2RlOjogQlVJTERfU0xJQ0UgKGFyZ2MpCiAKICAgIC4uIGluZGV4OjogYnVpbHRpbjogc2xpY2UKQEAgLTk4OSw2ICs5ODYsMjggQEAKICAgIGFyZ3VtZW50cy4KIAogCisuLiBvcGNvZGU6OiBGT1JNQVRfVkFMVUUgKGZsYWdzKQorCisgICBVc2VkIGZvciBpbXBsZW1lbnRpbmcgZm9ybWF0dGVkIGxpdGVyYWwgc3RyaW5ncyAoZi1zdHJpbmdzKS4gIFBvcHMKKyAgIGFuIG9wdGlvbmFsICpmbXRfc3BlYyogZnJvbSB0aGUgc3RhY2ssIHRoZW4gYSByZXF1aXJlZCAqdmFsdWUqLgorICAgKmZsYWdzKiBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwMGBgOiAqdmFsdWUqIGlzIGZvcm1hdHRlZCBhcy1pcy4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAxYGA6IGNhbGwgOmZ1bmM6YHN0cmAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAyYGA6IGNhbGwgOmZ1bmM6YHJlcHJgIG9uICp2YWx1ZSogYmVmb3JlCisgICAgIGZvcm1hdHRpbmcgaXQuCisgICAqIGBgKGZsYWdzICYgMHgwMykgPT0gMHgwM2BgOiBjYWxsIDpmdW5jOmBhc2NpaWAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDA0KSA9PSAweDA0YGA6IHBvcCAqZm10X3NwZWMqIGZyb20gdGhlIHN0YWNrIGFuZCB1c2UKKyAgICAgaXQsIGVsc2UgdXNlIGFuIGVtcHR5ICpmbXRfc3BlYyouCisKKyAgIEZvcm1hdHRpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIDpjOmZ1bmM6YFB5T2JqZWN0X0Zvcm1hdGAuICBUaGUKKyAgIHJlc3VsdCBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiAuLiBvcGNvZGU6OiBIQVZFX0FSR1VNRU5UCiAKICAgIFRoaXMgaXMgbm90IHJlYWxseSBhbiBvcGNvZGUuICBJdCBpZGVudGlmaWVzIHRoZSBkaXZpZGluZyBsaW5lIGJldHdlZW4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2VudW0ucnN0IGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKaW5kZXggYTNkNWFmYy4uMjExMWQxYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZW51bS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZW51bS5yc3QKQEAgLTU1OCw3ICs1NTgsOCBAQAogNC4gJS1zdHlsZSBmb3JtYXR0aW5nOiAgYCVzYCBhbmQgYCVyYCBjYWxsIHRoZSA6Y2xhc3M6YEVudW1gIGNsYXNzJ3MKICAgIDptZXRoOmBfX3N0cl9fYCBhbmQgOm1ldGg6YF9fcmVwcl9fYCByZXNwZWN0aXZlbHk7IG90aGVyIGNvZGVzIChzdWNoIGFzCiAgICBgJWlgIG9yIGAlaGAgZm9yIEludEVudW0pIHRyZWF0IHRoZSBlbnVtIG1lbWJlciBhcyBpdHMgbWl4ZWQtaW4gdHlwZS4KLTUuIDptZXRoOmBzdHIuZm9ybWF0YCAob3IgOmZ1bmM6YGZvcm1hdGApIHdpbGwgdXNlIHRoZSBtaXhlZC1pbgorNS4gOnJlZjpgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIDptZXRoOmBzdHIuZm9ybWF0YCwKKyAgIGFuZCA6ZnVuYzpgZm9ybWF0YCB3aWxsIHVzZSB0aGUgbWl4ZWQtaW4KICAgIHR5cGUncyA6bWV0aDpgX19mb3JtYXRfX2AuICBJZiB0aGUgOmNsYXNzOmBFbnVtYCBjbGFzcydzIDpmdW5jOmBzdHJgIG9yCiAgICA6ZnVuYzpgcmVwcmAgaXMgZGVzaXJlZCwgdXNlIHRoZSBgIXNgIG9yIGAhcmAgZm9ybWF0IGNvZGVzLgogCkBAIC03NDcsNiArNzQ4LDE1IEBACiAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAKK0Jvb2xlYW4gZXZhbHVhdGlvbjogRW51bSBjbGFzc2VzIHRoYXQgYXJlIG1peGVkIHdpdGggbm9uLUVudW0gdHlwZXMgKHN1Y2ggYXMKKzpjbGFzczpgaW50YCwgOmNsYXNzOmBzdHJgLCBldGMuKSBhcmUgZXZhbHVhdGVkIGFjY29yZGluZyB0byB0aGUgbWl4ZWQtaW4KK3R5cGUncyBydWxlczsgb3RoZXJ3aXNlLCBhbGwgbWVtYmVycyBldmFsdWF0ZSBhcyBgYFRydWVgYC4gIFRvIG1ha2UgeW91ciBvd24KK0VudW0ncyBib29sZWFuIGV2YWx1YXRpb24gZGVwZW5kIG9uIHRoZSBtZW1iZXIncyB2YWx1ZSBhZGQgdGhlIGZvbGxvd2luZyB0bworeW91ciBjbGFzczo6CisKKyAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYudmFsdWUpCisKIFRoZSA6YXR0cjpgX19tZW1iZXJzX19gIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBvbiB0aGUgY2xhc3MuCiAKIElmIHlvdSBnaXZlIHlvdXIgOmNsYXNzOmBFbnVtYCBzdWJjbGFzcyBleHRyYSBtZXRob2RzLCBsaWtlIHRoZSBgUGxhbmV0YF8KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QgYi9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0CmluZGV4IGRlZWRlYTEuLmQwYzRjZDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdApAQCAtNzAsNiArNzAsOSBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZmlsZSBkZXNjcmlwdG9yIHRvIHRoaXMgZnVuY3Rpb24uCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPbiBXaW5kb3dzLCBhIGhhbmRsZXIgZm9yIFdpbmRvd3MgZXhjZXB0aW9uIGlzIGFsc28gaW5zdGFsbGVkLgorCiAuLiBmdW5jdGlvbjo6IGRpc2FibGUoKQogCiAgICBEaXNhYmxlIHRoZSBmYXVsdCBoYW5kbGVyOiB1bmluc3RhbGwgdGhlIHNpZ25hbCBoYW5kbGVycyBpbnN0YWxsZWQgYnkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QgYi9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CmluZGV4IGFhNGM1MjkuLjU4ODFmZWYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdApAQCAtNzIsOSArNzIsOCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIENhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyLgogCi0gICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNS4yCi0gICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KLQorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSB0aGUgZ2xvYmFsIHN0YXRlIGNyZWF0ZWQgYnkgOmZ1bmM6YGZpbGVpbnB1dC5pbnB1dGA7CiBpZiB0aGVyZSBpcyBubyBhY3RpdmUgc3RhdGUsIDpleGM6YFJ1bnRpbWVFcnJvcmAgaXMgcmFpc2VkLgpAQCAtMTY3LDggKzE2Niw4IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy40CiAgICAgICBUaGUgYGAnclUnYGAgYW5kIGBgJ1UnYGAgbW9kZXMuCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41LjIKLSAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIuCiAKIAogKipPcHRpb25hbCBpbi1wbGFjZSBmaWx0ZXJpbmc6KiogaWYgdGhlIGtleXdvcmQgYXJndW1lbnQgYGBpbnBsYWNlPVRydWVgYCBpcwpAQCAtMTk1LDEwICsxOTQsMTQgQEAKICAgIFVzYWdlIGV4YW1wbGU6ICBgYGZpID0gZmlsZWlucHV0LkZpbGVJbnB1dChvcGVuaG9vaz1maWxlaW5wdXQuaG9va19jb21wcmVzc2VkKWBgCiAKIAotLi4gZnVuY3Rpb246OiBob29rX2VuY29kZWQoZW5jb2RpbmcpCisuLiBmdW5jdGlvbjo6IGhvb2tfZW5jb2RlZChlbmNvZGluZywgZXJyb3JzPU5vbmUpCiAKICAgIFJldHVybnMgYSBob29rIHdoaWNoIG9wZW5zIGVhY2ggZmlsZSB3aXRoIDpmdW5jOmBvcGVuYCwgdXNpbmcgdGhlIGdpdmVuCi0gICAqZW5jb2RpbmcqIHRvIHJlYWQgdGhlIGZpbGUuCisgICAqZW5jb2RpbmcqIGFuZCAqZXJyb3JzKiB0byByZWFkIHRoZSBmaWxlLgogCiAgICBVc2FnZSBleGFtcGxlOiBgYGZpID0KLSAgIGZpbGVpbnB1dC5GaWxlSW5wdXQob3Blbmhvb2s9ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZCgiaXNvLTg4NTktMSIpKWBgCisgICBmaWxlaW5wdXQuRmlsZUlucHV0KG9wZW5ob29rPWZpbGVpbnB1dC5ob29rX2VuY29kZWQoInV0Zi04IiwKKyAgICJzdXJyb2dhdGVlc2NhcGUiKSlgYAorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlIG9wdGlvbmFsICplcnJvcnMqIHBhcmFtZXRlci4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0CmluZGV4IGVmYTViZDMuLjcyMTZmMWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdApAQCAtODc4LDExICs4NzgsMTEgQEAKICAgIE9wZW4gKmZpbGUqIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIDp0ZXJtOmBmaWxlIG9iamVjdGAuICBJZiB0aGUgZmlsZQogICAgY2Fubm90IGJlIG9wZW5lZCwgYW4gOmV4YzpgT1NFcnJvcmAgaXMgcmFpc2VkLgogCi0gICAqZmlsZSogaXMgZWl0aGVyIGEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCBnaXZpbmcgdGhlIHBhdGhuYW1lIChhYnNvbHV0ZSBvcgotICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpIG9mIHRoZSBmaWxlIHRvIGJlIG9wZW5lZCBvcgotICAgYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUgd3JhcHBlZC4gIChJZiBhIGZpbGUgZGVzY3JpcHRvcgotICAgaXMgZ2l2ZW4sIGl0IGlzIGNsb3NlZCB3aGVuIHRoZSByZXR1cm5lZCBJL08gb2JqZWN0IGlzIGNsb3NlZCwgdW5sZXNzCi0gICAqY2xvc2VmZCogaXMgc2V0IHRvIGBgRmFsc2VgYC4pCisgICAqZmlsZSogaXMgZWl0aGVyIGEgc3RyaW5nLCBieXRlcywgb3IgOmNsYXNzOmBvcy5QYXRoTGlrZWAgb2JqZWN0IGdpdmluZyB0aGUKKyAgIHBhdGhuYW1lIChhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkgb2YgdGhlIGZpbGUKKyAgIHRvIGJlIG9wZW5lZCBvciBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZSB3cmFwcGVkLiAgKElmIGEKKyAgIGZpbGUgZGVzY3JpcHRvciBpcyBnaXZlbiwgaXQgaXMgY2xvc2VkIHdoZW4gdGhlIHJldHVybmVkIEkvTyBvYmplY3QgaXMKKyAgIGNsb3NlZCwgdW5sZXNzICpjbG9zZWZkKiBpcyBzZXQgdG8gYGBGYWxzZWBgLikKIAogICAgKm1vZGUqIGlzIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbW9kZSBpbiB3aGljaCB0aGUgZmlsZSBpcwogICAgb3BlbmVkLiAgSXQgZGVmYXVsdHMgdG8gYGAncidgYCB3aGljaCBtZWFucyBvcGVuIGZvciByZWFkaW5nIGluIHRleHQgbW9kZS4KQEAgLTEwNzcsNiArMTA3Nyw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgVGhlIGBgJ25hbWVyZXBsYWNlJ2BgIGVycm9yIGhhbmRsZXIgd2FzIGFkZGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBhZGRlZCB0byBhY2NlcHQgb2JqZWN0cyBpbXBsZW1lbnRpbmcgOmNsYXNzOmBvcy5QYXRoTGlrZWAuCisKIC4uIGZ1bmN0aW9uOjogb3JkKGMpCiAKICAgIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBvbmUgVW5pY29kZSBjaGFyYWN0ZXIsIHJldHVybiBhbiBpbnRlZ2VyCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9ncnAucnN0IGIvRG9jL2xpYnJhcnkvZ3JwLnJzdAppbmRleCBhMzBlNjIyLi43NGRlM2Y5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9ncnAucnN0CisrKyBiL0RvYy9saWJyYXJ5L2dycC5yc3QKQEAgLTQzLDYgKzQzLDkgQEAKICAgIFJldHVybiB0aGUgZ3JvdXAgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiBudW1lcmljIGdyb3VwIElELiA6ZXhjOmBLZXlFcnJvcmAKICAgIGlzIHJhaXNlZCBpZiB0aGUgZW50cnkgYXNrZWQgZm9yIGNhbm5vdCBiZSBmb3VuZC4KIAorICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorICAgICAgU2luY2UgUHl0aG9uIDMuNiB0aGUgc3VwcG9ydCBvZiBub24taW50ZWdlciBhcmd1bWVudHMgbGlrZSBmbG9hdHMgb3IKKyAgICAgIHN0cmluZ3MgaW4gOmZ1bmM6YGdldGdyZ2lkYCBpcyBkZXByZWNhdGVkLgogCiAuLiBmdW5jdGlvbjo6IGdldGdybmFtKG5hbWUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2hhc2hsaWIucnN0IGIvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKaW5kZXggMzBiZTMzNS4uOTNiY2M5MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QKQEAgLTM5LDggKzM5LDggQEAKIC0tLS0tLS0tLS0tLS0tLQogCiBUaGVyZSBpcyBvbmUgY29uc3RydWN0b3IgbWV0aG9kIG5hbWVkIGZvciBlYWNoIHR5cGUgb2YgOmRmbjpgaGFzaGAuICBBbGwgcmV0dXJuCi1hIGhhc2ggb2JqZWN0IHdpdGggdGhlIHNhbWUgc2ltcGxlIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6IHVzZSA6ZnVuYzpgc2hhMWAgdG8KLWNyZWF0ZSBhIFNIQTEgaGFzaCBvYmplY3QuIFlvdSBjYW4gbm93IGZlZWQgdGhpcyBvYmplY3Qgd2l0aCA6dGVybTpgYnl0ZXMtbGlrZQorYSBoYXNoIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNpbXBsZSBpbnRlcmZhY2UuIEZvciBleGFtcGxlOiB1c2UgOmZ1bmM6YHNoYTI1NmAgdG8KK2NyZWF0ZSBhIFNIQS0yNTYgaGFzaCBvYmplY3QuIFlvdSBjYW4gbm93IGZlZWQgdGhpcyBvYmplY3Qgd2l0aCA6dGVybTpgYnl0ZXMtbGlrZQogb2JqZWN0cyA8Ynl0ZXMtbGlrZSBvYmplY3Q+YCAobm9ybWFsbHkgOmNsYXNzOmBieXRlc2ApIHVzaW5nIHRoZSA6bWV0aDpgdXBkYXRlYCBtZXRob2QuCiBBdCBhbnkgcG9pbnQgeW91IGNhbiBhc2sgaXQgZm9yIHRoZSA6ZGZuOmBkaWdlc3RgIG9mIHRoZQogY29uY2F0ZW5hdGlvbiBvZiB0aGUgZGF0YSBmZWQgdG8gaXQgc28gZmFyIHVzaW5nIHRoZSA6bWV0aDpgZGlnZXN0YCBvcgpAQCAtNTksMjEgKzU5LDIzIEBACiAuLiBpbmRleDo6IHNpbmdsZTogT3BlblNTTDsgKHVzZSBpbiBtb2R1bGUgaGFzaGxpYikKIAogQ29uc3RydWN0b3JzIGZvciBoYXNoIGFsZ29yaXRobXMgdGhhdCBhcmUgYWx3YXlzIHByZXNlbnQgaW4gdGhpcyBtb2R1bGUgYXJlCi06ZnVuYzpgbWQ1YCwgOmZ1bmM6YHNoYTFgLCA6ZnVuYzpgc2hhMjI0YCwgOmZ1bmM6YHNoYTI1NmAsIDpmdW5jOmBzaGEzODRgLAotYW5kIDpmdW5jOmBzaGE1MTJgLiBBZGRpdGlvbmFsIGFsZ29yaXRobXMgbWF5IGFsc28gYmUgYXZhaWxhYmxlIGRlcGVuZGluZyB1cG9uCi10aGUgT3BlblNTTCBsaWJyYXJ5IHRoYXQgUHl0aG9uIHVzZXMgb24geW91ciBwbGF0Zm9ybS4KKzpmdW5jOmBzaGExYCwgOmZ1bmM6YHNoYTIyNGAsIDpmdW5jOmBzaGEyNTZgLCA6ZnVuYzpgc2hhMzg0YCwKK2FuZCA6ZnVuYzpgc2hhNTEyYC4gIDpmdW5jOmBtZDVgIGlzIG5vcm1hbGx5IGF2YWlsYWJsZSBhcyB3ZWxsLCB0aG91Z2ggaXQKK21heSBiZSBtaXNzaW5nIGlmIHlvdSBhcmUgdXNpbmcgYSByYXJlICJGSVBTIGNvbXBsaWFudCIgYnVpbGQgb2YgUHl0aG9uLgorQWRkaXRpb25hbCBhbGdvcml0aG1zIG1heSBhbHNvIGJlIGF2YWlsYWJsZSBkZXBlbmRpbmcgdXBvbiB0aGUgT3BlblNTTAorbGlicmFyeSB0aGF0IFB5dGhvbiB1c2VzIG9uIHlvdXIgcGxhdGZvcm0uCiAKIEZvciBleGFtcGxlLCB0byBvYnRhaW4gdGhlIGRpZ2VzdCBvZiB0aGUgYnl0ZSBzdHJpbmcgYGBiJ05vYm9keSBpbnNwZWN0cyB0aGUKIHNwYW1taXNoIHJlcGV0aXRpb24nYGA6OgogCiAgICA+Pj4gaW1wb3J0IGhhc2hsaWIKLSAgID4+PiBtID0gaGFzaGxpYi5tZDUoKQorICAgPj4+IG0gPSBoYXNobGliLnNoYTI1NigpCiAgICA+Pj4gbS51cGRhdGUoYiJOb2JvZHkgaW5zcGVjdHMiKQogICAgPj4+IG0udXBkYXRlKGIiIHRoZSBzcGFtbWlzaCByZXBldGl0aW9uIikKICAgID4+PiBtLmRpZ2VzdCgpCi0gICBiJ1x4YmJkXHg5Y1x4ODNceGRkXHgxZVx4YTVceGM5XHhkOVx4ZGVceGM5XHhhMVx4OGRceGYwXHhmZlx4ZTknCisgICBiJ1x4MDNceDFlXHhkZH1BZVx4MTVceDkzXHhjNVx4ZmVcXFx4MDBvXHhhNXUrN1x4ZmRceGRmXHhmN1x4YmNOXHg4NDpceGE2XHhhZlx4MGNceDk1XHgwZktceDk0XHgwNicKICAgID4+PiBtLmRpZ2VzdF9zaXplCi0gICAxNgorICAgMzIKICAgID4+PiBtLmJsb2NrX3NpemUKICAgIDY0CiAKQEAgLTEwMiw3ICsxMDQsOSBAQAogLi4gZGF0YTo6IGFsZ29yaXRobXNfZ3VhcmFudGVlZAogCiAgICBBIHNldCBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgaGFzaCBhbGdvcml0aG1zIGd1YXJhbnRlZWQgdG8gYmUgc3VwcG9ydGVkCi0gICBieSB0aGlzIG1vZHVsZSBvbiBhbGwgcGxhdGZvcm1zLgorICAgYnkgdGhpcyBtb2R1bGUgb24gYWxsIHBsYXRmb3Jtcy4gIE5vdGUgdGhhdCAnbWQ1JyBpcyBpbiB0aGlzIGxpc3QgZGVzcGl0ZQorICAgc29tZSB1cHN0cmVhbSB2ZW5kb3JzIG9mZmVyaW5nIGFuIG9kZCAiRklQUyBjb21wbGlhbnQiIFB5dGhvbiBidWlsZCB0aGF0CisgICBleGNsdWRlcyBpdC4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdAppbmRleCAxNmM0ZmFjLi5jMWVhODczIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CkBAIC05OCw4ICs5OCw4IEBACiAKICAgIC4uIGF0dHJpYnV0ZTo6IHJmaWxlCiAKLSAgICAgIENvbnRhaW5zIGFuIGlucHV0IHN0cmVhbSwgcG9zaXRpb25lZCBhdCB0aGUgc3RhcnQgb2YgdGhlIG9wdGlvbmFsIGlucHV0Ci0gICAgICBkYXRhLgorICAgICAgQW4gOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGZyb20KKyAgICAgIHRoZSBzdGFydCBvZiB0aGUgb3B0aW9uYWwgaW5wdXQgZGF0YS4KIAogICAgLi4gYXR0cmlidXRlOjogd2ZpbGUKIApAQCAtMTA3LDYgKzEwNyw5IEBACiAgICAgICBjbGllbnQuIFByb3BlciBhZGhlcmVuY2UgdG8gdGhlIEhUVFAgcHJvdG9jb2wgbXVzdCBiZSB1c2VkIHdoZW4gd3JpdGluZyB0bwogICAgICAgdGhpcyBzdHJlYW0uCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBUaGlzIGlzIGFuIDpjbGFzczpgaW8uQnVmZmVyZWRJT0Jhc2VgIHN0cmVhbS4KKwogICAgOmNsYXNzOmBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyYCBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgogCiAgICAuLiBhdHRyaWJ1dGU6OiBzZXJ2ZXJfdmVyc2lvbgpAQCAtMzY5LDEwICszNzIsOSBAQAogCiAgICBIYW5kbGVyID0gaHR0cC5zZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCiAKLSAgIGh0dHBkID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoIiIsIFBPUlQpLCBIYW5kbGVyKQotCi0gICBwcmludCgic2VydmluZyBhdCBwb3J0IiwgUE9SVCkKLSAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKCgiIiwgUE9SVCksIEhhbmRsZXIpIGFzIGh0dHBkOgorICAgICAgIHByaW50KCJzZXJ2aW5nIGF0IHBvcnQiLCBQT1JUKQorICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAuLiBfaHR0cC1zZXJ2ZXItY2xpOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbWFwbGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CmluZGV4IGMyNWU3ZDguLmI5YjNiOTEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0CkBAIC01MDAsNiArNTAwLDE3IEBACiAgICAgICAgICBNLnN0b3JlKG51bSwgJytGTEFHUycsICdcXERlbGV0ZWQnKQogICAgICAgTS5leHB1bmdlKCkKIAorICAgLi4gbm90ZTo6CisKKyAgICAgIENyZWF0aW5nIGZsYWdzIGNvbnRhaW5pbmcgJ10nIChmb3IgZXhhbXBsZTogIlt0ZXN0XSIpIHZpb2xhdGVzCisgICAgICA6cmZjOmAzNTAxYCAodGhlIElNQVAgcHJvdG9jb2wpLiAgSG93ZXZlciwgaW1hcGxpYiBoYXMgaGlzdG9yaWNhbGx5CisgICAgICBhbGxvd2VkIGNyZWF0aW9uIG9mIHN1Y2ggdGFncywgYW5kIHBvcHVsYXIgSU1BUCBzZXJ2ZXJzLCBzdWNoIGFzIEdtYWlsLAorICAgICAgYWNjZXB0IGFuZCBwcm9kdWNlIHN1Y2ggZmxhZ3MuICBUaGVyZSBhcmUgbm9uLVB5dGhvbiBwcm9ncmFtcyB3aGljaCBhbHNvCisgICAgICBjcmVhdGUgc3VjaCB0YWdzLiAgQWx0aG91Z2ggaXQgaXMgYW4gUkZDIHZpb2xhdGlvbiBhbmQgSU1BUCBjbGllbnRzIGFuZAorICAgICAgc2VydmVycyBhcmUgc3VwcG9zZWQgdG8gYmUgc3RyaWN0LCBpbWFwbGliIG5vbmV0aGVsZXNzIGNvbnRpbnVlcyB0byBhbGxvdworICAgICAgc3VjaCB0YWdzIHRvIGJlIGNyZWF0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYW5kIGFzIG9mCisgICAgICBweXRob24gMy42LCBoYW5kbGVzIHRoZW0gaWYgdGhleSBhcmUgc2VudCBmcm9tIHRoZSBzZXJ2ZXIsIHNpbmNlIHRoaXMKKyAgICAgIGltcHJvdmVzIHJlYWwtd29ybGQgY29tcGF0aWJpbGl0eS4KIAogLi4gbWV0aG9kOjogSU1BUDQuc3Vic2NyaWJlKG1haWxib3gpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcC5yc3QgYi9Eb2MvbGlicmFyeS9pbXAucnN0CmluZGV4IDk4MjhiYTYuLmNjZjVmOTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wLnJzdApAQCAtODUsNyArODUsOSBAQAogICAgLi4gZGVwcmVjYXRlZDo6IDMuMwogICAgICAgVXNlIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWNgIGluc3RlYWQgdW5sZXNzIFB5dGhvbiAzLjMKICAgICAgIGNvbXBhdGliaWxpdHkgaXMgcmVxdWlyZWQsIGluIHdoaWNoIGNhc2UgdXNlCi0gICAgICA6ZnVuYzpgaW1wb3J0bGliLmZpbmRfbG9hZGVyYC4KKyAgICAgIDpmdW5jOmBpbXBvcnRsaWIuZmluZF9sb2FkZXJgLiBGb3IgZXhhbXBsZSB1c2FnZSBvZiB0aGUgZm9ybWVyIGNhc2UsCisgICAgICBzZWUgdGhlIDpyZWY6YGltcG9ydGxpYi1leGFtcGxlc2Agc2VjdGlvbiBvZiB0aGUgOm1vZDpgaW1wb3J0bGliYAorICAgICAgZG9jdW1lbnRhdGlvbi4KIAogCiAuLiBmdW5jdGlvbjo6IGxvYWRfbW9kdWxlKG5hbWUsIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKQEAgLTExMiw5ICsxMTQsMTIgQEAKICAgICAgIElmIHByZXZpb3VzbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIDpmdW5jOmBpbXAuZmluZF9tb2R1bGVgIHRoZW4KICAgICAgIGNvbnNpZGVyIHVzaW5nIDpmdW5jOmBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZWAsIG90aGVyd2lzZSB1c2UgdGhlIGxvYWRlcgogICAgICAgcmV0dXJuZWQgYnkgdGhlIHJlcGxhY2VtZW50IHlvdSBjaG9zZSBmb3IgOmZ1bmM6YGltcC5maW5kX21vZHVsZWAuIElmIHlvdQotICAgICAgY2FsbGVkIDpmdW5jOmBpbXAubG9hZF9tb2R1bGVgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkaXJlY3RseSB0aGVuIHVzZSB0aGUKLSAgICAgIGNsYXNzZXMgaW4gOm1vZDpgaW1wb3J0bGliLm1hY2hpbmVyeWAsIGUuZy4KLSAgICAgIGBgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyKG5hbWUsIHBhdGgpLmxvYWRfbW9kdWxlKClgYC4KKyAgICAgIGNhbGxlZCA6ZnVuYzpgaW1wLmxvYWRfbW9kdWxlYCBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgZGlyZWN0bHkgd2l0aCBmaWxlCisgICAgICBwYXRoIGFyZ3VtZW50cyB0aGVuIHVzZSBhIGNvbWJpbmF0aW9uIG9mCisgICAgICA6ZnVuYzpgaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb25gIGFuZAorICAgICAgOmZ1bmM6YGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWNgLiBTZWUgdGhlIDpyZWY6YGltcG9ydGxpYi1leGFtcGxlc2AKKyAgICAgIHNlY3Rpb24gb2YgdGhlIDptb2Q6YGltcG9ydGxpYmAgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBvZiB0aGUgdmFyaW91cworICAgICAgYXBwcm9hY2hlcy4KIAogCiAuLiBmdW5jdGlvbjo6IG5ld19tb2R1bGUobmFtZSkKQEAgLTEyMyw3ICsxMjgsNyBAQAogICAgaW4gYGBzeXMubW9kdWxlc2BgLgogCiAgICAuLiBkZXByZWNhdGVkOjogMy40Ci0gICAgICBVc2UgOmNsYXNzOmB0eXBlcy5Nb2R1bGVUeXBlYCBpbnN0ZWFkLgorICAgICAgVXNlIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjYCBpbnN0ZWFkLgogCiAKIC4uIGZ1bmN0aW9uOjogcmVsb2FkKG1vZHVsZSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CmluZGV4IGZmN2NjOTEuLmMxYzNiMTIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICBtb2R1bGUgYW5kICpwYXRoKiB3aWxsIGJlIHRoZSB2YWx1ZSBvZiA6YXR0cjpgX19wYXRoX19gIGZyb20gdGhlCiAgICAgICBwYXJlbnQgcGFja2FnZS4gSWYgYSBzcGVjIGNhbm5vdCBiZSBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuCiAgICAgICBXaGVuIHBhc3NlZCBpbiwgYGB0YXJnZXRgYCBpcyBhIG1vZHVsZSBvYmplY3QgdGhhdCB0aGUgZmluZGVyIG1heQotICAgICAgdXNlIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkIGFib3V0IHdoYXQgc3BlYyB0byByZXR1cm4uCisgICAgICB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQgZ3Vlc3MgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgICAgd2l0aGluIHRoZSA6dGVybTpgcGF0aCBlbnRyeWAgdG8gd2hpY2ggaXQgaXMgYXNzaWduZWQuICBJZiBhIHNwZWMKICAgICAgIGNhbm5vdCBiZSBmb3VuZCwgYGBOb25lYGAgaXMgcmV0dXJuZWQuICBXaGVuIHBhc3NlZCBpbiwgYGB0YXJnZXRgYAogICAgICAgaXMgYSBtb2R1bGUgb2JqZWN0IHRoYXQgdGhlIGZpbmRlciBtYXkgdXNlIHRvIG1ha2UgYSBtb3JlIGVkdWNhdGVkCi0gICAgICBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgorICAgICAgZ3Vlc3MgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KIAogICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKQEAgLTM3OSwxMCArMzc5LDE0IEBACiAKICAgICAgICBBbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBleGVjdXRlcyB0aGUgbW9kdWxlIGluIGl0cyBvd24gbmFtZXNwYWNlCiAgICAgICAgd2hlbiBhIG1vZHVsZSBpcyBpbXBvcnRlZCBvciByZWxvYWRlZC4gIFRoZSBtb2R1bGUgc2hvdWxkIGFscmVhZHkKLSAgICAgICBiZSBpbml0aWFsaXplZCB3aGVuIGV4ZWNfbW9kdWxlKCkgaXMgY2FsbGVkLgorICAgICAgIGJlIGluaXRpYWxpemVkIHdoZW4gYGBleGVjX21vZHVsZSgpYGAgaXMgY2FsbGVkLiBXaGVuIHRoaXMgbWV0aG9kIGV4aXN0cywKKyAgICAgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG11c3QgYmUgZGVmaW5lZC4KIAogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG11c3QgYWxzbyBiZSBkZWZpbmVkLgorCiAgICAgLi4gbWV0aG9kOjogbG9hZF9tb2R1bGUoZnVsbG5hbWUpCiAKICAgICAgICAgQSBsZWdhY3kgbWV0aG9kIGZvciBsb2FkaW5nIGEgbW9kdWxlLiBJZiB0aGUgbW9kdWxlIGNhbm5vdCBiZQpAQCAtOTM2LDYgKzk0MCwxMCBAQAogICAgICAgQ29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB3aGVyZQogICAgICAgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGxvYWQgaXMgb3B0aW9uYWwuCiAKKyAgICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjYKKworICAgICAgICAgVXNlIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgaW5zdGVhZC4KKwogCiAuLiBjbGFzczo6IFNvdXJjZWxlc3NGaWxlTG9hZGVyKGZ1bGxuYW1lLCBwYXRoKQogCkBAIC05NzUsNiArOTgzLDEwIEBACiAgICBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHdoZXJlCiAgICBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCBpcyBvcHRpb25hbC4KIAorICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorCisgICAgICBVc2UgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpbnN0ZWFkLgorCiAKIC4uIGNsYXNzOjogRXh0ZW5zaW9uRmlsZUxvYWRlcihmdWxsbmFtZSwgcGF0aCkKIApAQCAtMTE5MiwxMiArMTIwNCwxMyBAQAogCiAuLiBmdW5jdGlvbjo6IG1vZHVsZV9mcm9tX3NwZWMoc3BlYykKIAotICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBiYXNlZCBvbiAqKnNwZWMqKiBhbmQgYGBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlKClgYC4KKyAgIENyZWF0ZSBhIG5ldyBtb2R1bGUgYmFzZWQgb24gKipzcGVjKiogYW5kCisgICA6bWV0aDpgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSA8aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZT5gLgogCi0gICBJZiBgYHNwZWMubG9hZGVyLmNyZWF0ZV9tb2R1bGUoKWBgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgdGhlbiBhbnkKLSAgIHByZS1leGlzdGluZyBhdHRyaWJ1dGVzIHdpbGwgbm90IGJlIHJlc2V0LiBBbHNvLCBubyA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAKLSAgIHdpbGwgYmUgcmFpc2VkIGlmIHRyaWdnZXJlZCB3aGlsZSBhY2Nlc3NpbmcgKipzcGVjKiogb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUKLSAgIG9uIHRoZSBtb2R1bGUuCisgICBJZiA6bWV0aDpgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSA8aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZT5gCisgICBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIHRoZW4gYW55IHByZS1leGlzdGluZyBhdHRyaWJ1dGVzIHdpbGwgbm90IGJlIHJlc2V0LgorICAgQWxzbywgbm8gOmV4YzpgQXR0cmlidXRlRXJyb3JgIHdpbGwgYmUgcmFpc2VkIGlmIHRyaWdnZXJlZCB3aGlsZSBhY2Nlc3NpbmcKKyAgICoqc3BlYyoqIG9yIHNldHRpbmcgYW4gYXR0cmlidXRlIG9uIHRoZSBtb2R1bGUuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgOmNsYXNzOmB0eXBlcy5Nb2R1bGVUeXBlYCB0byBjcmVhdGUgYQogICAgbmV3IG1vZHVsZSBhcyAqKnNwZWMqKiBpcyB1c2VkIHRvIHNldCBhcyBtYW55IGltcG9ydC1jb250cm9sbGVkIGF0dHJpYnV0ZXMgb24KQEAgLTEyNTksNyArMTI3Miw4IEBACiAKIC4uIGRlY29yYXRvcjo6IHNldF9wYWNrYWdlCiAKLSAgIEEgOnRlcm06YGRlY29yYXRvcmAgZm9yIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgdG8gc2V0IHRoZSA6YXR0cjpgX19wYWNrYWdlX19gIGF0dHJpYnV0ZSBvbiB0aGUgcmV0dXJuZWQgbW9kdWxlLiBJZiA6YXR0cjpgX19wYWNrYWdlX19gCisgICBBIDp0ZXJtOmBkZWNvcmF0b3JgIGZvciA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHRvIHNldCB0aGUKKyAgIDphdHRyOmBfX3BhY2thZ2VfX2AgYXR0cmlidXRlIG9uIHRoZSByZXR1cm5lZCBtb2R1bGUuIElmIDphdHRyOmBfX3BhY2thZ2VfX2AKICAgIGlzIHNldCBhbmQgaGFzIGEgdmFsdWUgb3RoZXIgdGhhbiBgYE5vbmVgYCBpdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLgogCiAgICAuLiBkZXByZWNhdGVkOjogMy40CkBAIC0xMjkyLDEzICsxMzA2LDEyIEBACiAgICBUaGlzIGNsYXNzICoqb25seSoqIHdvcmtzIHdpdGggbG9hZGVycyB0aGF0IGRlZmluZQogICAgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5leGVjX21vZHVsZWAgYXMgY29udHJvbCBvdmVyIHdoYXQgbW9kdWxlIHR5cGUKICAgIGlzIHVzZWQgZm9yIHRoZSBtb2R1bGUgaXMgcmVxdWlyZWQuIEZvciB0aG9zZSBzYW1lIHJlYXNvbnMsIHRoZSBsb2FkZXIncwotICAgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkIChpLmUuLCB0aGUKLSAgIGxvYWRlcidzIG1ldGhvZCBzaG91bGQgb25seSByZXR1cm4gYGBOb25lYGA7IHRoaXMgZXhjbHVkZXMKLSAgIDpjbGFzczpgQnVpbHRpbkltcG9ydGVyYCBhbmQgOmNsYXNzOmBFeHRlbnNpb25GaWxlTG9hZGVyYCkuIEZpbmFsbHksCi0gICBtb2R1bGVzIHdoaWNoIHN1YnN0aXR1dGUgdGhlIG9iamVjdCBwbGFjZWQgaW50byA6YXR0cjpgc3lzLm1vZHVsZXNgIHdpbGwKLSAgIG5vdCB3b3JrIGFzIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZXBsYWNlIHRoZSBtb2R1bGUgcmVmZXJlbmNlcwotICAgdGhyb3VnaG91dCB0aGUgaW50ZXJwcmV0ZXIgc2FmZWx5OyA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgc3VjaCBhCi0gICBzdWJzdGl0dXRpb24gaXMgZGV0ZWN0ZWQuCisgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG1ldGhvZCBtdXN0IHJldHVybiBgYE5vbmVgYCBvciBhCisgICB0eXBlIGZvciB3aGljaCBpdHMgYGBfX2NsYXNzX19gYCBhdHRyaWJ1dGUgY2FuIGJlIG11dGF0ZWQgYWxvbmcgd2l0aCBub3QKKyAgIHVzaW5nIDp0ZXJtOmBzbG90cyA8X19zbG90c19fPmAuIEZpbmFsbHksIG1vZHVsZXMgd2hpY2ggc3Vic3RpdHV0ZSB0aGUgb2JqZWN0CisgICBwbGFjZWQgaW50byA6YXR0cjpgc3lzLm1vZHVsZXNgIHdpbGwgbm90IHdvcmsgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5CisgICByZXBsYWNlIHRoZSBtb2R1bGUgcmVmZXJlbmNlcyB0aHJvdWdob3V0IHRoZSBpbnRlcnByZXRlciBzYWZlbHk7CisgICA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgc3VjaCBhIHN1YnN0aXR1dGlvbiBpcyBkZXRlY3RlZC4KIAogICAgLi4gbm90ZTo6CiAgICAgICBGb3IgcHJvamVjdHMgd2hlcmUgc3RhcnR1cCB0aW1lIGlzIGNyaXRpY2FsLCB0aGlzIGNsYXNzIGFsbG93cyBmb3IKQEAgLTEzMDksNiArMTMyMiwxMSBAQAogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEJlZ2FuIGNhbGxpbmcgOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCwgcmVtb3ZpbmcgdGhlCisgICAgICBjb21wYXRpYmlsaXR5IHdhcm5pbmcgZm9yIDpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5CdWlsdGluSW1wb3J0ZXJgIGFuZAorICAgICAgOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkV4dGVuc2lvbkZpbGVMb2FkZXJgLgorCiAgICAuLiBjbGFzc21ldGhvZDo6IGZhY3RvcnkobG9hZGVyKQogCiAgICAgICBBIHN0YXRpYyBtZXRob2Qgd2hpY2ggcmV0dXJucyBhIGNhbGxhYmxlIHRoYXQgY3JlYXRlcyBhIGxhenkgbG9hZGVyLiBUaGlzCkBAIC0xMzIwLDMgKzEzMzgsMTIwIEBACiAgICAgICAgIGxvYWRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlRmlsZUxvYWRlcgogICAgICAgICBsYXp5X2xvYWRlciA9IGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXIuZmFjdG9yeShsb2FkZXIpCiAgICAgICAgIGZpbmRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuRmlsZUZpbmRlcihwYXRoLCAobGF6eV9sb2FkZXIsIHN1ZmZpeGVzKSkKKworLi4gX2ltcG9ydGxpYi1leGFtcGxlczoKKworRXhhbXBsZXMKKy0tLS0tLS0tCisKK1RvIHByb2dyYW1tYXRpY2FsbHkgaW1wb3J0IGEgbW9kdWxlLCB1c2UgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYC4KKzo6CisKKyAgaW1wb3J0IGltcG9ydGxpYgorCisgIGl0ZXJ0b29scyA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdpdGVydG9vbHMnKQorCitJZiB5b3UgbmVlZCB0byBmaW5kIG91dCBpZiBhIG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgd2l0aG91dCBhY3R1YWxseSBkb2luZyB0aGUKK2ltcG9ydCwgdGhlbiB5b3Ugc2hvdWxkIHVzZSA6ZnVuYzpgaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjYC4KKzo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi51dGlsCisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMuCisgIG5hbWUgPSAnaXRlcnRvb2xzJworCisgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgaWYgc3BlYyBpcyBOb25lOgorICAgICAgcHJpbnQoImNhbid0IGZpbmQgdGhlIGl0ZXJ0b29scyBtb2R1bGUiKQorICBlbHNlOgorICAgICAgIyBJZiB5b3UgY2hvc2UgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGltcG9ydCAuLi4KKyAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWMoc3BlYykKKyAgICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgICAgICMgQWRkaW5nIHRoZSBtb2R1bGUgdG8gc3lzLm1vZHVsZXMgaXMgb3B0aW9uYWwuCisgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG1vZHVsZQorCitUbyBpbXBvcnQgYSBQeXRob24gc291cmNlIGZpbGUgZGlyZWN0bHksIHVzZSB0aGUgZm9sbG93aW5nIHJlY2lwZQorKFB5dGhvbiAzLjQgYW5kIG5ld2VyIG9ubHkpOjoKKworICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKKyAgaW1wb3J0IHN5cworCisgICMgRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgaW1wb3J0IHRva2VuaXplCisgIGZpbGVfcGF0aCA9IHRva2VuaXplLl9fZmlsZV9fCisgIG1vZHVsZV9uYW1lID0gdG9rZW5pemUuX19uYW1lX18KKworICBzcGVjID0gaW1wb3J0bGliLnV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24obW9kdWxlX25hbWUsIGZpbGVfcGF0aCkKKyAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQorICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCisgICMgT3B0aW9uYWw7IG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gaW1wb3J0IHRoZSBtb2R1bGUKKyAgIyBieSBuYW1lIGxhdGVyLgorICBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0gPSBtb2R1bGUKKworRm9yIGRlZXAgY3VzdG9taXphdGlvbnMgb2YgaW1wb3J0LCB5b3UgdHlwaWNhbGx5IHdhbnQgdG8gaW1wbGVtZW50IGFuCis6dGVybTpgaW1wb3J0ZXJgLiBUaGlzIG1lYW5zIG1hbmFnaW5nIGJvdGggdGhlIDp0ZXJtOmBmaW5kZXJgIGFuZCA6dGVybTpgbG9hZGVyYAorc2lkZSBvZiB0aGluZ3MuIEZvciBmaW5kZXJzIHRoZXJlIGFyZSB0d28gZmxhdm91cnMgdG8gY2hvb3NlIGZyb20gZGVwZW5kaW5nIG9uCit5b3VyIG5lZWRzOiBhIDp0ZXJtOmBtZXRhIHBhdGggZmluZGVyYCBvciBhIDp0ZXJtOmBwYXRoIGVudHJ5IGZpbmRlcmAuIFRoZQorZm9ybWVyIGlzIHdoYXQgeW91IHdvdWxkIHB1dCBvbiA6YXR0cjpgc3lzLm1ldGFfcGF0aGAgd2hpbGUgdGhlIGxhdHRlciBpcyB3aGF0Cit5b3UgY3JlYXRlIHVzaW5nIGEgOnRlcm06YHBhdGggZW50cnkgaG9va2Agb24gOmF0dHI6YHN5cy5wYXRoX2hvb2tzYCB3aGljaCB3b3Jrcword2l0aCA6YXR0cjpgc3lzLnBhdGhgIGVudHJpZXMgdG8gcG90ZW50aWFsbHkgY3JlYXRlIGEgZmluZGVyLiBUaGlzIGV4YW1wbGUgd2lsbAorc2hvdyB5b3UgaG93IHRvIHJlZ2lzdGVyIHlvdXIgb3duIGltcG9ydGVycyBzbyB0aGF0IGltcG9ydCB3aWxsIHVzZSB0aGVtIChmb3IKK2NyZWF0aW5nIGFuIGltcG9ydGVyIGZvciB5b3Vyc2VsZiwgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGFwcHJvcHJpYXRlCitjbGFzc2VzIGRlZmluZWQgd2l0aGluIHRoaXMgcGFja2FnZSk6OgorCisgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CisgIGltcG9ydCBzeXMKKworICAjIEZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seS4KKyAgU3BhbU1ldGFQYXRoRmluZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5QYXRoRmluZGVyCisgIFNwYW1QYXRoRW50cnlGaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LkZpbGVGaW5kZXIKKyAgbG9hZGVyX2RldGFpbHMgPSAoaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICBpbXBvcnRsaWIubWFjaGluZXJ5LlNPVVJDRV9TVUZGSVhFUykKKworICAjIFNldHRpbmcgdXAgYSBtZXRhIHBhdGggZmluZGVyLgorICAjIE1ha2Ugc3VyZSB0byBwdXQgdGhlIGZpbmRlciBpbiB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIHRoZSBsaXN0IGluIHRlcm1zIG9mCisgICMgcHJpb3JpdHkuCisgIHN5cy5tZXRhX3BhdGguYXBwZW5kKFNwYW1NZXRhUGF0aEZpbmRlcikKKworICAjIFNldHRpbmcgdXAgYSBwYXRoIGVudHJ5IGZpbmRlci4KKyAgIyBNYWtlIHN1cmUgdG8gcHV0IHRoZSBwYXRoIGhvb2sgaW4gdGhlIHByb3BlciBsb2NhdGlvbiBpbiB0aGUgbGlzdCBpbiB0ZXJtcworICAjIG9mIHByaW9yaXR5LgorICBzeXMucGF0aF9ob29rcy5hcHBlbmQoU3BhbVBhdGhFbnRyeUZpbmRlci5wYXRoX2hvb2sobG9hZGVyX2RldGFpbHMpKQorCitJbXBvcnQgaXRzZWxmIGlzIGltcGxlbWVudGVkIGluIFB5dGhvbiBjb2RlLCBtYWtpbmcgaXQgcG9zc2libGUgdG8KK2V4cG9zZSBtb3N0IG9mIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHRocm91Z2ggaW1wb3J0bGliLiBUaGUgZm9sbG93aW5nCitoZWxwcyBpbGx1c3RyYXRlIHRoZSB2YXJpb3VzIEFQSXMgdGhhdCBpbXBvcnRsaWIgZXhwb3NlcyBieSBwcm92aWRpbmcgYW4KK2FwcHJveGltYXRlIGltcGxlbWVudGF0aW9uIG9mCis6ZnVuYzpgaW1wb3J0bGliLmltcG9ydF9tb2R1bGVgIChQeXRob24gMy40IGFuZCBuZXdlciBmb3IgdGhlIGltcG9ydGxpYiB1c2FnZSwKK1B5dGhvbiAzLjYgYW5kIG5ld2VyIGZvciBvdGhlciBwYXJ0cyBvZiB0aGUgY29kZSkuCis6OgorCisgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICBpbXBvcnQgc3lzCisKKyAgZGVmIGltcG9ydF9tb2R1bGUobmFtZSwgcGFja2FnZT1Ob25lKToKKyAgICAgICIiIkFuIGFwcHJveGltYXRlIGltcGxlbWVudGF0aW9uIG9mIGltcG9ydC4iIiIKKyAgICAgIGFic29sdXRlX25hbWUgPSBpbXBvcnRsaWIudXRpbC5yZXNvbHZlX25hbWUobmFtZSwgcGFja2FnZSkKKyAgICAgIHRyeToKKyAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbYWJzb2x1dGVfbmFtZV0KKyAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICBwYXNzCisKKyAgICAgIHBhdGggPSBOb25lCisgICAgICBpZiAnLicgaW4gYWJzb2x1dGVfbmFtZToKKyAgICAgICAgICBwYXJlbnRfbmFtZSwgXywgY2hpbGRfbmFtZSA9IGFic29sdXRlX25hbWUucnBhcnRpdGlvbignLicpCisgICAgICAgICAgcGFyZW50X21vZHVsZSA9IGltcG9ydF9tb2R1bGUocGFyZW50X25hbWUpCisgICAgICAgICAgcGF0aCA9IHBhcmVudF9tb2R1bGUuc3BlYy5zdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucworICAgICAgZm9yIGZpbmRlciBpbiBzeXMubWV0YV9wYXRoOgorICAgICAgICAgIHNwZWMgPSBmaW5kZXIuZmluZF9zcGVjKGFic29sdXRlX25hbWUsIHBhdGgpCisgICAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgYnJlYWsKKyAgICAgIGVsc2U6CisgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoZidObyBtb2R1bGUgbmFtZWQge2Fic29sdXRlX25hbWUhcn0nKQorICAgICAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQorICAgICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQorICAgICAgc3lzLm1vZHVsZXNbYWJzb2x1dGVfbmFtZV0gPSBtb2R1bGUKKyAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgc2V0YXR0cihwYXJlbnRfbW9kdWxlLCBjaGlsZF9uYW1lLCBtb2R1bGUpCisgICAgICByZXR1cm4gbW9kdWxlCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pbnNwZWN0LnJzdCBiL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CmluZGV4IDhlN2VkMTkuLjVjYjdjMjIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0CkBAIC0yMzUsMjQgKzIzNSw2IEBACiAgICAgICBsaXN0ZWQgaW4gdGhlIG1ldGFjbGFzcycgY3VzdG9tIDptZXRoOmBfX2Rpcl9fYC4KIAogCi0uLiBmdW5jdGlvbjo6IGdldG1vZHVsZWluZm8ocGF0aCkKLQotICAgUmV0dXJucyBhIDp0ZXJtOmBuYW1lZCB0dXBsZWAgYGBNb2R1bGVJbmZvKG5hbWUsIHN1ZmZpeCwgbW9kZSwgbW9kdWxlX3R5cGUpYGAKLSAgIG9mIHZhbHVlcyB0aGF0IGRlc2NyaWJlIGhvdyBQeXRob24gd2lsbCBpbnRlcnByZXQgdGhlIGZpbGUgaWRlbnRpZmllZCBieQotICAgKnBhdGgqIGlmIGl0IGlzIGEgbW9kdWxlLCBvciBgYE5vbmVgYCBpZiBpdCB3b3VsZCBub3QgYmUgaWRlbnRpZmllZCBhcyBhCi0gICBtb2R1bGUuICBJbiB0aGF0IHR1cGxlLCAqbmFtZSogaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB3aXRob3V0IHRoZSBuYW1lIG9mCi0gICBhbnkgZW5jbG9zaW5nIHBhY2thZ2UsICpzdWZmaXgqIGlzIHRoZSB0cmFpbGluZyBwYXJ0IG9mIHRoZSBmaWxlIG5hbWUgKHdoaWNoCi0gICBtYXkgbm90IGJlIGEgZG90LWRlbGltaXRlZCBleHRlbnNpb24pLCAqbW9kZSogaXMgdGhlIDpmdW5jOmBvcGVuYCBtb2RlIHRoYXQKLSAgIHdvdWxkIGJlIHVzZWQgKGBgJ3InYGAgb3IgYGAncmInYGApLCBhbmQgKm1vZHVsZV90eXBlKiBpcyBhbiBpbnRlZ2VyIGdpdmluZwotICAgdGhlIHR5cGUgb2YgdGhlIG1vZHVsZS4gICptb2R1bGVfdHlwZSogd2lsbCBoYXZlIGEgdmFsdWUgd2hpY2ggY2FuIGJlCi0gICBjb21wYXJlZCB0byB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhlIDptb2Q6YGltcGAgbW9kdWxlOyBzZWUgdGhlCi0gICBkb2N1bWVudGF0aW9uIGZvciB0aGF0IG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBtb2R1bGUgdHlwZXMuCi0KLSAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjMKLSAgICAgIFlvdSBtYXkgY2hlY2sgdGhlIGZpbGUgcGF0aCdzIHN1ZmZpeCBhZ2FpbnN0IHRoZSBzdXBwb3J0ZWQgc3VmZml4ZXMKLSAgICAgIGxpc3RlZCBpbiA6bW9kOmBpbXBvcnRsaWIubWFjaGluZXJ5YCB0byBpbmZlciB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KLQotCiAuLiBmdW5jdGlvbjo6IGdldG1vZHVsZW5hbWUocGF0aCkKIAogICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgbmFtZWQgYnkgdGhlIGZpbGUgKnBhdGgqLCB3aXRob3V0IGluY2x1ZGluZyB0aGUKQEAgLTI2Niw4ICsyNDgsNyBAQAogICAgc3RpbGwgcmV0dXJuIGBgTm9uZWBgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwotICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3cgYmFzZWQgZGlyZWN0bHkgb24gOm1vZDpgaW1wb3J0bGliYCByYXRoZXIgdGhhbiB0aGUKLSAgICAgIGRlcHJlY2F0ZWQgOmZ1bmM6YGdldG1vZHVsZWluZm9gLgorICAgICAgVGhlIGZ1bmN0aW9uIGlzIGJhc2VkIGRpcmVjdGx5IG9uIDptb2Q6YGltcG9ydGxpYmAuCiAKIAogLi4gZnVuY3Rpb246OiBpc21vZHVsZShvYmplY3QpCkBAIC02NDYsNiArNjI3LDE2IEBACiAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGFzIGEgc3RyaW5nLiAgVGhlIG5hbWUgbXVzdCBiZSBhIHZhbGlkCiAgICAgICBQeXRob24gaWRlbnRpZmllci4KIAorICAgICAgLi4gaW1wbC1kZXRhaWw6OgorCisgICAgICAgICBDUHl0aG9uIGdlbmVyYXRlcyBpbXBsaWNpdCBwYXJhbWV0ZXIgbmFtZXMgb2YgdGhlIGZvcm0gYGAuMGBgIG9uIHRoZQorICAgICAgICAgY29kZSBvYmplY3RzIHVzZWQgdG8gaW1wbGVtZW50IGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IKKyAgICAgICAgIGV4cHJlc3Npb25zLgorCisgICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgICAgVGhlc2UgcGFyYW1ldGVyIG5hbWVzIGFyZSBleHBvc2VkIGJ5IHRoaXMgbW9kdWxlIGFzIG5hbWVzIGxpa2UKKyAgICAgICAgICAgIGBgaW1wbGljaXQwYGAuCisKICAgIC4uIGF0dHJpYnV0ZTo6IFBhcmFtZXRlci5kZWZhdWx0CiAKICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyLiAgSWYgdGhlIHBhcmFtZXRlciBoYXMgbm8gZGVmYXVsdApAQCAtODU0LDggKzg0NSw2IEBACiAgICBmcm9tIGt3b25seWFyZ3MgdG8gZGVmYXVsdHMuICAqYW5ub3RhdGlvbnMqIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50CiAgICBuYW1lcyB0byBhbm5vdGF0aW9ucy4KIAotICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gOmZ1bmM6YGdldGFyZ3NwZWNgLgotCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBub3cgYmFzZWQgb24gOmZ1bmM6YHNpZ25hdHVyZWAsIGJ1dCBzdGlsbCBpZ25vcmVzCiAgICAgICBgYF9fd3JhcHBlZF9fYGAgYXR0cmlidXRlcyBhbmQgaW5jbHVkZXMgdGhlIGFscmVhZHkgYm91bmQgZmlyc3QKQEAgLTg4NCw3ICs4NzMsNyBAQAogLi4gZnVuY3Rpb246OiBmb3JtYXRhcmdzcGVjKGFyZ3NbLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGt3b25seWFyZ3MsIGt3b25seWRlZmF1bHRzLCBhbm5vdGF0aW9uc1ssIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBmb3JtYXRyZXR1cm5zLCBmb3JtYXRhbm5vdGF0aW9uc11dKQogCiAgICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgIDpmdW5jOmBnZXRhcmdzcGVjYCBvciA6ZnVuYzpgZ2V0ZnVsbGFyZ3NwZWNgLgorICAgOmZ1bmM6YGdldGZ1bGxhcmdzcGVjYC4KIAogICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGBgYXJnc2BgLCBgYHZhcmFyZ3NgYCwgYGB2YXJrd2BgLAogICAgYGBkZWZhdWx0c2BgLCBgYGt3b25seWFyZ3NgYCwgYGBrd29ubHlkZWZhdWx0c2BgLCBgYGFubm90YXRpb25zYGApLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdCBiL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QKaW5kZXggZGZjMWRkYy4uYjBkMGE4YyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0CkBAIC01OTEsNyArNTkxLDEzIEBACiAKIC4uIGZ1bmN0aW9uOjogdGVlKGl0ZXJhYmxlLCBuPTIpCiAKLSAgIFJldHVybiAqbiogaW5kZXBlbmRlbnQgaXRlcmF0b3JzIGZyb20gYSBzaW5nbGUgaXRlcmFibGUuICBSb3VnaGx5IGVxdWl2YWxlbnQgdG86OgorICAgUmV0dXJuICpuKiBpbmRlcGVuZGVudCBpdGVyYXRvcnMgZnJvbSBhIHNpbmdsZSBpdGVyYWJsZS4KKworICAgVGhlIGZvbGxvd2luZyBQeXRob24gY29kZSBoZWxwcyBleHBsYWluIHdoYXQgKnRlZSogZG9lcyAoYWx0aG91Z2ggdGhlIGFjdHVhbAorICAgaW1wbGVtZW50YXRpb24gaXMgbW9yZSBjb21wbGV4IGFuZCB1c2VzIG9ubHkgYSBzaW5nbGUgdW5kZXJseWluZworICAgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSkuCisKKyAgIFJvdWdobHkgZXF1aXZhbGVudCB0bzo6CiAKICAgICAgICAgZGVmIHRlZShpdGVyYWJsZSwgbj0yKToKICAgICAgICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2pzb24ucnN0IGIvRG9jL2xpYnJhcnkvanNvbi5yc3QKaW5kZXggZWU1ODI2Ni4uNzM4MjRmOCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvanNvbi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvanNvbi5yc3QKQEAgLTEyNiw3ICsxMjYsNyBAQAogQmFzaWMgVXNhZ2UKIC0tLS0tLS0tLS0tCiAKLS4uIGZ1bmN0aW9uOjogZHVtcChvYmosIGZwLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKKy4uIGZ1bmN0aW9uOjogZHVtcChvYmosIGZwLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKICAgICAgICAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIFwKICAgICAgICAgICAgICAgICAgICBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBkZWZhdWx0PU5vbmUsIFwKICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9RmFsc2UsICoqa3cpCkBAIC0xODcsOCArMTg3LDExIEBACiAgICA6bWV0aDpgZGVmYXVsdGAgbWV0aG9kIHRvIHNlcmlhbGl6ZSBhZGRpdGlvbmFsIHR5cGVzKSwgc3BlY2lmeSBpdCB3aXRoIHRoZQogICAgKmNscyoga3dhcmc7IG90aGVyd2lzZSA6Y2xhc3M6YEpTT05FbmNvZGVyYCBpcyB1c2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KIAotLi4gZnVuY3Rpb246OiBkdW1wcyhvYmosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAorCisuLiBmdW5jdGlvbjo6IGR1bXBzKG9iaiwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBcCiAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBkZWZhdWx0PU5vbmUsIFwKICAgICAgICAgICAgICAgICAgICAgc29ydF9rZXlzPUZhbHNlLCAqKmt3KQpAQCAtMjEyLDcgKzIxNSw3IEBACiAgICAgICB0aGUgb3JpZ2luYWwgb25lLiBUaGF0IGlzLCBgYGxvYWRzKGR1bXBzKHgpKSAhPSB4YGAgaWYgeCBoYXMgbm9uLXN0cmluZwogICAgICAga2V5cy4KIAotLi4gZnVuY3Rpb246OiBsb2FkKGZwLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpCisuLiBmdW5jdGlvbjo6IGxvYWQoZnAsICosIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdykKIAogICAgRGVzZXJpYWxpemUgKmZwKiAoYSBgYC5yZWFkKClgYC1zdXBwb3J0aW5nIDp0ZXJtOmBmaWxlLWxpa2Ugb2JqZWN0YAogICAgY29udGFpbmluZyBhIEpTT04gZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdCB1c2luZyB0aGlzIDpyZWY6YGNvbnZlcnNpb24KQEAgLTI2MCw3ICsyNjMsMTAgQEAKICAgIElmIHRoZSBkYXRhIGJlaW5nIGRlc2VyaWFsaXplZCBpcyBub3QgYSB2YWxpZCBKU09OIGRvY3VtZW50LCBhCiAgICA6ZXhjOmBKU09ORGVjb2RlRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgogCi0uLiBmdW5jdGlvbjo6IGxvYWRzKHMsIGVuY29kaW5nPU5vbmUsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdykKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seSA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgorCisuLiBmdW5jdGlvbjo6IGxvYWRzKHMsICosIGVuY29kaW5nPU5vbmUsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdykKIAogICAgRGVzZXJpYWxpemUgKnMqIChhIDpjbGFzczpgc3RyYCBpbnN0YW5jZSBjb250YWluaW5nIGEgSlNPTiBkb2N1bWVudCkgdG8gYQogICAgUHl0aG9uIG9iamVjdCB1c2luZyB0aGlzIDpyZWY6YGNvbnZlcnNpb24gdGFibGUgPGpzb24tdG8tcHktdGFibGU+YC4KQEAgLTI3NCw3ICsyODAsNyBAQAogRW5jb2RlcnMgYW5kIERlY29kZXJzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLi4gY2xhc3M6OiBKU09ORGVjb2RlcihvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgc3RyaWN0PVRydWUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUpCisuLiBjbGFzczo6IEpTT05EZWNvZGVyKCosIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBzdHJpY3Q9VHJ1ZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSkKIAogICAgU2ltcGxlIEpTT04gZGVjb2Rlci4KIApAQCAtMzQ0LDYgKzM1MCw5IEBACiAgICBJZiB0aGUgZGF0YSBiZWluZyBkZXNlcmlhbGl6ZWQgaXMgbm90IGEgdmFsaWQgSlNPTiBkb2N1bWVudCwgYQogICAgOmV4YzpgSlNPTkRlY29kZUVycm9yYCB3aWxsIGJlIHJhaXNlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFsbCBwYXJhbWV0ZXJzIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5IDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCisKICAgIC4uIG1ldGhvZDo6IGRlY29kZShzKQogCiAgICAgICBSZXR1cm4gdGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiAqcyogKGEgOmNsYXNzOmBzdHJgIGluc3RhbmNlCkBAIC0zNjIsNyArMzcxLDcgQEAKICAgICAgIGV4dHJhbmVvdXMgZGF0YSBhdCB0aGUgZW5kLgogCiAKLS4uIGNsYXNzOjogSlNPTkVuY29kZXIoc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBkZWZhdWx0PU5vbmUpCisuLiBjbGFzczo6IEpTT05FbmNvZGVyKCosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIHNvcnRfa2V5cz1GYWxzZSwgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lKQogCiAgICBFeHRlbnNpYmxlIEpTT04gZW5jb2RlciBmb3IgUHl0aG9uIGRhdGEgc3RydWN0dXJlcy4KIApAQCAtNDQyLDYgKzQ1MSw5IEBACiAgICB0aGUgb2JqZWN0IG9yIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYC4gIElmIG5vdCBzcGVjaWZpZWQsIDpleGM6YFR5cGVFcnJvcmAKICAgIGlzIHJhaXNlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFsbCBwYXJhbWV0ZXJzIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5IDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCisKIAogICAgLi4gbWV0aG9kOjogZGVmYXVsdChvKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9sb2dnaW5nLmhhbmRsZXJzLnJzdCBiL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CmluZGV4IDg1NWFkYWIuLjRlYWVhMDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0CkBAIC0xNjEsMTEgKzE2MSwxOSBAQAogICAgZmlyc3QgY2FsbCB0byA6bWV0aDpgZW1pdGAuICBCeSBkZWZhdWx0LCB0aGUgZmlsZSBncm93cyBpbmRlZmluaXRlbHkuCiAKIAorICAgLi4gbWV0aG9kOjogcmVvcGVuSWZOZWVkZWQoKQorCisgICAgICBDaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIGhhcyBjaGFuZ2VkLiAgSWYgaXQgaGFzLCB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlzCisgICAgICBmbHVzaGVkIGFuZCBjbG9zZWQgYW5kIHRoZSBmaWxlIG9wZW5lZCBhZ2FpbiwgdHlwaWNhbGx5IGFzIGEgcHJlY3Vyc29yIHRvCisgICAgICBvdXRwdXR0aW5nIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKICAgIC4uIG1ldGhvZDo6IGVtaXQocmVjb3JkKQogCi0gICAgICBPdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGJ1dCBmaXJzdCBjaGVja3MgdG8gc2VlIGlmIHRoZSBmaWxlIGhhcwotICAgICAgY2hhbmdlZC4gIElmIGl0IGhhcywgdGhlIGV4aXN0aW5nIHN0cmVhbSBpcyBmbHVzaGVkIGFuZCBjbG9zZWQgYW5kIHRoZQotICAgICAgZmlsZSBvcGVuZWQgYWdhaW4sIGJlZm9yZSBvdXRwdXR0aW5nIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUuCisgICAgICBPdXRwdXRzIHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGJ1dCBmaXJzdCBjYWxscyA6bWV0aDpgcmVvcGVuSWZOZWVkZWRgIHRvCisgICAgICByZW9wZW4gdGhlIGZpbGUgaWYgaXQgaGFzIGNoYW5nZWQuCiAKIC4uIF9iYXNlLXJvdGF0aW5nLWhhbmRsZXI6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L21tYXAucnN0IGIvRG9jL2xpYnJhcnkvbW1hcC5yc3QKaW5kZXggOGY1MzgzMy4uYzU0NGM4MCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbW1hcC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbW1hcC5yc3QKQEAgLTI2NCwxMyArMjY0LDE4IEBACiAgICAuLiBtZXRob2Q6OiB3cml0ZShieXRlcykKIAogICAgICAgV3JpdGUgdGhlIGJ5dGVzIGluICpieXRlcyogaW50byBtZW1vcnkgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICBmaWxlIHBvaW50ZXI7IHRoZSBmaWxlIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYWZ0ZXIgdGhlIGJ5dGVzIHRoYXQKLSAgICAgIHdlcmUgd3JpdHRlbi4gSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aCA6Y29uc3Q6YEFDQ0VTU19SRUFEYCwgdGhlbgorICAgICAgZmlsZSBwb2ludGVyIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIChuZXZlciBsZXNzIHRoYW4KKyAgICAgIGBgbGVuKGJ5dGVzKWBgLCBzaW5jZSBpZiB0aGUgd3JpdGUgZmFpbHMsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZQorICAgICAgcmFpc2VkKS4gIFRoZSBmaWxlIHBvc2l0aW9uIGlzIHVwZGF0ZWQgdG8gcG9pbnQgYWZ0ZXIgdGhlIGJ5dGVzIHRoYXQKKyAgICAgIHdlcmUgd3JpdHRlbi4gIElmIHRoZSBtbWFwIHdhcyBjcmVhdGVkIHdpdGggOmNvbnN0OmBBQ0NFU1NfUkVBRGAsIHRoZW4KICAgICAgIHdyaXRpbmcgdG8gaXQgd2lsbCByYWlzZSBhIDpleGM6YFR5cGVFcnJvcmAgZXhjZXB0aW9uLgogCiAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgICAgV3JpdGFibGUgOnRlcm06YGJ5dGVzLWxpa2Ugb2JqZWN0YCBpcyBub3cgYWNjZXB0ZWQuCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gaXMgbm93IHJldHVybmVkLgorCiAKICAgIC4uIG1ldGhvZDo6IHdyaXRlX2J5dGUoYnl0ZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdCBiL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKaW5kZXggZDIwMDk4Zi4uZjg4NmVjYiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CkBAIC02NDcsOCArNjQ3LDkgQEAKIEZvciBwYXNzaW5nIG1lc3NhZ2VzIG9uZSBjYW4gdXNlIDpmdW5jOmBQaXBlYCAoZm9yIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHR3bwogcHJvY2Vzc2VzKSBvciBhIHF1ZXVlICh3aGljaCBhbGxvd3MgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMpLgogCi1UaGUgOmNsYXNzOmBRdWV1ZWAsIDpjbGFzczpgU2ltcGxlUXVldWVgIGFuZCA6Y2xhc3M6YEpvaW5hYmxlUXVldWVgIHR5cGVzIGFyZSBtdWx0aS1wcm9kdWNlciwKLW11bHRpLWNvbnN1bWVyIEZJRk8gcXVldWVzIG1vZGVsbGVkIG9uIHRoZSA6Y2xhc3M6YHF1ZXVlLlF1ZXVlYCBjbGFzcyBpbiB0aGUKK1RoZSA6Y2xhc3M6YFF1ZXVlYCwgOmNsYXNzOmBTaW1wbGVRdWV1ZWAgYW5kIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAgdHlwZXMKK2FyZSBtdWx0aS1wcm9kdWNlciwgbXVsdGktY29uc3VtZXIgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYAorcXVldWVzIG1vZGVsbGVkIG9uIHRoZSA6Y2xhc3M6YHF1ZXVlLlF1ZXVlYCBjbGFzcyBpbiB0aGUKIHN0YW5kYXJkIGxpYnJhcnkuICBUaGV5IGRpZmZlciBpbiB0aGF0IDpjbGFzczpgUXVldWVgIGxhY2tzIHRoZQogOm1ldGg6YH5xdWV1ZS5RdWV1ZS50YXNrX2RvbmVgIGFuZCA6bWV0aDpgfnF1ZXVlLlF1ZXVlLmpvaW5gIG1ldGhvZHMgaW50cm9kdWNlZAogaW50byBQeXRob24gMi41J3MgOmNsYXNzOmBxdWV1ZS5RdWV1ZWAgY2xhc3MuCkBAIC04ODYsOCArODg3LDEzIEBACiAKIC4uIGZ1bmN0aW9uOjogY3B1X2NvdW50KCkKIAotICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtLiAgTWF5IHJhaXNlCi0gICA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYC4KKyAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4KKworICAgVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCisgICB1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICBgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAorCisgICBNYXkgcmFpc2UgOmV4YzpgTm90SW1wbGVtZW50ZWRFcnJvcmAuCiAKICAgIC4uIHNlZWFsc286OgogICAgICAgOmZ1bmM6YG9zLmNwdV9jb3VudGAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L29zLnJzdCBiL0RvYy9saWJyYXJ5L29zLnJzdAppbmRleCBlNzNkOGVlLi5lYWU3MjQ5IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9vcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvb3MucnN0CkBAIC0xNzEsMjMgKzE3MSw2MCBAQAogCiAuLiBmdW5jdGlvbjo6IGZzZW5jb2RlKGZpbGVuYW1lKQogCi0gICBFbmNvZGUgKmZpbGVuYW1lKiB0byB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyB3aXRoIGBgJ3N1cnJvZ2F0ZWVzY2FwZSdgYAotICAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgIG9uIFdpbmRvd3M7IHJldHVybiA6Y2xhc3M6YGJ5dGVzYCB1bmNoYW5nZWQuCisgICBFbmNvZGUgOnRlcm06YHBhdGgtbGlrZSA8cGF0aC1saWtlIG9iamVjdD5gICpmaWxlbmFtZSogdG8gdGhlIGZpbGVzeXN0ZW0KKyAgIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYCBvbgorICAgV2luZG93czsgcmV0dXJuIDpjbGFzczpgYnl0ZXNgIHVuY2hhbmdlZC4KIAogICAgOmZ1bmM6YGZzZGVjb2RlYCBpcyB0aGUgcmV2ZXJzZSBmdW5jdGlvbi4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGFkZGVkIHRvIGFjY2VwdCBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAKKyAgICAgIGludGVyZmFjZS4KKwogCiAuLiBmdW5jdGlvbjo6IGZzZGVjb2RlKGZpbGVuYW1lKQogCi0gICBEZWNvZGUgKmZpbGVuYW1lKiBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgCi0gICBlcnJvciBoYW5kbGVyLCBvciBgYCdzdHJpY3QnYGAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgc3RyYCB1bmNoYW5nZWQuCisgICBEZWNvZGUgdGhlIDp0ZXJtOmBwYXRoLWxpa2UgPHBhdGgtbGlrZSBvYmplY3Q+YCAqZmlsZW5hbWUqIGZyb20gdGhlCisgICBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYAorICAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgc3RyYCB1bmNoYW5nZWQuCiAKICAgIDpmdW5jOmBmc2VuY29kZWAgaXMgdGhlIHJldmVyc2UgZnVuY3Rpb24uCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBhZGRlZCB0byBhY2NlcHQgb2JqZWN0cyBpbXBsZW1lbnRpbmcgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgCisgICAgICBpbnRlcmZhY2UuCisKKworLi4gZnVuY3Rpb246OiBmc3BhdGgocGF0aCkKKworICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aC4KKworICAgSWYgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIGlzIHBhc3NlZCBpbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICAgT3RoZXJ3aXNlIDptZXRoOmB+b3MuUGF0aExpa2UuX19mc3BhdGhfX2AgaXMgY2FsbGVkIGFuZCBpdHMgdmFsdWUgaXMKKyAgIHJldHVybmVkIGFzIGxvbmcgYXMgaXQgaXMgYSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0LgorICAgSW4gYWxsIG90aGVyIGNhc2VzLCA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gY2xhc3M6OiBQYXRoTGlrZQorCisgICBBbiA6dGVybTpgYWJzdHJhY3QgYmFzZSBjbGFzc2AgZm9yIG9iamVjdHMgcmVwcmVzZW50aW5nIGEgZmlsZSBzeXN0ZW0gcGF0aCwKKyAgIGUuZy4gOmNsYXNzOmBwYXRobGliLlB1cmVQYXRoYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIGFic3RyYWN0bWV0aG9kOjogX19mc3BhdGhfXygpCisKKyAgICAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorCisgICAgICBUaGUgbWV0aG9kIHNob3VsZCBvbmx5IHJldHVybiBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QsCisgICAgICB3aXRoIHRoZSBwcmVmZXJlbmNlIGJlaW5nIGZvciA6Y2xhc3M6YHN0cmAuCisKIAogLi4gZnVuY3Rpb246OiBnZXRlbnYoa2V5LCBkZWZhdWx0PU5vbmUpCiAKQEAgLTE4ODMsMzUgKzE5MjAsNTEgQEAKIAogLi4gZnVuY3Rpb246OiBzY2FuZGlyKHBhdGg9Jy4nKQogCi0gICBSZXR1cm4gYW4gaXRlcmF0b3Igb2YgOmNsYXNzOmBEaXJFbnRyeWAgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbnRyaWVzCi0gICBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5ICpwYXRoKi4gVGhlIGVudHJpZXMgYXJlIHlpZWxkZWQgaW4gYXJiaXRyYXJ5Ci0gICBvcmRlciwgYW5kIHRoZSBzcGVjaWFsIGVudHJpZXMgYGAnLidgYCBhbmQgYGAnLi4nYGAgYXJlIG5vdCBpbmNsdWRlZC4KKyAgIFJldHVybiBhbiBpdGVyYXRvciBvZiA6Y2xhc3M6YG9zLkRpckVudHJ5YCBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgICBlbnRyaWVzIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgKnBhdGgqLiBUaGUgZW50cmllcyBhcmUgeWllbGRlZCBpbgorICAgYXJiaXRyYXJ5IG9yZGVyLCBhbmQgdGhlIHNwZWNpYWwgZW50cmllcyBgYCcuJ2BgIGFuZCBgYCcuLidgYCBhcmUgbm90CisgICBpbmNsdWRlZC4KIAogICAgVXNpbmcgOmZ1bmM6YHNjYW5kaXJgIGluc3RlYWQgb2YgOmZ1bmM6YGxpc3RkaXJgIGNhbiBzaWduaWZpY2FudGx5CiAgICBpbmNyZWFzZSB0aGUgcGVyZm9ybWFuY2Ugb2YgY29kZSB0aGF0IGFsc28gbmVlZHMgZmlsZSB0eXBlIG9yIGZpbGUKLSAgIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6Y2xhc3M6YERpckVudHJ5YCBvYmplY3RzIGV4cG9zZSB0aGlzCisgICBhdHRyaWJ1dGUgaW5mb3JtYXRpb24sIGJlY2F1c2UgOmNsYXNzOmBvcy5EaXJFbnRyeWAgb2JqZWN0cyBleHBvc2UgdGhpcwogICAgaW5mb3JtYXRpb24gaWYgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMgaXQgd2hlbiBzY2FubmluZyBhIGRpcmVjdG9yeS4KLSAgIEFsbCA6Y2xhc3M6YERpckVudHJ5YCBtZXRob2RzIG1heSBwZXJmb3JtIGEgc3lzdGVtIGNhbGwsIGJ1dAotICAgOmZ1bmM6YH5EaXJFbnRyeS5pc19kaXJgIGFuZCA6ZnVuYzpgfkRpckVudHJ5LmlzX2ZpbGVgIHVzdWFsbHkgb25seQotICAgcmVxdWlyZSBhIHN5c3RlbSBjYWxsIGZvciBzeW1ib2xpYyBsaW5rczsgOmZ1bmM6YERpckVudHJ5LnN0YXRgCisgICBBbGwgOmNsYXNzOmBvcy5EaXJFbnRyeWAgbWV0aG9kcyBtYXkgcGVyZm9ybSBhIHN5c3RlbSBjYWxsLCBidXQKKyAgIDpmdW5jOmB+b3MuRGlyRW50cnkuaXNfZGlyYCBhbmQgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19maWxlYCB1c3VhbGx5IG9ubHkKKyAgIHJlcXVpcmUgYSBzeXN0ZW0gY2FsbCBmb3Igc3ltYm9saWMgbGlua3M7IDpmdW5jOmBvcy5EaXJFbnRyeS5zdGF0YAogICAgYWx3YXlzIHJlcXVpcmVzIGEgc3lzdGVtIGNhbGwgb24gVW5peCBidXQgb25seSByZXF1aXJlcyBvbmUgZm9yCiAgICBzeW1ib2xpYyBsaW5rcyBvbiBXaW5kb3dzLgogCiAgICBPbiBVbml4LCAqcGF0aCogY2FuIGJlIG9mIHR5cGUgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgICh1c2UKICAgIDpmdW5jOmB+b3MuZnNlbmNvZGVgIGFuZCA6ZnVuYzpgfm9zLmZzZGVjb2RlYCB0byBlbmNvZGUgYW5kIGRlY29kZQogICAgOmNsYXNzOmBieXRlc2AgcGF0aHMpLiBPbiBXaW5kb3dzLCAqcGF0aCogbXVzdCBiZSBvZiB0eXBlIDpjbGFzczpgc3RyYC4KLSAgIE9uIGJvdGggc3l0ZW1zLCB0aGUgdHlwZSBvZiB0aGUgOmF0dHI6YH5EaXJFbnRyeS5uYW1lYCBhbmQKLSAgIDphdHRyOmB+RGlyRW50cnkucGF0aGAgYXR0cmlidXRlcyBvZiBlYWNoIDpjbGFzczpgRGlyRW50cnlgIHdpbGwgYmUgb2YKKyAgIE9uIGJvdGggc3l0ZW1zLCB0aGUgdHlwZSBvZiB0aGUgOmF0dHI6YH5vcy5EaXJFbnRyeS5uYW1lYCBhbmQKKyAgIDphdHRyOmB+b3MuRGlyRW50cnkucGF0aGAgYXR0cmlidXRlcyBvZiBlYWNoIDpjbGFzczpgb3MuRGlyRW50cnlgIHdpbGwgYmUgb2YKICAgIHRoZSBzYW1lIHR5cGUgYXMgKnBhdGgqLgogCisgICBUaGUgOmZ1bmM6YHNjYW5kaXJgIGl0ZXJhdG9yIHN1cHBvcnRzIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbAorICAgYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKworICAgLi4gbWV0aG9kOjogc2NhbmRpci5jbG9zZSgpCisKKyAgICAgIENsb3NlIHRoZSBpdGVyYXRvciBhbmQgZnJlZSBhY3F1aXJlZCByZXNvdXJjZXMuCisKKyAgICAgIFRoaXMgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgaXRlcmF0b3IgaXMgZXhoYXVzdGVkIG9yIGdhcmJhZ2UKKyAgICAgIGNvbGxlY3RlZCwgb3Igd2hlbiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBpdGVyYXRpbmcuICBIb3dldmVyIGl0CisgICAgICBpcyBhZHZpc2FibGUgdG8gY2FsbCBpdCBleHBsaWNpdGx5IG9yIHVzZSB0aGUgOmtleXdvcmQ6YHdpdGhgCisgICAgICBzdGF0ZW1lbnQuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgdXNlIG9mIDpmdW5jOmBzY2FuZGlyYCB0byBkaXNwbGF5IGFsbAogICAgdGhlIGZpbGVzIChleGNsdWRpbmcgZGlyZWN0b3JpZXMpIGluIHRoZSBnaXZlbiAqcGF0aCogdGhhdCBkb24ndCBzdGFydCB3aXRoCiAgICBgYCcuJ2BgLiBUaGUgYGBlbnRyeS5pc19maWxlKClgYCBjYWxsIHdpbGwgZ2VuZXJhbGx5IG5vdCBtYWtlIGFuIGFkZGl0aW9uYWwKICAgIHN5c3RlbSBjYWxsOjoKIAotICAgICAgZm9yIGVudHJ5IGluIG9zLnNjYW5kaXIocGF0aCk6Ci0gICAgICAgICBpZiBub3QgZW50cnkubmFtZS5zdGFydHN3aXRoKCcuJykgYW5kIGVudHJ5LmlzX2ZpbGUoKToKLSAgICAgICAgICAgICBwcmludChlbnRyeS5uYW1lKQorICAgICAgd2l0aCBvcy5zY2FuZGlyKHBhdGgpIGFzIGl0OgorICAgICAgICAgIGZvciBlbnRyeSBpbiBpdDoKKyAgICAgICAgICAgICAgaWYgbm90IGVudHJ5Lm5hbWUuc3RhcnRzd2l0aCgnLicpIGFuZCBlbnRyeS5pc19maWxlKCk6CisgICAgICAgICAgICAgICAgICBwcmludChlbnRyeS5uYW1lKQogCiAgICAuLiBub3RlOjoKIApAQCAtMTkyNyw2ICsxOTgwLDEyIEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbCBhbmQgdGhlCisgICAgICA6ZnVuYzpgfnNjYW5kaXIuY2xvc2UoKWAgbWV0aG9kLiAgSWYgYSA6ZnVuYzpgc2NhbmRpcmAgaXRlcmF0b3IgaXMgbmVpdGhlcgorICAgICAgZXhoYXVzdGVkIG5vciBleHBsaWNpdGx5IGNsb3NlZCBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2lsbCBiZSBlbWl0dGVkCisgICAgICBpbiBpdHMgZGVzdHJ1Y3Rvci4KKwogCiAuLiBjbGFzczo6IERpckVudHJ5CiAKQEAgLTE5MzUsMTkgKzE5OTQsMjIgQEAKIAogICAgOmZ1bmM6YHNjYW5kaXJgIHdpbGwgcHJvdmlkZSBhcyBtdWNoIG9mIHRoaXMgaW5mb3JtYXRpb24gYXMgcG9zc2libGUgd2l0aG91dAogICAgbWFraW5nIGFkZGl0aW9uYWwgc3lzdGVtIGNhbGxzLiBXaGVuIGEgYGBzdGF0KClgYCBvciBgYGxzdGF0KClgYCBzeXN0ZW0gY2FsbAotICAgaXMgbWFkZSwgdGhlIGBgRGlyRW50cnlgYCBvYmplY3Qgd2lsbCBjYWNoZSB0aGUgcmVzdWx0LgorICAgaXMgbWFkZSwgdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3Qgd2lsbCBjYWNoZSB0aGUgcmVzdWx0LgogCi0gICBgYERpckVudHJ5YGAgaW5zdGFuY2VzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc3RvcmVkIGluIGxvbmctbGl2ZWQgZGF0YQorICAgYGBvcy5EaXJFbnRyeWBgIGluc3RhbmNlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIHN0b3JlZCBpbiBsb25nLWxpdmVkIGRhdGEKICAgIHN0cnVjdHVyZXM7IGlmIHlvdSBrbm93IHRoZSBmaWxlIG1ldGFkYXRhIGhhcyBjaGFuZ2VkIG9yIGlmIGEgbG9uZyB0aW1lIGhhcwogICAgZWxhcHNlZCBzaW5jZSBjYWxsaW5nIDpmdW5jOmBzY2FuZGlyYCwgY2FsbCBgYG9zLnN0YXQoZW50cnkucGF0aClgYCB0byBmZXRjaAogICAgdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIAotICAgQmVjYXVzZSB0aGUgYGBEaXJFbnRyeWBgIG1ldGhvZHMgY2FuIG1ha2Ugb3BlcmF0aW5nIHN5c3RlbSBjYWxscywgdGhleSBtYXkKKyAgIEJlY2F1c2UgdGhlIGBgb3MuRGlyRW50cnlgYCBtZXRob2RzIGNhbiBtYWtlIG9wZXJhdGluZyBzeXN0ZW0gY2FsbHMsIHRoZXkgbWF5CiAgICBhbHNvIHJhaXNlIDpleGM6YE9TRXJyb3JgLiBJZiB5b3UgbmVlZCB2ZXJ5IGZpbmUtZ3JhaW5lZAogICAgY29udHJvbCBvdmVyIGVycm9ycywgeW91IGNhbiBjYXRjaCA6ZXhjOmBPU0Vycm9yYCB3aGVuIGNhbGxpbmcgb25lIG9mIHRoZQotICAgYGBEaXJFbnRyeWBgIG1ldGhvZHMgYW5kIGhhbmRsZSBhcyBhcHByb3ByaWF0ZS4KKyAgIGBgb3MuRGlyRW50cnlgYCBtZXRob2RzIGFuZCBoYW5kbGUgYXMgYXBwcm9wcmlhdGUuCiAKLSAgIEF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgb24gYSBgYERpckVudHJ5YGAgaW5zdGFuY2UgYXJlIGFzIGZvbGxvd3M6CisgICBUbyBiZSBkaXJlY3RseSB1c2FibGUgYXMgYSA6dGVybTpgcGF0aC1saWtlIG9iamVjdGAsIGBgb3MuRGlyRW50cnlgYAorICAgaW1wbGVtZW50cyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlLgorCisgICBBdHRyaWJ1dGVzIGFuZCBtZXRob2RzIG9uIGEgYGBvcy5EaXJFbnRyeWBgIGluc3RhbmNlIGFyZSBhcyBmb2xsb3dzOgogCiAgICAuLiBhdHRyaWJ1dGU6OiBuYW1lCiAKQEAgLTE5NzMsOCArMjAzNSw5IEBACiAKICAgICAgIFJldHVybiB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBlbnRyeS4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QuIFVzZSBgYG9zLnN0YXQoZW50cnkucGF0aCwKLSAgICAgIGZvbGxvd19zeW1saW5rcz1GYWxzZSkuc3RfaW5vYGAgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0LiBVc2UKKyAgICAgIGBgb3Muc3RhdChlbnRyeS5wYXRoLCBmb2xsb3dfc3ltbGlua3M9RmFsc2UpLnN0X2lub2BgIHRvIGZldGNoIHVwLXRvLWRhdGUKKyAgICAgIGluZm9ybWF0aW9uLgogCiAgICAgICBPbiB0aGUgZmlyc3QsIHVuY2FjaGVkIGNhbGwsIGEgc3lzdGVtIGNhbGwgaXMgcmVxdWlyZWQgb24gV2luZG93cyBidXQKICAgICAgIG5vdCBvbiBVbml4LgpAQCAtMTk4OSw3ICsyMDUyLDcgQEAKICAgICAgIGlzIGEgZGlyZWN0b3J5ICh3aXRob3V0IGZvbGxvd2luZyBzeW1saW5rcyk7IHJldHVybiBgYEZhbHNlYGAgaWYgdGhlCiAgICAgICBlbnRyeSBpcyBhbnkgb3RoZXIga2luZCBvZiBmaWxlIG9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QsIHdpdGggYSBzZXBhcmF0ZSBjYWNoZQorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QsIHdpdGggYSBzZXBhcmF0ZSBjYWNoZQogICAgICAgZm9yICpmb2xsb3dfc3ltbGlua3MqIGBgVHJ1ZWBgIGFuZCBgYEZhbHNlYGAuIENhbGwgOmZ1bmM6YG9zLnN0YXRgIGFsb25nCiAgICAgICB3aXRoIDpmdW5jOmBzdGF0LlNfSVNESVJgIHRvIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCiAKQEAgLTIwMTMsOCArMjA3Niw4IEBACiAgICAgICBpcyBhIGZpbGUgKHdpdGhvdXQgZm9sbG93aW5nIHN5bWxpbmtzKTsgcmV0dXJuIGBgRmFsc2VgYCBpZiB0aGUgZW50cnkgaXMKICAgICAgIGEgZGlyZWN0b3J5IG9yIG90aGVyIG5vbi1maWxlIGVudHJ5LCBvciBpZiBpdCBkb2Vzbid0IGV4aXN0IGFueW1vcmUuCiAKLSAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYERpckVudHJ5YGAgb2JqZWN0LiBDYWNoaW5nLCBzeXN0ZW0gY2FsbHMKLSAgICAgIG1hZGUsIGFuZCBleGNlcHRpb25zIHJhaXNlZCBhcmUgYXMgcGVyIDpmdW5jOmB+RGlyRW50cnkuaXNfZGlyYC4KKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0LiBDYWNoaW5nLCBzeXN0ZW0gY2FsbHMKKyAgICAgIG1hZGUsIGFuZCBleGNlcHRpb25zIHJhaXNlZCBhcmUgYXMgcGVyIDpmdW5jOmB+b3MuRGlyRW50cnkuaXNfZGlyYC4KIAogICAgLi4gbWV0aG9kOjogaXNfc3ltbGluaygpCiAKQEAgLTIwMjIsNyArMjA4NSw3IEBACiAgICAgICByZXR1cm4gYGBGYWxzZWBgIGlmIHRoZSBlbnRyeSBwb2ludHMgdG8gYSBkaXJlY3Rvcnkgb3IgYW55IGtpbmQgb2YgZmlsZSwKICAgICAgIG9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QuIENhbGwKKyAgICAgIFRoZSByZXN1bHQgaXMgY2FjaGVkIG9uIHRoZSBgYG9zLkRpckVudHJ5YGAgb2JqZWN0LiBDYWxsCiAgICAgICA6ZnVuYzpgb3MucGF0aC5pc2xpbmtgIHRvIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCiAKICAgICAgIE9uIHRoZSBmaXJzdCwgdW5jYWNoZWQgY2FsbCwgbm8gc3lzdGVtIGNhbGwgaXMgcmVxdWlyZWQgaW4gbW9zdCBjYXNlcy4KQEAgLTIwNDcsMTcgKzIxMTAsMjEgQEAKICAgICAgIDpjbGFzczpgc3RhdF9yZXN1bHRgIGFyZSBhbHdheXMgc2V0IHRvIHplcm8uIENhbGwgOmZ1bmM6YG9zLnN0YXRgIHRvCiAgICAgICBnZXQgdGhlc2UgYXR0cmlidXRlcy4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QsIHdpdGggYSBzZXBhcmF0ZSBjYWNoZQorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QsIHdpdGggYSBzZXBhcmF0ZSBjYWNoZQogICAgICAgZm9yICpmb2xsb3dfc3ltbGlua3MqIGBgVHJ1ZWBgIGFuZCBgYEZhbHNlYGAuIENhbGwgOmZ1bmM6YG9zLnN0YXRgIHRvCiAgICAgICBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgogCiAgICBOb3RlIHRoYXQgdGhlcmUgaXMgYSBuaWNlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc2V2ZXJhbCBhdHRyaWJ1dGVzCi0gICBhbmQgbWV0aG9kcyBvZiBgYERpckVudHJ5YGAgYW5kIG9mIDpjbGFzczpgcGF0aGxpYi5QYXRoYC4gIEluCi0gICBwYXJ0aWN1bGFyLCB0aGUgYGBuYW1lYGAgYXR0cmlidXRlIGhhcyB0aGUgc2FtZSBtZWFuaW5nLCBhcyBkbyB0aGUKLSAgIGBgaXNfZGlyKClgYCwgYGBpc19maWxlKClgYCwgYGBpc19zeW1saW5rKClgYCBhbmQgYGBzdGF0KClgYCBtZXRob2RzLgorICAgYW5kIG1ldGhvZHMgb2YgYGBvcy5EaXJFbnRyeWBgIGFuZCBvZiA6Y2xhc3M6YHBhdGhsaWIuUGF0aGAuICBJbgorICAgcGFydGljdWxhciwgdGhlIGBgbmFtZWBgIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUKKyAgIG1lYW5pbmcsIGFzIGRvIHRoZSBgYGlzX2RpcigpYGAsIGBgaXNfZmlsZSgpYGAsIGBgaXNfc3ltbGluaygpYGAKKyAgIGFuZCBgYHN0YXQoKWBgIG1ldGhvZHMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZS4KKwogCiAuLiBmdW5jdGlvbjo6IHN0YXQocGF0aCwgXCosIGRpcl9mZD1Ob25lLCBmb2xsb3dfc3ltbGlua3M9VHJ1ZSkKIApAQCAtMzYxOCw2ICszNjg1LDExIEBACiAKICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4gUmV0dXJucyBOb25lIGlmIHVuZGV0ZXJtaW5lZC4KIAorICAgVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCisgICB1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCisgICBgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAorCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BhdGhsaWIucnN0IGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKaW5kZXggZjgwM2ZiNi4uNzRjNDgwNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QKQEAgLTM1LDEyICszNSw2IEBACiAgICBhY2Nlc3NpbmcgdGhlIE9TLiBJbiB0aGlzIGNhc2UsIGluc3RhbnRpYXRpbmcgb25lIG9mIHRoZSBwdXJlIGNsYXNzZXMgbWF5IGJlCiAgICB1c2VmdWwgc2luY2UgdGhvc2Ugc2ltcGx5IGRvbid0IGhhdmUgYW55IE9TLWFjY2Vzc2luZyBvcGVyYXRpb25zLgogCi0uLiBub3RlOjoKLSAgIFRoaXMgbW9kdWxlIGhhcyBiZWVuIGluY2x1ZGVkIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG9uIGEKLSAgIDp0ZXJtOmBwcm92aXNpb25hbCBiYXNpcyA8cHJvdmlzaW9uYWwgcGFja2FnZT5gLiBCYWNrd2FyZHMgaW5jb21wYXRpYmxlCi0gICBjaGFuZ2VzICh1cCB0byBhbmQgaW5jbHVkaW5nIHJlbW92YWwgb2YgdGhlIHBhY2thZ2UpIG1heSBvY2N1ciBpZiBkZWVtZWQKLSAgIG5lY2Vzc2FyeSBieSB0aGUgY29yZSBkZXZlbG9wZXJzLgotCiAuLiBzZWVhbHNvOjoKICAgIDpwZXA6YDQyOGA6IFRoZSBwYXRobGliIG1vZHVsZSAtLSBvYmplY3Qtb3JpZW50ZWQgZmlsZXN5c3RlbSBwYXRocy4KIApAQCAtMTExLDcgKzEwNSw4IEBACiAgICAgICBQdXJlUG9zaXhQYXRoKCdzZXR1cC5weScpCiAKICAgIEVhY2ggZWxlbWVudCBvZiAqcGF0aHNlZ21lbnRzKiBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhCi0gICBwYXRoIHNlZ21lbnQsIG9yIGFub3RoZXIgcGF0aCBvYmplY3Q6OgorICAgcGF0aCBzZWdtZW50LCBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UKKyAgIHdoaWNoIHJldHVybnMgYSBzdHJpbmcsIG9yIGFub3RoZXIgcGF0aCBvYmplY3Q6OgogCiAgICAgICA+Pj4gUHVyZVBhdGgoJ2ZvbycsICdzb21lL3BhdGgnLCAnYmFyJykKICAgICAgIFB1cmVQb3NpeFBhdGgoJ2Zvby9zb21lL3BhdGgvYmFyJykKQEAgLTE1Miw2ICsxNDcsMTIgQEAKICAgIHRvIGBgUHVyZVBvc2l4UGF0aCgnYmFyJylgYCwgd2hpY2ggaXMgd3JvbmcgaWYgYGBmb29gYCBpcyBhIHN5bWJvbGljIGxpbmsKICAgIHRvIGFub3RoZXIgZGlyZWN0b3J5KQogCisgICBQdXJlIHBhdGggb2JqZWN0cyBpbXBsZW1lbnQgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSwgYWxsb3dpbmcgdGhlbQorICAgdG8gYmUgdXNlZCBhbnl3aGVyZSB0aGUgaW50ZXJmYWNlIGlzIGFjY2VwdGVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZS4KKwogLi4gY2xhc3M6OiBQdXJlUG9zaXhQYXRoKCpwYXRoc2VnbWVudHMpCiAKICAgIEEgc3ViY2xhc3Mgb2YgOmNsYXNzOmBQdXJlUGF0aGAsIHRoaXMgcGF0aCBmbGF2b3VyIHJlcHJlc2VudHMgbm9uLVdpbmRvd3MKQEAgLTE5OSw3ICsyMDAsNyBAQAogICAgPj4+IFB1cmVXaW5kb3dzUGF0aCgnZm9vJykgPCBQdXJlUG9zaXhQYXRoKCdmb28nKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgotICAgVHlwZUVycm9yOiB1bm9yZGVyYWJsZSB0eXBlczogUHVyZVdpbmRvd3NQYXRoKCkgPCBQdXJlUG9zaXhQYXRoKCkKKyAgIFR5cGVFcnJvcjogJzwnIG5vdCBzdXBwb3J0ZWQgYmV0d2VlbiBpbnN0YW5jZXMgb2YgJ1B1cmVXaW5kb3dzUGF0aCcgYW5kICdQdXJlUG9zaXhQYXRoJwogCiAKIE9wZXJhdG9ycwpAQCAtMjE2LDYgKzIxNywxNCBAQAogICAgPj4+ICcvdXNyJyAvIHEKICAgIFB1cmVQb3NpeFBhdGgoJy91c3IvYmluJykKIAorQSBwYXRoIG9iamVjdCBjYW4gYmUgdXNlZCBhbnl3aGVyZSBhbiBvYmplY3QgaW1wbGVtZW50aW5nIDpjbGFzczpgb3MuUGF0aExpa2VgCitpcyBhY2NlcHRlZDo6CisKKyAgID4+PiBpbXBvcnQgb3MKKyAgID4+PiBwID0gUHVyZVBhdGgoJy9ldGMnKQorICAgPj4+IG9zLmZzcGF0aChwKQorICAgJy9ldGMnCisKIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBwYXRoIGlzIHRoZSByYXcgZmlsZXN5c3RlbSBwYXRoIGl0c2VsZgogKGluIG5hdGl2ZSBmb3JtLCBlLmcuIHdpdGggYmFja3NsYXNoZXMgdW5kZXIgV2luZG93cyksIHdoaWNoIHlvdSBjYW4KIHBhc3MgdG8gYW55IGZ1bmN0aW9uIHRha2luZyBhIGZpbGUgcGF0aCBhcyBhIHN0cmluZzo6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9waWNrbGUucnN0IGIvRG9jL2xpYnJhcnkvcGlja2xlLnJzdAppbmRleCAwZDY0MTkxLi42ZTg0MzBmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9waWNrbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKQEAgLTQ5Miw3ICs0OTIsNyBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRuZXdhcmdzX2V4X18oKQogCi0gICBJbiBwcm90b2NvbHMgNCBhbmQgbmV3ZXIsIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnRzIHRoZQorICAgSW4gcHJvdG9jb2xzIDIgYW5kIG5ld2VyLCBjbGFzc2VzIHRoYXQgaW1wbGVtZW50cyB0aGUKICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgbWV0aG9kIGNhbiBkaWN0YXRlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHRoZQogICAgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuICBUaGUgbWV0aG9kIG11c3QgcmV0dXJuIGEgcGFpcgogICAgYGAoYXJncywga3dhcmdzKWBgIHdoZXJlICphcmdzKiBpcyBhIHR1cGxlIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzCkBAIC01MDQsMTUgKzUwNCwyMiBAQAogICAgY2xhc3MgcmVxdWlyZXMga2V5d29yZC1vbmx5IGFyZ3VtZW50cy4gIE90aGVyd2lzZSwgaXQgaXMgcmVjb21tZW5kZWQgZm9yCiAgICBjb21wYXRpYmlsaXR5IHRvIGltcGxlbWVudCA6bWV0aDpgX19nZXRuZXdhcmdzX19gLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBpcyBub3cgdXNlZCBpbiBwcm90b2NvbHMgMiBhbmQgMy4KKwogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19nZXRuZXdhcmdzX18oKQogCi0gICBUaGlzIG1ldGhvZCBzZXJ2ZSBhIHNpbWlsYXIgcHVycG9zZSBhcyA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGJ1dAotICAgZm9yIHByb3RvY29scyAyIGFuZCBuZXdlci4gIEl0IG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgYXJndW1lbnRzIGBgYXJnc2BgCi0gICB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuCisgICBUaGlzIG1ldGhvZCBzZXJ2ZSBhIHNpbWlsYXIgcHVycG9zZSBhcyA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gLCBidXQKKyAgIHN1cHBvcnRzIG9ubHkgcG9zaXRpb25hbCBhcmd1bWVudHMuICBJdCBtdXN0IHJldHVybiBhIHR1cGxlIG9mIGFyZ3VtZW50cworICAgYGBhcmdzYGAgd2hpY2ggd2lsbCBiZSBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX25ld19fYCBtZXRob2QgdXBvbiB1bnBpY2tsaW5nLgogCi0gICBJbiBwcm90b2NvbHMgNCBhbmQgbmV3ZXIsIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2lsbCBub3QgYmUgY2FsbGVkIGlmCi0gICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzIGRlZmluZWQuCisgICA6bWV0aDpgX19nZXRuZXdhcmdzX19gIHdpbGwgbm90IGJlIGNhbGxlZCBpZiA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzCisgICBkZWZpbmVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQmVmb3JlIFB5dGhvbiAzLjYsIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2FzIGNhbGxlZCBpbnN0ZWFkIG9mCisgICAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGluIHByb3RvY29scyAyIGFuZCAzLgogCiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldHN0YXRlX18oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcXVldWUucnN0IGIvRG9jL2xpYnJhcnkvcXVldWUucnN0CmluZGV4IDFjYjA5MzUuLmUzZWFhM2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdAorKysgYi9Eb2MvbGlicmFyeS9xdWV1ZS5yc3QKQEAgLTE2LDggKzE2LDkgQEAKIG1vZHVsZS4KIAogVGhlIG1vZHVsZSBpbXBsZW1lbnRzIHRocmVlIHR5cGVzIG9mIHF1ZXVlLCB3aGljaCBkaWZmZXIgb25seSBpbiB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIEZJRk8gcXVldWUsIHRoZSBmaXJzdCB0YXNrcyBhZGRlZCBhcmUKLXRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEgTElGTyBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKK3doaWNoIHRoZSBlbnRyaWVzIGFyZSByZXRyaWV2ZWQuICBJbiBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAKK3F1ZXVlLCB0aGUgZmlyc3QgdGFza3MgYWRkZWQgYXJlIHRoZSBmaXJzdCByZXRyaWV2ZWQuIEluIGEKKzphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSwgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgZW50cnkgaXMKIHRoZSBmaXJzdCByZXRyaWV2ZWQgKG9wZXJhdGluZyBsaWtlIGEgc3RhY2spLiAgV2l0aCBhIHByaW9yaXR5IHF1ZXVlLAogdGhlIGVudHJpZXMgYXJlIGtlcHQgc29ydGVkICh1c2luZyB0aGUgOm1vZDpgaGVhcHFgIG1vZHVsZSkgYW5kIHRoZQogbG93ZXN0IHZhbHVlZCBlbnRyeSBpcyByZXRyaWV2ZWQgZmlyc3QuCkBAIC0yNywxNCArMjgsMTYgQEAKIAogLi4gY2xhc3M6OiBRdWV1ZShtYXhzaXplPTApCiAKLSAgIENvbnN0cnVjdG9yIGZvciBhIEZJRk8gcXVldWUuICAqbWF4c2l6ZSogaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgdGhlIHVwcGVyYm91bmQKKyAgIENvbnN0cnVjdG9yIGZvciBhIDphYmJyOmBGSUZPIChmaXJzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUuICAqbWF4c2l6ZSogaXMKKyAgIGFuIGludGVnZXIgdGhhdCBzZXRzIHRoZSB1cHBlcmJvdW5kCiAgICBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHBsYWNlZCBpbiB0aGUgcXVldWUuICBJbnNlcnRpb24gd2lsbAogICAgYmxvY2sgb25jZSB0aGlzIHNpemUgaGFzIGJlZW4gcmVhY2hlZCwgdW50aWwgcXVldWUgaXRlbXMgYXJlIGNvbnN1bWVkLiAgSWYKICAgICptYXhzaXplKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywgdGhlIHF1ZXVlIHNpemUgaXMgaW5maW5pdGUuCiAKIC4uIGNsYXNzOjogTGlmb1F1ZXVlKG1heHNpemU9MCkKIAotICAgQ29uc3RydWN0b3IgZm9yIGEgTElGTyBxdWV1ZS4gICptYXhzaXplKiBpcyBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAorICAgQ29uc3RydWN0b3IgZm9yIGEgOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLiAgKm1heHNpemUqIGlzCisgICBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAogICAgbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gdGhlIHF1ZXVlLiAgSW5zZXJ0aW9uIHdpbGwKICAgIGJsb2NrIG9uY2UgdGhpcyBzaXplIGhhcyBiZWVuIHJlYWNoZWQsIHVudGlsIHF1ZXVlIGl0ZW1zIGFyZSBjb25zdW1lZC4gIElmCiAgICAqbWF4c2l6ZSogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdCBiL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKaW5kZXggZGY1MDJhMC4uZTdiODFhZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CkBAIC00Niw3ICs0Niw4IEBACiAuLiB3YXJuaW5nOjoKIAogICAgVGhlIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9ycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHVzZWQgZm9yCi0gICBzZWN1cml0eSBwdXJwb3Nlcy4KKyAgIHNlY3VyaXR5IHB1cnBvc2VzLiAgRm9yIHNlY3VyaXR5IG9yIGNyeXB0b2dyYXBoaWMgdXNlcywgc2VlIHRoZQorICAgOm1vZDpgc2VjcmV0c2AgbW9kdWxlLgogCiAKIEJvb2trZWVwaW5nIGZ1bmN0aW9uczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JlLnJzdCBiL0RvYy9saWJyYXJ5L3JlLnJzdAppbmRleCA1NjliNTIyLi5kZmJlZGQ0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmUucnN0CkBAIC0zMjEsOCArMzIxLDkgQEAKIAogCiBUaGUgc3BlY2lhbCBzZXF1ZW5jZXMgY29uc2lzdCBvZiBgYCdcJ2BgIGFuZCBhIGNoYXJhY3RlciBmcm9tIHRoZSBsaXN0IGJlbG93LgotSWYgdGhlIG9yZGluYXJ5IGNoYXJhY3RlciBpcyBub3Qgb24gdGhlIGxpc3QsIHRoZW4gdGhlIHJlc3VsdGluZyBSRSB3aWxsIG1hdGNoCi10aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCBgYFwkYGAgbWF0Y2hlcyB0aGUgY2hhcmFjdGVyIGBgJyQnYGAuCitJZiB0aGUgb3JkaW5hcnkgY2hhcmFjdGVyIGlzIG5vdCBhbiBBU0NJSSBkaWdpdCBvciBhbiBBU0NJSSBsZXR0ZXIsIHRoZW4gdGhlCityZXN1bHRpbmcgUkUgd2lsbCBtYXRjaCB0aGUgc2Vjb25kIGNoYXJhY3Rlci4gIEZvciBleGFtcGxlLCBgYFwkYGAgbWF0Y2hlcyB0aGUKK2NoYXJhY3RlciBgYCckJ2BgLgogCiBgYFxudW1iZXJgYAogICAgTWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIG9mIHRoZSBzYW1lIG51bWJlci4gIEdyb3VwcyBhcmUgbnVtYmVyZWQKQEAgLTQ0Miw5ICs0NDMsOCBAQAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjMKICAgIFRoZSBgYCdcdSdgYCBhbmQgYGAnXFUnYGAgZXNjYXBlIHNlcXVlbmNlcyBoYXZlIGJlZW4gYWRkZWQuCiAKLS4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNSAzLjYKLSAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIEFTQ0lJIGxldHRlciBub3cgcmFpc2UgYQotICAgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgd2lsbCBiZSBmb3JiaWRkZW4gaW4gUHl0aG9uIDMuNi4KKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgbm93IGFyZSBlcnJvcnMuCiAKIAogLi4gc2VlYWxzbzo6CkBAIC01MzIsMTEgKzUzMiwxMSBAQAogICAgY3VycmVudCBsb2NhbGUuIFRoZSB1c2Ugb2YgdGhpcyBmbGFnIGlzIGRpc2NvdXJhZ2VkIGFzIHRoZSBsb2NhbGUgbWVjaGFuaXNtCiAgICBpcyB2ZXJ5IHVucmVsaWFibGUsIGFuZCBpdCBvbmx5IGhhbmRsZXMgb25lICJjdWx0dXJlIiBhdCBhIHRpbWUgYW55d2F5OwogICAgeW91IHNob3VsZCB1c2UgVW5pY29kZSBtYXRjaGluZyBpbnN0ZWFkLCB3aGljaCBpcyB0aGUgZGVmYXVsdCBpbiBQeXRob24gMwotICAgZm9yIFVuaWNvZGUgKHN0cikgcGF0dGVybnMuIFRoaXMgZmxhZyBtYWtlcyBzZW5zZSBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMuCisgICBmb3IgVW5pY29kZSAoc3RyKSBwYXR0ZXJucy4gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCBieXRlcyBwYXR0ZXJucy4KIAotICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy41IDMuNgotICAgICAgRGVwcmVjYXRlZCB0aGUgdXNlIG9mICA6Y29uc3Q6YHJlLkxPQ0FMRWAgd2l0aCBzdHJpbmcgcGF0dGVybnMgb3IKLSAgICAgIDpjb25zdDpgcmUuQVNDSUlgLgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDpjb25zdDpgcmUuTE9DQUxFYCBjYW4gYmUgdXNlZCBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMgYW5kIGlzCisgICAgICBub3QgY29tcGF0aWJsZSB3aXRoIDpjb25zdDpgcmUuQVNDSUlgLgogCiAKIC4uIGRhdGE6OiBNCkBAIC03NDIsOSArNzQyLDggQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBVbm1hdGNoZWQgZ3JvdXBzIGFyZSByZXBsYWNlZCB3aXRoIGFuIGVtcHR5IHN0cmluZy4KIAotICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy41IDMuNgotICAgICAgVW5rbm93biBlc2NhcGVzIGNvbnNpc3Qgb2YgYGAnXCdgYCBhbmQgQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhCi0gICAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCB3aWxsIGJlIGZvcmJpZGRlbiBpbiBQeXRob24gMy42LgorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIGFuIEFTQ0lJIGxldHRlciBub3cgYXJlIGVycm9ycy4KIAogCiAuLiBmdW5jdGlvbjo6IHN1Ym4ocGF0dGVybiwgcmVwbCwgc3RyaW5nLCBjb3VudD0wLCBmbGFncz0wKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0IGIvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0CmluZGV4IDRkM2MwOTkuLjM3ZTQwMGUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JlYWRsaW5lLnJzdAorKysgYi9Eb2MvbGlicmFyeS9yZWFkbGluZS5yc3QKQEAgLTE2Nyw2ICsxNjcsMjAgQEAKICAgIFRoaXMgY2FsbHMgOmM6ZnVuYzpgYWRkX2hpc3RvcnlgIGluIHRoZSB1bmRlcmx5aW5nIGxpYnJhcnkuCiAKIAorLi4gZnVuY3Rpb246OiBzZXRfYXV0b19oaXN0b3J5KGVuYWJsZWQpCisKKyAgIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9tYXRpYyBjYWxscyB0byA6YzpmdW5jOmBhZGRfaGlzdG9yeWAgd2hlbiByZWFkaW5nCisgICBpbnB1dCB2aWEgcmVhZGxpbmUuICBUaGUgKmVuYWJsZWQqIGFyZ3VtZW50IHNob3VsZCBiZSBhIEJvb2xlYW4gdmFsdWUKKyAgIHRoYXQgd2hlbiB0cnVlLCBlbmFibGVzIGF1dG8gaGlzdG9yeSwgYW5kIHRoYXQgd2hlbiBGYWxzZSwgZGlzYWJsZXMKKyAgIGF1dG8gaGlzdG9yeS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIGltcGwtZGV0YWlsOjoKKyAgICAgIEF1dG8gaGlzdG9yeSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGFuZCBjaGFuZ2VzIHRvIHRoaXMgZG8gbm90IHBlcnNpc3QKKyAgICAgIGFjcm9zcyBtdWx0aXBsZSBzZXNzaW9ucy4KKworCiBTdGFydHVwIGhvb2tzCiAtLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0IGIvRG9jL2xpYnJhcnkvc2VjcmV0cy5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmODQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0CkBAIC0wLDAgKzEsMTk4IEBACis6bW9kOmBzZWNyZXRzYCAtLS0gR2VuZXJhdGUgc2VjdXJlIHJhbmRvbSBudW1iZXJzIGZvciBtYW5hZ2luZyBzZWNyZXRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIG1vZHVsZTo6IHNlY3JldHMKKyAgIDpzeW5vcHNpczogR2VuZXJhdGUgc2VjdXJlIHJhbmRvbSBudW1iZXJzIGZvciBtYW5hZ2luZyBzZWNyZXRzLgorCisuLiBtb2R1bGVhdXRob3I6OiBTdGV2ZW4gRCdBcHJhbm8gPHN0ZXZlK3B5dGhvbkBwZWFyd29vZC5pbmZvPgorLi4gc2VjdGlvbmF1dGhvcjo6IFN0ZXZlbiBEJ0FwcmFubyA8c3RldmUrcHl0aG9uQHBlYXJ3b29kLmluZm8+CisuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gdGVzdHNldHVwOjoKKworICAgZnJvbSBzZWNyZXRzIGltcG9ydCAqCisgICBfX25hbWVfXyA9ICc8ZG9jdGVzdD4nCisKKyoqU291cmNlIGNvZGU6KiogOnNvdXJjZTpgTGliL3NlY3JldHMucHlgCisKKy0tLS0tLS0tLS0tLS0KKworVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZworcmFuZG9tIG51bWJlcnMgc3VpdGFibGUgZm9yIG1hbmFnaW5nIGRhdGEgc3VjaCBhcyBwYXNzd29yZHMsIGFjY291bnQKK2F1dGhlbnRpY2F0aW9uLCBzZWN1cml0eSB0b2tlbnMsIGFuZCByZWxhdGVkIHNlY3JldHMuCisKK0luIHBhcnRpY3VsYXJseSwgOm1vZDpgc2VjcmV0c2Agc2hvdWxkIGJlIHVzZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUKK2RlZmF1bHQgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGluIHRoZSA6bW9kOmByYW5kb21gIG1vZHVsZSwgd2hpY2gKK2lzIGRlc2lnbmVkIGZvciBtb2RlbGxpbmcgYW5kIHNpbXVsYXRpb24sIG5vdCBzZWN1cml0eSBvciBjcnlwdG9ncmFwaHkuCisKKy4uIHNlZWFsc286OgorCisgICA6cGVwOmA1MDZgCisKKworUmFuZG9tIG51bWJlcnMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBtb3N0IHNlY3VyZSBzb3VyY2Ugb2YKK3JhbmRvbW5lc3MgdGhhdCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gcHJvdmlkZXMuCisKKy4uIGNsYXNzOjogU3lzdGVtUmFuZG9tCisKKyAgIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgcmFuZG9tIG51bWJlcnMgdXNpbmcgdGhlIGhpZ2hlc3QtcXVhbGl0eQorICAgc291cmNlcyBwcm92aWRlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIFNlZQorICAgOmNsYXNzOmByYW5kb20uU3lzdGVtUmFuZG9tYCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisuLiBmdW5jdGlvbjo6IGNob2ljZShzZXF1ZW5jZSkKKworICAgUmV0dXJuIGEgcmFuZG9tbHktY2hvc2VuIGVsZW1lbnQgZnJvbSBhIG5vbi1lbXB0eSBzZXF1ZW5jZS4KKworLi4gZnVuY3Rpb246OiByYW5kYmVsb3cobikKKworICAgUmV0dXJuIGEgcmFuZG9tIGludCBpbiB0aGUgcmFuZ2UgWzAsICpuKikuCisKKy4uIGZ1bmN0aW9uOjogcmFuZGJpdHMoaykKKworICAgUmV0dXJuIGFuIGludCB3aXRoICprKiByYW5kb20gYml0cy4KKworCitHZW5lcmF0aW5nIHRva2VucworLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgc2VjdXJlCit0b2tlbnMsIHN1aXRhYmxlIGZvciBhcHBsaWNhdGlvbnMgc3VjaCBhcyBwYXNzd29yZCByZXNldHMsCitoYXJkLXRvLWd1ZXNzIFVSTHMsIGFuZCBzaW1pbGFyLgorCisuLiBmdW5jdGlvbjo6IHRva2VuX2J5dGVzKFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSBieXRlIHN0cmluZyBjb250YWluaW5nICpuYnl0ZXMqIG51bWJlciBvZiBieXRlcy4KKyAgIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMKKyAgIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5fYnl0ZXMoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgYidceGViclx4MTdEKnRceGFlXHhkNFx4ZTNTXHhiNlx4ZTJceGViUDFceDhiJworCisKKy4uIGZ1bmN0aW9uOjogdG9rZW5faGV4KFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSB0ZXh0IHN0cmluZywgaW4gaGV4YWRlY2ltYWwuICBUaGUgc3RyaW5nIGhhcyAqbmJ5dGVzKgorICAgcmFuZG9tIGJ5dGVzLCBlYWNoIGJ5dGUgY29udmVydGVkIHRvIHR3byBoZXggZGlnaXRzLiAgSWYgKm5ieXRlcyogaXMKKyAgIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlIGRlZmF1bHQgaXMgdXNlZC4KKworICAgLi4gZG9jdGVzdDo6CisKKyAgICAgID4+PiB0b2tlbl9oZXgoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgJ2Y5YmY3OGI5YTE4Y2U2ZDQ2YTBjZDJiMGI4NmRmOWRhJworCisuLiBmdW5jdGlvbjo6IHRva2VuX3VybHNhZmUoW25ieXRlcz1Ob25lXSkKKworICAgUmV0dXJuIGEgcmFuZG9tIFVSTC1zYWZlIHRleHQgc3RyaW5nLCBjb250YWluaW5nICpuYnl0ZXMqIHJhbmRvbQorICAgYnl0ZXMuICBUaGUgdGV4dCBpcyBCYXNlNjQgZW5jb2RlZCwgc28gb24gYXZlcmFnZSBlYWNoIGJ5dGUgcmVzdWx0cworICAgaW4gYXBwcm94aW1hdGVseSAxLjMgY2hhcmFjdGVycy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdAorICAgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5fdXJsc2FmZSgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgICAnRHJtaHplNkVQY3YwZk5fODFCai1uQScKKworCitIb3cgbWFueSBieXRlcyBzaG91bGQgdG9rZW5zIHVzZT8KK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorCitUbyBiZSBzZWN1cmUgYWdhaW5zdAorYGJydXRlLWZvcmNlIGF0dGFja3MgPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JydXRlLWZvcmNlX2F0dGFjaz5gXywKK3Rva2VucyBuZWVkIHRvIGhhdmUgc3VmZmljaWVudCByYW5kb21uZXNzLiAgVW5mb3J0dW5hdGVseSwgd2hhdCBpcworY29uc2lkZXJlZCBzdWZmaWNpZW50IHdpbGwgbmVjZXNzYXJpbHkgaW5jcmVhc2UgYXMgY29tcHV0ZXJzIGdldCBtb3JlCitwb3dlcmZ1bCBhbmQgYWJsZSB0byBtYWtlIG1vcmUgZ3Vlc3NlcyBpbiBhIHNob3J0ZXIgcGVyaW9kLiAgQXMgb2YgMjAxNSwKK2l0IGlzIGJlbGlldmVkIHRoYXQgMzIgYnl0ZXMgKDI1NiBiaXRzKSBvZiByYW5kb21uZXNzIGlzIHN1ZmZpY2llbnQgZm9yCit0aGUgdHlwaWNhbCB1c2UtY2FzZSBleHBlY3RlZCBmb3IgdGhlIDptb2Q6YHNlY3JldHNgIG1vZHVsZS4KKworRm9yIHRob3NlIHdobyB3YW50IHRvIG1hbmFnZSB0aGVpciBvd24gdG9rZW4gbGVuZ3RoLCB5b3UgY2FuIGV4cGxpY2l0bHkKK3NwZWNpZnkgaG93IG11Y2ggcmFuZG9tbmVzcyBpcyB1c2VkIGZvciB0b2tlbnMgYnkgZ2l2aW5nIGFuIDpjbGFzczpgaW50YAorYXJndW1lbnQgdG8gdGhlIHZhcmlvdXMgYGB0b2tlbl8qYGAgZnVuY3Rpb25zLiAgVGhhdCBhcmd1bWVudCBpcyB0YWtlbgorYXMgdGhlIG51bWJlciBvZiBieXRlcyBvZiByYW5kb21uZXNzIHRvIHVzZS4KKworT3RoZXJ3aXNlLCBpZiBubyBhcmd1bWVudCBpcyBwcm92aWRlZCwgb3IgaWYgdGhlIGFyZ3VtZW50IGlzIGBgTm9uZWBgLAordGhlIGBgdG9rZW5fKmBgIGZ1bmN0aW9ucyB3aWxsIHVzZSBhIHJlYXNvbmFibGUgZGVmYXVsdCBpbnN0ZWFkLgorCisuLiBub3RlOjoKKworICAgVGhhdCBkZWZhdWx0IGlzIHN1YmplY3QgdG8gY2hhbmdlIGF0IGFueSB0aW1lLCBpbmNsdWRpbmcgZHVyaW5nCisgICBtYWludGVuYW5jZSByZWxlYXNlcy4KKworCitPdGhlciBmdW5jdGlvbnMKKy0tLS0tLS0tLS0tLS0tLQorCisuLiBmdW5jdGlvbjo6IGNvbXBhcmVfZGlnZXN0KGEsIGIpCisKKyAgIFJldHVybiBgYFRydWVgYCBpZiBzdHJpbmdzICphKiBhbmQgKmIqIGFyZSBlcXVhbCwgb3RoZXJ3aXNlIGBgRmFsc2VgYCwKKyAgIGluIHN1Y2ggYSB3YXkgYXMgdG8gcmVkdWNlIHRoZSByaXNrIG9mCisgICBgdGltaW5nIGF0dGFja3MgPGh0dHA6Ly9jb2RhaGFsZS5jb20vYS1sZXNzb24taW4tdGltaW5nLWF0dGFja3MvPmBfLgorICAgU2VlIDpmdW5jOmBobWFjLmNvbXBhcmVfZGlnZXN0YCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorCisKK1JlY2lwZXMgYW5kIGJlc3QgcHJhY3RpY2VzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gc2hvd3MgcmVjaXBlcyBhbmQgYmVzdCBwcmFjdGljZXMgZm9yIHVzaW5nIDptb2Q6YHNlY3JldHNgCit0byBtYW5hZ2UgYSBiYXNpYyBsZXZlbCBvZiBzZWN1cml0eS4KKworR2VuZXJhdGUgYW4gZWlnaHQtY2hhcmFjdGVyIGFscGhhbnVtZXJpYyBwYXNzd29yZDoKKworLi4gdGVzdGNvZGU6OgorCisgICBpbXBvcnQgc3RyaW5nCisgICBhbHBoYWJldCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cworICAgcGFzc3dvcmQgPSAnJy5qb2luKGNob2ljZShhbHBoYWJldCkgZm9yIGkgaW4gcmFuZ2UoOCkpCisKKworLi4gbm90ZTo6CisKKyAgIEFwcGxpY2F0aW9ucyBzaG91bGQgbm90CisgICBgc3RvcmUgcGFzc3dvcmRzIGluIGEgcmVjb3ZlcmFibGUgZm9ybWF0IDxodHRwOi8vY3dlLm1pdHJlLm9yZy9kYXRhL2RlZmluaXRpb25zLzI1Ny5odG1sPmBfLAorICAgd2hldGhlciBwbGFpbiB0ZXh0IG9yIGVuY3J5cHRlZC4gIFRoZXkgc2hvdWxkIGJlIHNhbHRlZCBhbmQgaGFzaGVkCisgICB1c2luZyBhIGNyeXB0b2dyYXBoaWNhbGx5LXN0cm9uZyBvbmUtd2F5IChpcnJldmVyc2libGUpIGhhc2ggZnVuY3Rpb24uCisKKworR2VuZXJhdGUgYSB0ZW4tY2hhcmFjdGVyIGFscGhhbnVtZXJpYyBwYXNzd29yZCB3aXRoIGF0IGxlYXN0IG9uZQorbG93ZXJjYXNlIGNoYXJhY3RlciwgYXQgbGVhc3Qgb25lIHVwcGVyY2FzZSBjaGFyYWN0ZXIsIGFuZCBhdCBsZWFzdAordGhyZWUgZGlnaXRzOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgIGltcG9ydCBzdHJpbmcKKyAgIGFscGhhYmV0ID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICB3aGlsZSBUcnVlOgorICAgICAgIHBhc3N3b3JkID0gJycuam9pbihjaG9pY2UoYWxwaGFiZXQpIGZvciBpIGluIHJhbmdlKDEwKSkKKyAgICAgICBpZiAoYW55KGMuaXNsb3dlcigpIGZvciBjIGluIHBhc3N3b3JkKQorICAgICAgICAgICAgICAgYW5kIGFueShjLmlzdXBwZXIoKSBmb3IgYyBpbiBwYXNzd29yZCkKKyAgICAgICAgICAgICAgIGFuZCBzdW0oYy5pc2RpZ2l0KCkgZm9yIGMgaW4gcGFzc3dvcmQpID49IDMpOgorICAgICAgICAgICBicmVhaworCisKK0dlbmVyYXRlIGFuIGBYS0NELXN0eWxlIHBhc3NwaHJhc2UgPGh0dHA6Ly94a2NkLmNvbS85MzYvPmBfOgorCisuLiB0ZXN0Y29kZTo6CisKKyAgICMgT24gc3RhbmRhcmQgTGludXggc3lzdGVtcywgdXNlIGEgY29udmVuaWVudCBkaWN0aW9uYXJ5IGZpbGUuCisgICAjIE90aGVyIHBsYXRmb3JtcyBtYXkgbmVlZCB0byBwcm92aWRlIHRoZWlyIG93biB3b3JkLWxpc3QuCisgICB3aXRoIG9wZW4oJy91c3Ivc2hhcmUvZGljdC93b3JkcycpIGFzIGY6CisgICAgICAgd29yZHMgPSBbd29yZC5zdHJpcCgpIGZvciB3b3JkIGluIGZdCisgICAgICAgcGFzc3dvcmQgPSAnICcuam9pbihjaG9pY2Uod29yZHMpIGZvciBpIGluIHJhbmdlKDQpKQorCisKK0dlbmVyYXRlIGEgaGFyZC10by1ndWVzcyB0ZW1wb3JhcnkgVVJMIGNvbnRhaW5pbmcgYSBzZWN1cml0eSB0b2tlbgorc3VpdGFibGUgZm9yIHBhc3N3b3JkIHJlY292ZXJ5IGFwcGxpY2F0aW9uczoKKworLi4gdGVzdGNvZGU6OgorCisgICB1cmwgPSAnaHR0cHM6Ly9teWRvbWFpbi5jb20vcmVzZXQ9JyArIHRva2VuX3VybHNhZmUoKQorCisKKworLi4KKyAgICMgVGhpcyBtb2RlbGluZSBtdXN0IGFwcGVhciB3aXRoaW4gdGhlIGxhc3QgdGVuIGxpbmVzIG9mIHRoZSBmaWxlLgorICAga2F0ZTogaW5kZW50LXdpZHRoIDM7IHJlbW92ZS10cmFpbGluZy1zcGFjZSBvbjsgcmVwbGFjZS10YWJzIG9uOyBlbmNvZGluZyB1dGYtODsKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NpdGUucnN0IGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKaW5kZXggMGE3M2Y1YS4uNDNkYWY3OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc2l0ZS5yc3QKQEAgLTUyLDcgKzUyLDggQEAKIEEgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUgaXMgYSBmaWxlIHdob3NlIG5hbWUgaGFzIHRoZSBmb3JtIDpmaWxlOmB7bmFtZX0ucHRoYAogYW5kIGV4aXN0cyBpbiBvbmUgb2YgdGhlIGZvdXIgZGlyZWN0b3JpZXMgbWVudGlvbmVkIGFib3ZlOyBpdHMgY29udGVudHMgYXJlCiBhZGRpdGlvbmFsIGl0ZW1zIChvbmUgcGVyIGxpbmUpIHRvIGJlIGFkZGVkIHRvIGBgc3lzLnBhdGhgYC4gIE5vbi1leGlzdGluZyBpdGVtcwotYXJlIG5ldmVyIGFkZGVkIHRvIGBgc3lzLnBhdGhgYC4gIE5vIGl0ZW0gaXMgYWRkZWQgdG8gYGBzeXMucGF0aGBgIG1vcmUgdGhhbgorYXJlIG5ldmVyIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCwgYW5kIG5vIGNoZWNrIGlzIG1hZGUgdGhhdCB0aGUgaXRlbSByZWZlcnMgdG8gYQorZGlyZWN0b3J5IHJhdGhlciB0aGFuIGEgZmlsZS4gIE5vIGl0ZW0gaXMgYWRkZWQgdG8gYGBzeXMucGF0aGBgIG1vcmUgdGhhbgogb25jZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aCBgYCNgYCBhcmUgc2tpcHBlZC4gIExpbmVzIHN0YXJ0aW5nCiB3aXRoIGBgaW1wb3J0YGAgKGZvbGxvd2VkIGJ5IHNwYWNlIG9yIHRhYikgYXJlIGV4ZWN1dGVkLgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zbXRwZC5yc3QgYi9Eb2MvbGlicmFyeS9zbXRwZC5yc3QKaW5kZXggOTc3ZjlhOC4uYWQ2YmQzYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc210cGQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NtdHBkLnJzdApAQCAtMjksNyArMjksNyBAQAogCiAKIC4uIGNsYXNzOjogU01UUFNlcnZlcihsb2NhbGFkZHIsIHJlbW90ZWFkZHIsIGRhdGFfc2l6ZV9saW1pdD0zMzU1NDQzMixcCi0gICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSkKIAogICAgQ3JlYXRlIGEgbmV3IDpjbGFzczpgU01UUFNlcnZlcmAgb2JqZWN0LCB3aGljaCBiaW5kcyB0byBsb2NhbCBhZGRyZXNzCiAgICAqbG9jYWxhZGRyKi4gIEl0IHdpbGwgdHJlYXQgKnJlbW90ZWFkZHIqIGFzIGFuIHVwc3RyZWFtIFNNVFAgcmVsYXllci4gIEl0CkBAIC00NSwyMCArNDUsMTkgQEAKICAgIGdsb2JhbCBzb2NrZXQgbWFwIGlzIHVzZWQuCiAKICAgICplbmFibGVfU01UUFVURjgqIGRldGVybWlucyB3aGV0aGVyIHRoZSBgYFNNVFBVVEY4YGAgZXh0ZW5zaW9uIChhcyBkZWZpbmVkCi0gICBpbiA6UkZDOmA2NTMxYCkgc2hvdWxkIGJlIGVuYWJsZWQuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuICBJZiBzZXQgdG8KLSAgIGBgVHJ1ZWBgLCAqZGVjb2RlX2RhdGEqIG11c3QgYmUgYGBGYWxzZWBgIChvdGhlcndpc2UgYW4gZXJyb3IgaXMgcmFpc2VkKS4KKyAgIGluIDpSRkM6YDY1MzFgKSBzaG91bGQgYmUgZW5hYmxlZC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYC4KICAgIFdoZW4gYGBUcnVlYGAsIGBgU01UUFVURjhgYCBpcyBhY2NlcHRlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgYGBNQUlMYGAKICAgIGNvbW1hbmQgYW5kIHdoZW4gcHJlc2VudCBpcyBwYXNzZWQgdG8gOm1ldGg6YHByb2Nlc3NfbWVzc2FnZWAgaW4gdGhlCi0gICBgYGt3YXJnc1snbWFpbF9vcHRpb25zJ11gYCBsaXN0LgorICAgYGBrd2FyZ3NbJ21haWxfb3B0aW9ucyddYGAgbGlzdC4gICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqCisgICBjYW5ub3QgYmUgc2V0IHRvIGBgVHJ1ZWBgIGF0IHRoZSBzYW1lIHRpbWUuCiAKICAgICpkZWNvZGVfZGF0YSogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgU01UUCB0cmFuc2FjdGlvbgotICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBUaGUgZGVmYXVsdCBpcyBgYFRydWVgYCBmb3IgYmFja3dhcmQKLSAgIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYnV0IHdpbGwgY2hhbmdlIHRvIGBgRmFsc2VgYCBpbiBQeXRob24gMy42OyBzcGVjaWZ5Ci0gICB0aGUga2V5d29yZCB2YWx1ZSBleHBsaWNpdGx5IHRvIGF2b2lkIHRoZSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgLiAgV2hlbgotICAgKmRlY29kZV9kYXRhKiBpcyBzZXQgdG8gYGBGYWxzZWBgIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyB0aGUgYGA4QklUTUlNRWBgCisgICBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOC4gIFdoZW4gKmRlY29kZV9kYXRhKiBpcyBgYEZhbHNlYGAgKHRoZQorICAgZGVmYXVsdCksIHRoZSBzZXJ2ZXIgYWR2ZXJ0aXNlcyB0aGUgYGA4QklUTUlNRWBgCiAgICBleHRlbnNpb24gKDpyZmM6YDYxNTJgKSwgYWNjZXB0cyB0aGUgYGBCT0RZPThCSVRNSU1FYGAgcGFyYW1ldGVyIHRvCiAgICB0aGUgYGBNQUlMYGAgY29tbWFuZCwgYW5kIHdoZW4gcHJlc2VudCBwYXNzZXMgaXQgdG8gOm1ldGg6YHByb2Nlc3NfbWVzc2FnZWAKLSAgIGluIHRoZSBgYGt3YXJnc1snbWFpbF9vcHRpb25zJ11gYCBsaXN0LgorICAgaW4gdGhlIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqCisgICBjYW5ub3QgYmUgc2V0IHRvIGBgVHJ1ZWBgIGF0IHRoZSBzYW1lIHRpbWUuCiAKICAgIC4uIG1ldGhvZDo6IHByb2Nlc3NfbWVzc2FnZShwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSwgKiprd2FyZ3MpCiAKQEAgLTc1LDkgKzc0LDggQEAKICAgICAgIHdpbGwgYmUgYSBieXRlcyBvYmplY3QuCiAKICAgICAgICprd2FyZ3MqIGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIEl0IGlzIGVtcHR5Ci0gICAgICB1bmxlc3MgYXQgbGVhc3Qgb25lIG9mIGBgZGVjb2RlX2RhdGE9RmFsc2VgYCBvciBgYGVuYWJsZV9TTVRQVVRGOD1UcnVlYGAKLSAgICAgIHdhcyBnaXZlbiBhcyBhbiBpbml0IHBhcmFtZXRlciwgaW4gd2hpY2ggY2FzZSBpdCBjb250YWlucyB0aGUgZm9sbG93aW5nCi0gICAgICBrZXlzOgorICAgICAgaWYgYGBkZWNvZGVfZGF0YT1UcnVlYGAgd2FzIGdpdmVuIGFzIGFuIGluaXQgYXJndW1lbnQsIG90aGVyd2lzZQorICAgICAgaXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBrZXlzOgogCiAgICAgICAgICAgKm1haWxfb3B0aW9ucyo6CiAgICAgICAgICAgICAgYSBsaXN0IG9mIGFsbCByZWNlaXZlZCBwYXJhbWV0ZXJzIHRvIHRoZSBgYE1BSUxgYApAQCAtMTA4LDkgKzEwNiwxMiBAQAogICAgICAgKmxvY2FsYWRkciogYW5kICpyZW1vdGVhZGRyKiBtYXkgbm93IGNvbnRhaW4gSVB2NiBhZGRyZXNzZXMuCiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQotICAgICAgdGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGNvbnN0cnVjdG9yIGFyZ3VtZW50cywgYW5kIHRoZQotICAgICAgKmt3YXJncyogYXJndW1lbnQgdG8gOm1ldGg6YHByb2Nlc3NfbWVzc2FnZWAgd2hlbiBvbmUgb3IgbW9yZSBvZiB0aGVzZSBpcwotICAgICAgc3BlY2lmaWVkLgorICAgICAgVGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMsIGFuZCB0aGUKKyAgICAgICprd2FyZ3MqIHBhcmFtZXRlciB0byA6bWV0aDpgcHJvY2Vzc19tZXNzYWdlYCB3aGVuICpkZWNvZGVfZGF0YSogaXMKKyAgICAgIGBgRmFsc2VgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICpkZWNvZGVfZGF0YSogaXMgbm93IGBgRmFsc2VgYCBieSBkZWZhdWx0LgogCiAKIERlYnVnZ2luZ1NlcnZlciBPYmplY3RzCkBAIC0xNTAsNyArMTUxLDcgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLi4gY2xhc3M6OiBTTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRhdGFfc2l6ZV9saW1pdD0zMzU1NDQzMixcCi0gICAgICAgICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPVRydWUpCisgICAgICAgICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPUZhbHNlKQogCiAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBTTVRQQ2hhbm5lbGAgb2JqZWN0IHdoaWNoIG1hbmFnZXMgdGhlIGNvbW11bmljYXRpb24KICAgIGJldHdlZW4gdGhlIHNlcnZlciBhbmQgYSBzaW5nbGUgU01UUCBjbGllbnQuCkBAIC0xNjIsMjIgKzE2MywyNSBAQAogICAgbGltaXQuCiAKICAgICplbmFibGVfU01UUFVURjgqIGRldGVybWlucyB3aGV0aGVyIHRoZSBgYFNNVFBVVEY4YGAgZXh0ZW5zaW9uIChhcyBkZWZpbmVkCi0gICBpbiA6UkZDOmA2NTMxYCkgc2hvdWxkIGJlIGVuYWJsZWQuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuICBBCi0gICA6ZXhjOmBWYWx1ZUVycm9yYCBpcyByYWlzZWQgaWYgYm90aCAqZW5hYmxlX1NNVFBVVEY4KiBhbmQgKmRlY29kZV9kYXRhKiBhcmUKLSAgIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZSB0aW1lLgorICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgorICAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZQorICAgdGltZS4KIAogICAgQSBkaWN0aW9uYXJ5IGNhbiBiZSBzcGVjaWZpZWQgaW4gKm1hcCogdG8gYXZvaWQgdXNpbmcgYSBnbG9iYWwgc29ja2V0IG1hcC4KIAogICAgKmRlY29kZV9kYXRhKiBzcGVjaWZpZXMgd2hldGhlciB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBTTVRQIHRyYW5zYWN0aW9uCi0gICBzaG91bGQgYmUgZGVjb2RlZCB1c2luZyBVVEYtOC4gIFRoZSBkZWZhdWx0IGlzIGBgVHJ1ZWBgIGZvciBiYWNrd2FyZAotICAgY29tcGF0aWJpbGl0eSByZWFzb25zLCBidXQgd2lsbCBjaGFuZ2UgdG8gYGBGYWxzZWBgIGluIFB5dGhvbiAzLjYuICBTcGVjaWZ5Ci0gICB0aGUga2V5d29yZCB2YWx1ZSBleHBsaWNpdGx5IHRvIGF2b2lkIHRoZSA6ZXhjOmBEZXByZWNhdGlvbldhcm5pbmdgLgorICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuCisgICAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KiBjYW5ub3QgYmUgc2V0IHRvIGBgVHJ1ZWBgIGF0IHRoZSBzYW1lCisgICB0aW1lLgogCiAgICBUbyB1c2UgYSBjdXN0b20gU01UUENoYW5uZWwgaW1wbGVtZW50YXRpb24geW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlCiAgICA6YXR0cjpgU01UUFNlcnZlci5jaGFubmVsX2NsYXNzYCBvZiB5b3VyIDpjbGFzczpgU01UUFNlcnZlcmAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41Ci0gICAgICB0aGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogYXJndW1lbnRzIHdlcmUgYWRkZWQuCisgICAgICBUaGUgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogcGFyYW1ldGVycyB3ZXJlIGFkZGVkLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKmRlY29kZV9kYXRhKiBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCiAKICAgIFRoZSA6Y2xhc3M6YFNNVFBDaGFubmVsYCBoYXMgdGhlIGZvbGxvd2luZyBpbnN0YW5jZSB2YXJpYWJsZXM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QgYi9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CmluZGV4IDQ4MzExYzUuLmM2M2M3M2EgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc29ja2V0LnJzdApAQCAtMzI5LDEyICszMjksMTcgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMwogCiAKLS4uIGRhdGE6OiBTSU9fKgorLi4gZGF0YTo6IFNJT19SQ1ZBTEwKKyAgICAgICAgICBTSU9fS0VFUEFMSVZFX1ZBTFMKKyAgICAgICAgICBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRICiAgICAgICAgICAgUkNWQUxMXyoKIAogICAgQ29uc3RhbnRzIGZvciBXaW5kb3dzJyBXU0FJb2N0bCgpLiBUaGUgY29uc3RhbnRzIGFyZSB1c2VkIGFzIGFyZ3VtZW50cyB0byB0aGUKICAgIDptZXRoOmB+c29ja2V0LnNvY2tldC5pb2N0bGAgbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYGAgd2FzIGFkZGVkLgorCiAKIC4uIGRhdGE6OiBUSVBDXyoKIApAQCAtODcyLDYgKzg3NywxMCBAQAogICAgaXQgaXMgcmVjb21tZW5kZWQgdG8gOm1ldGg6YGNsb3NlYCB0aGVtIGV4cGxpY2l0bHksIG9yIHRvIHVzZSBhCiAgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50IGFyb3VuZCB0aGVtLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOmV4YzpgT1NFcnJvcmAgaXMgbm93IHJhaXNlZCBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiB0aGUgdW5kZXJseWluZworICAgICAgOmM6ZnVuYzpgY2xvc2VgIGNhbGwgaXMgbWFkZS4KKwogICAgLi4gbm90ZTo6CiAKICAgICAgIDptZXRoOmBjbG9zZSgpYCByZWxlYXNlcyB0aGUgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIGEgY29ubmVjdGlvbiBidXQKQEAgLTk5Miw2ICsxMDAxLDEyIEBACiAgICBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSBnZW5lcmljIDpmdW5jOmBmY250bC5mY250bGAgYW5kIDpmdW5jOmBmY250bC5pb2N0bGAKICAgIGZ1bmN0aW9ucyBtYXkgYmUgdXNlZDsgdGhleSBhY2NlcHQgYSBzb2NrZXQgb2JqZWN0IGFzIHRoZWlyIGZpcnN0IGFyZ3VtZW50LgogCisgICBDdXJyZW50bHkgb25seSB0aGUgZm9sbG93aW5nIGNvbnRyb2wgY29kZXMgYXJlIHN1cHBvcnRlZDoKKyAgIGBgU0lPX1JDVkFMTGBgLCBgYFNJT19LRUVQQUxJVkVfVkFMU2BgLCBhbmQgYGBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBgYFNJT19MT09QQkFDS19GQVNUX1BBVEhgYCB3YXMgYWRkZWQuCisKIC4uIG1ldGhvZDo6IHNvY2tldC5saXN0ZW4oW2JhY2tsb2ddKQogCiAgICBFbmFibGUgYSBzZXJ2ZXIgdG8gYWNjZXB0IGNvbm5lY3Rpb25zLiAgSWYgKmJhY2tsb2cqIGlzIHNwZWNpZmllZCwgaXQgbXVzdApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKaW5kZXggOThkMmM0Ni4uM2ViMjdlMyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CkBAIC01MiwxMSArNTIsMTIgQEAKIG92ZXJyaWRpbmcgaXRzIDptZXRoOmB+QmFzZVJlcXVlc3RIYW5kbGVyLmhhbmRsZWAgbWV0aG9kOwogdGhpcyBtZXRob2Qgd2lsbCBwcm9jZXNzIGluY29taW5nCiByZXF1ZXN0cy4gIFNlY29uZCwgeW91IG11c3QgaW5zdGFudGlhdGUgb25lIG9mIHRoZSBzZXJ2ZXIgY2xhc3NlcywgcGFzc2luZyBpdAotdGhlIHNlcnZlcidzIGFkZHJlc3MgYW5kIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuICBUaGVuIGNhbGwgdGhlCit0aGUgc2VydmVyJ3MgYWRkcmVzcyBhbmQgdGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCit0aGUgc2VydmVyIGluIGEgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudC4gVGhlbiBjYWxsIHRoZQogOm1ldGg6YH5CYXNlU2VydmVyLmhhbmRsZV9yZXF1ZXN0YCBvcgogOm1ldGg6YH5CYXNlU2VydmVyLnNlcnZlX2ZvcmV2ZXJgIG1ldGhvZCBvZiB0aGUgc2VydmVyIG9iamVjdCB0bwogcHJvY2VzcyBvbmUgb3IgbWFueSByZXF1ZXN0cy4gIEZpbmFsbHksIGNhbGwgOm1ldGg6YH5CYXNlU2VydmVyLnNlcnZlcl9jbG9zZWAKLXRvIGNsb3NlIHRoZSBzb2NrZXQuCit0byBjbG9zZSB0aGUgc29ja2V0ICh1bmxlc3MgeW91IHVzZWQgYSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50KS4KIAogV2hlbiBpbmhlcml0aW5nIGZyb20gOmNsYXNzOmBUaHJlYWRpbmdNaXhJbmAgZm9yIHRocmVhZGVkIGNvbm5lY3Rpb24gYmVoYXZpb3IsCiB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgZGVjbGFyZSBob3cgeW91IHdhbnQgeW91ciB0aHJlYWRzIHRvIGJlaGF2ZSBvbiBhbiBhYnJ1cHQKQEAgLTExMSw2ICsxMTIsOCBAQAogICAgOmNsYXNzOmBVRFBTZXJ2ZXJgLiAgU2V0dGluZyB0aGUgdmFyaW91cyBhdHRyaWJ1dGVzIGFsc28gY2hhbmdlcyB0aGUKICAgIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nIHNlcnZlciBtZWNoYW5pc20uCiAKKyAgIDpjbGFzczpgRm9ya2luZ01peEluYCBhbmQgdGhlIEZvcmtpbmcgY2xhc3NlcyBtZW50aW9uZWQgYmVsb3cgYXJlCisgICBvbmx5IGF2YWlsYWJsZSBvbiBQT1NJWCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpmdW5jOmB+b3MuZm9ya2AuCiAKIC4uIGNsYXNzOjogRm9ya2luZ1RDUFNlcnZlcgogICAgICAgICAgICBGb3JraW5nVURQU2VydmVyCkBAIC0zMDQsNyArMzA3LDExIEBACiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiB0aGUgOm1ldGg6YH5CYXNlUmVxdWVzdEhhbmRsZXIuaGFuZGxlYAogICAgICAgbWV0aG9kIG9mIGEgOmF0dHI6YFJlcXVlc3RIYW5kbGVyQ2xhc3NgIGluc3RhbmNlIHJhaXNlcwogICAgICAgYW4gZXhjZXB0aW9uLiAgVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHByaW50IHRoZSB0cmFjZWJhY2sgdG8KLSAgICAgIHN0YW5kYXJkIG91dHB1dCBhbmQgY29udGludWUgaGFuZGxpbmcgZnVydGhlciByZXF1ZXN0cy4KKyAgICAgIHN0YW5kYXJkIGVycm9yIGFuZCBjb250aW51ZSBoYW5kbGluZyBmdXJ0aGVyIHJlcXVlc3RzLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgTm93IG9ubHkgY2FsbGVkIGZvciBleGNlcHRpb25zIGRlcml2ZWQgZnJvbSB0aGUgOmV4YzpgRXhjZXB0aW9uYAorICAgICAgICAgY2xhc3MuCiAKIAogICAgLi4gbWV0aG9kOjogaGFuZGxlX3RpbWVvdXQoKQpAQCAtMzQ5LDYgKzM1NiwxMSBAQAogICAgICAgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyA6Y29uc3Q6YFRydWVgLgogCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGZvciB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAgcHJvdG9jb2wgd2FzIGFkZGVkLiAgRXhpdGluZyB0aGUKKyAgICAgIGNvbnRleHQgbWFuYWdlciBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgOm1ldGg6YHNlcnZlcl9jbG9zZWAuCisKKwogUmVxdWVzdCBIYW5kbGVyIE9iamVjdHMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM5Nyw2ICs0MDksMTUgQEAKICAgIHJlYWQgb3Igd3JpdHRlbiwgcmVzcGVjdGl2ZWx5LCB0byBnZXQgdGhlIHJlcXVlc3QgZGF0YSBvciByZXR1cm4gZGF0YQogICAgdG8gdGhlIGNsaWVudC4KIAorICAgVGhlIDphdHRyOmByZmlsZWAgYXR0cmlidXRlcyBvZiBib3RoIGNsYXNzZXMgc3VwcG9ydCB0aGUKKyAgIDpjbGFzczpgaW8uQnVmZmVyZWRJT0Jhc2VgIHJlYWRhYmxlIGludGVyZmFjZSwgYW5kCisgICA6YXR0cjpgRGF0YWdyYW1SZXF1ZXN0SGFuZGxlci53ZmlsZWAgc3VwcG9ydHMgdGhlCisgICA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCB3cml0YWJsZSBpbnRlcmZhY2UuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6YXR0cjpgU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIGFsc28gc3VwcG9ydHMgdGhlCisgICAgICA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCB3cml0YWJsZSBpbnRlcmZhY2UuCisKIAogRXhhbXBsZXMKIC0tLS0tLS0tCkBAIC00MjksMTEgKzQ1MCwxMCBAQAogICAgICAgIEhPU1QsIFBPUlQgPSAibG9jYWxob3N0IiwgOTk5OQogCiAgICAgICAgIyBDcmVhdGUgdGhlIHNlcnZlciwgYmluZGluZyB0byBsb2NhbGhvc3Qgb24gcG9ydCA5OTk5Ci0gICAgICAgc2VydmVyID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgUE9SVCksIE15VENQSGFuZGxlcikKLQotICAgICAgICMgQWN0aXZhdGUgdGhlIHNlcnZlcjsgdGhpcyB3aWxsIGtlZXAgcnVubmluZyB1bnRpbCB5b3UKLSAgICAgICAjIGludGVycnVwdCB0aGUgcHJvZ3JhbSB3aXRoIEN0cmwtQwotICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICB3aXRoIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVRDUEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgIyBBY3RpdmF0ZSB0aGUgc2VydmVyOyB0aGlzIHdpbGwga2VlcCBydW5uaW5nIHVudGlsIHlvdQorICAgICAgICAgICAjIGludGVycnVwdCB0aGUgcHJvZ3JhbSB3aXRoIEN0cmwtQworICAgICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCiAKIEFuIGFsdGVybmF0aXZlIHJlcXVlc3QgaGFuZGxlciBjbGFzcyB0aGF0IG1ha2VzIHVzZSBvZiBzdHJlYW1zIChmaWxlLWxpa2UKIG9iamVjdHMgdGhhdCBzaW1wbGlmeSBjb21tdW5pY2F0aW9uIGJ5IHByb3ZpZGluZyB0aGUgc3RhbmRhcmQgZmlsZSBpbnRlcmZhY2UpOjoKQEAgLTUyMSw4ICs1NDEsOCBAQAogCiAgICBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgICAgIEhPU1QsIFBPUlQgPSAibG9jYWxob3N0IiwgOTk5OQotICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5VRFBTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVVEUEhhbmRsZXIpCi0gICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgIHdpdGggc29ja2V0c2VydmVyLlVEUFNlcnZlcigoSE9TVCwgUE9SVCksIE15VURQSGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCiAKIFRoaXMgaXMgdGhlIGNsaWVudCBzaWRlOjoKIApAQCAtNTgxLDIyICs2MDEsMjIgQEAKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDAKIAogICAgICAgIHNlcnZlciA9IFRocmVhZGVkVENQU2VydmVyKChIT1NULCBQT1JUKSwgVGhyZWFkZWRUQ1BSZXF1ZXN0SGFuZGxlcikKLSAgICAgICBpcCwgcG9ydCA9IHNlcnZlci5zZXJ2ZXJfYWRkcmVzcworICAgICAgIHdpdGggc2VydmVyOgorICAgICAgICAgICBpcCwgcG9ydCA9IHNlcnZlci5zZXJ2ZXJfYWRkcmVzcwogCi0gICAgICAgIyBTdGFydCBhIHRocmVhZCB3aXRoIHRoZSBzZXJ2ZXIgLS0gdGhhdCB0aHJlYWQgd2lsbCB0aGVuIHN0YXJ0IG9uZQotICAgICAgICMgbW9yZSB0aHJlYWQgZm9yIGVhY2ggcmVxdWVzdAotICAgICAgIHNlcnZlcl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIuc2VydmVfZm9yZXZlcikKLSAgICAgICAjIEV4aXQgdGhlIHNlcnZlciB0aHJlYWQgd2hlbiB0aGUgbWFpbiB0aHJlYWQgdGVybWluYXRlcwotICAgICAgIHNlcnZlcl90aHJlYWQuZGFlbW9uID0gVHJ1ZQotICAgICAgIHNlcnZlcl90aHJlYWQuc3RhcnQoKQotICAgICAgIHByaW50KCJTZXJ2ZXIgbG9vcCBydW5uaW5nIGluIHRocmVhZDoiLCBzZXJ2ZXJfdGhyZWFkLm5hbWUpCisgICAgICAgICAgICMgU3RhcnQgYSB0aHJlYWQgd2l0aCB0aGUgc2VydmVyIC0tIHRoYXQgdGhyZWFkIHdpbGwgdGhlbiBzdGFydCBvbmUKKyAgICAgICAgICAgIyBtb3JlIHRocmVhZCBmb3IgZWFjaCByZXF1ZXN0CisgICAgICAgICAgIHNlcnZlcl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIuc2VydmVfZm9yZXZlcikKKyAgICAgICAgICAgIyBFeGl0IHRoZSBzZXJ2ZXIgdGhyZWFkIHdoZW4gdGhlIG1haW4gdGhyZWFkIHRlcm1pbmF0ZXMKKyAgICAgICAgICAgc2VydmVyX3RocmVhZC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgIHNlcnZlcl90aHJlYWQuc3RhcnQoKQorICAgICAgICAgICBwcmludCgiU2VydmVyIGxvb3AgcnVubmluZyBpbiB0aHJlYWQ6Iiwgc2VydmVyX3RocmVhZC5uYW1lKQogCi0gICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMSIpCi0gICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMiIpCi0gICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMyIpCisgICAgICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDEiKQorICAgICAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAyIikKKyAgICAgICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMyIpCiAKLSAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKQotICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKQogCiAKIFRoZSBvdXRwdXQgb2YgdGhlIGV4YW1wbGUgc2hvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczo6CkBAIC02MTAsMyArNjMwLDUgQEAKIAogVGhlIDpjbGFzczpgRm9ya2luZ01peEluYCBjbGFzcyBpcyB1c2VkIGluIHRoZSBzYW1lIHdheSwgZXhjZXB0IHRoYXQgdGhlIHNlcnZlcgogd2lsbCBzcGF3biBhIG5ldyBwcm9jZXNzIGZvciBlYWNoIHJlcXVlc3QuCitBdmFpbGFibGUgb25seSBvbiBQT1NJWCBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IDpmdW5jOmB+b3MuZm9ya2AuCisKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Nwd2QucnN0IGIvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKaW5kZXggZmQzYzlhZC4uYzZjYWQyYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3B3ZC5yc3QKQEAgLTU1LDYgKzU1LDkgQEAKIAogICAgUmV0dXJuIHRoZSBzaGFkb3cgcGFzc3dvcmQgZGF0YWJhc2UgZW50cnkgZm9yIHRoZSBnaXZlbiB1c2VyIG5hbWUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBSYWlzZXMgYSA6ZXhjOmBQZXJtaXNzaW9uRXJyb3JgIGluc3RlYWQgb2YgOmV4YzpgS2V5RXJyb3JgIGlmIHRoZSB1c2VyCisgICAgICBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KIAogLi4gZnVuY3Rpb246OiBnZXRzcGFsbCgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0IGIvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKaW5kZXggNjA1ZDhkMy4uMmNkODIzZSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3FsaXRlMy5yc3QKQEAgLTYyOSw5ICs2MjksMTYgQEAKICAgIC4uIGF0dHJpYnV0ZTo6IGxhc3Ryb3dpZAogCiAgICAgICBUaGlzIHJlYWQtb25seSBhdHRyaWJ1dGUgcHJvdmlkZXMgdGhlIHJvd2lkIG9mIHRoZSBsYXN0IG1vZGlmaWVkIHJvdy4gSXQgaXMKLSAgICAgIG9ubHkgc2V0IGlmIHlvdSBpc3N1ZWQgYW4gYGBJTlNFUlRgYCBzdGF0ZW1lbnQgdXNpbmcgdGhlIDptZXRoOmBleGVjdXRlYAotICAgICAgbWV0aG9kLiBGb3Igb3BlcmF0aW9ucyBvdGhlciB0aGFuIGBgSU5TRVJUYGAgb3Igd2hlbiA6bWV0aDpgZXhlY3V0ZW1hbnlgIGlzCi0gICAgICBjYWxsZWQsIDphdHRyOmBsYXN0cm93aWRgIGlzIHNldCB0byA6Y29uc3Q6YE5vbmVgLgorICAgICAgb25seSBzZXQgaWYgeW91IGlzc3VlZCBhbiBgYElOU0VSVGBgIG9yIGEgYGBSRVBMQUNFYGAgc3RhdGVtZW50IHVzaW5nIHRoZQorICAgICAgOm1ldGg6YGV4ZWN1dGVgIG1ldGhvZC4gIEZvciBvcGVyYXRpb25zIG90aGVyIHRoYW4gYGBJTlNFUlRgYCBvcgorICAgICAgYGBSRVBMQUNFYGAgb3Igd2hlbiA6bWV0aDpgZXhlY3V0ZW1hbnlgIGlzIGNhbGxlZCwgOmF0dHI6YGxhc3Ryb3dpZGAgaXMKKyAgICAgIHNldCB0byA6Y29uc3Q6YE5vbmVgLgorCisgICAgICBJZiB0aGUgYGBJTlNFUlRgYCBvciBgYFJFUExBQ0VgYCBzdGF0ZW1lbnQgZmFpbGVkIHRvIGluc2VydCB0aGUgcHJldmlvdXMKKyAgICAgIHN1Y2Nlc3NmdWwgcm93aWQgaXMgcmV0dXJuZWQuCisKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgYGBSRVBMQUNFYGAgc3RhdGVtZW50LgogCiAgICAuLiBhdHRyaWJ1dGU6OiBkZXNjcmlwdGlvbgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKaW5kZXggZGIxYzJkMC4uMGFkZTE3MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdApAQCAtMTQ1Myw4ICsxNDUzLDggQEAKIAogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGBgc3RyYGAgY2xhc3MgYW5kIGl0cyBtZXRob2RzLCBzZWUKICAgIDpyZWY6YHRleHRzZXFgIGFuZCB0aGUgOnJlZjpgc3RyaW5nLW1ldGhvZHNgIHNlY3Rpb24gYmVsb3cuICBUbyBvdXRwdXQKLSAgIGZvcm1hdHRlZCBzdHJpbmdzLCBzZWUgdGhlIDpyZWY6YGZvcm1hdHN0cmluZ3NgIHNlY3Rpb24uICBJbiBhZGRpdGlvbiwKLSAgIHNlZSB0aGUgOnJlZjpgc3RyaW5nc2VydmljZXNgIHNlY3Rpb24uCisgICBmb3JtYXR0ZWQgc3RyaW5ncywgc2VlIHRoZSA6cmVmOmBmLXN0cmluZ3NgIGFuZCA6cmVmOmBmb3JtYXRzdHJpbmdzYAorICAgc2VjdGlvbnMuICBJbiBhZGRpdGlvbiwgc2VlIHRoZSA6cmVmOmBzdHJpbmdzZXJ2aWNlc2Agc2VjdGlvbi4KIAogCiAuLiBpbmRleDo6CkBAIC0yMDU2LDggKzIwNTYsOCBAQAogLi4gaW5kZXg6OgogICAgc2luZ2xlOiBmb3JtYXR0aW5nLCBzdHJpbmcgKCUpCiAgICBzaW5nbGU6IGludGVycG9sYXRpb24sIHN0cmluZyAoJSkKLSAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0aW5nCi0gICBzaW5nbGU6IHN0cmluZzsgaW50ZXJwb2xhdGlvbgorICAgc2luZ2xlOiBzdHJpbmc7IGZvcm1hdHRpbmcsIHByaW50ZgorICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRpb24sIHByaW50ZgogICAgc2luZ2xlOiBwcmludGYtc3R5bGUgZm9ybWF0dGluZwogICAgc2luZ2xlOiBzcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcKICAgIHNpbmdsZTogJSBmb3JtYXR0aW5nCkBAIC0yMDY3LDkgKzIwNjcsMTAgQEAKIAogICAgVGhlIGZvcm1hdHRpbmcgb3BlcmF0aW9ucyBkZXNjcmliZWQgaGVyZSBleGhpYml0IGEgdmFyaWV0eSBvZiBxdWlya3MgdGhhdAogICAgbGVhZCB0byBhIG51bWJlciBvZiBjb21tb24gZXJyb3JzIChzdWNoIGFzIGZhaWxpbmcgdG8gZGlzcGxheSB0dXBsZXMgYW5kCi0gICBkaWN0aW9uYXJpZXMgY29ycmVjdGx5KS4gIFVzaW5nIHRoZSBuZXdlciA6bWV0aDpgc3RyLmZvcm1hdGAgaW50ZXJmYWNlCi0gICBoZWxwcyBhdm9pZCB0aGVzZSBlcnJvcnMsIGFuZCBhbHNvIHByb3ZpZGVzIGEgZ2VuZXJhbGx5IG1vcmUgcG93ZXJmdWwsCi0gICBmbGV4aWJsZSBhbmQgZXh0ZW5zaWJsZSBhcHByb2FjaCB0byBmb3JtYXR0aW5nIHRleHQuCisgICBkaWN0aW9uYXJpZXMgY29ycmVjdGx5KS4gIFVzaW5nIHRoZSBuZXdlciA6cmVmOmBmb3JtYXR0ZWQKKyAgIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAgb3IgdGhlIDptZXRoOmBzdHIuZm9ybWF0YCBpbnRlcmZhY2UKKyAgIGhlbHBzIGF2b2lkIHRoZXNlIGVycm9ycy4gIFRoZXNlIGFsdGVybmF0aXZlcyBhbHNvIHByb3ZpZGUgbW9yZSBwb3dlcmZ1bCwKKyAgIGZsZXhpYmxlIGFuZCBleHRlbnNpYmxlIGFwcHJvYWNoZXMgdG8gZm9ybWF0dGluZyB0ZXh0LgogCiBTdHJpbmcgb2JqZWN0cyBoYXZlIG9uZSB1bmlxdWUgYnVpbHQtaW4gb3BlcmF0aW9uOiB0aGUgYGAlYGAgb3BlcmF0b3IgKG1vZHVsbykuCiBUaGlzIGlzIGFsc28ga25vd24gYXMgdGhlIHN0cmluZyAqZm9ybWF0dGluZyogb3IgKmludGVycG9sYXRpb24qIG9wZXJhdG9yLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdCBiL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKaW5kZXggZDVkMjQzMC4uYzQyMWM3MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CkBAIC0xODgsNyArMTg4LDkgQEAKIAogVGhlIDptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QgYW5kIHRoZSA6Y2xhc3M6YEZvcm1hdHRlcmAgY2xhc3Mgc2hhcmUgdGhlIHNhbWUKIHN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIDpjbGFzczpgRm9ybWF0dGVyYCwKLXN1YmNsYXNzZXMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0IHN0cmluZyBzeW50YXgpLgorc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuICBUaGUgc3ludGF4IGlzCityZWxhdGVkIHRvIHRoYXQgb2YgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIGJ1dAordGhlcmUgYXJlIGRpZmZlcmVuY2VzLgogCiBGb3JtYXQgc3RyaW5ncyBjb250YWluICJyZXBsYWNlbWVudCBmaWVsZHMiIHN1cnJvdW5kZWQgYnkgY3VybHkgYnJhY2VzIGBge31gYC4KIEFueXRoaW5nIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBicmFjZXMgaXMgY29uc2lkZXJlZCBsaXRlcmFsIHRleHQsIHdoaWNoIGlzCkBAIC0yODMsNyArMjg1LDggQEAKIAogIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWQgd2l0aGluIGEKIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkIChzZWUKLTpyZWY6YGZvcm1hdHN0cmluZ3NgKS4gIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbgorOnJlZjpgZm9ybWF0c3RyaW5nc2AgYW5kIDpyZWY6YGYtc3RyaW5nc2ApLgorVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluCiA6ZnVuYzpgZm9ybWF0YCBmdW5jdGlvbi4gIEVhY2ggZm9ybWF0dGFibGUgdHlwZSBtYXkgZGVmaW5lIGhvdyB0aGUgZm9ybWF0CiBzcGVjaWZpY2F0aW9uIGlzIHRvIGJlIGludGVycHJldGVkLgogCkBAIC0zMDgsNyArMzExLDggQEAKIElmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWRlZCBieSBhICpmaWxsKgogY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgaWYgb21pdHRlZC4KIEl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgYSBsaXRlcmFsIGN1cmx5IGJyYWNlICgiYGB7YGAiIG9yICJgYH1gYCIpIGFzCi10aGUgKmZpbGwqIGNoYXJhY3RlciB3aGVuIHVzaW5nIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAKK3RoZSAqZmlsbCogY2hhcmFjdGVyIGluIGEgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsCis8Zi1zdHJpbmdzPmAgb3Igd2hlbiB1c2luZyB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgCiBtZXRob2QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgYSBjdXJseSBicmFjZQogd2l0aCBhIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZC4gIFRoaXMgbGltaXRhdGlvbiBkb2Vzbid0CiBhZmZlY3QgdGhlIDpmdW5jOmBmb3JtYXRgIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QgYi9Eb2MvbGlicmFyeS9zdWJwcm9jZXNzLnJzdAppbmRleCBmNDY5MTA3Li4zZGE0NTc0IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zdWJwcm9jZXNzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdWJwcm9jZXNzLnJzdApAQCAtNTAyLDYgKzUwMiwxMCBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjIKICAgICAgIEFkZGVkIGNvbnRleHQgbWFuYWdlciBzdXBwb3J0LgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUG9wZW4gZGVzdHJ1Y3RvciBub3cgZW1pdHMgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIHdhcm5pbmcgaWYgdGhlIGNoaWxkCisgICAgICBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisKIAogRXhjZXB0aW9ucwogXl5eXl5eXl5eXgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3lzLnJzdCBiL0RvYy9saWJyYXJ5L3N5cy5yc3QKaW5kZXggOWY3MGExMy4uYWU3YWY3YyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3lzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeXMucnN0CkBAIC0yNTYsNyArMjU2LDcgQEAKICAgIChkZWZhdWx0aW5nIHRvIHplcm8pLCBvciBhbm90aGVyIHR5cGUgb2Ygb2JqZWN0LiAgSWYgaXQgaXMgYW4gaW50ZWdlciwgemVybwogICAgaXMgY29uc2lkZXJlZCAic3VjY2Vzc2Z1bCB0ZXJtaW5hdGlvbiIgYW5kIGFueSBub256ZXJvIHZhbHVlIGlzIGNvbnNpZGVyZWQKICAgICJhYm5vcm1hbCB0ZXJtaW5hdGlvbiIgYnkgc2hlbGxzIGFuZCB0aGUgbGlrZS4gIE1vc3Qgc3lzdGVtcyByZXF1aXJlIGl0IHRvIGJlCi0gICBpbiB0aGUgcmFuZ2UgMC0xMjcsIGFuZCBwcm9kdWNlIHVuZGVmaW5lZCByZXN1bHRzIG90aGVyd2lzZS4gIFNvbWUgc3lzdGVtcworICAgaW4gdGhlIHJhbmdlIDAtLTEyNywgYW5kIHByb2R1Y2UgdW5kZWZpbmVkIHJlc3VsdHMgb3RoZXJ3aXNlLiAgU29tZSBzeXN0ZW1zCiAgICBoYXZlIGEgY29udmVudGlvbiBmb3IgYXNzaWduaW5nIHNwZWNpZmljIG1lYW5pbmdzIHRvIHNwZWNpZmljIGV4aXQgY29kZXMsIGJ1dAogICAgdGhlc2UgYXJlIGdlbmVyYWxseSB1bmRlcmRldmVsb3BlZDsgVW5peCBwcm9ncmFtcyBnZW5lcmFsbHkgdXNlIDIgZm9yIGNvbW1hbmQKICAgIGxpbmUgc3ludGF4IGVycm9ycyBhbmQgMSBmb3IgYWxsIG90aGVyIGtpbmQgb2YgZXJyb3JzLiAgSWYgYW5vdGhlciB0eXBlIG9mCkBAIC0yNjksNiArMjY5LDExIEBACiAgICB0aGUgcHJvY2VzcyB3aGVuIGNhbGxlZCBmcm9tIHRoZSBtYWluIHRocmVhZCwgYW5kIHRoZSBleGNlcHRpb24gaXMgbm90CiAgICBpbnRlcmNlcHRlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIElmIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgY2xlYW51cCBhZnRlciB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICAgICBoYXMgY2F1Z2h0IDpleGM6YFN5c3RlbUV4aXRgIChzdWNoIGFzIGFuIGVycm9yIGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEKKyAgICAgIGluIHRoZSBzdGFuZGFyZCBzdHJlYW1zKSwgdGhlIGV4aXQgc3RhdHVzIGlzIGNoYW5nZWQgdG8gMTIwLgorCiAKIC4uIGRhdGE6OiBmbGFncwogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0IGIvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdAppbmRleCAwYjBkZjliLi5hMTE1YmVhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CisrKyBiL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKQEAgLTE2NCw3ICsxNjQsNyBAQAogLi4gZnVuY3Rpb246OiBnZXRfcHl0aG9uX3ZlcnNpb24oKQogCiAgICBSZXR1cm4gdGhlIGBgTUFKT1IuTUlOT1JgYCBQeXRob24gdmVyc2lvbiBudW1iZXIgYXMgYSBzdHJpbmcuICBTaW1pbGFyIHRvCi0gICBgYHN5cy52ZXJzaW9uWzozXWBgLgorICAgYGAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml1gYC4KIAogCiAuLiBmdW5jdGlvbjo6IGdldF9wbGF0Zm9ybSgpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0IGIvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdAppbmRleCBiOTUwZTQxLi5mOWM1MTUzIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKQEAgLTQzLDYgKzQzLDE3IEBACiAgICA6ZXhjOmBFT0ZFcnJvcmAgd2hlbiB0aGUgZW5kIG9mIHRoZSBjb25uZWN0aW9uIGlzIHJlYWQsIGJlY2F1c2UgdGhleSBjYW4gcmV0dXJuCiAgICBhbiBlbXB0eSBzdHJpbmcgZm9yIG90aGVyIHJlYXNvbnMuICBTZWUgdGhlIGluZGl2aWR1YWwgZGVzY3JpcHRpb25zIGJlbG93LgogCisgICBBIDpjbGFzczpgVGVsbmV0YCBvYmplY3QgaXMgYSBjb250ZXh0IG1hbmFnZXIgYW5kIGNhbiBiZSB1c2VkIGluIGEKKyAgIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQuICBXaGVuIHRoZSA6a2V5d29yZDpgd2l0aGAgYmxvY2sgZW5kcywgdGhlCisgICA6bWV0aDpgY2xvc2VgIG1ldGhvZCBpcyBjYWxsZWQ6OgorCisgICAgICAgPj4+IGZyb20gdGVsbmV0bGliIGltcG9ydCBUZWxuZXQKKyAgICAgICA+Pj4gd2l0aCBUZWxuZXQoJ2xvY2FsaG9zdCcsIDIzKSBhcyB0bjoKKyAgICAgICAuLi4gICAgIHRuLmludGVyYWN0KCkKKyAgICAgICAuLi4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQgYWRkZWQKKwogCiAuLiBzZWVhbHNvOjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGVzdC5yc3QgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdAppbmRleCAyZWE5YzI3Li43MTE0Y2RmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS90ZXN0LnJzdApAQCAtNTgyLDYgKzU4Miw0OCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKIAorLi4gZnVuY3Rpb246OiBjaGVja19fYWxsX18odGVzdF9jYXNlLCBtb2R1bGUsIG5hbWVfb2ZfbW9kdWxlPU5vbmUsIGV4dHJhPSgpLCBibGFja2xpc3Q9KCkpCisKKyAgIEFzc2VydCB0aGF0IHRoZSBgYF9fYWxsX19gYCB2YXJpYWJsZSBvZiAqbW9kdWxlKiBjb250YWlucyBhbGwgcHVibGljIG5hbWVzLgorCisgICBUaGUgbW9kdWxlJ3MgcHVibGljIG5hbWVzIChpdHMgQVBJKSBhcmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseQorICAgYmFzZWQgb24gd2hldGhlciB0aGV5IG1hdGNoIHRoZSBwdWJsaWMgbmFtZSBjb252ZW50aW9uIGFuZCB3ZXJlIGRlZmluZWQgaW4KKyAgICptb2R1bGUqLgorCisgICBUaGUgKm5hbWVfb2ZfbW9kdWxlKiBhcmd1bWVudCBjYW4gc3BlY2lmeSAoYXMgYSBzdHJpbmcgb3IgdHVwbGUgdGhlcmVvZikgd2hhdAorICAgbW9kdWxlKHMpIGFuIEFQSSBjb3VsZCBiZSBkZWZpbmVkIGluIGluIG9yZGVyIHRvIGJlIGRldGVjdGVkIGFzIGEgcHVibGljCisgICBBUEkuIE9uZSBjYXNlIGZvciB0aGlzIGlzIHdoZW4gKm1vZHVsZSogaW1wb3J0cyBwYXJ0IG9mIGl0cyBwdWJsaWMgQVBJIGZyb20KKyAgIG90aGVyIG1vZHVsZXMsIHBvc3NpYmx5IGEgQyBiYWNrZW5kIChsaWtlIGBgY3N2YGAgYW5kIGl0cyBgYF9jc3ZgYCkuCisKKyAgIFRoZSAqZXh0cmEqIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IHdvdWxkbid0IG90aGVyd2lzZSBiZSBhdXRvbWF0aWNhbGx5CisgICBkZXRlY3RlZCBhcyAicHVibGljIiwgbGlrZSBvYmplY3RzIHdpdGhvdXQgYSBwcm9wZXIgYGBfX21vZHVsZV9fYGAKKyAgIGF0dHJpYnV0ZS4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgb25lcy4KKworICAgVGhlICpibGFja2xpc3QqIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgcGFydCBvZgorICAgdGhlIHB1YmxpYyBBUEkgZXZlbiB0aG91Z2ggdGhlaXIgbmFtZXMgaW5kaWNhdGUgb3RoZXJ3aXNlLgorCisgICBFeGFtcGxlIHVzZTo6CisKKyAgICAgIGltcG9ydCBiYXIKKyAgICAgIGltcG9ydCBmb28KKyAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKyAgICAgIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBmb28pCisKKyAgICAgIGNsYXNzIE90aGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgZXh0cmEgPSB7J0JBUl9DT05TVCcsICdGT09fQ09OU1QnfQorICAgICAgICAgICAgICBibGFja2xpc3QgPSB7J2Jheid9ICAjIFVuZG9jdW1lbnRlZCBuYW1lLgorICAgICAgICAgICAgICAjIGJhciBpbXBvcnRzIHBhcnQgb2YgaXRzIEFQSSBmcm9tIF9iYXIuCisgICAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGJhciwgKCdiYXInLCAnX2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogVGhlIDptb2Q6YHRlc3Quc3VwcG9ydGAgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBjbGFzc2VzOgogCiAuLiBjbGFzczo6IFRyYW5zaWVudFJlc291cmNlKGV4YywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90aW1lLnJzdCBiL0RvYy9saWJyYXJ5L3RpbWUucnN0CmluZGV4IGU2NjI2ZjIuLjdjODFjZTcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RpbWUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3RpbWUucnN0CkBAIC02MzcsMTEgKzYzNywxMSBAQAogICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcmVmZXIgdG8gRmVicnVhcnkgMjkuCiAKICAgICAgIDpzYW1wOmBNe219LntufS57ZH1gCi0gICAgICAgICBUaGUgKmQqJ3RoIGRheSAoMCA8PSAqZCogPD0gNikgb3Igd2VlayAqbiogb2YgbW9udGggKm0qIG9mIHRoZSB5ZWFyICgxCisgICAgICAgICBUaGUgKmQqJ3RoIGRheSAoMCA8PSAqZCogPD0gNikgb2Ygd2VlayAqbiogb2YgbW9udGggKm0qIG9mIHRoZSB5ZWFyICgxCiAgICAgICAgICA8PSAqbiogPD0gNSwgMSA8PSAqbSogPD0gMTIsIHdoZXJlIHdlZWsgNSBtZWFucyAidGhlIGxhc3QgKmQqIGRheSBpbgogICAgICAgICAgbW9udGggKm0qIiB3aGljaCBtYXkgb2NjdXIgaW4gZWl0aGVyIHRoZSBmb3VydGggb3IgdGhlIGZpZnRoCiAgICAgICAgICB3ZWVrKS4gV2VlayAxIGlzIHRoZSBmaXJzdCB3ZWVrIGluIHdoaWNoIHRoZSAqZCondGggZGF5IG9jY3Vycy4gRGF5Ci0gICAgICAgICB6ZXJvIGlzIFN1bmRheS4KKyAgICAgICAgIHplcm8gaXMgYSBTdW5kYXkuCiAKICAgICAgIGBgdGltZWBgIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgYGBvZmZzZXRgYCBleGNlcHQgdGhhdCBubyBsZWFkaW5nIHNpZ24KICAgICAgICgnLScgb3IgJysnKSBpcyBhbGxvd2VkLiBUaGUgZGVmYXVsdCwgaWYgdGltZSBpcyBub3QgZ2l2ZW4sIGlzIDAyOjAwOjAwLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0IGIvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0CmluZGV4IDNhMGIxZTAuLmY1NmYyN2IgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdAorKysgYi9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QKQEAgLTM1OSwxMCArMzU5LDMyIEBACiAgICBTZWUgYWxzbyB0aGUgOmZ1bmM6YGdldF9vYmplY3RfdHJhY2ViYWNrYCBmdW5jdGlvbi4KIAogCitEb21haW5GaWx0ZXIKK15eXl5eXl5eXl5eXgorCisuLiBjbGFzczo6IERvbWFpbkZpbHRlcihpbmNsdXNpdmU6IGJvb2wsIGRvbWFpbjogaW50KQorCisgICBGaWx0ZXIgdHJhY2VzIG9mIG1lbW9yeSBibG9ja3MgYnkgdGhlaXIgYWRkcmVzcyBzcGFjZSAoZG9tYWluKS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgIC4uIGF0dHJpYnV0ZTo6IGluY2x1c2l2ZQorCisgICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYFRydWVgYCAoaW5jbHVkZSksIG1hdGNoIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICBpbiB0aGUgYWRkcmVzcyBzcGFjZSA6YXR0cjpgZG9tYWluYC4KKworICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBGYWxzZWBgIChleGNsdWRlKSwgbWF0Y2ggbWVtb3J5IGJsb2NrcyBub3QgYWxsb2NhdGVkCisgICAgICBpbiB0aGUgYWRkcmVzcyBzcGFjZSA6YXR0cjpgZG9tYWluYC4KKworICAgLi4gYXR0cmlidXRlOjogZG9tYWluCisKKyAgICAgIEFkZHJlc3Mgc3BhY2Ugb2YgYSBtZW1vcnkgYmxvY2sgKGBgaW50YGApLiBSZWFkLW9ubHkgcHJvcGVydHkuCisKKwogRmlsdGVyCiBeXl5eXl4KIAotLi4gY2xhc3M6OiBGaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBmaWxlbmFtZV9wYXR0ZXJuOiBzdHIsIGxpbmVubzogaW50PU5vbmUsIGFsbF9mcmFtZXM6IGJvb2w9RmFsc2UpCisuLiBjbGFzczo6IEZpbHRlcihpbmNsdXNpdmU6IGJvb2wsIGZpbGVuYW1lX3BhdHRlcm46IHN0ciwgbGluZW5vOiBpbnQ9Tm9uZSwgYWxsX2ZyYW1lczogYm9vbD1GYWxzZSwgZG9tYWluOiBpbnQ9Tm9uZSkKIAogICAgRmlsdGVyIG9uIHRyYWNlcyBvZiBtZW1vcnkgYmxvY2tzLgogCkBAIC0zODIsOSArNDA0LDE3IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgVGhlIGBgJy5weW8nYGAgZmlsZSBleHRlbnNpb24gaXMgbm8gbG9uZ2VyIHJlcGxhY2VkIHdpdGggYGAnLnB5J2BgLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlIDphdHRyOmBkb21haW5gIGF0dHJpYnV0ZS4KKworCisgICAuLiBhdHRyaWJ1dGU6OiBkb21haW4KKworICAgICAgQWRkcmVzcyBzcGFjZSBvZiBhIG1lbW9yeSBibG9jayAoYGBpbnRgYCBvciBgYE5vbmVgYCkuCisKICAgIC4uIGF0dHJpYnV0ZTo6IGluY2x1c2l2ZQogCi0gICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYFRydWVgYCAoaW5jbHVkZSksIG9ubHkgdHJhY2UgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQKKyAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgVHJ1ZWBgIChpbmNsdWRlKSwgb25seSBtYXRjaCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAogICAgICAgaW4gYSBmaWxlIHdpdGggYSBuYW1lIG1hdGNoaW5nIDphdHRyOmBmaWxlbmFtZV9wYXR0ZXJuYCBhdCBsaW5lIG51bWJlcgogICAgICAgOmF0dHI6YGxpbmVub2AuCiAKQEAgLTM5OSw3ICs0MjksNyBAQAogCiAgICAuLiBhdHRyaWJ1dGU6OiBmaWxlbmFtZV9wYXR0ZXJuCiAKLSAgICAgIEZpbGVuYW1lIHBhdHRlcm4gb2YgdGhlIGZpbHRlciAoYGBzdHJgYCkuCisgICAgICBGaWxlbmFtZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgKGBgc3RyYGApLiBSZWFkLW9ubHkgcHJvcGVydHkuCiAKICAgIC4uIGF0dHJpYnV0ZTo6IGFsbF9mcmFtZXMKIApAQCAtNDYyLDE0ICs0OTIsMTcgQEAKICAgIC4uIG1ldGhvZDo6IGZpbHRlcl90cmFjZXMoZmlsdGVycykKIAogICAgICAgQ3JlYXRlIGEgbmV3IDpjbGFzczpgU25hcHNob3RgIGluc3RhbmNlIHdpdGggYSBmaWx0ZXJlZCA6YXR0cjpgdHJhY2VzYAotICAgICAgc2VxdWVuY2UsICpmaWx0ZXJzKiBpcyBhIGxpc3Qgb2YgOmNsYXNzOmBGaWx0ZXJgIGluc3RhbmNlcy4gIElmICpmaWx0ZXJzKgotICAgICAgaXMgYW4gZW1wdHkgbGlzdCwgcmV0dXJuIGEgbmV3IDpjbGFzczpgU25hcHNob3RgIGluc3RhbmNlIHdpdGggYSBjb3B5IG9mCi0gICAgICB0aGUgdHJhY2VzLgorICAgICAgc2VxdWVuY2UsICpmaWx0ZXJzKiBpcyBhIGxpc3Qgb2YgOmNsYXNzOmBEb21haW5GaWx0ZXJgIGFuZAorICAgICAgOmNsYXNzOmBGaWx0ZXJgIGluc3RhbmNlcy4gIElmICpmaWx0ZXJzKiBpcyBhbiBlbXB0eSBsaXN0LCByZXR1cm4gYSBuZXcKKyAgICAgIDpjbGFzczpgU25hcHNob3RgIGluc3RhbmNlIHdpdGggYSBjb3B5IG9mIHRoZSB0cmFjZXMuCiAKICAgICAgIEFsbCBpbmNsdXNpdmUgZmlsdGVycyBhcmUgYXBwbGllZCBhdCBvbmNlLCBhIHRyYWNlIGlzIGlnbm9yZWQgaWYgbm8KICAgICAgIGluY2x1c2l2ZSBmaWx0ZXJzIG1hdGNoIGl0LiBBIHRyYWNlIGlzIGlnbm9yZWQgaWYgYXQgbGVhc3Qgb25lIGV4Y2x1c2l2ZQogICAgICAgZmlsdGVyIG1hdGNoZXMgaXQuCiAKKyAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICA6Y2xhc3M6YERvbWFpbkZpbHRlcmAgaW5zdGFuY2VzIGFyZSBub3cgYWxzbyBhY2NlcHRlZCBpbiAqZmlsdGVycyouCisKIAogICAgLi4gY2xhc3NtZXRob2Q6OiBsb2FkKGZpbGVuYW1lKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS90eXBpbmcucnN0IGIvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdAppbmRleCAzMTcyMjlkLi45ZmE1NDNjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90eXBpbmcucnN0CisrKyBiL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QKQEAgLTM0NywxMSArMzQ3LDE1IEBACiAKIC4uIGNsYXNzOjogSXRlcmFibGUoR2VuZXJpY1tUX2NvXSkKIAotICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZWAuCisgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVgLgogCiAuLiBjbGFzczo6IEl0ZXJhdG9yKEl0ZXJhYmxlW1RfY29dKQogCi0gICAgQSBnZW5lcmljIHZlcnNpb24gb2YgdGhlIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhdG9yYC4KKyAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYXRvcmAuCisKKy4uIGNsYXNzOjogUmV2ZXJzaWJsZShJdGVyYWJsZVtUX2NvXSkKKworICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLlJldmVyc2libGVgLgogCiAuLiBjbGFzczo6IFN1cHBvcnRzSW50CiAKQEAgLTM3MSwxMSArMzc1LDYgQEAKICAgICBBbiBBQkMgd2l0aCBvbmUgYWJzdHJhY3QgbWV0aG9kIGBgX19yb3VuZF9fYGAKICAgICB0aGF0IGlzIGNvdmFyaWFudCBpbiBpdHMgcmV0dXJuIHR5cGUuCiAKLS4uIGNsYXNzOjogUmV2ZXJzaWJsZQotCi0gICAgQW4gQUJDIHdpdGggb25lIGFic3RyYWN0IG1ldGhvZCBgYF9fcmV2ZXJzZWRfX2BgIHJldHVybmluZwotICAgIGFuIGBgSXRlcmF0b3JbVF9jb11gYC4KLQogLi4gY2xhc3M6OiBDb250YWluZXIoR2VuZXJpY1tUX2NvXSkKIAogICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcmAuCkBAIC0zOTYsNyArMzk1LDcgQEAKIAogICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nYC4KIAotLi4gY2xhc3M6OiBTZXF1ZW5jZShTaXplZCwgSXRlcmFibGVbVF9jb10sIENvbnRhaW5lcltUX2NvXSkKKy4uIGNsYXNzOjogU2VxdWVuY2UoU2l6ZWQsIFJldmVyc2libGVbVF9jb10sIENvbnRhaW5lcltUX2NvXSkKIAogICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlYC4KIApAQCAtNDUxLDYgKzQ1MCwxMiBAQAogCiAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5WYWx1ZXNWaWV3YC4KIAorLi4gY2xhc3M6OiBDb250ZXh0TWFuYWdlcihHZW5lcmljW1RfY29dKQorCisgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBjbGFzczo6IERpY3QoZGljdCwgTXV0YWJsZU1hcHBpbmdbS1QsIFZUXSkKIAogICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBkaWN0YC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0IGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QubW9jay5yc3QKaW5kZXggNWM5MTc3YS4uZjU1OWQ3MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QubW9jay5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QubW9jay5yc3QKQEAgLTI2Miw2ICsyNjIsMzQgQEAKICAgICB1c2VkIHRvIHNldCBhdHRyaWJ1dGVzIG9uIHRoZSBtb2NrIGFmdGVyIGl0IGlzIGNyZWF0ZWQuIFNlZSB0aGUKICAgICA6bWV0aDpgY29uZmlndXJlX21vY2tgIG1ldGhvZCBmb3IgZGV0YWlscy4KIAorICAgIC4uIG1ldGhvZDo6IGFzc2VydF9jYWxsZWQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIEFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KKworICAgICAgICAgICAgPj4+IG1vY2sgPSBNb2NrKCkKKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZCgpCisgICAgICAgICAgICA8TW9jayBuYW1lPSdtb2NrLm1ldGhvZCgpJyBpZD0nLi4uJz4KKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZC5hc3NlcnRfY2FsbGVkKCkKKworICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgIC4uIG1ldGhvZDo6IGFzc2VydF9jYWxsZWRfb25jZSgqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgQXNzZXJ0IHRoYXQgdGhlIG1vY2sgd2FzIGNhbGxlZCBleGFjdGx5IG9uY2UuCisKKyAgICAgICAgICAgID4+PiBtb2NrID0gTW9jaygpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZCgpCisgICAgICAgICAgICA8TW9jayBuYW1lPSdtb2NrLm1ldGhvZCgpJyBpZD0nLi4uJz4KKyAgICAgICAgICAgID4+PiBtb2NrLm1ldGhvZC5hc3NlcnRfY2FsbGVkX29uY2UoKQorICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAgICAgLi4uCisgICAgICAgICAgICBBc3NlcnRpb25FcnJvcjogRXhwZWN0ZWQgJ21ldGhvZCcgdG8gaGF2ZSBiZWVuIGNhbGxlZCBvbmNlLiBDYWxsZWQgMiB0aW1lcy4KKworICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogCiAgICAgLi4gbWV0aG9kOjogYXNzZXJ0X2NhbGxlZF93aXRoKCphcmdzLCAqKmt3YXJncykKIApAQCAtMzM5LDcgKzM2Nyw3IEBACiAgICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCiAKLSAgICAuLiBtZXRob2Q6OiByZXNldF9tb2NrKCkKKyAgICAuLiBtZXRob2Q6OiByZXNldF9tb2NrKCosIHJldHVybl92YWx1ZT1GYWxzZSwgc2lkZV9lZmZlY3Q9RmFsc2UpCiAKICAgICAgICAgVGhlIHJlc2V0X21vY2sgbWV0aG9kIHJlc2V0cyBhbGwgdGhlIGNhbGwgYXR0cmlidXRlcyBvbiBhIG1vY2sgb2JqZWN0OgogCkBAIC0zNTEsMTIgKzM3OSwyMCBAQAogICAgICAgICAgICAgPj4+IG1vY2suY2FsbGVkCiAgICAgICAgICAgICBGYWxzZQogCisgICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICAgIEFkZGVkIHR3byBrZXl3b3JkIG9ubHkgYXJndW1lbnQgdG8gdGhlIHJlc2V0X21vY2sgZnVuY3Rpb24uCisKICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZnVsIHdoZXJlIHlvdSB3YW50IHRvIG1ha2UgYSBzZXJpZXMgb2YgYXNzZXJ0aW9ucyB0aGF0CiAgICAgICAgIHJldXNlIHRoZSBzYW1lIG9iamVjdC4gTm90ZSB0aGF0IDptZXRoOmByZXNldF9tb2NrYCAqZG9lc24ndCogY2xlYXIgdGhlCiAgICAgICAgIHJldHVybiB2YWx1ZSwgOmF0dHI6YHNpZGVfZWZmZWN0YCBvciBhbnkgY2hpbGQgYXR0cmlidXRlcyB5b3UgaGF2ZQotICAgICAgICBzZXQgdXNpbmcgbm9ybWFsIGFzc2lnbm1lbnQuIENoaWxkIG1vY2tzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG1vY2sKKyAgICAgICAgc2V0IHVzaW5nIG5vcm1hbCBhc3NpZ25tZW50IGJ5IGRlZmF1bHQuIEluIGNhc2UgeW91IHdhbnQgdG8gcmVzZXQKKyAgICAgICAgKnJldHVybl92YWx1ZSogb3IgOmF0dHI6YHNpZGVfZWZmZWN0YCwgdGhlbiBwYXNzIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHBhcmFtZXRlciBhcyBgYFRydWVgYC4gQ2hpbGQgbW9ja3MgYW5kIHRoZSByZXR1cm4gdmFsdWUgbW9jawogICAgICAgICAoaWYgYW55KSBhcmUgcmVzZXQgYXMgd2VsbC4KIAorICAgICAgICAuLiBub3RlOjogKnJldHVybl92YWx1ZSosIGFuZCA6YXR0cjpgc2lkZV9lZmZlY3RgIGFyZSBrZXl3b3JkIG9ubHkKKyAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LgorCiAKICAgICAuLiBtZXRob2Q6OiBtb2NrX2FkZF9zcGVjKHNwZWMsIHNwZWNfc2V0PUZhbHNlKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKaW5kZXggMGZjMDJjNC4uMWQ1Zjg2OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdApAQCAtMTM5Myw5ICsxMzkzLDkgQEAKIAogICAgICAgQWRkIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIDptZXRoOmB0ZWFyRG93bmAgdG8gY2xlYW51cCByZXNvdXJjZXMKICAgICAgIHVzZWQgZHVyaW5nIHRoZSB0ZXN0LiBGdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlciB0byB0aGUKLSAgICAgIG9yZGVyIHRoZXkgYXJlIGFkZGVkIChMSUZPKS4gVGhleSBhcmUgY2FsbGVkIHdpdGggYW55IGFyZ3VtZW50cyBhbmQKLSAgICAgIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCBpbnRvIDptZXRoOmBhZGRDbGVhbnVwYCB3aGVuIHRoZXkgYXJlCi0gICAgICBhZGRlZC4KKyAgICAgIG9yZGVyIHRoZXkgYXJlIGFkZGVkICg6YWJicjpgTElGTyAobGFzdC1pbiwgZmlyc3Qtb3V0KWApLiAgVGhleQorICAgICAgYXJlIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMgYW5kIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCBpbnRvCisgICAgICA6bWV0aDpgYWRkQ2xlYW51cGAgd2hlbiB0aGV5IGFyZSBhZGRlZC4KIAogICAgICAgSWYgOm1ldGg6YHNldFVwYCBmYWlscywgbWVhbmluZyB0aGF0IDptZXRoOmB0ZWFyRG93bmAgaXMgbm90IGNhbGxlZCwKICAgICAgIHRoZW4gYW55IGNsZWFudXAgZnVuY3Rpb25zIGFkZGVkIHdpbGwgc3RpbGwgYmUgY2FsbGVkLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdCBiL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKaW5kZXggYzZkZTIzMC4uZDc5ZDhmMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdAorKysgYi9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CkBAIC0xMTQsOCArMTE0LDkgQEAKICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgaWYgcHJlc2VudCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAogICAgKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKLSAgIFNlZSBzZWN0aW9uIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQKLSAgIG9iamVjdC4KKyAgIFJlYWRpbmcgdGhlIDphdHRyOmBwb3J0YCBhdHRyaWJ1dGUgd2lsbCByYWlzZSBhIDpleGM6YFZhbHVlRXJyb3JgIGlmCisgICBhbiBpbnZhbGlkIHBvcnQgaXMgc3BlY2lmaWVkIGluIHRoZSBVUkwuICBTZWUgc2VjdGlvbgorICAgOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdCBvYmplY3QuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCiAgICAgICBBZGRlZCBJUHY2IFVSTCBwYXJzaW5nIGNhcGFiaWxpdGllcy4KQEAgLTEyNSw2ICsxMjYsMTAgQEAKICAgICAgIGZhbHNlKSwgaW4gYWNjb3JkYW5jZSB3aXRoIDpyZmM6YDM5ODZgLiAgUHJldmlvdXNseSwgYSB3aGl0ZWxpc3Qgb2YKICAgICAgIHNjaGVtZXMgdGhhdCBzdXBwb3J0IGZyYWdtZW50cyBleGlzdGVkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgT3V0LW9mLXJhbmdlIHBvcnQgbnVtYmVycyBub3cgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGluc3RlYWQgb2YKKyAgICAgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLgorCiAKIC4uIGZ1bmN0aW9uOjogcGFyc2VfcXMocXMsIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlLCBzdHJpY3RfcGFyc2luZz1GYWxzZSwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSdyZXBsYWNlJykKIApAQCAtMjI3LDggKzIzMiwxMyBAQAogICAgfCAgICAgICAgICAgICAgICAgIHwgICAgICAgfCBpZiBwcmVzZW50ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKLSAgIFNlZSBzZWN0aW9uIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQKLSAgIG9iamVjdC4KKyAgIFJlYWRpbmcgdGhlIDphdHRyOmBwb3J0YCBhdHRyaWJ1dGUgd2lsbCByYWlzZSBhIDpleGM6YFZhbHVlRXJyb3JgIGlmCisgICBhbiBpbnZhbGlkIHBvcnQgaXMgc3BlY2lmaWVkIGluIHRoZSBVUkwuICBTZWUgc2VjdGlvbgorICAgOnJlZjpgdXJscGFyc2UtcmVzdWx0LW9iamVjdGAgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHJlc3VsdCBvYmplY3QuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBPdXQtb2YtcmFuZ2UgcG9ydCBudW1iZXJzIG5vdyByYWlzZSA6ZXhjOmBWYWx1ZUVycm9yYCwgaW5zdGVhZCBvZgorICAgICAgcmV0dXJuaW5nIDpjb25zdDpgTm9uZWAuCiAKIAogLi4gZnVuY3Rpb246OiB1cmx1bnNwbGl0KHBhcnRzKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdCBiL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKaW5kZXggYmE3MDFjMy4uN2QzMTkzMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdAorKysgYi9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CkBAIC01NywxNSArNTcsNDEgQEAKICAgICAgIFNldHMgdGhlIHRpbWUgdGhlIGBgcm9ib3RzLnR4dGBgIGZpbGUgd2FzIGxhc3QgZmV0Y2hlZCB0byB0aGUgY3VycmVudAogICAgICAgdGltZS4KIAorICAgLi4gbWV0aG9kOjogY3Jhd2xfZGVsYXkodXNlcmFnZW50KQogCi1UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGJhc2ljIHVzZSBvZiB0aGUgUm9ib3RGaWxlUGFyc2VyIGNsYXNzLgorICAgICAgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGBgQ3Jhd2wtZGVsYXlgYCBwYXJhbWV0ZXIgZnJvbSBgYHJvYm90cy50eHRgYAorICAgICAgZm9yIHRoZSAqdXNlcmFnZW50KiBpbiBxdWVzdGlvbi4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggcGFyYW1ldGVyIG9yIGl0CisgICAgICBkb2Vzbid0IGFwcGx5IHRvIHRoZSAqdXNlcmFnZW50KiBzcGVjaWZpZWQgb3IgdGhlIGBgcm9ib3RzLnR4dGBgIGVudHJ5CisgICAgICBmb3IgdGhpcyBwYXJhbWV0ZXIgaGFzIGludmFsaWQgc3ludGF4LCByZXR1cm4gYGBOb25lYGAuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAuLiBtZXRob2Q6OiByZXF1ZXN0X3JhdGUodXNlcmFnZW50KQorCisgICAgICBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgYGBSZXF1ZXN0LXJhdGVgYCBwYXJhbWV0ZXIgZnJvbQorICAgICAgYGByb2JvdHMudHh0YGAgaW4gdGhlIGZvcm0gb2YgYSA6ZnVuYzpgfmNvbGxlY3Rpb25zLm5hbWVkdHVwbGVgCisgICAgICBgYChyZXF1ZXN0cywgc2Vjb25kcylgYC4gIElmIHRoZXJlIGlzIG5vIHN1Y2ggcGFyYW1ldGVyIG9yIGl0IGRvZXNuJ3QKKyAgICAgIGFwcGx5IHRvIHRoZSAqdXNlcmFnZW50KiBzcGVjaWZpZWQgb3IgdGhlIGBgcm9ib3RzLnR4dGBgIGVudHJ5IGZvciB0aGlzCisgICAgICBwYXJhbWV0ZXIgaGFzIGludmFsaWQgc3ludGF4LCByZXR1cm4gYGBOb25lYGAuCisKKyAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYmFzaWMgdXNlIG9mIHRoZSA6Y2xhc3M6YFJvYm90RmlsZVBhcnNlcmAKK2NsYXNzOjoKIAogICAgPj4+IGltcG9ydCB1cmxsaWIucm9ib3RwYXJzZXIKICAgID4+PiBycCA9IHVybGxpYi5yb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXIoKQogICAgPj4+IHJwLnNldF91cmwoImh0dHA6Ly93d3cubXVzaS1jYWwuY29tL3JvYm90cy50eHQiKQogICAgPj4+IHJwLnJlYWQoKQorICAgPj4+IHJyYXRlID0gcnAucmVxdWVzdF9yYXRlKCIqIikKKyAgID4+PiBycmF0ZS5yZXF1ZXN0cworICAgMworICAgPj4+IHJyYXRlLnNlY29uZHMKKyAgIDIwCisgICA+Pj4gcnAuY3Jhd2xfZGVsYXkoIioiKQorICAgNgogICAgPj4+IHJwLmNhbl9mZXRjaCgiKiIsICJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS9jZ2ktYmluL3NlYXJjaD9jaXR5PVNhbitGcmFuY2lzY28iKQogICAgRmFsc2UKICAgID4+PiBycC5jYW5fZmV0Y2goIioiLCAiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vIikKICAgIFRydWUKLQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0IGIvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CmluZGV4IDUyMTIxMzEuLmZhNDc5NjUgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdAorKysgYi9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKQEAgLTMwMCw3ICszMDAsNyBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLS4uIGZ1bmN0aW9uOjogd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpCisuLiBmdW5jdGlvbjo6IHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xLCBzb3VyY2U9Tm9uZSkKIAogICAgSXNzdWUgYSB3YXJuaW5nLCBvciBtYXliZSBpZ25vcmUgaXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLiAgVGhlICpjYXRlZ29yeSoKICAgIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhIHdhcm5pbmcgY2F0ZWdvcnkgY2xhc3MgKHNlZSBhYm92ZSk7IGl0IGRlZmF1bHRzIHRvCkBAIC0zMTgsOCArMzE4LDE0IEBACiAgICBzb3VyY2Ugb2YgOmZ1bmM6YGRlcHJlY2F0aW9uYCBpdHNlbGYgKHNpbmNlIHRoZSBsYXR0ZXIgd291bGQgZGVmZWF0IHRoZSBwdXJwb3NlCiAgICBvZiB0aGUgd2FybmluZyBtZXNzYWdlKS4KIAorICAgKnNvdXJjZSosIGlmIHN1cHBsaWVkLCBpcyB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKyAgIDpleGM6YFJlc291cmNlV2FybmluZ2AuCiAKLS4uIGZ1bmN0aW9uOjogd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgKnNvdXJjZSogcGFyYW1ldGVyLgorCisKKy4uIGZ1bmN0aW9uOjogd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUsIHNvdXJjZT1Ob25lKQogCiAgICBUaGlzIGlzIGEgbG93LWxldmVsIGludGVyZmFjZSB0byB0aGUgZnVuY3Rpb25hbGl0eSBvZiA6ZnVuYzpgd2FybmAsIHBhc3NpbmcgaW4KICAgIGV4cGxpY2l0bHkgdGhlIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSBhbmQgbGluZSBudW1iZXIsIGFuZCBvcHRpb25hbGx5IHRoZQpAQCAtMzM1LDYgKzM0MSwxMiBAQAogICAgc291cmNlIGZvciBtb2R1bGVzIGZvdW5kIGluIHppcGZpbGVzIG9yIG90aGVyIG5vbi1maWxlc3lzdGVtIGltcG9ydAogICAgc291cmNlcykuCiAKKyAgICpzb3VyY2UqLCBpZiBzdXBwbGllZCwgaXMgdGhlIGRlc3Ryb3llZCBvYmplY3Qgd2hpY2ggZW1pdHRlZCBhCisgICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkIHRoZSAqc291cmNlKiBwYXJhbWV0ZXIuCisKIAogLi4gZnVuY3Rpb246OiBzaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QgYi9Eb2MvbGlicmFyeS93aW5yZWcucnN0CmluZGV4IDUyZDU5MWEuLjQ4YmRmMTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd2lucmVnLnJzdApAQCAtNjM1LDcgKzYzNSw3IEBACiAKIC4uIGRhdGE6OiBSRUdfRFdPUkRfTElUVExFX0VORElBTgogCi0gICBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuCisgICBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gOmNvbnN0OmBSRUdfRFdPUkRgLgogCiAuLiBkYXRhOjogUkVHX0RXT1JEX0JJR19FTkRJQU4KIApAQCAtNjU5LDYgKzY1OSwxOCBAQAogCiAgICBObyBkZWZpbmVkIHZhbHVlIHR5cGUuCiAKKy4uIGRhdGE6OiBSRUdfUVdPUkQKKworICAgQSA2NC1iaXQgbnVtYmVyLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworLi4gZGF0YTo6IFJFR19RV09SRF9MSVRUTEVfRU5ESUFOCisKKyAgIEEgNjQtYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byA6Y29uc3Q6YFJFR19RV09SRGAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBkYXRhOjogUkVHX1JFU09VUkNFX0xJU1QKIAogICAgQSBkZXZpY2UtZHJpdmVyIHJlc291cmNlIGxpc3QuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93c2dpcmVmLnJzdCBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CmluZGV4IGFhZDI3YTguLmExZDQ0NjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0CkBAIC0xMzMsOSArMTMzLDkgQEAKICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZW52aXJvbi5pdGVtcygpXQogICAgICAgICAgIHJldHVybiByZXQKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgc2ltcGxlX2FwcCkKLSAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHNpbXBsZV9hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCisgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIAogSW4gYWRkaXRpb24gdG8gdGhlIGVudmlyb25tZW50IGZ1bmN0aW9ucyBhYm92ZSwgdGhlIDptb2Q6YHdzZ2lyZWYudXRpbGAgbW9kdWxlCkBAIC0yODUsMTQgKzI4NSwxNCBAQAogCiAgICAgICBmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgbWFrZV9zZXJ2ZXIsIGRlbW9fYXBwCiAKLSAgICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQotICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiBwb3J0IDgwMDAuLi4iKQorICAgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24gcG9ydCA4MDAwLi4uIikKIAotICAgICAgIyBSZXNwb25kIHRvIHJlcXVlc3RzIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgICAjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKKyAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKIAotICAgICAgIyBBbHRlcm5hdGl2ZTogc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotICAgICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICMgQWx0ZXJuYXRpdmU6IHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKKyAgICAgICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpCiAKIAogLi4gZnVuY3Rpb246OiBkZW1vX2FwcChlbnZpcm9uLCBzdGFydF9yZXNwb25zZSkKQEAgLTQzMiw5ICs0MzIsOSBAQAogICAgICAgIyBUaGlzIGlzIHRoZSBhcHBsaWNhdGlvbiB3cmFwcGVkIGluIGEgdmFsaWRhdG9yCiAgICAgICB2YWxpZGF0b3JfYXBwID0gdmFsaWRhdG9yKHNpbXBsZV9hcHApCiAKLSAgICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHZhbGlkYXRvcl9hcHApCi0gICAgICBwcmludCgiTGlzdGVuaW5nIG9uIHBvcnQgODAwMC4uLi4iKQotICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCB2YWxpZGF0b3JfYXBwKSBhcyBodHRwZDoKKyAgICAgICAgICBwcmludCgiTGlzdGVuaW5nIG9uIHBvcnQgODAwMC4uLi4iKQorICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCiAKIDptb2Q6YHdzZ2lyZWYuaGFuZGxlcnNgIC0tIHNlcnZlci9nYXRld2F5IGJhc2UgY2xhc3NlcwpAQCAtNzc0LDggKzc3NCw4IEBACiAgICAgICAgIyBUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIHByaW50ZWQKICAgICAgICByZXR1cm4gW2IiSGVsbG8gV29ybGQiXQogCi0gICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBoZWxsb193b3JsZF9hcHApCi0gICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQorICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgaGVsbG9fd29ybGRfYXBwKSBhcyBodHRwZDoKKyAgICAgICBwcmludCgiU2VydmluZyBvbiBwb3J0IDgwMDAuLi4iKQogCi0gICAjIFNlcnZlIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCi0gICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAjIFNlcnZlIHVudGlsIHByb2Nlc3MgaXMga2lsbGVkCisgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS94bWxycGMuc2VydmVyLnJzdCBiL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CmluZGV4IGFkMWU4MTIuLjJiOTEwN2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CisrKyBiL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0CkBAIC0xNDgsMjkgKzE0OCwyOSBAQAogICAgICAgIHJwY19wYXRocyA9ICgnL1JQQzInLCkKIAogICAgIyBDcmVhdGUgc2VydmVyCi0gICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1SZXF1ZXN0SGFuZGxlcikKLSAgIHNlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXI9UmVxdWVzdEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQogCi0gICAjIFJlZ2lzdGVyIHBvdygpIGZ1bmN0aW9uOyB0aGlzIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZgotICAgIyBwb3cuX19uYW1lX18gYXMgdGhlIG5hbWUsIHdoaWNoIGlzIGp1c3QgJ3BvdycuCi0gICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICMgUmVnaXN0ZXIgcG93KCkgZnVuY3Rpb247IHRoaXMgd2lsbCB1c2UgdGhlIHZhbHVlIG9mCisgICAgICAgIyBwb3cuX19uYW1lX18gYXMgdGhlIG5hbWUsIHdoaWNoIGlzIGp1c3QgJ3BvdycuCisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKIAotICAgIyBSZWdpc3RlciBhIGZ1bmN0aW9uIHVuZGVyIGEgZGlmZmVyZW50IG5hbWUKLSAgIGRlZiBhZGRlcl9mdW5jdGlvbih4LHkpOgotICAgICAgIHJldHVybiB4ICsgeQotICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGFkZGVyX2Z1bmN0aW9uLCAnYWRkJykKKyAgICAgICAjIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdW5kZXIgYSBkaWZmZXJlbnQgbmFtZQorICAgICAgIGRlZiBhZGRlcl9mdW5jdGlvbih4LHkpOgorICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oYWRkZXJfZnVuY3Rpb24sICdhZGQnKQogCi0gICAjIFJlZ2lzdGVyIGFuIGluc3RhbmNlOyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGluc3RhbmNlIGFyZQotICAgIyBwdWJsaXNoZWQgYXMgWE1MLVJQQyBtZXRob2RzIChpbiB0aGlzIGNhc2UsIGp1c3QgJ211bCcpLgotICAgY2xhc3MgTXlGdW5jczoKLSAgICAgICBkZWYgbXVsKHNlbGYsIHgsIHkpOgotICAgICAgICAgICByZXR1cm4geCAqIHkKKyAgICAgICAjIFJlZ2lzdGVyIGFuIGluc3RhbmNlOyBhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIGluc3RhbmNlIGFyZQorICAgICAgICMgcHVibGlzaGVkIGFzIFhNTC1SUEMgbWV0aG9kcyAoaW4gdGhpcyBjYXNlLCBqdXN0ICdtdWwnKS4KKyAgICAgICBjbGFzcyBNeUZ1bmNzOgorICAgICAgICAgICBkZWYgbXVsKHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgICAgcmV0dXJuIHggKiB5CiAKLSAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShNeUZ1bmNzKCkpCisgICAgICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKE15RnVuY3MoKSkKIAotICAgIyBSdW4gdGhlIHNlcnZlcidzIG1haW4gbG9vcAotICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICMgUnVuIHRoZSBzZXJ2ZXIncyBtYWluIGxvb3AKKyAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCiAKIFRoZSBmb2xsb3dpbmcgY2xpZW50IGNvZGUgd2lsbCBjYWxsIHRoZSBtZXRob2RzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBwcmVjZWRpbmcKIHNlcnZlcjo6CkBAIC0yMDcsMTggKzIwNywxNyBAQAogICAgICAgICAgICAgZGVmIGdldEN1cnJlbnRUaW1lKCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAKLSAgICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQotICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCi0gICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKLSAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKKyAgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKSBhcyBzZXJ2ZXI6CisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCiAKIFRoaXMgRXhhbXBsZVNlcnZpY2UgZGVtbyBjYW4gYmUgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmU6OgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS96aXBmaWxlLnJzdCBiL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CmluZGV4IGFiZTM4YzQuLjZjOWQyMDcgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0CkBAIC0yMDUsMTggKzIwNSwxMyBAQAogICAgUmV0dXJuIGEgbGlzdCBvZiBhcmNoaXZlIG1lbWJlcnMgYnkgbmFtZS4KIAogCi0uLiBpbmRleDo6Ci0gICBzaW5nbGU6IHVuaXZlcnNhbCBuZXdsaW5lczsgemlwZmlsZS5aaXBGaWxlLm9wZW4gbWV0aG9kCisuLiBtZXRob2Q6OiBaaXBGaWxlLm9wZW4obmFtZSwgbW9kZT0ncicsIHB3ZD1Ob25lLCAqLCBmb3JjZV96aXA2ND1GYWxzZSkKIAotLi4gbWV0aG9kOjogWmlwRmlsZS5vcGVuKG5hbWUsIG1vZGU9J3InLCBwd2Q9Tm9uZSkKLQotICAgRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZS1saWtlIG9iamVjdCAoWmlwRXh0RmlsZSkuICpuYW1lKgotICAgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUsIG9yIGEgOmNsYXNzOmBaaXBJbmZvYCBvYmplY3QuIFRoZQotICAgKm1vZGUqIHBhcmFtZXRlciwgaWYgaW5jbHVkZWQsIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6IGBgJ3InYGAgKHRoZQotICAgZGVmYXVsdCksIGBgJ1UnYGAsIG9yIGBgJ3JVJ2BgLiBDaG9vc2luZyBgYCdVJ2BgIG9yICBgYCdyVSdgYCB3aWxsIGVuYWJsZQotICAgOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2Agc3VwcG9ydCBpbiB0aGUgcmVhZC1vbmx5IG9iamVjdC4gICpwd2QqIGlzIHRoZQotICAgcGFzc3dvcmQgdXNlZCBmb3IgZW5jcnlwdGVkIGZpbGVzLiAgQ2FsbGluZyAgOm1ldGg6YC5vcGVuYCBvbiBhIGNsb3NlZAotICAgWmlwRmlsZSB3aWxsIHJhaXNlIGEgIDpleGM6YFJ1bnRpbWVFcnJvcmAuCisgICBBY2Nlc3MgYSBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBiaW5hcnkgZmlsZS1saWtlIG9iamVjdC4gICpuYW1lKgorICAgY2FuIGJlIGVpdGhlciB0aGUgbmFtZSBvZiBhIGZpbGUgd2l0aGluIHRoZSBhcmNoaXZlIG9yIGEgOmNsYXNzOmBaaXBJbmZvYAorICAgb2JqZWN0LiAgVGhlICptb2RlKiBwYXJhbWV0ZXIsIGlmIGluY2x1ZGVkLCBtdXN0IGJlIGBgJ3InYGAgKHRoZSBkZWZhdWx0KQorICAgb3IgYGAndydgYC4gICpwd2QqIGlzIHRoZSBwYXNzd29yZCB1c2VkIHRvIGRlY3J5cHQgZW5jcnlwdGVkIFpJUCBmaWxlcy4KKyAgIENhbGxpbmcgOm1ldGg6YC5vcGVuYCBvbiBhIGNsb3NlZCBaaXBGaWxlIHdpbGwgcmFpc2UgYSA6ZXhjOmBSdW50aW1lRXJyb3JgLgogCiAgICA6bWV0aDpgflppcEZpbGUub3BlbmAgaXMgYWxzbyBhIGNvbnRleHQgbWFuYWdlciBhbmQgdGhlcmVmb3JlIHN1cHBvcnRzIHRoZQogICAgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudDo6CkBAIC0yMjUsMTcgKzIyMCwyMyBAQAogICAgICAgICAgIHdpdGggbXl6aXAub3BlbignZWdncy50eHQnKSBhcyBteWZpbGU6CiAgICAgICAgICAgICAgIHByaW50KG15ZmlsZS5yZWFkKCkpCiAKLSAgIC4uIG5vdGU6OgorICAgV2l0aCAqbW9kZSogYGAncidgYCB0aGUgZmlsZS1saWtlIG9iamVjdAorICAgKGBgWmlwRXh0RmlsZWBgKSBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgIDptZXRoOmB+aW8uQnVmZmVyZWRJT0Jhc2UucmVhZGAsIDptZXRoOmB+aW8uSU9CYXNlLnJlYWRsaW5lYCwKKyAgIDptZXRoOmB+aW8uSU9CYXNlLnJlYWRsaW5lc2AsIDptZXRoOmBfX2l0ZXJfX2AsCisgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYC4gIFRoZXNlIG9iamVjdHMgY2FuIG9wZXJhdGUgaW5kZXBlbmRlbnRseSBvZgorICAgdGhlIFppcEZpbGUuCiAKLSAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICAgICAgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS5yZWFkYCwgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVgLAotICAgICAgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVzYCwgOm1ldGg6YF9faXRlcl9fYCwKLSAgICAgIDptZXRoOmB+aXRlcmF0b3IuX19uZXh0X19gLgorICAgV2l0aCBgYG1vZGU9J3cnYGAsIGEgd3JpdGFibGUgZmlsZSBoYW5kbGUgaXMgcmV0dXJuZWQsIHdoaWNoIHN1cHBvcnRzIHRoZQorICAgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS53cml0ZWAgbWV0aG9kLiAgV2hpbGUgYSB3cml0YWJsZSBmaWxlIGhhbmRsZSBpcyBvcGVuLAorICAgYXR0ZW1wdGluZyB0byByZWFkIG9yIHdyaXRlIG90aGVyIGZpbGVzIGluIHRoZSBaSVAgZmlsZSB3aWxsIHJhaXNlIGEKKyAgIDpleGM6YFJ1bnRpbWVFcnJvcmAuCiAKLSAgIC4uIG5vdGU6OgotCi0gICAgICBPYmplY3RzIHJldHVybmVkIGJ5IDptZXRoOmAub3BlbmAgY2FuIG9wZXJhdGUgaW5kZXBlbmRlbnRseSBvZiB0aGUKLSAgICAgIFppcEZpbGUuCisgICBXaGVuIHdyaXRpbmcgYSBmaWxlLCBpZiB0aGUgZmlsZSBzaXplIGlzIG5vdCBrbm93biBpbiBhZHZhbmNlIGJ1dCBtYXkgZXhjZWVkCisgICAyIEdpQiwgcGFzcyBgYGZvcmNlX3ppcDY0PVRydWVgYCB0byBlbnN1cmUgdGhhdCB0aGUgaGVhZGVyIGZvcm1hdCBpcworICAgY2FwYWJsZSBvZiBzdXBwb3J0aW5nIGxhcmdlIGZpbGVzLiAgSWYgdGhlIGZpbGUgc2l6ZSBpcyBrbm93biBpbiBhZHZhbmNlLAorICAgY29uc3RydWN0IGEgOmNsYXNzOmBaaXBJbmZvYCBvYmplY3Qgd2l0aCA6YXR0cjpgflppcEluZm8uZmlsZV9zaXplYCBzZXQsIGFuZAorICAgdXNlIHRoYXQgYXMgdGhlICpuYW1lKiBwYXJhbWV0ZXIuCiAKICAgIC4uIG5vdGU6OgogCkBAIC0yNDMsMTAgKzI0NCwxNCBAQAogICAgICAgb3IgYSA6Y2xhc3M6YFppcEluZm9gIG9iamVjdC4gIFlvdSB3aWxsIGFwcHJlY2lhdGUgdGhpcyB3aGVuIHRyeWluZyB0byByZWFkIGEKICAgICAgIFpJUCBmaWxlIHRoYXQgY29udGFpbnMgbWVtYmVycyB3aXRoIGR1cGxpY2F0ZSBuYW1lcy4KIAotICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy40IDMuNgotICAgICAgVGhlIGBgJ1UnYGAgb3IgIGBgJ3JVJ2BgIG1vZGUuICBVc2UgOmNsYXNzOmBpby5UZXh0SU9XcmFwcGVyYCBmb3IgcmVhZGluZworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFJlbW92ZWQgc3VwcG9ydCBvZiBgYG1vZGU9J1UnYGAuICBVc2UgOmNsYXNzOmBpby5UZXh0SU9XcmFwcGVyYCBmb3IgcmVhZGluZwogICAgICAgY29tcHJlc3NlZCB0ZXh0IGZpbGVzIGluIDp0ZXJtOmB1bml2ZXJzYWwgbmV3bGluZXNgIG1vZGUuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6bWV0aDpgb3BlbmAgY2FuIG5vdyBiZSB1c2VkIHRvIHdyaXRlIGZpbGVzIGludG8gdGhlIGFyY2hpdmUgd2l0aCB0aGUKKyAgICAgIGBgbW9kZT0ndydgYCBvcHRpb24uCisKIC4uIG1ldGhvZDo6IFppcEZpbGUuZXh0cmFjdChtZW1iZXIsIHBhdGg9Tm9uZSwgcHdkPU5vbmUpCiAKICAgIEV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeTsgKm1lbWJlcioKQEAgLTQ2NSw3ICs0NzAsMzEgQEAKIDptZXRoOmAuaW5mb2xpc3RgIG1ldGhvZHMgb2YgOmNsYXNzOmBaaXBGaWxlYCBvYmplY3RzLiAgRWFjaCBvYmplY3Qgc3RvcmVzCiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBtZW1iZXIgb2YgdGhlIFpJUCBhcmNoaXZlLgogCi1JbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CitUaGVyZSBpcyBvbmUgY2xhc3NtZXRob2QgdG8gbWFrZSBhIDpjbGFzczpgWmlwSW5mb2AgaW5zdGFuY2UgZm9yIGEgZmlsZXN5c3RlbQorZmlsZToKKworLi4gY2xhc3NtZXRob2Q6OiBaaXBJbmZvLmZyb21fZmlsZShmaWxlbmFtZSwgYXJjbmFtZT1Ob25lKQorCisgICBDb25zdHJ1Y3QgYSA6Y2xhc3M6YFppcEluZm9gIGluc3RhbmNlIGZvciBhIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0sIGluCisgICBwcmVwYXJhdGlvbiBmb3IgYWRkaW5nIGl0IHRvIGEgemlwIGZpbGUuCisKKyAgICpmaWxlbmFtZSogc2hvdWxkIGJlIHRoZSBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIGZpbGVzeXN0ZW0uCisKKyAgIElmICphcmNuYW1lKiBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgdGhlIG5hbWUgd2l0aGluIHRoZSBhcmNoaXZlLgorICAgSWYgKmFyY25hbWUqIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIHdpbGwgYmUgdGhlIHNhbWUgYXMgKmZpbGVuYW1lKiwgYnV0CisgICB3aXRoIGFueSBkcml2ZSBsZXR0ZXIgYW5kIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3JzIHJlbW92ZWQuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCitJbnN0YW5jZXMgaGF2ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXM6CisKKy4uIG1ldGhvZDo6IFppcEluZm8uaXNfZGlyKCkKKworICAgUmV0dXJuIFRydWUgaWYgdGhpcyBhcmNoaXZlIG1lbWJlciBpcyBhIGRpcmVjdG9yeS4KKworICAgVGhpcyB1c2VzIHRoZSBlbnRyeSdzIG5hbWU6IGRpcmVjdG9yaWVzIHNob3VsZCBhbHdheXMgZW5kIHdpdGggYGAvYGAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAKIC4uIGF0dHJpYnV0ZTo6IFppcEluZm8uZmlsZW5hbWUKQEAgLTU3NCw0ICs2MDMsNSBAQAogCiAgICBTaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZS4KIAorCiAuLiBfUEtaSVAgQXBwbGljYXRpb24gTm90ZTogaHR0cHM6Ly9wa3dhcmUuY2FjaGVmbHkubmV0L3dlYmRvY3MvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3psaWIucnN0IGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKaW5kZXggMWRlN2JhZS4uODQ2MDIwYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvemxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvemxpYi5yc3QKQEAgLTQ3LDE0ICs0NywxOSBAQAogICAgICAgcGxhdGZvcm1zLCB1c2UgYGBhZGxlcjMyKGRhdGEpICYgMHhmZmZmZmZmZmBgLgogCiAKLS4uIGZ1bmN0aW9uOjogY29tcHJlc3MoZGF0YVssIGxldmVsXSkKKy4uIGZ1bmN0aW9uOjogY29tcHJlc3MoZGF0YSwgbGV2ZWw9LTEpCiAKICAgIENvbXByZXNzZXMgdGhlIGJ5dGVzIGluICpkYXRhKiwgcmV0dXJuaW5nIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLgotICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAwYGAgdG8gYGA5YGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOworICAgKmxldmVsKiBpcyBhbiBpbnRlZ2VyIGZyb20gYGAwYGAgdG8gYGA5YGAgb3IgYGAtMWBgIGNvbnRyb2xsaW5nIHRoZSBsZXZlbCBvZiBjb21wcmVzc2lvbjsKICAgIGBgMWBgIGlzIGZhc3Rlc3QgYW5kIHByb2R1Y2VzIHRoZSBsZWFzdCBjb21wcmVzc2lvbiwgYGA5YGAgaXMgc2xvd2VzdCBhbmQKLSAgIHByb2R1Y2VzIHRoZSBtb3N0LiAgYGAwYGAgaXMgbm8gY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYDZgYC4KKyAgIHByb2R1Y2VzIHRoZSBtb3N0LiAgYGAwYGAgaXMgbm8gY29tcHJlc3Npb24uICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYC0xYGAKKyAgIChaX0RFRkFVTFRfQ09NUFJFU1NJT04pLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIHJlcHJlc2VudHMgYSBkZWZhdWx0CisgICBjb21wcm9taXNlIGJldHdlZW4gc3BlZWQgYW5kIGNvbXByZXNzaW9uIChjdXJyZW50bHkgZXF1aXZhbGVudCB0byBsZXZlbCA2KS4KICAgIFJhaXNlcyB0aGUgOmV4YzpgZXJyb3JgIGV4Y2VwdGlvbiBpZiBhbnkgZXJyb3Igb2NjdXJzLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgKmxldmVsKiBjYW4gbm93IGJlIHVzZWQgYXMgYSBrZXl3b3JkIHBhcmFtZXRlci4KKwogCiAuLiBmdW5jdGlvbjo6IGNvbXByZXNzb2JqKGxldmVsPS0xLCBtZXRob2Q9REVGTEFURUQsIHdiaXRzPTE1LCBtZW1MZXZlbD04LCBzdHJhdGVneT1aX0RFRkFVTFRfU1RSQVRFR1lbLCB6ZGljdF0pCiAKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvY29tcG91bmRfc3RtdHMucnN0IGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKaW5kZXggMjQ2OTQyMi4uZTFhN2Y1NyAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QKQEAgLTQ3MSwxMCArNDcxLDEwIEBACiAgICBkZWNvcmF0b3JzOiBgZGVjb3JhdG9yYCsKICAgIGRlY29yYXRvcjogIkAiIGBkb3R0ZWRfbmFtZWAgWyIoIiBbYGFyZ3VtZW50X2xpc3RgIFsiLCJdXSAiKSJdIE5FV0xJTkUKICAgIGRvdHRlZF9uYW1lOiBgaWRlbnRpZmllcmAgKCIuIiBgaWRlbnRpZmllcmApKgotICAgcGFyYW1ldGVyX2xpc3Q6IChgZGVmcGFyYW1ldGVyYCAiLCIpKgotICAgICAgICAgICAgICAgICA6IHwgIioiIFtgcGFyYW1ldGVyYF0gKCIsIiBgZGVmcGFyYW1ldGVyYCkqIFsiLCIgIioqIiBgcGFyYW1ldGVyYF0KLSAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAKLSAgICAgICAgICAgICAgICAgOiB8IGBkZWZwYXJhbWV0ZXJgIFsiLCJdICkKKyAgIHBhcmFtZXRlcl9saXN0OiBgZGVmcGFyYW1ldGVyYCAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbYHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzYF1dCisgICAgICAgICAgICAgICAgIDogfCBgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgCisgICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnczogIioiIFtgcGFyYW1ldGVyYF0gKCIsIiBgZGVmcGFyYW1ldGVyYCkqIFsiLCIgWyIqKiIgYHBhcmFtZXRlcmAgWyIsIl1dXQorICAgICAgICAgICAgICAgICAgICAgICAgIDogfCAiKioiIGBwYXJhbWV0ZXJgIFsiLCJdCiAgICBwYXJhbWV0ZXI6IGBpZGVudGlmaWVyYCBbIjoiIGBleHByZXNzaW9uYF0KICAgIGRlZnBhcmFtZXRlcjogYHBhcmFtZXRlcmAgWyI9IiBgZXhwcmVzc2lvbmBdCiAgICBmdW5jbmFtZTogYGlkZW50aWZpZXJgCmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QgYi9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKaW5kZXggZjk3ZWIwOC4uNGM4OGUzOCAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CisrKyBiL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdApAQCAtMTIzMyw4ICsxMjMzLDkgQEAKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpCiAKLSAgIENhbGxlZCBieSB0aGUgOmZ1bmM6YGZvcm1hdGAgYnVpbHQtaW4gZnVuY3Rpb24gKGFuZCBieSBleHRlbnNpb24sIHRoZQotICAgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZCBvZiBjbGFzcyA6Y2xhc3M6YHN0cmApIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIgorICAgQ2FsbGVkIGJ5IHRoZSA6ZnVuYzpgZm9ybWF0YCBidWlsdC1pbiBmdW5jdGlvbiwKKyAgIGFuZCBieSBleHRlbnNpb24sIGV2YWx1YXRpb24gb2YgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscworICAgPGYtc3RyaW5ncz5gIGFuZCB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZCwgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiCiAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBUaGUgYGBmb3JtYXRfc3BlY2BgIGFyZ3VtZW50IGlzCiAgICBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBkZXNpcmVkLgogICAgVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBgYGZvcm1hdF9zcGVjYGAgYXJndW1lbnQgaXMgdXAgdG8gdGhlIHR5cGUKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdCBiL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdAppbmRleCAyMTQ0YzFmLi41NjA0OWNlIDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0CkBAIC01NTQsMTkgKzU1NCwzMCBAQAogICAgZGV0YWlscy4KIAogICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkIG9mIGBgX19uYW1lX19gYCB0byBjYWxjdWxhdGUgZXhwbGljaXQKLSAgIHJlbGF0aXZlIGltcG9ydHMgZm9yIG1haW4gbW9kdWxlcywgYXMgZGVmaW5lZCBpbiA6cGVwOmAzNjZgLgorICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLCBhcyBkZWZpbmVkIGluIDpwZXA6YDM2NmAuIEl0IGlzCisgICBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBgX19zcGVjX18ucGFyZW50YGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGUgdmFsdWUgb2YgYGBfX3BhY2thZ2VfX2BgIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBzYW1lIGFzCisgICAgICBgYF9fc3BlY19fLnBhcmVudGBgLgogCiAuLiBhdHRyaWJ1dGU6OiBfX3NwZWNfXwogCiAgICBUaGUgYGBfX3NwZWNfX2BgIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCB0byB0aGUgbW9kdWxlIHNwZWMgdGhhdCB3YXMKLSAgIHVzZWQgd2hlbiBpbXBvcnRpbmcgdGhlIG1vZHVsZS4gIFRoaXMgaXMgdXNlZCBwcmltYXJpbHkgZm9yCi0gICBpbnRyb3NwZWN0aW9uIGFuZCBkdXJpbmcgcmVsb2FkaW5nLiAgU2V0dGluZyBgYF9fc3BlY19fYGAKKyAgIHVzZWQgd2hlbiBpbXBvcnRpbmcgdGhlIG1vZHVsZS4gU2V0dGluZyBgYF9fc3BlY19fYGAKICAgIGFwcHJvcHJpYXRlbHkgYXBwbGllcyBlcXVhbGx5IHRvIDpyZWY6YG1vZHVsZXMgaW5pdGlhbGl6ZWQgZHVyaW5nCiAgICBpbnRlcnByZXRlciBzdGFydHVwIDxwcm9ncmFtcz5gLiAgVGhlIG9uZSBleGNlcHRpb24gaXMgYGBfX21haW5fX2BgLAogICAgd2hlcmUgYGBfX3NwZWNfX2BgIGlzIDpyZWY6YHNldCB0byBOb25lIGluIHNvbWUgY2FzZXMgPG1haW5fc3BlYz5gLgogCisgICBXaGVuIGBgX19wYWNrYWdlX19gYCBpcyBub3QgZGVmaW5lZCwgYGBfX3NwZWNfXy5wYXJlbnRgYCBpcyB1c2VkIGFzCisgICBhIGZhbGxiYWNrLgorCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIGBgX19zcGVjX18ucGFyZW50YGAgaXMgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYGBfX3BhY2thZ2VfX2BgIGlzCisgICAgICBub3QgZGVmaW5lZC4KKwogLi4gYXR0cmlidXRlOjogX19wYXRoX18KIAogICAgSWYgdGhlIG1vZHVsZSBpcyBhIHBhY2thZ2UgKGVpdGhlciByZWd1bGFyIG9yIG5hbWVzcGFjZSksIHRoZSBtb2R1bGUKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QgYi9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CmluZGV4IDcxOTY0ZDcuLjdhZjFiMjggMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdApAQCAtNDA1LDcgKzQwNSw4IEBACiAKIC4uIHByb2R1Y3Rpb25saXN0OjoKICAgIHN0cmluZ2xpdGVyYWw6IFtgc3RyaW5ncHJlZml4YF0oYHNob3J0c3RyaW5nYCB8IGBsb25nc3RyaW5nYCkKLSAgIHN0cmluZ3ByZWZpeDogInIiIHwgInUiIHwgIlIiIHwgIlUiCisgICBzdHJpbmdwcmVmaXg6ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIiB8ICJmIiB8ICJGIgorICAgICAgICAgICAgICAgOiB8ICJmciIgfCAiRnIiIHwgImZSIiB8ICJGUiIgfCAicmYiIHwgInJGIiB8ICJSZiIgfCAiUkYiCiAgICBzaG9ydHN0cmluZzogIiciIGBzaG9ydHN0cmluZ2l0ZW1gKiAiJyIgfCAnIicgYHNob3J0c3RyaW5naXRlbWAqICciJwogICAgbG9uZ3N0cmluZzogIicnJyIgYGxvbmdzdHJpbmdpdGVtYCogIicnJyIgfCAnIiIiJyBgbG9uZ3N0cmluZ2l0ZW1gKiAnIiIiJwogICAgc2hvcnRzdHJpbmdpdGVtOiBgc2hvcnRzdHJpbmdjaGFyYCB8IGBzdHJpbmdlc2NhcGVzZXFgCkBAIC00NjQsNiArNDY1LDExIEBACiAgICB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgZHVhbCBQeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLgogICAgU2VlIDpwZXA6YDQxNGAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKK0Egc3RyaW5nIGxpdGVyYWwgd2l0aCBgYCdmJ2BgIG9yIGBgJ0YnYGAgaW4gaXRzIHByZWZpeCBpcyBhCis6ZGZuOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxgOyBzZWUgOnJlZjpgZi1zdHJpbmdzYC4gIFRoZSBgYCdmJ2BgIG1heSBiZQorY29tYmluZWQgd2l0aCBgYCdyJ2BgLCBidXQgbm90IHdpdGggYGAnYidgYCBvciBgYCd1J2BgLCB0aGVyZWZvcmUgcmF3Citmb3JtYXR0ZWQgc3RyaW5ncyBhcmUgcG9zc2libGUsIGJ1dCBmb3JtYXR0ZWQgYnl0ZXMgbGl0ZXJhbHMgYXJlIG5vdC4KKwogSW4gdHJpcGxlLXF1b3RlZCBsaXRlcmFscywgdW5lc2NhcGVkIG5ld2xpbmVzIGFuZCBxdW90ZXMgYXJlIGFsbG93ZWQgKGFuZCBhcmUKIHJldGFpbmVkKSwgZXhjZXB0IHRoYXQgdGhyZWUgdW5lc2NhcGVkIHF1b3RlcyBpbiBhIHJvdyB0ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQQogInF1b3RlIiBpcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gb3BlbiB0aGUgbGl0ZXJhbCwgaS5lLiBlaXRoZXIgYGAnYGAgb3IgYGAiYGAuKQpAQCAtNTgzLDcgKzU4OSwxMDYgQEAKIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgZGVmaW5lZCBhdCB0aGUgc3ludGFjdGljYWwgbGV2ZWwsIGJ1dCBpbXBsZW1lbnRlZCBhdAogY29tcGlsZSB0aW1lLiAgVGhlICcrJyBvcGVyYXRvciBtdXN0IGJlIHVzZWQgdG8gY29uY2F0ZW5hdGUgc3RyaW5nIGV4cHJlc3Npb25zCiBhdCBydW4gdGltZS4gIEFsc28gbm90ZSB0aGF0IGxpdGVyYWwgY29uY2F0ZW5hdGlvbiBjYW4gdXNlIGRpZmZlcmVudCBxdW90aW5nCi1zdHlsZXMgZm9yIGVhY2ggY29tcG9uZW50IChldmVuIG1peGluZyByYXcgc3RyaW5ncyBhbmQgdHJpcGxlIHF1b3RlZCBzdHJpbmdzKS4KK3N0eWxlcyBmb3IgZWFjaCBjb21wb25lbnQgKGV2ZW4gbWl4aW5nIHJhdyBzdHJpbmdzIGFuZCB0cmlwbGUgcXVvdGVkIHN0cmluZ3MpLAorYW5kIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgbWF5IGJlIGNvbmNhdGVuYXRlZCB3aXRoIHBsYWluIHN0cmluZyBsaXRlcmFscy4KKworCisuLiBpbmRleDo6CisgICBzaW5nbGU6IGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbAorICAgc2luZ2xlOiBpbnRlcnBvbGF0ZWQgc3RyaW5nIGxpdGVyYWwKKyAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0ZWQgbGl0ZXJhbAorICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRlZCBsaXRlcmFsCisgICBzaW5nbGU6IGYtc3RyaW5nCisuLiBfZi1zdHJpbmdzOgorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy4uIHZlcnNpb25hZGRlZDo6IDMuNgorCitBIDpkZm46YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbGAgb3IgOmRmbjpgZi1zdHJpbmdgIGlzIGEgc3RyaW5nIGxpdGVyYWwKK3RoYXQgaXMgcHJlZml4ZWQgd2l0aCBgYCdmJ2BgIG9yIGBgJ0YnYGAuICBUaGVzZSBzdHJpbmdzIG1heSBjb250YWluCityZXBsYWNlbWVudCBmaWVsZHMsIHdoaWNoIGFyZSBleHByZXNzaW9ucyBkZWxpbWl0ZWQgYnkgY3VybHkgYnJhY2VzIGBge31gYC4KK1doaWxlIG90aGVyIHN0cmluZyBsaXRlcmFscyBhbHdheXMgaGF2ZSBhIGNvbnN0YW50IHZhbHVlLCBmb3JtYXR0ZWQgc3RyaW5ncworYXJlIHJlYWxseSBleHByZXNzaW9ucyBldmFsdWF0ZWQgYXQgcnVuIHRpbWUuCisKK0VzY2FwZSBzZXF1ZW5jZXMgYXJlIGRlY29kZWQgbGlrZSBpbiBvcmRpbmFyeSBzdHJpbmcgbGl0ZXJhbHMgKGV4Y2VwdCB3aGVuCithIGxpdGVyYWwgaXMgYWxzbyBtYXJrZWQgYXMgYSByYXcgc3RyaW5nKS4gIEFmdGVyIGRlY29kaW5nLCB0aGUgZ3JhbW1hcgorZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgc3RyaW5nIGlzOgorCisuLiBwcm9kdWN0aW9ubGlzdDo6CisgICBmX3N0cmluZzogKGBsaXRlcmFsX2NoYXJgIHwgInt7IiB8ICJ9fSIgfCBgcmVwbGFjZW1lbnRfZmllbGRgKSoKKyAgIHJlcGxhY2VtZW50X2ZpZWxkOiAieyIgYGZfZXhwcmVzc2lvbmAgWyIhIiBgY29udmVyc2lvbmBdIFsiOiIgYGZvcm1hdF9zcGVjYF0gIn0iCisgICBmX2V4cHJlc3Npb246IChgY29uZGl0aW9uYWxfZXhwcmVzc2lvbmAgfCAiKiIgYG9yX2V4cHJgKQorICAgICAgICAgICAgICAgOiAgICgiLCIgYGNvbmRpdGlvbmFsX2V4cHJlc3Npb25gIHwgIiwiICIqIiBgb3JfZXhwcmApKiBbIiwiXQorICAgICAgICAgICAgICAgOiB8IGB5aWVsZF9leHByZXNzaW9uYAorICAgY29udmVyc2lvbjogInMiIHwgInIiIHwgImEiCisgICBmb3JtYXRfc3BlYzogKGBsaXRlcmFsX2NoYXJgIHwgTlVMTCB8IGByZXBsYWNlbWVudF9maWVsZGApKgorICAgbGl0ZXJhbF9jaGFyOiA8YW55IGNvZGUgcG9pbnQgZXhjZXB0ICJ7IiwgIn0iIG9yIE5VTEw+CisKK1RoZSBwYXJ0cyBvZiB0aGUgc3RyaW5nIG91dHNpZGUgY3VybHkgYnJhY2VzIGFyZSB0cmVhdGVkIGxpdGVyYWxseSwKK2V4Y2VwdCB0aGF0IGFueSBkb3VibGVkIGN1cmx5IGJyYWNlcyBgYCd7eydgYCBvciBgYCd9fSdgYCBhcmUgcmVwbGFjZWQKK3dpdGggdGhlIGNvcnJlc3BvbmRpbmcgc2luZ2xlIGN1cmx5IGJyYWNlLiAgQSBzaW5nbGUgb3BlbmluZyBjdXJseQorYnJhY2tldCBgYCd7J2BgIG1hcmtzIGEgcmVwbGFjZW1lbnQgZmllbGQsIHdoaWNoIHN0YXJ0cyB3aXRoIGEKK1B5dGhvbiBleHByZXNzaW9uLiAgQWZ0ZXIgdGhlIGV4cHJlc3Npb24sIHRoZXJlIG1heSBiZSBhIGNvbnZlcnNpb24gZmllbGQsCitpbnRyb2R1Y2VkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50IGBgJyEnYGAuICBBIGZvcm1hdCBzcGVjaWZpZXIgbWF5IGFsc28KK2JlIGFwcGVuZGVkLCBpbnRyb2R1Y2VkIGJ5IGEgY29sb24gYGAnOidgYC4gIEEgcmVwbGFjZW1lbnQgZmllbGQgZW5kcword2l0aCBhIGNsb3NpbmcgY3VybHkgYnJhY2tldCBgYCd9J2BgLgorCitFeHByZXNzaW9ucyBpbiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGxpa2UgcmVndWxhcgorUHl0aG9uIGV4cHJlc3Npb25zIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzZXMsIHdpdGggYSBmZXcgZXhjZXB0aW9ucy4KK0FuIGVtcHR5IGV4cHJlc3Npb24gaXMgbm90IGFsbG93ZWQsIGFuZCBhIDprZXl3b3JkOmBsYW1iZGFgIGV4cHJlc3Npb24KK211c3QgYmUgc3Vycm91bmRlZCBieSBleHBsaWNpdCBwYXJlbnRoZXNlcy4gIFJlcGxhY2VtZW50IGV4cHJlc3Npb25zCitjYW4gY29udGFpbiBsaW5lIGJyZWFrcyAoZS5nLiBpbiB0cmlwbGUtcXVvdGVkIHN0cmluZ3MpLCBidXQgdGhleQorY2Fubm90IGNvbnRhaW4gY29tbWVudHMuICBFYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGluIHRoZSBjb250ZXh0Cit3aGVyZSB0aGUgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsIGFwcGVhcnMsIGluIG9yZGVyIGZyb20gbGVmdCB0byByaWdodC4KKworSWYgYSBjb252ZXJzaW9uIGlzIHNwZWNpZmllZCwgdGhlIHJlc3VsdCBvZiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uCitpcyBjb252ZXJ0ZWQgYmVmb3JlIGZvcm1hdHRpbmcuICBDb252ZXJzaW9uIGBgJyFzJ2BgIGNhbGxzIDpmdW5jOmBzdHJgIG9uCit0aGUgcmVzdWx0LCBgYCchcidgYCBjYWxscyA6ZnVuYzpgcmVwcmAsIGFuZCBgYCchYSdgYCBjYWxscyA6ZnVuYzpgYXNjaWlgLgorCitUaGUgcmVzdWx0IGlzIHRoZW4gZm9ybWF0dGVkIHVzaW5nIHRoZSA6ZnVuYzpgZm9ybWF0YCBwcm90b2NvbC4gIFRoZQorZm9ybWF0IHNwZWNpZmllciBpcyBwYXNzZWQgdG8gdGhlIDptZXRoOmBfX2Zvcm1hdF9fYCBtZXRob2Qgb2YgdGhlCitleHByZXNzaW9uIG9yIGNvbnZlcnNpb24gcmVzdWx0LiAgQW4gZW1wdHkgc3RyaW5nIGlzIHBhc3NlZCB3aGVuIHRoZQorZm9ybWF0IHNwZWNpZmllciBpcyBvbWl0dGVkLiAgVGhlIGZvcm1hdHRlZCByZXN1bHQgaXMgdGhlbiBpbmNsdWRlZCBpbgordGhlIGZpbmFsIHZhbHVlIG9mIHRoZSB3aG9sZSBzdHJpbmcuCisKK1RvcC1sZXZlbCBmb3JtYXQgc3BlY2lmaWVycyBtYXkgaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzLgorVGhlc2UgbmVzdGVkIGZpZWxkcyBtYXkgaW5jbHVkZSB0aGVpciBvd24gY29udmVyc2lvbiBmaWVsZHMgYW5kCitmb3JtYXQgc3BlY2lmaWVycywgYnV0IG1heSBub3QgaW5jbHVkZSBtb3JlIGRlZXBseS1uZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzLgorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIG1heSBiZSBjb25jYXRlbmF0ZWQsIGJ1dCByZXBsYWNlbWVudCBmaWVsZHMKK2Nhbm5vdCBiZSBzcGxpdCBhY3Jvc3MgbGl0ZXJhbHMuCisKK1NvbWUgZXhhbXBsZXMgb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsczo6CisKKyAgID4+PiBuYW1lID0gIkZyZWQiCisgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtuYW1lIXJ9LiIKKyAgICJIZSBzYWlkIGhpcyBuYW1lIGlzICdGcmVkJy4iCisgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtyZXByKG5hbWUpfS4iICAjIHJlcHIoKSBpcyBlcXVpdmFsZW50IHRvICFyCisgICAiSGUgc2FpZCBoaXMgbmFtZSBpcyAnRnJlZCcuIgorICAgPj4+IHdpZHRoID0gMTAKKyAgID4+PiBwcmVjaXNpb24gPSA0CisgICA+Pj4gdmFsdWUgPSBkZWNpbWFsLkRlY2ltYWwoIjEyLjM0NTY3IikKKyAgID4+PiBmInJlc3VsdDoge3ZhbHVlOnt3aWR0aH0ue3ByZWNpc2lvbn19IiAgIyBuZXN0ZWQgZmllbGRzCisgICAncmVzdWx0OiAgICAgIDEyLjM1JworCitBIGNvbnNlcXVlbmNlIG9mIHNoYXJpbmcgdGhlIHNhbWUgc3ludGF4IGFzIHJlZ3VsYXIgc3RyaW5nIGxpdGVyYWxzIGlzCit0aGF0IGNoYXJhY3RlcnMgaW4gdGhlIHJlcGxhY2VtZW50IGZpZWxkcyBtdXN0IG5vdCBjb25mbGljdCB3aXRoIHRoZQorcXVvdGluZyB1c2VkIGluIHRoZSBvdXRlciBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwuICBBbHNvLCBlc2NhcGUKK3NlcXVlbmNlcyBub3JtYWxseSBhcHBseSB0byB0aGUgb3V0ZXIgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsLAorcmF0aGVyIHRoYW4gaW5uZXIgc3RyaW5nIGxpdGVyYWxzOjoKKworICAgZiJhYmMge2FbIngiXX0gZGVmIiAgICAjIGVycm9yOiBvdXRlciBzdHJpbmcgbGl0ZXJhbCBlbmRlZCBwcmVtYXR1cmVseQorICAgZiJhYmMge2FbXCJ4XCJdfSBkZWYiICAjIHdvcmthcm91bmQ6IGVzY2FwZSB0aGUgaW5uZXIgcXVvdGVzCisgICBmImFiYyB7YVsneCddfSBkZWYiICAgICMgd29ya2Fyb3VuZDogdXNlIGRpZmZlcmVudCBxdW90aW5nCisKKyAgIGYibmV3bGluZToge29yZCgnXG4nKX0iICAgIyBlcnJvcjogbGl0ZXJhbCBsaW5lIGJyZWFrIGluIGlubmVyIHN0cmluZworICAgZiJuZXdsaW5lOiB7b3JkKCdcXG4nKX0iICAjIHdvcmthcm91bmQ6IGRvdWJsZSBlc2NhcGluZworICAgZnIibmV3bGluZToge29yZCgnXG4nKX0iICAjIHdvcmthcm91bmQ6IHJhdyBvdXRlciBzdHJpbmcKKworU2VlIGFsc28gOnBlcDpgNDk4YCBmb3IgdGhlIHByb3Bvc2FsIHRoYXQgYWRkZWQgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscywKK2FuZCA6bWV0aDpgc3RyLmZvcm1hdGAsIHdoaWNoIHVzZXMgYSByZWxhdGVkIGZvcm1hdCBzdHJpbmcgbWVjaGFuaXNtLgogCiAKIC4uIF9udW1iZXJzOgpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0IGIvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0CmluZGV4IGQ0MDNjNGQuLmVlZTNmNDMgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QKQEAgLTg0LDcgKzg0LDcgQEAKICAgIGFzc2lnbm1lbnRfc3RtdDogKGB0YXJnZXRfbGlzdGAgIj0iKSsgKGBzdGFycmVkX2V4cHJlc3Npb25gIHwgYHlpZWxkX2V4cHJlc3Npb25gKQogICAgdGFyZ2V0X2xpc3Q6IGB0YXJnZXRgICgiLCIgYHRhcmdldGApKiBbIiwiXQogICAgdGFyZ2V0OiBgaWRlbnRpZmllcmAKLSAgICAgICAgIDogfCAiKCIgYHRhcmdldF9saXN0YCAiKSIKKyAgICAgICAgIDogfCAiKCIgW2B0YXJnZXRfbGlzdGBdICIpIgogICAgICAgICAgOiB8ICJbIiBbYHRhcmdldF9saXN0YF0gIl0iCiAgICAgICAgICA6IHwgYGF0dHJpYnV0ZXJlZmAKICAgICAgICAgIDogfCBgc3Vic2NyaXB0aW9uYApkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weSBiL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKaW5kZXggNjMxMTI4My4uNzk4NjAxNyAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQorKysgYi9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CkBAIC0zNCw3ICszNCw3IEBACiAKIAogSVNTVUVfVVJJID0gJ2h0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlJXMnCi1TT1VSQ0VfVVJJID0gJ2h0dHBzOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvMy41LyVzJworU09VUkNFX1VSSSA9ICdodHRwczovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlL2RlZmF1bHQvJXMnCiAKICMgbW9ua2V5LXBhdGNoIHJlU1QgcGFyc2VyIHRvIGRpc2FibGUgYWxwaGFiZXRpYyBhbmQgcm9tYW4gZW51bWVyYXRlZCBsaXN0cwogZnJvbSBkb2N1dGlscy5wYXJzZXJzLnJzdC5zdGF0ZXMgaW1wb3J0IEJvZHkKZGlmZiAtLWdpdCBhL0RvYy90b29scy9zdXNwLWlnbm9yZWQuY3N2IGIvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YKaW5kZXggZGJhOTNiZi4uNGQzZWNkYSAxMDA2NDQKLS0tIGEvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YKKysrIGIvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YKQEAgLTI3Miw2ICsyNzIsNyBAQAogd2hhdHNuZXcvMy4yLCw6Z3osIj4+PiB3aXRoIHRhcmZpbGUub3BlbihuYW1lPSdteWFyY2hpdmUudGFyLmd6JywgbW9kZT0ndzpneicpIGFzIHRmOiIKIHdoYXRzbmV3LzMuMiwsOmxvY2F0aW9uLHpvcGU5LWxvY2F0aW9uID0gJHt6b3BlOTpsb2NhdGlvbn0KIHdoYXRzbmV3LzMuMiwsOnByZWZpeCx6b3BlLWNvbmYgPSAke2N1c3RvbTpwcmVmaXh9L2V0Yy96b3BlLmNvbmYKK3doYXRzbmV3L2NoYW5nZWxvZywsOnZlcnNpb24saW1wb3J0IHN5czsgSSA9IHZlcnNpb25bOnZlcnNpb24uaW5kZXgoJyAnKV0KIHdoYXRzbmV3L2NoYW5nZWxvZywsOmd6LCI6IFRhckZpbGUgb3BlbmVkIHdpdGggZXh0ZXJuYWwgZmlsZW9iaiBhbmQgIiJ3Omd6IiIgbW9kZSBkaWRuJ3QiCiB3aGF0c25ldy9jaGFuZ2Vsb2csLDo6LCI6IFVzZSAiIjEyNy4wLjAuMSIiIG9yICIiOjoxIiIgaW5zdGVhZCBvZiAiImxvY2FsaG9zdCIiIGFzIG11Y2ggYXMiCiBsaWJyYXJ5L3RhcmZpbGUsMTQ5LDp4eiwneDp4eicKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QgYi9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CmluZGV4IGRkYzA4NTUuLmIwM2I1NTMgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdApAQCAtNzgsNiArNzgsOSBAQAogICAgPj4+IHdvcmRzCiAgICBbJ2RlZmVuZXN0cmF0ZScsICdjYXQnLCAnd2luZG93JywgJ2RlZmVuZXN0cmF0ZSddCiAKK1dpdGggYGBmb3IgdyBpbiB3b3JkczpgYCwgdGhlIGV4YW1wbGUgd291bGQgYXR0ZW1wdCB0byBjcmVhdGUgYW4gaW5maW5pdGUgbGlzdCwKK2luc2VydGluZyBgYGRlZmVuZXN0cmF0ZWBgIG92ZXIgYW5kIG92ZXIgYWdhaW4uCisKIAogLi4gX3R1dC1yYW5nZToKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdCBiL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKaW5kZXggZGQ5YzdjZC4uYmVlYWFjMyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CkBAIC0yNSw3ICsyNSw4IEBACiBjb25jYXRlbmF0aW9uIG9wZXJhdGlvbnMgeW91IGNhbiBjcmVhdGUgYW55IGxheW91dCB5b3UgY2FuIGltYWdpbmUuICBUaGUKIHN0cmluZyB0eXBlIGhhcyBzb21lIG1ldGhvZHMgdGhhdCBwZXJmb3JtIHVzZWZ1bCBvcGVyYXRpb25zIGZvciBwYWRkaW5nCiBzdHJpbmdzIHRvIGEgZ2l2ZW4gY29sdW1uIHdpZHRoOyB0aGVzZSB3aWxsIGJlIGRpc2N1c3NlZCBzaG9ydGx5LiAgVGhlIHNlY29uZAotd2F5IGlzIHRvIHVzZSB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KK3dheSBpcyB0byB1c2UgOnJlZjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8Zi1zdHJpbmdzPmAsIG9yIHRoZQorOm1ldGg6YHN0ci5mb3JtYXRgIG1ldGhvZC4KIAogVGhlIDptb2Q6YHN0cmluZ2AgbW9kdWxlIGNvbnRhaW5zIGEgOmNsYXNzOmB+c3RyaW5nLlRlbXBsYXRlYCBjbGFzcyB3aGljaCBvZmZlcnMKIHlldCBhbm90aGVyIHdheSB0byBzdWJzdGl0dXRlIHZhbHVlcyBpbnRvIHN0cmluZ3MuCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0IGIvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAppbmRleCBlOTY2MDg1Li5jODlmYWUzIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKQEAgLTEwLDEzICsxMCwxMyBAQAogSW52b2tpbmcgdGhlIEludGVycHJldGVyCiA9PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy41YAorVGhlIFB5dGhvbiBpbnRlcnByZXRlciBpcyB1c3VhbGx5IGluc3RhbGxlZCBhcyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW4vcHl0aG9uMy42YAogb24gdGhvc2UgbWFjaGluZXMgd2hlcmUgaXQgaXMgYXZhaWxhYmxlOyBwdXR0aW5nIDpmaWxlOmAvdXNyL2xvY2FsL2JpbmAgaW4geW91cgogVW5peCBzaGVsbCdzIHNlYXJjaCBwYXRoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0IGl0IGJ5IHR5cGluZyB0aGUgY29tbWFuZDoKIAogLi4gY29kZS1ibG9jazo6IHRleHQKIAotICAgcHl0aG9uMy41CisgICBweXRob24zLjYKIAogdG8gdGhlIHNoZWxsLiBbI11fIFNpbmNlIHRoZSBjaG9pY2Ugb2YgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgaW50ZXJwcmV0ZXIgbGl2ZXMKIGlzIGFuIGluc3RhbGxhdGlvbiBvcHRpb24sIG90aGVyIHBsYWNlcyBhcmUgcG9zc2libGU7IGNoZWNrIHdpdGggeW91ciBsb2NhbApAQCAtMjQsMTEgKzI0LDExIEBACiBwb3B1bGFyIGFsdGVybmF0aXZlIGxvY2F0aW9uLikKIAogT24gV2luZG93cyBtYWNoaW5lcywgdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24gaXMgdXN1YWxseSBwbGFjZWQgaW4KLTpmaWxlOmBDOlxcUHl0aG9uMzVgLCB0aG91Z2ggeW91IGNhbiBjaGFuZ2UgdGhpcyB3aGVuIHlvdSdyZSBydW5uaW5nIHRoZQorOmZpbGU6YEM6XFxQeXRob24zNmAsIHRob3VnaCB5b3UgY2FuIGNoYW5nZSB0aGlzIHdoZW4geW91J3JlIHJ1bm5pbmcgdGhlCiBpbnN0YWxsZXIuICBUbyBhZGQgdGhpcyBkaXJlY3RvcnkgdG8geW91ciBwYXRoLCAgeW91IGNhbiB0eXBlIHRoZSBmb2xsb3dpbmcKIGNvbW1hbmQgaW50byB0aGUgY29tbWFuZCBwcm9tcHQgaW4gYSBET1MgYm94OjoKIAotICAgc2V0IHBhdGg9JXBhdGglO0M6XHB5dGhvbjM1CisgICBzZXQgcGF0aD0lcGF0aCU7QzpccHl0aG9uMzYKIAogVHlwaW5nIGFuIGVuZC1vZi1maWxlIGNoYXJhY3RlciAoOmtiZDpgQ29udHJvbC1EYCBvbiBVbml4LCA6a2JkOmBDb250cm9sLVpgIG9uCiBXaW5kb3dzKSBhdCB0aGUgcHJpbWFyeSBwcm9tcHQgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IHdpdGggYSB6ZXJvIGV4aXQKQEAgLTk2LDggKzk2LDggQEAKIHByaW50cyBhIHdlbGNvbWUgbWVzc2FnZSBzdGF0aW5nIGl0cyB2ZXJzaW9uIG51bWJlciBhbmQgYSBjb3B5cmlnaHQgbm90aWNlCiBiZWZvcmUgcHJpbnRpbmcgdGhlIGZpcnN0IHByb21wdDo6CiAKLSAgICQgcHl0aG9uMy41Ci0gICBQeXRob24gMy41IChkZWZhdWx0LCBTZXAgMTYgMjAxNSwgMDk6MjU6MDQpCisgICAkIHB5dGhvbjMuNgorICAgUHl0aG9uIDMuNiAoZGVmYXVsdCwgU2VwIDE2IDIwMTUsIDA5OjI1OjA0KQogICAgW0dDQyA0LjguMl0gb24gbGludXgKICAgIFR5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgID4+PgpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAppbmRleCAyMTQwMzI5Li43ZThlZTNlIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50cm9kdWN0aW9uLnJzdApAQCAtMzUyLDYgKzM1Miw5IEBACiAgICAgICBTdHJpbmdzIHN1cHBvcnQgYSBsYXJnZSBudW1iZXIgb2YgbWV0aG9kcyBmb3IKICAgICAgIGJhc2ljIHRyYW5zZm9ybWF0aW9ucyBhbmQgc2VhcmNoaW5nLgogCisgICA6cmVmOmBmLXN0cmluZ3NgCisgICAgICBTdHJpbmcgbGl0ZXJhbHMgdGhhdCBoYXZlIGVtYmVkZGVkIGV4cHJlc3Npb25zLgorCiAgICA6cmVmOmBmb3JtYXRzdHJpbmdzYAogICAgICAgSW5mb3JtYXRpb24gYWJvdXQgc3RyaW5nIGZvcm1hdHRpbmcgd2l0aCA6bWV0aDpgc3RyLmZvcm1hdGAuCiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0IGIvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKaW5kZXggNTJmZmRiZS4uMWRkMDZjMiAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL3N0ZGxpYi5yc3QKQEAgLTE1LDcgKzE1LDcgQEAKIAogICAgPj4+IGltcG9ydCBvcwogICAgPj4+IG9zLmdldGN3ZCgpICAgICAgIyBSZXR1cm4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKLSAgICdDOlxcUHl0aG9uMzUnCisgICAnQzpcXFB5dGhvbjM2JwogICAgPj4+IG9zLmNoZGlyKCcvc2VydmVyL2FjY2Vzc2xvZ3MnKSAgICMgQ2hhbmdlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkKICAgID4+PiBvcy5zeXN0ZW0oJ21rZGlyIHRvZGF5JykgICAjIFJ1biB0aGUgY29tbWFuZCBta2RpciBpbiB0aGUgc3lzdGVtIHNoZWxsCiAgICAwCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QgYi9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKaW5kZXggMzcxNDM4NC4uYmY0Y2Y4NyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdApAQCAtMjc4LDcgKzI3OCw3IEBACiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgZFsncHJpbWFyeSddICAgICAgICAgICAgICAgICMgZW50cnkgd2FzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZAotICAgICBGaWxlICJDOi9weXRob24zNS9saWIvd2Vha3JlZi5weSIsIGxpbmUgNDYsIGluIF9fZ2V0aXRlbV9fCisgICAgIEZpbGUgIkM6L3B5dGhvbjM2L2xpYi93ZWFrcmVmLnB5IiwgbGluZSA0NiwgaW4gX19nZXRpdGVtX18KICAgICAgICBvID0gc2VsZi5kYXRhW2tleV0oKQogICAgS2V5RXJyb3I6ICdwcmltYXJ5JwogCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvY21kbGluZS5yc3QgYi9Eb2MvdXNpbmcvY21kbGluZS5yc3QKaW5kZXggZWM3NDRhMy4uOTA1ZjE0ZCAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL2NtZGxpbmUucnN0CisrKyBiL0RvYy91c2luZy9jbWRsaW5lLnJzdApAQCAtMzk3LDYgKzM5Nyw4IEBACiAgICAgIHN0b3JlZCBpbiBhIHRyYWNlYmFjayBvZiBhIHRyYWNlLiBVc2UgYGAtWCB0cmFjZW1hbGxvYz1ORlJBTUVgYCB0byBzdGFydAogICAgICB0cmFjaW5nIHdpdGggYSB0cmFjZWJhY2sgbGltaXQgb2YgKk5GUkFNRSogZnJhbWVzLiBTZWUgdGhlCiAgICAgIDpmdW5jOmB0cmFjZW1hbGxvYy5zdGFydGAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAqIGBgLVggc2hvd2FsbG9jY291bnRgYCB0byBlbmFibGUgdGhlIG91dHB1dCBvZiB0aGUgdG90YWwgY291bnQgb2YgYWxsb2NhdGVkCisgICAgIG9iamVjdHMgZm9yIGVhY2ggdHlwZSAob25seSB3b3JrcyB3aGVuIGJ1aWx0IHdpdGggYGBDT1VOVF9BTExPQ1NgYCBkZWZpbmVkKTsKIAogICAgSXQgYWxzbyBhbGxvd3MgcGFzc2luZyBhcmJpdHJhcnkgdmFsdWVzIGFuZCByZXRyaWV2aW5nIHRoZW0gdGhyb3VnaCB0aGUKICAgIDpkYXRhOmBzeXMuX3hvcHRpb25zYCBkaWN0aW9uYXJ5LgpAQCAtNDEwLDYgKzQxMiw5IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKICAgICAgIFRoZSBgYC1YIHNob3dyZWZjb3VudGBgIGFuZCBgYC1YIHRyYWNlbWFsbG9jYGAgb3B0aW9ucy4KIAorICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBUaGUgYGAtWCBzaG93YWxsb2Njb3VudGBgIG9wdGlvbi4KKwogCiBPcHRpb25zIHlvdSBzaG91bGRuJ3QgdXNlCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC02MjEsNiArNjI2LDU0IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIAogCisuLiBlbnZ2YXI6OiBQWVRIT05NQUxMT0MKKworICAgU2V0IHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKKyAgIFNldCB0aGUgZmFtaWx5IG9mIG1lbW9yeSBhbGxvY2F0b3JzIHVzZWQgYnkgUHl0aG9uOgorCisgICAqIGBgbWFsbG9jYGA6IHVzZSB0aGUgOmM6ZnVuYzpgbWFsbG9jYCBmdW5jdGlvbiBvZiB0aGUgQyBsaWJyYXJ5CisgICAgIGZvciBhbGwgZG9tYWlucyAoOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX1JBV2AsIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gLAorICAgICA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCkuCisgICAqIGBgcHltYWxsb2NgYDogdXNlIHRoZSA6cmVmOmBweW1hbGxvYyBhbGxvY2F0b3IgPHB5bWFsbG9jPmAgZm9yCisgICAgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIGFuZCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCBkb21haW5zIGFuZCB1c2UKKyAgICAgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gZm9yIHRoZSA6YzpkYXRhOmBQWU1FTV9ET01BSU5fUkFXYCBkb21haW4uCisKKyAgIEluc3RhbGwgZGVidWcgaG9va3M6CisKKyAgICogYGBkZWJ1Z2BgOiBpbnN0YWxsIGRlYnVnIGhvb2tzIG9uIHRvcCBvZiB0aGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yCisgICAqIGBgbWFsbG9jX2RlYnVnYGA6IHNhbWUgYXMgYGBtYWxsb2NgYCBidXQgYWxzbyBpbnN0YWxsIGRlYnVnIGhvb2tzCisgICAqIGBgcHltYWxsb2NfZGVidWdgYDogc2FtZSBhcyBgYHB5bWFsbG9jYGAgYnV0IGFsc28gaW5zdGFsbCBkZWJ1ZyBob29rcworCisgICBXaGVuIFB5dGhvbiBpcyBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUsIHRoZSBkZWZhdWx0IGlzIGBgcHltYWxsb2NgYC4gV2hlbgorICAgY29tcGlsZWQgaW4gZGVidWcgbW9kZSwgdGhlIGRlZmF1bHQgaXMgYGBweW1hbGxvY19kZWJ1Z2BgIGFuZCB0aGUgZGVidWcgaG9va3MKKyAgIGFyZSB1c2VkIGF1dG9tYXRpY2FsbHkuCisKKyAgIElmIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGhvdXQgYGBweW1hbGxvY2BgIHN1cHBvcnQsIGBgcHltYWxsb2NgYCBhbmQKKyAgIGBgcHltYWxsb2NfZGVidWdgYCBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGRlZmF1bHQgaXMgYGBtYWxsb2NgYCBpbiByZWxlYXNlCisgICBtb2RlIGFuZCBgYG1hbGxvY19kZWJ1Z2BgIGluIGRlYnVnIG1vZGUuCisKKyAgIFNlZSB0aGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBmb3IgZGVidWcgaG9va3Mgb24gUHl0aG9uCisgICBtZW1vcnkgYWxsb2NhdG9ycy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gZW52dmFyOjogUFlUSE9OTUFMTE9DU1RBVFMKKworICAgSWYgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZywgUHl0aG9uIHdpbGwgcHJpbnQgc3RhdGlzdGljcyBvZiB0aGUKKyAgIDpyZWY6YHB5bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IgPHB5bWFsbG9jPmAgZXZlcnkgdGltZSBhIG5ldyBweW1hbGxvYyBvYmplY3QKKyAgIGFyZW5hIGlzIGNyZWF0ZWQsIGFuZCBvbiBzaHV0ZG93bi4KKworICAgVGhpcyB2YXJpYWJsZSBpcyBpZ25vcmVkIGlmIHRoZSA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlCisgICBpcyB1c2VkIHRvIGZvcmNlIHRoZSA6YzpmdW5jOmBtYWxsb2NgIGFsbG9jYXRvciBvZiB0aGUgQyBsaWJyYXJ5LCBvciBpZgorICAgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgd2l0aG91dCBgYHB5bWFsbG9jYGAgc3VwcG9ydC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoaXMgdmFyaWFibGUgY2FuIG5vdyBhbHNvIGJlIHVzZWQgb24gUHl0aG9uIGNvbXBpbGVkIGluIHJlbGVhc2UgbW9kZS4KKyAgICAgIEl0IG5vdyBoYXMgbm8gZWZmZWN0IGlmIHNldCB0byBhbiBlbXB0eSBzdHJpbmcuCisKKwogRGVidWctbW9kZSB2YXJpYWJsZXMKIH5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKQEAgLTYzNiw5ICs2ODksMyBAQAogCiAgICBJZiBzZXQsIFB5dGhvbiB3aWxsIGR1bXAgb2JqZWN0cyBhbmQgcmVmZXJlbmNlIGNvdW50cyBzdGlsbCBhbGl2ZSBhZnRlcgogICAgc2h1dHRpbmcgZG93biB0aGUgaW50ZXJwcmV0ZXIuCi0KLQotLi4gZW52dmFyOjogUFlUSE9OTUFMTE9DU1RBVFMKLQotICAgSWYgc2V0LCBQeXRob24gd2lsbCBwcmludCBtZW1vcnkgYWxsb2NhdGlvbiBzdGF0aXN0aWNzIGV2ZXJ5IHRpbWUgYSBuZXcKLSAgIG9iamVjdCBhcmVuYSBpcyBjcmVhdGVkLCBhbmQgb24gc2h1dGRvd24uCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvbWFjLnJzdCBiL0RvYy91c2luZy9tYWMucnN0CmluZGV4IDA1YzkxYmIuLjhmMWFjM2YgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9tYWMucnN0CisrKyBiL0RvYy91c2luZy9tYWMucnN0CkBAIC0yNSw3ICsyNSw3IEBACiAKIFdoYXQgeW91IGdldCBhZnRlciBpbnN0YWxsaW5nIGlzIGEgbnVtYmVyIG9mIHRoaW5nczoKIAotKiBBIDpmaWxlOmBNYWNQeXRob24gMy41YCBmb2xkZXIgaW4geW91ciA6ZmlsZTpgQXBwbGljYXRpb25zYCBmb2xkZXIuIEluIGhlcmUKKyogQSA6ZmlsZTpgTWFjUHl0aG9uIDMuNmAgZm9sZGVyIGluIHlvdXIgOmZpbGU6YEFwcGxpY2F0aW9uc2AgZm9sZGVyLiBJbiBoZXJlCiAgIHlvdSBmaW5kIElETEUsIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0aGF0IGlzIGEgc3RhbmRhcmQgcGFydCBvZiBvZmZpY2lhbAogICBQeXRob24gZGlzdHJpYnV0aW9uczsgUHl0aG9uTGF1bmNoZXIsIHdoaWNoIGhhbmRsZXMgZG91YmxlLWNsaWNraW5nIFB5dGhvbgogICBzY3JpcHRzIGZyb20gdGhlIEZpbmRlcjsgYW5kIHRoZSAiQnVpbGQgQXBwbGV0IiB0b29sLCB3aGljaCBhbGxvd3MgeW91IHRvCkBAIC05Myw3ICs5Myw3IEBACiBhbnl0aGluZyB0aGF0IGhhcyBhIEdVSSkgbmVlZCB0byBiZSBydW4gaW4gYSBzcGVjaWFsIHdheS4gVXNlIDpwcm9ncmFtOmBweXRob253YAogaW5zdGVhZCBvZiA6cHJvZ3JhbTpgcHl0aG9uYCB0byBzdGFydCBzdWNoIHNjcmlwdHMuCiAKLVdpdGggUHl0aG9uIDMuNSwgeW91IGNhbiB1c2UgZWl0aGVyIDpwcm9ncmFtOmBweXRob25gIG9yIDpwcm9ncmFtOmBweXRob253YC4KK1dpdGggUHl0aG9uIDMuNiwgeW91IGNhbiB1c2UgZWl0aGVyIDpwcm9ncmFtOmBweXRob25gIG9yIDpwcm9ncmFtOmBweXRob253YC4KIAogCiBDb25maWd1cmF0aW9uCkBAIC0xNTksNyArMTU5LDcgQEAKIERpc3RyaWJ1dGluZyBQeXRob24gQXBwbGljYXRpb25zIG9uIHRoZSBNYWMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlICJCdWlsZCBBcHBsZXQiIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAzLjUgZm9sZGVyIGlzIGZpbmUgZm9yCitUaGUgIkJ1aWxkIEFwcGxldCIgdG9vbCB0aGF0IGlzIHBsYWNlZCBpbiB0aGUgTWFjUHl0aG9uIDMuNiBmb2xkZXIgaXMgZmluZSBmb3IKIHBhY2thZ2luZyBzbWFsbCBQeXRob24gc2NyaXB0cyBvbiB5b3VyIG93biBtYWNoaW5lIHRvIHJ1biBhcyBhIHN0YW5kYXJkIE1hYwogYXBwbGljYXRpb24uIFRoaXMgdG9vbCwgaG93ZXZlciwgaXMgbm90IHJvYnVzdCBlbm91Z2ggdG8gZGlzdHJpYnV0ZSBQeXRob24KIGFwcGxpY2F0aW9ucyB0byBvdGhlciB1c2Vycy4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy93aW5kb3dzLnJzdCBiL0RvYy91c2luZy93aW5kb3dzLnJzdAppbmRleCA3NTIwZDYwLi4yMzk5Mjc4IDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QKKysrIGIvRG9jL3VzaW5nL3dpbmRvd3MucnN0CkBAIC00MTgsNiArNDE4LDggQEAKIEZyb20gdGhlIGNvbW1hbmQtbGluZQogXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisKIFN5c3RlbS13aWRlIGluc3RhbGxhdGlvbnMgb2YgUHl0aG9uIDMuMyBhbmQgbGF0ZXIgd2lsbCBwdXQgdGhlIGxhdW5jaGVyIG9uIHlvdXIKIDplbnZ2YXI6YFBBVEhgLiBUaGUgbGF1bmNoZXIgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBhdmFpbGFibGUgdmVyc2lvbnMgb2YKIFB5dGhvbiwgc28gaXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIHZlcnNpb24gaXMgaW5zdGFsbGVkLiBUbyBjaGVjayB0aGF0IHRoZQpAQCAtNDI3LDI1ICs0MjksMjYgQEAKIAogICBweQogCi1Zb3Ugc2hvdWxkIGZpbmQgdGhhdCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIDIueCB5b3UgaGF2ZSBpbnN0YWxsZWQgaXMKK1lvdSBzaG91bGQgZmluZCB0aGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBQeXRob24geW91IGhhdmUgaW5zdGFsbGVkIGlzCiBzdGFydGVkIC0gaXQgY2FuIGJlIGV4aXRlZCBhcyBub3JtYWwsIGFuZCBhbnkgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUKIGFyZ3VtZW50cyBzcGVjaWZpZWQgd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIFB5dGhvbi4KIAotSWYgeW91IGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIDIueCBpbnN0YWxsZWQgKGUuZy4sIDIuNiBhbmQgMi43KSB5b3UKLXdpbGwgaGF2ZSBub3RpY2VkIHRoYXQgUHl0aG9uIDIuNyB3YXMgc3RhcnRlZCAtIHRvIGxhdW5jaCBQeXRob24gMi42LCB0cnkgdGhlCitJZiB5b3UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBQeXRob24gaW5zdGFsbGVkIChlLmcuLCAyLjcgYW5kIDMuNikgeW91Cit3aWxsIGhhdmUgbm90aWNlZCB0aGF0IFB5dGhvbiAzLjYgd2FzIHN0YXJ0ZWQgLSB0byBsYXVuY2ggUHl0aG9uIDIuNywgdHJ5IHRoZQogY29tbWFuZDoKIAogOjoKIAotICBweSAtMi42CisgIHB5IC0yLjcKIAotSWYgeW91IGhhdmUgYSBQeXRob24gMy54IGluc3RhbGxlZCwgdHJ5IHRoZSBjb21tYW5kOgorSWYgeW91IHdhbnQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggeW91IGhhdmUgaW5zdGFsbGVkLCB0cnkgdGhlCitjb21tYW5kOgogCiA6OgogCi0gIHB5IC0zCisgIHB5IC0yCiAKLVlvdSBzaG91bGQgZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIDMueCBzdGFydHMuCitZb3Ugc2hvdWxkIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggc3RhcnRzLgogCiBJZiB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcgZXJyb3IsIHlvdSBkbyBub3QgaGF2ZSB0aGUgbGF1bmNoZXIgaW5zdGFsbGVkOgogCkBAIC01MDAsNiArNTAzLDExIEBACiBmaXJzdCBsaW5lIHRvIGBgIyEgcHl0aG9uMi42YGAgYW5kIHlvdSBzaG91bGQgZmluZCB0aGUgMi42IHZlcnNpb24KIGluZm9ybWF0aW9uIHByaW50ZWQuCiAKK05vdGUgdGhhdCB1bmxpa2UgaW50ZXJhY3RpdmUgdXNlLCBhIGJhcmUgInB5dGhvbiIgd2lsbCB1c2UgdGhlIGxhdGVzdAordmVyc2lvbiBvZiBQeXRob24gMi54IHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLiAgVGhpcyBpcyBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkgYW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCwgd2hlcmUgdGhlIGNvbW1hbmQgYGBweXRob25gYAordHlwaWNhbGx5IHJlZmVycyB0byBQeXRob24gMi4KKwogRnJvbSBmaWxlIGFzc29jaWF0aW9ucwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMi4xLnJzdCBiL0RvYy93aGF0c25ldy8yLjEucnN0CmluZGV4IDA2MzY2YjguLjZhYWU3MjYgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8yLjEucnN0CisrKyBiL0RvYy93aGF0c25ldy8yLjEucnN0CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogVGhpcyB2ZXJzaW9uIHdvcmtzIGZvciBzaW1wbGUgdGhpbmdzIHN1Y2ggYXMgaW50ZWdlcnMsIGJ1dCBpdCBoYXMgYSBzaWRlIGVmZmVjdDsKIHRoZSBgYF9jYWNoZWBgIGRpY3Rpb25hcnkgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZXMsIHNvIHRoZXknbGwKLW5ldmVyIGJlIGRlYWxsb2NhdGVkIHVudGlsIHRoZSBQeXRob24gcHJvY2VzcyBleGl0cyBhbmQgY2xlYW5zIHVwIFRoaXMgaXNuJ3QKK25ldmVyIGJlIGRlYWxsb2NhdGVkIHVudGlsIHRoZSBQeXRob24gcHJvY2VzcyBleGl0cyBhbmQgY2xlYW5zIHVwLiBUaGlzIGlzbid0CiB2ZXJ5IG5vdGljZWFibGUgZm9yIGludGVnZXJzLCBidXQgaWYgOmZ1bmM6YGZgIHJldHVybnMgYW4gb2JqZWN0LCBvciBhIGRhdGEKIHN0cnVjdHVyZSB0aGF0IHRha2VzIHVwIGEgbG90IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgYSBwcm9ibGVtLgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMy42LnJzdCBiL0RvYy93aGF0c25ldy8zLjYucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NTBlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2Mvd2hhdHNuZXcvMy42LnJzdApAQCAtMCwwICsxLDc0OCBAQAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBXaGF0J3MgTmV3IEluIFB5dGhvbiAzLjYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworOlJlbGVhc2U6IHxyZWxlYXNlfAorOkRhdGU6IHx0b2RheXwKKworLi4gUnVsZXMgZm9yIG1haW50ZW5hbmNlOgorCisgICAqIEFueW9uZSBjYW4gYWRkIHRleHQgdG8gdGhpcyBkb2N1bWVudC4gIERvIG5vdCBzcGVuZCB2ZXJ5IG11Y2ggdGltZQorICAgb24gdGhlIHdvcmRpbmcgb2YgeW91ciBjaGFuZ2VzLCBiZWNhdXNlIHlvdXIgdGV4dCB3aWxsIHByb2JhYmx5CisgICBnZXQgcmV3cml0dGVuIHRvIHNvbWUgZGVncmVlLgorCisgICAqIFRoZSBtYWludGFpbmVyIHdpbGwgZ28gdGhyb3VnaCBNaXNjL05FV1MgcGVyaW9kaWNhbGx5IGFuZCBhZGQKKyAgIGNoYW5nZXM7IGl0J3MgdGhlcmVmb3JlIG1vcmUgaW1wb3J0YW50IHRvIGFkZCB5b3VyIGNoYW5nZXMgdG8KKyAgIE1pc2MvTkVXUyB0aGFuIHRvIHRoaXMgZmlsZS4KKworICAgKiBUaGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgZXZlcnkgc2luZ2xlIGNoYW5nZTsgY29tcGxldGVuZXNzCisgICBpcyB0aGUgcHVycG9zZSBvZiBNaXNjL05FV1MuICBTb21lIGNoYW5nZXMgSSBjb25zaWRlciB0b28gc21hbGwKKyAgIG9yIGVzb3RlcmljIHRvIGluY2x1ZGUuICBJZiBzdWNoIGEgY2hhbmdlIGlzIGFkZGVkIHRvIHRoZSB0ZXh0LAorICAgSSdsbCBqdXN0IHJlbW92ZSBpdC4gIChUaGlzIGlzIGFub3RoZXIgcmVhc29uIHlvdSBzaG91bGRuJ3Qgc3BlbmQKKyAgIHRvbyBtdWNoIHRpbWUgb24gd3JpdGluZyB5b3VyIGFkZGl0aW9uLikKKworICAgKiBJZiB5b3Ugd2FudCB0byBkcmF3IHlvdXIgbmV3IHRleHQgdG8gdGhlIGF0dGVudGlvbiBvZiB0aGUKKyAgIG1haW50YWluZXIsIGFkZCAnWFhYJyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJhZ3JhcGggb3IKKyAgIHNlY3Rpb24uCisKKyAgICogSXQncyBPSyB0byBqdXN0IGFkZCBhIGZyYWdtZW50YXJ5IG5vdGUgYWJvdXQgYSBjaGFuZ2UuICBGb3IKKyAgIGV4YW1wbGU6ICJYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZQorICAgc29ja2V0IG1vZHVsZS4iICBUaGUgbWFpbnRhaW5lciB3aWxsIHJlc2VhcmNoIHRoZSBjaGFuZ2UgYW5kCisgICB3cml0ZSB0aGUgbmVjZXNzYXJ5IHRleHQuCisKKyAgICogWW91IGNhbiBjb21tZW50IG91dCB5b3VyIGFkZGl0aW9ucyBpZiB5b3UgbGlrZSwgYnV0IGl0J3Mgbm90CisgICBuZWNlc3NhcnkgKGVzcGVjaWFsbHkgd2hlbiBhIGZpbmFsIHJlbGVhc2UgaXMgc29tZSBtb250aHMgYXdheSkuCisKKyAgICogQ3JlZGl0IHRoZSBhdXRob3Igb2YgYSBwYXRjaCBvciBidWdmaXguICAgSnVzdCB0aGUgbmFtZSBpcworICAgc3VmZmljaWVudDsgdGhlIGUtbWFpbCBhZGRyZXNzIGlzbid0IG5lY2Vzc2FyeS4KKworICAgKiBJdCdzIGhlbHBmdWwgdG8gYWRkIHRoZSBidWcvcGF0Y2ggbnVtYmVyIGFzIGEgY29tbWVudDoKKworICAgWFhYIERlc2NyaWJlIHRoZSB0cmFuc21vZ3JpZnkoKSBmdW5jdGlvbiBhZGRlZCB0byB0aGUgc29ja2V0CisgICBtb2R1bGUuCisgICAoQ29udHJpYnV0ZWQgYnkgUC5ZLiBEZXZlbG9wZXIgaW4gOmlzc3VlOmAxMjM0NWAuKQorCisgICBUaGlzIHNhdmVzIHRoZSBtYWludGFpbmVyIHRoZSBlZmZvcnQgb2YgZ29pbmcgdGhyb3VnaCB0aGUgTWVyY3VyaWFsIGxvZworICAgd2hlbiByZXNlYXJjaGluZyBhIGNoYW5nZS4KKworVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDMuNiwgY29tcGFyZWQgdG8gMy41LgorCitGb3IgZnVsbCBkZXRhaWxzLCBzZWUgdGhlIDpzb3VyY2U6YE1pc2MvTkVXU2AgZmlsZS4KKworLi4gbm90ZTo6CisKKyAgIFByZXJlbGVhc2UgdXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQgdGhpcyBkb2N1bWVudCBpcyBjdXJyZW50bHkgaW4gZHJhZnQKKyAgIGZvcm0uIEl0IHdpbGwgYmUgdXBkYXRlZCBzdWJzdGFudGlhbGx5IGFzIFB5dGhvbiAzLjYgbW92ZXMgdG93YXJkcyByZWxlYXNlLAorICAgc28gaXQncyB3b3J0aCBjaGVja2luZyBiYWNrIGV2ZW4gYWZ0ZXIgcmVhZGluZyBlYXJsaWVyIHZlcnNpb25zLgorCisKK1N1bW1hcnkgLS0gUmVsZWFzZSBoaWdobGlnaHRzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBUaGlzIHNlY3Rpb24gc2luZ2xlcyBvdXQgdGhlIG1vc3QgaW1wb3J0YW50IGNoYW5nZXMgaW4gUHl0aG9uIDMuNi4KKyAgIEJyZXZpdHkgaXMga2V5LgorCitOZXcgc3ludGF4IGZlYXR1cmVzOgorCisqIFBFUCA0OTg6IDpyZWY6YEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPHdoYXRzbmV3LWZzdHJpbmdzPmAKKworV2luZG93cyBpbXByb3ZlbWVudHM6CisKKyogVGhlIGBgcHkuZXhlYGAgbGF1bmNoZXIsIHdoZW4gdXNlZCBpbnRlcmFjdGl2ZWx5LCBubyBsb25nZXIgcHJlZmVycworICBQeXRob24gMiBvdmVyIFB5dGhvbiAzIHdoZW4gdGhlIHVzZXIgZG9lc24ndCBzcGVjaWZ5IGEgdmVyc2lvbiAodmlhCisgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb3IgYSBjb25maWcgZmlsZSkuICBIYW5kbGluZyBvZiBzaGViYW5nIGxpbmVzCisgIHJlbWFpbnMgdW5jaGFuZ2VkIC0gInB5dGhvbiIgcmVmZXJzIHRvIFB5dGhvbiAyIGluIHRoYXQgY2FzZS4KKworLi4gUEVQLXNpemVkIGl0ZW1zIG5leHQuCisKKy4uIF9wZXAtNFhYOgorCisuLiBQRVAgNFhYOiBWaXJ0dWFsIEVudmlyb25tZW50cworLi4gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisuLiAoSW1wbGVtZW50ZWQgYnkgRm9vIEJhci4pCisKKy4uIC4uIHNlZWFsc286OgorCisgICAgOnBlcDpgNFhYYCAtIFB5dGhvbiBWaXJ0dWFsIEVudmlyb25tZW50cworICAgICAgIFBFUCB3cml0dGVuIGJ5IENhcmwgTWV5ZXIKKworCitOZXcgRmVhdHVyZXMKKz09PT09PT09PT09PQorCisuLiBfd2hhdHNuZXctZnN0cmluZ3M6CisKK1BFUCA0OTg6IEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhcmUgYSBuZXcga2luZCBvZiBzdHJpbmcgbGl0ZXJhbCwgcHJlZml4ZWQKK3dpdGggYGAnZidgYC4gIFRoZXkgYXJlIHNpbWlsYXIgdG8gdGhlIGZvcm1hdCBzdHJpbmdzIGFjY2VwdGVkIGJ5Cis6bWV0aDpgc3RyLmZvcm1hdGAuICBUaGV5IGNvbnRhaW4gcmVwbGFjZW1lbnQgZmllbGRzIHN1cnJvdW5kZWQgYnkKK2N1cmx5IGJyYWNlcy4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgYXJlIGV4cHJlc3Npb25zLCB3aGljaCBhcmUKK2V2YWx1YXRlZCBhdCBydW4gdGltZSwgYW5kIHRoZW4gZm9ybWF0dGVkIHVzaW5nIHRoZSA6ZnVuYzpgZm9ybWF0YCBwcm90b2NvbC4KKworICAgID4+PiBuYW1lID0gIkZyZWQiCisgICAgPj4+IGYiSGUgc2FpZCBoaXMgbmFtZSBpcyB7bmFtZX0uIgorICAgICdIZSBzYWlkIGhpcyBuYW1lIGlzIEZyZWQuJworCitTZWUgOnBlcDpgNDk4YCBhbmQgdGhlIG1haW4gZG9jdW1lbnRhdGlvbiBhdCA6cmVmOmBmLXN0cmluZ3NgLgorCisKK1BZVEhPTk1BTExPQyBlbnZpcm9ubWVudCB2YXJpYWJsZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBuZXcgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbGxvd3Mgc2V0dGluZyB0aGUgUHl0aG9uCittZW1vcnkgYWxsb2NhdG9ycyBhbmQvb3IgaW5zdGFsbCBkZWJ1ZyBob29rcy4KKworSXQgaXMgbm93IHBvc3NpYmxlIHRvIGluc3RhbGwgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIG9uIFB5dGhvbgorY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlIHVzaW5nIGBgUFlUSE9OTUFMTE9DPWRlYnVnYGAuIEVmZmVjdHMgb2YgZGVidWcgaG9va3M6CisKKyogTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYAorKiBGcmVlZCBtZW1vcnkgaXMgZmlsbGVkIHdpdGggdGhlIGJ5dGUgYGAweERCYGAKKyogRGV0ZWN0IHZpb2xhdGlvbnMgb2YgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgQVBJLiBGb3IgZXhhbXBsZSwKKyAgOmM6ZnVuYzpgUHlPYmplY3RfRnJlZWAgY2FsbGVkIG9uIGEgbWVtb3J5IGJsb2NrIGFsbG9jYXRlZCBieQorICA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLgorKiBEZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQorKiBEZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisqIENoZWNrIHRoYXQgdGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgaXMgaGVsZCB3aGVuIGFsbG9jYXRvcgorICBmdW5jdGlvbnMgb2YgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgKGV4OiA6YzpmdW5jOmBQeU9iamVjdF9NYWxsb2NgKSBhbmQKKyAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgKSBkb21haW5zIGFyZSBjYWxsZWQuCisKK0NoZWNraW5nIGlmIHRoZSBHSUwgaXMgaGVsZCBpcyBhbHNvIGEgbmV3IGZlYXR1cmUgb2YgUHl0aG9uIDMuNi4KKworU2VlIHRoZSA6YzpmdW5jOmBQeU1lbV9TZXR1cERlYnVnSG9va3NgIGZ1bmN0aW9uIGZvciBkZWJ1ZyBob29rcyBvbiBQeXRob24KK21lbW9yeSBhbGxvY2F0b3JzLgorCitJdCBpcyBub3cgYWxzbyBwb3NzaWJsZSB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgYWxsb2NhdG9yIG9mCit0aGUgQyBsaWJyYXJ5IGZvciBhbGwgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyB1c2luZyBgYFBZVEhPTk1BTExPQz1tYWxsb2NgYC4KK0l0IGhlbHBzIHRvIHVzZSBleHRlcm5hbCBtZW1vcnkgZGVidWdnZXJzIGxpa2UgVmFsZ3JpbmQgb24gYSBQeXRob24gY29tcGlsZWQgaW4KK3JlbGVhc2UgbW9kZS4KKworT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZSB0aGUKKzptb2Q6YHRyYWNlbWFsbG9jYCBtb2R1bGUgdG8gZ2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzCithbGxvY2F0ZWQuCisKK0V4YW1wbGUgb2YgZmF0YWwgZXJyb3Igb24gYnVmZmVyIG92ZXJmbG93IHVzaW5nCitgYHB5dGhvbjMuNiAtWCB0cmFjZW1hbGxvYz01YGAgKHN0b3JlIDUgZnJhbWVzIGluIHRyYWNlcyk6OgorCisgICAgRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD0weDdmYmNkNDE2NjZmODogQVBJICdvJworICAgICAgICA0IGJ5dGVzIG9yaWdpbmFsbHkgcmVxdWVzdGVkCisgICAgICAgIFRoZSA3IHBhZCBieXRlcyBhdCBwLTcgYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLgorICAgICAgICBUaGUgOCBwYWQgYnl0ZXMgYXQgdGFpbD0weDdmYmNkNDE2NjZmYyBhcmUgbm90IGFsbCBGT1JCSURERU5CWVRFICgweGZiKToKKyAgICAgICAgICAgIGF0IHRhaWwrMDogMHgwMiAqKiogT1VDSAorICAgICAgICAgICAgYXQgdGFpbCsxOiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzI6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrMzogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs0OiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzU6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNjogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs3OiAweGZiCisgICAgICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICMxMjMzMzI5IHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLgorICAgICAgICBEYXRhIGF0IHA6IDFhIDJiIDMwIDAwCisKKyAgICBNZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAKKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDY0OAorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDEyMgorICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDg0CisKKyAgICBGYXRhbCBQeXRob24gZXJyb3I6IGJhZCB0cmFpbGluZyBwYWQgYnl0ZQorCisgICAgQ3VycmVudCB0aHJlYWQgMHgwMDAwN2ZiY2RiZDMyNzAwIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgInRlc3QvdGVzdF9ieXRlcy5weSIsIGxpbmUgMzIzIGluIHRlc3RfaGV4CisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2MDAgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9jYXNlLnB5IiwgbGluZSA2NDggaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSAxMjIgaW4gcnVuCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQgaW4gX19jYWxsX18KKyAgICAgIC4uLgorCisoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjUxNmAgYW5kIDppc3N1ZTpgMjY1NjRgLikKKworCitPdGhlciBMYW5ndWFnZSBDaGFuZ2VzCis9PT09PT09PT09PT09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworTmV3IE1vZHVsZXMKKz09PT09PT09PT09CisKKyogTm9uZSB5ZXQuCisKKworSW1wcm92ZWQgTW9kdWxlcworPT09PT09PT09PT09PT09PQorCisKK2FzeW5jaW8KKy0tLS0tLS0KKworU2luY2UgdGhlIDptb2Q6YGFzeW5jaW9gIG1vZHVsZSBpcyA6dGVybTpgcHJvdmlzaW9uYWwgPHByb3Zpc2lvbmFsIGFwaT5gLAorYWxsIGNoYW5nZXMgaW50cm9kdWNlZCBpbiBQeXRob24gMy42IGhhdmUgYWxzbyBiZWVuIGJhY2twb3J0ZWQgdG8gUHl0aG9uCiszLjUueC4KKworTm90YWJsZSBjaGFuZ2VzIGluIHRoZSA6bW9kOmBhc3luY2lvYCBtb2R1bGUgc2luY2UgUHl0aG9uIDMuNS4wOgorCisqIFRoZSA6ZnVuYzpgfmFzeW5jaW8uZW5zdXJlX2Z1dHVyZWAgZnVuY3Rpb24gYW5kIGFsbCBmdW5jdGlvbnMgdGhhdAorICB1c2UgaXQsIHN1Y2ggYXMgOm1ldGg6YGxvb3AucnVuX3VudGlsX2NvbXBsZXRlKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5ydW5fdW50aWxfY29tcGxldGU+YCwKKyAgbm93IGFjY2VwdCBhbGwga2luZHMgb2YgOnRlcm06YGF3YWl0YWJsZSBvYmplY3RzIDxhd2FpdGFibGU+YC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBOZXcgOmZ1bmM6YH5hc3luY2lvLnJ1bl9jb3JvdXRpbmVfdGhyZWFkc2FmZWAgZnVuY3Rpb24gdG8gc3VibWl0CisgIGNvcm91dGluZXMgdG8gZXZlbnQgbG9vcHMgZnJvbSBvdGhlciB0aHJlYWRzLgorICAoQ29udHJpYnV0ZWQgYnkgVmluY2VudCBNaWNoZWwuKQorCisqIE5ldyA6bWV0aDpgVHJhbnNwb3J0LmlzX2Nsb3NpbmcoKSA8YXN5bmNpby5CYXNlVHJhbnNwb3J0LmlzX2Nsb3Npbmc+YAorICBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIHRyYW5zcG9ydCBpcyBjbG9zaW5nIG9yIGNsb3NlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBUaGUgOm1ldGg6YGxvb3AuY3JlYXRlX3NlcnZlcigpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuY3JlYXRlX3NlcnZlcj5gCisgIG1ldGhvZCBjYW4gbm93IGFjY2VwdCBhIGxpc3Qgb2YgaG9zdHMuCisgIChDb250cmlidXRlZCBieSBZYW5uIFNpb25uZWF1LikKKworKiBOZXcgOm1ldGg6YGxvb3AuY3JlYXRlX2Z1dHVyZSgpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuY3JlYXRlX2Z1dHVyZT5gCisgIG1ldGhvZCB0byBjcmVhdGUgRnV0dXJlIG9iamVjdHMuICBUaGlzIGFsbG93cyBhbHRlcm5hdGl2ZSBldmVudAorICBsb29wIGltcGxlbWVudGF0aW9ucywgc3VjaCBhcworICBgdXZsb29wIDxodHRwczovL2dpdGh1Yi5jb20vTWFnaWNTdGFjay91dmxvb3A+YF8sIHRvIHByb3ZpZGUgYSBmYXN0ZXIKKyAgOmNsYXNzOmBhc3luY2lvLkZ1dHVyZWAgaW1wbGVtZW50YXRpb24uCisgIChDb250cmlidXRlZCBieSBZdXJ5IFNlbGl2YW5vdi4pCisKKyogTmV3IDptZXRoOmBsb29wLmdldF9leGNlcHRpb25faGFuZGxlcigpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuZ2V0X2V4Y2VwdGlvbl9oYW5kbGVyPmAKKyAgbWV0aG9kIHRvIGdldCB0aGUgY3VycmVudCBleGNlcHRpb24gaGFuZGxlci4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBOZXcgOmZ1bmM6YH5hc3luY2lvLnRpbWVvdXRgIGNvbnRleHQgbWFuYWdlciB0byBzaW1wbGlmeSB0aW1lb3V0cworICBoYW5kbGluZyBjb2RlLgorICAoQ29udHJpYnV0ZWQgYnkgQW5kcmV3IFN2ZXRsb3YuKQorCisqIE5ldyA6bWV0aDpgU3RyZWFtUmVhZGVyLnJlYWR1bnRpbCgpIDxhc3luY2lvLlN0cmVhbVJlYWRlci5yZWFkdW50aWw+YAorICBtZXRob2QgdG8gcmVhZCBkYXRhIGZyb20gdGhlIHN0cmVhbSB1bnRpbCBhIHNlcGFyYXRvciBieXRlcworICBzZXF1ZW5jZSBhcHBlYXJzLgorICAoQ29udHJpYnV0ZWQgYnkgTWFyayBLb3JlbmJlcmcuKQorCisqIFRoZSA6bWV0aDpgbG9vcC5nZXRhZGRyaW5mbygpIDxhc3luY2lvLkJhc2VFdmVudExvb3AuZ2V0YWRkcmluZm8+YAorICBtZXRob2QgaXMgb3B0aW1pemVkIHRvIGF2b2lkIGNhbGxpbmcgdGhlIHN5c3RlbSBgYGdldGFkZHJpbmZvYGAKKyAgZnVuY3Rpb24gaWYgdGhlIGFkZHJlc3MgaXMgYWxyZWFkeSByZXNvbHZlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEEuIEplc3NlIEppcnl1IERhdmlzLikKKworCitjb250ZXh0bGliCistLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAgY2xhc3MgaGFzIGJlZW4gYWRkZWQgdG8KK3Byb3ZpZGUgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udGV4dCBtYW5hZ2Vycy4gSXQgcHJvdmlkZXMgYQorc2Vuc2libGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgYF9fZW50ZXJfXygpYCB3aGljaCByZXR1cm5zCitgYHNlbGZgYCBhbmQgbGVhdmVzIGBfX2V4aXRfXygpYCBhbiBhYnN0cmFjdCBtZXRob2QuIEEgbWF0Y2hpbmcKK2NsYXNzIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSA6bW9kOmB0eXBpbmdgIG1vZHVsZSBhcworOmNsYXNzOmB0eXBpbmcuQ29udGV4dE1hbmFnZXJgLgorKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NjA5YC4pCisKKworZGF0ZXRpbWUKKy0tLS0tLS0tCisKK1RoZSA6bWV0aDpgZGF0ZXRpbWUuc3RyZnRpbWUoKSA8ZGF0ZXRpbWUuZGF0ZXRpbWUuc3RyZnRpbWU+YCBhbmQKKzptZXRoOmBkYXRlLnN0cmZ0aW1lKCkgPGRhdGV0aW1lLmRhdGUuc3RyZnRpbWU+YCBtZXRob2RzIG5vdyBzdXBwb3J0IElTTyA4NjAxIGRhdGUKK2RpcmVjdGl2ZXMgYGAlR2BgLCBgYCV1YGAgYW5kIGBgJVZgYC4KKyhDb250cmlidXRlZCBieSBBc2hsZXkgQW5kZXJzb24gaW4gOmlzc3VlOmAxMjAwNmAuKQorCisKK2ZhdWx0aGFuZGxlcgorLS0tLS0tLS0tLS0tCisKK09uIFdpbmRvd3MsIHRoZSA6bW9kOmBmYXVsdGhhbmRsZXJgIG1vZHVsZSBub3cgaW5zdGFsbHMgYSBoYW5kbGVyIGZvciBXaW5kb3dzCitleGNlcHRpb25zOiBzZWUgOmZ1bmM6YGZhdWx0aGFuZGxlci5lbmFibGVgLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4KKzppc3N1ZTpgMjM4NDhgLikKKworCitpZGxlbGliIGFuZCBJRExFCistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBpZGxlbGliIHBhY2thZ2UgaXMgYmVpbmcgbW9kZXJuaXplZCBhbmQgcmVmYWN0b3JlZCB0byBtYWtlIElETEUgbG9vayBhbmQgd29yayBiZXR0ZXIgYW5kIHRvIG1ha2UgdGhlIGNvZGUgZWFzaWVyIHRvIHVuZGVyc3RhbmQsIHRlc3QsIGFuZCBpbXByb3ZlLiBQYXJ0IG9mIG1ha2luZyBJRExFIGxvb2sgYmV0dGVyLCBlc3BlY2lhbGx5IG9uIExpbnV4IGFuZCBNYWMsIGlzIHVzaW5nIHR0ayB3aWRnZXRzLCBtb3N0bHkgaW4gdGhlIGRpYWxvZ3MuICBBcyBhIHJlc3VsdCwgSURMRSBubyBsb25nZXIgcnVucyB3aXRoIHRjbC90ayA4LjQuICBJdCBub3cgcmVxdWlyZXMgdGNsL3RrIDguNSBvciA4LjYuICBXZSByZWNvbW1lbmQgcnVubmluZyB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgZWl0aGVyLgorCisnTW9kZXJuaXppbmcnIGluY2x1ZGVzIHJlbmFtaW5nIGFuZCBjb25zb2xpZGF0aW9uIG9mIGlkbGVsaWIgbW9kdWxlcy4gVGhlIHJlbmFtaW5nIG9mIGZpbGVzIHdpdGggcGFydGlhbCB1cHBlcmNhc2UgbmFtZXMgaXMgc2ltaWxhciB0byB0aGUgcmVuYW1pbmcgb2YsIGZvciBpbnN0YW5jZSwgVGtpbnRlciBhbmQgVGtGb250IHRvIHRraW50ZXIgYW5kIHRraW50ZXIuZm9udCBpbiAzLjAuICBBcyBhIHJlc3VsdCwgaW1wb3J0cyBvZiBpZGxlbGliIGZpbGVzIHRoYXQgd29ya2VkIGluIDMuNSB3aWxsIHVzdWFsbHkgbm90IHdvcmsgaW4gMy42LiAgQXQgbGVhc3QgYSBtb2R1bGUgbmFtZSBjaGFuZ2Ugd2lsbCBiZSBuZWVkZWQgKHNlZSBpZGxlbGliL1JFQURNRS50eHQpLCBzb21ldGltZXMgbW9yZS4gIChOYW1lIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgQWwgU3dpZWdhcnQgYW5kIFRlcnJ5IFJlZWR5IGluIDppc3N1ZTpgMjQyMjVgLiAgTW9zdCBpZGxlbGliIHBhdGNoZXMgc2luY2UgaGF2ZSBiZWVuIGFuZCB3aWxsIGJlIHBhcnQgb2YgdGhlIHByb2Nlc3MuKQorCitJbiBjb21wZW5zYXRpb24sIHRoZSBldmVudHVhbCByZXN1bHQgd2l0aCBiZSB0aGF0IHNvbWUgaWRsZWxpYiBjbGFzc2VzIHdpbGwgYmUgZWFzaWVyIHRvIHVzZSwgd2l0aCBiZXR0ZXIgQVBJcyBhbmQgZG9jc3RyaW5ncyBleHBsYWluaW5nIHRoZW0uICBBZGRpdGlvbmFsIHVzZWZ1bCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvIGlkbGVsaWIgd2hlbiBhdmFpbGFibGUuCisKKworaW1wb3J0bGliCistLS0tLS0tLS0KKworOmNsYXNzOmBpbXBvcnRsaWIudXRpbC5MYXp5TG9hZGVyYCBub3cgY2FsbHMKKzptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgb24gdGhlIHdyYXBwZWQgbG9hZGVyLCByZW1vdmluZyB0aGUKK3Jlc3RyaWN0aW9uIHRoYXQgOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkJ1aWx0aW5JbXBvcnRlcmAgYW5kCis6Y2xhc3M6YGltcG9ydGxpYi5tYWNoaW5lcnkuRXh0ZW5zaW9uRmlsZUxvYWRlcmAgY291bGRuJ3QgYmUgdXNlZCB3aXRoCis6Y2xhc3M6YGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXJgLgorCisKK29zCistLQorCitBIG5ldyA6bWV0aDpgfm9zLnNjYW5kaXIuY2xvc2VgIG1ldGhvZCBhbGxvd3MgZXhwbGljaXRseSBjbG9zaW5nIGEKKzpmdW5jOmB+b3Muc2NhbmRpcmAgaXRlcmF0b3IuICBUaGUgOmZ1bmM6YH5vcy5zY2FuZGlyYCBpdGVyYXRvciBub3cKK3N1cHBvcnRzIHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYCBwcm90b2NvbC4gIElmIGEgOmZ1bmM6YHNjYW5kaXJgCitpdGVyYXRvciBpcyBuZWl0aGVyIGV4aGF1c3RlZCBub3IgZXhwbGljaXRseSBjbG9zZWQgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgCit3aWxsIGJlIGVtaXR0ZWQgaW4gaXRzIGRlc3RydWN0b3IuCisoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI1OTk0YC4pCisKKworcGlja2xlCistLS0tLS0KKworT2JqZWN0cyB0aGF0IG5lZWQgY2FsbGluZyBgYF9fbmV3X19gYCB3aXRoIGtleXdvcmQgYXJndW1lbnRzIGNhbiBub3cgYmUgcGlja2xlZAordXNpbmcgOnJlZjpgcGlja2xlIHByb3RvY29scyA8cGlja2xlLXByb3RvY29scz5gIG9sZGVyIHRoYW4gcHJvdG9jb2wgdmVyc2lvbiA0LgorUHJvdG9jb2wgdmVyc2lvbiA0IGFscmVhZHkgc3VwcG9ydHMgdGhpcyBjYXNlLiAgKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeQorU3RvcmNoYWthIGluIDppc3N1ZTpgMjQxNjRgLikKKworCityZWFkbGluZQorLS0tLS0tLS0KKworQWRkZWQgOmZ1bmM6YH5yZWFkbGluZS5zZXRfYXV0b19oaXN0b3J5YCB0byBlbmFibGUgb3IgZGlzYWJsZQorYXV0b21hdGljIGFkZGl0aW9uIG9mIGlucHV0IHRvIHRoZSBoaXN0b3J5IGxpc3QuICAoQ29udHJpYnV0ZWQgYnkKK1R5bGVyIENyb21wdG9uIGluIDppc3N1ZTpgMjY4NzBgLikKKworCitybGNvbXBsZXRlcgorLS0tLS0tLS0tLS0KKworUHJpdmF0ZSBhbmQgc3BlY2lhbCBhdHRyaWJ1dGUgbmFtZXMgbm93IGFyZSBvbWl0dGVkIHVubGVzcyB0aGUgcHJlZml4IHN0YXJ0cword2l0aCB1bmRlcnNjb3Jlcy4gIEEgc3BhY2Ugb3IgYSBjb2xvbiBpcyBhZGRlZCBhZnRlciBzb21lIGNvbXBsZXRlZCBrZXl3b3Jkcy4KKyhDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjUwMTFgIGFuZCA6aXNzdWU6YDI1MjA5YC4pCisKK05hbWVzIG9mIG1vc3QgYXR0cmlidXRlcyBsaXN0ZWQgYnkgOmZ1bmM6YGRpcmAgYXJlIG5vdyBjb21wbGV0ZWQuCitQcmV2aW91c2x5LCBuYW1lcyBvZiBwcm9wZXJ0aWVzIGFuZCBzbG90cyB3aGljaCB3ZXJlIG5vdCB5ZXQgY3JlYXRlZCBvbgorYW4gaW5zdGFuY2Ugd2VyZSBleGNsdWRlZC4gIChDb250cmlidXRlZCBieSBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjU1OTBgLikKKworCitzaXRlCistLS0tCisKK1doZW4gc3BlY2lmeWluZyBwYXRocyB0byBhZGQgdG8gOmF0dHI6YHN5cy5wYXRoYCBpbiBhIGAucHRoYCBmaWxlLAoreW91IG1heSBub3cgc3BlY2lmeSBmaWxlIHBhdGhzIG9uIHRvcCBvZiBkaXJlY3RvcmllcyAoZS5nLiB6aXAgZmlsZXMpLgorKENvbnRyaWJ1dGVkIGJ5IFdvbGZnYW5nIExhbmduZXIgaW4gOmlzc3VlOmAyNjU4N2ApLgorCisKK3NxbGl0ZTMKKy0tLS0tLS0KKworKiA6YXR0cjpgc3FsaXRlMy5DdXJzb3IubGFzdHJvd2lkYCBub3cgc3VwcG9ydHMgdGhlIGBgUkVQTEFDRWBgIHN0YXRlbWVudC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEFsZXggTG9yZFRob3JzZW4gaW4gOmlzc3VlOmAxNjg2NGAuKQorCisKK3NvY2tldAorLS0tLS0tCisKK1RoZSA6ZnVuYzpgfnNvY2tldC5zb2NrZXQuaW9jdGxgIGZ1bmN0aW9uIG5vdyBzdXBwb3J0cyB0aGUgOmRhdGE6YH5zb2NrZXQuU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGAKK2NvbnRyb2wgY29kZS4KKyhDb250cmlidXRlZCBieSBEYW5pZWwgU3Rva2VzIGluIDppc3N1ZTpgMjY1MzZgLikKKworCitzb2NrZXRzZXJ2ZXIKKy0tLS0tLS0tLS0tLQorCitTZXJ2ZXJzIGJhc2VkIG9uIHRoZSA6bW9kOmBzb2NrZXRzZXJ2ZXJgIG1vZHVsZSwgaW5jbHVkaW5nIHRob3NlCitkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCis6bW9kOmB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJgLCBub3cgc3VwcG9ydCB0aGUgOnRlcm06YGNvbnRleHQgbWFuYWdlcmAKK3Byb3RvY29sLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjQwNGAuKQorCitUaGUgOmF0dHI6YH5zb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIGF0dHJpYnV0ZSBvZgorOmNsYXNzOmB+c29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyYCBjbGFzc2VzIG5vdyBpbXBsZW1lbnRzCit0aGUgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLiAgSW4gcGFydGljdWxhciwKK2NhbGxpbmcgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS53cml0ZWAgaXMgbm93IGd1YXJhbnRlZWQgdG8gc2VuZCB0aGUKK2RhdGEgaW4gZnVsbC4gIChDb250cmlidXRlZCBieSBNYXJ0aW4gUGFudGVyIGluIDppc3N1ZTpgMjY3MjFgLikKKworCitzdWJwcm9jZXNzCistLS0tLS0tLS0tCisKKzpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAgZGVzdHJ1Y3RvciBub3cgZW1pdHMgYSA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIHdhcm5pbmcKK2lmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuIFVzZSB0aGUgY29udGV4dCBtYW5hZ2VyIHByb3RvY29sIChgYHdpdGgKK3Byb2M6IC4uLmBgKSBvciBjYWxsIGV4cGxpY2l0bHkgdGhlIDptZXRoOmB+c3VicHJvY2Vzcy5Qb3Blbi53YWl0YCBtZXRob2QgdG8KK3JlYWQgdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjc0MWApLgorCisKK3RlbG5ldGxpYgorLS0tLS0tLS0tCisKKzpjbGFzczpgfnRlbG5ldGxpYi5UZWxuZXRgIGlzIG5vdyBhIGNvbnRleHQgbWFuYWdlciAoY29udHJpYnV0ZWQgYnkKK1N0w6lwaGFuZSBXaXJ0ZWwgaW4gOmlzc3VlOmAyNTQ4NWApLgorCisKK3RraW50ZXIKKy0tLS0tLS0KKworQWRkZWQgbWV0aG9kcyA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfYWRkYCwKKzptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV9yZW1vdmVgIGFuZCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfaW5mb2AKK2luIHRoZSA6Y2xhc3M6YHRraW50ZXIuVmFyaWFibGVgIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzCis6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfdmFyaWFibGVgLCA6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VgLAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZkZWxldGVgIGFuZAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3ZpbmZvYCB0aGF0IHVzZSBvYnNvbGV0ZSBUY2wgY29tbWFuZHMgYW5kIG1pZ2h0Citub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyMjExNWApLgorCisKK3R5cGluZworLS0tLS0tCisKK1RoZSA6Y2xhc3M6YHR5cGluZy5Db250ZXh0TWFuYWdlcmAgY2xhc3MgaGFzIGJlZW4gYWRkZWQgZm9yCityZXByZXNlbnRpbmcgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgLgorKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NjA5YC4pCisKKwordW5pdHRlc3QubW9jaworLS0tLS0tLS0tLS0tLQorCitUaGUgOmNsYXNzOmB+dW5pdHRlc3QubW9jay5Nb2NrYCBjbGFzcyBoYXMgdGhlIGZvbGxvd2luZyBpbXByb3ZlbWVudHM6CisKKyogVHdvIG5ldyBtZXRob2RzLCA6bWV0aDpgTW9jay5hc3NlcnRfY2FsbGVkKCkKKyAgPHVuaXR0ZXN0Lm1vY2suTW9jay5hc3NlcnRfY2FsbGVkPmAgYW5kIDptZXRoOmBNb2NrLmFzc2VydF9jYWxsZWRfb25jZSgpCisgIDx1bml0dGVzdC5tb2NrLk1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlPmAgdG8gY2hlY2sgaWYgdGhlIG1vY2sgb2JqZWN0CisgIHdhcyBjYWxsZWQuCisgIChDb250cmlidXRlZCBieSBBbWl0IFNhaGEgaW4gOmlzc3VlOmAyNjMyM2AuKQorCisKK3VybGxpYi5yb2JvdHBhcnNlcgorLS0tLS0tLS0tLS0tLS0tLS0tCisKKzpjbGFzczpgfnVybGxpYi5yb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXJgIG5vdyBzdXBwb3J0cyB0aGUgYGBDcmF3bC1kZWxheWBgIGFuZAorYGBSZXF1ZXN0LXJhdGVgYCBleHRlbnNpb25zLgorKENvbnRyaWJ1dGVkIGJ5IE5pa29sYXkgQm9nb3ljaGV2IGluIDppc3N1ZTpgMTYwOTlgLikKKworCit3YXJuaW5ncworLS0tLS0tLS0KKworQSBuZXcgb3B0aW9uYWwgKnNvdXJjZSogcGFyYW1ldGVyIGhhcyBiZWVuIGFkZGVkIHRvIHRoZQorOmZ1bmM6YHdhcm5pbmdzLndhcm5fZXhwbGljaXRgIGZ1bmN0aW9uOiB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKzpleGM6YFJlc291cmNlV2FybmluZ2AuIEEgKnNvdXJjZSogYXR0cmlidXRlIGhhcyBhbHNvIGJlZW4gYWRkZWQgdG8KKzpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgIChjb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyNjU2OGAgYW5kIDppc3N1ZTpgMjY1NjdgKS4KKworV2hlbiBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZyBpcyBsb2dnZWQsIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgbm93Cit1c2VkIHRvIHRyeSB0byByZXRyaWV2ZSB0aGUgdHJhY2ViYWNrIHdoZXJlIHRoZSBkZXRyb3llZCBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKworRXhhbXBsZSB3aXRoIHRoZSBzY3JpcHQgYGBleGFtcGxlLnB5YGA6OgorCisgICAgaW1wb3J0IHdhcm5pbmdzCisKKyAgICBkZWYgZnVuYygpOgorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKworICAgIGYgPSBmdW5jKCkKKyAgICBmID0gTm9uZQorCitPdXRwdXQgb2YgdGhlIGNvbW1hbmQgYGBweXRob24zLjYgLVdkIC1YIHRyYWNlbWFsbG9jPTUgZXhhbXBsZS5weWBgOjoKKworICAgIGV4YW1wbGUucHk6NzogUmVzb3VyY2VXYXJuaW5nOiB1bmNsb3NlZCBmaWxlIDxfaW8uVGV4dElPV3JhcHBlciBuYW1lPSdleGFtcGxlLnB5JyBtb2RlPSdyJyBlbmNvZGluZz0nVVRGLTgnPgorICAgICAgZiA9IE5vbmUKKyAgICBPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KToKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNAorICAgICAgICByZXR1cm4gb3BlbihfX2ZpbGVfXykKKyAgICAgIEZpbGUgImV4YW1wbGUucHkiLCBsaW5lbm8gNgorICAgICAgICBmID0gZnVuYygpCisKK1RoZSAiT2JqZWN0IGFsbG9jYXRlZCBhdCIgdHJhY2ViYWNrIGlzIG5ldyBhbmQgb25seSBkaXNwbGF5ZWQgaWYKKzptb2Q6YHRyYWNlbWFsbG9jYCBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGlmIHRoZQorOm1vZDpgd2FybmluZ3NgIHdhcyBhbHJlYWR5IGltcG9ydGVkLgorCisKK3dpbnJlZworLS0tLS0tCisKK0FkZGVkIHRoZSA2NC1iaXQgaW50ZWdlciB0eXBlIDpkYXRhOmBSRUdfUVdPUkQgPHdpbnJlZy5SRUdfUVdPUkQ+YC4KKyhDb250cmlidXRlZCBieSBDbGVtZW50IFJvdWF1bHQgaW4gOmlzc3VlOmAyMzAyNmAuKQorCisKK3ppcGZpbGUKKy0tLS0tLS0KKworQSBuZXcgOm1ldGg6YFppcEluZm8uZnJvbV9maWxlKCkgPHppcGZpbGUuWmlwSW5mby5mcm9tX2ZpbGU+YCBjbGFzcyBtZXRob2QKK2FsbG93cyBtYWtpbmcgYSA6Y2xhc3M6YH56aXBmaWxlLlppcEluZm9gIGluc3RhbmNlIGZyb20gYSBmaWxlc3lzdGVtIGZpbGUuCitBIG5ldyA6bWV0aDpgWmlwSW5mby5pc19kaXIoKSA8emlwZmlsZS5aaXBJbmZvLmlzX2Rpcj5gIG1ldGhvZCBjYW4gYmUgdXNlZAordG8gY2hlY2sgaWYgdGhlIDpjbGFzczpgfnppcGZpbGUuWmlwSW5mb2AgaW5zdGFuY2UgcmVwcmVzZW50cyBhIGRpcmVjdG9yeS4KKyhDb250cmlidXRlZCBieSBUaG9tYXMgS2x1eXZlciBpbiA6aXNzdWU6YDI2MDM5YC4pCisKK1RoZSA6bWV0aDpgWmlwRmlsZS5vcGVuKCkgPHppcGZpbGUuWmlwRmlsZS5vcGVuPmAgbWV0aG9kIGNhbiBub3cgYmUgdXNlZCB0bword3JpdGUgZGF0YSBpbnRvIGEgWklQIGZpbGUsIGFzIHdlbGwgYXMgZm9yIGV4dHJhY3RpbmcgZGF0YS4KKyhDb250cmlidXRlZCBieSBUaG9tYXMgS2x1eXZlciBpbiA6aXNzdWU6YDI2MDM5YC4pCisKKworemxpYgorLS0tLQorCitUaGUgOmZ1bmM6YH56bGliLmNvbXByZXNzYCBmdW5jdGlvbiBub3cgYWNjZXB0cyBrZXl3b3JkIGFyZ3VtZW50cy4KKyhDb250cmlidXRlZCBieSBBdml2IFBhbGl2b2RhIGluIDppc3N1ZTpgMjYyNDNgLikKKworCitmaWxlaW5wdXQKKy0tLS0tLS0tLQorCis6ZnVuYzpgfmZpbGVpbnB1dC5ob29rX2VuY29kZWRgIG5vdyBzdXBwb3J0cyB0aGUgKmVycm9ycyogYXJndW1lbnQuCisoQ29udHJpYnV0ZWQgYnkgSm9zZXBoIEhhY2ttYW4gaW4gOmlzc3VlOmAyNTc4OGAuKQorCisKK09wdGltaXphdGlvbnMKKz09PT09PT09PT09PT0KKworKiBUaGUgQVNDSUkgZGVjb2RlciBpcyBub3cgdXAgdG8gNjAgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBpZ25vcmVgYCBhbmQgYGByZXBsYWNlYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjQ4NzBgKS4KKworKiBUaGUgQVNDSUkgYW5kIHRoZSBMYXRpbjEgZW5jb2RlcnMgYXJlIG5vdyB1cCB0byAzIHRpbWVzIGFzIGZhc3QgZm9yIHRoZQorICBlcnJvciBoYW5kbGVyIGBgc3Vycm9nYXRlZXNjYXBlYGAgKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUyMjdgKS4KKworKiBUaGUgVVRGLTggZW5jb2RlciBpcyBub3cgdXAgdG8gNzUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAsIGBgc3Vycm9nYXRlZXNjYXBlYGAsIGBgc3Vycm9nYXRlcGFzc2BgIChDb250cmlidXRlZAorICBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI1MjY3YCkuCisKKyogVGhlIFVURi04IGRlY29kZXIgaXMgbm93IHVwIHRvIDE1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yIGhhbmRsZXJzCisgIGBgaWdub3JlYGAsIGBgcmVwbGFjZWBgIGFuZCBgYHN1cnJvZ2F0ZWVzY2FwZWBgIChDb250cmlidXRlZAorICBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI1MzAxYCkuCisKKyogYGBieXRlcyAlIGFyZ3NgYCBpcyBub3cgdXAgdG8gMiB0aW1lcyBmYXN0ZXIuIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lcgorICBpbiA6aXNzdWU6YDI1MzQ5YCkuCisKKyogYGBieXRlYXJyYXkgJSBhcmdzYGAgaXMgbm93IGJldHdlZW4gMi41IGFuZCA1IHRpbWVzIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5CisgIFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUzOTlgKS4KKworKiBPcHRpbWl6ZSA6bWV0aDpgYnl0ZXMuZnJvbWhleGAgYW5kIDptZXRoOmBieXRlYXJyYXkuZnJvbWhleGA6IHRoZXkgYXJlIG5vdworICBiZXR3ZWVuIDJ4IGFuZCAzLjV4IGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjU0MDFgKS4KKworKiBPcHRpbWl6ZSBgYGJ5dGVzLnJlcGxhY2UoYicnLCBiJy4nKWBgIGFuZCBgYGJ5dGVhcnJheS5yZXBsYWNlKGInJywgYicuJylgYDoKKyAgdXAgdG8gODAlIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IEpvc2ggU25pZGVyIGluIDppc3N1ZTpgMjY1NzRgKS4KKworKiBBbGxvY2F0b3IgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGRvbWFpbgorICAoOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWApIG5vdyB1c2UgdGhlIDpyZWY6YHB5bWFsbG9jIG1lbW9yeSBhbGxvY2F0b3IKKyAgPHB5bWFsbG9jPmAgaW5zdGVhZCBvZiA6YzpmdW5jOmBtYWxsb2NgIGZ1bmN0aW9uIG9mIHRoZSBDIGxpYnJhcnkuIFRoZQorICBweW1hbGxvYyBhbGxvY2F0b3IgaXMgb3B0aW1pemVkIGZvciBvYmplY3RzIHNtYWxsZXIgb3IgZXF1YWwgdG8gNTEyIGJ5dGVzCisgIHdpdGggYSBzaG9ydCBsaWZldGltZSwgYW5kIHVzZSA6YzpmdW5jOmBtYWxsb2NgIGZvciBsYXJnZXIgbWVtb3J5IGJsb2Nrcy4KKyAgKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjYyNDlgKS4KKworKiA6ZnVuYzpgcGlja2xlLmxvYWRgIGFuZCA6ZnVuYzpgcGlja2xlLmxvYWRzYCBhcmUgbm93IHVwIHRvIDEwJSBmYXN0ZXIgd2hlbgorICBkZXNlcmlhbGl6aW5nIG1hbnkgc21hbGwgb2JqZWN0cyAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4KKyAgOmlzc3VlOmAyNzA1NmApLgorCitCdWlsZCBhbmQgQyBBUEkgQ2hhbmdlcworPT09PT09PT09PT09PT09PT09PT09PT0KKworKiBOZXcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgQVBJIHdoaWNoIGluZGljYXRlcyBpZiBmbHVzaGluZyBidWZmZXJlZCBkYXRhCisgIGZhaWxlZCAoOmlzc3VlOmA1MzE5YCkuCisKKyogOmM6ZnVuYzpgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzYCBub3cgc3VwcG9ydHMgOnJlZjpgcG9zaXRpb25hbC1vbmx5CisgIHBhcmFtZXRlcnMgPHBvc2l0aW9uYWwtb25seV9wYXJhbWV0ZXI+YC4gIFBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzIGFyZQorICBkZWZpbmVkIGJ5IGVtcHR5IG5hbWVzLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDI2MjgyYCkuCisKKworRGVwcmVjYXRlZAorPT09PT09PT09PQorCitOZXcgS2V5d29yZHMKKy0tLS0tLS0tLS0tLQorCitgYGFzeW5jYGAgYW5kIGBgYXdhaXRgYCBhcmUgbm90IHJlY29tbWVuZGVkIHRvIGJlIHVzZWQgYXMgdmFyaWFibGUsIGNsYXNzLAorZnVuY3Rpb24gb3IgbW9kdWxlIG5hbWVzLiAgSW50cm9kdWNlZCBieSA6cGVwOmA0OTJgIGluIFB5dGhvbiAzLjUsIHRoZXkgd2lsbAorYmVjb21lIHByb3BlciBrZXl3b3JkcyBpbiBQeXRob24gMy43LgorCisKK0RlcHJlY2F0ZWQgUHl0aG9uIG1vZHVsZXMsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogOm1ldGg6YGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlRmlsZUxvYWRlci5sb2FkX21vZHVsZWAgYW5kCisgIDptZXRoOmBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZWxlc3NGaWxlTG9hZGVyLmxvYWRfbW9kdWxlYCBhcmUgbm93CisgIGRlcHJlY2F0ZWQuIFRoZXkgd2VyZSB0aGUgb25seSByZW1haW5pbmcgaW1wbGVtZW50YXRpb25zIG9mCisgIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgaW4gOm1vZDpgaW1wb3J0bGliYCB0aGF0IGhhZCBub3QKKyAgYmVlbiBkZXByZWNhdGVkIGluIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbiBpbiBmYXZvdXIgb2YKKyAgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYC4KKworCitEZXByZWNhdGVkIGZ1bmN0aW9ucyBhbmQgdHlwZXMgb2YgdGhlIEMgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogTm9uZSB5ZXQuCisKKworRGVwcmVjYXRlZCBmZWF0dXJlcworLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqIFRoZSBgYHB5dmVudmBgIHNjcmlwdCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgYHB5dGhvbjMgLW0gdmVudmBgLgorICBUaGlzIHByZXZlbnRzIGNvbmZ1c2lvbiBhcyB0byB3aGF0IFB5dGhvbiBpbnRlcnByZXRlciBgYHB5dmVudmBgIGlzCisgIGNvbm5lY3RlZCB0byBhbmQgdGh1cyB3aGF0IFB5dGhvbiBpbnRlcnByZXRlciB3aWxsIGJlIHVzZWQgYnkgdGhlIHZpcnR1YWwKKyAgZW52aXJvbm1lbnQuIChDb250cmlidXRlZCBieSBCcmV0dCBDYW5ub24gaW4gOmlzc3VlOmAyNTE1NGAuKQorCisqIFdoZW4gcGVyZm9ybWluZyBhIHJlbGF0aXZlIGltcG9ydCwgZmFsbGluZyBiYWNrIG9uIGBgX19uYW1lX19gYCBhbmQKKyAgYGBfX3BhdGhfX2BgIGZyb20gdGhlIGNhbGxpbmcgbW9kdWxlIHdoZW4gYGBfX3NwZWNfX2BgIG9yCisgIGBgX19wYWNrYWdlX19gYCBhcmUgbm90IGRlZmluZWQgbm93IHJhaXNlcyBhbiA6ZXhjOmBJbXBvcnRXYXJuaW5nYC4KKyAgKENvbnRyaWJ1dGVkIGJ5IFJvc2UgQW1lcyBpbiA6aXNzdWU6YDI1NzkxYC4pCisKKworRGVwcmVjYXRlZCBQeXRob24gYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogUmFpc2luZyB0aGUgOmV4YzpgU3RvcEl0ZXJhdGlvbmAgZXhjZXB0aW9uIGluc2lkZSBhIGdlbmVyYXRvciB3aWxsIG5vdyBnZW5lcmF0ZSBhCisgIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AsIGFuZCB3aWxsIHRyaWdnZXIgYSA6ZXhjOmBSdW50aW1lRXJyb3JgIGluIFB5dGhvbiAzLjcuCisgIFNlZSA6cmVmOmB3aGF0c25ldy1wZXAtNDc5YCBmb3IgZGV0YWlscy4KKworCitSZW1vdmVkCis9PT09PT09CisKK0FQSSBhbmQgRmVhdHVyZSBSZW1vdmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYGBpbnNwZWN0LmdldG1vZHVsZWluZm8oKWBgIHdhcyByZW1vdmVkICh3YXMgZGVwcmVjYXRlZCBzaW5jZSBDUHl0aG9uIDMuMykuCisgIDpmdW5jOmBpbnNwZWN0LmdldG1vZHVsZW5hbWVgIHNob3VsZCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIG1vZHVsZQorICBuYW1lIGZvciBhIGdpdmVuIHBhdGguCisKKyogYGB0cmFjZWJhY2suSWdub3JlYGAgY2xhc3MgYW5kIGBgdHJhY2ViYWNrLnVzYWdlYGAsIGBgdHJhY2ViYWNrLm1vZG5hbWVgYCwKKyAgYGB0cmFjZWJhY2suZnVsbG1vZG5hbWVgYCwgYGB0cmFjZWJhY2suZmluZF9saW5lc19mcm9tX2NvZGVgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9saW5lc2BgLCBgYHRyYWNlYmFjay5maW5kX3N0cmluZ3NgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9leGVjdXRhYmxlX2xpbmVzYGAgbWV0aG9kcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgOm1vZDpgdHJhY2ViYWNrYCBtb2R1bGUuIFRoZXkgd2VyZSB1bmRvY3VtZW50ZWQgbWV0aG9kcyBkZXByZWNhdGVkIHNpbmNlCisgIFB5dGhvbiAzLjIgYW5kIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgZnJvbSBwcml2YXRlIG1ldGhvZHMuCisKKyogVGhlIGBgdGtfbWVudUJhcigpYGAgYW5kIGBgdGtfYmluZEZvclRyYXZlcnNhbCgpYGAgZHVtbXkgbWV0aG9kcyBpbgorICA6bW9kOmB0a2ludGVyYCB3aWRnZXQgY2xhc3NlcyB3ZXJlIHJlbW92ZWQgKGNvcnJlc3BvbmRpbmcgVGsgY29tbWFuZHMKKyAgd2VyZSBvYnNvbGV0ZSBzaW5jZSBUayA0LjApLgorCisqIFRoZSA6bWV0aDpgfnppcGZpbGUuWmlwRmlsZS5vcGVuYCBtZXRob2Qgb2YgdGhlIDpjbGFzczpgemlwZmlsZS5aaXBGaWxlYAorICBjbGFzcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGBgJ1UnYGAgbW9kZSAod2FzIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDMuNCkuCisgIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nIGNvbXByZXNzZWQgdGV4dCBmaWxlcyBpbgorICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiAncHl0aG9uJyBDb21tYW5kIEJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIGBgQ09VTlRfQUxMT0NTYGAsCisgIGBgU0hPV19BTExPQ19DT1VOVGBgIG9yIGBgU0hPV19UUkFDS19DT1VOVGBgIG1hY3JvcyBpcyBub3cgb2ZmIGJ5CisgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZyB0aGUgYGAtWCBzaG93YWxsb2Njb3VudGBgIG9wdGlvbi4KKyAgSXQgbm93IG91dHB1dHMgdG8gYGBzdGRlcnJgYCBpbnN0ZWFkIG9mIGBgc3Rkb3V0YGAuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjMwMzRgLikKKworCitDaGFuZ2VzIGluIHRoZSBQeXRob24gQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogV2hlbiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGlzIGRlZmluZWQsCisgIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBtdXN0IGFsc28gYmUgZGVmaW5lZC4KKworKiBUaGUgZm9ybWF0IG9mIHRoZSBgYGNvX2xub3RhYmBgIGF0dHJpYnV0ZSBvZiBjb2RlIG9iamVjdHMgY2hhbmdlZCB0byBzdXBwb3J0CisgIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLiBCeSBkZWZhdWx0LCBQeXRob24gZG9lcyBub3QgZW1pdCBieXRlY29kZSB3aXRoCisgIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLiBGdW5jdGlvbnMgdXNpbmcgYGBmcmFtZS5mX2xpbmVub2BgLAorICBgYFB5RnJhbWVfR2V0TGluZU51bWJlcigpYGAgb3IgYGBQeUNvZGVfQWRkcjJMaW5lKClgYCBhcmUgbm90IGFmZmVjdGVkLgorICBGdW5jdGlvbnMgZGVjb2RpbmcgZGlyZWN0bHkgYGBjb19sbm90YWJgYCBzaG91bGQgYmUgdXBkYXRlZCB0byB1c2UgYSBzaWduZWQKKyAgOC1iaXQgaW50ZWdlciB0eXBlIGZvciB0aGUgbGluZSBudW1iZXIgZGVsdGEsIGJ1dCBpdCdzIG9ubHkgcmVxdWlyZWQgdG8KKyAgc3VwcG9ydCBhcHBsaWNhdGlvbnMgdXNpbmcgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIFNlZQorICBgYE9iamVjdHMvbG5vdGFiX25vdGVzLnR4dGBgIGZvciB0aGUgYGBjb19sbm90YWJgYCBmb3JtYXQgYW5kIGhvdyB0byBkZWNvZGUKKyAgaXQsIGFuZCBzZWUgdGhlIDpwZXA6YDUxMWAgZm9yIHRoZSByYXRpb25hbGUuCisKKyogVGhlIGZ1bmN0aW9ucyBpbiB0aGUgOm1vZDpgY29tcGlsZWFsbGAgbW9kdWxlIG5vdyByZXR1cm4gYm9vbGVhbnMgaW5zdGVhZAorICBvZiBgYDFgYCBvciBgYDBgYCB0byByZXByZXNlbnQgc3VjY2VzcyBvciBmYWlsdXJlLCByZXNwZWN0aXZlbHkuIFRoYW5rcyB0bworICBib29sZWFucyBiZWluZyBhIHN1YmNsYXNzIG9mIGludGVnZXJzLCB0aGlzIHNob3VsZCBvbmx5IGJlIGFuIGlzc3VlIGlmIHlvdQorICB3ZXJlIGRvaW5nIGlkZW50aXR5IGNoZWNrcyBmb3IgYGAxYGAgb3IgYGAwYGAuIFNlZSA6aXNzdWU6YDI1NzY4YC4KKworKiBSZWFkaW5nIHRoZSA6YXR0cjpgfnVybGxpYi5wYXJzZS5TcGxpdFJlc3VsdC5wb3J0YCBhdHRyaWJ1dGUgb2YKKyAgOmZ1bmM6YHVybGxpYi5wYXJzZS51cmxzcGxpdGAgYW5kIDpmdW5jOmB+dXJsbGliLnBhcnNlLnVybHBhcnNlYCByZXN1bHRzCisgIG5vdyByYWlzZXMgOmV4YzpgVmFsdWVFcnJvcmAgZm9yIG91dC1vZi1yYW5nZSB2YWx1ZXMsIHJhdGhlciB0aGFuCisgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLiAgU2VlIDppc3N1ZTpgMjAwNTlgLgorCisqIFRoZSA6bW9kOmBpbXBgIG1vZHVsZSBub3cgcmFpc2VzIGEgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBpbnN0ZWFkIG9mCisgIDpleGM6YFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmdgLgorCisqIFRoZSBmb2xsb3dpbmcgbW9kdWxlcyBoYXZlIGhhZCBtaXNzaW5nIEFQSXMgYWRkZWQgdG8gdGhlaXIgOmF0dHI6YF9fYWxsX19gCisgIGF0dHJpYnV0ZXMgdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJczoKKyAgOm1vZDpgY2FsZW5kYXJgLCA6bW9kOmBjZ2lgLCA6bW9kOmBjc3ZgLAorICA6bW9kOmB+eG1sLmV0cmVlLkVsZW1lbnRUcmVlYCwgOm1vZDpgZW51bWAsCisgIDptb2Q6YGZpbGVpbnB1dGAsIDptb2Q6YGZ0cGxpYmAsIDptb2Q6YGxvZ2dpbmdgLCA6bW9kOmBtYWlsYm94YCwKKyAgOm1vZDpgbWltZXR5cGVzYCwgOm1vZDpgb3B0cGFyc2VgLCA6bW9kOmBwbGlzdGxpYmAsIDptb2Q6YHNtdHBkYCwKKyAgOm1vZDpgc3VicHJvY2Vzc2AsIDptb2Q6YHRhcmZpbGVgLCA6bW9kOmB0aHJlYWRpbmdgIGFuZAorICA6bW9kOmB3YXZlYC4gIFRoaXMgbWVhbnMgdGhleSB3aWxsIGV4cG9ydCBuZXcgc3ltYm9scyB3aGVuIGBgaW1wb3J0ICpgYAorICBpcyB1c2VkLiAgU2VlIDppc3N1ZTpgMjM4ODNgLgorCisqIFdoZW4gcGVyZm9ybWluZyBhIHJlbGF0aXZlIGltcG9ydCwgaWYgYGBfX3BhY2thZ2VfX2BgIGRvZXMgbm90IGNvbXBhcmUgZXF1YWwKKyAgdG8gYGBfX3NwZWNfXy5wYXJlbnRgYCB0aGVuIDpleGM6YEltcG9ydFdhcm5pbmdgIGlzIHJhaXNlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NzkxYC4pCisKKyogV2hlbiBhIHJlbGF0aXZlIGltcG9ydCBpcyBwZXJmb3JtZWQgYW5kIG5vIHBhcmVudCBwYWNrYWdlIGlzIGtub3duLCB0aGVuCisgIDpleGM6YEltcG9ydEVycm9yYCB3aWxsIGJlIHJhaXNlZC4gUHJldmlvdXNseSwgOmV4YzpgU3lzdGVtRXJyb3JgIGNvdWxkIGJlCisgIHJhaXNlZC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDE4MDE4YC4pCisKKyogU2VydmVycyBiYXNlZCBvbiB0aGUgOm1vZDpgc29ja2V0c2VydmVyYCBtb2R1bGUsIGluY2x1ZGluZyB0aG9zZQorICBkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCisgIDptb2Q6YHdzZ2lyZWYuc2ltcGxlX3NlcnZlcmAsIG5vdyBvbmx5IGNhdGNoIGV4Y2VwdGlvbnMgZGVyaXZlZAorICBmcm9tIDpleGM6YEV4Y2VwdGlvbmAuIFRoZXJlZm9yZSBpZiBhIHJlcXVlc3QgaGFuZGxlciByYWlzZXMKKyAgYW4gZXhjZXB0aW9uIGxpa2UgOmV4YzpgU3lzdGVtRXhpdGAgb3IgOmV4YzpgS2V5Ym9hcmRJbnRlcnJ1cHRgLAorICA6bWV0aDpgfnNvY2tldHNlcnZlci5CYXNlU2VydmVyLmhhbmRsZV9lcnJvcmAgaXMgbm8gbG9uZ2VyIGNhbGxlZCwgYW5kCisgIHRoZSBleGNlcHRpb24gd2lsbCBzdG9wIGEgc2luZ2xlLXRocmVhZGVkIHNlcnZlci4gKENvbnRyaWJ1dGVkIGJ5CisgIE1hcnRpbiBQYW50ZXIgaW4gOmlzc3VlOmAyMzQzMGAuKQorCisqIDpmdW5jOmBzcHdkLmdldHNwbmFtYCBub3cgcmFpc2VzIGEgOmV4YzpgUGVybWlzc2lvbkVycm9yYCBpbnN0ZWFkIG9mCisgIDpleGM6YEtleUVycm9yYCBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KKworKiBUaGUgOm1ldGg6YHNvY2tldC5zb2NrZXQuY2xvc2VgIG1ldGhvZCBub3cgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZgorICBhbiBlcnJvciAoZS5nLiBFQkFERikgd2FzIHJlcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsLgorICBTZWUgOmlzc3VlOmAyNjY4NWAuCisKKyogVGhlICpkZWNvZGVfZGF0YSogYXJndW1lbnQgZm9yIDpjbGFzczpgc210cGQuU01UUENoYW5uZWxgIGFuZAorICA6Y2xhc3M6YHNtdHBkLlNNVFBTZXJ2ZXJgIGNvbnN0cnVjdG9ycyBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCisgIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXJndW1lbnQgcGFzc2VkIHRvCisgIDptZXRoOmB+c210cGQuU01UUFNlcnZlci5wcm9jZXNzX21lc3NhZ2VgIGlzIG5vdyBhIGJ5dGVzIG9iamVjdCBieQorICBkZWZhdWx0LCBhbmQgYGBwcm9jZXNzX21lc3NhZ2UoKWBgIHdpbGwgYmUgcGFzc2VkIGtleXdvcmQgYXJndW1lbnRzLgorICBDb2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZGVwcmVjYXRpb24KKyAgd2FybmluZyBnZW5lcmF0ZWQgYnkgMy41IHdpbGwgbm90IGJlIGFmZmVjdGVkLgorCisqIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIG9mIHRoZSA6ZnVuYzpgfmpzb24uZHVtcGAsIDpmdW5jOmB+anNvbi5kdW1wc2AsCisgIDpmdW5jOmB+anNvbi5sb2FkYCBhbmQgOmZ1bmM6YH5qc29uLmxvYWRzYCBmdW5jdGlvbnMgYW5kCisgIDpjbGFzczpgfmpzb24uSlNPTkVuY29kZXJgIGFuZCA6Y2xhc3M6YH5qc29uLkpTT05EZWNvZGVyYCBjbGFzcworICBjb25zdHJ1Y3RvcnMgaW4gdGhlIDptb2Q6YGpzb25gIG1vZHVsZSBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seQorICA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDE4NzI2YC4pCisKKworQ2hhbmdlcyBpbiB0aGUgQyBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCBhbGxvY2F0b3IgZmFtaWx5IG5vdyB1c2VzIHRoZSA6cmVmOmBweW1hbGxvYyBhbGxvY2F0b3IKKyAgPHB5bWFsbG9jPmAgcmF0aGVyIHRoYW4gc3lzdGVtIDpjOmZ1bmM6YG1hbGxvY2AuIEFwcGxpY2F0aW9ucyBjYWxsaW5nCisgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2Agd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgY2FuIG5vdyBjcmFzaC4gU2V0IHRoZQorICA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGBgZGVidWdgYCB0byB2YWxpZGF0ZSB0aGUKKyAgdXNhZ2Ugb2YgbWVtb3J5IGFsbG9jYXRvcnMgaW4geW91ciBhcHBsaWNhdGlvbi4gU2VlIDppc3N1ZTpgMjYyNDlgLgorCisqIDpjOmZ1bmM6YFB5X0V4aXRgIChhbmQgdGhlIG1haW4gaW50ZXJwcmV0ZXIpIG5vdyBvdmVycmlkZSB0aGUgZXhpdCBzdGF0dXMKKyAgd2l0aCAxMjAgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSBmYWlsZWQuICBTZWUgOmlzc3VlOmA1MzE5YC4KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QgYi9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CmluZGV4IGVkYjU1MDIuLjdjOTI1MjQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QKKysrIGIvRG9jL3doYXRzbmV3L2luZGV4LnJzdApAQCAtMTEsNiArMTEsNyBAQAogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDIKIAorICAgMy42LnJzdAogICAgMy41LnJzdAogICAgMy40LnJzdAogICAgMy4zLnJzdApkaWZmIC0tZ2l0IGEvR3JhbW1hci9HcmFtbWFyIGIvR3JhbW1hci9HcmFtbWFyCmluZGV4IDk5ZmNlYTAuLjE0YmRlY2QgMTAwNjQ0Ci0tLSBhL0dyYW1tYXIvR3JhbW1hcgorKysgYi9HcmFtbWFyL0dyYW1tYXIKQEAgLTI3LDEzICsyNywxOCBAQAogZnVuY2RlZjogJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZQogCiBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnCi0gICAgICAgWycqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZl1dCi0gICAgIHwgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZikKK3R5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJwotICAgICAgIFsnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWZdXQotICAgICB8ICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYpCit2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKionIHZmcGRlZiBbJywnXQorKQogdmZwZGVmOiBOQU1FCiAKIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCAyZDNlYWNiLi4xYWIzNzZhIDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtMjAxLDkgKzIwMSwxMCBAQAogICAgICAgICAgICAgICAgICAgU2V0Q29tcF9raW5kPTksIERpY3RDb21wX2tpbmQ9MTAsIEdlbmVyYXRvckV4cF9raW5kPTExLAogICAgICAgICAgICAgICAgICAgQXdhaXRfa2luZD0xMiwgWWllbGRfa2luZD0xMywgWWllbGRGcm9tX2tpbmQ9MTQsCiAgICAgICAgICAgICAgICAgICBDb21wYXJlX2tpbmQ9MTUsIENhbGxfa2luZD0xNiwgTnVtX2tpbmQ9MTcsIFN0cl9raW5kPTE4LAotICAgICAgICAgICAgICAgICAgQnl0ZXNfa2luZD0xOSwgTmFtZUNvbnN0YW50X2tpbmQ9MjAsIEVsbGlwc2lzX2tpbmQ9MjEsCi0gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yMiwgU3Vic2NyaXB0X2tpbmQ9MjMsIFN0YXJyZWRfa2luZD0yNCwKLSAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yNSwgTGlzdF9raW5kPTI2LCBUdXBsZV9raW5kPTI3fTsKKyAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2tpbmQ9MTksIEpvaW5lZFN0cl9raW5kPTIwLCBCeXRlc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgTmFtZUNvbnN0YW50X2tpbmQ9MjIsIEVsbGlwc2lzX2tpbmQ9MjMsIENvbnN0YW50X2tpbmQ9MjQsCisgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yNSwgU3Vic2NyaXB0X2tpbmQ9MjYsIFN0YXJyZWRfa2luZD0yNywKKyAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yOCwgTGlzdF9raW5kPTI5LCBUdXBsZV9raW5kPTMwfTsKIHN0cnVjdCBfZXhwciB7CiAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CiAgICAgdW5pb24gewpAQCAtMjk3LDYgKzI5OCwxNiBAQAogICAgICAgICB9IFN0cjsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgaW50IGNvbnZlcnNpb247CisgICAgICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworICAgICAgICB9IEZvcm1hdHRlZFZhbHVlOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGFzZGxfc2VxICp2YWx1ZXM7CisgICAgICAgIH0gSm9pbmVkU3RyOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgIGJ5dGVzIHM7CiAgICAgICAgIH0gQnl0ZXM7CiAgICAgICAgIApAQCAtMzA1LDYgKzMxNiwxMCBAQAogICAgICAgICB9IE5hbWVDb25zdGFudDsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBjb25zdGFudCB2YWx1ZTsKKyAgICAgICAgfSBDb25zdGFudDsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBleHByX3R5IHZhbHVlOwogICAgICAgICAgICAgaWRlbnRpZmllciBhdHRyOwogICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKQEAgLTU0Myw2ICs1NTgsMTIgQEAKIGV4cHJfdHkgX1B5X051bShvYmplY3QgbiwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfU3RyKGEwLCBhMSwgYTIsIGEzKQogZXhwcl90eSBfUHlfU3RyKHN0cmluZyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBGb3JtYXR0ZWRWYWx1ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRm9ybWF0dGVkVmFsdWUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEJ5dGVzKGEwLCBhMSwgYTIsIGEzKSBfUHlfQnl0ZXMoYTAsIGExLCBhMiwgYTMpCiBleHByX3R5IF9QeV9CeXRlcyhieXRlcyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogI2RlZmluZSBOYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpIF9QeV9OYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCkBAIC01NTAsNiArNTcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBFbGxpcHNpcyhhMCwgYTEsIGEyKSBfUHlfRWxsaXBzaXMoYTAsIGExLCBhMikKIGV4cHJfdHkgX1B5X0VsbGlwc2lzKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENvbnN0YW50KGEwLCBhMSwgYTIsIGEzKSBfUHlfQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9Db25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEF0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfQXR0cmlidXRlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCiBleHByX3R5IF9QeV9BdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL1B5dGhvbi5oIGIvSW5jbHVkZS9QeXRob24uaAppbmRleCA4NThkYmQxLi40YzdjOWE0IDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi5oCisrKyBiL0luY2x1ZGUvUHl0aG9uLmgKQEAgLTExNiw2ICsxMTYsNyBAQAogI2luY2x1ZGUgInB5bGlmZWN5Y2xlLmgiCiAjaW5jbHVkZSAiY2V2YWwuaCIKICNpbmNsdWRlICJzeXNtb2R1bGUuaCIKKyNpbmNsdWRlICJvc21vZHVsZS5oIgogI2luY2x1ZGUgImludHJjaGVjay5oIgogI2luY2x1ZGUgImltcG9ydC5oIgogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2FzZGwuaCBiL0luY2x1ZGUvYXNkbC5oCmluZGV4IDQ5NTE1M2MuLjM1ZTlmYTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYXNkbC5oCisrKyBiL0luY2x1ZGUvYXNkbC5oCkBAIC02LDYgKzYsNyBAQAogdHlwZWRlZiBQeU9iamVjdCAqIGJ5dGVzOwogdHlwZWRlZiBQeU9iamVjdCAqIG9iamVjdDsKIHR5cGVkZWYgUHlPYmplY3QgKiBzaW5nbGV0b247Cit0eXBlZGVmIFB5T2JqZWN0ICogY29uc3RhbnQ7CiAKIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFzZGxfYy5weSB3YXMgY29tcGxldGVseQogICAgaW5kZXBlbmRlbnQgb2YgUHl0aG9uLCBidXQgaXQgaXMgYSBnb2FsIHRoZSByZXF1aXJlcyB0b28gbXVjaCB3b3JrCmRpZmYgLS1naXQgYS9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaCBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCmluZGV4IDExZDVmNDIuLjdmYTc1NDAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCisrKyBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCkBAIC0xNyw5ICsxNywxOCBAQAogLyogVGhlc2Ugc3RvcmUgdGhlaXIgbGVuIHNpemVkIGFuc3dlciBpbiB0aGUgZ2l2ZW4gcHJlYWxsb2NhdGVkICpyZXN1bHQgYXJnLiAqLwogZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2xvd2VyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3VwcGVyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKKworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19pbmRleChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19yZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19yaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfY291bnQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIGludCBfUHlfYnl0ZXNfY29udGFpbnMoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19zdGFydHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX2VuZHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKIAogLyogVGhlIG1ha2V0cmFucygpIHN0YXRpYyBtZXRob2QuICovCiBleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19tYWtldHJhbnMoUHlfYnVmZmVyICpmcm0sIFB5X2J1ZmZlciAqdG8pOwpAQCAtMzcsNyArNDYsMTkgQEAKIGV4dGVybiBjb25zdCBjaGFyIF9QeV90aXRsZV9fZG9jX19bXTsKIGV4dGVybiBjb25zdCBjaGFyIF9QeV9jYXBpdGFsaXplX19kb2NfX1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3N3YXBjYXNlX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2NvdW50X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2ZpbmRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaW5kZXhfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmZpbmRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmluZGV4X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3N0YXJ0c3dpdGhfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfZW5kc3dpdGhfX2RvY19fW107CiBleHRlcm4gY29uc3QgY2hhciBfUHlfbWFrZXRyYW5zX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2V4cGFuZHRhYnNfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfbGp1c3RfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmp1c3RfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfY2VudGVyX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3pmaWxsX19kb2NfX1tdOwogCiAvKiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWUgZG9jcyBhcmUgc2hhcmVkIGZyb20gdGhlIC5vLCBub3Qgc3RhdGljICovCiAjZGVmaW5lIFB5RG9jX1NUUlZBUl9zaGFyZWQobmFtZSxzdHIpIGNvbnN0IGNoYXIgbmFtZVtdID0gUHlEb2NfU1RSKHN0cikKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNvYmplY3QuaCBiL0luY2x1ZGUvYnl0ZXNvYmplY3QuaAppbmRleCA2YzFlMGMzLi40NTc4MDY5IDEwMDY0NAotLS0gYS9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9ieXRlc29iamVjdC5oCkBAIC02Miw3ICs2MiwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUJ5dGVzX0NvbmNhdEFuZERlbChQeU9iamVjdCAqKiwgUHlPYmplY3QgKik7CiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9GVU5DKGludCkgX1B5Qnl0ZXNfUmVzaXplKFB5T2JqZWN0ICoqLCBQeV9zc2l6ZV90KTsKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Qnl0ZXNfRm9ybWF0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zvcm1hdEV4KAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICBQeV9zc2l6ZV90IGZvcm1hdF9sZW4sCisgICAgUHlPYmplY3QgKmFyZ3MsCisgICAgaW50IHVzZV9ieXRlYXJyYXkpOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zyb21IZXgoCisgICAgUHlPYmplY3QgKnN0cmluZywKKyAgICBpbnQgdXNlX2J5dGVhcnJheSk7CiAjZW5kaWYKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LAogCQkJCQkJICAgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LApAQCAtMTIzLDYgKzEzMCw4NyBAQAogI2RlZmluZSBGX0FMVAkoMTw8MykKICNkZWZpbmUgRl9aRVJPCSgxPDw0KQogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisvKiBUaGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlIGlzIGJpZzogaXQgY29udGFpbnMgYW4gZW1iZWRlZCAic3RhY2sgYnVmZmVyIi4KKyAgIEEgX1B5Qnl0ZXNXcml0ZXIgdmFyaWFibGUgbXVzdCBiZSBkZWNsYXJlZCBhdCB0aGUgZW5kIG9mIHZhcmlhYmxlcyBpbiBhCisgICBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIGJ5dGVzLCBieXRlYXJyYXkgb3IgTlVMTCAod2hlbiB0aGUgc21hbGwgYnVmZmVyIGlzIHVzZWQpICovCisgICAgUHlPYmplY3QgKmJ1ZmZlcjsKKworICAgIC8qIE51bWJlciBvZiBhbGxvY2F0ZWQgc2l6ZS4gKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKKworICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcywKKyAgICAgICBpbmNyZW1lbnRlZCBieSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCkgKi8KKyAgICBQeV9zc2l6ZV90IG1pbl9zaXplOworCisgICAgLyogSWYgbm9uLXplcm8sIHVzZSBhIGJ5dGVhcnJheSBpbnN0ZWFkIG9mIGEgYnl0ZXMgb2JqZWN0IGZvciBidWZmZXIuICovCisgICAgaW50IHVzZV9ieXRlYXJyYXk7CisKKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLgorICAgICAgIFRoaXMgZmxhZyBtdXN0IGJlIHplcm8gaWYgdXNlX2J5dGVhcnJheSBpcyBub24temVyby4gKi8KKyAgICBpbnQgb3ZlcmFsbG9jYXRlOworCisgICAgLyogU3RhY2sgYnVmZmVyICovCisgICAgaW50IHVzZV9zbWFsbF9idWZmZXI7CisgICAgY2hhciBzbWFsbF9idWZmZXJbNTEyXTsKK30gX1B5Qnl0ZXNXcml0ZXI7CisKKy8qIEluaXRpYWxpemUgYSBieXRlcyB3cml0ZXIKKworICAgQnkgZGVmYXVsdCwgdGhlIG92ZXJhbGxvY2F0aW9uIGlzIGRpc2FibGVkLiBTZXQgdGhlIG92ZXJhbGxvY2F0ZSBhdHRyaWJ1dGUKKyAgIHRvIGNvbnRyb2wgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGJ1ZmZlci4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5Qnl0ZXNXcml0ZXJfSW5pdChfUHlCeXRlc1dyaXRlciAqd3JpdGVyKTsKKworLyogR2V0IHRoZSBidWZmZXIgY29udGVudCBhbmQgcmVzZXQgdGhlIHdyaXRlci4KKyAgIFJldHVybiBhIGJ5dGVzIG9iamVjdCwgb3IgYSBieXRlYXJyYXkgb2JqZWN0IGlmIHVzZV9ieXRlYXJyYXkgaXMgbm9uLXplcm8uCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIpOworCisvKiBEZWFsbG9jYXRlIG1lbW9yeSBvZiBhIHdyaXRlciAoY2xlYXIgaXRzIGludGVybmFsIGJ1ZmZlcikuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcik7CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX0FsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgKnNpemUqIGJ5dGVzLgorICAgQWRkIHNpemUgdG8gdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIHN0ciBpcyB0aGUgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmV0dXJuIHRoZSB1cGRhdGVkIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIG1ha2UgaXQgbGFyZ2VyLgorICAgVGhlIG5ldyBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIHNpemUgYnl0ZXMgYmVjYXVzZSBvZiBvdmVyYWxsb2NhdGlvbi4KKyAgIFJldHVybiB0aGUgdXBkYXRlZCBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLgorCisgICBOb3RlOiBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSB3cml0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2UgdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIFNlZSBhbHNvIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoKS4KKyAgICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogV3JpdGUgYnl0ZXMuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBjb25zdCB2b2lkICpieXRlcywKKyAgICBQeV9zc2l6ZV90IHNpemUpOworI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBiNTM3M2E5Li5kMTk0MDQ0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC0yMDYsNiArMjA2LDE0IEBACiBQeUFQSV9GVU5DKHZvaWQpIF9QeUV2YWxfU2lnbmFsQXN5bmNFeGModm9pZCk7CiAjZW5kaWYKIAorLyogTWFza3MgYW5kIHZhbHVlcyB1c2VkIGJ5IEZPUk1BVF9WQUxVRSBvcGNvZGUuICovCisjZGVmaW5lIEZWQ19NQVNLICAgICAgMHgzCisjZGVmaW5lIEZWQ19OT05FICAgICAgMHgwCisjZGVmaW5lIEZWQ19TVFIgICAgICAgMHgxCisjZGVmaW5lIEZWQ19SRVBSICAgICAgMHgyCisjZGVmaW5lIEZWQ19BU0NJSSAgICAgMHgzCisjZGVmaW5lIEZWU19NQVNLICAgICAgMHg0CisjZGVmaW5lIEZWU19IQVZFX1NQRUMgMHg0CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jb2RlLmggYi9JbmNsdWRlL2NvZGUuaAppbmRleCA4ZWNmMzhhLi5hMzAwZWFkIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NvZGUuaAorKysgYi9JbmNsdWRlL2NvZGUuaApAQCAtMTI2LDcgKzEyNiw3IEBACiAjZW5kaWYKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqbGluZW5vX29iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcywgUHlPYmplY3QgKmxub3RhYik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9sb25nb2JqZWN0LmggYi9JbmNsdWRlL2xvbmdvYmplY3QuaAppbmRleCBhZWQ1OWNlLi5lYWY3YTdlIDEwMDY0NAotLS0gYS9JbmNsdWRlL2xvbmdvYmplY3QuaAorKysgYi9JbmNsdWRlL2xvbmdvYmplY3QuaApAQCAtNjUsNyArNjUsOCBAQAogIyAgZXJyb3IgInZvaWQqIGRpZmZlcmVudCBpbiBzaXplIGZyb20gaW50LCBsb25nIGFuZCBsb25nIGxvbmciCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCAqLwogCi0vKiBVc2VkIGJ5IFB5dGhvbi9teXN0cnRvdWwuYy4gKi8KKy8qIFVzZWQgYnkgUHl0aG9uL215c3RydG91bC5jLCBfUHlCeXRlc19Gcm9tSGV4KCksCisgICBfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoKSwgZXRjLiAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfREFUQSh1bnNpZ25lZCBjaGFyKSBfUHlMb25nX0RpZ2l0VmFsdWVbMjU2XTsKICNlbmRpZgpAQCAtMTgyLDYgKzE4MywxMyBAQAogICAgIGludCBiYXNlLAogICAgIGludCBhbHRlcm5hdGUpOwogCitQeUFQSV9GVU5DKGNoYXIqKSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKAorICAgIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgY2hhciAqc3RyLAorICAgIFB5T2JqZWN0ICpvYmosCisgICAgaW50IGJhc2UsCisgICAgaW50IGFsdGVybmF0ZSk7CisKIC8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQogICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkV3JpdGVyKApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmplY3QuaCBiL0luY2x1ZGUvb2JqZWN0LmgKaW5kZXggNTBkOTc0Ny4uMGM4ODYwMyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vYmplY3QuaAorKysgYi9JbmNsdWRlL29iamVjdC5oCkBAIC03ODUsNyArNzg1LDcgQEAKICAgICAgICAgLS0oX3B5X2RlY3JlZl90bXApLT5vYl9yZWZjbnQgIT0gMCkgICAgICAgICAgICAgXAogICAgICAgICAgICAgX1B5X0NIRUNLX1JFRkNOVChfcHlfZGVjcmVmX3RtcCkgICAgICAgICAgICBcCiAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAogLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vcGNvZGUuaCBiL0luY2x1ZGUvb3Bjb2RlLmgKaW5kZXggM2Y5MTdmYi4uMTcxYWFlNyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vcGNvZGUuaAorKysgYi9JbmNsdWRlL29wY29kZS5oCkBAIC0xMDIsNyArMTAyLDYgQEAKICNkZWZpbmUgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgMTMxCiAjZGVmaW5lIE1BS0VfRlVOQ1RJT04gICAgICAgICAgIDEzMgogI2RlZmluZSBCVUlMRF9TTElDRSAgICAgICAgICAgICAxMzMKLSNkZWZpbmUgTUFLRV9DTE9TVVJFICAgICAgICAgICAgMTM0CiAjZGVmaW5lIExPQURfQ0xPU1VSRSAgICAgICAgICAgIDEzNQogI2RlZmluZSBMT0FEX0RFUkVGICAgICAgICAgICAgICAxMzYKICNkZWZpbmUgU1RPUkVfREVSRUYgICAgICAgICAgICAgMTM3CkBAIC0xMjIsNiArMTIxLDggQEAKICNkZWZpbmUgQlVJTERfVFVQTEVfVU5QQUNLICAgICAgMTUyCiAjZGVmaW5lIEJVSUxEX1NFVF9VTlBBQ0sgICAgICAgIDE1MwogI2RlZmluZSBTRVRVUF9BU1lOQ19XSVRIICAgICAgICAxNTQKKyNkZWZpbmUgRk9STUFUX1ZBTFVFICAgICAgICAgICAgMTU1CisjZGVmaW5lIEJVSUxEX0NPTlNUX0tFWV9NQVAgICAgIDE1NgogCiAvKiBFWENFUFRfSEFORExFUiBpcyBhIHNwZWNpYWwsIGltcGxpY2l0IGJsb2NrIHR5cGUgd2hpY2ggaXMgY3JlYXRlZCB3aGVuCiAgICBlbnRlcmluZyBhbiBleGNlcHQgaGFuZGxlci4gSXQgaXMgbm90IGFuIG9wY29kZSBidXQgd2UgZGVmaW5lIGl0IGhlcmUKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb3Ntb2R1bGUuaCBiL0luY2x1ZGUvb3Ntb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQ2NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jbHVkZS9vc21vZHVsZS5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogb3MgbW9kdWxlIGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X09TTU9EVUxFX0gKKyNkZWZpbmUgUHlfT1NNT0RVTEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T1NfRlNQYXRoKFB5T2JqZWN0ICpwYXRoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfT1NNT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9wYXRjaGxldmVsLmggYi9JbmNsdWRlL3BhdGNobGV2ZWwuaAppbmRleCA0NWU1NzM2Li40MTY0ZmYzIDEwMDY0NAotLS0gYS9JbmNsdWRlL3BhdGNobGV2ZWwuaAorKysgYi9JbmNsdWRlL3BhdGNobGV2ZWwuaApAQCAtMTcsMTMgKzE3LDEzIEBACiAvKiBWZXJzaW9uIHBhcnNlZCBvdXQgaW50byBudW1lcmljIHZhbHVlcyAqLwogLyotLXN0YXJ0IGNvbnN0YW50cy0tKi8KICNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkzCi0jZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNQotI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTIKLSNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCi0jZGVmaW5lIFBZX1JFTEVBU0VfU0VSSUFMCTAKKyNkZWZpbmUgUFlfTUlOT1JfVkVSU0lPTgk2CisjZGVmaW5lIFBZX01JQ1JPX1ZFUlNJT04JMAorI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMCVBZX1JFTEVBU0VfTEVWRUxfQUxQSEEKKyNkZWZpbmUgUFlfUkVMRUFTRV9TRVJJQUwJMgogCiAvKiBWZXJzaW9uIGFzIGEgc3RyaW5nICovCi0jZGVmaW5lIFBZX1ZFUlNJT04gICAgICAJIjMuNS4yKyIKKyNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy42LjBhMisiCiAvKi0tZW5kIGNvbnN0YW50cy0tKi8KIAogLyogVmVyc2lvbiBhcyBhIHNpbmdsZSA0LWJ5dGUgaGV4IG51bWJlciwgZS5nLiAweDAxMDUwMkIyID09IDEuNS4yYjIuCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5X2N1cnNlcy5oIGIvSW5jbHVkZS9weV9jdXJzZXMuaAppbmRleCBmMmMwOGY2Li4zYzIxNjk3IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5X2N1cnNlcy5oCisrKyBiL0luY2x1ZGUvcHlfY3Vyc2VzLmgKQEAgLTEwMyw4ICsxMDMsOCBAQAogI2VuZGlmCiAKIC8qIGdlbmVyYWwgZXJyb3IgbWVzc2FnZXMgKi8KLXN0YXRpYyBjaGFyICpjYXRjaGFsbF9FUlIgID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOwotc3RhdGljIGNoYXIgKmNhdGNoYWxsX05VTEwgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIE5VTEwiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfRVJSW10gID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfTlVMTFtdID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBOVUxMIjsKIAogLyogRnVuY3Rpb24gUHJvdG90eXBlIE1hY3JvcyAtIFRoZXkgYXJlIHVnbHkgYnV0IHZlcnksIHZlcnkgdXNlZnVsLiA7LSkKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWxpZmVjeWNsZS5oIGIvSW5jbHVkZS9weWxpZmVjeWNsZS5oCmluZGV4IGNjZGViZTIuLmU5NmViNzAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlsaWZlY3ljbGUuaAorKysgYi9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKQEAgLTI3LDYgKzI3LDcgQEAKIFB5QVBJX0ZVTkModm9pZCkgX1B5X0luaXRpYWxpemVFeF9Qcml2YXRlKGludCwgaW50KTsKICNlbmRpZgogUHlBUElfRlVOQyh2b2lkKSBQeV9GaW5hbGl6ZSh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeV9GaW5hbGl6ZUV4KHZvaWQpOwogUHlBUElfRlVOQyhpbnQpIFB5X0lzSW5pdGlhbGl6ZWQodm9pZCk7CiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlfTmV3SW50ZXJwcmV0ZXIodm9pZCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjcm8uaCBiL0luY2x1ZGUvcHltYWNyby5oCmluZGV4IDNmNmY1ZGMuLjQ5OTI5ZTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYWNyby5oCisrKyBiL0luY2x1ZGUvcHltYWNyby5oCkBAIC0zNiw2ICszNiwxMCBAQAogI2RlZmluZSBQeV9CVUlMRF9BU1NFUlRfRVhQUihjb25kKSBcCiAgICAgKHNpemVvZihjaGFyIFsxIC0gMiohKGNvbmQpXSkgLSAxKQogCisjZGVmaW5lIFB5X0JVSUxEX0FTU0VSVChjb25kKSAgZG8geyAgICAgICAgIFwKKyAgICAgICAgKHZvaWQpUHlfQlVJTERfQVNTRVJUX0VYUFIoY29uZCk7ICAgXAorICAgIH0gd2hpbGUoMCkKKwogLyogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2aXNpYmxlIGFycmF5CiAKICAgIFRoaXMgZG9lcyBub3Qgd29yayBvbiBwb2ludGVycywgb3IgYXJyYXlzIGRlY2xhcmVkIGFzIFtdLCBvciBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1hdGguaCBiL0luY2x1ZGUvcHltYXRoLmgKaW5kZXggMWVhOWFjMS4uZWQ3NjA1MyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hdGguaAorKysgYi9JbmNsdWRlL3B5bWF0aC5oCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICAgICAgI3ByYWdtYSBmbG9hdF9jb250cm9sIChwb3ApCiAgICAgICAgICNkZWZpbmUgUHlfTkFOIF9faWNjX25hbigpCiAgICAgI2Vsc2UgLyogSUNDX05BTl9SRUxBWEVEIGFzIGRlZmF1bHQgZm9yIEludGVsIENvbXBpbGVyICovCi0gICAgICAgIHN0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CisgICAgICAgIHN0YXRpYyBjb25zdCB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CiAgICAgICAgICNkZWZpbmUgUHlfTkFOIChfX25hbl9zdG9yZS5fX2ljY19uYW4pCiAgICAgI2VuZGlmIC8qIElDQ19OQU5fU1RSSUNUICovCiAjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1lbS5oIGIvSW5jbHVkZS9weW1lbS5oCmluZGV4IDA0M2RiNjQuLjQzMWU1YjYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltZW0uaAorKysgYi9JbmNsdWRlL3B5bWVtLmgKQEAgLTE2LDggKzE2LDUxIEBACiBQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fUmF3Q2FsbG9jKHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSk7CiBQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fUmF3UmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5TWVtX1Jhd0ZyZWUodm9pZCAqcHRyKTsKKworLyogQ29uZmlndXJlIHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMuIFBhc3MgTlVMTCB0byB1c2UgZGVmYXVsdAorICAgYWxsb2NhdG9ycy4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKGNvbnN0IGNoYXIgKm9wdCk7CisKKyNpZmRlZiBXSVRIX1BZTUFMTE9DCitQeUFQSV9GVU5DKGludCkgX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCh2b2lkKTsKICNlbmRpZgogCisvKiBJZGVudGlmaWVyIG9mIGFuIGFkZHJlc3Mgc3BhY2UgKGRvbWFpbikgaW4gdHJhY2VtYWxsb2MgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90OworCisvKiBUcmFjayBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIGluIHRoZSB0cmFjZW1hbGxvYyBtb2R1bGUuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByZXR1cm4gLTEgb24gZXJyb3IgKGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUKKyAgIHRoZSB0cmFjZSkuCisKKyAgIFJldHVybiAtMiBpZiB0cmFjZW1hbGxvYyBpcyBkaXNhYmxlZC4KKworICAgSWYgbWVtb3J5IGJsb2NrIGlzIGFscmVhZHkgdHJhY2tlZCwgdXBkYXRlIHRoZSBleGlzdGluZyB0cmFjZS4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlUcmFjZU1hbGxvY19UcmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgUHlfdWludHB0cl90IHB0ciwKKyAgICBzaXplX3Qgc2l6ZSk7CisKKy8qIFVudHJhY2sgYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBpbiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlLgorICAgRG8gbm90aGluZyBpZiB0aGUgYmxvY2sgd2FzIG5vdCB0cmFja2VkLgorCisgICBSZXR1cm4gLTIgaWYgdHJhY2VtYWxsb2MgaXMgZGlzYWJsZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKAorICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwKKyAgICBQeV91aW50cHRyX3QgcHRyKTsKKworLyogR2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZC4KKworICAgUmV0dXJuIGEgdHVwbGUgb2YgKGZpbGVuYW1lOiBzdHIsIGxpbmVubzogaW50KSB0dXBsZXMuCisKKyAgIFJldHVybiBOb25lIGlmIHRoZSB0cmFjZW1hbGxvYyBtb2R1bGUgaXMgZGlzYWJsZWQgb3IgaWYgdGhlIG1lbW9yeSBibG9jaworICAgaXMgbm90IHRyYWNrZWQgYnkgdHJhY2VtYWxsb2MuCisKKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrKAorICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwKKyAgICBQeV91aW50cHRyX3QgcHRyKTsKKyNlbmRpZiAgIC8qICFQeV9MSU1JVEVEX0FQSSAqLworCiAKIC8qIEJFV0FSRToKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggNjZlMDBkNC4uOGIwYTg5ZiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC04OTcsNCArODk3LDggQEAKICNlbmRpZiAvKiBfTVNDX1ZFUiA+PSAxOTAwICovCiAjZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwogCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorI2VuZGlmCisKICNlbmRpZiAvKiBQeV9QWVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXN0YXRlLmggYi9JbmNsdWRlL3B5c3RhdGUuaAppbmRleCAwNDk5YTc0Li5kNjlkNGM5IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5c3RhdGUuaAorKysgYi9JbmNsdWRlL3B5c3RhdGUuaApAQCAtMjQxLDExICsyNDEsMjMgQEAKICovCiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCk7CiAKLS8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0gKiBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UKLSAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorLyogSXNzdWUgIzI2NTU4OiBGbGFnIHRvIGRpc2FibGUgUHlHSUxTdGF0ZV9DaGVjaygpLgorICAgSWYgc2V0IHRvIG5vbi16ZXJvLCBQeUdJTFN0YXRlX0NoZWNrKCkgYWx3YXlzIHJldHVybiAxLiAqLworUHlBUElfREFUQShpbnQpIF9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQ7CisKKy8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCisgICBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UuCisKKyAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCBpcyBub24temVyby4gKi8KIFB5QVBJX0ZVTkMoaW50KSBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpOworCisvKiBVbnNhZmUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzaW5nbGUgUHlJbnRlcnByZXRlclN0YXRlIHVzZWQgYnkgdGhpcyBwcm9jZXNzJworICAgR0lMU3RhdGUgaW1wbGVtZW50YXRpb24uCisKKyAgIFJldHVybiBOVUxMIGJlZm9yZSBfUHlHSUxTdGF0ZV9Jbml0KCkgaXMgY2FsbGVkIGFuZCBhZnRlciBfUHlHSUxTdGF0ZV9GaW5pKCkKKyAgIGlzIGNhbGxlZC4gKi8KK1B5QVBJX0ZVTkMoUHlJbnRlcnByZXRlclN0YXRlICopIF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUodm9pZCk7CiAjZW5kaWYKIAogI2VuZGlmICAgLyogI2lmZGVmIFdJVEhfVEhSRUFEICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhvbnJ1bi5oIGIvSW5jbHVkZS9weXRob25ydW4uaAppbmRleCA5YzJlODEzLi5jZmEwYTlmIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhvbnJ1bi5oCisrKyBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKQEAgLTY2LDggKzY2LDggQEAKICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgICAgICAgLyogZGVjb2RlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nICovCiAgICAgY29uc3QgY2hhciogZW5jLAogICAgIGludCBzdGFydCwKLSAgICBjaGFyICpwczEsCi0gICAgY2hhciAqcHMyLAorICAgIGNvbnN0IGNoYXIgKnBzMSwKKyAgICBjb25zdCBjaGFyICpwczIsCiAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywKICAgICBpbnQgKmVycmNvZGUsCiAgICAgUHlBcmVuYSAqYXJlbmEpOwpAQCAtNzYsOCArNzYsOCBAQAogICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwKICAgICBjb25zdCBjaGFyKiBlbmMsCiAgICAgaW50IHN0YXJ0LAotICAgIGNoYXIgKnBzMSwKLSAgICBjaGFyICpwczIsCisgICAgY29uc3QgY2hhciAqcHMxLAorICAgIGNvbnN0IGNoYXIgKnBzMiwKICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAogICAgIGludCAqZXJyY29kZSwKICAgICBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGltZS5oIGIvSW5jbHVkZS9weXRpbWUuaAppbmRleCA0OTQzMjJjLi45ODYxMmUxIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGltZS5oCisrKyBiL0luY2x1ZGUvcHl0aW1lLmgKQEAgLTMwLDcgKzMwLDEwIEBACiAgICAgX1B5VGltZV9ST1VORF9GTE9PUj0wLAogICAgIC8qIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpLgogICAgICAgIEZvciBleGFtcGxlLCB1c2VkIGZvciB0aW1lb3V0IHRvIHdhaXQgImF0IGxlYXN0IiBOIHNlY29uZHMuICovCi0gICAgX1B5VGltZV9ST1VORF9DRUlMSU5HCisgICAgX1B5VGltZV9ST1VORF9DRUlMSU5HPTEsCisgICAgLyogUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIuCisgICAgICAgRm9yIGV4YW1wbGUsIHVzZWQgdG8gcm91bmQgZnJvbSBhIFB5dGhvbiBmbG9hdC4gKi8KKyAgICBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTgogfSBfUHlUaW1lX3JvdW5kX3Q7CiAKIC8qIENvbnZlcnQgYSB0aW1lX3QgdG8gYSBQeUxvbmcuICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3NldG9iamVjdC5oIGIvSW5jbHVkZS9zZXRvYmplY3QuaAppbmRleCBmMTdiYzFiLi44N2VjMWM4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3NldG9iamVjdC5oCisrKyBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKQEAgLTEwLDEyICsxMCwxMyBAQAogCiAvKiBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZW50cmllcyBpbiB0aGUgdGFibGU6CiAKLTEuIFVudXNlZDogIGtleSA9PSBOVUxMCi0yLiBBY3RpdmU6ICBrZXkgIT0gTlVMTCBhbmQga2V5ICE9IGR1bW15Ci0zLiBEdW1teTogICBrZXkgPT0gZHVtbXkKKzEuIFVudXNlZDogIGtleSA9PSBOVUxMIGFuZCBoYXNoID09IDAKKzIuIER1bW15OiAgIGtleSA9PSBkdW1teSBhbmQgaGFzaCA9PSAtMQorMy4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teSBhbmQgaGFzaCAhPSAtMQogCi1UaGUgaGFzaCBmaWVsZCBvZiBVbnVzZWQgc2xvdHMgaGF2ZSBubyBtZWFuaW5nLgotVGhlIGhhc2ggZmllbGQgb2YgRHVtbW55IHNsb3RzIGFyZSBzZXQgdG8gLTEKK1RoZSBoYXNoIGZpZWxkIG9mIFVudXNlZCBzbG90cyBpcyBhbHdheXMgemVyby4KKworVGhlIGhhc2ggZmllbGQgb2YgRHVtbXkgc2xvdHMgYXJlIHNldCB0byAtMQogbWVhbmluZyB0aGF0IGR1bW15IGVudHJpZXMgY2FuIGJlIGRldGVjdGVkIGJ5CiBlaXRoZXIgZW50cnktPmtleT09ZHVtbXkgb3IgYnkgZW50cnktPmhhc2g9PS0xLgogKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdHJhY2ViYWNrLmggYi9JbmNsdWRlL3RyYWNlYmFjay5oCmluZGV4IGMzZWNiZTIuLmRiYzc2OWIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdHJhY2ViYWNrLmgKKysrIGIvSW5jbHVkZS90cmFjZWJhY2suaApAQCAtNTMsMTkgKzUzLDYzIEBACiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKTsKIAogLyogV3JpdGUgdGhlIHRyYWNlYmFjayBvZiBhbGwgdGhyZWFkcyBpbnRvIHRoZSBmaWxlICdmZCcuIGN1cnJlbnRfdGhyZWFkIGNhbiBiZQotICAgTlVMTC4gUmV0dXJuIE5VTEwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvbiBlcnJvci4KKyAgIE5VTEwuCisKKyAgIFJldHVybiBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb24gZXJyb3IuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBmb3IgZGVidWcgcHVycG9zZSBvbmx5LiBJdCBjYWxscwogICAgX1B5X0R1bXBUcmFjZWJhY2soKSBmb3IgZWFjaCB0aHJlYWQsIGFuZCBzbyBoYXMgdGhlIHNhbWUgbGltaXRhdGlvbnMuIEl0CiAgICBvbmx5IHdyaXRlIHRoZSB0cmFjZWJhY2sgb2YgdGhlIGZpcnN0IDEwMCB0aHJlYWRzOiB3cml0ZSAiLi4uIiBpZiB0aGVyZSBhcmUKICAgIG1vcmUgdGhyZWFkcy4KIAorICAgSWYgY3VycmVudF90c3RhdGUgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdldCB0aGUgUHl0aG9uIHRocmVhZCBzdGF0ZQorICAgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byBnZXQKKyAgIHRoZSBjdXJyZW50IFB5dGhvbiB0aHJlYWQgc3RhdGUuCisKKyAgIElmIGludGVycCBpcyBOVUxMLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSBmcm9tCisgICB0aGUgY3VycmVudCBQeXRob24gdGhyZWFkIHN0YXRlLCBvciBmcm9tCisgICBfUHlHSUxTdGF0ZV9HZXRJbnRlcnByZXRlclN0YXRlVW5zYWZlKCkgaW4gbGFzdCByZXNvcnQuCisKKyAgIEl0IGlzIGJldHRlciB0byBwYXNzIE5VTEwgdG8gaW50ZXJwIGFuZCBjdXJyZW50X3RzdGF0ZSwgdGhlIGZ1bmN0aW9uIHRyaWVzCisgICBkaWZmZXJlbnQgb3B0aW9ucyB0byByZXRyaWV2ZSB0aGVzZSBpbmZvcm1hdGlvbnMuCisKICAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCiAKIFB5QVBJX0ZVTkMoY29uc3QgY2hhciopIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygKLSAgICBpbnQgZmQsIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAotICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdGhyZWFkKTsKKyAgICBpbnQgZmQsCisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCisgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90c3RhdGUpOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisKKy8qIFdyaXRlIGEgVW5pY29kZSBvYmplY3QgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiBFbmNvZGUgdGhlIHN0cmluZyB0bworICAgQVNDSUkgdXNpbmcgdGhlIGJhY2tzbGFzaHJlcGxhY2UgZXJyb3IgaGFuZGxlci4KKworICAgRG8gbm90aGluZyBpZiB0ZXh0IGlzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBVbmljb2RlCisgICBzdHJpbmcgd2hpY2ggaXMgbm90IHJlYWR5IChQeVVuaWNvZGVfV0NIQVJfS0lORCkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wQVNDSUkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCk7CisKKy8qIEZvcm1hdCBhbiBpbnRlZ2VyIGFzIGRlY2ltYWwgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfRHVtcERlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBGb3JtYXQgYW4gaW50ZWdlciBhcyBoZXhhZGVjaW1hbCBpbnRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQgd2l0aCBhdCBsZWFzdAorICAgd2lkdGggZGlnaXRzLgorCisgICBUaGUgbWF4aW11bSB3aWR0aCBpcyBzaXplb2YodW5zaWduZWQgbG9uZykqMiBkaWdpdHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wSGV4YWRlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisgICAgUHlfc3NpemVfdCB3aWR0aCk7CisKKyNlbmRpZiAgIC8qICFQeV9MSU1JVEVEX0FQSSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKaW5kZXggNTMzZGQ3NS4uMWFmNjIwZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKQEAgLTkwMCw3ICs5MDAsNyBAQAogICAgIC8qIG1pbmltdW0gY2hhcmFjdGVyIChkZWZhdWx0OiAxMjcsIEFTQ0lJKSAqLwogICAgIFB5X1VDUzQgbWluX2NoYXI7CiAKLSAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgYnkgMjUlIChkZWZhdWx0OiAwKS4gKi8KKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLiAqLwogICAgIHVuc2lnbmVkIGNoYXIgb3ZlcmFsbG9jYXRlOwogCiAgICAgLyogSWYgcmVhZG9ubHkgaXMgMSwgYnVmZmVyIGlzIGEgc2hhcmVkIHN0cmluZyAoY2Fubm90IGJlIG1vZGlmaWVkKQpAQCAtOTM0LDYgKzkzNCwyMyBAQAogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW5ndGgsIFB5X1VDUzQgbWF4Y2hhcik7CiAKKy8qIFByZXBhcmUgdGhlIGJ1ZmZlciB0byBoYXZlIGF0IGxlYXN0IHRoZSBraW5kIEtJTkQuCisgICBGb3IgZXhhbXBsZSwga2luZD1QeVVuaWNvZGVfMkJZVEVfS0lORCBlbnN1cmVzIHRoYXQgdGhlIHdyaXRlciB3aWxsCisgICBzdXBwb3J0IGNoYXJhY3RlcnMgaW4gcmFuZ2UgVSswMDAtVStGRkZGLgorCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KKyNkZWZpbmUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZChXUklURVIsIEtJTkQpICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFzc2VydCgoS0lORCkgIT0gUHlVbmljb2RlX1dDSEFSX0tJTkQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoS0lORCkgPD0gKFdSSVRFUiktPmtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgPyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKChXUklURVIpLCAoS0lORCkpKQorCisvKiBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIHVzZSB0aGUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgpCisgICBtYWNybyBpbnN0ZWFkLiAqLworUHlBUElfRlVOQyhpbnQpCitfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCk7CisKIC8qIEFwcGVuZCBhIFVuaWNvZGUgY2hhcmFjdGVyLgogICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCiBQeUFQSV9GVU5DKGludCkKQEAgLTIyNTMsNiArMjI3MCwxMCBAQAogLyogQ2xlYXIgYWxsIHN0YXRpYyBzdHJpbmdzLiAqLwogUHlBUElfRlVOQyh2b2lkKSBfUHlVbmljb2RlX0NsZWFyU3RhdGljU3RyaW5ncyh2b2lkKTsKIAorLyogRmFzdCBlcXVhbGl0eSBjaGVjayB3aGVuIHRoZSBpbnB1dHMgYXJlIGtub3duIHRvIGJlIGV4YWN0IHVuaWNvZGUgdHlwZXMKKyAgIGFuZCB3aGVyZSB0aGUgaGFzaCB2YWx1ZXMgYXJlIGVxdWFsIChpLmUuIGEgdmVyeSBwcm9iYWJsZSBtYXRjaCkgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0VRKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS93YXJuaW5ncy5oIGIvSW5jbHVkZS93YXJuaW5ncy5oCmluZGV4IGVmZmI5ZmFkLi5jMWM2OTkyIDEwMDY0NAotLS0gYS9JbmNsdWRlL3dhcm5pbmdzLmgKKysrIGIvSW5jbHVkZS93YXJuaW5ncy5oCkBAIC0xNyw2ICsxNywxMyBAQAogICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCiAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAgICAgICAgIC8qIEFTQ0lJLWVuY29kZWQgc3RyaW5nICAqLwogICAgIC4uLik7CisKKy8qIEVtaXQgYSBSZXNvdXJjZVdhcm5pbmcgd2FybmluZyAqLworUHlBUElfRlVOQyhpbnQpIFB5RXJyX1Jlc291cmNlV2FybmluZygKKyAgICBQeU9iamVjdCAqc291cmNlLAorICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgY29uc3QgY2hhciAqZm9ybWF0LCAgICAgICAgIC8qIEFTQ0lJLWVuY29kZWQgc3RyaW5nICAqLworICAgIC4uLik7CiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9GVU5DKGludCkgUHlFcnJfV2FybkV4cGxpY2l0T2JqZWN0KAogICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwKZGlmZiAtLWdpdCBhL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5IGIvTGliL19jb2xsZWN0aW9uc19hYmMucHkKaW5kZXggZmM5YzlmMS4uZmZlZTM4NSAxMDA2NDQKLS0tIGEvTGliL19jb2xsZWN0aW9uc19hYmMucHkKKysrIGIvTGliL19jb2xsZWN0aW9uc19hYmMucHkKQEAgLTEwLDcgKzEwLDcgQEAKIGltcG9ydCBzeXMKIAogX19hbGxfXyA9IFsiQXdhaXRhYmxlIiwgIkNvcm91dGluZSIsICJBc3luY0l0ZXJhYmxlIiwgIkFzeW5jSXRlcmF0b3IiLAotICAgICAgICAgICAiSGFzaGFibGUiLCAiSXRlcmFibGUiLCAiSXRlcmF0b3IiLCAiR2VuZXJhdG9yIiwKKyAgICAgICAgICAgIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwgIkdlbmVyYXRvciIsICJSZXZlcnNpYmxlIiwKICAgICAgICAgICAgIlNpemVkIiwgIkNvbnRhaW5lciIsICJDYWxsYWJsZSIsCiAgICAgICAgICAgICJTZXQiLCAiTXV0YWJsZVNldCIsCiAgICAgICAgICAgICJNYXBwaW5nIiwgIk11dGFibGVNYXBwaW5nIiwKQEAgLTI0MCw2ICsyNDAsMjUgQEAKIEl0ZXJhdG9yLnJlZ2lzdGVyKHppcF9pdGVyYXRvcikKIAogCitjbGFzcyBSZXZlcnNpYmxlKEl0ZXJhYmxlKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBSZXZlcnNpYmxlOgorICAgICAgICAgICAgZm9yIEIgaW4gQy5fX21yb19fOgorICAgICAgICAgICAgICAgIGlmICJfX3JldmVyc2VkX18iIGluIEIuX19kaWN0X186CisgICAgICAgICAgICAgICAgICAgIGlmIEIuX19kaWN0X19bIl9fcmV2ZXJzZWRfXyJdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKwogY2xhc3MgR2VuZXJhdG9yKEl0ZXJhdG9yKToKIAogICAgIF9fc2xvdHNfXyA9ICgpCkBAIC02NzAsNyArNjg5LDcgQEAKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gdiA9PSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHYgaXMgdmFsdWUgb3IgdiA9PSB2YWx1ZQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6CkBAIC02ODUsNyArNzA0LDggQEAKIAogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6Ci0gICAgICAgICAgICBpZiB2YWx1ZSA9PSBzZWxmLl9tYXBwaW5nW2tleV06CisgICAgICAgICAgICB2ID0gc2VsZi5fbWFwcGluZ1trZXldCisgICAgICAgICAgICBpZiB2IGlzIHZhbHVlIG9yIHYgPT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKQEAgLTc5NCw3ICs4MTQsNyBAQAogIyMjIFNFUVVFTkNFUyAjIyMKIAogCi1jbGFzcyBTZXF1ZW5jZShTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CitjbGFzcyBTZXF1ZW5jZShTaXplZCwgUmV2ZXJzaWJsZSwgQ29udGFpbmVyKToKIAogICAgICIiIkFsbCB0aGUgb3BlcmF0aW9ucyBvbiBhIHJlYWQtb25seSBzZXF1ZW5jZS4KIApAQCAtODIwLDcgKzg0MCw3IEBACiAKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKICAgICAgICAgZm9yIHYgaW4gc2VsZjoKLSAgICAgICAgICAgIGlmIHYgPT0gdmFsdWU6CisgICAgICAgICAgICBpZiB2IGlzIHZhbHVlIG9yIHYgPT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKZGlmZiAtLWdpdCBhL0xpYi9fcHlkZWNpbWFsLnB5IGIvTGliL19weWRlY2ltYWwucHkKaW5kZXggYzcxOTQyNC4uN2JjZjc1ZiAxMDA2NDQKLS0tIGEvTGliL19weWRlY2ltYWwucHkKKysrIGIvTGliL19weWRlY2ltYWwucHkKQEAgLTE0OCw3ICsxNDgsNyBAQAogX19uYW1lX18gPSAnZGVjaW1hbCcgICAgIyBGb3IgcGlja2xpbmcKIF9fdmVyc2lvbl9fID0gJzEuNzAnICAgICMgSGlnaGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoaXMgY29tcGxpZXMgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgIyBTZWUgaHR0cDovL3NwZWxlb3Ryb3ZlLmNvbS9kZWNpbWFsLwotX19saWJtcGRlY192ZXJzaW9uX18gPSAiMi40LjEiICMgY29tcGF0aWJsZSBsaWJtcGRlYyB2ZXJzaW9uCitfX2xpYm1wZGVjX3ZlcnNpb25fXyA9ICIyLjQuMiIgIyBjb21wYXRpYmxlIGxpYm1wZGVjIHZlcnNpb24KIAogaW1wb3J0IG1hdGggYXMgX21hdGgKIGltcG9ydCBudW1iZXJzIGFzIF9udW1iZXJzCkBAIC0xMDEwLDYgKzEwMTAsNTYgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBEZWNpbWFsVHVwbGUoc2VsZi5fc2lnbiwgdHVwbGUobWFwKGludCwgc2VsZi5faW50KSksIHNlbGYuX2V4cCkKIAorICAgIGRlZiBhc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICAiIiJFeHByZXNzIGEgZmluaXRlIERlY2ltYWwgaW5zdGFuY2UgaW4gdGhlIGZvcm0gbiAvIGQuCisKKyAgICAgICAgUmV0dXJucyBhIHBhaXIgKG4sIGQpIG9mIGludGVnZXJzLiAgV2hlbiBjYWxsZWQgb24gYW4gaW5maW5pdHkKKyAgICAgICAgb3IgTmFOLCByYWlzZXMgT3ZlcmZsb3dFcnJvciBvciBWYWx1ZUVycm9yIHJlc3BlY3RpdmVseS4KKworICAgICAgICA+Pj4gRGVjaW1hbCgnMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMTU3LCA1MCkKKyAgICAgICAgPj4+IERlY2ltYWwoJy0xMjNlNScpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoLTEyMzAwMDAwLCAxKQorICAgICAgICA+Pj4gRGVjaW1hbCgnMC4wMCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMCwgMSkKKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIikKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiAwLCAxCisKKyAgICAgICAgIyBGaW5kIG4sIGQgaW4gbG93ZXN0IHRlcm1zIHN1Y2ggdGhhdCBhYnMoc2VsZikgPT0gbiAvIGQ7CisgICAgICAgICMgd2UnbGwgZGVhbCB3aXRoIHRoZSBzaWduIGxhdGVyLgorICAgICAgICBuID0gaW50KHNlbGYuX2ludCkKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IDA6CisgICAgICAgICAgICAjIHNlbGYgaXMgYW4gaW50ZWdlci4KKyAgICAgICAgICAgIG4sIGQgPSBuICogMTAqKnNlbGYuX2V4cCwgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBGaW5kIGQyLCBkNSBzdWNoIHRoYXQgYWJzKHNlbGYpID0gbiAvICgyKipkMiAqIDUqKmQ1KS4KKyAgICAgICAgICAgIGQ1ID0gLXNlbGYuX2V4cAorICAgICAgICAgICAgd2hpbGUgZDUgPiAwIGFuZCBuICUgNSA9PSAwOgorICAgICAgICAgICAgICAgIG4gLy89IDUKKyAgICAgICAgICAgICAgICBkNSAtPSAxCisKKyAgICAgICAgICAgICMgKG4gJiAtbikuYml0X2xlbmd0aCgpIC0gMSBjb3VudHMgdHJhaWxpbmcgemVyb3MgaW4gYmluYXJ5CisgICAgICAgICAgICAjIHJlcHJlc2VudGF0aW9uIG9mIG4gKHByb3ZpZGVkIG4gaXMgbm9uemVybykuCisgICAgICAgICAgICBkMiA9IC1zZWxmLl9leHAKKyAgICAgICAgICAgIHNoaWZ0MiA9IG1pbigobiAmIC1uKS5iaXRfbGVuZ3RoKCkgLSAxLCBkMikKKyAgICAgICAgICAgIGlmIHNoaWZ0MjoKKyAgICAgICAgICAgICAgICBuID4+PSBzaGlmdDIKKyAgICAgICAgICAgICAgICBkMiAtPSBzaGlmdDIKKworICAgICAgICAgICAgZCA9IDUqKmQ1IDw8IGQyCisKKyAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIG4gPSAtbgorICAgICAgICByZXR1cm4gbiwgZAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAiIiJSZXByZXNlbnRzIHRoZSBudW1iZXIgYXMgYW4gaW5zdGFuY2Ugb2YgRGVjaW1hbC4iIiIKICAgICAgICAgIyBJbnZhcmlhbnQ6ICBldmFsKHJlcHIoZCkpID09IGQKZGlmZiAtLWdpdCBhL0xpYi9fcHlpby5weSBiL0xpYi9fcHlpby5weQppbmRleCAwZDk4Yjc0Li5kMDk0N2YwIDEwMDY0NAotLS0gYS9MaWIvX3B5aW8ucHkKKysrIGIvTGliL19weWlvLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IGFiYwogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGVycm5vCi1pbXBvcnQgYXJyYXkKIGltcG9ydCBzdGF0CiBpbXBvcnQgc3lzCiAjIEltcG9ydCBfdGhyZWFkIGluc3RlYWQgb2YgdGhyZWFkaW5nIHRvIHJlZHVjZSBzdGFydHVwIGNvc3QKQEAgLTE2MSw2ICsxNjAsOCBAQAogICAgIG9wZW5lZCBpbiBhIHRleHQgbW9kZSwgYW5kIGZvciBieXRlcyBhIEJ5dGVzSU8gY2FuIGJlIHVzZWQgbGlrZSBhIGZpbGUKICAgICBvcGVuZWQgaW4gYSBiaW5hcnkgbW9kZS4KICAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlLCBpbnQpOgorICAgICAgICBmaWxlID0gb3MuZnNwYXRoKGZpbGUpCiAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsZSwgKHN0ciwgYnl0ZXMsIGludCkpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZmlsZTogJXIiICUgZmlsZSkKICAgICBpZiBub3QgaXNpbnN0YW5jZShtb2RlLCBzdHIpOgpAQCAtMTgyLDggKzE4Myw4IEBACiAgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcwogICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcwogICAgIGlmICJVIiBpbiBtb2RlczoKLSAgICAgICAgaWYgY3JlYXRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKQorICAgICAgICBpZiBjcmVhdGluZyBvciB3cml0aW5nIG9yIGFwcGVuZGluZyBvciB1cGRhdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAneCcsICd3JywgJ2EnLCBvciAnKyciKQogICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgd2FybmluZ3Mud2FybigiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQpAQCAtMTUxNiw3ICsxNTE3LDcgQEAKICAgICAgICAgaWYgc2VsZi5fZmQgPj0gMCBhbmQgc2VsZi5fY2xvc2VmZCBhbmQgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCd1bmNsb3NlZCBmaWxlICVyJyAlIChzZWxmLCksIFJlc291cmNlV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL19zdHJwdGltZS5weSBiL0xpYi9fc3RycHRpbWUucHkKaW5kZXggZjg0MjI3Yi4uZmU5NDM2MSAxMDA2NDQKLS0tIGEvTGliL19zdHJwdGltZS5weQorKysgYi9MaWIvX3N0cnB0aW1lLnB5CkBAIC0xOTksMTIgKzE5OSwxNSBAQAogICAgICAgICAgICAgJ2YnOiByIig/UDxmPlswLTldezEsNn0pIiwKICAgICAgICAgICAgICdIJzogciIoP1A8SD4yWzAtM118WzAtMV1cZHxcZCkiLAogICAgICAgICAgICAgJ0knOiByIig/UDxJPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdHJzogciIoP1A8Rz5cZFxkXGRcZCkiLAogICAgICAgICAgICAgJ2onOiByIig/UDxqPjM2WzAtNl18M1swLTVdXGR8WzEtMl1cZFxkfDBbMS05XVxkfDAwWzEtOV18WzEtOV1cZHwwWzEtOV18WzEtOV0pIiwKICAgICAgICAgICAgICdtJzogciIoP1A8bT4xWzAtMl18MFsxLTldfFsxLTldKSIsCiAgICAgICAgICAgICAnTSc6IHIiKD9QPE0+WzAtNV1cZHxcZCkiLAogICAgICAgICAgICAgJ1MnOiByIig/UDxTPjZbMC0xXXxbMC01XVxkfFxkKSIsCiAgICAgICAgICAgICAnVSc6IHIiKD9QPFU+NVswLTNdfFswLTRdXGR8XGQpIiwKICAgICAgICAgICAgICd3JzogciIoP1A8dz5bMC02XSkiLAorICAgICAgICAgICAgJ3UnOiByIig/UDx1PlsxLTddKSIsCisgICAgICAgICAgICAnVic6IHIiKD9QPFY+NVswLTNdfDBbMS05XXxbMS00XVxkfFxkKSIsCiAgICAgICAgICAgICAjIFcgaXMgc2V0IGJlbG93IGJ5IHVzaW5nICdVJwogICAgICAgICAgICAgJ3knOiByIig/UDx5PlxkXGQpIiwKICAgICAgICAgICAgICNYWFg6IERvZXMgJ1knIG5lZWQgdG8gd29ycnkgYWJvdXQgaGF2aW5nIGxlc3Mgb3IgbW9yZSB0aGFuCkBAIC0yOTksNiArMzAyLDIyIEBACiAgICAgICAgIHJldHVybiAxICsgZGF5c190b193ZWVrICsgZGF5X29mX3dlZWsKIAogCitkZWYgX2NhbGNfanVsaWFuX2Zyb21fVihpc29feWVhciwgaXNvX3dlZWssIGlzb193ZWVrZGF5KToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEp1bGlhbiBkYXkgYmFzZWQgb24gdGhlIElTTyA4NjAxIHllYXIsIHdlZWssIGFuZCB3ZWVrZGF5LgorICAgIElTTyB3ZWVrcyBzdGFydCBvbiBNb25kYXlzLCB3aXRoIHdlZWsgMDEgYmVpbmcgdGhlIHdlZWsgY29udGFpbmluZyA0IEphbi4KKyAgICBJU08gd2VlayBkYXlzIHJhbmdlIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLgorICAgICIiIgorICAgIGNvcnJlY3Rpb24gPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCA0KS5pc293ZWVrZGF5KCkgKyAzCisgICAgb3JkaW5hbCA9IChpc29fd2VlayAqIDcpICsgaXNvX3dlZWtkYXkgLSBjb3JyZWN0aW9uCisgICAgIyBvcmRpbmFsIG1heSBiZSBuZWdhdGl2ZSBvciAwIG5vdywgd2hpY2ggbWVhbnMgdGhlIGRhdGUgaXMgaW4gdGhlIHByZXZpb3VzCisgICAgIyBjYWxlbmRhciB5ZWFyCisgICAgaWYgb3JkaW5hbCA8IDE6CisgICAgICAgIG9yZGluYWwgKz0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgMSkudG9vcmRpbmFsKCkKKyAgICAgICAgaXNvX3llYXIgLT0gMQorICAgICAgICBvcmRpbmFsIC09IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgcmV0dXJuIGlzb195ZWFyLCBvcmRpbmFsCisKKwogZGVmIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgogICAgICIiIlJldHVybiBhIDItdHVwbGUgY29uc2lzdGluZyBvZiBhIHRpbWUgc3RydWN0IGFuZCBhbiBpbnQgY29udGFpbmluZwogICAgIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZQpAQCAtMzQ1LDE1ICszNjQsMTUgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5jb252ZXJ0ZWQgZGF0YSByZW1haW5zOiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0cmluZ1tmb3VuZC5lbmQoKTpdKQogCi0gICAgeWVhciA9IE5vbmUKKyAgICBpc29feWVhciA9IHllYXIgPSBOb25lCiAgICAgbW9udGggPSBkYXkgPSAxCiAgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAogICAgIHR6ID0gLTEKICAgICB0em9mZnNldCA9IE5vbmUKICAgICAjIERlZmF1bHQgdG8gLTEgdG8gc2lnbmlmeSB0aGF0IHZhbHVlcyBub3Qga25vd247IG5vdCBjcml0aWNhbCB0byBoYXZlLAogICAgICMgdGhvdWdoCi0gICAgd2Vla19vZl95ZWFyID0gLTEKLSAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAtMQorICAgIGlzb193ZWVrID0gd2Vla19vZl95ZWFyID0gTm9uZQorICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IE5vbmUKICAgICAjIHdlZWtkYXkgYW5kIGp1bGlhbiBkZWZhdWx0ZWQgdG8gTm9uZSBzbyBhcyB0byBzaWduYWwgbmVlZCB0byBjYWxjdWxhdGUKICAgICAjIHZhbHVlcwogICAgIHdlZWtkYXkgPSBqdWxpYW4gPSBOb25lCkBAIC0zNzUsNiArMzk0LDggQEAKICAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDAKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1knOgogICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0WydZJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdHJzoKKyAgICAgICAgICAgIGlzb195ZWFyID0gaW50KGZvdW5kX2RpY3RbJ0cnXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ20nOgogICAgICAgICAgICAgbW9udGggPSBpbnQoZm91bmRfZGljdFsnbSddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnQic6CkBAIC00MjAsNiArNDQxLDkgQEAKICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gNgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3ZWVrZGF5IC09IDEKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3UnOgorICAgICAgICAgICAgd2Vla2RheSA9IGludChmb3VuZF9kaWN0Wyd1J10pCisgICAgICAgICAgICB3ZWVrZGF5IC09IDEKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2onOgogICAgICAgICAgICAganVsaWFuID0gaW50KGZvdW5kX2RpY3RbJ2onXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgaW4gKCdVJywgJ1cnKToKQEAgLTQzMCw2ICs0NTQsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIFcgc3RhcnRzIHdlZWsgb24gTW9uZGF5LgogICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1YnOgorICAgICAgICAgICAgaXNvX3dlZWsgPSBpbnQoZm91bmRfZGljdFsnViddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAneic6CiAgICAgICAgICAgICB6ID0gZm91bmRfZGljdFsneiddCiAgICAgICAgICAgICB0em9mZnNldCA9IGludCh6WzE6M10pICogNjAgKyBpbnQoelszOjVdKQpAQCAtNDUwLDMyICs0NzYsNjEgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgIyBEZWFsIHdpdGggdGhlIGNhc2VzIHdoZXJlIGFtYmlndWl0aWVzIGFyaXplCisgICAgIyBkb24ndCBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMgZm9yIElTTyB3ZWVrL3llYXIKKyAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIGlzb195ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc29fd2VlayBpcyBOb25lIG9yIHdlZWtkYXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIG11c3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBhbmQgYSB3ZWVrZGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSAoJyVBJywgJyVhJywgJyV3Jywgb3IgJyV1JykuIikKKyAgICAgICAgaWYganVsaWFuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF5IG9mIHRoZSB5ZWFyIGRpcmVjdGl2ZSAnJWonIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIHdpdGggSVNPIHllYXIgZGlyZWN0aXZlICclRycuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSAnJVknIGluc3RlYWQuIikKKyAgICBlbGlmIHdlZWtfb2ZfeWVhciBpcyBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla2RheSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgbXVzdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIElTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIGFuZCBhIHdlZWtkYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlICgnJUEnLCAnJWEnLCAnJXcnLCBvciAnJXUnKS4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgaXMgaW5jb21wYXRpYmxlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHllYXIgZGlyZWN0aXZlICclWScuIFVzZSB0aGUgSVNPIHllYXIgJyVHJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIpCisKICAgICBsZWFwX3llYXJfZml4ID0gRmFsc2UKICAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIG1vbnRoID09IDIgYW5kIGRheSA9PSAyOToKICAgICAgICAgeWVhciA9IDE5MDQgICMgMTkwNCBpcyBmaXJzdCBsZWFwIHllYXIgb2YgMjB0aCBjZW50dXJ5CiAgICAgICAgIGxlYXBfeWVhcl9maXggPSBUcnVlCiAgICAgZWxpZiB5ZWFyIGlzIE5vbmU6CiAgICAgICAgIHllYXIgPSAxOTAwCisKKwogICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCiAgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCi0gICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtfb2ZfeWVhciAhPSAtMSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKLSAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCi0gICAgICAgIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1Vfb3JfVyh5ZWFyLCB3ZWVrX29mX3llYXIsIHdlZWtkYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKLSAgICAgICAgaWYganVsaWFuIDw9IDA6CisgICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtkYXkgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHdlZWtfb2ZfeWVhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQorICAgICAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKKyAgICAgICAgZWxpZiBpc29feWVhciBpcyBub3QgTm9uZSBhbmQgaXNvX3dlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5ZWFyLCBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9WKGlzb195ZWFyLCBpc29fd2Vlaywgd2Vla2RheSArIDEpCisgICAgICAgIGlmIGp1bGlhbiBpcyBub3QgTm9uZSBhbmQganVsaWFuIDw9IDA6CiAgICAgICAgICAgICB5ZWFyIC09IDEKICAgICAgICAgICAgIHlkYXkgPSAzNjYgaWYgY2FsZW5kYXIuaXNsZWFwKHllYXIpIGVsc2UgMzY1CiAgICAgICAgICAgICBqdWxpYW4gKz0geWRheQotICAgICMgQ2Fubm90IHByZS1jYWxjdWxhdGUgZGF0ZXRpbWVfZGF0ZSgpIHNpbmNlIGNhbiBjaGFuZ2UgaW4gSnVsaWFuCi0gICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawotICAgICMgY2FsY3VsYXRpb24uCisKICAgICBpZiBqdWxpYW4gaXMgTm9uZToKKyAgICAgICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KKyAgICAgICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZgorICAgICAgICAjIHRoZSB3ZWVrIGNhbGN1bGF0aW9uLgogICAgICAgICAjIE5lZWQgdG8gYWRkIDEgdG8gcmVzdWx0IHNpbmNlIGZpcnN0IGRheSBvZiB0aGUgeWVhciBpcyAxLCBub3QgMC4KICAgICAgICAganVsaWFuID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS50b29yZGluYWwoKSAtIFwKICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxCi0gICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgaXQgd2lsbAotICAgICAgICAgICAjIGJlIGFjY3VyYXRlLgotICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKChqdWxpYW4gLSAxKSArIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCisgICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgKG9yIGlmIGl0IHdhcworICAgICAgICAgICAjIGNhbGN1bGF0ZWQgYWJvdmUgd2l0aCB5ZWFyL3dlZWsvd2Vla2RheSkgaXQgd2lsbCBiZSBhY2N1cmF0ZS4KKyAgICAgICAgZGF0ZXRpbWVfcmVzdWx0ID0gZGF0ZXRpbWVfZGF0ZS5mcm9tb3JkaW5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanVsaWFuIC0gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCiAgICAgICAgIHllYXIgPSBkYXRldGltZV9yZXN1bHQueWVhcgogICAgICAgICBtb250aCA9IGRhdGV0aW1lX3Jlc3VsdC5tb250aAogICAgICAgICBkYXkgPSBkYXRldGltZV9yZXN1bHQuZGF5CmRpZmYgLS1naXQgYS9MaWIvYWlmYy5weSBiL0xpYi9haWZjLnB5CmluZGV4IDdlYmRiZWIuLjY5MmQwYmYgMTAwNjQ0Ci0tLSBhL0xpYi9haWZjLnB5CisrKyBiL0xpYi9haWZjLnB5CkBAIC0yNTcsNiArMjU3LDE1IEBACiBfYWlmY19wYXJhbXMgPSBuYW1lZHR1cGxlKCdfYWlmY19wYXJhbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmNoYW5uZWxzIHNhbXB3aWR0aCBmcmFtZXJhdGUgbmZyYW1lcyBjb21wdHlwZSBjb21wbmFtZScpCiAKK19haWZjX3BhcmFtcy5uY2hhbm5lbHMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbyknCitfYWlmY19wYXJhbXMuc2FtcHdpZHRoLl9fZG9jX18gPSAnU2FtcGxlIHdpZHRoIGluIGJ5dGVzJworX2FpZmNfcGFyYW1zLmZyYW1lcmF0ZS5fX2RvY19fID0gJ1NhbXBsaW5nIGZyZXF1ZW5jeScKK19haWZjX3BhcmFtcy5uZnJhbWVzLl9fZG9jX18gPSAnTnVtYmVyIG9mIGF1ZGlvIGZyYW1lcycKK19haWZjX3BhcmFtcy5jb21wdHlwZS5fX2RvY19fID0gJ0NvbXByZXNzaW9uIHR5cGUgKCJOT05FIiBmb3IgQUlGRiBmaWxlcyknCitfYWlmY19wYXJhbXMuY29tcG5hbWUuX19kb2NfXyA9ICgiIiJcCitBIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbXByZXNzaW9uIHR5cGUKKygnbm90IGNvbXByZXNzZWQnIGZvciBBSUZGIGZpbGVzKSIiIikKKwogCiBjbGFzcyBBaWZjX3JlYWQ6CiAgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgpkaWZmIC0tZ2l0IGEvTGliL2FyZ3BhcnNlLnB5IGIvTGliL2FyZ3BhcnNlLnB5CmluZGV4IDlhMDY3MTkuLjIwOWI0ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9hcmdwYXJzZS5weQorKysgYi9MaWIvYXJncGFyc2UucHkKQEAgLTExOCwxMCArMTE4LDE2IEBACiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICB0eXBlX25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCiAgICAgICAgIGFyZ19zdHJpbmdzID0gW10KKyAgICAgICAgc3Rhcl9hcmdzID0ge30KICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLl9nZXRfYXJncygpOgogICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKHJlcHIoYXJnKSkKICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX2dldF9rd2FyZ3MoKToKLSAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIG5hbWUuaXNpZGVudGlmaWVyKCk6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFyX2FyZ3NbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpZiBzdGFyX2FyZ3M6CisgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyoqJXMnICUgcmVwcihzdGFyX2FyZ3MpKQogICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZV9uYW1lLCAnLCAnLmpvaW4oYXJnX3N0cmluZ3MpKQogCiAgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgpAQCAtMjA0LDggKzIxMCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5faW5kZW50KCkKICAgICAgICAgICAgIGpvaW4gPSBzZWxmLmZvcm1hdHRlci5fam9pbl9wYXJ0cwotICAgICAgICAgICAgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQogICAgICAgICAgICAgaXRlbV9oZWxwID0gam9pbihbZnVuYygqYXJncykgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtc10pCiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5fZGVkZW50KCkKZGlmZiAtLWdpdCBhL0xpYi9hc3QucHkgYi9MaWIvYXN0LnB5CmluZGV4IDAxNzA0NzIuLjE1NmExZjIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3QucHkKKysrIGIvTGliL2FzdC5weQpAQCAtMzUsNiArMzUsOCBAQAogICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpCiAKIAorX05VTV9UWVBFUyA9IChpbnQsIGZsb2F0LCBjb21wbGV4KQorCiBkZWYgbGl0ZXJhbF9ldmFsKG5vZGVfb3Jfc3RyaW5nKToKICAgICAiIiIKICAgICBTYWZlbHkgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBub2RlIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KQEAgLTQ3LDcgKzQ5LDkgQEAKICAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBFeHByZXNzaW9uKToKICAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBub2RlX29yX3N0cmluZy5ib2R5CiAgICAgZGVmIF9jb252ZXJ0KG5vZGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS5zCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOdW0pOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUubgpAQCAtNjIsMjQgKzY2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbiB6aXAobm9kZS5rZXlzLCBub2RlLnZhbHVlcykpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOYW1lQ29uc3RhbnQpOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFVuYXJ5T3ApIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wZXJhbmQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBVbmFyeU9wKSBhbmQgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpOgogICAgICAgICAgICAgb3BlcmFuZCA9IF9jb252ZXJ0KG5vZGUub3BlcmFuZCkKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICsgb3BlcmFuZAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3AsIChBZGQsIFN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnJpZ2h0LCAoTnVtLCBVbmFyeU9wLCBCaW5PcCkpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmxlZnQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9wZXJhbmQsIF9OVU1fVFlQRVMpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiArIG9wZXJhbmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSk6CiAgICAgICAgICAgICBsZWZ0ID0gX2NvbnZlcnQobm9kZS5sZWZ0KQogICAgICAgICAgICAgcmlnaHQgPSBfY29udmVydChub2RlLnJpZ2h0KQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0LCBfTlVNX1RZUEVTKSBhbmQgaXNpbnN0YW5jZShyaWdodCwgX05VTV9UWVBFUyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmc6ICcgKyByZXByKG5vZGUpKQogICAgIHJldHVybiBfY29udmVydChub2RlX29yX3N0cmluZykKIApAQCAtMTk2LDEyICsxOTcsMTkgQEAKICAgICAiIiIKICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoQXN5bmNGdW5jdGlvbkRlZiwgRnVuY3Rpb25EZWYsIENsYXNzRGVmLCBNb2R1bGUpKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlciBjYW4ndCBoYXZlIGRvY3N0cmluZ3MiICUgbm9kZS5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgaWYgbm9kZS5ib2R5IGFuZCBpc2luc3RhbmNlKG5vZGUuYm9keVswXSwgRXhwcikgYW5kIFwKLSAgICAgICBpc2luc3RhbmNlKG5vZGUuYm9keVswXS52YWx1ZSwgU3RyKToKLSAgICAgICAgaWYgY2xlYW46Ci0gICAgICAgICAgICBpbXBvcnQgaW5zcGVjdAotICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QuY2xlYW5kb2Mobm9kZS5ib2R5WzBdLnZhbHVlLnMpCi0gICAgICAgIHJldHVybiBub2RlLmJvZHlbMF0udmFsdWUucworICAgIGlmIG5vdChub2RlLmJvZHkgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBFeHByKSk6CisgICAgICAgIHJldHVybgorICAgIG5vZGUgPSBub2RlLmJvZHlbMF0udmFsdWUKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnMKKyAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIHN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnZhbHVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgY2xlYW46CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIHRleHQgPSBpbnNwZWN0LmNsZWFuZG9jKHRleHQpCisgICAgcmV0dXJuIHRleHQKIAogCiBkZWYgd2Fsayhub2RlKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2hhdC5weSBiL0xpYi9hc3luY2hhdC5weQppbmRleCBmNzI4ZDFiLi5mYzExNDZhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNoYXQucHkKKysrIGIvTGliL2FzeW5jaGF0LnB5CkBAIC0yODUsMzUgKzI4NSw2IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAKIAotY2xhc3MgZmlmbzoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbGlzdD1Ob25lKToKLSAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2ZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYnLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgICAgICBpZiBub3QgbGlzdDoKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKGxpc3QpCi0KLSAgICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxpc3QpCi0KLSAgICBkZWYgaXNfZW1wdHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBub3Qgc2VsZi5saXN0Ci0KLSAgICBkZWYgZmlyc3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmxpc3RbMF0KLQotICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKGRhdGEpCi0KLSAgICBkZWYgcG9wKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmxpc3Q6Ci0gICAgICAgICAgICByZXR1cm4gKDEsIHNlbGYubGlzdC5wb3BsZWZ0KCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gKDAsIE5vbmUpCi0KLQogIyBHaXZlbiAnaGF5c3RhY2snLCBzZWUgaWYgYW55IHByZWZpeCBvZiAnbmVlZGxlJyBpcyBhdCBpdHMgZW5kLiAgVGhpcwogIyBhc3N1bWVzIGFuIGV4YWN0IG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4gIFJldHVybiB0aGUgbnVtYmVyIG9mCiAjIGNoYXJhY3RlcnMgbWF0Y2hlZC4KZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL2Jhc2VfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKaW5kZXggMTcyYTQ2My4uZjU1YTM2ZSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKQEAgLTQyNiw3ICs0MjYsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2Nsb3NlZCgpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfcnVubmluZygpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CmluZGV4IDhmYzI1M2MuLmZiOGMyYmEgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgZ2V0X3BpZChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weQppbmRleCAzYWMzMTRjLi40YjYwNjdhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9wcm9hY3Rvcl9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5CkBAIC04Niw3ICs4Niw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fc29jayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiBwaXBlIHRyYW5zcG9ydCcpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5CmluZGV4IGVkMmI0ZDcuLjM0Y2NlNmIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NlbGVjdG9yX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkKQEAgLTU3OSw3ICs1NzksOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIHNlbGYuX3NvY2sgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCiAKICAgICBkZWYgX2ZhdGFsX2Vycm9yKHNlbGYsIGV4YywgbWVzc2FnZT0nRmF0YWwgZXJyb3Igb24gdHJhbnNwb3J0Jyk6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9zc2xwcm90by5weSBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CmluZGV4IDMzZDVkZTIuLmYwZjY0MmUgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CisrKyBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CkBAIC0zMjUsNyArMzI1LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIHBhdXNlX3JlYWRpbmcoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CmluZGV4IGQ3MTI3NDkuLmNlNDljNGYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CisrKyBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CkBAIC0zODEsNyArMzgxLDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIF9mYXRhbF9lcnJvcihzZWxmLCBleGMsIG1lc3NhZ2U9J0ZhdGFsIGVycm9yIG9uIHBpcGUgdHJhbnNwb3J0Jyk6CkBAIC01NzMsNyArNTc0LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weSBiL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkKaW5kZXggODcwY2QxMy4uN2M2M2ZiOSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weQorKysgYi9MaWIvYXN5bmNpby93aW5kb3dzX3V0aWxzLnB5CkBAIC0xNTksNyArMTU5LDggQEAKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jb3JlLnB5IGIvTGliL2FzeW5jb3JlLnB5CmluZGV4IDNiNTFmMGYuLjRiMDQ2ZDYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY29yZS5weQorKysgYi9MaWIvYXN5bmNvcmUucHkKQEAgLTU5NSw3ICs1OTUsOCBAQAogCiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5mZCA+PSAwOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgICAgICBkZWYgcmVjdihzZWxmLCAqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvYmFzZTY0LnB5IGIvTGliL2Jhc2U2NC5weQppbmRleCBhZGFlYzFkLi42N2U1NGYwIDEwMDc1NQotLS0gYS9MaWIvYmFzZTY0LnB5CisrKyBiL0xpYi9iYXNlNjQucHkKQEAgLTU1LDggKzU1LDcgQEAKICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCBmb3IgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuICBUaGlzIGFsbG93cyBhbgogICAgIGFwcGxpY2F0aW9uIHRvIGUuZy4gZ2VuZXJhdGUgdXJsIG9yIGZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4KICAgICAiIiIKLSAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQotICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpWzotMV0KKyAgICBlbmNvZGVkID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzLCBuZXdsaW5lPUZhbHNlKQogICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgogICAgICAgICBhc3NlcnQgbGVuKGFsdGNoYXJzKSA9PSAyLCByZXByKGFsdGNoYXJzKQogICAgICAgICByZXR1cm4gZW5jb2RlZC50cmFuc2xhdGUoYnl0ZXMubWFrZXRyYW5zKGInKy8nLCBhbHRjaGFycykpCmRpZmYgLS1naXQgYS9MaWIvY2FsZW5kYXIucHkgYi9MaWIvY2FsZW5kYXIucHkKaW5kZXggNTI0NGI4ZC4uODViYWYyZSAxMDA2NDQKLS0tIGEvTGliL2NhbGVuZGFyLnB5CisrKyBiL0xpYi9jYWxlbmRhci5weQpAQCAtMTIsNyArMTIsOSBAQAogX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAogICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAogICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKLSAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciIsCisgICAgICAgICAgICJDYWxlbmRhciIsICJUZXh0Q2FsZW5kYXIiLCAiSFRNTENhbGVuZGFyIiwgIkxvY2FsZVRleHRDYWxlbmRhciIsCisgICAgICAgICAgICJMb2NhbGVIVE1MQ2FsZW5kYXIiLCAid2Vla2hlYWRlciJdCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCiBlcnJvciA9IFZhbHVlRXJyb3IKQEAgLTYwNSw1MSArNjA3LDYzIEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gICAgaW1wb3J0IG9wdHBhcnNlCi0gICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBpbXBvcnQgYXJncGFyc2UKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgdGV4dGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgndGV4dCBvbmx5IGFyZ3VtZW50cycpCisgICAgaHRtbGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnaHRtbCBvbmx5IGFyZ3VtZW50cycpCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi13IiwgIi0td2lkdGgiLAotICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKLSAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMikiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItbCIsICItLWxpbmVzIiwKLSAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCi0gICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKLSAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKLSAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLW0iLCAiLS1tb250aHMiLAotICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCi0gICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBodG1sZ3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWMiLCAiLS1jc3MiLAotICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAotICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICAgICBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLUwiLCAiLS1sb2NhbGUiLAotICAgICAgICBkZXN0PSJsb2NhbGUiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAotICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQuIgorICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9ImVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXQiLCAiLS10eXBlIiwKLSAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBkZWZhdWx0PSJ0ZXh0IiwKICAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAogICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKICAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgInllYXIiLAorICAgICAgICBuYXJncz0nPycsIHR5cGU9aW50LAorICAgICAgICBoZWxwPSJ5ZWFyIG51bWJlciAoMS05OTk5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIm1vbnRoIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ibW9udGggbnVtYmVyICgxLTEyLCB0ZXh0IG9ubHkpIgorICAgICkKIAotICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgb3B0aW9ucyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3NbMTpdKQogCiAgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKQEAgLTY2NywxMCArNjgxLDEwIEBACiAgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQuYnVmZmVyLndyaXRlCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KSkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgd3JpdGUoY2FsLmZvcm1hdHllYXJwYWdlKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQogICAgICAgICAgICAgc3lzLmV4aXQoMSkKQEAgLTY4MCwxOCArNjk0LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQogICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKLSAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgIGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKICAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZwogICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIG9wdGlvbnMueWVhciBpcyBOb25lOgogICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQotICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgotICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIob3B0aW9ucy55ZWFyLCAqKm9wdGRpY3QpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgob3B0aW9ucy55ZWFyLCBvcHRpb25zLm1vbnRoLCAqKm9wdGRpY3QpCiAgICAgICAgIHdyaXRlID0gc3lzLnN0ZG91dC53cml0ZQogICAgICAgICBpZiBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmVuY29kZShvcHRpb25zLmVuY29kaW5nKQpkaWZmIC0tZ2l0IGEvTGliL2NnaS5weSBiL0xpYi9jZ2kucHkKaW5kZXggMTg5YzZkNS4uMjMzYTQ5NiAxMDA3NTUKLS0tIGEvTGliL2NnaS5weQorKysgYi9MaWIvY2dpLnB5CkBAIC00NSw3ICs0NSw3IEBACiAKIF9fYWxsX18gPSBbIk1pbmlGaWVsZFN0b3JhZ2UiLCAiRmllbGRTdG9yYWdlIiwKICAgICAgICAgICAgInBhcnNlIiwgInBhcnNlX3FzIiwgInBhcnNlX3FzbCIsICJwYXJzZV9tdWx0aXBhcnQiLAotICAgICAgICAgICAicGFyc2VfaGVhZGVyIiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKKyAgICAgICAgICAgInBhcnNlX2hlYWRlciIsICJ0ZXN0IiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKICAgICAgICAgICAgInByaW50X2Zvcm0iLCAicHJpbnRfZGlyZWN0b3J5IiwgInByaW50X2FyZ3VtZW50cyIsCiAgICAgICAgICAgICJwcmludF9lbnZpcm9uX3VzYWdlIiwgImVzY2FwZSJdCiAKZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weSBiL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQppbmRleCBlYmU4ZWU3Li5iOTQxOTUwIDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CkBAIC04NDIsNyArODQyLDcgQEAKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyAgQ2hhaW5NYXAgKGhlbHBlciBmb3IgY29uZmlncGFyc2VyIGFuZCBzdHJpbmcuVGVtcGxhdGUpCisjIyMgIENoYWluTWFwCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2xhc3MgQ2hhaW5NYXAoTXV0YWJsZU1hcHBpbmcpOgpAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICAgICAgICBkaWN0ID0ga3dhcmdzLnBvcCgnZGljdCcpCiAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlBhc3NpbmcgJ2RpY3QnIGFzIGtleXdvcmQgYXJndW1lbnQgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaWN0ID0gTm9uZQogICAgICAgICBzZWxmLmRhdGEgPSB7fQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVhbGwucHkgYi9MaWIvY29tcGlsZWFsbC5weQppbmRleCAwY2MwYzFkLi42N2M1ZjVhIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZWFsbC5weQorKysgYi9MaWIvY29tcGlsZWFsbC5weQpAQCAtNjgsNyArNjgsNyBAQAogICAgICIiIgogICAgIGZpbGVzID0gX3dhbGtfZGlyKGRpciwgcXVpZXQ9cXVpZXQsIG1heGxldmVscz1tYXhsZXZlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgZGRpcj1kZGlyKQotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBpZiB3b3JrZXJzIGlzIG5vdCBOb25lIGFuZCB3b3JrZXJzICE9IDEgYW5kIFByb2Nlc3NQb29sRXhlY3V0b3IgaXMgbm90IE5vbmU6CiAgICAgICAgIGlmIHdvcmtlcnMgPCAwOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd29ya2VycyBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMCcpCkBAIC04MSwxMiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3k9bGVnYWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpCi0gICAgICAgICAgICBzdWNjZXNzID0gbWluKHJlc3VsdHMsIGRlZmF1bHQ9MSkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD1UcnVlKQogICAgIGVsc2U6CiAgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgogICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZmlsZShmaWxlLCBkZGlyLCBmb3JjZSwgcngsIHF1aWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ksIG9wdGltaXplKToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgIHJldHVybiBzdWNjZXNzCiAKIGRlZiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBsZWdhY3k6ICAgIGlmIFRydWUsIHByb2R1Y2UgbGVnYWN5IHB5YyBwYXRocyBpbnN0ZWFkIG9mIFBFUCAzMTQ3IHBhdGhzCiAgICAgb3B0aW1pemU6ICBvcHRpbWl6YXRpb24gbGV2ZWwgb3IgLTEgZm9yIGxldmVsIG9mIHRoZSBpbnRlcnByZXRlcgogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmdWxsbmFtZSkKICAgICBpZiBkZGlyIGlzIG5vdCBOb25lOgogICAgICAgICBkZmlsZSA9IG9zLnBhdGguam9pbihkZGlyLCBuYW1lKQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgICAgICAgICAgb2sgPSBweV9jb21waWxlLmNvbXBpbGUoZnVsbG5hbWUsIGNmaWxlLCBkZmlsZSwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT1vcHRpbWl6ZSkKICAgICAgICAgICAgIGV4Y2VwdCBweV9jb21waWxlLlB5Q29tcGlsZUVycm9yIGFzIGVycjoKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5kZWNvZGUoc3lzLnN0ZG91dC5lbmNvZGluZykKICAgICAgICAgICAgICAgICBwcmludChtc2cpCiAgICAgICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBVbmljb2RlRXJyb3IsIE9TRXJyb3IpIGFzIGU6Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgICBpZiBxdWlldCA+PSAyOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VzcwogICAgICAgICAgICAgICAgIGVsaWYgcXVpZXQ6CkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgICAgICAgICBwcmludChlLl9fY2xhc3NfXy5fX25hbWVfXyArICc6JywgZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgb2sgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj0xLCBtYXhsZXZlbHM9MCwgZm9yY2U9RmFsc2UsIHF1aWV0PTAsCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBsZWdhY3k6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IEZhbHNlKQogICAgIG9wdGltaXplOiBhcyBmb3IgY29tcGlsZV9kaXIoKSAoZGVmYXVsdCAtMSkKICAgICAiIiIKLSAgICBzdWNjZXNzID0gMQorICAgIHN1Y2Nlc3MgPSBUcnVlCiAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKICAgICAgICAgaWYgKG5vdCBkaXIgb3IgZGlyID09IG9zLmN1cmRpcikgYW5kIHNraXBfY3VyZGlyOgogICAgICAgICAgICAgaWYgcXVpZXQgPCAyOgpkaWZmIC0tZ2l0IGEvTGliL2NvbnRleHRsaWIucHkgYi9MaWIvY29udGV4dGxpYi5weQppbmRleCBkNDRlZGQ2Li43ZDk0YTU3IDEwMDY0NAotLS0gYS9MaWIvY29udGV4dGxpYi5weQorKysgYi9MaWIvY29udGV4dGxpYi5weQpAQCAtMSwxMSArMSwzNCBAQAogIiIiVXRpbGl0aWVzIGZvciB3aXRoLXN0YXRlbWVudCBjb250ZXh0cy4gIFNlZSBQRVAgMzQzLiIiIgotCitpbXBvcnQgYWJjCiBpbXBvcnQgc3lzCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCiAKLV9fYWxsX18gPSBbImNvbnRleHRtYW5hZ2VyIiwgImNsb3NpbmciLCAiQ29udGV4dERlY29yYXRvciIsICJFeGl0U3RhY2siLAotICAgICAgICAgICAicmVkaXJlY3Rfc3Rkb3V0IiwgInJlZGlyZWN0X3N0ZGVyciIsICJzdXBwcmVzcyJdCitfX2FsbF9fID0gWyJjb250ZXh0bWFuYWdlciIsICJjbG9zaW5nIiwgIkFic3RyYWN0Q29udGV4dE1hbmFnZXIiLAorICAgICAgICAgICAiQ29udGV4dERlY29yYXRvciIsICJFeGl0U3RhY2siLCAicmVkaXJlY3Rfc3Rkb3V0IiwKKyAgICAgICAgICAgInJlZGlyZWN0X3N0ZGVyciIsICJzdXBwcmVzcyJdCisKKworY2xhc3MgQWJzdHJhY3RDb250ZXh0TWFuYWdlcihhYmMuQUJDKToKKworICAgICIiIkFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbnRleHQgbWFuYWdlcnMuIiIiCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYHNlbGZgIHVwb24gZW50ZXJpbmcgdGhlIHJ1bnRpbWUgY29udGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgIiIiUmFpc2UgYW55IGV4Y2VwdGlvbiB0cmlnZ2VyZWQgd2l0aGluIHRoZSBydW50aW1lIGNvbnRleHQuIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgQWJzdHJhY3RDb250ZXh0TWFuYWdlcjoKKyAgICAgICAgICAgIGlmIChhbnkoIl9fZW50ZXJfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pIGFuZAorICAgICAgICAgICAgICAgIGFueSgiX19leGl0X18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKIAogY2xhc3MgQ29udGV4dERlY29yYXRvcihvYmplY3QpOgpAQCAtMzEsNyArNTQsNyBAQAogICAgICAgICByZXR1cm4gaW5uZXIKIAogCi1jbGFzcyBfR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIoQ29udGV4dERlY29yYXRvcik6CitjbGFzcyBfR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIoQ29udGV4dERlY29yYXRvciwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiSGVscGVyIGZvciBAY29udGV4dG1hbmFnZXIgZGVjb3JhdG9yLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIGFyZ3MsIGt3ZHMpOgpAQCAtMTM3LDcgKzE2MCw3IEBACiAgICAgcmV0dXJuIGhlbHBlcgogCiAKLWNsYXNzIGNsb3Npbmcob2JqZWN0KToKK2NsYXNzIGNsb3NpbmcoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiQ29udGV4dCB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIGEgYmxvY2suCiAKICAgICBDb2RlIGxpa2UgdGhpczoKQEAgLTE2Miw3ICsxODUsNyBAQAogICAgICAgICBzZWxmLnRoaW5nLmNsb3NlKCkKIAogCi1jbGFzcyBfUmVkaXJlY3RTdHJlYW06CitjbGFzcyBfUmVkaXJlY3RTdHJlYW0oQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAKICAgICBfc3RyZWFtID0gTm9uZQogCkBAIC0yMDIsNyArMjI1LDcgQEAKICAgICBfc3RyZWFtID0gInN0ZGVyciIKIAogCi1jbGFzcyBzdXBwcmVzczoKK2NsYXNzIHN1cHByZXNzKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgbWFuYWdlciB0byBzdXBwcmVzcyBzcGVjaWZpZWQgZXhjZXB0aW9ucwogCiAgICAgQWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBleGVjdXRpb24gcHJvY2VlZHMgd2l0aCB0aGUgbmV4dApAQCAtMjMzLDcgKzI1Niw3IEBACiAKIAogIyBJbnNwaXJlZCBieSBkaXNjdXNzaW9ucyBvbiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTM1ODUKLWNsYXNzIEV4aXRTdGFjayhvYmplY3QpOgorY2xhc3MgRXhpdFN0YWNrKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgbWFuYWdlciBmb3IgZHluYW1pYyBtYW5hZ2VtZW50IG9mIGEgc3RhY2sgb2YgZXhpdCBjYWxsYmFja3MKIAogICAgIEZvciBleGFtcGxlOgpAQCAtMzEyLDkgKzMzNSw2IEBACiAgICAgICAgICIiIkltbWVkaWF0ZWx5IHVud2luZCB0aGUgY29udGV4dCBzdGFjayIiIgogICAgICAgICBzZWxmLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCiAKLSAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCiAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfZGV0YWlscyk6CiAgICAgICAgIHJlY2VpdmVkX2V4YyA9IGV4Y19kZXRhaWxzWzBdIGlzIG5vdCBOb25lCiAKZGlmZiAtLWdpdCBhL0xpYi9jb3B5LnB5IGIvTGliL2NvcHkucHkKaW5kZXggOTcyYjk0YS4uZjg2MDQwYSAxMDA2NDQKLS0tIGEvTGliL2NvcHkucHkKKysrIGIvTGliL2NvcHkucHkKQEAgLTUxLDcgKzUxLDYgQEAKIGltcG9ydCB0eXBlcwogaW1wb3J0IHdlYWtyZWYKIGZyb20gY29weXJlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKLWltcG9ydCBidWlsdGlucwogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKQEAgLTEwMiwzNyArMTAxLDMzIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzIiAlIGNscykKIAotICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApCisgICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKToKKyAgICAgICAgcmV0dXJuIHgKKyAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIE5vbmUsICpydikKIAogCiBfY29weV9kaXNwYXRjaCA9IGQgPSB7fQogCiBkZWYgX2NvcHlfaW1tdXRhYmxlKHgpOgogICAgIHJldHVybiB4Ci1mb3IgdCBpbiAodHlwZShOb25lKSwgaW50LCBmbG9hdCwgYm9vbCwgc3RyLCB0dXBsZSwKLSAgICAgICAgICBieXRlcywgZnJvemVuc2V0LCB0eXBlLCByYW5nZSwKLSAgICAgICAgICB0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlLCB0eXBlKEVsbGlwc2lzKSwKK2ZvciB0IGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBjb21wbGV4LCBzdHIsIHR1cGxlLAorICAgICAgICAgIGJ5dGVzLCBmcm96ZW5zZXQsIHR5cGUsIHJhbmdlLCBzbGljZSwKKyAgICAgICAgICB0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlLCB0eXBlKEVsbGlwc2lzKSwgdHlwZShOb3RJbXBsZW1lbnRlZCksCiAgICAgICAgICAgdHlwZXMuRnVuY3Rpb25UeXBlLCB3ZWFrcmVmLnJlZik6CiAgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQogdCA9IGdldGF0dHIodHlwZXMsICJDb2RlVHlwZSIsIE5vbmUpCiBpZiB0IGlzIG5vdCBOb25lOgogICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKLWZvciBuYW1lIGluICgiY29tcGxleCIsICJ1bmljb2RlIik6Ci0gICAgdCA9IGdldGF0dHIoYnVpbHRpbnMsIG5hbWUsIE5vbmUpCi0gICAgaWYgdCBpcyBub3QgTm9uZToKLSAgICAgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQogCi1kZWYgX2NvcHlfd2l0aF9jb25zdHJ1Y3Rvcih4KToKLSAgICByZXR1cm4gdHlwZSh4KSh4KQotZm9yIHQgaW4gKGxpc3QsIGRpY3QsIHNldCk6Ci0gICAgZFt0XSA9IF9jb3B5X3dpdGhfY29uc3RydWN0b3IKK2RbbGlzdF0gPSBsaXN0LmNvcHkKK2RbZGljdF0gPSBkaWN0LmNvcHkKK2Rbc2V0XSA9IHNldC5jb3B5CitkW2J5dGVhcnJheV0gPSBieXRlYXJyYXkuY29weQogCi1kZWYgX2NvcHlfd2l0aF9jb3B5X21ldGhvZCh4KToKLSAgICByZXR1cm4geC5jb3B5KCkKIGlmIFB5U3RyaW5nTWFwIGlzIG5vdCBOb25lOgotICAgIGRbUHlTdHJpbmdNYXBdID0gX2NvcHlfd2l0aF9jb3B5X21ldGhvZAorICAgIGRbUHlTdHJpbmdNYXBdID0gUHlTdHJpbmdNYXAuY29weQogCi1kZWwgZAorZGVsIGQsIHQKIAogZGVmIGRlZXBjb3B5KHgsIG1lbW89Tm9uZSwgX25pbD1bXSk6CiAgICAgIiIiRGVlcCBjb3B5IG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuCkBAIC0xNzksNyArMTc0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW4oZGVlcCljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCi0gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbykKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJ2LCBzdHIpOgorICAgICAgICAgICAgICAgICAgICB5ID0geAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgbWVtbywgKnJ2KQogCiAgICAgIyBJZiBpcyBpdHMgb3duIGNvcHksIGRvbid0IG1lbW9pemUuCiAgICAgaWYgeSBpcyBub3QgeDoKQEAgLTE5MywxMyArMTkxLDExIEBACiAgICAgcmV0dXJuIHgKIGRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWMKK2RbdHlwZShOb3RJbXBsZW1lbnRlZCldID0gX2RlZXBjb3B5X2F0b21pYwogZFtpbnRdID0gX2RlZXBjb3B5X2F0b21pYwogZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2Jvb2xdID0gX2RlZXBjb3B5X2F0b21pYwotdHJ5OgotICAgIGRbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKK2RbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2J5dGVzXSA9IF9kZWVwY29weV9hdG9taWMKIGRbc3RyXSA9IF9kZWVwY29weV9hdG9taWMKIHRyeToKQEAgLTIxMSwxNSArMjA3LDE2IEBACiBkW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWMKIAotZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8pOgorZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8sIGRlZXBjb3B5PWRlZXBjb3B5KToKICAgICB5ID0gW10KICAgICBtZW1vW2lkKHgpXSA9IHkKKyAgICBhcHBlbmQgPSB5LmFwcGVuZAogICAgIGZvciBhIGluIHg6Ci0gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQorICAgICAgICBhcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpCiAgICAgcmV0dXJuIHkKIGRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdAogCi1kZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8pOgorZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XQogICAgICMgV2UncmUgbm90IGdvaW5nIHRvIHB1dCB0aGUgdHVwbGUgaW4gdGhlIG1lbW8sIGJ1dCBpdCdzIHN0aWxsIGltcG9ydGFudCB3ZQogICAgICMgY2hlY2sgZm9yIGl0LCBpbiBjYXNlIHRoZSB0dXBsZSBjb250YWlucyByZWN1cnNpdmUgbXV0YWJsZSBzdHJ1Y3R1cmVzLgpAQCAtMjM2LDcgKzIzMyw3IEBACiAgICAgcmV0dXJuIHkKIGRbdHVwbGVdID0gX2RlZXBjb3B5X3R1cGxlCiAKLWRlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IHt9CiAgICAgbWVtb1tpZCh4KV0gPSB5CiAgICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOgpAQCAtMjQ4LDcgKzI0NSw5IEBACiAKIGRlZiBfZGVlcGNvcHlfbWV0aG9kKHgsIG1lbW8pOiAjIENvcHkgaW5zdGFuY2UgbWV0aG9kcwogICAgIHJldHVybiB0eXBlKHgpKHguX19mdW5jX18sIGRlZXBjb3B5KHguX19zZWxmX18sIG1lbW8pKQotX2RlZXBjb3B5X2Rpc3BhdGNoW3R5cGVzLk1ldGhvZFR5cGVdID0gX2RlZXBjb3B5X21ldGhvZAorZFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9tZXRob2QKKworZGVsIGQKIAogZGVmIF9rZWVwX2FsaXZlKHgsIG1lbW8pOgogICAgICIiIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby4KQEAgLTI2NiwzMSArMjY1LDE1IEBACiAgICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pCiAgICAgICAgIG1lbW9baWQobWVtbyldPVt4XQogCi1kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6Ci0gICAgaWYgaXNpbnN0YW5jZShpbmZvLCBzdHIpOgotICAgICAgICByZXR1cm4geAotICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKQotICAgIGlmIG1lbW8gaXMgTm9uZToKLSAgICAgICAgbWVtbyA9IHt9Ci0gICAgbiA9IGxlbihpbmZvKQotICAgIGFzc2VydCBuIGluICgyLCAzLCA0LCA1KQotICAgIGNhbGxhYmxlLCBhcmdzID0gaW5mb1s6Ml0KLSAgICBpZiBuID4gMjoKLSAgICAgICAgc3RhdGUgPSBpbmZvWzJdCi0gICAgZWxzZToKLSAgICAgICAgc3RhdGUgPSBOb25lCi0gICAgaWYgbiA+IDM6Ci0gICAgICAgIGxpc3RpdGVyID0gaW5mb1szXQotICAgIGVsc2U6Ci0gICAgICAgIGxpc3RpdGVyID0gTm9uZQotICAgIGlmIG4gPiA0OgotICAgICAgICBkaWN0aXRlciA9IGluZm9bNF0KLSAgICBlbHNlOgotICAgICAgICBkaWN0aXRlciA9IE5vbmUKK2RlZiBfcmVjb25zdHJ1Y3QoeCwgbWVtbywgZnVuYywgYXJncywKKyAgICAgICAgICAgICAgICAgc3RhdGU9Tm9uZSwgbGlzdGl0ZXI9Tm9uZSwgZGljdGl0ZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVlcGNvcHk9ZGVlcGNvcHkpOgorICAgIGRlZXAgPSBtZW1vIGlzIG5vdCBOb25lCisgICAgaWYgZGVlcCBhbmQgYXJnczoKKyAgICAgICAgYXJncyA9IChkZWVwY29weShhcmcsIG1lbW8pIGZvciBhcmcgaW4gYXJncykKKyAgICB5ID0gZnVuYygqYXJncykKICAgICBpZiBkZWVwOgotICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbykKLSAgICB5ID0gY2FsbGFibGUoKmFyZ3MpCi0gICAgbWVtb1tpZCh4KV0gPSB5CisgICAgICAgIG1lbW9baWQoeCldID0geQogCiAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgIGlmIGRlZXA6CkBAIC0zMDksMjIgKzI5MiwyMiBAQAogICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpCiAKICAgICBpZiBsaXN0aXRlciBpcyBub3QgTm9uZToKLSAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6Ci0gICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6CiAgICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pCi0gICAgICAgICAgICB5LmFwcGVuZChpdGVtKQorICAgICAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjoKKyAgICAgICAgICAgICAgICB5LmFwcGVuZChpdGVtKQogICAgIGlmIGRpY3RpdGVyIGlzIG5vdCBOb25lOgotICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKLSAgICAgICAgICAgIGlmIGRlZXA6CisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKICAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pCiAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWVwY29weSh2YWx1ZSwgbWVtbykKLSAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCisgICAgICAgICAgICAgICAgeVtrZXldID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOgorICAgICAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCiAgICAgcmV0dXJuIHkKIAotZGVsIGQKLQotZGVsIHR5cGVzCi0KLSMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X18KLWNsYXNzIF9FbXB0eUNsYXNzOgotICAgIHBhc3MKK2RlbCB0eXBlcywgd2Vha3JlZiwgUHlTdHJpbmdNYXAKZGlmZiAtLWdpdCBhL0xpYi9jcnlwdC5weSBiL0xpYi9jcnlwdC5weQppbmRleCA0OWFiOTZlLi5mYmM1ZjRjIDEwMDY0NAotLS0gYS9MaWIvY3J5cHQucHkKKysrIGIvTGliL2NyeXB0LnB5CkBAIC01NCw5ICs1NCw4IEBACiBNRVRIT0RfU0hBNTEyID0gX01ldGhvZCgnU0hBNTEyJywgJzYnLCAxNiwgMTA2KQogCiBtZXRob2RzID0gW10KLWZvciBfbWV0aG9kIGluIChNRVRIT0RfU0hBNTEyLCBNRVRIT0RfU0hBMjU2LCBNRVRIT0RfTUQ1KToKK2ZvciBfbWV0aG9kIGluIChNRVRIT0RfU0hBNTEyLCBNRVRIT0RfU0hBMjU2LCBNRVRIT0RfTUQ1LCBNRVRIT0RfQ1JZUFQpOgogICAgIF9yZXN1bHQgPSBjcnlwdCgnJywgX21ldGhvZCkKICAgICBpZiBfcmVzdWx0IGFuZCBsZW4oX3Jlc3VsdCkgPT0gX21ldGhvZC50b3RhbF9zaXplOgogICAgICAgICBtZXRob2RzLmFwcGVuZChfbWV0aG9kKQotbWV0aG9kcy5hcHBlbmQoTUVUSE9EX0NSWVBUKQogZGVsIF9yZXN1bHQsIF9tZXRob2QKZGlmZiAtLWdpdCBhL0xpYi9jc3YucHkgYi9MaWIvY3N2LnB5CmluZGV4IGNhNDBlNWUuLjkwNDYxZGIgMTAwNjQ0Ci0tLSBhL0xpYi9jc3YucHkKKysrIGIvTGliL2Nzdi5weQpAQCAtMTMsMTEgKzEzLDEyIEBACiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAKLV9fYWxsX18gPSBbICJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAotICAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAotICAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAotICAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiIF0KK19fYWxsX18gPSBbIlFVT1RFX01JTklNQUwiLCAiUVVPVEVfQUxMIiwgIlFVT1RFX05PTk5VTUVSSUMiLCAiUVVPVEVfTk9ORSIsCisgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKKyAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCisgICAgICAgICAgICJyZWdpc3Rlcl9kaWFsZWN0IiwgImdldF9kaWFsZWN0IiwgImxpc3RfZGlhbGVjdHMiLCAiU25pZmZlciIsCisgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiwKKyAgICAgICAgICAgInVuaXhfZGlhbGVjdCJdCiAKIGNsYXNzIERpYWxlY3Q6CiAgICAgIiIiRGVzY3JpYmUgYSBDU1YgZGlhbGVjdC4KZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQppbmRleCBiMzlkODJjLi4wZWIwOWZiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIAotaW1wb3J0IGN0eXBlcwogaW1wb3J0IF9jdHlwZXNfdGVzdAogCiBjbGFzcyBCSVRTKFN0cnVjdHVyZSk6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQppbmRleCBlZjdiMjBiLi4xOWUzZGMxIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTU0LDcgKzU0LDcgQEAKIAogJycnCiAKLWltcG9ydCB1bml0dGVzdCwgZG9jdGVzdCwgc3lzCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QKIAogaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCBlNTZiY2NmLi4zNjNmNTg2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgdW5pdHRlc3QsIHN5cworaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICMgWFhYIFJlcGxhY2UgYnkgY19jaGFyX3AgdGVzdHMKICAgICBkZWYgdGVzdF9jc3RyaW5ncyhzZWxmKToKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcl9wLCBieXJlZgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyX3AKIAogICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKICAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdApAQCAtNjgsNyArNjgsNyBAQAogCiAgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQogICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6Ci0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgY193Y2hhcl9wCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKIAogICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSgiMTIzIikKIApAQCAtOTgsNyArOTgsNyBAQAogICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXIoc2VsZik6CiAgICAgICAgICMgVGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIG9mIFBPSU5URVIodHlwKSBjbGFzc2VzIGFjY2VwdHMgd2hhdCBpcwogICAgICAgICAjIHJldHVybmVkIGJ5IGJ5cmVmKG9iaiksIGl0IHR5cGUob2JqKSA9PSB0eXAKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgcG9pbnRlciwgUE9JTlRFUiwgYnlyZWYKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgYnlyZWYKICAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQogCiAgICAgICAgIExQSU5ULmZyb21fcGFyYW0oYnlyZWYoY19pbnQoNDIpKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDMyZjgwMmMuLmQ2ODM5N2UgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKLWltcG9ydCByZSwgc3RydWN0LCBzeXMKK2ltcG9ydCByZSwgc3lzCiAKIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgVEhJU19FTkRJQU4gPSAiPCIKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggOTNlYmE2Yi4uMTk3NGY0MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCi1pbXBvcnQgb3MKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CmluZGV4IGY5YjVlOTcuLjRjZWFjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCBkOTk4YzI3Li45NGE4NmVhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTMyMCwxNyArMzIwLDE0IEBACiAKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCBiIlNvbWVvbmUiLCAoMSwgMikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzLCBSdW50aW1lRXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8Y2xhc3MgJ1R5cGVFcnJvcic+OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBieXRlcywgaW50IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXChQaG9uZVwpIDxjbGFzcyAnVHlwZUVycm9yJyBhdCAweC4rPjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImV4cGVjdGVkIGJ5dGVzLCBpbnQgZm91bmQiKQogCiAgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KFBlcnNvbiwgYiJTb21lb25lIiwgKGIiYSIsIGIiYiIsIGIiYyIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNscywgUnVudGltZUVycm9yKQotICAgICAgICBpZiBpc3N1YmNsYXNzKEV4Y2VwdGlvbiwgb2JqZWN0KToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPGNsYXNzICdUeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCAiKFBob25lKSBUeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlwoUGhvbmVcKSA8Y2xhc3MgJ1R5cGVFcnJvcicgYXQgMHguKz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKICAgICBkZWYgdGVzdF9odWdlX2ZpZWxkX25hbWUoc2VsZik6CiAgICAgICAgICMgaXNzdWUxMjg4MTogc2VnZmF1bHQgd2l0aCBsYXJnZSBzdHJ1Y3R1cmUgZmllbGQgbmFtZXMKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQppbmRleCA1YTNhNDdmLi5lNzFiNDgwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CkBAIC03OSw5ICs3OSw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoZW50cnkubmFtZS5kZWNvZGUoImFzY2lpIiksIGVudHJ5LnNpemUpKQogCi0gICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTYxKSwKLSAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fIiwgLTE2MSksCi0gICAgICAgICAgICAgICAgICAgICgiX19waGVsbG9fXy5zcGFtIiwgMTYxKSwKKyAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMzkpLAorICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18iLCAtMTM5KSwKKyAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fLnNwYW0iLCAxMzkpLAogICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIGV4cGVjdGVkLCAiUHlJbXBvcnRfRnJvemVuTW9kdWxlcyBleGFtcGxlICIKICAgICAgICAgICAgICJpbiBEb2MvbGlicmFyeS9jdHlwZXMucnN0IG1heSBiZSBvdXQgb2YgZGF0ZSIpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3V0aWwucHkgYi9MaWIvY3R5cGVzL3V0aWwucHkKaW5kZXggNzY4NGVhYi4uZTI1YTg4NiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy91dGlsLnB5CisrKyBiL0xpYi9jdHlwZXMvdXRpbC5weQpAQCAtMjcxLDggKzI3MSw4IEBACiAgICAgICAgICAgICBhYmlfdHlwZSA9IG1hY2hfbWFwLmdldChtYWNoaW5lLCAnbGliYzYnKQogCiAgICAgICAgICAgICAjIFhYWCBhc3N1bWluZyBHTElCQydzIGxkY29uZmlnICh3aXRoIG9wdGlvbiAtcCkKLSAgICAgICAgICAgIHJlZ2V4ID0gb3MuZnNlbmNvZGUoCi0gICAgICAgICAgICAgICAgJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQorICAgICAgICAgICAgcmVnZXggPSByJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnCisgICAgICAgICAgICByZWdleCA9IG9zLmZzZW5jb2RlKHJlZ2V4ICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihbJy9zYmluL2xkY29uZmlnJywgJy1wJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuREVWTlVMTCwKZGlmZiAtLWdpdCBhL0xpYi9kYXRldGltZS5weSBiL0xpYi9kYXRldGltZS5weQppbmRleCAyZjk0MjE4Li5iMTMyMWEzIDEwMDY0NAotLS0gYS9MaWIvZGF0ZXRpbWUucHkKKysrIGIvTGliL2RhdGV0aW1lLnB5CkBAIC0xNTIsMTIgKzE1MiwyNiBAQAogICAgIGRudW0gPSBfZGF5c19iZWZvcmVfbW9udGgoeSwgbSkgKyBkCiAgICAgcmV0dXJuIF90aW1lLnN0cnVjdF90aW1lKCh5LCBtLCBkLCBoaCwgbW0sIHNzLCB3ZGF5LCBkbnVtLCBkc3RmbGFnKSkKIAotZGVmIF9mb3JtYXRfdGltZShoaCwgbW0sIHNzLCB1cyk6Ci0gICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLgotICAgIHJlc3VsdCA9ICIlMDJkOiUwMmQ6JTAyZCIgJSAoaGgsIG1tLCBzcykKLSAgICBpZiB1czoKLSAgICAgICAgcmVzdWx0ICs9ICIuJTA2ZCIgJSB1cwotICAgIHJldHVybiByZXN1bHQKK2RlZiBfZm9ybWF0X3RpbWUoaGgsIG1tLCBzcywgdXMsIHRpbWVzcGVjPSdhdXRvJyk6CisgICAgc3BlY3MgPSB7CisgICAgICAgICdob3Vycyc6ICd7OjAyZH0nLAorICAgICAgICAnbWludXRlcyc6ICd7OjAyZH06ezowMmR9JywKKyAgICAgICAgJ3NlY29uZHMnOiAnezowMmR9Ons6MDJkfTp7OjAyZH0nLAorICAgICAgICAnbWlsbGlzZWNvbmRzJzogJ3s6MDJkfTp7OjAyZH06ezowMmR9Lns6MDNkfScsCisgICAgICAgICdtaWNyb3NlY29uZHMnOiAnezowMmR9Ons6MDJkfTp7OjAyZH0uezowNmR9JworICAgIH0KKworICAgIGlmIHRpbWVzcGVjID09ICdhdXRvJzoKKyAgICAgICAgIyBTa2lwIHRyYWlsaW5nIG1pY3Jvc2Vjb25kcyB3aGVuIHVzPT0wLgorICAgICAgICB0aW1lc3BlYyA9ICdtaWNyb3NlY29uZHMnIGlmIHVzIGVsc2UgJ3NlY29uZHMnCisgICAgZWxpZiB0aW1lc3BlYyA9PSAnbWlsbGlzZWNvbmRzJzoKKyAgICAgICAgdXMgLy89IDEwMDAKKyAgICB0cnk6CisgICAgICAgIGZtdCA9IHNwZWNzW3RpbWVzcGVjXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biB0aW1lc3BlYyB2YWx1ZScpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZtdC5mb3JtYXQoaGgsIG1tLCBzcywgdXMpCiAKICMgQ29ycmVjdGx5IHN1YnN0aXR1dGUgZm9yICV6IGFuZCAlWiBlc2NhcGVzIGluIHN0cmZ0aW1lIGZvcm1hdHMuCiBkZWYgX3dyYXBfc3RyZnRpbWUob2JqZWN0LCBmb3JtYXQsIHRpbWV0dXBsZSk6CkBAIC0yNDAsNyArMjU0LDcgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidHppbmZvLiVzKCkgbXVzdCByZXR1cm4gYSB3aG9sZSBudW1iZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBtaW51dGVzLCBnb3QgJXMiICUgKG5hbWUsIG9mZnNldCkpCiAgICAgaWYgbm90IC10aW1lZGVsdGEoMSkgPCBvZmZzZXQgPCB0aW1lZGVsdGEoMSk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzKCk9JXMsIG11c3QgYmUgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMoKT0lcywgbXVzdCBiZSBzdHJpY3RseSBiZXR3ZWVuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiLXRpbWVkZWx0YShob3Vycz0yNCkgYW5kIHRpbWVkZWx0YShob3Vycz0yNCkiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgb2Zmc2V0KSkKIApAQCAtMzE2LDYgKzMzMCw3IEBACiAKICAgICByZXR1cm4gcQogCisKIGNsYXNzIHRpbWVkZWx0YToKICAgICAiIiJSZXByZXNlbnQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgb2JqZWN0cy4KIApAQCAtMTE5MywxNCArMTIwOCwxNyBAQAogICAgICAgICAgICAgcyA9IHNbOi0xXSArICIsIHR6aW5mbz0lciIgJSBzZWxmLl90emluZm8gKyAiKSIKICAgICAgICAgcmV0dXJuIHMKIAotICAgIGRlZiBpc29mb3JtYXQoc2VsZik6CisgICAgZGVmIGlzb2Zvcm1hdChzZWxmLCB0aW1lc3BlYz0nYXV0bycpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uCiAKLSAgICAgICAgVGhpcyBpcyAnSEg6TU06U1MubW1tbW1tK3p6Onp6Jywgb3IgJ0hIOk1NOlNTK3p6Onp6JyBpZgotICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kID09IDAuCisgICAgICAgIFRoZSBmdWxsIGZvcm1hdCBpcyAnSEg6TU06U1MubW1tbW1tK3p6Onp6Jy4gQnkgZGVmYXVsdCwgdGhlIGZyYWN0aW9uYWwKKyAgICAgICAgcGFydCBpcyBvbWl0dGVkIGlmIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KKworICAgICAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgdGltZXNwZWMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbAorICAgICAgICB0ZXJtcyBvZiB0aGUgdGltZSB0byBpbmNsdWRlLgogICAgICAgICAiIiIKICAgICAgICAgcyA9IF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQsIHRpbWVzcGVjKQogICAgICAgICB0eiA9IHNlbGYuX3R6c3RyKCkKICAgICAgICAgaWYgdHo6CiAgICAgICAgICAgICBzICs9IHR6CkBAIC0xNTQ5LDIxICsxNTY3LDI1IEBACiAgICAgICAgICAgICBzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKICAgICAgICAgICAgIHNlbGYuX3llYXIpCiAKLSAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHNlcD0nVCcpOgorICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJywgdGltZXNwZWM9J2F1dG8nKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSB0aW1lIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gSVNPLgogCi0gICAgICAgIFRoaXMgaXMgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tJywgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MnIGlmCi0gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KKyAgICAgICAgVGhlIGZ1bGwgZm9ybWF0IGxvb2tzIGxpa2UgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tJy4KKyAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBvbWl0dGVkIGlmIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KIAogICAgICAgICBJZiBzZWxmLnR6aW5mbyBpcyBub3QgTm9uZSwgdGhlIFVUQyBvZmZzZXQgaXMgYWxzbyBhdHRhY2hlZCwgZ2l2aW5nCi0gICAgICAgICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScgb3IgJ1lZWVktTU0tREQgSEg6TU06U1MrSEg6TU0nLgorICAgICAgICBnaXZpbmcgYSBmdWxsIGZvcm1hdCBvZiAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0rSEg6TU0nLgogCiAgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50IHNlcCBzcGVjaWZpZXMgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGRhdGUgYW5kCiAgICAgICAgIHRpbWUsIGRlZmF1bHQgJ1QnLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCB0aW1lc3BlYyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICAgICAgIHRlcm1zIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuCiAgICAgICAgICIiIgogICAgICAgICBzID0gKCIlMDRkLSUwMmQtJTAyZCVjIiAlIChzZWxmLl95ZWFyLCBzZWxmLl9tb250aCwgc2VsZi5fZGF5LCBzZXApICsKICAgICAgICAgICAgICBfZm9ybWF0X3RpbWUoc2VsZi5faG91ciwgc2VsZi5fbWludXRlLCBzZWxmLl9zZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQsIHRpbWVzcGVjKSkKKwogICAgICAgICBvZmYgPSBzZWxmLnV0Y29mZnNldCgpCiAgICAgICAgIGlmIG9mZiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGlmIG9mZi5kYXlzIDwgMDoKQEAgLTE5MTMsNiArMTkzNSw4IEBACiAKICAgICBAc3RhdGljbWV0aG9kCiAgICAgZGVmIF9uYW1lX2Zyb21fb2Zmc2V0KGRlbHRhKToKKyAgICAgICAgaWYgbm90IGRlbHRhOgorICAgICAgICAgICAgcmV0dXJuICdVVEMnCiAgICAgICAgIGlmIGRlbHRhIDwgdGltZWRlbHRhKDApOgogICAgICAgICAgICAgc2lnbiA9ICctJwogICAgICAgICAgICAgZGVsdGEgPSAtZGVsdGEKZGlmZiAtLWdpdCBhL0xpYi9kaXMucHkgYi9MaWIvZGlzLnB5CmluZGV4IGY3ZTNjN2YuLjU5ODg2ZjEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXMucHkKKysrIGIvTGliL2Rpcy5weQpAQCAtMTYzLDYgKzE2MywxNSBAQAogX0luc3RydWN0aW9uID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgiX0luc3RydWN0aW9uIiwKICAgICAgIm9wbmFtZSBvcGNvZGUgYXJnIGFyZ3ZhbCBhcmdyZXByIG9mZnNldCBzdGFydHNfbGluZSBpc19qdW1wX3RhcmdldCIpCiAKK19JbnN0cnVjdGlvbi5vcG5hbWUuX19kb2NfXyA9ICJIdW1hbiByZWFkYWJsZSBuYW1lIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24ub3Bjb2RlLl9fZG9jX18gPSAiTnVtZXJpYyBjb2RlIGZvciBvcGVyYXRpb24iCitfSW5zdHJ1Y3Rpb24uYXJnLl9fZG9jX18gPSAiTnVtZXJpYyBhcmd1bWVudCB0byBvcGVyYXRpb24gKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmFyZ3ZhbC5fX2RvY19fID0gIlJlc29sdmVkIGFyZyB2YWx1ZSAoaWYga25vd24pLCBvdGhlcndpc2Ugc2FtZSBhcyBhcmciCitfSW5zdHJ1Y3Rpb24uYXJncmVwci5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIG9wZXJhdGlvbiBhcmd1bWVudCIKK19JbnN0cnVjdGlvbi5vZmZzZXQuX19kb2NfXyA9ICJTdGFydCBpbmRleCBvZiBvcGVyYXRpb24gd2l0aGluIGJ5dGVjb2RlIHNlcXVlbmNlIgorX0luc3RydWN0aW9uLnN0YXJ0c19saW5lLl9fZG9jX18gPSAiTGluZSBzdGFydGVkIGJ5IHRoaXMgb3Bjb2RlIChpZiBhbnkpLCBvdGhlcndpc2UgTm9uZSIKK19JbnN0cnVjdGlvbi5pc19qdW1wX3RhcmdldC5fX2RvY19fID0gIlRydWUgaWYgb3RoZXIgY29kZSBqdW1wcyB0byBoZXJlLCBvdGhlcndpc2UgRmFsc2UiCisKIGNsYXNzIEluc3RydWN0aW9uKF9JbnN0cnVjdGlvbik6CiAgICAgIiIiRGV0YWlscyBmb3IgYSBieXRlY29kZSBvcGVyYXRpb24KIApAQCAtMjc2LDcgKzI4NSw2IEBACiAgICAgIiIiCiAgICAgbGFiZWxzID0gZmluZGxhYmVscyhjb2RlKQogICAgIHN0YXJ0c19saW5lID0gTm9uZQotICAgIGZyZWUgPSBOb25lCiAgICAgZm9yIG9mZnNldCwgb3AsIGFyZyBpbiBfdW5wYWNrX29wYXJncyhjb2RlKToKICAgICAgICAgaWYgbGluZXN0YXJ0cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHN0YXJ0c19saW5lID0gbGluZXN0YXJ0cy5nZXQob2Zmc2V0LCBOb25lKQpAQCAtMjk2LDcgKzMwNCw3IEBACiAgICAgICAgICAgICBlbGlmIG9wIGluIGhhc25hbWU6CiAgICAgICAgICAgICAgICAgYXJndmFsLCBhcmdyZXByID0gX2dldF9uYW1lX2luZm8oYXJnLCBuYW1lcykKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzanJlbDoKLSAgICAgICAgICAgICAgICBhcmd2YWwgPSBvZmZzZXQgKyAzICsgYXJnCisgICAgICAgICAgICAgICAgYXJndmFsID0gb2Zmc2V0ICsgMiArIGFyZwogICAgICAgICAgICAgICAgIGFyZ3JlcHIgPSAidG8gIiArIHJlcHIoYXJndmFsKQogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNsb2NhbDoKICAgICAgICAgICAgICAgICBhcmd2YWwsIGFyZ3JlcHIgPSBfZ2V0X25hbWVfaW5mbyhhcmcsIHZhcm5hbWVzKQpAQCAtMzQzLDIzICszNTEsMTUgQEAKIGRpc2NvID0gZGlzYXNzZW1ibGUgICAgICAgICAgICAgICAgICAgICAjIFhYWCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKIAogZGVmIF91bnBhY2tfb3BhcmdzKGNvZGUpOgotICAgICMgZW51bWVyYXRlKCkgaXMgbm90IGFuIG9wdGlvbiwgc2luY2Ugd2Ugc29tZXRpbWVzIHByb2Nlc3MKLSAgICAjIG11bHRpcGxlIGVsZW1lbnRzIG9uIGEgc2luZ2xlIHBhc3MgdGhyb3VnaCB0aGUgbG9vcAogICAgIGV4dGVuZGVkX2FyZyA9IDAKLSAgICBuID0gbGVuKGNvZGUpCi0gICAgaSA9IDAKLSAgICB3aGlsZSBpIDwgbjoKKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oY29kZSksIDIpOgogICAgICAgICBvcCA9IGNvZGVbaV0KLSAgICAgICAgb2Zmc2V0ID0gaQotICAgICAgICBpID0gaSsxCi0gICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgaWYgb3AgPj0gSEFWRV9BUkdVTUVOVDoKLSAgICAgICAgICAgIGFyZyA9IGNvZGVbaV0gKyBjb2RlW2krMV0qMjU2ICsgZXh0ZW5kZWRfYXJnCi0gICAgICAgICAgICBleHRlbmRlZF9hcmcgPSAwCi0gICAgICAgICAgICBpID0gaSsyCi0gICAgICAgICAgICBpZiBvcCA9PSBFWFRFTkRFRF9BUkc6Ci0gICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnKjY1NTM2Ci0gICAgICAgIHlpZWxkIChvZmZzZXQsIG9wLCBhcmcpCisgICAgICAgICAgICBhcmcgPSBjb2RlW2krMV0gfCBleHRlbmRlZF9hcmcKKyAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IChhcmcgPDwgOCkgaWYgb3AgPT0gRVhURU5ERURfQVJHIGVsc2UgMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICB5aWVsZCAoaSwgb3AsIGFyZykKIAogZGVmIGZpbmRsYWJlbHMoY29kZSk6CiAgICAgIiIiRGV0ZWN0IGFsbCBvZmZzZXRzIGluIGEgYnl0ZSBjb2RlIHdoaWNoIGFyZSBqdW1wIHRhcmdldHMuCkBAIC0zNzAsMTQgKzM3MCwxNCBAQAogICAgIGxhYmVscyA9IFtdCiAgICAgZm9yIG9mZnNldCwgb3AsIGFyZyBpbiBfdW5wYWNrX29wYXJncyhjb2RlKToKICAgICAgICAgaWYgYXJnIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgbGFiZWwgPSAtMQogICAgICAgICAgICAgaWYgb3AgaW4gaGFzanJlbDoKLSAgICAgICAgICAgICAgICBsYWJlbCA9IG9mZnNldCArIDMgKyBhcmcKKyAgICAgICAgICAgICAgICBsYWJlbCA9IG9mZnNldCArIDIgKyBhcmcKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzamFiczoKICAgICAgICAgICAgICAgICBsYWJlbCA9IGFyZwotICAgICAgICAgICAgaWYgbGFiZWwgPj0gMDoKLSAgICAgICAgICAgICAgICBpZiBsYWJlbCBub3QgaW4gbGFiZWxzOgotICAgICAgICAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKGxhYmVsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGFiZWwgbm90IGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKGxhYmVsKQogICAgIHJldHVybiBsYWJlbHMKIAogZGVmIGZpbmRsaW5lc3RhcnRzKGNvZGUpOgpAQCAtMzg2LDggKzM4Niw4IEBACiAgICAgR2VuZXJhdGUgcGFpcnMgKG9mZnNldCwgbGluZW5vKSBhcyBkZXNjcmliZWQgaW4gUHl0aG9uL2NvbXBpbGUuYy4KIAogICAgICIiIgotICAgIGJ5dGVfaW5jcmVtZW50cyA9IGxpc3QoY29kZS5jb19sbm90YWJbMDo6Ml0pCi0gICAgbGluZV9pbmNyZW1lbnRzID0gbGlzdChjb2RlLmNvX2xub3RhYlsxOjoyXSkKKyAgICBieXRlX2luY3JlbWVudHMgPSBjb2RlLmNvX2xub3RhYlswOjoyXQorICAgIGxpbmVfaW5jcmVtZW50cyA9IGNvZGUuY29fbG5vdGFiWzE6OjJdCiAKICAgICBsYXN0bGluZW5vID0gTm9uZQogICAgIGxpbmVubyA9IGNvZGUuY29fZmlyc3RsaW5lbm8KQEAgLTM5OCw2ICszOTgsOSBAQAogICAgICAgICAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCiAgICAgICAgICAgICAgICAgbGFzdGxpbmVubyA9IGxpbmVubwogICAgICAgICAgICAgYWRkciArPSBieXRlX2luY3IKKyAgICAgICAgaWYgbGluZV9pbmNyID49IDB4ODA6CisgICAgICAgICAgICAjIGxpbmVfaW5jcmVtZW50cyBpcyBhbiBhcnJheSBvZiA4LWJpdCBzaWduZWQgaW50ZWdlcnMKKyAgICAgICAgICAgIGxpbmVfaW5jciAtPSAweDEwMAogICAgICAgICBsaW5lbm8gKz0gbGluZV9pbmNyCiAgICAgaWYgbGluZW5vICE9IGxhc3RsaW5lbm86CiAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQppbmRleCBiM2NmZTljLi5mNmMyMWFlIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzZWxmLnRhcmdldF92ZXJzaW9uCiAgICAgICAgICAgICBpZiBub3QgdGFyZ2V0X3ZlcnNpb246CiAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2tpcF9idWlsZCwgIlNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGlzIgotICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc3lzLnZlcnNpb25bMDozXQorICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCB0YXJnZXRfdmVyc2lvbikKICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQppbmRleCAwYzBlMmMxLi5kM2UxZDNhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHNlbGYudGFyZ2V0X3ZlcnNpb24KICAgICAgICAgICAgIGlmIG5vdCB0YXJnZXRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5za2lwX2J1aWxkLCAiU2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoaXMiCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzeXMudmVyc2lvblswOjNdCisgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQogICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKaW5kZXggMzM3ZGQwYi4uYzZmNTJlNiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQpAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXBsYXQtbmFtZSBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICh0cnkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAnLi9jb25maWd1cmUgLS1oZWxwJyBvbiB5b3VyIHBsYXRmb3JtKSIpCiAKLSAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVkLiVkIiAlIChzZWxmLnBsYXRfbmFtZSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgICMgTWFrZSBpdCBzbyBQeXRob24gMi54IGFuZCBQeXRob24gMi54IHdpdGggLS13aXRoLXB5ZGVidWcgZG9uJ3QKICAgICAgICAgIyBzaGFyZSB0aGUgc2FtZSBidWlsZCBkaXJlY3Rvcmllcy4gRG9pbmcgc28gY29uZnVzZXMgdGhlIGJ1aWxkCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVtcCcgKyBwbGF0X3NwZWNpZmllcikKICAgICAgICAgaWYgc2VsZi5idWlsZF9zY3JpcHRzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmJ1aWxkX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLScgKyBzeXMudmVyc2lvblswOjNdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLSVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogCiAgICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY3V0YWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CmluZGV4IDg0N2U4NTguLmIxZmQwOWUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQpAQCAtOSw3ICs5LDcgQEAKIHRoaXMgaGVhZGVyIGZpbGUgbGl2ZXMiLgogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCByZQoraW1wb3J0IG9zLCByZQogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCiBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQppbmRleCA2N2RiMDA3Li45NDc0ZTljIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMjkwLDggKzI5MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6ICclZCVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQppbmRleCBjMmE3ZDY0Li4wZGRjNzM2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpAQCAtMjEsMTAgKzIxLDEwIEBACiAKICAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywoJ2luc3RhbGxfZGlyJywnaW5zdGFsbF9kaXInKSkKLSAgICAgICAgYmFzZW5hbWUgPSAiJXMtJXMtcHklcy5lZ2ctaW5mbyIgJSAoCisgICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JWQuJWQuZWdnLWluZm8iICUgKAogICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpKSwKICAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfdmVyc2lvbihzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpKSksCi0gICAgICAgICAgICBzeXMudmVyc2lvbls6M10KKyAgICAgICAgICAgICpzeXMudmVyc2lvbl9pbmZvWzoyXQogICAgICAgICApCiAgICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQogICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKaW5kZXggODYzNDNjOC4uNDU2ZDUwZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQpAQCAtNSw3ICs1LDcgQEAKIAogIyBjcmVhdGVkIDIwMDIvMTAvMjEsIFJpY2hhcmQgSm9uZXMKIAotaW1wb3J0IG9zLCBzdHJpbmcsIGdldHBhc3MKK2ltcG9ydCBnZXRwYXNzCiBpbXBvcnQgaW8KIGltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0CiBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkKaW5kZXggN2VhM2Q1Zi4uMzVhMDZlYiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQpAQCAtMyw3ICszLDYgQEAKIEltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnc2Rpc3QnIGNvbW1hbmQgKGNyZWF0ZSBhIHNvdXJjZSBkaXN0cmlidXRpb24pLiIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzdHJpbmcKIGltcG9ydCBzeXMKIGZyb20gdHlwZXMgaW1wb3J0ICoKIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5IGIvTGliL2Rpc3R1dGlscy9jb3JlLnB5CmluZGV4IGYwNWIzNGIuLmQ2MDNkNGEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKQEAgLTIwNCwxNiArMjA0LDE1IEBACiAgICAgZ2xvYmFsIF9zZXR1cF9zdG9wX2FmdGVyLCBfc2V0dXBfZGlzdHJpYnV0aW9uCiAgICAgX3NldHVwX3N0b3BfYWZ0ZXIgPSBzdG9wX2FmdGVyCiAKLSAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndgorICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2LmNvcHkoKQogICAgIGcgPSB7J19fZmlsZV9fJzogc2NyaXB0X25hbWV9Ci0gICAgbCA9IHt9CiAgICAgdHJ5OgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzeXMuYXJndlswXSA9IHNjcmlwdF9uYW1lCiAgICAgICAgICAgICBpZiBzY3JpcHRfYXJncyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzeXMuYXJndlsxOl0gPSBzY3JpcHRfYXJncwogICAgICAgICAgICAgd2l0aCBvcGVuKHNjcmlwdF9uYW1lLCAncmInKSBhcyBmOgotICAgICAgICAgICAgICAgIGV4ZWMoZi5yZWFkKCksIGcsIGwpCisgICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZykKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHN5cy5hcmd2ID0gc2F2ZV9hcmd2CiAgICAgICAgICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvZGlzdC5weSBiL0xpYi9kaXN0dXRpbHMvZGlzdC5weQppbmRleCBmZmIzM2ZmNi4uNjJhMjQ1MSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9kaXN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvZGlzdC5weQpAQCAtMTAxOCw4ICsxMDE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpbnRhaW5lciIsICJtYWludGFpbmVyX2VtYWlsIiwgInVybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImxpY2Vuc2UiLCAiZGVzY3JpcHRpb24iLCAibG9uZ19kZXNjcmlwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmRzIiwgInBsYXRmb3JtcyIsICJmdWxsbmFtZSIsICJjb250YWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFjdF9lbWFpbCIsICJsaWNlbnNlIiwgImNsYXNzaWZpZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZG93bmxvYWRfdXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFjdF9lbWFpbCIsICJjbGFzc2lmaWVycyIsICJkb3dubG9hZF91cmwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICMgUEVQIDMxNAogICAgICAgICAgICAgICAgICAgICAgICAgICJwcm92aWRlcyIsICJyZXF1aXJlcyIsICJvYnNvbGV0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5IGIvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkKaW5kZXggN2VmYmI3NC4uYzUwN2RhMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkKKysrIGIvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkKQEAgLTQsNyArNCw2IEBACiBtb2R1bGVzIGluIHNldHVwIHNjcmlwdHMuIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiAKICMgVGhpcyBjbGFzcyBpcyByZWFsbHkgb25seSB1c2VkIGJ5IHRoZSAiYnVpbGRfZXh0IiBjb21tYW5kLCBzbyBpdCBtaWdodApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQppbmRleCA1NzM3MjRkLi5mNzJiN2Y1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQpAQCAtNzAsNyArNzAsNyBAQAogICAgIGxlYXZpbmcgb2ZmIHRoZSBwYXRjaGxldmVsLiAgU2FtcGxlIHJldHVybiB2YWx1ZXMgY291bGQgYmUgJzEuNScKICAgICBvciAnMi4yJy4KICAgICAiIiIKLSAgICByZXR1cm4gc3lzLnZlcnNpb25bOjNdCisgICAgcmV0dXJuICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogCiAKIGRlZiBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTAsIHByZWZpeD1Ob25lKToKQEAgLTI0Miw2ICsyNDIsOCBAQAogICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKF9zeXNfaG9tZSBvciBwcm9qZWN0X2Jhc2UsICJNYWtlZmlsZSIpCiAgICAgbGliX2RpciA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MCwgc3RhbmRhcmRfbGliPTEpCiAgICAgY29uZmlnX2ZpbGUgPSAnY29uZmlnLXt9e30nLmZvcm1hdChnZXRfcHl0aG9uX3ZlcnNpb24oKSwgYnVpbGRfZmxhZ3MpCisgICAgaWYgaGFzYXR0cihzeXMuaW1wbGVtZW50YXRpb24sICdfbXVsdGlhcmNoJyk6CisgICAgICAgIGNvbmZpZ19maWxlICs9ICctJXMnICUgc3lzLmltcGxlbWVudGF0aW9uLl9tdWx0aWFyY2gKICAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpYl9kaXIsIGNvbmZpZ19maWxlLCAnTWFrZWZpbGUnKQogCiAKQEAgLTQxNSwzOCArNDE3LDEzIEBACiAKIGRlZiBfaW5pdF9wb3NpeCgpOgogICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKLSAgICBnID0ge30KLSAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBNYWtlZmlsZToKLSAgICB0cnk6Ci0gICAgICAgIGZpbGVuYW1lID0gZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCkKLSAgICAgICAgcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUsIGcpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgbXNnOgotICAgICAgICBteV9tc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBmaWxlbmFtZQotICAgICAgICBpZiBoYXNhdHRyKG1zZywgInN0cmVycm9yIik6Ci0gICAgICAgICAgICBteV9tc2cgPSBteV9tc2cgKyAiICglcykiICUgbXNnLnN0cmVycm9yCi0KLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCi0KLSAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBweWNvbmZpZy5oOgotICAgIHRyeToKLSAgICAgICAgZmlsZW5hbWUgPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZpbGU6Ci0gICAgICAgICAgICBwYXJzZV9jb25maWdfaChmaWxlLCBnKQotICAgIGV4Y2VwdCBPU0Vycm9yIGFzIG1zZzoKLSAgICAgICAgbXlfbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgZmlsZW5hbWUKLSAgICAgICAgaWYgaGFzYXR0cihtc2csICJzdHJlcnJvciIpOgotICAgICAgICAgICAgbXlfbXNnID0gbXlfbXNnICsgIiAoJXMpIiAlIG1zZy5zdHJlcnJvcgotCi0gICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXlfbXNnKQotCi0gICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCi0gICAgIyAtLSB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBzb3VyY2UsIGJ1dCB3aGVuIGluc3RhbGxlZAotICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgotICAgIGlmIHB5dGhvbl9idWlsZDoKLSAgICAgICAgZ1snTERTSEFSRUQnXSA9IGdbJ0JMRFNIQVJFRCddCi0KKyAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgdGhlIHN5c2NvbmZpZyBtb2R1bGUKKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhXycgKyBzeXMuYWJpZmxhZ3MKKyAgICBfdGVtcCA9IF9faW1wb3J0X18obmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWydidWlsZF90aW1lX3ZhcnMnXSwgMCkKKyAgICBidWlsZF90aW1lX3ZhcnMgPSBfdGVtcC5idWlsZF90aW1lX3ZhcnMKICAgICBnbG9iYWwgX2NvbmZpZ192YXJzCi0gICAgX2NvbmZpZ192YXJzID0gZworICAgIF9jb25maWdfdmFycyA9IHt9CisgICAgX2NvbmZpZ192YXJzLnVwZGF0ZShidWlsZF90aW1lX3ZhcnMpCiAKIAogZGVmIF9pbml0X250KCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQppbmRleCAyNWMxNGFiLi5jMWEyYTA0IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKQEAgLTMsMTYgKzMsMTIgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCi1pbXBvcnQgdGVtcGZpbGUKLWltcG9ydCBzaHV0aWwKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAogZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQotZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHNwYXduCi1mcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgogCiBTRVRVUF9QWSA9ICIiIlwKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkKaW5kZXggMzM5MWYzNi4uYjAyMGE1YiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQpAQCAtMjcsNyArMjcsNyBAQAogICAgICAgICAjIGJ1aWxkX3BsYXRsaWIgaXMgJ2J1aWxkL2xpYi5wbGF0Zm9ybS14LnhbLXB5ZGVidWddJwogICAgICAgICAjIGV4YW1wbGVzOgogICAgICAgICAjICAgYnVpbGQvbGliLm1hY29zeC0xMC4zLWkzODYtMi43Ci0gICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJXMnICUgKGNtZC5wbGF0X25hbWUsIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJWQuJWQnICUgKGNtZC5wbGF0X25hbWUsICpzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX3BsYXRsaWIuZW5kc3dpdGgoJy1weWRlYnVnJykpCiAgICAgICAgICAgICBwbGF0X3NwZWMgKz0gJy1weWRlYnVnJwpAQCAtNDIsNyArNDIsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF90ZW1wLCB3YW50ZWQpCiAKICAgICAgICAgIyBidWlsZF9zY3JpcHRzIGlzIGJ1aWxkL3NjcmlwdHMteC54Ci0gICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ3NjcmlwdHMtJyArICBzeXMudmVyc2lvblswOjNdKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfc2NyaXB0cywgd2FudGVkKQogCiAgICAgICAgICMgZXhlY3V0YWJsZSBpcyBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKaW5kZXggOGY2MmIxYS4uNTVkYjVhOCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CkBAIC0xNjYsNyArMTY2LDYgQEAKICAgICAgICAgY21kID0gc2VsZi5idWlsZF9leHQoZGlzdCkKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKICAgICAgICAgcHlfaW5jbHVkZSA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHlfaW5jbHVkZSwgY21kLmluY2x1ZGVfZGlycykKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CmluZGV4IGI2NGYzMDAuLmM2MDVhZmQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4uIiIiCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGdldHBhc3MKIAogZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbiBpbXBvcnQgY2xlYW4KIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQppbmRleCAzZGQ5MmQ2Li5hZjIxNjcxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnB5cGlyYy5weXBpcmMuIiIiCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHRlbXBmaWxlCiAKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IFB5UElSQ0NvbW1hbmQKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQppbmRleCA2NTQyMjdjLi4yN2NlNzMyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQpAQCAtMjksNiArMjksMjEgQEAKIHNldHVwKCkKICIiIgogCitzZXR1cF9kb2VzX25vdGhpbmcgPSAiIiJcCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorc2V0dXAoKQorIiIiCisKKworc2V0dXBfZGVmaW5lc19zdWJjbGFzcyA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwgYXMgX2luc3RhbGwKKworY2xhc3MgaW5zdGFsbChfaW5zdGFsbCk6CisgICAgc3ViX2NvbW1hbmRzID0gX2luc3RhbGwuc3ViX2NvbW1hbmRzICsgWydjbWQnXQorCitzZXR1cChjbWRjbGFzcz17J2luc3RhbGwnOiBpbnN0YWxsfSkKKyIiIgogCiBjbGFzcyBDb3JlVGVzdENhc2Uoc3VwcG9ydC5FbnZpcm9uR3VhcmQsIHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtNjcsNiArODIsMjEgQEAKICAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAogICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF91c2luZ19fX2ZpbGVfXykpCiAKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfcHJlc2VydmVzX3N5c19hcmd2KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBydW5fc2V0dXAgZG9lcyBub3QgY2xvYmJlciBzeXMuYXJndgorICAgICAgICBhcmd2X2NvcHkgPSBzeXMuYXJndi5jb3B5KCkKKyAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF9kb2VzX25vdGhpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5hcmd2LCBhcmd2X2NvcHkpCisKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfZGVmaW5lc19zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNjcmlwdCBjYW4gdXNlIF9fZmlsZV9fOyBpZiB0aGF0J3MgbWlzc2luZywgdGhlIHRlc3QKKyAgICAgICAgIyBzZXR1cC5weSBzY3JpcHQgd2lsbCByYWlzZSBOYW1lRXJyb3IuCisgICAgICAgIGRpc3QgPSBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX2RlZmluZXNfc3ViY2xhc3MpKQorICAgICAgICBpbnN0YWxsID0gZGlzdC5nZXRfY29tbWFuZF9vYmooJ2luc3RhbGwnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdjbWQnLCBpbnN0YWxsLnN1Yl9jb21tYW5kcykKKwogICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF91c2VzX2N1cnJlbnRfZGlyKHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdHMgdGhhdCB0aGUgc2V0dXAgc2NyaXB0IGlzIHJ1biB3aXRoIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogICAgICAgICAjIGFzIGl0cyBvd24gY3VycmVudCBkaXJlY3Rvcnk7IHRoaXMgd2FzIHRlbXBvcmFyaWx5IGJyb2tlbiBieSBhCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY3lnd2luY2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2N5Z3dpbmNjb21waWxlci5weQppbmRleCA4NTY5MjE2Li45ZGM4NjlkIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY3lnd2luY2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkKQEAgLTMsMTEgKzMsMTAgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwotaW1wb3J0IHN1YnByb2Nlc3MKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGN5Z3dpbmNjb21waWxlcgotZnJvbSBkaXN0dXRpbHMuY3lnd2luY2NvbXBpbGVyIGltcG9ydCAoQ3lnd2luQ0NvbXBpbGVyLCBjaGVja19jb25maWdfaCwKK2Zyb20gZGlzdHV0aWxzLmN5Z3dpbmNjb21waWxlciBpbXBvcnQgKGNoZWNrX2NvbmZpZ19oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0hfT0ssIENPTkZJR19IX05PVE9LLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0hfVU5DRVJUQUlOLCBnZXRfdmVyc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbXN2Y3IpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKaW5kZXggM2UxYzM2Ni4uYzZmYWUzOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQpAQCAtMSw3ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuZGVwX3V0aWwuIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwotaW1wb3J0IHRpbWUKIAogZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyLCBuZXdlcl9wYWlyd2lzZSwgbmV3ZXJfZ3JvdXAKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRmlsZUVycm9yCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQppbmRleCBhNmQwNGYwLi4wMzA0MGFmIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkKQEAgLTEsNyArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmZpbGVfdXRpbC4iIiIKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgZXJybm8KIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKaW5kZXggNGQ4YzAwYS4uMzJhYjI5NiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CkBAIC0xLDggKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YS4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgZ2V0cGFzcwogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YSBpbXBvcnQgaW5zdGFsbF9kYXRhCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkKaW5kZXggZDk1MzE1Ny4uMjIxN2IzMiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5CkBAIC0xLDggKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVycy4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgZ2V0cGFzcwogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVycyBpbXBvcnQgaW5zdGFsbF9oZWFkZXJzCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5CmluZGV4IDZjN2ViMjAuLmY1MDdlZjcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKQEAgLTEsMTEgKzEsMTAgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuc3Bhd24uIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwotaW1wb3J0IHRpbWUKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgX250X3F1b3RlX2FyZ3MKLWZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3biwgZmluZF9leGVjdXRhYmxlCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCiBmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5CmluZGV4IGUxNzFlZTkuLmVmYmEyN2UgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5CkBAIC0xLDUgKzEsNCBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy51bml4Y2NvbXBpbGVyLiIiIgotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBFbnZpcm9ubWVudFZhckd1YXJkLCBydW5fdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGV4dF9maWxlLnB5IGIvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkKaW5kZXggNDc4MzM2Zi4uOTNhYmFkMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkKQEAgLTQsNyArNCw3IEBACiB0aGF0IChvcHRpb25hbGx5KSB0YWtlcyBjYXJlIG9mIHN0cmlwcGluZyBjb21tZW50cywgaWdub3JpbmcgYmxhbmsKIGxpbmVzLCBhbmQgam9pbmluZyBsaW5lcyB3aXRoIGJhY2tzbGFzaGVzLiIiIgogCi1pbXBvcnQgc3lzLCBvcywgaW8KK2ltcG9ydCBzeXMsIGlvCiAKIAogY2xhc3MgVGV4dEZpbGU6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3V0aWwucHkKaW5kZXggZTQyMzMyNS4uZmRjZjZmYSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy91dGlsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQpAQCAtNyw4ICs3LDggQEAKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKLWltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgogZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyCiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KQEAgLTM1MCw2ICszNTAsMTEgQEAKICAgICBnZW5lcmF0ZWQgaW4gaW5kaXJlY3QgbW9kZTsgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBsZWF2ZQogICAgIGl0IHNldCB0byBOb25lLgogICAgICIiIgorCisgICAgIyBMYXRlIGltcG9ydCB0byBmaXggYSBib290c3RyYXAgaXNzdWU6IF9wb3NpeHN1YnByb2Nlc3MgaXMgYnVpbHQgYnkKKyAgICAjIHNldHVwLnB5LCBidXQgc2V0dXAucHkgdXNlcyBkaXN0dXRpbHMuCisgICAgaW1wb3J0IHN1YnByb2Nlc3MKKwogICAgICMgbm90aGluZyBpcyBkb25lIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlIGlzIFRydWUKICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQnl0ZUNvbXBpbGVFcnJvcignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQuJykKQEAgLTQxMiwxMSArNDE3LDkgQEAKIAogICAgICAgICAgICAgc2NyaXB0LmNsb3NlKCkKIAotICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsIHNjcmlwdF9uYW1lXQotICAgICAgICBpZiBvcHRpbWl6ZSA9PSAxOgotICAgICAgICAgICAgY21kLmluc2VydCgxLCAiLU8iKQotICAgICAgICBlbGlmIG9wdGltaXplID09IDI6Ci0gICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItT08iKQorICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGVdCisgICAgICAgIGNtZC5leHRlbmQoc3VicHJvY2Vzcy5fb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkpCisgICAgICAgIGNtZC5hcHBlbmQoc2NyaXB0X25hbWUpCiAgICAgICAgIHNwYXduKGNtZCwgZHJ5X3J1bj1kcnlfcnVuKQogICAgICAgICBleGVjdXRlKG9zLnJlbW92ZSwgKHNjcmlwdF9uYW1lLCksICJyZW1vdmluZyAlcyIgJSBzY3JpcHRfbmFtZSwKICAgICAgICAgICAgICAgICBkcnlfcnVuPWRyeV9ydW4pCmRpZmYgLS1naXQgYS9MaWIvZG9jdGVzdC5weSBiL0xpYi9kb2N0ZXN0LnB5CmluZGV4IDM4ZmRkODAuLjU2MzAyMjAgMTAwNjQ0Ci0tLSBhL0xpYi9kb2N0ZXN0LnB5CisrKyBiL0xpYi9kb2N0ZXN0LnB5CkBAIC0zODEsMTIgKzM4MSwxNSBAQAogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CiAKICMgW1hYXSBOb3JtYWxpemUgd2l0aCByZXNwZWN0IHRvIG9zLnBhdGgucGFyZGlyPwotZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHBhdGgpOgorZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHRlc3RfcGF0aCk6CiAgICAgaWYgbm90IGluc3BlY3QuaXNtb2R1bGUobW9kdWxlKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBhIG1vZHVsZTogJXInICUgbW9kdWxlKQotICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLycpOgorICAgIGlmIHRlc3RfcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01vZHVsZS1yZWxhdGl2ZSBmaWxlcyBtYXkgbm90IGhhdmUgYWJzb2x1dGUgcGF0aHMnKQogCisgICAgIyBOb3JtYWxpemUgdGhlIHBhdGguIE9uIFdpbmRvd3MsIHJlcGxhY2UgIi8iIHdpdGggIlwiLgorICAgIHRlc3RfcGF0aCA9IG9zLnBhdGguam9pbigqKHRlc3RfcGF0aC5zcGxpdCgnLycpKSkKKwogICAgICMgRmluZCB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIHRoZSBwYXRoLgogICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKICAgICAgICAgIyBBIG5vcm1hbCBtb2R1bGUvcGFja2FnZQpAQCAtMzk4LDEzICs0MDEsMTkgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJhc2VkaXIgPSBvcy5jdXJkaXIKICAgICBlbHNlOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgZGlyZWN0b3J5IGluIG1vZHVsZS5fX3BhdGhfXzoKKyAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIHRlc3RfcGF0aCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmdWxscGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxscGF0aAorCiAgICAgICAgICMgQSBtb2R1bGUgdy9vIF9fZmlsZV9fICh0aGlzIGluY2x1ZGVzIGJ1aWx0aW5zKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICIlciAoaXQgaGFzIG5vIF9fZmlsZV9fKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1vZHVsZS5fX25hbWVfXykKIAotICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZWRpciwgKihwYXRoLnNwbGl0KCcvJykpKQorICAgICMgQ29tYmluZSB0aGUgYmFzZSBkaXJlY3RvcnkgYW5kIHRoZSB0ZXN0IHBhdGguCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCB0ZXN0X3BhdGgpCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIDIuIEV4YW1wbGUgJiBEb2NUZXN0CmRpZmYgLS1naXQgYS9MaWIvZW51bS5weSBiL0xpYi9lbnVtLnB5CmluZGV4IGI4Nzg3ZDEuLjk5ZGI5ZTYgMTAwNjQ0Ci0tLSBhL0xpYi9lbnVtLnB5CisrKyBiL0xpYi9lbnVtLnB5CkBAIC0xLDggKzEsMTQgQEAKIGltcG9ydCBzeXMKLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CiBmcm9tIHR5cGVzIGltcG9ydCBNYXBwaW5nUHJveHlUeXBlLCBEeW5hbWljQ2xhc3NBdHRyaWJ1dGUKIAotX19hbGxfXyA9IFsnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCisjIHRyeSBfY29sbGVjdGlvbnMgZmlyc3QgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gX2NvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CisKKworX19hbGxfXyA9IFsnRW51bU1ldGEnLCAnRW51bScsICdJbnRFbnVtJywgJ3VuaXF1ZSddCiAKIAogZGVmIF9pc19kZXNjcmlwdG9yKG9iaik6CkBAIC01NDQsOCArNTUwLDE0IEBACiAgICAgICAgICAgICBzb3VyY2UgPSB2YXJzKHNvdXJjZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNvdXJjZSA9IG1vZHVsZV9nbG9iYWxzCi0gICAgICAgIG1lbWJlcnMgPSB7bmFtZTogdmFsdWUgZm9yIG5hbWUsIHZhbHVlIGluIHNvdXJjZS5pdGVtcygpCi0gICAgICAgICAgICAgICAgaWYgZmlsdGVyKG5hbWUpfQorICAgICAgICAjIFdlIHVzZSBhbiBPcmRlcmVkRGljdCBvZiBzb3J0ZWQgc291cmNlIGtleXMgc28gdGhhdCB0aGUKKyAgICAgICAgIyBfdmFsdWUybWVtYmVyX21hcCBpcyBwb3B1bGF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgZXZlcnkgdGltZQorICAgICAgICAjIGZvciBhIGNvbnNpc3RlbnQgcmV2ZXJzZSBtYXBwaW5nIG9mIG51bWJlciB0byBuYW1lIHdoZW4gdGhlcmUKKyAgICAgICAgIyBhcmUgbXVsdGlwbGUgbmFtZXMgZm9yIHRoZSBzYW1lIG51bWJlciByYXRoZXIgdGhhbiB2YXJ5aW5nCisgICAgICAgICMgYmV0d2VlbiBydW5zIGR1ZSB0byBoYXNoIHJhbmRvbWl6YXRpb24gb2YgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5LgorICAgICAgICBtZW1iZXJzID0gT3JkZXJlZERpY3QoKG5hbWUsIHNvdXJjZVtuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChzb3VyY2Uua2V5cygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlsdGVyKG5hbWUpKQogICAgICAgICBjbHMgPSBjbHMobmFtZSwgbWVtYmVycywgbW9kdWxlPW1vZHVsZSkKICAgICAgICAgY2xzLl9fcmVkdWNlX2V4X18gPSBfcmVkdWNlX2V4X2J5X25hbWUKICAgICAgICAgbW9kdWxlX2dsb2JhbHMudXBkYXRlKGNscy5fX21lbWJlcnNfXykKZGlmZiAtLWdpdCBhL0xpYi9maWxlaW5wdXQucHkgYi9MaWIvZmlsZWlucHV0LnB5CmluZGV4IGQyYjUyMDYuLjcyMWZlOWMgMTAwNjQ0Ci0tLSBhL0xpYi9maWxlaW5wdXQucHkKKysrIGIvTGliL2ZpbGVpbnB1dC5weQpAQCAtNzUsMTMgKzc1LDExIEBACiBpbXBvcnQgc3lzLCBvcwogCiBfX2FsbF9fID0gWyJpbnB1dCIsICJjbG9zZSIsICJuZXh0ZmlsZSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLCAiZmlsZWxpbmVubyIsCi0gICAgICAgICAgICJpc2ZpcnN0bGluZSIsICJpc3N0ZGluIiwgIkZpbGVJbnB1dCJdCisgICAgICAgICAgICJmaWxlbm8iLCAiaXNmaXJzdGxpbmUiLCAiaXNzdGRpbiIsICJGaWxlSW5wdXQiLCAiaG9va19jb21wcmVzc2VkIiwKKyAgICAgICAgICAgImhvb2tfZW5jb2RlZCJdCiAKIF9zdGF0ZSA9IE5vbmUKIAotIyBObyBsb25nZXIgdXNlZAotREVGQVVMVF9CVUZTSVpFID0gOCoxMDI0Ci0KIGRlZiBpbnB1dChmaWxlcz1Ob25lLCBpbnBsYWNlPUZhbHNlLCBiYWNrdXA9IiIsIGJ1ZnNpemU9MCwKICAgICAgICAgICBtb2RlPSJyIiwgb3Blbmhvb2s9Tm9uZSk6CiAgICAgIiIiUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBGaWxlSW5wdXQgY2xhc3MsIHdoaWNoIGNhbiBiZSBpdGVyYXRlZC4KQEAgLTIwMSw2ICsxOTksMTAgQEAKICAgICAgICAgc2VsZi5fZmlsZXMgPSBmaWxlcwogICAgICAgICBzZWxmLl9pbnBsYWNlID0gaW5wbGFjZQogICAgICAgICBzZWxmLl9iYWNrdXAgPSBiYWNrdXAKKyAgICAgICAgaWYgYnVmc2l6ZToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybignYnVmc2l6ZSBpcyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIHNlbGYuX3NhdmVzdGRvdXQgPSBOb25lCiAgICAgICAgIHNlbGYuX291dHB1dCA9IE5vbmUKICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBOb25lCkBAIC0zOTgsOSArNDAwLDkgQEAKICAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUpCiAKIAotZGVmIGhvb2tfZW5jb2RlZChlbmNvZGluZyk6CitkZWYgaG9va19lbmNvZGVkKGVuY29kaW5nLCBlcnJvcnM9Tm9uZSk6CiAgICAgZGVmIG9wZW5ob29rKGZpbGVuYW1lLCBtb2RlKToKLSAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGVycm9ycz1lcnJvcnMpCiAgICAgcmV0dXJuIG9wZW5ob29rCiAKIApkaWZmIC0tZ2l0IGEvTGliL2ZyYWN0aW9ucy5weSBiL0xpYi9mcmFjdGlvbnMucHkKaW5kZXggNjBiMDcyOC4uNjRkNzQ2YiAxMDA2NDQKLS0tIGEvTGliL2ZyYWN0aW9ucy5weQorKysgYi9MaWIvZnJhY3Rpb25zLnB5CkBAIC0xMjUsMTcgKzEyNSw5IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuZGVub21pbmF0b3IKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBmbG9hdCk6Ci0gICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uIGZyb20gZmxvYXQKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZmxvYXQobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCi0KLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIERlY2ltYWwpOgotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9kZWNpbWFsKG51bWVyYXRvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCi0gICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIChmbG9hdCwgRGVjaW1hbCkpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IgPSBudW1lcmF0b3IuYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgc3RyKToKQEAgLTIxMCwxMCArMjAyLDYgQEAKICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShmLCBmbG9hdCk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzLmZyb21fZmxvYXQoKSBvbmx5IHRha2VzIGZsb2F0cywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBmLCB0eXBlKGYpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc25hbihmKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgbWF0aC5pc2luZihmKToKLSAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTIyNiwxOSArMjE0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKICAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19pbmZpbml0ZSgpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigKLSAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIGlmIGRlYy5pc19uYW4oKToKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVzIHRvICVzLiIgJSAoZGVjLCBjbHMuX19uYW1lX18pKQotICAgICAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGRlYy5hc190dXBsZSgpCi0gICAgICAgIGRpZ2l0cyA9IGludCgnJy5qb2luKG1hcChzdHIsIGRpZ2l0cykpKQotICAgICAgICBpZiBzaWduOgotICAgICAgICAgICAgZGlnaXRzID0gLWRpZ2l0cwotICAgICAgICBpZiBleHAgPj0gMDoKLSAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzICogMTAgKiogZXhwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMsIDEwICoqIC1leHApCisgICAgICAgIHJldHVybiBjbHMoKmRlYy5hc19pbnRlZ2VyX3JhdGlvKCkpCiAKICAgICBkZWYgbGltaXRfZGVub21pbmF0b3Ioc2VsZiwgbWF4X2Rlbm9taW5hdG9yPTEwMDAwMDApOgogICAgICAgICAiIiJDbG9zZXN0IEZyYWN0aW9uIHRvIHNlbGYgd2l0aCBkZW5vbWluYXRvciBhdCBtb3N0IG1heF9kZW5vbWluYXRvci4KZGlmZiAtLWdpdCBhL0xpYi9mdHBsaWIucHkgYi9MaWIvZnRwbGliLnB5CmluZGV4IGM0MTZkODUuLjJhYjFkNTYgMTAwNjQ0Ci0tLSBhL0xpYi9mdHBsaWIucHkKKysrIGIvTGliL2Z0cGxpYi5weQpAQCAtMzYsMTMgKzM2LDEyIEBACiAjIE1vZGlmaWVkIGJ5IEdpYW1wYW9sbyBSb2RvbGEnIHRvIGFkZCBUTFMgc3VwcG9ydC4KICMKIAotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgd2FybmluZ3MKIGZyb20gc29ja2V0IGltcG9ydCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAogCi1fX2FsbF9fID0gWyJGVFAiXQorX19hbGxfXyA9IFsiRlRQIiwgImVycm9yX3JlcGx5IiwgImVycm9yX3RlbXAiLCAiZXJyb3JfcGVybSIsICJlcnJvcl9wcm90byIsCisgICAgICAgICAgICJhbGxfZXJyb3JzIl0KIAogIyBNYWdpYyBudW1iZXIgZnJvbSA8c29ja2V0Lmg+CiBNU0dfT09CID0gMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIGRhdGEgb3V0IG9mIGJhbmQKZGlmZiAtLWdpdCBhL0xpYi9odHRwL2NsaWVudC5weSBiL0xpYi9odHRwL2NsaWVudC5weQppbmRleCAzNTAzMTNlLi43NjNlMWVmIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9jbGllbnQucHkKKysrIGIvTGliL2h0dHAvY2xpZW50LnB5CkBAIC00MjAsNiArNDIwLDcgQEAKICAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQogCiAgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICAiIiJBbHdheXMgcmV0dXJucyBUcnVlIiIiCiAgICAgICAgIHJldHVybiBUcnVlCiAKICAgICAjIEVuZCBvZiAicmF3IHN0cmVhbSIgbWV0aG9kcwpAQCAtNDY3LDYgKzQ2OCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHMKIAogICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBsZW4oYikgYnl0ZXMgaW50byBieXRlYXJyYXkgYiBhbmQgcmV0dXJuIHRoZSBudW1iZXIKKyAgICAgICAgb2YgYnl0ZXMgcmVhZC4KKyAgICAgICAgIiIiCisKICAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuIDAKIApAQCAtNzA2LDYgKzcxMSwxNyBAQAogICAgICAgICByZXR1cm4gc2VsZi5mcC5maWxlbm8oKQogCiAgICAgZGVmIGdldGhlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAnJydSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyIG1hdGNoaW5nICpuYW1lKi4KKworICAgICAgICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hpbmcgaGVhZGVycywgdGhlIHZhbHVlcyBhcmUKKyAgICAgICAgY29tYmluZWQgaW50byBhIHNpbmdsZSBzdHJpbmcgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgc3BhY2VzLgorCisgICAgICAgIElmIG5vIG1hdGNoaW5nIGhlYWRlciBpcyBmb3VuZCwgcmV0dXJucyAqZGVmYXVsdCogb3IgTm9uZSBpZgorICAgICAgICB0aGUgKmRlZmF1bHQqIGlzIG5vdCBzcGVjaWZpZWQuCisKKyAgICAgICAgSWYgdGhlIGhlYWRlcnMgYXJlIHVua25vd24sIHJhaXNlcyBodHRwLmNsaWVudC5SZXNwb25zZU5vdFJlYWR5LgorCisgICAgICAgICcnJwogICAgICAgICBpZiBzZWxmLmhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgIHJhaXNlIFJlc3BvbnNlTm90UmVhZHkoKQogICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzLmdldF9hbGwobmFtZSkgb3IgZGVmYXVsdApAQCAtNzI4LDEyICs3NDQsNDUgQEAKICAgICAjIEZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkLXN0eWxlIHVybGxpYiByZXNwb25zZXMuCiAKICAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgJycnUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbWltZXRvb2xzLk1lc3NhZ2UgY29udGFpbmluZworICAgICAgICBtZXRhLWluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgVVJMLgorCisgICAgICAgIFdoZW4gdGhlIG1ldGhvZCBpcyBIVFRQLCB0aGVzZSBoZWFkZXJzIGFyZSB0aG9zZSByZXR1cm5lZCBieQorICAgICAgICB0aGUgc2VydmVyIGF0IHRoZSBoZWFkIG9mIHRoZSByZXRyaWV2ZWQgSFRNTCBwYWdlIChpbmNsdWRpbmcKKyAgICAgICAgQ29udGVudC1MZW5ndGggYW5kIENvbnRlbnQtVHlwZSkuCisKKyAgICAgICAgV2hlbiB0aGUgbWV0aG9kIGlzIEZUUCwgYSBDb250ZW50LUxlbmd0aCBoZWFkZXIgd2lsbCBiZQorICAgICAgICBwcmVzZW50IGlmIChhcyBpcyBub3cgdXN1YWwpIHRoZSBzZXJ2ZXIgcGFzc2VkIGJhY2sgYSBmaWxlCisgICAgICAgIGxlbmd0aCBpbiByZXNwb25zZSB0byB0aGUgRlRQIHJldHJpZXZhbCByZXF1ZXN0LiBBCisgICAgICAgIENvbnRlbnQtVHlwZSBoZWFkZXIgd2lsbCBiZSBwcmVzZW50IGlmIHRoZSBNSU1FIHR5cGUgY2FuIGJlCisgICAgICAgIGd1ZXNzZWQuCisKKyAgICAgICAgV2hlbiB0aGUgbWV0aG9kIGlzIGxvY2FsLWZpbGUsIHJldHVybmVkIGhlYWRlcnMgd2lsbCBpbmNsdWRlCisgICAgICAgIGEgRGF0ZSByZXByZXNlbnRpbmcgdGhlIGZpbGUncyBsYXN0LW1vZGlmaWVkIHRpbWUsIGEKKyAgICAgICAgQ29udGVudC1MZW5ndGggZ2l2aW5nIGZpbGUgc2l6ZSwgYW5kIGEgQ29udGVudC1UeXBlCisgICAgICAgIGNvbnRhaW5pbmcgYSBndWVzcyBhdCB0aGUgZmlsZSdzIHR5cGUuIFNlZSBhbHNvIHRoZQorICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgbWltZXRvb2xzIG1vZHVsZS4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycwogCiAgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgJycnUmV0dXJuIHRoZSByZWFsIFVSTCBvZiB0aGUgcGFnZS4KKworICAgICAgICBJbiBzb21lIGNhc2VzLCB0aGUgSFRUUCBzZXJ2ZXIgcmVkaXJlY3RzIGEgY2xpZW50IHRvIGFub3RoZXIKKyAgICAgICAgVVJMLiBUaGUgdXJsb3BlbigpIGZ1bmN0aW9uIGhhbmRsZXMgdGhpcyB0cmFuc3BhcmVudGx5LCBidXQgaW4KKyAgICAgICAgc29tZSBjYXNlcyB0aGUgY2FsbGVyIG5lZWRzIHRvIGtub3cgd2hpY2ggVVJMIHRoZSBjbGllbnQgd2FzCisgICAgICAgIHJlZGlyZWN0ZWQgdG8uIFRoZSBnZXR1cmwoKSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IGF0IHRoaXMKKyAgICAgICAgcmVkaXJlY3RlZCBVUkwuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLnVybAogCiAgICAgZGVmIGdldGNvZGUoc2VsZik6CisgICAgICAgICcnJ1JldHVybiB0aGUgSFRUUCBzdGF0dXMgY29kZSB0aGF0IHdhcyBzZW50IHdpdGggdGhlIHJlc3BvbnNlLAorICAgICAgICBvciBOb25lIGlmIHRoZSBVUkwgaXMgbm90IGFuIEhUVFAgVVJMLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi5zdGF0dXMKIAogY2xhc3MgSFRUUENvbm5lY3Rpb246CmRpZmYgLS1naXQgYS9MaWIvaHR0cC9zZXJ2ZXIucHkgYi9MaWIvaHR0cC9zZXJ2ZXIucHkKaW5kZXggMDA2MjBkMS4uZTEyZTQ1YiAxMDA2NDQKLS0tIGEvTGliL2h0dHAvc2VydmVyLnB5CisrKyBiL0xpYi9odHRwL3NlcnZlci5weQpAQCAtODcsNiArODcsNyBAQAogICAgICJTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIiLCAiQ0dJSFRUUFJlcXVlc3RIYW5kbGVyIiwKIF0KIAoraW1wb3J0IGVtYWlsLnV0aWxzCiBpbXBvcnQgaHRtbAogaW1wb3J0IGh0dHAuY2xpZW50CiBpbXBvcnQgaW8KQEAgLTEyNiw5ICsxMjcsNiBAQAogCiBERUZBVUxUX0VSUk9SX0NPTlRFTlRfVFlQRSA9ICJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIKIAotZGVmIF9xdW90ZV9odG1sKGh0bWwpOgotICAgIHJldHVybiBodG1sLnJlcGxhY2UoIiYiLCAiJmFtcDsiKS5yZXBsYWNlKCI8IiwgIiZsdDsiKS5yZXBsYWNlKCI+IiwgIiZndDsiKQotCiBjbGFzcyBIVFRQU2VydmVyKHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIpOgogCiAgICAgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IDEgICAgIyBTZWVtcyB0byBtYWtlIHNlbnNlIGluIHRlc3RpbmcgZW52aXJvbm1lbnQKQEAgLTEzNiw3ICsxMzQsNyBAQAogICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKICAgICAgICAgIiIiT3ZlcnJpZGUgc2VydmVyX2JpbmQgdG8gc3RvcmUgdGhlIHNlcnZlciBuYW1lLiIiIgogICAgICAgICBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyLnNlcnZlcl9iaW5kKHNlbGYpCi0gICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzoyXQorICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5zZXJ2ZXJfYWRkcmVzc1s6Ml0KICAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSA9IHNvY2tldC5nZXRmcWRuKGhvc3QpCiAgICAgICAgIHNlbGYuc2VydmVyX3BvcnQgPSBwb3J0CiAKQEAgLTI4MiwxMiArMjgwLDkgQEAKICAgICAgICAgd29yZHMgPSByZXF1ZXN0bGluZS5zcGxpdCgpCiAgICAgICAgIGlmIGxlbih3b3JkcykgPT0gMzoKICAgICAgICAgICAgIGNvbW1hbmQsIHBhdGgsIHZlcnNpb24gPSB3b3JkcwotICAgICAgICAgICAgaWYgdmVyc2lvbls6NV0gIT0gJ0hUVFAvJzoKLSAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgIEhUVFBTdGF0dXMuQkFEX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICJCYWQgcmVxdWVzdCB2ZXJzaW9uICglcikiICUgdmVyc2lvbikKLSAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uWzo1XSAhPSAnSFRUUC8nOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCiAgICAgICAgICAgICAgICAgYmFzZV92ZXJzaW9uX251bWJlciA9IHZlcnNpb24uc3BsaXQoJy8nLCAxKVsxXQogICAgICAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyID0gYmFzZV92ZXJzaW9uX251bWJlci5zcGxpdCgiLiIpCiAgICAgICAgICAgICAgICAgIyBSRkMgMjE0NSBzZWN0aW9uIDMuMSBzYXlzIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSAiLiIgYW5kCkBAIC0zMDksNyArMzA0LDcgQEAKICAgICAgICAgICAgIGlmIHZlcnNpb25fbnVtYmVyID49ICgyLCAwKToKICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIEhUVFBTdGF0dXMuSFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQsCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEhUVFAgVmVyc2lvbiAoJXMpIiAlIGJhc2VfdmVyc2lvbl9udW1iZXIpCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEhUVFAgdmVyc2lvbiAoJXMpIiAlIGJhc2VfdmVyc2lvbl9udW1iZXIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGVsaWYgbGVuKHdvcmRzKSA9PSAyOgogICAgICAgICAgICAgY29tbWFuZCwgcGF0aCA9IHdvcmRzCkBAIC0zMzIsMTAgKzMyNywxMSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBodHRwLmNsaWVudC5wYXJzZV9oZWFkZXJzKHNlbGYucmZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbGFzcz1zZWxmLk1lc3NhZ2VDbGFzcykKLSAgICAgICAgZXhjZXB0IGh0dHAuY2xpZW50LkxpbmVUb29Mb25nOgorICAgICAgICBleGNlcHQgaHR0cC5jbGllbnQuTGluZVRvb0xvbmcgYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKAotICAgICAgICAgICAgICAgIEhUVFBTdGF0dXMuQkFEX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgIkxpbmUgdG9vIGxvbmciKQorICAgICAgICAgICAgICAgIEhUVFBTdGF0dXMuUkVRVUVTVF9IRUFERVJfRklFTERTX1RPT19MQVJHRSwKKyAgICAgICAgICAgICAgICAiTGluZSB0b28gbG9uZyIsCisgICAgICAgICAgICAgICAgc3RyKGVycikpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZXhjZXB0IGh0dHAuY2xpZW50LkhUVFBFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKApAQCAtNDY1LDggKzQ2MSw4IEBACiAgICAgICAgICAgICAjIChzZWUgYnVnICMxMTAwMjAxKQogICAgICAgICAgICAgY29udGVudCA9IChzZWxmLmVycm9yX21lc3NhZ2VfZm9ybWF0ICUgewogICAgICAgICAgICAgICAgICdjb2RlJzogY29kZSwKLSAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IF9xdW90ZV9odG1sKG1lc3NhZ2UpLAotICAgICAgICAgICAgICAgICdleHBsYWluJzogX3F1b3RlX2h0bWwoZXhwbGFpbikKKyAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IGh0bWwuZXNjYXBlKG1lc3NhZ2UsIHF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAnZXhwbGFpbic6IGh0bWwuZXNjYXBlKGV4cGxhaW4sIHF1b3RlPUZhbHNlKQogICAgICAgICAgICAgfSkKICAgICAgICAgICAgIGJvZHkgPSBjb250ZW50LmVuY29kZSgnVVRGLTgnLCAncmVwbGFjZScpCiAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCBzZWxmLmVycm9yX2NvbnRlbnRfdHlwZSkKQEAgLTQ5MSwxMiArNDg3LDEyIEBACiAKICAgICBkZWYgc2VuZF9yZXNwb25zZV9vbmx5KHNlbGYsIGNvZGUsIG1lc3NhZ2U9Tm9uZSk6CiAgICAgICAgICIiIlNlbmQgdGhlIHJlc3BvbnNlIGhlYWRlciBvbmx5LiIiIgotICAgICAgICBpZiBtZXNzYWdlIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBjb2RlIGluIHNlbGYucmVzcG9uc2VzOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnJlc3BvbnNlc1tjb2RlXVswXQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBtZXNzYWdlID0gJycKICAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gIT0gJ0hUVFAvMC45JzoKKyAgICAgICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBjb2RlIGluIHNlbGYucmVzcG9uc2VzOgorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gc2VsZi5yZXNwb25zZXNbY29kZV1bMF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJycKICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfaGVhZGVyc19idWZmZXInKToKICAgICAgICAgICAgICAgICBzZWxmLl9oZWFkZXJzX2J1ZmZlciA9IFtdCiAgICAgICAgICAgICBzZWxmLl9oZWFkZXJzX2J1ZmZlci5hcHBlbmQoKCIlcyAlZCAlc1xyXG4iICUKQEAgLTU4MywxMiArNTc5LDcgQEAKICAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgZm9ybWF0dGVkIGZvciBhIG1lc3NhZ2UgaGVhZGVyLiIiIgogICAgICAgICBpZiB0aW1lc3RhbXAgaXMgTm9uZToKICAgICAgICAgICAgIHRpbWVzdGFtcCA9IHRpbWUudGltZSgpCi0gICAgICAgIHllYXIsIG1vbnRoLCBkYXksIGhoLCBtbSwgc3MsIHdkLCB5LCB6ID0gdGltZS5nbXRpbWUodGltZXN0YW1wKQotICAgICAgICBzID0gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKLSAgICAgICAgICAgICAgICBzZWxmLndlZWtkYXluYW1lW3dkXSwKLSAgICAgICAgICAgICAgICBkYXksIHNlbGYubW9udGhuYW1lW21vbnRoXSwgeWVhciwKLSAgICAgICAgICAgICAgICBoaCwgbW0sIHNzKQotICAgICAgICByZXR1cm4gcworICAgICAgICByZXR1cm4gZW1haWwudXRpbHMuZm9ybWF0ZGF0ZSh0aW1lc3RhbXAsIHVzZWdtdD1UcnVlKQogCiAgICAgZGVmIGxvZ19kYXRlX3RpbWVfc3RyaW5nKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgdGltZSBmb3JtYXR0ZWQgZm9yIGxvZ2dpbmcuIiIiCkBAIC03MjYsNyArNzE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSdzdXJyb2dhdGVwYXNzJykKICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgIGRpc3BsYXlwYXRoID0gdXJsbGliLnBhcnNlLnVucXVvdGUocGF0aCkKLSAgICAgICAgZGlzcGxheXBhdGggPSBodG1sLmVzY2FwZShkaXNwbGF5cGF0aCkKKyAgICAgICAgZGlzcGxheXBhdGggPSBodG1sLmVzY2FwZShkaXNwbGF5cGF0aCwgcXVvdGU9RmFsc2UpCiAgICAgICAgIGVuYyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQogICAgICAgICB0aXRsZSA9ICdEaXJlY3RvcnkgbGlzdGluZyBmb3IgJXMnICUgZGlzcGxheXBhdGgKICAgICAgICAgci5hcHBlbmQoJzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgJwpAQCAtNzUwLDcgKzc0MSw3IEBACiAgICAgICAgICAgICByLmFwcGVuZCgnPGxpPjxhIGhyZWY9IiVzIj4lczwvYT48L2xpPicKICAgICAgICAgICAgICAgICAgICAgJSAodXJsbGliLnBhcnNlLnF1b3RlKGxpbmtuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSdzdXJyb2dhdGVwYXNzJyksCi0gICAgICAgICAgICAgICAgICAgICAgIGh0bWwuZXNjYXBlKGRpc3BsYXluYW1lKSkpCisgICAgICAgICAgICAgICAgICAgICAgIGh0bWwuZXNjYXBlKGRpc3BsYXluYW1lLCBxdW90ZT1GYWxzZSkpKQogICAgICAgICByLmFwcGVuZCgnPC91bD5cbjxocj5cbjwvYm9keT5cbjwvaHRtbD5cbicpCiAgICAgICAgIGVuY29kZWQgPSAnXG4nLmpvaW4ocikuZW5jb2RlKGVuYywgJ3N1cnJvZ2F0ZWVzY2FwZScpCiAgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKQEAgLTExOTEsMTYgKzExODIsMTUgQEAKICAgICBzZXJ2ZXJfYWRkcmVzcyA9IChiaW5kLCBwb3J0KQogCiAgICAgSGFuZGxlckNsYXNzLnByb3RvY29sX3ZlcnNpb24gPSBwcm90b2NvbAotICAgIGh0dHBkID0gU2VydmVyQ2xhc3Moc2VydmVyX2FkZHJlc3MsIEhhbmRsZXJDbGFzcykKLQotICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKLSAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iKQotICAgIHRyeToKLSAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKLSAgICAgICAgaHR0cGQuc2VydmVyX2Nsb3NlKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKKyAgICB3aXRoIFNlcnZlckNsYXNzKHNlcnZlcl9hZGRyZXNzLCBIYW5kbGVyQ2xhc3MpIGFzIGh0dHBkOgorICAgICAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHNlcnZlX21lc3NhZ2UgPSAiU2VydmluZyBIVFRQIG9uIHtob3N0fSBwb3J0IHtwb3J0fSAoaHR0cDovL3tob3N0fTp7cG9ydH0vKSAuLi4iCisgICAgICAgIHByaW50KHNlcnZlX21lc3NhZ2UuZm9ybWF0KGhvc3Q9c2FbMF0sIHBvcnQ9c2FbMV0pKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL05FV1MudHh0IGIvTGliL2lkbGVsaWIvTkVXUy50eHQKaW5kZXggNmVmMmFhNS4uNGE2OTI0OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTkVXUy50eHQKKysrIGIvTGliL2lkbGVsaWIvTkVXUy50eHQKQEAgLTEsNiArMSw4IEBACi1XaGF0J3MgTmV3IGluIElETEUgMy41LjM/Ci09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qUmVsZWFzZSBkYXRlOiAyMDE3LTAxLTAxPyoKK1doYXQncyBOZXcgaW4gSURMRSAzLjYuMD8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorKlJlbGVhc2UgZGF0ZTogMjAxNi0wOS0/PyoKKworLSBJc3N1ZSAjMjczNzI6IFRlc3RfaWRsZSBubyBsb25nZXIgY2hhbmdlcyB0aGUgbG9jYWxlLgogCiAtIElzc3VlICMyNzM2NTogQWxsb3cgbm9uLWFzY2lpIGNoYXJzIGluIElETEUgTkVXUy50eHQsIGZvciBjb250cmlidXRvciBuYW1lcy4KIApAQCAtOCwxOSArMTAsMzEgQEAKICAgUHJldmlvdXNseSwgd2hlbiBJRExFIHdhcyBzdGFydGVkIGZyb20gYSBjb25zb2xlIG9yIGJ5IGltcG9ydCwgYSBjYXNjYWRlCiAgIG9mIHdhcm5pbmdzIHdhcyBlbWl0dGVkLiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KIAorLSBJc3N1ZSAjMjQxMzc6IFJ1biBJRExFLCB0ZXN0X2lkbGUsIGFuZCBodGVzdCB3aXRoIHRraW50ZXIgZGVmYXVsdCByb290IGRpc2FibGVkLgorICBGaXggY29kZSBhbmQgdGVzdHMgdGhhdCBmYWlsIHdpdGggdGhpcyByZXN0cmljdGlvbi4KKyAgRml4IGh0ZXN0cyB0byBub3QgY3JlYXRlIGEgc2Vjb25kIGFuZCByZWR1bmRhbnQgcm9vdCBhbmQgbWFpbmxvb3AuCiAKLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMj8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTYtMDYtMjYqCistIElzc3VlICMyNzMxMDogRml4IElETEUuYXBwIGZhaWx1cmUgdG8gbGF1bmNoIG9uIE9TIFggZHVlIHRvIHZlc3RpZ2lhbCBpbXBvcnQuCiAKIC0gSXNzdWUgIzUxMjQ6IFBhc3RlIHdpdGggdGV4dCBzZWxlY3RlZCBub3cgcmVwbGFjZXMgdGhlIHNlbGVjdGlvbiBvbiBYMTEuCiAgIFRoaXMgbWF0Y2hlcyBob3cgcGFzdGUgd29ya3Mgb24gV2luZG93cywgTWFjLCBtb3N0IG1vZGVybiBMaW51eCBhcHBzLAogICBhbmQgdHRrIHdpZGdldHMuICBPcmlnaW5hbCBwYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgogCistIElzc3VlICMyNDc1MDogU3dpdGNoIGFsbCBzY3JvbGxiYXJzIGluIElETEUgdG8gdHRrIHZlcnNpb25zLgorICBXaGVyZSBuZWVkZWQsIG1pbmltYWwgdGVzdHMgYXJlIGFkZGVkIHRvIGNvdmVyIGNoYW5nZXMuCisKKy0gSXNzdWUgIzI0NzU5OiBJRExFIHJlcXVpcmVzIHRrIDguNSBhbmQgYXZhaWxhYmlsaXR5IHR0ayB3aWRnZXRzLgorICBEZWxldGUgbm93IHVubmVlZGVkIHRrIHZlcnNpb24gdGVzdHMgYW5kIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zLgorICBBZGQgdGVzdCBmb3IgSURMRSBzeW50YXggY29sb3JpemVyLgorCistIElzc3VlICMyNzIzOTogaWRsZWxpYi5tYWNvc3guaXNYeXpUayBmdW5jdGlvbnMgaW5pdGlhbGl6ZSBhcyBuZWVkZWQuCisKKy0gSXNzdWUgIzI3MjYyOiBtb3ZlIEFxdWEgdW5iaW5kaW5nIGNvZGUsIHdoaWNoIGVuYWJsZSBjb250ZXh0IG1lbnVzLCB0byBtYXhvc3guCisKIC0gSXNzdWUgIzI0NzU5OiBNYWtlIGNsZWFyIGluIGlkbGVsaWIuaWRsZV90ZXN0Ll9faW5pdF9fIHRoYXQgdGhlIGRpcmVjdG9yeQogICBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdC50ZXN0X2lkbGUgYW5kIHRvb2wgZm9yIG1haW50YWluZXJzLgogCi0tIElzc3VlICMyNzE5NjogU3RvcCAnVGhlbWVDaGFuZ2VmJyB3YXJuaW5ncyB3aGVuIHJ1bm5pbmcgSURMRSB0ZXN0cy4KKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgogICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KICAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgogICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dApAQCAtMjgsOSArNDIsMjYgQEAKIC0gSXNzdWUgIzIwNTY3OiBSZXZpc2UgaWRsZV90ZXN0L1JFQURNRS50eHQgd2l0aCBhZHZpY2UgYWJvdXQgYXZvaWRpbmcKICAgdGsgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRlc3RzLiAgQXBwbHkgYWR2aWNlIHRvIHNldmVyYWwgSURMRSB0ZXN0cy4KIAorLSBJc3N1ZSAjIDI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiAnaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTicgaXMgdGhlIHNhbWUgYXMKKyAgJ2ltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldJworICAzLiBBZnRlciAnb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncyknLAorICAnb2Iua2V5cygpJyA9PSAnbGlzdChvYi5vYmplY3Qua2V5cykuCisgIDQuIEluIG1hY29zYywgcnVubmluZ0FzT1NYQVBQID09IGlzQXF1YVRrOyBpZENhcmJvbkFxdWFUayA9PSBpc0NhcmJvblRrCisKIC0gSXNzdWUgIzI3MTE3OiBNYWtlIGNvbG9yaXplciBodGVzdCBhbmQgdHVydGxlZGVtbyB3b3JrIHdpdGggZGFyayB0aGVtZXMuCiAgIE1vdmUgY29kZSBmb3IgY29uZmlndXJpbmcgdGV4dCB3aWRnZXQgY29sb3JzIHRvIGEgbmV3IGZ1bmN0aW9uLgogCistIElzc3VlICMyNDIyNTogUmVuYW1lIG1hbnkgaWRsZWxpYi8qLnB5IGFuZCBpZGxlX3Rlc3QvdGVzdF8qLnB5IGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCiAtIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KICAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KIApAQCAtNDMsOCArNzQsOCBAQAogLSBJc3N1ZSAjMTg0MTA6IEFkZCB0ZXN0IGZvciBJRExFJ3Mgc2VhcmNoIGRpYWxvZy4KICAgT3JpZ2luYWwgcGF0Y2ggYnkgV2VzdGxleSBNYXJ0w61uZXouCiAKLS0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgdW5kbyBkZWxlZ2F0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthciAuCistIElzc3VlICMyMTcwMzogQWRkIHRlc3QgZm9yIHVuZG8gZGVsZWdhdG9yLiAgUGF0Y2ggbW9zdGx5IGJ5CisgIFNhaW1hZGhhdiBIZWJsaWthciAuCiAKIC0gSXNzdWUgIzI3MDQ0OiBBZGQgQ29uZmlnRGlhbG9nLnJlbW92ZV92YXJfY2FsbGJhY2tzIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgogCkBAIC02MywxMSArOTQsNiBAQAogICBNQVJLIGluIFJFQURNRS50eHQgYW5kIG9wZW4gdGhpcyBhbmQgTkVXUy50eHQgd2l0aCAnYXNjaWknLgogICBSZS1lbmNvZGUgQ1JFRElUUy50eHQgdG8gdXRmLTggYW5kIG9wZW4gaXQgd2l0aCAndXRmLTgnLgogCi0KLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTUtMTItMDYqCi0KIC0gSXNzdWUgMTUzNDg6IFN0b3AgdGhlIGRlYnVnZ2VyIGVuZ2luZSAobm9ybWFsbHkgaW4gYSB1c2VyIHByb2Nlc3MpCiAgIGJlZm9yZSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aW5kb3cgKHJ1bm5pbmcgaW4gdGhlIElETEUgcHJvY2VzcykuCiAgIFRoaXMgcHJldmVudHMgdGhlIFJ1bnRpbWVFcnJvcnMgdGhhdCB3ZXJlIGJlaW5nIGNhdWdodCBhbmQgaWdub3JlZC4KQEAgLTM0NSw2ICszNzEsMTEgQEAKIC0gVXNlIG9mICdmaWx0ZXInIGluIGtleWJpbmRpbmdEaWFsb2cucHkgd2FzIGNhdXNpbmcgY3VzdG9tIGtleSBhc3NpZ25tZW50IHRvCiAgIGZhaWwuICBQYXRjaCA1NzA3IGFtYXVyeS5mb3JnZW90ZGFyYy4KIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4xYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwNy1NYXItMDkqCisKIC0gSXNzdWUgIzQ4MTU6IE9mZmVyIGNvbnZlcnNpb24gdG8gVVRGLTggaWYgc291cmNlIGZpbGVzIGhhdmUKICAgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gYW5kIGFyZSBub3QgZW5jb2RlZCBpbiBVVEYtOC4KIApAQCAtMzg0LDYgKzQxNSwxMSBAQAogCiAtIElzc3VlICMzNTQ5OiBPbiBNYWNPUyB0aGUgcHJlZmVyZW5jZXMgbWVudSB3YXMgbm90IHByZXNlbnQKIAorCitXaGF0J3MgTmV3IGluIElETEUgMy4wPworPT09PT09PT09PT09PT09PT09PT09PT0KKypSZWxlYXNlIGRhdGU6IDAzLURlYy0yMDA4KgorCiAtIElETEUgd291bGQgcHJpbnQgYSAiVW5oYW5kbGVkIHNlcnZlciBleGNlcHRpb24hIiBtZXNzYWdlIHdoZW4gaW50ZXJuYWwKICAgZGVidWdnaW5nIGlzIGVuYWJsZWQuCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JFQURNRS50eHQgYi9MaWIvaWRsZWxpYi9SRUFETUUudHh0CmluZGV4IDdiZjc0YzAuLmQzMzNiNDcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JFQURNRS50eHQKKysrIGIvTGliL2lkbGVsaWIvUkVBRE1FLnR4dApAQCAtMjksNjEgKzI5LDYxIEBACiAKIEltcGxlbWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tLQotQXV0b0NvbXBsZXRlLnB5ICAgIyBDb21wbGV0ZSBhdHRyaWJ1dGUgbmFtZXMgb3IgZmlsZW5hbWVzLgotQXV0b0NvbXBsZXRlV2luZG93LnB5ICAjIERpc3BsYXkgY29tcGxldGlvbnMuCi1BdXRvRXhwYW5kLnB5ICAgICAjIEV4cGFuZCB3b3JkIHdpdGggcHJldmlvdXMgd29yZCBpbiBmaWxlLgotQmluZGluZ3MucHkgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBJRExFIG1lbnUuCi1DYWxsVGlwV2luZG93LnB5ICAjIERpc3BsYXkgY2FsbHRpcC4KLUNhbGxUaXBzLnB5ICAgICAgICMgQ3JlYXRlIGNhbGx0aXAgdGV4dC4KLUNsYXNzQnJvd3Nlci5weSAgICMgQ3JlYXRlIG1vZHVsZSBicm93c2VyIHdpbmRvdy4KLUNvZGVDb250ZXh0LnB5ICAgICMgU2hvdyBjb21wb3VuZCBzdGF0ZW1lbnQgaGVhZGVycyBvdGhlcndpc2Ugbm90IHZpc2libGUuCi1Db2xvckRlbGVnYXRvci5weSAjIENvbG9yaXplIHRleHQgKG5pbSkuCi1EZWJ1Z2dlci5weSAgICAgICAjIERlYnVnIGNvZGUgcnVuIGZyb20gZWRpdG9yOyBzaG93IHdpbmRvdy4KLURlbGVnYXRvci5weSAgICAgICMgRGVmaW5lIGJhc2UgY2xhc3MgZm9yIGRlbGVnYXRvcnMgKG5pbSkuCi1FZGl0b3JXaW5kb3cucHkgICAjIERlZmluZSBtb3N0IG9mIGVkaXRvciBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCi1GaWxlTGlzdC5weSAgICAgICAjIE9wZW4gZmlsZXMgYW5kIG1hbmFnZSBsaXN0IG9mIG9wZW4gd2luZG93cyAobmltKS4KLUZvcm1hdFBhcmFncmFwaC5weSMgUmUtd3JhcCBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgY29tbWVudHMuCi1HcmVwRGlhbG9nLnB5ICAgICAjIEZpbmQgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gaW4gbXVsdGlwbGUgZmlsZXMuCi1IeXBlclBhcnNlci5weSAgICAjIFBhcnNlIGNvZGUgYXJvdW5kIGEgZ2l2ZW4gaW5kZXguCi1JT0JpbmRpbmcucHkgICAgICAjIE9wZW4sIHJlYWQsIGFuZCB3cml0ZSBmaWxlcwotSWRsZUhpc3RvcnkucHkgICAgIyBHZXQgcHJldmlvdXMgb3IgbmV4dCB1c2VyIGlucHV0IGluIHNoZWxsIChuaW0pCi1NdWx0aUNhbGwucHkgICAgICAjIFdyYXAgdGsgd2lkZ2V0IHRvIGFsbG93IG11bHRpcGxlIGNhbGxzIHBlciBldmVudCAobmltKS4KLU11bHRpU3RhdHVzQmFyLnB5ICMgRGVmaW5lIHN0YXR1cyBiYXIgZm9yIHdpbmRvd3MgKG5pbSkuCi1PYmplY3RCcm93c2VyLnB5ICAjIERlZmluZSBjbGFzcyB1c2VkIGluIFN0YWNrVmlld2VyIChuaW0pLgotT3V0cHV0V2luZG93LnB5ICAgIyBDcmVhdGUgd2luZG93IGZvciBncmVwIG91dHB1dC4KLVBhcmVuTWF0Y2gucHkgICAgICMgTWF0Y2ggZmVuY2Vwb3N0czogKCksIFtdLCBhbmQge30uCi1QYXRoQnJvd3Nlci5weSAgICAjIENyZWF0ZSBwYXRoIGJyb3dzZXIgd2luZG93LgotUGVyY29sYXRvci5weSAgICAgIyBNYW5hZ2UgZGVsZWdhdG9yIHN0YWNrIChuaW0pLgotUHlQYXJzZS5weSAgICAgICAgIyBHaXZlIGluZm9ybWF0aW9uIG9uIGNvZGUgaW5kZW50YXRpb24KLVB5U2hlbGwucHkgICAgICAgICMgU3RhcnQgSURMRSwgbWFuYWdlIHNoZWxsLCBjb21wbGV0ZSBlZGl0b3Igd2luZG93Ci1SZW1vdGVEZWJ1Z2dlci5weSAjIERlYnVnIGNvZGUgcnVuIGluIHJlbW90ZSBwcm9jZXNzLgotUmVtb3RlT2JqZWN0QnJvd3Nlci5weSAjIENvbW11bmljYXRlIG9iamVjdHMgYmV0d2VlbiBwcm9jZXNzZXMgd2l0aCBycGMgKG5pbSkuCi1SZXBsYWNlRGlhbG9nLnB5ICAjIFNlYXJjaCBhbmQgcmVwbGFjZSBwYXR0ZXJuIGluIHRleHQuCi1Sc3RyaXBFeHRlbnNpb24ucHkjIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UKLVNjcmlwdEJpbmRpbmcucHkgICMgQ2hlY2sgYW5kIHJ1biB1c2VyIGNvZGUuCi1TY3JvbGxlZExpc3QucHkgICAjIERlZmluZSBTY3JvbGxlZExpc3Qgd2lkZ2V0IGZvciBJRExFIChuaW0pLgotU2VhcmNoRGlhbG9nLnB5ICAgIyBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gdGV4dC4KLVNlYXJjaERpYWxvZ0Jhc2UucHkgICMgRGVmaW5lIGJhc2UgZm9yIHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXAgZGlhbG9ncy4KLVNlYXJjaEVuZ2luZS5weSAgICMgRGVmaW5lIGVuZ2luZSBmb3IgYWxsIDMgc2VhcmNoIGRpYWxvZ3MuCi1TdGFja1ZpZXdlci5weSAgICAjIFZpZXcgc3RhY2sgYWZ0ZXIgZXhjZXB0aW9uLgotVHJlZVdpZGdldC5weSAgICAgIyBEZWZpbmUgdHJlZSB3aWRnZXIsIHVzZWQgaW4gYnJvd3NlcnMgKG5pbSkuCi1VbmRvRGVsZWdhdG9yLnB5ICAjIE1hbmFnZSB1bmRvIHN0YWNrLgotV2lkZ2V0UmVkaXJlY3Rvci5weSAjIEludGVyY2VwdCB3aWRnZXQgc3ViY29tbWFuZHMgKGZvciBwZXJjb2xhdG9yKSAobmltKS4KLVdpbmRvd0xpc3QucHkgICAgICMgTWFuYWdlIHdpbmRvdyBsaXN0IGFuZCBkZWZpbmUgbGlzdGVkIHRvcCBsZXZlbC4KLVpvb21IZWlnaHQucHkgICAgICMgWm9vbSB3aW5kb3cgdG8gZnVsbCBoZWlnaHQgb2Ygc2NyZWVuLgotYWJvdXREaWFsb2cucHkgICAgIyBEaXNwbGF5IEFib3V0IElETEUgZGlhbG9nLgotY29uZmlnRGlhbG9nLnB5ICAgIyBEaXNwbGF5IHVzZXIgY29uZmlndXJhdGlvbiBkaWFsb2dzLgotY29uZmlnSGFuZGxlci5weSAgIyBMb2FkLCBmZXRjaCwgYW5kIHNhdmUgY29uZmlndXJhdGlvbiAobmltKS4KLWNvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5ICAjIFNwZWNpZnkgaGVscCBzb3VyY2UuCi1jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAgIyBTcGVmaWZ5IHVzZXIgY29uZmlnIHNlY3Rpb24gbmFtZQotZHluT3B0aW9uTWVudVdpZGdldC5weSAgIyBkZWZpbmUgbXV0YWJsZSBPcHRpb25NZW51IHdpZGdldCAobmltKS4KK2F1dG9jb21wbGV0ZS5weSAgICMgQ29tcGxldGUgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGVuYW1lcy4KK2F1dG9jb21wbGV0ZV93LnB5ICMgRGlzcGxheSBjb21wbGV0aW9ucy4KK2F1dG9leHBhbmQucHkgICAgICMgRXhwYW5kIHdvcmQgd2l0aCBwcmV2aW91cyB3b3JkIGluIGZpbGUuCiticm93c2VyLnB5ICAgICAgICAjIENyZWF0ZSBtb2R1bGUgYnJvd3NlciB3aW5kb3cuCitjYWxsdGlwX3cucHkgICAgICAjIERpc3BsYXkgY2FsbHRpcC4KK2NhbGx0aXBzLnB5ICAgICAgICMgQ3JlYXRlIGNhbGx0aXAgdGV4dC4KK2NvZGVjb250ZXh0LnB5ICAgICMgU2hvdyBjb21wb3VuZCBzdGF0ZW1lbnQgaGVhZGVycyBvdGhlcndpc2Ugbm90IHZpc2libGUuCitjb2xvcml6ZXIucHkgICAgICAjIENvbG9yaXplIHRleHQgKG5pbSkKK2NvbmZpZy5weSAgICAgICAgICMgTG9hZCwgZmV0Y2gsIGFuZCBzYXZlIGNvbmZpZ3VyYXRpb24gKG5pbSkuCitjb25maWdkaWFsb2cucHkgICAjIERpc3BsYXkgdXNlciBjb25maWd1cmF0aW9uIGRpYWxvZ3MuCitjb25maWdfaGVscC5weSAgICAjIFNwZWNpZnkgaGVscCBzb3VyY2UgaW4gY29uZmlnZGlhbG9nLgorY29uZmlnX2tleS5weSAgICAgIyBDaGFuZ2Uga2V5YmluZGluZ3MuCitkeW5vcHRpb24ucHkgICAgICAjIERlZmluZSBtdXRhYmxlIE9wdGlvbk1lbnUgd2lkZ2V0IChuaW0pLgorZGVidWdvYmoucHkgICAgICAgIyBEZWZpbmUgY2xhc3MgdXNlZCBpbiBzdGFja3ZpZXdlci4KK2RlYnVnb2JqX3IucHkgICAgICMgQ29tbXVuaWNhdGUgb2JqZWN0cyBiZXR3ZWVuIHByb2Nlc3NlcyB3aXRoIHJwYyAobmltKS4KK2RlYnVnZ2VyLnB5ICAgICAgICMgRGVidWcgY29kZSBydW4gZnJvbSBzaGVsbCBvciBlZGl0b3I7IHNob3cgd2luZG93LgorZGVidWdnZXJfci5weSAgICAgIyBEZWJ1ZyBjb2RlIHJ1biBpbiByZW1vdGUgcHJvY2Vzcy4KK2RlbGVnYXRvci5weSAgICAgICMgRGVmaW5lIGJhc2UgY2xhc3MgZm9yIGRlbGVnYXRvcnMgKG5pbSkuCitlZGl0b3IucHkgICAgICAgICAjIERlZmluZSBtb3N0IG9mIGVkaXRvciBhbmQgdXRpbGl0eSBmdW5jdGlvbnMuCitmaWxlbGlzdC5weSAgICAgICAjIE9wZW4gZmlsZXMgYW5kIG1hbmFnZSBsaXN0IG9mIG9wZW4gd2luZG93cyAobmltKS4KK2dyZXAucHkgICAgICAgICAgICMgRmluZCBhbGwgb2NjdXJyZW5jZXMgb2YgcGF0dGVybiBpbiBtdWx0aXBsZSBmaWxlcy4KIGhlbHAucHkgICAgICAgICAgICMgRGlzcGxheSBJRExFJ3MgaHRtbCBkb2MuCi1rZXliaW5kaW5nRGlhbG9nLnB5ICAjIENoYW5nZSBrZXliaW5kaW5ncy4KLW1hY29zeFN1cHBvcnQucHkgICMgSGVscCBJRExFIHJ1biBvbiBNYWNzIChuaW0pLgoraGVscF9hYm91dC5weSAgICAgIyBEaXNwbGF5IEFib3V0IElETEUgZGlhbG9nLgoraGlzdG9yeS5weSAgICAgICAgIyBHZXQgcHJldmlvdXMgb3IgbmV4dCB1c2VyIGlucHV0IGluIHNoZWxsIChuaW0pCitoeXBlcnBhcnNlci5weSAgICAjIFBhcnNlIGNvZGUgYXJvdW5kIGEgZ2l2ZW4gaW5kZXguCitpb21lbnUucHkgICAgICAgICAjIE9wZW4sIHJlYWQsIGFuZCB3cml0ZSBmaWxlcworbWFjb3N4LnB5ICAgICAgICAgIyBIZWxwIElETEUgcnVuIG9uIE1hY3MgKG5pbSkuCittYWlubWVudS5weSAgICAgICAjIERlZmluZSBtb3N0IG9mIElETEUgbWVudS4KK211bHRpY2FsbC5weSAgICAgICMgV3JhcCB0ayB3aWRnZXQgdG8gYWxsb3cgbXVsdGlwbGUgY2FsbHMgcGVyIGV2ZW50IChuaW0pLgorb3V0d2luLnB5ICAgICAgICAgIyBDcmVhdGUgd2luZG93IGZvciBncmVwIG91dHB1dC4KK3BhcmFncmFwaC5weSAgICAgICMgUmUtd3JhcCBtdWx0aWxpbmUgc3RyaW5ncyBhbmQgY29tbWVudHMuCitwYXJlbm1hdGNoLnB5ICAgICAjIE1hdGNoIGZlbmNlcG9zdHM6ICgpLCBbXSwgYW5kIHt9LgorcGF0aGJyb3dzZXIucHkgICAgIyBDcmVhdGUgcGF0aCBicm93c2VyIHdpbmRvdy4KK3BlcmNvbGF0b3IucHkgICAgICMgTWFuYWdlIGRlbGVnYXRvciBzdGFjayAobmltKS4KK3B5cGFyc2UucHkgICAgICAgICMgR2l2ZSBpbmZvcm1hdGlvbiBvbiBjb2RlIGluZGVudGF0aW9uCitweXNoZWxsLnB5ICAgICAgICAjIFN0YXJ0IElETEUsIG1hbmFnZSBzaGVsbCwgY29tcGxldGUgZWRpdG9yIHdpbmRvdworcXVlcnkucHkgICAgICAgICAgIyBRdWVyeSB1c2VyIGZvciBpbmZvcm10aW9uCityZWRpcmVjdG9yLnB5ICAgICAjIEludGVyY2VwdCB3aWRnZXQgc3ViY29tbWFuZHMgKGZvciBwZXJjb2xhdG9yKSAobmltKS4KK3JlcGxhY2UucHkgICAgICAgICMgU2VhcmNoIGFuZCByZXBsYWNlIHBhdHRlcm4gaW4gdGV4dC4KIHJwYy5weSAgICAgICAgICAgICMgQ29tbXVpY2F0ZSBiZXR3ZWVuIGlkbGUgYW5kIHVzZXIgcHJvY2Vzc2VzIChuaW0pLgorcnN0cmlwLnB5ICAgICAgICAgIyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlLgogcnVuLnB5ICAgICAgICAgICAgIyBNYW5hZ2UgdXNlciBjb2RlIGV4ZWN1dGlvbiBzdWJwcm9jZXNzLgorcnVuc2NyaXB0LnB5ICAgICAgIyBDaGVjayBhbmQgcnVuIHVzZXIgY29kZS4KK3Njcm9sbGVkbGlzdC5weSAgICMgRGVmaW5lIHNjcm9sbGVkbGlzdCB3aWRnZXQgZm9yIElETEUgKG5pbSkuCitzZWFyY2gucHkgICAgICAgICAjIFNlYXJjaCBmb3IgcGF0dGVybiBpbiB0ZXh0Lgorc2VhcmNoYmFzZS5weSAgICAgIyBEZWZpbmUgYmFzZSBmb3Igc2VhcmNoLCByZXBsYWNlLCBhbmQgZ3JlcCBkaWFsb2dzLgorc2VhcmNoZW5naW5lLnB5ICAgIyBEZWZpbmUgZW5naW5lIGZvciBhbGwgMyBzZWFyY2ggZGlhbG9ncy4KK3N0YWNrdmlld2VyLnB5ICAgICMgVmlldyBzdGFjayBhZnRlciBleGNlcHRpb24uCitzdGF0dXNiYXIucHkgICAgICAjIERlZmluZSBzdGF0dXMgYmFyIGZvciB3aW5kb3dzIChuaW0pLgogdGFiYmVkcGFnZXMucHkgICAgIyBEZWZpbmUgdGFiYmVkIHBhZ2VzIHdpZGdldCAobmltKS4KLXRleHRWaWV3LnB5ICAgICAgICMgRGVmaW5lIHJlYWQtb25seSB0ZXh0IHdpZGdldCAobmltKS4KK3RleHR2aWV3LnB5ICAgICAgICMgRGVmaW5lIHJlYWQtb25seSB0ZXh0IHdpZGdldCAobmltKS4KK3RyZWUucHkgICAgICAgICAgICMgRGVmaW5lIHRyZWUgd2lkZ2VyLCB1c2VkIGluIGJyb3dzZXJzIChuaW0pLgordW5kby5weSAgICAgICAgICAgIyBNYW5hZ2UgdW5kbyBzdGFjay4KK3dpbmRvd3MucHkgICAgICAgICMgTWFuYWdlIHdpbmRvdyBsaXN0IGFuZCBkZWZpbmUgbGlzdGVkIHRvcCBsZXZlbC4KK3pvb21oZWlnaHQucHkgICAgICMgWm9vbSB3aW5kb3cgdG8gZnVsbCBoZWlnaHQgb2Ygc2NyZWVuLgogCiBDb25maWd1cmF0aW9uCiAtLS0tLS0tLS0tLS0tCkBAIC0xMDQsMTI2ICsxMDQsMTI4IEBACiAKIFN1YmRpcmVjdG9yaWVzCiAtLS0tLS0tLS0tLS0tLQotSWNvbnMgICMgc21hbGwgaW1hZ2UgZmlsZXMKLWlkbGVfdGVzdCAgIyBmaWxlcyBmb3IgaHVtYW4gdGVzdCBhbmQgYXV0b21hdGVkIHVuaXQgdGVzdHMKK0ljb25zICAgICAgICAjIHNtYWxsIGltYWdlIGZpbGVzCitpZGxlX3Rlc3QgICAgIyBmaWxlcyBmb3IgaHVtYW4gdGVzdCBhbmQgYXV0b21hdGVkIHVuaXQgdGVzdHMKIAogVW51c2VkIGFuZCBEZXByZWNhdGVkIGZpbGVzIGFuZCBvYmplY3RzIChuaW0pCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVkaXRvcldpbmRvdy5weTogSGVscGRpYWxvZyBhbmQgaGVscERpYWxvZwotVG9vbFRpcC5weTogdW51c2VkLgotaGVscC50eHQKLWlkbGV2ZXIucHkKK3Rvb2x0aXAucHkgIyB1bnVzZWQKKwogCiAKIElETEUgTUVOVVMKLVRvcCBsZXZlbCBpdGVtcyBhbmQgbW9zdCBzdWJtZW51IGl0ZW1zIGFyZSBkZWZpbmVkIGluIEJpbmRpbmdzLgorVG9wIGxldmVsIGl0ZW1zIGFuZCBtb3N0IHN1Ym1lbnUgaXRlbXMgYXJlIGRlZmluZWQgaW4gbWFpbm1lbnUuCiBFeHRlbnN0aW9ucyBhZGQgc3VibWVudSBpdGVtcyB3aGVuIGFjdGl2ZS4gIFRoZSBuYW1lcyBnaXZlbiBhcmUKIGZvdW5kLCBxdW90ZWQsIGluIG9uZSBvZiB0aGVzZSBtb2R1bGVzLCBwYWlyZWQgd2l0aCBhICc8PHBzZXVkb2V2ZW50Pj4nLgogRWFjaCBwc2V1ZG9ldmVudCBpcyBib3VuZCB0byBhbiBldmVudCBoYW5kbGVyLiAgU29tZSBldmVudCBoYW5kbGVycwogY2FsbCBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuICBUaGUgYW5ub3RhdGlvbnMgYmVsb3cKIGFyZSBpbnRlbmRlZCB0byBhdCBsZWFzdCBnaXZlIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGFjdHVhbCB3b3JrIGlzIGRvbmUuCisnZUVXJyA9IGVkaXRvci5FZGl0b3JXaW5kb3cKIAotRmlsZSAgIyBJT0JpbmRpZyBleGNlcHQgYXMgbm90ZWQKLSAgTmV3IEZpbGUKLSAgT3Blbi4uLiAgIyBJT0JpbmRpbmcub3BlbgotICBPcGVuIE1vZHVsZQorRmlsZQorICBOZXcgRmlsZSAgICAgICAgICMgZUVXLm5ld19jYWxsYmFjaworICBPcGVuLi4uICAgICAgICAgICMgaW9tZW51Lm9wZW4KKyAgT3BlbiBNb2R1bGUgICAgICAjIGVFdy5vcGVuX21vZHVsZQogICBSZWNlbnQgRmlsZXMKLSAgQ2xhc3MgQnJvd3NlciAgIyBDbGFzcyBCcm93c2VyCi0gIFBhdGggQnJvd3NlciAgIyBQYXRoIEJyb3dzZXIKKyAgQ2xhc3MgQnJvd3NlciAgICAjIGVFVy5vcGVuX2NsYXNzX2Jyb3dzZXIsIGJyb3dzZXIuQ2xhc3NCcm93c2VyCisgIFBhdGggQnJvd3NlciAgICAgIyBlRVcub3Blbl9wYXRoX2Jyb3dzZXIsIHBhdGhicm93c2VyCiAgIC0tLQotICBTYXZlICAjIElEQmluZGluZy5zYXZlCi0gIFNhdmUgQXMuLi4gICMgSU9CaW5kaW5nLnNhdmVfYXMKLSAgU2F2ZSBDb3B5IEFzLi4uICAjIElPQmluZGxpbmcuc2F2ZV9hX2NvcHkKKyAgU2F2ZSAgICAgICAgICAgICAjIGlvbWVudS5zYXZlCisgIFNhdmUgQXMuLi4gICAgICAgIyBpb21lbnUuc2F2ZV9hcworICBTYXZlIENvcHkgQXMuLi4gICMgaW9tZW51LnNhdmVfYV9jb3B5CiAgIC0tLQotICBQcmludCBXaW5kb3cgICMgSU9CaW5kaW5nLnByaW50X3dpbmRvdworICBQcmludCBXaW5kb3cgICAgICMgaW9tZW51LnByaW50X3dpbmRvdwogICAtLS0KLSAgQ2xvc2UKLSAgRXhpdAorICBDbG9zZSAgICAgICAgICAgICMgZUVXLmNsb3NlX2V2ZW50CisgIEV4aXQgICAgICAgICAgICAgIyBmbGlzdC5jbG9zZV9hbGxfY2FsbGJhY2sgKGJvdW5kIGluIGVFVykKIAogRWRpdAotICBVbmRvICAjIHVuZG9EZWxlZ2F0b3IKLSAgUmVkbyAgIyB1bmRvRGVsZWdhdG9yCi0gIC0tLQotICBDdXQKLSAgQ29weQotICBQYXN0ZQotICBTZWxlY3QgQWxsCi0gIC0tLSAgIyBOZXh0IDUgaXRlbXMgdXNlIFNlYXJjaEVuZ2luZTsgZGlhbG9ncyB1c2UgU2VhcmNoRGlhbG9nQmFzZQotICBGaW5kICAjIFNlYXJjaCBEaWFsb2cKLSAgRmluZCBBZ2FpbgotICBGaW5kIFNlbGVjdGlvbgotICBGaW5kIGluIEZpbGVzLi4uICAjIEdyZXBEaWFsb2cKLSAgUmVwbGFjZS4uLiAgIyBSZXBsYWNlRGlhbG9nCi0gIEdvIHRvIExpbmUKLSAgU2hvdyBDb21wbGV0aW9ucyAgIyBBdXRvQ29tcGxldGUgZXh0ZW5zaW9uIGFuZCBBdXRvQ29tcGxldGVXaWRvdyAoJkhQKQotICBFeHBhbmQgV29yZCAgIyBBdXRvRXhwYW5kIGV4dGVuc2lvbgotICBTaG93IGNhbGwgdGlwICAjIENhbGx0aXBzIGV4dGVuc2lvbiBhbmQgQ2FsbHRpcFdpbmRvdyAoJiBIeXBlcnBhcnNlcikKLSAgU2hvdyBzdXJyb3VuZGluZyBwYXJlbnMgICMgUGFyZW5NYXRjaCAoJiBIeXBlcnBhcnNlcikKKyAgVW5kbyAgICAgICAgICAgICAjIHVuZG9kZWxlZ2F0b3IKKyAgUmVkbyAgICAgICAgICAgICAjIHVuZG9kZWxlZ2F0b3IKKyAgLS0tICAgICAgICAgICAgICAjIGVFVy5yaWdodF9tZW51X2V2ZW50CisgIEN1dCAgICAgICAgICAgICAgIyBlRVcuY3V0CisgIENvcHkgICAgICAgICAgICAgIyBlRVcuY29weQorICBQYXN0ZSAgICAgICAgICAgICMgZUVXLnBhc3QKKyAgU2VsZWN0IEFsbCAgICAgICAjIGVFVy5zZWxlY3RfYWxsICgrIHNlZSBlRVcucmVtb3ZlX3NlbGVjdGlvbikKKyAgLS0tICAgICAgICAgICAgICAjIE5leHQgNSBpdGVtcyB1c2Ugc2VhcmNoZW5naW5lOyBkaWFsb2dzIHVzZSBzZWFyY2hiYXNlCisgIEZpbmQgICAgICAgICAgICAgIyBlRVcuZmluZF9ldmVudCwgc2VhcmNoLlNlYXJjaERpYWxvZy5maW5kCisgIEZpbmQgQWdhaW4gICAgICAgIyBlRVcuZmluZF9hZ2Fpbl9ldmVudCwgc1NELmZpbmRfYWdhaW4KKyAgRmluZCBTZWxlY3Rpb24gICAjIGVFVy5maW5kX3NlbGVjdGlvbl9ldmVudCwgc1NELmZpbmRfc2VsZWN0aW9uCisgIEZpbmQgaW4gRmlsZXMuLi4gIyBlRVcuZmluZF9pbl9maWxlc19ldmVudCwgZ3JlcAorICBSZXBsYWNlLi4uICAgICAgICMgZUVXLnJlcGxhY2VfZXZlbnQsIHJlcGxhY2UuUmVwbGFjZURpYWxvZy5yZXBsYWNlCisgIEdvIHRvIExpbmUgICAgICAgIyBlRVcuZ290b19saW5lX2V2ZW50CisgIFNob3cgQ29tcGxldGlvbnMgIyBhdXRvY29tcGxldGUgZXh0ZW5zaW9uIGFuZCBhdXRvY29tcGxldGVXaWRvdyAoJkhQKQorICBFeHBhbmQgV29yZCAgICAgICMgYXV0b2V4cGFuZCBleHRlbnNpb24KKyAgU2hvdyBjYWxsIHRpcCAgICAjIENhbGx0aXBzIGV4dGVuc2lvbiBhbmQgQ2FsbHRpcFdpbmRvdyAoJiBIeXBlcnBhcnNlcikKKyAgU2hvdyBzdXJyb3VuZGluZyBwYXJlbnMgICMgcGFyZW5tYXRjaCAoJiBIeXBlcnBhcnNlcikKIAotU2hlbGwgICMgUHlTaGVsbAotICBWaWV3IExhc3QgUmVzdGFydCAgIyBQeVNoZWxsLj8KLSAgUmVzdGFydCBTaGVsbCAgIyBQeVNoZWxsLj8KK1NoZWxsICAjIHB5c2hlbGwKKyAgVmlldyBMYXN0IFJlc3RhcnQjIHB5c2hlbGwuPworICBSZXN0YXJ0IFNoZWxsICAgICMgcHlzaGVsbC4/CiAKIERlYnVnIChTaGVsbCBvbmx5KQogICBHbyB0byBGaWxlL0xpbmUKLSAgRGVidWdnZXIgICMgRGVidWdnZXIsIFJlbW90ZURlYnVnZ2VyCi0gIFN0YWNrIFZpZXdlciAgIyBTdGFja1ZpZXdlcgotICBBdXRvLW9wZW4gU3RhY2sgVmlld2VyICAjIFN0YWNrVmlld2VyCisgIGRlYnVnZ2VyICAgICAgICAgIyBkZWJ1Z2dlciwgZGVidWdnZXJfcgorICBTdGFjayBWaWV3ZXIgICAgICMgc3RhY2t2aWV3ZXIKKyAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAgIyBzdGFja3ZpZXdlcgogCiBGb3JtYXQgKEVkaXRvciBvbmx5KQotICBJbmRlbnQgUmVnaW9uCi0gIERlZGVudCBSZWdpb24KLSAgQ29tbWVudCBPdXQgUmVnaW9uCi0gIFVuY29tbWVudCBSZWdpb24KLSAgVGFiaWZ5IFJlZ2lvbgotICBVbnRhYmlmeSBSZWdpb24KLSAgVG9nZ2xlIFRhYnMKLSAgTmV3IEluZGVudCBXaWR0aAotICBGb3JtYXQgUGFyYWdyYXBoICAjIEZvcm1hdFBhcmFncmFwaCBleHRlbnNpb24KKyAgSW5kZW50IFJlZ2lvbiAgICAjIGVFVy5pbmRlbnRfcmVnaW9uX2V2ZW50CisgIERlZGVudCBSZWdpb24gICAgIyBlRVcuZGVkZW50X3JlZ2lvbl9ldmVudAorICBDb21tZW50IE91dCBSZWcuICMgZUVXLmNvbW1lbnRfcmVnaW9uX2V2ZW50CisgIFVuY29tbWVudCBSZWdpb24gIyBlRVcudW5jb21tZW50X3JlZ2lvbl9ldmVudAorICBUYWJpZnkgUmVnaW9uICAgICMgZUVXLnRhYmlmeV9yZWdpb25fZXZlbnQKKyAgVW50YWJpZnkgUmVnaW9uICAjIGVFVy51bnRhYmlmeV9yZWdpb25fZXZlbnQKKyAgVG9nZ2xlIFRhYnMgICAgICAjIGVFVy50b2dnbGVfdGFic19ldmVudAorICBOZXcgSW5kZW50IFdpZHRoICMgZUVXLmNoYW5nZV9pbmRlbnR3aWR0aF9ldmVudAorICBGb3JtYXQgUGFyYWdyYXBoICMgcGFyYWdyYXBoIGV4dGVuc2lvbgogICAtLS0KLSAgU3RyaXAgdGFpbGluZyB3aGl0ZXNwYWNlICAjIFJzdHJpcEV4dGVuc2lvbiBleHRlbnNpb24KKyAgU3RyaXAgdGFpbGluZyB3aGl0ZXNwYWNlICAjIHJzdHJpcCBleHRlbnNpb24KIAogUnVuIChFZGl0b3Igb25seSkKLSAgUHl0aG9uIFNoZWxsICAjIFB5U2hlbGwKKyAgUHl0aG9uIFNoZWxsICAgICAjIHB5c2hlbGwKICAgLS0tCi0gIENoZWNrIE1vZHVsZSAgIyBTY3JpcHRCaW5kaW5nCi0gIFJ1biBNb2R1bGUgICMgU2NyaXB0QmluZGluZworICBDaGVjayBNb2R1bGUgICAgICMgcnVuc2NyaXB0CisgIFJ1biBNb2R1bGUgICAgICAgIyBydW5zY3JpcHQKIAogT3B0aW9ucwotICBDb25maWd1cmUgSURMRSAgIyBjb25maWdEaWFsb2cKKyAgQ29uZmlndXJlIElETEUgICAjIGVFVy5jb25maWdfZGlhbG9nLCBjb25maWdkaWFsb2cKICAgICAodGFicyBpbiB0aGUgZGlhbG9nKQotICAgIEZvbnQgdGFiICAjIG9uZmlnLW1haW4uZGVmCi0gICAgSGlnaGxpZ2h0IHRhYiAgIyBjb25maWdTZWN0aW9uTmFtZURpYWxvZywgY29uZmlnLWhpZ2hsaWdodC5kZWYKLSAgICBLZXlzIHRhYiAgIyBrZXliaW5kaW5nRGlhbG9nLCBjb25maWdTZWN0aW9uTmFtZURpYWxvZywgb25maWcta2V1cy5kZWYKLSAgICBHZW5lcmFsIHRhYiAgIyBjb25maWdIZWxwU291cmNlRWRpdCwgY29uZmlnLW1haW4uZGVmCi0gIENvbmZpZ3VyZSBFeHRlbnNpb25zICAjIGNvbmZpZ0RpYWxvZwotICAgIFh5eiB0YWIgICMgeHl6LnB5LCBjb25maWctZXh0ZW5zaW9ucy5kZWYKKyAgICBGb250IHRhYiAgICAgICAjIGNvbmZpZy1tYWluLmRlZgorICAgIEhpZ2hsaWdodCB0YWIgICMgcXVlcnksIGNvbmZpZy1oaWdobGlnaHQuZGVmCisgICAgS2V5cyB0YWIgICAgICAgIyBxdWVyeSwgY29uZmlnX2tleSwgY29uZmlnX2tleXMuZGVmCisgICAgR2VuZXJhbCB0YWIgICAgIyBjb25maWdfaGVscCwgY29uZmlnLW1haW4uZGVmCisgICAgRXh0ZW5zaW9ucyB0YWIgIyBjb25maWctZXh0ZW5zaW9ucy5kZWYsIGNvcnJlc3BvbmRpbmcgLnB5CiAgIC0tLQotICBDb2RlIENvbnRleHQgKGVkaXRvciBvbmx5KSAgIyBDb2RlQ29udGV4dCBleHRlbnNpb24KKyAgQ29kZSBDb250ZXh0IChlZCkjIGNvZGVjb250ZXh0IGV4dGVuc2lvbgogCiBXaW5kb3cKLSAgWm9vbWhlaWdodCAgIyBab29tSGVpZ2h0IGV4dGVuc2lvbgorICBab29taGVpZ2h0ICAgICAgICMgem9vbWhlaWdodCBleHRlbnNpb24KICAgLS0tCi0gIDxvcGVuIHdpbmRvd3M+ICAjIFdpbmRvd0xpc3QKKyAgPG9wZW4gd2luZG93cz4gICAjIHdpbmRvd3MKIAogSGVscAotICBBYm91dCBJRExFICAjIGFib3V0RGlhbG9nCisgIEFib3V0IElETEUgICAgICAgIyBlRVcuYWJvdXRfZGlhbG9nLCBoZWxwX2Fib3V0LkFib3V0RGlhbG9nIAogICAtLS0KLSAgSURMRSBIZWxwICAjIGhlbHAKLSAgUHl0aG9uIERvYwotICBUdXJ0bGUgRGVtbworICBJRExFIEhlbHAgICAgICAgICMgZUVXLmhlbHBfZGlhbG9nLCBoZWxwc2hvd19pZGxlaGVscAorICBQeXRob24gRG9jICAgICAgICMgZUVXLnB5dGhvbl9kb2NzCisgIFR1cnRsZSBEZW1vICAgICAgIyBlRVcub3Blbl90dXJ0bGVfZGVtbwogICAtLS0KICAgPG90aGVyIGhlbHAgc291cmNlcz4KIAogPENvbnRleHQgTWVudT4gKHJpZ2h0IGNsaWNrKQotRGVmaW5lZCBpbiBFZGl0b3JXaW5kb3csIFB5U2hlbGwsIE91dHB1dAotICAgQ3V0Ci0gICBDb3B5Ci0gICBQYXN0ZQotICAgLS0tCi0gICBHbyB0byBmaWxlL2xpbmUgKHNoZWxsIGFuZCBvdXRwdXQgb25seSkKLSAgIFNldCBCcmVha3BvaW50IChlZGl0b3Igb25seSkKLSAgIENsZWFyIEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQotIERlZmluZWQgaW4gRGVidWdnZXIKLSAgIEdvIHRvIHNvdXJjZSBsaW5lCi0gICBTaG93IHN0YWNrIGZyYW1lCisgIERlZmluZWQgaW4gZWRpdG9yLCBQeVNoZWxweXNoZWxsdXQKKyAgICBDdXQKKyAgICBDb3B5CisgICAgUGFzdGUKKyAgICAtLS0KKyAgICBHbyB0byBmaWxlL2xpbmUgKHNoZWxsIGFuZCBvdXRwdXQgb25seSkKKyAgICBTZXQgQnJlYWtwb2ludCAoZWRpdG9yIG9ubHkpCisgICAgQ2xlYXIgQnJlYWtwb2ludCAoZWRpdG9yIG9ubHkpCisgIERlZmluZWQgaW4gZGVidWdnZXIKKyAgICBHbyB0byBzb3VyY2UgbGluZQorICAgIFNob3cgc3RhY2sgZnJhbWUKKworPE5vIG1lbnU+CitDZW50ZXIgSW5zZXJ0ICAgICAgIyBlRVcuY2VudGVyX2luc2VydF9ldmVudAorICAgCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9fX2luaXRfXy5weSBiL0xpYi9pZGxlbGliL19faW5pdF9fLnB5CmluZGV4IDcxMWY2MWIuLjc5MWRkZWEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL19faW5pdF9fLnB5CisrKyBiL0xpYi9pZGxlbGliL19faW5pdF9fLnB5CkBAIC0xLDggKzEsMTAgQEAKICIiIlRoZSBpZGxlbGliIHBhY2thZ2UgaW1wbGVtZW50cyB0aGUgSWRsZSBhcHBsaWNhdGlvbi4KIAogSWRsZSBpbmNsdWRlcyBhbiBpbnRlcmFjdGl2ZSBzaGVsbCBhbmQgZWRpdG9yLgorU3RhcnRpbmcgd2l0aCBQeXRob24gMy42LCBJRExFIHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgbGF0ZXIuCiBVc2UgdGhlIGZpbGVzIG5hbWVkIGlkbGUuKiB0byBzdGFydCBJZGxlLgogCiBUaGUgb3RoZXIgZmlsZXMgYXJlIHByaXZhdGUgaW1wbGVtZW50YXRpb25zLiAgVGhlaXIgZGV0YWlscyBhcmUgc3ViamVjdCB0bwogY2hhbmdlLiAgU2VlIFBFUCA0MzQgZm9yIG1vcmUuICBJbXBvcnQgdGhlbSBhdCB5b3VyIG93biByaXNrLgogIiIiCit0ZXN0aW5nID0gRmFsc2UgICMgU2V0IFRydWUgYnkgdGVzdC50ZXN0X2lkbGUuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9fX21haW5fXy5weSBiL0xpYi9pZGxlbGliL19fbWFpbl9fLnB5CmluZGV4IDJlZGY1ZjcuLjYzNDllYzcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL19fbWFpbl9fLnB5CisrKyBiL0xpYi9pZGxlbGliL19fbWFpbl9fLnB5CkBAIC0zLDYgKzMsNiBAQAogCiBSdW4gSURMRSBhcyBweXRob24gLW0gaWRsZWxpYgogIiIiCi1pbXBvcnQgaWRsZWxpYi5QeVNoZWxsCi1pZGxlbGliLlB5U2hlbGwubWFpbigpCitpbXBvcnQgaWRsZWxpYi5weXNoZWxsCitpZGxlbGliLnB5c2hlbGwubWFpbigpCiAjIFRoaXMgZmlsZSBkb2VzIG5vdCB3b3JrIGZvciAyLjc7IFNlZSBpc3N1ZSAyNDIxMi4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZS5weSBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZS5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2F1dG9jb21wbGV0ZS5weQppbmRleCBmZjA4NWQ1Li41YmE4ZGM1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkKKysrIGIvTGliL2lkbGVsaWIvYXV0b2NvbXBsZXRlLnB5CkBAIC0xLDQgKzEsNCBAQAotIiIiQXV0b0NvbXBsZXRlLnB5IC0gQW4gSURMRSBleHRlbnNpb24gZm9yIGF1dG9tYXRpY2FsbHkgY29tcGxldGluZyBuYW1lcy4KKyIiImF1dG9jb21wbGV0ZS5weSAtIEFuIElETEUgZXh0ZW5zaW9uIGZvciBhdXRvbWF0aWNhbGx5IGNvbXBsZXRpbmcgbmFtZXMuCiAKIFRoaXMgZXh0ZW5zaW9uIGNhbiBjb21wbGV0ZSBlaXRoZXIgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGUgbmFtZXMuIEl0IGNhbiBwb3AKIGEgd2luZG93IHdpdGggYWxsIGF2YWlsYWJsZSBuYW1lcywgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCBmcm9tLgpAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiAjIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyCiBJRF9DSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgpAQCAtMTUsOCArMTUsOCBAQAogIyBUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBsZXRpb25zCiBDT01QTEVURV9BVFRSSUJVVEVTLCBDT01QTEVURV9GSUxFUyA9IHJhbmdlKDEsIDIrMSkKIAotZnJvbSBpZGxlbGliIGltcG9ydCBBdXRvQ29tcGxldGVXaW5kb3cKLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgYXV0b2NvbXBsZXRlX3cKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKIAogaW1wb3J0IF9fbWFpbl9fCiAKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gTm9uZQogCiAgICAgZGVmIF9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coc2VsZik6Ci0gICAgICAgIHJldHVybiBBdXRvQ29tcGxldGVXaW5kb3cuQXV0b0NvbXBsZXRlV2luZG93KHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuIGF1dG9jb21wbGV0ZV93LkF1dG9Db21wbGV0ZVdpbmRvdyhzZWxmLnRleHQpCiAKICAgICBkZWYgX3JlbW92ZV9hdXRvY29tcGxldGVfd2luZG93KHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBpZiBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdzoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYXV0b2NvbXBsZXRlX3cucHkKaW5kZXggMmVlNjg3OC4uMzhmODYwMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CkBAIC0xLDkgKzEsMTAgQEAKICIiIgotQW4gYXV0by1jb21wbGV0aW9uIHdpbmRvdyBmb3IgSURMRSwgdXNlZCBieSB0aGUgQXV0b0NvbXBsZXRlIGV4dGVuc2lvbgorQW4gYXV0by1jb21wbGV0aW9uIHdpbmRvdyBmb3IgSURMRSwgdXNlZCBieSB0aGUgYXV0b2NvbXBsZXRlIGV4dGVuc2lvbgogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE1DX1NISUZUCi1mcm9tIGlkbGVsaWIuQXV0b0NvbXBsZXRlIGltcG9ydCBDT01QTEVURV9GSUxFUywgQ09NUExFVEVfQVRUUklCVVRFUworZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIGlkbGVsaWIubXVsdGljYWxsIGltcG9ydCBNQ19TSElGVAorZnJvbSBpZGxlbGliLmF1dG9jb21wbGV0ZSBpbXBvcnQgQ09NUExFVEVfRklMRVMsIENPTVBMRVRFX0FUVFJJQlVURVMKIAogSElERV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxhdXRvY29tcGxldGV3aW5kb3ctaGlkZT4+IgogSElERV9TRVFVRU5DRVMgPSAoIjxGb2N1c091dD4iLCAiPEJ1dHRvblByZXNzPiIpCkBAIC0zNCw4ICszNSw4IEBACiAgICAgICAgIHNlbGYuY29tcGxldGlvbnMgPSBOb25lCiAgICAgICAgICMgQSBsaXN0IHdpdGggbW9yZSBjb21wbGV0aW9ucywgb3IgTm9uZQogICAgICAgICBzZWxmLm1vcmVjb21wbGV0aW9ucyA9IE5vbmUKLSAgICAgICAgIyBUaGUgY29tcGxldGlvbiBtb2RlLiBFaXRoZXIgQXV0b0NvbXBsZXRlLkNPTVBMRVRFX0FUVFJJQlVURVMgb3IKLSAgICAgICAgIyBBdXRvQ29tcGxldGUuQ09NUExFVEVfRklMRVMKKyAgICAgICAgIyBUaGUgY29tcGxldGlvbiBtb2RlLiBFaXRoZXIgYXV0b2NvbXBsZXRlLkNPTVBMRVRFX0FUVFJJQlVURVMgb3IKKyAgICAgICAgIyBhdXRvY29tcGxldGUuQ09NUExFVEVfRklMRVMKICAgICAgICAgc2VsZi5tb2RlID0gTm9uZQogICAgICAgICAjIFRoZSBjdXJyZW50IGNvbXBsZXRpb24gc3RhcnQsIG9uIHRoZSB0ZXh0IGJveCAoYSBzdHJpbmcpCiAgICAgICAgIHNlbGYuc3RhcnQgPSBOb25lCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvRXhwYW5kLnB5IGIvTGliL2lkbGVsaWIvYXV0b2V4cGFuZC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvYXV0b2V4cGFuZC5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5IGIvTGliL2lkbGVsaWIvYnJvd3Nlci5weQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2Jyb3dzZXIucHkKaW5kZXggZDA5YzUyZi4uOTk2ODMzMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2Jyb3dzZXIucHkKQEAgLTE0LDEzICsxNCwxMyBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHB5Y2xicgogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKLWZyb20gaWRsZWxpYi5XaW5kb3dMaXN0IGltcG9ydCBMaXN0ZWRUb3BsZXZlbAotZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVOb2RlLCBUcmVlSXRlbSwgU2Nyb2xsZWRDYW52YXMKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCitmcm9tIGlkbGVsaWIud2luZG93cyBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiBmaWxlX29wZW4gPSBOb25lICAjIE1ldGhvZC4uLkl0ZW0gYW5kIENsYXNzLi4uSXRlbSB1c2UgdGhpcy4KLSMgTm9ybWFsbHkgUHlTaGVsbC5mbGlzdC5vcGVuLCBidXQgdGhlcmUgaXMgbm8gUHlTaGVsbC5mbGlzdCBmb3IgaHRlc3QuCisjIE5vcm1hbGx5IHB5c2hlbGwuZmxpc3Qub3BlbiwgYnV0IHRoZXJlIGlzIG5vIHB5c2hlbGwuZmxpc3QgZm9yIGh0ZXN0LgogCiBjbGFzcyBDbGFzc0Jyb3dzZXI6CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgIiIiCiAgICAgICAgIGdsb2JhbCBmaWxlX29wZW4KICAgICAgICAgaWYgbm90IF9odGVzdDoKLSAgICAgICAgICAgIGZpbGVfb3BlbiA9IFB5U2hlbGwuZmxpc3Qub3BlbgorICAgICAgICAgICAgZmlsZV9vcGVuID0gcHlzaGVsbC5mbGlzdC5vcGVuCiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICAgc2VsZi5maWxlID0gb3MucGF0aC5qb2luKHBhdGhbMF0sIHNlbGYubmFtZSArICIucHkiKQogICAgICAgICBzZWxmLl9odGVzdCA9IF9odGVzdApAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGUpOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIFB5U2hlbGwuZmxpc3Qub3BlbihzZWxmLmZpbGUpCisgICAgICAgIHB5c2hlbGwuZmxpc3Qub3BlbihzZWxmLmZpbGUpCiAKICAgICBkZWYgSXNFeHBhbmRhYmxlKHNlbGYpOgogICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZShzZWxmLmZpbGVbLTM6XSkgPT0gIi5weSIKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgICAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzBdCiAgICAgZGlyLCBmaWxlID0gb3MucGF0aC5zcGxpdChmaWxlKQogICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpWzBdCi0gICAgZmxpc3QgPSBQeVNoZWxsLlB5U2hlbGxGaWxlTGlzdChwYXJlbnQpCisgICAgZmxpc3QgPSBweXNoZWxsLlB5U2hlbGxGaWxlTGlzdChwYXJlbnQpCiAgICAgZ2xvYmFsIGZpbGVfb3BlbgogICAgIGZpbGVfb3BlbiA9IGZsaXN0Lm9wZW4KICAgICBDbGFzc0Jyb3dzZXIoZmxpc3QsIG5hbWUsIFtkaXJdLCBfaHRlc3Q9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9jYWxsdGlwX3cucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY2FsbHRpcF93LnB5CmluZGV4IDhlNjhhNzYuLjlmNmNkYzEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvY2FsbHRpcF93LnB5CkBAIC0xLDcgKzEsNyBAQAogIiIiQSBDYWxsVGlwIHdpbmRvdyBjbGFzcyBmb3IgVGtpbnRlci9JRExFLgogCi1BZnRlciBUb29sVGlwLnB5LCB3aGljaCB1c2VzIGlkZWFzIGdsZWFuZWQgZnJvbSBQeVNvbAotVXNlZCBieSB0aGUgQ2FsbFRpcHMgSURMRSBleHRlbnNpb24uCitBZnRlciB0b29sdGlwLnB5LCB3aGljaCB1c2VzIGlkZWFzIGdsZWFuZWQgZnJvbSBQeVNvbAorVXNlZCBieSB0aGUgY2FsbHRpcHMgSURMRSBleHRlbnNpb24uCiAiIiIKIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIExhYmVsLCBMRUZULCBTT0xJRCwgVGNsRXJyb3IKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkgYi9MaWIvaWRsZWxpYi9jYWxsdGlwcy5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9DYWxsVGlwcy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY2FsbHRpcHMucHkKaW5kZXggODFiZDVmMS4uM2E5YjFjNiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvY2FsbHRpcHMucHkKQEAgLTEsNCArMSw0IEBACi0iIiJDYWxsVGlwcy5weSAtIEFuIElETEUgRXh0ZW5zaW9uIHRvIEpvZyBZb3VyIE1lbW9yeQorIiIiY2FsbHRpcHMucHkgLSBBbiBJRExFIEV4dGVuc2lvbiB0byBKb2cgWW91ciBNZW1vcnkKIAogQ2FsbCBUaXBzIGFyZSBmbG9hdGluZyB3aW5kb3dzIHdoaWNoIGRpc3BsYXkgZnVuY3Rpb24sIGNsYXNzLCBhbmQgbWV0aG9kCiBwYXJhbWV0ZXIgYW5kIGRvY3N0cmluZyBpbmZvcm1hdGlvbiB3aGVuIHlvdSB0eXBlIGFuIG9wZW5pbmcgcGFyZW50aGVzaXMsIGFuZApAQCAtMTIsOCArMTIsOCBAQAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdHlwZXMKIAotZnJvbSBpZGxlbGliIGltcG9ydCBDYWxsVGlwV2luZG93Ci1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IGNhbGx0aXBfdworZnJvbSBpZGxlbGliLmh5cGVycGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgogCiBjbGFzcyBDYWxsVGlwczoKIApAQCAtMzcsNyArMzcsNyBAQAogCiAgICAgZGVmIF9tYWtlX3RrX2NhbGx0aXBfd2luZG93KHNlbGYpOgogICAgICAgICAjIFNlZSBfX2luaXRfXyBmb3IgdXNhZ2UKLSAgICAgICAgcmV0dXJuIENhbGxUaXBXaW5kb3cuQ2FsbFRpcChzZWxmLnRleHQpCisgICAgICAgIHJldHVybiBjYWxsdGlwX3cuQ2FsbFRpcChzZWxmLnRleHQpCiAKICAgICBkZWYgX3JlbW92ZV9jYWxsdGlwX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2FsbHRpcDoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvTGliL2lkbGVsaWIvY29kZWNvbnRleHQucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CmluZGV4IDdkMjVhZGEuLjJhMjFhMWYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvZGVDb250ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL2NvZGVjb250ZXh0LnB5CkBAIC0xLDExICsxLDExIEBACi0iIiJDb2RlQ29udGV4dCAtIEV4dGVuc2lvbiB0byBkaXNwbGF5IHRoZSBibG9jayBjb250ZXh0IGFib3ZlIHRoZSBlZGl0IHdpbmRvdworIiIiY29kZWNvbnRleHQgLSBFeHRlbnNpb24gdG8gZGlzcGxheSB0aGUgYmxvY2sgY29udGV4dCBhYm92ZSB0aGUgZWRpdCB3aW5kb3cKIAogT25jZSBjb2RlIGhhcyBzY3JvbGxlZCBvZmYgdGhlIHRvcCBvZiBhIHdpbmRvdywgaXQgY2FuIGJlIGRpZmZpY3VsdCB0bwogZGV0ZXJtaW5lIHdoaWNoIGJsb2NrIHlvdSBhcmUgaW4uICBUaGlzIGV4dGVuc2lvbiBpbXBsZW1lbnRzIGEgcGFuZSBhdCB0aGUgdG9wCiBvZiBlYWNoIElETEUgZWRpdCB3aW5kb3cgd2hpY2ggcHJvdmlkZXMgYmxvY2sgc3RydWN0dXJlIGhpbnRzLiAgVGhlc2UgaGludHMgYXJlCiB0aGUgbGluZXMgd2hpY2ggY29udGFpbiB0aGUgYmxvY2sgb3BlbmluZyBrZXl3b3JkcywgZS5nLiAnaWYnLCBmb3IgdGhlCiBlbmNsb3NpbmcgYmxvY2suICBUaGUgbnVtYmVyIG9mIGhpbnQgbGluZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtbGluZXMKLXZhcmlhYmxlIGluIHRoZSBDb2RlQ29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KK3ZhcmlhYmxlIGluIHRoZSBjb2RlY29udGV4dCBzZWN0aW9uIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gTGluZXMgd2hpY2ggZG8KIG5vdCBvcGVuIGJsb2NrcyBhcmUgbm90IHNob3duIGluIHRoZSBjb250ZXh0IGhpbnRzIHBhbmUuCiAKICIiIgpAQCAtMTMsNyArMTMsNyBAQAogZnJvbSB0a2ludGVyLmNvbnN0YW50cyBpbXBvcnQgVE9QLCBMRUZULCBYLCBXLCBTVU5LRU4KIGltcG9ydCByZQogZnJvbSBzeXMgaW1wb3J0IG1heHNpemUgYXMgSU5GSU5JVFkKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogQkxPQ0tPUEVORVJTID0geyJjbGFzcyIsICJkZWYiLCAiZWxpZiIsICJlbHNlIiwgImV4Y2VwdCIsICJmaW5hbGx5IiwgImZvciIsCiAgICAgICAgICAgICAgICAgICAgICJpZiIsICJ0cnkiLCAid2hpbGUiLCAid2l0aCJ9CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL2NvbG9yaXplci5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29sb3JpemVyLnB5CmluZGV4IDAyZWFjNDcuLjViNmRjNjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbG9yaXplci5weQpAQCAtMiw5ICsyLDggQEAKIGltcG9ydCByZQogaW1wb3J0IGtleXdvcmQKIGltcG9ydCBidWlsdGlucwotZnJvbSB0a2ludGVyIGltcG9ydCBUa1ZlcnNpb24KLWZyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIERFQlVHID0gRmFsc2UKIApAQCAtNDksMTEgKzQ4LDggQEAKICAgICAgICAgaW5zZXJ0YmFja2dyb3VuZD1jdXJzb3JfY29sb3IsCiAgICAgICAgIHNlbGVjdGZvcmVncm91bmQ9c2VsZWN0X2NvbG9yc1snZm9yZWdyb3VuZCddLAogICAgICAgICBzZWxlY3RiYWNrZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2JhY2tncm91bmQnXSwKLSAgICAgICAgKQotICAgIGlmIFRrVmVyc2lvbiA+PSA4LjU6Ci0gICAgICAgIHRleHQuY29uZmlnKAotICAgICAgICAgICAgaW5hY3RpdmVzZWxlY3RiYWNrZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2JhY2tncm91bmQnXSkKLQorICAgICAgICBpbmFjdGl2ZXNlbGVjdGJhY2tncm91bmQ9c2VsZWN0X2NvbG9yc1snYmFja2dyb3VuZCddLCAgIyBuZXcgaW4gOC41CisgICAgKQogCiBjbGFzcyBDb2xvckRlbGVnYXRvcihEZWxlZ2F0b3IpOgogCkBAIC0yNTksNyArMjU1LDcgQEAKIAogZGVmIF9jb2xvcl9kZWxlZ2F0b3IocGFyZW50KTogICMgaHRlc3QgIwogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQKLSAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAKICAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXN0IENvbG9yRGVsZWdhdG9yIikKQEAgLTI3Nyw1ICsyNzMsOCBAQAogICAgIHAuaW5zZXJ0ZmlsdGVyKGQpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb2xvcml6ZXInLAorICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF9jb2xvcl9kZWxlZ2F0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5IGIvTGliL2lkbGVsaWIvY29uZmlnLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZy5weQppbmRleCA4OTU0NDg4Li41MWVmMjFiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZy5weQpAQCAtNyw3ICs3LDcgQEAKIGFuZCBpZiBhIGZpbGUgYmVjb21lcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkLgogCiBUaGUgY29udGVudHMgb2YgdGhlIHVzZXIgZmlsZXMgbWF5IGJlIGFsdGVyZWQgdXNpbmcgdGhlIE9wdGlvbnMvQ29uZmlndXJlIElETEUKLW1lbnUgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIEdVSSAoY29uZmlnRGlhbG9nLnB5KSwgb3IgbWFudWFsbHkuCittZW51IHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBHVUkgKGNvbmZpZ2RpYWxvZy5weSksIG9yIG1hbnVhbGx5LgogCiBUaHJvdWdob3V0IHRoaXMgbW9kdWxlIHRoZXJlIGlzIGFuIGVtcGhhc2lzIG9uIHJldHVybmluZyB1c2VhYmxlIGRlZmF1bHRzCiB3aGVuIGEgcHJvYmxlbSBvY2N1cnMgaW4gcmV0dXJuaW5nIGEgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmFjayB0bwpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IHN5cwogCiBmcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrVmVyc2lvbgogZnJvbSB0a2ludGVyLmZvbnQgaW1wb3J0IEZvbnQsIG5hbWV0b2ZvbnQKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjMwLDcgKzIyOSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudXNlckNmZ1tjb25maWdUeXBlXS5HZXQoc2VjdGlvbiwgb3B0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9dHlwZSwgcmF3PXJhdykKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgaW52YWxpZCAlciB2YWx1ZSBmb3IgY29uZmlndXJhdGlvbiBvcHRpb24gJXJcbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBmcm9tIHNlY3Rpb24gJXI6ICVyJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlLCBvcHRpb24sIHNlY3Rpb24sCkBAIC0yNDcsNyArMjQ2LDcgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgI3JldHVybmluZyBkZWZhdWx0LCBwcmludCB3YXJuaW5nCiAgICAgICAgIGlmIHdhcm5fb25fZGVmYXVsdDoKLSAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBwcm9ibGVtIHJldHJpZXZpbmcgY29uZmlndXJhdGlvbiBvcHRpb24gJXJcbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBmcm9tIHNlY3Rpb24gJXIuXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyJyAlCkBAIC0zNTgsNyArMzU3LDcgQEAKICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWU6CiAgICAgICAgICAgICBpZiBub3QgY2ZnUGFyc2VyLmhhc19vcHRpb24odGhlbWVOYW1lLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAjIFByaW50IHdhcm5pbmcgdGhhdCB3aWxsIHJldHVybiBhIGRlZmF1bHQgY29sb3IKLSAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLklkbGVDb25mLkdldFRoZW1lRGljdCcKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWcuSWRsZUNvbmYuR2V0VGhlbWVEaWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIHRoZW1lIGVsZW1lbnQgJXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSB0aGVtZSAlci5cbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgY29sb3I6ICVyJyAlCkBAIC02NDQsNyArNjQzLDcgQEAKICAgICAgICAgICAgICAgICBpZiBiaW5kaW5nOgogICAgICAgICAgICAgICAgICAgICBrZXlCaW5kaW5nc1tldmVudF0gPSBiaW5kaW5nCiAgICAgICAgICAgICAgICAgZWxzZTogI3dlIGFyZSBnb2luZyB0byByZXR1cm4gYSBkZWZhdWx0LCBwcmludCB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgIHdhcm5pbmc9KCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMnCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmc9KCdcbiBXYXJuaW5nOiBjb25maWcucHkgLSBJZGxlQ29uZi5HZXRDb3JlS2V5cycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1cbiBwcm9ibGVtIHJldHJpZXZpbmcga2V5IGJpbmRpbmcgZm9yIGV2ZW50ICVyJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbiBmcm9tIGtleSBzZXQgJXIuXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXInICUKQEAgLTcxMywxNiArNzEyLDEzIEBACiAgICAgICAgIGJvbGQgPSBzZWxmLkdldE9wdGlvbihjb25maWdUeXBlLCBzZWN0aW9uLCAnZm9udC1ib2xkJywgZGVmYXVsdD0wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nYm9vbCcpCiAgICAgICAgIGlmIChmYW1pbHkgPT0gJ1RrRml4ZWRGb250Jyk6Ci0gICAgICAgICAgICBpZiBUa1ZlcnNpb24gPCA4LjU6Ci0gICAgICAgICAgICAgICAgZmFtaWx5ID0gJ0NvdXJpZXInCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGYgPSBGb250KG5hbWU9J1RrRml4ZWRGb250JywgZXhpc3RzPVRydWUsIHJvb3Q9cm9vdCkKLSAgICAgICAgICAgICAgICBhY3R1YWxGb250ID0gRm9udC5hY3R1YWwoZikKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSBhY3R1YWxGb250WydmYW1pbHknXQotICAgICAgICAgICAgICAgIHNpemUgPSBhY3R1YWxGb250WydzaXplJ10KLSAgICAgICAgICAgICAgICBpZiBzaXplIDw9IDA6Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSAxMCAgIyBpZiBmb250IGluIHBpeGVscywgaWdub3JlIGFjdHVhbCBzaXplCi0gICAgICAgICAgICAgICAgYm9sZCA9IGFjdHVhbEZvbnRbJ3dlaWdodCddPT0nYm9sZCcKKyAgICAgICAgICAgIGYgPSBGb250KG5hbWU9J1RrRml4ZWRGb250JywgZXhpc3RzPVRydWUsIHJvb3Q9cm9vdCkKKyAgICAgICAgICAgIGFjdHVhbEZvbnQgPSBGb250LmFjdHVhbChmKQorICAgICAgICAgICAgZmFtaWx5ID0gYWN0dWFsRm9udFsnZmFtaWx5J10KKyAgICAgICAgICAgIHNpemUgPSBhY3R1YWxGb250WydzaXplJ10KKyAgICAgICAgICAgIGlmIHNpemUgPD0gMDoKKyAgICAgICAgICAgICAgICBzaXplID0gMTAgICMgaWYgZm9udCBpbiBwaXhlbHMsIGlnbm9yZSBhY3R1YWwgc2l6ZQorICAgICAgICAgICAgYm9sZCA9IGFjdHVhbEZvbnRbJ3dlaWdodCddID09ICdib2xkJwogICAgICAgICByZXR1cm4gKGZhbWlseSwgc2l6ZSwgJ2JvbGQnIGlmIGJvbGQgZWxzZSAnbm9ybWFsJykKIAogICAgIGRlZiBMb2FkQ2ZnRmlsZXMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTM3ODM2Li4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIiIiCi1EaWFsb2cgdGhhdCBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgbmV3IGNvbmZpZyBmaWxlIHNlY3Rpb24gbmFtZS4KLVVzZWQgdG8gZ2V0IG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgotVGhlICdyZXR1cm4gdmFsdWUnIGZvciB0aGUgZGlhbG9nLCB1c2VkIHR3byBwbGFjZWQgaW4gY29uZmlnRGlhbG9nLnB5LAotaXMgdGhlIC5yZXN1bHQgYXR0cmlidXRlIHNldCBpbiB0aGUgT2sgYW5kIENhbmNlbCBtZXRob2RzLgotIiIiCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci0KLWNsYXNzIEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcywgX2h0ZXN0PUZhbHNlKToKLSAgICAgICAgIiIiCi0gICAgICAgIG1lc3NhZ2UgLSBzdHJpbmcsIGluZm9ybWF0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5Ci0gICAgICAgIHVzZWRfbmFtZXMgLSBzdHJpbmcgY29sbGVjdGlvbiwgbmFtZXMgYWxyZWFkeSBpbiB1c2UgZm9yIHZhbGlkaXR5IGNoZWNrCi0gICAgICAgIF9odGVzdCAtIGJvb2wsIGNoYW5nZSBib3ggbG9jYXRpb24gd2hlbiBydW5uaW5nIGh0ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCi0gICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCi0gICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCi0gICAgICAgIHNlbGYudGl0bGUodGl0bGUpCi0gICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKLSAgICAgICAgc2VsZi5ncmFiX3NldCgpCi0gICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKLSAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQotICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSB1c2VkX25hbWVzCi0gICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQotICAgICAgICBzZWxmLndpdGhkcmF3KCkgICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKLSAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKLSAgICAgICAgI25lZWRzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IHRoZSB3aW5mb19yZXF3aWR0aCBpcyB2YWxpZAotICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvLmNvbmZpZyh3aWR0aD1zZWxmLmZyYW1lTWFpbi53aW5mb19yZXF3aWR0aCgpKQotICAgICAgICBzZWxmLmdlb21ldHJ5KAotICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCi0gICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxMDApCi0gICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKLSAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCi0KLSAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6Ci0gICAgICAgIHNlbGYubmFtZSA9IFN0cmluZ1ZhcihzZWxmLnBhcmVudCkKLSAgICAgICAgc2VsZi5mb250U2l6ZSA9IFN0cmluZ1ZhcihzZWxmLnBhcmVudCkKLSAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9U1VOS0VOKQotICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvID0gTWVzc2FnZShzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgcGFkeD01LCBwYWR5PTUsIHRleHQ9c2VsZi5tZXNzYWdlKSAjLGFzcGVjdD0yMDApCi0gICAgICAgIGVudHJ5TmFtZSA9IEVudHJ5KHNlbGYuZnJhbWVNYWluLCB0ZXh0dmFyaWFibGU9c2VsZi5uYW1lLCB3aWR0aD0zMCkKLSAgICAgICAgZW50cnlOYW1lLmZvY3VzX3NldCgpCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8ucGFjayhwYWR4PTUsIHBhZHk9NSkgIywgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKLSAgICAgICAgZW50cnlOYW1lLnBhY2socGFkeD01LCBwYWR5PTUpCi0KLSAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZiwgcGFkeT0yKQotICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSkKLSAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J09rJywKLSAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYuT2spCi0gICAgICAgIHNlbGYuYnV0dG9uT2sucGFjayhzaWRlPUxFRlQsIHBhZHg9NSkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDYW5jZWwnLAotICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5DYW5jZWwpCi0gICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLnBhY2soc2lkZT1SSUdIVCwgcGFkeD01KQotCi0gICAgZGVmIG5hbWVfb2soc2VsZik6Ci0gICAgICAgICcnJyBBZnRlciBzdHJpcHBpbmcgZW50ZXJlZCBuYW1lLCBjaGVjayB0aGF0IGl0IGlzIGEgIHNlbnNpYmxlCi0gICAgICAgIENvbmZpZ1BhcnNlciBmaWxlIHNlY3Rpb24gbmFtZS4gUmV0dXJuIGl0IGlmIGl0IGlzLCAnJyBpZiBub3QuCi0gICAgICAgICcnJwotICAgICAgICBuYW1lID0gc2VsZi5uYW1lLmdldCgpLnN0cmlwKCkKLSAgICAgICAgaWYgbm90IG5hbWU6ICNubyBuYW1lIHNwZWNpZmllZAotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG5hbWUgc3BlY2lmaWVkLicsIHBhcmVudD1zZWxmKQotICAgICAgICBlbGlmIGxlbihuYW1lKT4zMDogI25hbWUgdG9vIGxvbmcKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdOYW1lIHRvbyBsb25nLiBJdCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuICcrCi0gICAgICAgICAgICAgICAgICAgICczMCBjaGFyYWN0ZXJzLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZSA9ICcnCi0gICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLnVzZWRfbmFtZXM6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZSA9ICcnCi0gICAgICAgIHJldHVybiBuYW1lCi0KLSAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIG5hbWUgPSBzZWxmLm5hbWVfb2soKQotICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBuYW1lCi0gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi0gICAgZGVmIENhbmNlbChzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgc2VsZi5yZXN1bHQgPSAnJwotICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfY29uZmlnX25hbWUnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKLQotICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgotICAgIHJ1bihHZXRDZmdTZWN0aW9uTmFtZURpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5IGIvTGliL2lkbGVsaWIvY29uZmlnX2hlbHAucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jb25maWdfaGVscC5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29uZmlnX2tleS5weQppbmRleCBlNjQzOGJmLi4yNjAyMjkzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKQEAgLTIsMzEgKzIsMzUgQEAKIERpYWxvZyBmb3IgYnVpbGRpbmcgVGtpbnRlciBhY2NlbGVyYXRvciBrZXkgYmluZGluZ3MKICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiAKIGNsYXNzIEdldEtleXNEaWFsb2coVG9wbGV2ZWwpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxhY3Rpb24sY3VycmVudEtleVNlcXVlbmNlcyxfaHRlc3Q9RmFsc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBhY3Rpb24sIGN1cnJlbnRLZXlTZXF1ZW5jZXMsCisgICAgICAgICAgICAgICAgIF9odGVzdD1GYWxzZSwgX3V0ZXN0PUZhbHNlKToKICAgICAgICAgIiIiCiAgICAgICAgIGFjdGlvbiAtIHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIHZpcnR1YWwgZXZlbnQgdGhlc2Uga2V5cyB3aWxsIGJlCiAgICAgICAgICAgICAgICAgIG1hcHBlZCB0bwogICAgICAgICBjdXJyZW50S2V5cyAtIGxpc3QsIGEgbGlzdCBvZiBhbGwga2V5IHNlcXVlbmNlIGxpc3RzIGN1cnJlbnRseSBtYXBwZWQKICAgICAgICAgICAgICAgICAgdG8gdmlydHVhbCBldmVudHMsIGZvciBvdmVybGFwIGNoZWNraW5nCisgICAgICAgIF91dGVzdCAtIGJvb2wsIGRvIG5vdCB3YWl0IHdoZW4gcnVubmluZyB1bml0dGVzdAogICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAogICAgICAgICAiIiIKICAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQogICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQotICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCiAgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCiAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKICAgICAgICAgc2VsZi5ncmFiX3NldCgpCiAgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKICAgICAgICAgc2VsZi5hY3Rpb249YWN0aW9uCi0gICAgICAgIHNlbGYuY3VycmVudEtleVNlcXVlbmNlcz1jdXJyZW50S2V5U2VxdWVuY2VzCi0gICAgICAgIHNlbGYucmVzdWx0PScnCi0gICAgICAgIHNlbGYua2V5U3RyaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmN1cnJlbnRLZXlTZXF1ZW5jZXMgPSBjdXJyZW50S2V5U2VxdWVuY2VzCisgICAgICAgIHNlbGYucmVzdWx0ID0gJycKKyAgICAgICAgc2VsZi5rZXlTdHJpbmcgPSBTdHJpbmdWYXIoc2VsZikKICAgICAgICAgc2VsZi5rZXlTdHJpbmcuc2V0KCcnKQogICAgICAgICBzZWxmLlNldE1vZGlmaWVyc0ZvclBsYXRmb3JtKCkgIyBzZXQgc2VsZi5tb2RpZmllcnMsIHNlbGYubW9kaWZpZXJfbGFiZWwKICAgICAgICAgc2VsZi5tb2RpZmllcl92YXJzID0gW10KQEAgLTM3LDcgKzQxLDYgQEAKICAgICAgICAgc2VsZi5hZHZhbmNlZCA9IEZhbHNlCiAgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCiAgICAgICAgIHNlbGYuTG9hZEZpbmFsS2V5TGlzdCgpCi0gICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CiAgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCiAgICAgICAgIHNlbGYuZ2VvbWV0cnkoCiAgICAgICAgICAgICAgICAgIislZCslZCIgJSAoCkBAIC00Nyw4ICs1MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCiAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApCiAgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKIAogICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgogICAgICAgICBmcmFtZU1haW4gPSBGcmFtZShzZWxmLGJvcmRlcndpZHRoPTIscmVsaWVmPVNVTktFTikKQEAgLTI2MSw2ICsyNjUsNyBAQAogICAgICAgICAgICAga2V5c09LID0gVHJ1ZQogICAgICAgICByZXR1cm4ga2V5c09LCiAKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oR2V0S2V5c0RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQppbmRleCA1ZjViZDM2Li42NjI5ZDcwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnZGlhbG9nLnB5CkBAIC0xMCwxOCArMTAsMTkgQEAKIAogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKIGltcG9ydCB0a2ludGVyLmNvbG9yY2hvb3NlciBhcyB0a0NvbG9yQ2hvb3NlcgogaW1wb3J0IHRraW50ZXIuZm9udCBhcyB0a0ZvbnQKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCi1mcm9tIGlkbGVsaWIuZHluT3B0aW9uTWVudVdpZGdldCBpbXBvcnQgRHluT3B0aW9uTWVudQotZnJvbSBpZGxlbGliLmtleWJpbmRpbmdEaWFsb2cgaW1wb3J0IEdldEtleXNEaWFsb2cKLWZyb20gaWRsZWxpYi5jb25maWdTZWN0aW9uTmFtZURpYWxvZyBpbXBvcnQgR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cKLWZyb20gaWRsZWxpYi5jb25maWdIZWxwU291cmNlRWRpdCBpbXBvcnQgR2V0SGVscFNvdXJjZURpYWxvZworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5keW5vcHRpb24gaW1wb3J0IER5bk9wdGlvbk1lbnUKK2Zyb20gaWRsZWxpYi5jb25maWdfa2V5IGltcG9ydCBHZXRLZXlzRGlhbG9nCitmcm9tIGlkbGVsaWIucXVlcnkgaW1wb3J0IFNlY3Rpb25OYW1lCitmcm9tIGlkbGVsaWIuY29uZmlnX2hlbHAgaW1wb3J0IEdldEhlbHBTb3VyY2VEaWFsb2cKIGZyb20gaWRsZWxpYi50YWJiZWRwYWdlcyBpbXBvcnQgVGFiYmVkUGFnZVNldAotZnJvbSBpZGxlbGliLnRleHRWaWV3IGltcG9ydCB2aWV3X3RleHQKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliLnRleHR2aWV3IGltcG9ydCB2aWV3X3RleHQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4CiAKIGNsYXNzIENvbmZpZ0RpYWxvZyhUb3BsZXZlbCk6CiAKQEAgLTkxLDcgKzkyLDcgQEAKICAgICAgICAgc2VsZi5jcmVhdGVfYWN0aW9uX2J1dHRvbnMoKS5wYWNrKHNpZGU9Qk9UVE9NKQogCiAgICAgZGVmIGNyZWF0ZV9hY3Rpb25fYnV0dG9ucyhzZWxmKToKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgICAgICMgQ2hhbmdpbmcgdGhlIGRlZmF1bHQgcGFkZGluZyBvbiBPU1ggcmVzdWx0cyBpbiB1bnJlYWRhYmxlCiAgICAgICAgICAgICAjIHRleHQgaW4gdGhlIGJ1dHRvbnMKICAgICAgICAgICAgIHBhZGRpbmdBcmdzID0ge30KQEAgLTQ2NCwyNCArNDY1LDI0IEBACiAgICAgICAgIHJldHVybiBmcmFtZQogCiAgICAgZGVmIEF0dGFjaFZhckNhbGxiYWNrcyhzZWxmKToKLSAgICAgICAgc2VsZi5mb250U2l6ZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQotICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCi0gICAgICAgIHNlbGYuZm9udEJvbGQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKLSAgICAgICAgc2VsZi5zcGFjZU51bS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKLSAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY29sb3VyKQotICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUpCi0gICAgICAgIHNlbGYuY3VzdG9tVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCi0gICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4pCi0gICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldCkKLSAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCi0gICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMpCi0gICAgICAgIHNlbGYuY3VzdG9tS2V5cy50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21LZXlzKQotICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQotICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX3dpbldpZHRoKQotICAgICAgICBzZWxmLndpbkhlaWdodC50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF93aW5IZWlnaHQpCi0gICAgICAgIHNlbGYuc3RhcnR1cEVkaXQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCi0gICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYXV0b1NhdmUpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZW5jb2RpbmcpCisgICAgICAgIHNlbGYuZm9udFNpemUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQorICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKKyAgICAgICAgc2VsZi5mb250Qm9sZC50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCisgICAgICAgIHNlbGYuc3BhY2VOdW0udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKKyAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9jb2xvdXIpCisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpblRoZW1lKQorICAgICAgICBzZWxmLmN1c3RvbVRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF90aGVtZUlzQnVpbHRpbikKKyAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9oaWdobGlnaHRUYXJnZXQpCisgICAgICAgIHNlbGYua2V5QmluZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCisgICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluS2V5cykKKyAgICAgICAgc2VsZi5jdXN0b21LZXlzLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tS2V5cykKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQorICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luV2lkdGgpCisgICAgICAgIHNlbGYud2luSGVpZ2h0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luSGVpZ2h0KQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCisgICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9hdXRvU2F2ZSkKKyAgICAgICAgc2VsZi5lbmNvZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2VuY29kaW5nKQogCiAgICAgZGVmIHJlbW92ZV92YXJfY2FsbGJhY2tzKHNlbGYpOgogICAgICAgICAiUmVtb3ZlIGNhbGxiYWNrcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4iCkBAIC00OTIsNyArNDkzLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmtleUJpbmRpbmcsIHNlbGYuYnVpbHRpbktleXMsIHNlbGYuY3VzdG9tS2V5cywKICAgICAgICAgICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLCBzZWxmLndpbldpZHRoLCBzZWxmLndpbkhlaWdodCwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LCBzZWxmLmF1dG9TYXZlLCBzZWxmLmVuY29kaW5nLCk6Ci0gICAgICAgICAgICB2YXIudHJhY2VfdmRlbGV0ZSgndycsIHZhci50cmFjZV92aW5mbygpWzBdWzFdKQorICAgICAgICAgICAgdmFyLnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB2YXIudHJhY2VfaW5mbygpWzBdWzFdKQogCiAgICAgZGVmIFZhckNoYW5nZWRfZm9udChzZWxmLCAqcGFyYW1zKToKICAgICAgICAgJycnV2hlbiBvbmUgZm9udCBhdHRyaWJ1dGUgY2hhbmdlcywgc2F2ZSB0aGVtIGFsbCwgYXMgdGhleSBhcmUKQEAgLTY4Myw3ICs2ODQsNyBAQAogICAgIGRlZiBHZXROZXdLZXlzTmFtZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgdXNlZE5hbWVzID0gKGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywgJ2tleXMnKSArCiAgICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCAna2V5cycpKQotICAgICAgICBuZXdLZXlTZXQgPSBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZygKKyAgICAgICAgbmV3S2V5U2V0ID0gU2VjdGlvbk5hbWUoCiAgICAgICAgICAgICAgICAgc2VsZiwgJ05ldyBDdXN0b20gS2V5IFNldCcsIG1lc3NhZ2UsIHVzZWROYW1lcykucmVzdWx0CiAgICAgICAgIHJldHVybiBuZXdLZXlTZXQKIApAQCAtODM2LDcgKzgzNyw3IEBACiAgICAgZGVmIEdldE5ld1RoZW1lTmFtZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgdXNlZE5hbWVzID0gKGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywgJ2hpZ2hsaWdodCcpICsKICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsICdoaWdobGlnaHQnKSkKLSAgICAgICAgbmV3VGhlbWUgPSBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZygKKyAgICAgICAgbmV3VGhlbWUgPSBTZWN0aW9uTmFtZSgKICAgICAgICAgICAgICAgICBzZWxmLCAnTmV3IEN1c3RvbSBUaGVtZScsIG1lc3NhZ2UsIHVzZWROYW1lcykucmVzdWx0CiAgICAgICAgIHJldHVybiBuZXdUaGVtZQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0RlYnVnZ2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQppbmRleCBkNWUyMTdkLi5lYTM5M2IxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQorKysgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQpAQCAtMSw5ICsxLDEwIEBACiBpbXBvcnQgb3MKIGltcG9ydCBiZGIKIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZnJvbSBpZGxlbGliLldpbmRvd0xpc3QgaW1wb3J0IExpc3RlZFRvcGxldmVsCi1mcm9tIGlkbGVsaWIuU2Nyb2xsZWRMaXN0IGltcG9ydCBTY3JvbGxlZExpc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIGlkbGVsaWIud2luZG93cyBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKK2Zyb20gaWRsZWxpYi5zY3JvbGxlZGxpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogCiBjbGFzcyBJZGIoYmRiLkJkYik6CkBAIC0zNCw4ICszNSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHByZXZfZnJhbWUgPSBmcmFtZS5mX2JhY2sKLSAgICAgICAgICAgIGlmIHByZXZfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lLmNvdW50KCdEZWJ1Z2dlci5weScpOgotICAgICAgICAgICAgICAgICMgKHRoYXQgdGVzdCB3aWxsIGNhdGNoIGJvdGggRGVidWdnZXIucHkgYW5kIFJlbW90ZURlYnVnZ2VyLnB5KQorICAgICAgICAgICAgcHJldl9uYW1lID0gcHJldl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGlmICdpZGxlbGliJyBpbiBwcmV2X25hbWUgYW5kICdkZWJ1Z2dlcicgaW4gcHJldl9uYW1lOgorICAgICAgICAgICAgICAgICMgY2F0Y2ggYm90aCBpZGxlbGliL2RlYnVnZ2VyLnB5IGFuZCBpZGxlbGliL2RlYnVnZ2VyX3IucHkKKyAgICAgICAgICAgICAgICAjIG9uIGJvdGggcG9zaXggYW5kIHdpbmRvd3MKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIHJldHVybiBzZWxmLmluX3JwY19jb2RlKHByZXZfZnJhbWUpCiAKQEAgLTM3MCw3ICszNzMsNyBAQAogY2xhc3MgU3RhY2tWaWV3ZXIoU2Nyb2xsZWRMaXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGZsaXN0LCBndWkpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBBdCBsZWFzdCBvbiB3aXRoIHRoZSBzdG9jayBBcXVhVGsgdmVyc2lvbiBvbiBPU1ggMTAuNCB5b3UnbGwKICAgICAgICAgICAgICMgZ2V0IGEgc2hha2luZyBHVUkgdGhhdCBldmVudHVhbGx5IGtpbGxzIElETEUgaWYgdGhlIHdpZHRoCiAgICAgICAgICAgICAjIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KQEAgLTUwMiw3ICs1MDUsNyBAQAogICAgICAgICAgICAgIwogICAgICAgICAgICAgIyBUaGVyZSBpcyBhbHNvIGFuIG9ic2N1cmUgYnVnIGluIHNvcnRlZChkaWN0KSB3aGVyZSB0aGUKICAgICAgICAgICAgICMgaW50ZXJwcmV0ZXIgZ2V0cyBpbnRvIGEgbG9vcCByZXF1ZXN0aW5nIG5vbi1leGlzdGluZyBkaWN0WzBdLAotICAgICAgICAgICAgIyBkaWN0WzFdLCBkaWN0WzJdLCBldGMgZnJvbSB0aGUgUmVtb3RlRGVidWdnZXIuRGljdFByb3h5LgorICAgICAgICAgICAgIyBkaWN0WzFdLCBkaWN0WzJdLCBldGMgZnJvbSB0aGUgZGVidWdnZXJfci5EaWN0UHJveHkuCiAgICAgICAgICAgICAjIyMKICAgICAgICAgICAgIGtleXNfbGlzdCA9IGRpY3Qua2V5cygpCiAgICAgICAgICAgICBuYW1lcyA9IHNvcnRlZChrZXlzX2xpc3QpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKaW5kZXggYmUyMjYyZi4uYmM5NzEyNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdnZXJfci5weQpAQCAtMjEsNyArMjEsNyBAQAogIiIiCiAKIGltcG9ydCB0eXBlcwotZnJvbSBpZGxlbGliIGltcG9ydCBEZWJ1Z2dlcgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgogCiBkZWJ1Z2dpbmcgPSAwCiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAgICAgIiIiCiAgICAgZ3VpX3Byb3h5ID0gR1VJUHJveHkocnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQotICAgIGlkYiA9IERlYnVnZ2VyLklkYihndWlfcHJveHkpCisgICAgaWRiID0gZGVidWdnZXIuSWRiKGd1aV9wcm94eSkKICAgICBpZGJfYWRhcCA9IElkYkFkYXB0ZXIoaWRiKQogICAgIHJwY2hhbmRsZXIucmVnaXN0ZXIoaWRiX2FkYXBfb2lkLCBpZGJfYWRhcCkKICAgICByZXR1cm4gaWRiX2FkYXBfb2lkCkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICBpZGJfYWRhcF9vaWQgPSBycGNjbHQucmVtb3RlY2FsbCgiZXhlYyIsICJzdGFydF90aGVfZGVidWdnZXIiLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aV9hZGFwX29pZCwpLCB7fSkKICAgICBpZGJfcHJveHkgPSBJZGJQcm94eShycGNjbHQsIHB5c2hlbGwsIGlkYl9hZGFwX29pZCkKLSAgICBndWkgPSBEZWJ1Z2dlci5EZWJ1Z2dlcihweXNoZWxsLCBpZGJfcHJveHkpCisgICAgZ3VpID0gZGVidWdnZXIuRGVidWdnZXIocHlzaGVsbCwgaWRiX3Byb3h5KQogICAgIGd1aV9hZGFwID0gR1VJQWRhcHRlcihycGNjbHQsIGd1aSkKICAgICBycGNjbHQucmVnaXN0ZXIoZ3VpX2FkYXBfb2lkLCBndWlfYWRhcCkKICAgICByZXR1cm4gZ3VpCkBAIC0zNzMsNyArMzczLDcgQEAKICAgICBSZXF1ZXN0IHRoYXQgdGhlIFJQQ1NlcnZlciBzaHV0IGRvd24gdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIgYW5kIGxpbmsuCiAgICAgVW5yZWdpc3RlciB0aGUgR1VJQWRhcHRlciwgd2hpY2ggd2lsbCBjYXVzZSBhIEdDIG9uIHRoZSBJZGxlIHByb2Nlc3MKICAgICBkZWJ1Z2dlciBhbmQgUlBDIGxpbmsgb2JqZWN0cy4gIChUaGUgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgZGVidWdnZXIgR1VJCi0gICAgaXMgZGVsZXRlZCBpbiBQeVNoZWxsLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcigpLikKKyAgICBpcyBkZWxldGVkIGluIHB5c2hlbGwuY2xvc2VfcmVtb3RlX2RlYnVnZ2VyKCkuKQogCiAgICAgIiIiCiAgICAgY2xvc2Vfc3VicHJvY2Vzc19kZWJ1Z2dlcihycGNjbHQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5IGIvTGliL2lkbGVsaWIvZGVidWdvYmoucHkKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVidWdvYmoucHkKaW5kZXggN2I1N2FhNC4uMGQ4YjJiMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9kZWJ1Z29iai5weQpAQCAtMTEsNyArMTEsNyBAQAogCiBpbXBvcnQgcmUKIAotZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVJdGVtLCBUcmVlTm9kZSwgU2Nyb2xsZWRDYW52YXMKK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlSXRlbSwgVHJlZU5vZGUsIFNjcm9sbGVkQ2FudmFzCiAKIGZyb20gcmVwcmxpYiBpbXBvcnQgUmVwcgogCkBAIC0xMjIsMjEgKzEyMiwyMCBAQAogICAgIHJldHVybiBjKGxhYmVsdGV4dCwgb2JqZWN0LCBzZXRmdW5jdGlvbikKIAogCi1kZWYgX29iamVjdF9icm93c2VyKHBhcmVudCk6CitkZWYgX29iamVjdF9icm93c2VyKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICBpbXBvcnQgc3lzCi0gICAgZnJvbSB0a2ludGVyIGltcG9ydCBUawotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBPYmplY3RCcm93c2VyIikKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBkZWJ1ZyBvYmplY3QgYnJvd3NlciIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHJvb3QuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQotICAgIHJvb3QuZm9jdXNfc2V0KCkKLSAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIlKHggKyAxMDAsIHkgKyAxNzUpKQorICAgIHRvcC5jb25maWd1cmUoYmQ9MCwgYmc9InllbGxvdyIpCisgICAgdG9wLmZvY3VzX3NldCgpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKICAgICBpdGVtID0gbWFrZV9vYmplY3R0cmVlaXRlbSgic3lzIiwgc3lzKQogICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCiAgICAgbm9kZS51cGRhdGUoKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnb2JqX3IucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlYnVnb2JqX3IucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL2RlbGVnYXRvci5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvRGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWxlZ2F0b3IucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkgYi9MaWIvaWRsZWxpYi9keW5vcHRpb24ucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZHlub3B0aW9uLnB5CmluZGV4IDUxNWI0YmEuLjkyMmFkNWUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKKysrIGIvTGliL2lkbGVsaWIvZHlub3B0aW9uLnB5CkBAIC0zNCw5ICszNCw5IEBACiAgICAgICAgICAgICBzZWxmLnZhcmlhYmxlLnNldCh2YWx1ZSkKIAogZGVmIF9keW5fb3B0aW9uX21lbnUocGFyZW50KTogICMgaHRlc3QgIwotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsICMgKyBTdHJpbmdWYXIsIEJ1dHRvbgogCi0gICAgdG9wID0gVG9wbGV2ZWwoKQorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKICAgICB0b3AudGl0bGUoIlRldHMgZHluYW1pYyBvcHRpb24gbWVudSIpCiAgICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSArIDIwMCwKICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgMTUwKSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weSBiL0xpYi9pZGxlbGliL2VkaXRvci5weQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2VkaXRvci5weQppbmRleCA5OTQ0ZGEzLi43MzcyZWNmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvZWRpdG9yLnB5CkBAIC03LDI3ICs3LDI5IEBACiBpbXBvcnQgc3RyaW5nCiBpbXBvcnQgc3lzCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgogaW1wb3J0IHRraW50ZXIuc2ltcGxlZGlhbG9nIGFzIHRrU2ltcGxlRGlhbG9nCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogaW1wb3J0IHRyYWNlYmFjawogaW1wb3J0IHdlYmJyb3dzZXIKIAotZnJvbSBpZGxlbGliLk11bHRpQ2FsbCBpbXBvcnQgTXVsdGlDYWxsQ3JlYXRvcgotZnJvbSBpZGxlbGliIGltcG9ydCBXaW5kb3dMaXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaERpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBHcmVwRGlhbG9nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlcGxhY2VEaWFsb2cKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlQYXJzZQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCi1mcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nLCB0ZXh0VmlldywgY29uZmlnRGlhbG9nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYi5tdWx0aWNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkKK2Zyb20gaWRsZWxpYiBpbXBvcnQgd2luZG93cworZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2gKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZ3JlcAorZnJvbSBpZGxlbGliIGltcG9ydCByZXBsYWNlCitmcm9tIGlkbGVsaWIgaW1wb3J0IHB5cGFyc2UKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQsIHRleHR2aWV3LCBjb25maWdkaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4CiBmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHAKIAogIyBUaGUgZGVmYXVsdCB0YWIgc2V0dGluZyBmb3IgYSBUZXh0IHdpZGdldCwgaW4gYXZlcmFnZS13aWR0aCBjaGFyYWN0ZXJzLgogVEtfVEFCV0lEVEhfREVGQVVMVCA9IDgKLQogX3B5X3ZlcnNpb24gPSAnICglcyknICUgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogCisKIGRlZiBfc3BoaW54X3ZlcnNpb24oKToKICAgICAiRm9ybWF0IHN5cy52ZXJzaW9uX2luZm8gdG8gcHJvZHVjZSB0aGUgU3BoaW54IHZlcnNpb24gc3RyaW5nIHVzZWQgdG8gaW5zdGFsbCB0aGUgY2htIGRvY3MiCiAgICAgbWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCA9IHN5cy52ZXJzaW9uX2luZm8KQEAgLTQwLDYzICs0MiwxNiBAQAogICAgIHJldHVybiByZWxlYXNlCiAKIAotY2xhc3MgSGVscERpYWxvZyhvYmplY3QpOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUgICAgICAjIHBhcmVudCBvZiBoZWxwIHdpbmRvdwotICAgICAgICBzZWxmLmRsZyA9IE5vbmUgICAgICAgICAjIHRoZSBoZWxwIHdpbmRvdyBpdGVzZWxmCi0KLSAgICBkZWYgZGlzcGxheShzZWxmLCBwYXJlbnQsIG5lYXI9Tm9uZSk6Ci0gICAgICAgICIiIiBEaXNwbGF5IHRoZSBoZWxwIGRpYWxvZy4KLQotICAgICAgICAgICAgcGFyZW50IC0gcGFyZW50IHdpZGdldCBmb3IgdGhlIGhlbHAgd2luZG93Ci0KLSAgICAgICAgICAgIG5lYXIgLSBhIFRvcGxldmVsIHdpZGdldCAoZS5nLiBFZGl0b3JXaW5kb3cgb3IgUHlTaGVsbCkKLSAgICAgICAgICAgICAgICAgICB0byB1c2UgYXMgYSByZWZlcmVuY2UgZm9yIHBsYWNpbmcgdGhlIGhlbHAgd2luZG93Ci0gICAgICAgICIiIgotICAgICAgICBpbXBvcnQgd2FybmluZ3MgYXMgdwotICAgICAgICB3Lndhcm4oIkVkaXRvcldpbmRvdy5IZWxwRGlhbG9nIGlzIG5vIGxvbmdlciB1c2VkIGJ5IElkbGUuXG4iCi0gICAgICAgICAgICAgICAiSXQgd2lsbCBiZSByZW1vdmVkIGluIDMuNiBvciBsYXRlci5cbiIKLSAgICAgICAgICAgICAgICJJdCBoYXMgYmVlbiByZXBsYWNlZCBieSBwcml2YXRlIGhlbHAuSGVscFdpbmRvd1xuIiwKLSAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgICAgICBpZiBzZWxmLmRsZyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5zaG93X2RpYWxvZyhwYXJlbnQpCi0gICAgICAgIGlmIG5lYXI6Ci0gICAgICAgICAgICBzZWxmLm5lYXJ3aW5kb3cobmVhcikKLQotICAgIGRlZiBzaG93X2RpYWxvZyhzZWxmLCBwYXJlbnQpOgotICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAotICAgICAgICBmbj1vcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCdoZWxwLnR4dCcpCi0gICAgICAgIHNlbGYuZGxnID0gZGxnID0gdGV4dFZpZXcudmlld19maWxlKHBhcmVudCwnSGVscCcsZm4sIG1vZGFsPUZhbHNlKQotICAgICAgICBkbGcuYmluZCgnPERlc3Ryb3k+Jywgc2VsZi5kZXN0cm95LCAnKycpCi0KLSAgICBkZWYgbmVhcndpbmRvdyhzZWxmLCBuZWFyKToKLSAgICAgICAgIyBQbGFjZSB0aGUgaGVscCBkaWFsb2cgbmVhciB0aGUgd2luZG93IHNwZWNpZmllZCBieSBwYXJlbnQuCi0gICAgICAgICMgTm90ZSAtIHRoaXMgbWF5IG5vdCByZXBvc2l0aW9uIHRoZSB3aW5kb3cgaW4gTWV0YWNpdHkKLSAgICAgICAgIyAgaWYgIi9hcHBzL21ldGFjaXR5L2dlbmVyYWwvZGlzYWJsZV93b3JrYXJvdW5kcyIgaXMgZW5hYmxlZAotICAgICAgICBkbGcgPSBzZWxmLmRsZwotICAgICAgICBnZW9tID0gKG5lYXIud2luZm9fcm9vdHgoKSArIDEwLCBuZWFyLndpbmZvX3Jvb3R5KCkgKyAxMCkKLSAgICAgICAgZGxnLndpdGhkcmF3KCkKLSAgICAgICAgZGxnLmdlb21ldHJ5KCI9KyVkKyVkIiAlIGdlb20pCi0gICAgICAgIGRsZy5kZWljb25pZnkoKQotICAgICAgICBkbGcubGlmdCgpCi0KLSAgICBkZWYgZGVzdHJveShzZWxmLCBldj1Ob25lKToKLSAgICAgICAgc2VsZi5kbGcgPSBOb25lCi0gICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQotCi1oZWxwRGlhbG9nID0gSGVscERpYWxvZygpICAjIHNpbmdsZXRvbiBpbnN0YW5jZSwgbm8gbG9uZ2VyIHVzZWQKLQotCiBjbGFzcyBFZGl0b3JXaW5kb3cob2JqZWN0KToKLSAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgotICAgIGZyb20gaWRsZWxpYi5Db2xvckRlbGVnYXRvciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IsIGNvbG9yX2NvbmZpZwotICAgIGZyb20gaWRsZWxpYi5VbmRvRGVsZWdhdG9yIGltcG9ydCBVbmRvRGVsZWdhdG9yCi0gICAgZnJvbSBpZGxlbGliLklPQmluZGluZyBpbXBvcnQgSU9CaW5kaW5nLCBmaWxlc3lzdGVtZW5jb2RpbmcsIGVuY29kaW5nCi0gICAgZnJvbSBpZGxlbGliIGltcG9ydCBCaW5kaW5ncworICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCisgICAgZnJvbSBpZGxlbGliLmNvbG9yaXplciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IsIGNvbG9yX2NvbmZpZworICAgIGZyb20gaWRsZWxpYi51bmRvIGltcG9ydCBVbmRvRGVsZWdhdG9yCisgICAgZnJvbSBpZGxlbGliLmlvbWVudSBpbXBvcnQgSU9CaW5kaW5nLCBlbmNvZGluZworICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgbWFpbm1lbnUKICAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCi0gICAgZnJvbSBpZGxlbGliLk11bHRpU3RhdHVzQmFyIGltcG9ydCBNdWx0aVN0YXR1c0JhcgorICAgIGZyb20gaWRsZWxpYi5zdGF0dXNiYXIgaW1wb3J0IE11bHRpU3RhdHVzQmFyCiAKKyAgICBmaWxlc3lzdGVtZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgICMgZm9yIGZpbGUgbmFtZXMKICAgICBoZWxwX3VybCA9IE5vbmUKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToKQEAgLTEzNiwxMSArOTEsMTEgQEAKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgc3lzLnBzMSA9ICc+Pj4gJwogICAgICAgICBzZWxmLm1lbnViYXIgPSBNZW51KHJvb3QpCi0gICAgICAgIHNlbGYudG9wID0gdG9wID0gV2luZG93TGlzdC5MaXN0ZWRUb3BsZXZlbChyb290LCBtZW51PXNlbGYubWVudWJhcikKKyAgICAgICAgc2VsZi50b3AgPSB0b3AgPSB3aW5kb3dzLkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQogICAgICAgICBpZiBmbGlzdDoKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0gZmxpc3QudmFycwogICAgICAgICAgICAgI3NlbGYudG9wLmluc3RhbmNlX2RpY3QgbWFrZXMgZmxpc3QuaW52ZXJzZWRpY3QgYXZhaWxhYmxlIHRvCi0gICAgICAgICAgICAjY29uZmlnRGlhbG9nLnB5IHNvIGl0IGNhbiBhY2Nlc3MgYWxsIEVkaXRvcldpbmRvdyBpbnN0YW5jZXMKKyAgICAgICAgICAgICNjb25maWdkaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhbmNlcwogICAgICAgICAgICAgc2VsZi50b3AuaW5zdGFuY2VfZGljdCA9IGZsaXN0LmludmVyc2VkaWN0CiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLnRraW50ZXJfdmFycyA9IHt9ICAjIGtleXM6IFRraW50ZXIgZXZlbnQgbmFtZXMKQEAgLTE1OCwxMyArMTEzLDEwIEBACiAgICAgICAgICAgICAgICAgJ3dyYXAnOiAnbm9uZScsCiAgICAgICAgICAgICAgICAgJ2hpZ2hsaWdodHRoaWNrbmVzcyc6IDAsCiAgICAgICAgICAgICAgICAgJ3dpZHRoJzogc2VsZi53aWR0aCwKLSAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JywgdHlwZT0naW50Jyl9Ci0gICAgICAgIGlmIFRrVmVyc2lvbiA+PSA4LjU6Ci0gICAgICAgICAgICAjIFN0YXJ0aW5nIHdpdGggdGsgOC41IHdlIGhhdmUgdG8gc2V0IHRoZSBuZXcgdGFic3R5bGUgb3B0aW9uCi0gICAgICAgICAgICAjIHRvICd3b3JkcHJvY2Vzc29yJyB0byBhY2hpZXZlIHRoZSBzYW1lIGRpc3BsYXkgb2YgdGFicyBhcyBpbgotICAgICAgICAgICAgIyBvbGRlciB0ayB2ZXJzaW9ucy4KLSAgICAgICAgICAgIHRleHRfb3B0aW9uc1sndGFic3R5bGUnXSA9ICd3b3JkcHJvY2Vzc29yJworICAgICAgICAgICAgICAgICd0YWJzdHlsZSc6ICd3b3JkcHJvY2Vzc29yJywgICMgbmV3IGluIDguNQorICAgICAgICAgICAgICAgICdoZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAnbWFpbicsICdFZGl0b3JXaW5kb3cnLCAnaGVpZ2h0JywgdHlwZT0naW50JyksCisgICAgICAgICAgICAgICAgfQogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcihUZXh0KSh0ZXh0X2ZyYW1lLCAqKnRleHRfb3B0aW9ucykKICAgICAgICAgc2VsZi50b3AuZm9jdXNlZF93aWRnZXQgPSBzZWxmLnRleHQKIApAQCAtMTczLDcgKzEyNSw3IEBACiAKICAgICAgICAgc2VsZi50b3AucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNsb3NlKQogICAgICAgICBzZWxmLnRvcC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+Iiwgc2VsZi5jbG9zZV9ldmVudCkKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgICAgICBpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgICAgICMgQ29tbWFuZC1XIG9uIGVkaXRvcndpbmRvd3MgZG9lc24ndCB3b3JrIHdpdGhvdXQgdGhpcy4KICAgICAgICAgICAgIHRleHQuYmluZCgnPDxjbG9zZS13aW5kb3c+PicsIHNlbGYuY2xvc2VfZXZlbnQpCiAgICAgICAgICAgICAjIFNvbWUgT1MgWCBzeXN0ZW1zIGhhdmUgb25seSBvbmUgbW91c2UgYnV0dG9uLCBzbyB1c2UKQEAgLTMwOSw3ICsyNjEsNyBAQAogICAgICAgICAgICAgICAgIG1lbnUuYWRkX3NlcGFyYXRvcigpCiAgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMQogICAgICAgICAgICAgc2VsZi53bWVudV9lbmQgPSBlbmQKLSAgICAgICAgICAgIFdpbmRvd0xpc3QucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCisgICAgICAgICAgICB3aW5kb3dzLnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQogCiAgICAgICAgICMgU29tZSBhYnN0cmFjdGlvbnMgc28gSURMRSBleHRlbnNpb25zIGFyZSBjcm9zcy1JREUKICAgICAgICAgc2VsZi5hc2t5ZXNubyA9IHRrTWVzc2FnZUJveC5hc2t5ZXNubwpAQCAtNDE4LDcgKzM3MCw3IEBACiAgICAgICAgICAgICB1bmRlcmxpbmUsIGxhYmVsID0gcHJlcHN0cihsYWJlbCkKICAgICAgICAgICAgIG1lbnVkaWN0W25hbWVdID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT1uYW1lLCB0ZWFyb2ZmPTApCiAgICAgICAgICAgICBtYmFyLmFkZF9jYXNjYWRlKGxhYmVsPWxhYmVsLCBtZW51PW1lbnUsIHVuZGVybGluZT11bmRlcmxpbmUpCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDYXJib25UaygpOgorICAgICAgICBpZiBtYWNvc3guaXNDYXJib25UaygpOgogICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGFwcGxpY2F0aW9uIG1lbnUKICAgICAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT0nYXBwbGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyb2ZmPTApCkBAIC00MzksNyArMzkxLDcgQEAKICAgICAgICAgICAgIGVuZCA9IC0xCiAgICAgICAgIGlmIGVuZCA+IHNlbGYud21lbnVfZW5kOgogICAgICAgICAgICAgbWVudS5kZWxldGUoc2VsZi53bWVudV9lbmQrMSwgZW5kKQotICAgICAgICBXaW5kb3dMaXN0LmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKKyAgICAgICAgd2luZG93cy5hZGRfd2luZG93c190b19tZW51KG1lbnUpCiAKICAgICBybWVudSA9IE5vbmUKIApAQCAtNTA3LDE3ICs0NTksMTcgQEAKIAogICAgIGRlZiBhYm91dF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnQWJvdXQgSURMRScgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggbWFjb3N4U3VwcG9ydC5vdmVycmlkZVJvb3RNZW51LmFib3V0X2RpYWxvZy4KLSAgICAgICAgYWJvdXREaWFsb2cuQWJvdXREaWFsb2coc2VsZi50b3AsJ0Fib3V0IElETEUnKQorICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUuYWJvdXRfZGlhbG9nLgorICAgICAgICBoZWxwX2Fib3V0LkFib3V0RGlhbG9nKHNlbGYudG9wLCdBYm91dCBJRExFJykKIAogICAgIGRlZiBjb25maWdfZGlhbG9nKHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIE9wdGlvbnMgJ0NvbmZpZ3VyZSBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuY29uZmlnX2RpYWxvZy4KLSAgICAgICAgY29uZmlnRGlhbG9nLkNvbmZpZ0RpYWxvZyhzZWxmLnRvcCwnU2V0dGluZ3MnKQorICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUuY29uZmlnX2RpYWxvZy4KKyAgICAgICAgY29uZmlnZGlhbG9nLkNvbmZpZ0RpYWxvZyhzZWxmLnRvcCwnU2V0dGluZ3MnKQogCiAgICAgZGVmIGhlbHBfZGlhbG9nKHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIEhlbHAgJ0lETEUgSGVscCcgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggbWFjb3N4U3VwcG9ydC5vdmVycmlkZVJvb3RNZW51LmhlbHBfZGlhbG9nLgorICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUuaGVscF9kaWFsb2cuCiAgICAgICAgIGlmIHNlbGYucm9vdDoKICAgICAgICAgICAgIHBhcmVudCA9IHNlbGYucm9vdAogICAgICAgICBlbHNlOgpAQCAtNTkwLDIzICs1NDIsMjMgQEAKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBmaW5kX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmQoc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZChzZWxmLnRleHQpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKICAgICBkZWYgZmluZF9hZ2Fpbl9ldmVudChzZWxmLCBldmVudCk6Ci0gICAgICAgIFNlYXJjaERpYWxvZy5maW5kX2FnYWluKHNlbGYudGV4dCkKKyAgICAgICAgc2VhcmNoLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfc2VsZWN0aW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfc2VsZWN0aW9uKHNlbGYudGV4dCkKKyAgICAgICAgc2VhcmNoLmZpbmRfc2VsZWN0aW9uKHNlbGYudGV4dCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBmaW5kX2luX2ZpbGVzX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgR3JlcERpYWxvZy5ncmVwKHNlbGYudGV4dCwgc2VsZi5pbywgc2VsZi5mbGlzdCkKKyAgICAgICAgZ3JlcC5ncmVwKHNlbGYudGV4dCwgc2VsZi5pbywgc2VsZi5mbGlzdCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiByZXBsYWNlX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgUmVwbGFjZURpYWxvZy5yZXBsYWNlKHNlbGYudGV4dCkKKyAgICAgICAgcmVwbGFjZS5yZXBsYWNlKHNlbGYudGV4dCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBnb3RvX2xpbmVfZXZlbnQoc2VsZiwgZXZlbnQpOgpAQCAtNjIyLDQ2ICs1NzQsMjcgQEAKICAgICAgICAgdGV4dC5zZWUoImluc2VydCIpCiAKICAgICBkZWYgb3Blbl9tb2R1bGUoc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgICMgWFhYIFNob3VsZG4ndCB0aGlzIGJlIGluIElPQmluZGluZz8KKyAgICAgICAgIiIiR2V0IG1vZHVsZSBuYW1lIGZyb20gdXNlciBhbmQgb3BlbiBpdC4KKworICAgICAgICBSZXR1cm4gbW9kdWxlIHBhdGggb3IgTm9uZSBmb3IgY2FsbHMgYnkgb3Blbl9jbGFzc19icm93c2VyCisgICAgICAgIHdoZW4gbGF0dGVyIGlzIG5vdCBpbnZva2VkIGluIG5hbWVkIGVkaXRvciB3aW5kb3cuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWCBUaGlzLCBvcGVuX2NsYXNzX2Jyb3dzZXIsIGFuZCBvcGVuX3BhdGhfYnJvd3NlcgorICAgICAgICAjIHdvdWxkIGZpdCBiZXR0ZXIgaW4gaW9tZW51LklPQmluZGluZy4KICAgICAgICAgdHJ5OgotICAgICAgICAgICAgbmFtZSA9IHNlbGYudGV4dC5nZXQoInNlbC5maXJzdCIsICJzZWwubGFzdCIpCisgICAgICAgICAgICBuYW1lID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0Iikuc3RyaXAoKQogICAgICAgICBleGNlcHQgVGNsRXJyb3I6Ci0gICAgICAgICAgICBuYW1lID0gIiIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKLSAgICAgICAgbmFtZSA9IHRrU2ltcGxlRGlhbG9nLmFza3N0cmluZygiTW9kdWxlIiwKLSAgICAgICAgICAgICAgICAgIkVudGVyIHRoZSBuYW1lIG9mIGEgUHl0aG9uIG1vZHVsZVxuIgotICAgICAgICAgICAgICAgICAidG8gc2VhcmNoIG9uIHN5cy5wYXRoIGFuZCBvcGVuOiIsCi0gICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQsIGluaXRpYWx2YWx1ZT1uYW1lKQotICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQotICAgICAgICBpZiBub3QgbmFtZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICAjIFhYWCBPdWdodCB0byBpbnNlcnQgY3VycmVudCBmaWxlJ3MgZGlyZWN0b3J5IGluIGZyb250IG9mIHBhdGgKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQotICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEltcG9ydEVycm9yKSBhcyBtc2c6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJbXBvcnQgZXJyb3IiLCBzdHIobXNnKSwgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzcGVjIGlzIE5vbmU6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJbXBvcnQgZXJyb3IiLCAibW9kdWxlIG5vdCBmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYy5sb2FkZXIsIGltcG9ydGxpYi5hYmMuU291cmNlTG9hZGVyKToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsICJub3QgYSBzb3VyY2UtYmFzZWQgbW9kdWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmaWxlX3BhdGggPSBzcGVjLmxvYWRlci5nZXRfZmlsZW5hbWUobmFtZSkKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWRlciBkb2VzIG5vdCBzdXBwb3J0IGdldF9maWxlbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgc2VsZi5mbGlzdDoKLSAgICAgICAgICAgIHNlbGYuZmxpc3Qub3BlbihmaWxlX3BhdGgpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmlvLmxvYWRmaWxlKGZpbGVfcGF0aCkKKyAgICAgICAgICAgIG5hbWUgPSAnJworICAgICAgICBmaWxlX3BhdGggPSBxdWVyeS5Nb2R1bGVOYW1lKAorICAgICAgICAgICAgICAgIHNlbGYudGV4dCwgIk9wZW4gTW9kdWxlIiwKKyAgICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iCisgICAgICAgICAgICAgICAgInRvIHNlYXJjaCBvbiBzeXMucGF0aCBhbmQgb3BlbjoiLAorICAgICAgICAgICAgICAgIG5hbWUpLnJlc3VsdAorICAgICAgICBpZiBmaWxlX3BhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYuZmxpc3Qub3BlbihmaWxlX3BhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaW8ubG9hZGZpbGUoZmlsZV9wYXRoKQogICAgICAgICByZXR1cm4gZmlsZV9wYXRoCiAKICAgICBkZWYgb3Blbl9jbGFzc19icm93c2VyKHNlbGYsIGV2ZW50PU5vbmUpOgpAQCAtNjczLDEyICs2MDYsMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQodGFpbCkKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBDbGFzc0Jyb3dzZXIKLSAgICAgICAgQ2xhc3NCcm93c2VyLkNsYXNzQnJvd3NlcihzZWxmLmZsaXN0LCBiYXNlLCBbaGVhZF0pCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgYnJvd3NlcgorICAgICAgICBicm93c2VyLkNsYXNzQnJvd3NlcihzZWxmLmZsaXN0LCBiYXNlLCBbaGVhZF0pCiAKICAgICBkZWYgb3Blbl9wYXRoX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgUGF0aEJyb3dzZXIKLSAgICAgICAgUGF0aEJyb3dzZXIuUGF0aEJyb3dzZXIoc2VsZi5mbGlzdCkKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBwYXRoYnJvd3NlcgorICAgICAgICBwYXRoYnJvd3Nlci5QYXRoQnJvd3NlcihzZWxmLmZsaXN0KQogCiAgICAgZGVmIG9wZW5fdHVydGxlX2RlbW8oc2VsZiwgZXZlbnQgPSBOb25lKToKICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKQEAgLTczOSw3ICs2NzIsNyBAQAogCiAgICAgZGVmIFJlc2V0Q29sb3JpemVyKHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSBjb2xvciB0aGVtZSIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBzZWxmLmZpbGVuYW1lX2NoYW5nZV9ob29rIGFuZCBmcm9tIGNvbmZpZ0RpYWxvZy5weQorICAgICAgICAjIENhbGxlZCBmcm9tIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgYW5kIGZyb20gY29uZmlnZGlhbG9nLnB5CiAgICAgICAgIHNlbGYuX3JtY29sb3JpemVyKCkKICAgICAgICAgc2VsZi5fYWRkY29sb3JpemVyKCkKICAgICAgICAgRWRpdG9yV2luZG93LmNvbG9yX2NvbmZpZyhzZWxmLnRleHQpCkBAIC03NTksMTQgKzY5MiwxNCBAQAogCiAgICAgZGVmIFJlc2V0Rm9udChzZWxmKToKICAgICAgICAgIlVwZGF0ZSB0aGUgdGV4dCB3aWRnZXRzJyBmb250IGlmIGl0IGlzIGNoYW5nZWQiCi0gICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CiAKICAgICAgICAgc2VsZi50ZXh0Wydmb250J10gPSBpZGxlQ29uZi5HZXRGb250KHNlbGYucm9vdCwgJ21haW4nLCdFZGl0b3JXaW5kb3cnKQogCiAgICAgZGVmIFJlbW92ZUtleWJpbmRpbmdzKHNlbGYpOgogICAgICAgICAiUmVtb3ZlIHRoZSBrZXliaW5kaW5ncyBiZWZvcmUgdGhleSBhcmUgY2hhbmdlZC4iCi0gICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5Ci0gICAgICAgIHNlbGYuQmluZGluZ3MuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorICAgICAgICAjIENhbGxlZCBmcm9tIGNvbmZpZ2RpYWxvZy5weQorICAgICAgICBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcyA9IGtleWRlZnMgPSBpZGxlQ29uZi5HZXRDdXJyZW50S2V5U2V0KCkKICAgICAgICAgZm9yIGV2ZW50LCBrZXlsaXN0IGluIGtleWRlZnMuaXRlbXMoKToKICAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9kZWxldGUoZXZlbnQsICprZXlsaXN0KQogICAgICAgICBmb3IgZXh0ZW5zaW9uTmFtZSBpbiBzZWxmLmdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoKToKQEAgLTc3Nyw4ICs3MTAsOCBAQAogCiAgICAgZGVmIEFwcGx5S2V5YmluZGluZ3Moc2VsZik6CiAgICAgICAgICJVcGRhdGUgdGhlIGtleWJpbmRpbmdzIGFmdGVyIHRoZXkgYXJlIGNoYW5nZWQiCi0gICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5Ci0gICAgICAgIHNlbGYuQmluZGluZ3MuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorICAgICAgICAjIENhbGxlZCBmcm9tIGNvbmZpZ2RpYWxvZy5weQorICAgICAgICBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcyA9IGtleWRlZnMgPSBpZGxlQ29uZi5HZXRDdXJyZW50S2V5U2V0KCkKICAgICAgICAgc2VsZi5hcHBseV9iaW5kaW5ncygpCiAgICAgICAgIGZvciBleHRlbnNpb25OYW1lIGluIHNlbGYuZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcygpOgogICAgICAgICAgICAgeGtleWRlZnMgPSBpZGxlQ29uZi5HZXRFeHRlbnNpb25CaW5kaW5ncyhleHRlbnNpb25OYW1lKQpAQCAtNzg2LDcgKzcxOSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hcHBseV9iaW5kaW5ncyh4a2V5ZGVmcykKICAgICAgICAgI3VwZGF0ZSBtZW51IGFjY2VsZXJhdG9ycwogICAgICAgICBtZW51RXZlbnREaWN0ID0ge30KLSAgICAgICAgZm9yIG1lbnUgaW4gc2VsZi5CaW5kaW5ncy5tZW51ZGVmczoKKyAgICAgICAgZm9yIG1lbnUgaW4gc2VsZi5tYWlubWVudS5tZW51ZGVmczoKICAgICAgICAgICAgIG1lbnVFdmVudERpY3RbbWVudVswXV0gPSB7fQogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbWVudVsxXToKICAgICAgICAgICAgICAgICBpZiBpdGVtOgpAQCAtODEzLDcgKzc0Niw3IEBACiAKICAgICBkZWYgc2V0X25vdGFic19pbmRlbnR3aWR0aChzZWxmKToKICAgICAgICAgIlVwZGF0ZSB0aGUgaW5kZW50d2lkdGggaWYgY2hhbmdlZCBhbmQgbm90IHVzaW5nIHRhYnMgaW4gdGhpcyB3aW5kb3ciCi0gICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CiAgICAgICAgIGlmIG5vdCBzZWxmLnVzZXRhYnM6CiAgICAgICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0luZGVudCcsJ251bS1zcGFjZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdpbnQnKQpAQCAtOTkzLDcgKzkyNiw3IEBACiAgICAgZGVmIF9jbG9zZShzZWxmKToKICAgICAgICAgaWYgc2VsZi5pby5maWxlbmFtZToKICAgICAgICAgICAgIHNlbGYudXBkYXRlX3JlY2VudF9maWxlc19saXN0KG5ld19maWxlPXNlbGYuaW8uZmlsZW5hbWUpCi0gICAgICAgIFdpbmRvd0xpc3QudW5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLnBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgd2luZG93cy51bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQogICAgICAgICBzZWxmLnVubG9hZF9leHRlbnNpb25zKCkKICAgICAgICAgc2VsZi5pby5jbG9zZSgpCiAgICAgICAgIHNlbGYuaW8gPSBOb25lCkBAIC0xMDMxLDEyICs5NjQsMjUgQEAKICAgICBkZWYgZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcyhzZWxmKToKICAgICAgICAgcmV0dXJuIGlkbGVDb25mLkdldEV4dGVuc2lvbnMoZWRpdG9yX29ubHk9VHJ1ZSkKIAorICAgIGV4dGZpbGVzID0geyAgIyBtYXAgY29uZmlnLWV4dGVuc2lvbiBzZWN0aW9uIG5hbWVzIHRvIG5ldyBmaWxlIG5hbWVzCisgICAgICAgICdBdXRvQ29tcGxldGUnOiAnYXV0b2NvbXBsZXRlJywKKyAgICAgICAgJ0F1dG9FeHBhbmQnOiAnYXV0b2V4cGFuZCcsCisgICAgICAgICdDYWxsVGlwcyc6ICdjYWxsdGlwcycsCisgICAgICAgICdDb2RlQ29udGV4dCc6ICdjb2RlY29udGV4dCcsCisgICAgICAgICdGb3JtYXRQYXJhZ3JhcGgnOiAncGFyYWdyYXBoJywKKyAgICAgICAgJ1BhcmVuTWF0Y2gnOiAncGFyZW5tYXRjaCcsCisgICAgICAgICdSc3RyaXBFeHRlbnNpb24nOiAncnN0cmlwJywKKyAgICAgICAgJ1NjcmlwdEJpbmRpbmcnOiAncnVuc2NyaXB0JywKKyAgICAgICAgJ1pvb21IZWlnaHQnOiAnem9vbWhlaWdodCcsCisgICAgICAgIH0KKwogICAgIGRlZiBsb2FkX2V4dGVuc2lvbihzZWxmLCBuYW1lKToKKyAgICAgICAgZm5hbWUgPSBzZWxmLmV4dGZpbGVzLmdldChuYW1lLCBuYW1lKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbW9kID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJy4nICsgbmFtZSwgcGFja2FnZT1fX3BhY2thZ2VfXykKKyAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLicgKyBmbmFtZSwgcGFja2FnZT1fX3BhY2thZ2VfXykKICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgICAgICAgICAgbW9kID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobmFtZSkKKyAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShmbmFtZSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAgcHJpbnQoIlxuRmFpbGVkIHRvIGltcG9ydCBleHRlbnNpb246ICIsIG5hbWUpCiAgICAgICAgICAgICByYWlzZQpAQCAtMTA2MCw3ICsxMDA2LDcgQEAKIAogICAgIGRlZiBhcHBseV9iaW5kaW5ncyhzZWxmLCBrZXlkZWZzPU5vbmUpOgogICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcwogICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CiAgICAgICAgIHRleHQua2V5ZGVmcyA9IGtleWRlZnMKICAgICAgICAgZm9yIGV2ZW50LCBrZXlsaXN0IGluIGtleWRlZnMuaXRlbXMoKToKQEAgLTEwNzMsOSArMTAxOSw5IEBACiAgICAgICAgIE1lbnVzIHRoYXQgYXJlIGFic2VudCBvciBOb25lIGluIHNlbGYubWVudWRpY3QgYXJlIGlnbm9yZWQuCiAgICAgICAgICIiIgogICAgICAgICBpZiBtZW51ZGVmcyBpcyBOb25lOgotICAgICAgICAgICAgbWVudWRlZnMgPSBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzCisgICAgICAgICAgICBtZW51ZGVmcyA9IHNlbGYubWFpbm1lbnUubWVudWRlZnMKICAgICAgICAgaWYga2V5ZGVmcyBpcyBOb25lOgotICAgICAgICAgICAga2V5ZGVmcyA9IHNlbGYuQmluZGluZ3MuZGVmYXVsdF9rZXlkZWZzCisgICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5tYWlubWVudS5kZWZhdWx0X2tleWRlZnMKICAgICAgICAgbWVudWRpY3QgPSBzZWxmLm1lbnVkaWN0CiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgZm9yIG1uYW1lLCBlbnRyeWxpc3QgaW4gbWVudWRlZnM6CkBAIC0xMzAyLDcgKzEyNDgsNyBAQAogICAgICAgICAgICAgIyBhZGp1c3QgaW5kZW50YXRpb24gZm9yIGNvbnRpbnVhdGlvbnMgYW5kIGJsb2NrCiAgICAgICAgICAgICAjIG9wZW4vY2xvc2UgZmlyc3QgbmVlZCB0byBmaW5kIHRoZSBsYXN0IHN0bXQKICAgICAgICAgICAgIGxubyA9IGluZGV4MmxpbmUodGV4dC5pbmRleCgnaW5zZXJ0JykpCi0gICAgICAgICAgICB5ID0gUHlQYXJzZS5QYXJzZXIoc2VsZi5pbmRlbnR3aWR0aCwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgICAgIHkgPSBweXBhcnNlLlBhcnNlcihzZWxmLmluZGVudHdpZHRoLCBzZWxmLnRhYndpZHRoKQogICAgICAgICAgICAgaWYgbm90IHNlbGYuY29udGV4dF91c2VfcHMxOgogICAgICAgICAgICAgICAgIGZvciBjb250ZXh0IGluIHNlbGYubnVtX2NvbnRleHRfbGluZXM6CiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0YXQgPSBtYXgobG5vIC0gY29udGV4dCwgMSkKQEAgLTEzMjYsMjIgKzEyNzIsMjIgQEAKICAgICAgICAgICAgICAgICB5LnNldF9sbygwKQogCiAgICAgICAgICAgICBjID0geS5nZXRfY29udGludWF0aW9uX3R5cGUoKQotICAgICAgICAgICAgaWYgYyAhPSBQeVBhcnNlLkNfTk9ORToKKyAgICAgICAgICAgIGlmIGMgIT0gcHlwYXJzZS5DX05PTkU6CiAgICAgICAgICAgICAgICAgIyBUaGUgY3VycmVudCBzdG10IGhhc24ndCBlbmRlZCB5ZXQuCi0gICAgICAgICAgICAgICAgaWYgYyA9PSBQeVBhcnNlLkNfU1RSSU5HX0ZJUlNUX0xJTkU6CisgICAgICAgICAgICAgICAgaWYgYyA9PSBweXBhcnNlLkNfU1RSSU5HX0ZJUlNUX0xJTkU6CiAgICAgICAgICAgICAgICAgICAgICMgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgb2YgYSBzdHJpbmc7IGRvIG5vdCBpbmRlbnQgYXQgYWxsCiAgICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICBlbGlmIGMgPT0gUHlQYXJzZS5DX1NUUklOR19ORVhUX0xJTkVTOgorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBweXBhcnNlLkNfU1RSSU5HX05FWFRfTElORVM6CiAgICAgICAgICAgICAgICAgICAgICMgaW5zaWRlIGEgc3RyaW5nIHdoaWNoIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgbGluZTsKICAgICAgICAgICAgICAgICAgICAgIyBqdXN0IG1pbWljIHRoZSBjdXJyZW50IGluZGVudAogICAgICAgICAgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgaW5kZW50KQotICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfQlJBQ0tFVDoKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gcHlwYXJzZS5DX0JSQUNLRVQ6CiAgICAgICAgICAgICAgICAgICAgICMgbGluZSB1cCB3aXRoIHRoZSBmaXJzdCAoaWYgYW55KSBlbGVtZW50IG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAjIGxhc3Qgb3BlbiBicmFja2V0IHN0cnVjdHVyZTsgZWxzZSBpbmRlbnQgb25lCiAgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgYmV5b25kIHRoZSBpbmRlbnQgb2YgdGhlIGxpbmUgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgIyBsYXN0IG9wZW4gYnJhY2tldAogICAgICAgICAgICAgICAgICAgICBzZWxmLnJlaW5kZW50X3RvKHkuY29tcHV0ZV9icmFja2V0X2luZGVudCgpKQotICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfQkFDS1NMQVNIOgorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBweXBhcnNlLkNfQkFDS1NMQVNIOgogICAgICAgICAgICAgICAgICAgICAjIGlmIG1vcmUgdGhhbiBvbmUgbGluZSBpbiB0aGlzIHN0bXQgYWxyZWFkeSwganVzdAogICAgICAgICAgICAgICAgICAgICAjIG1pbWljIHRoZSBjdXJyZW50IGluZGVudDsgZWxzZSBpZiBpbml0aWFsIGxpbmUKICAgICAgICAgICAgICAgICAgICAgIyBoYXMgYSBzdGFydCBvbiBhbiBhc3NpZ25tZW50IHN0bXQsIGluZGVudCB0bwpAQCAtMTY0NCw3ICsxNTkwLDcgQEAKICAgICBrZXlsaXN0ID0ga2V5ZGVmcy5nZXQoZXZlbnRuYW1lKQogICAgICMgaXNzdWUxMDk0MDogdGVtcG9yYXJ5IHdvcmthcm91bmQgdG8gcHJldmVudCBoYW5nIHdpdGggT1MgWCBDb2NvYSBUayA4LjUKICAgICAjIGlmIG5vdCBrZXlsaXN0OgotICAgIGlmIChub3Qga2V5bGlzdCkgb3IgKG1hY29zeFN1cHBvcnQuaXNDb2NvYVRrKCkgYW5kIGV2ZW50bmFtZSBpbiB7CisgICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4LmlzQ29jb2FUaygpIGFuZCBldmVudG5hbWUgaW4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PG9wZW4tbW9kdWxlPj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGdvdG8tbGluZT4+IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDxjaGFuZ2UtaW5kZW50d2lkdGg+PiJ9KToKQEAgLTE2NzksMTIgKzE2MjUsMTUgQEAKICAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIGZpbGVuYW1lID0gTm9uZQotICAgIG1hY29zeFN1cHBvcnQuc2V0dXBBcHAocm9vdCwgTm9uZSkKKyAgICBtYWNvc3guc2V0dXBBcHAocm9vdCwgTm9uZSkKICAgICBlZGl0ID0gRWRpdG9yV2luZG93KHJvb3Q9cm9vdCwgZmlsZW5hbWU9ZmlsZW5hbWUpCiAgICAgZWRpdC50ZXh0LmJpbmQoIjw8Y2xvc2UtYWxsLXdpbmRvd3M+PiIsIGVkaXQuY2xvc2VfZXZlbnQpCiAgICAgIyBEb2VzIG5vdCBzdG9wIGVycm9yLCBuZWl0aGVyIGRvZXMgZm9sbG93aW5nCiAgICAgIyBlZGl0LnRleHQuYmluZCgiPDxjbG9zZS13aW5kb3c+PiIsIGVkaXQuY2xvc2VfZXZlbnQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9lZGl0b3InLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfZWRpdG9yX3dpbmRvdykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0ZpbGVMaXN0LnB5IGIvTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvRmlsZUxpc3QucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2ZpbGVsaXN0LnB5CmluZGV4IGE5OTg5YTguLmI1YWY5MGNjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9GaWxlTGlzdC5weQorKysgYi9MaWIvaWRsZWxpYi9maWxlbGlzdC5weQpAQCAtNiw3ICs2LDcgQEAKIGNsYXNzIEZpbGVMaXN0OgogCiAgICAgIyBOLkIuIHRoaXMgaW1wb3J0IG92ZXJyaWRkZW4gaW4gUHlTaGVsbEZpbGVMaXN0LgotICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworICAgIGZyb20gaWRsZWxpYi5lZGl0b3IgaW1wb3J0IEVkaXRvcldpbmRvdwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgogICAgICAgICBzZWxmLnJvb3QgPSByb290CkBAIC0xMTEsNyArMTExLDcgQEAKIAogCiBkZWYgX3Rlc3QoKToKLSAgICBmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBmaXh3b3JkYnJlYWtzCisgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgZml4d29yZGJyZWFrcwogICAgIGltcG9ydCBzeXMKICAgICByb290ID0gVGsoKQogICAgIGZpeHdvcmRicmVha3Mocm9vdCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0dyZXBEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9ncmVwLnB5CnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0dyZXBEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2dyZXAucHkKaW5kZXggNzIxYjIzMS4uNjMyNGI0ZiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9ncmVwLnB5CkBAIC0zLDE1ICszLDE0IEBACiBpbXBvcnQgcmUgICMgZm9yIGh0ZXN0CiBpbXBvcnQgc3lzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFN0cmluZ1ZhciwgQm9vbGVhblZhciwgQ2hlY2tidXR0b24gICMgZm9yIEdyZXBEaWFsb2cKLWZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQsIEJ1dHRvbiwgU0VMLCBFTkQgICMgZm9yIGh0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZQotZnJvbSBpZGxlbGliLlNlYXJjaERpYWxvZ0Jhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lCitmcm9tIGlkbGVsaWIuc2VhcmNoYmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQogIyBJbXBvcnRpbmcgT3V0cHV0V2luZG93IGZhaWxzIGR1ZSB0byBpbXBvcnQgbG9vcAogIyBFZGl0b3JXaW5kb3cgLT4gR3JlcERpYWxvcCAtPiBPdXRwdXRXaW5kb3cgLT4gRWRpdG9yV2luZG93CiAKIGRlZiBncmVwKHRleHQsIGlvPU5vbmUsIGZsaXN0PU5vbmUpOgogICAgIHJvb3QgPSB0ZXh0Ll9yb290KCkKLSAgICBlbmdpbmUgPSBTZWFyY2hFbmdpbmUuZ2V0KHJvb3QpCisgICAgZW5naW5lID0gc2VhcmNoZW5naW5lLmdldChyb290KQogICAgIGlmIG5vdCBoYXNhdHRyKGVuZ2luZSwgIl9ncmVwZGlhbG9nIik6CiAgICAgICAgIGVuZ2luZS5fZ3JlcGRpYWxvZyA9IEdyZXBEaWFsb2cocm9vdCwgZW5naW5lLCBmbGlzdCkKICAgICBkaWFsb2cgPSBlbmdpbmUuX2dyZXBkaWFsb2cKQEAgLTY3LDcgKzY2LDcgQEAKICAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgICBzZWxmLnRvcC5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBmcm9tIGlkbGVsaWIuT3V0cHV0V2luZG93IGltcG9ydCBPdXRwdXRXaW5kb3cgICMgbGVhdmUgaGVyZSEKKyAgICAgICAgZnJvbSBpZGxlbGliLm91dHdpbiBpbXBvcnQgT3V0cHV0V2luZG93ICAjIGxlYXZlIGhlcmUhCiAgICAgICAgIHNhdmUgPSBzeXMuc3Rkb3V0CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBPdXRwdXRXaW5kb3coc2VsZi5mbGlzdCkKQEAgLTEzMSwxNCArMTMwLDE1IEBACiAKIAogZGVmIF9ncmVwX2RpYWxvZyhwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgZnJvbSBpZGxlbGliLlB5U2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBHcmVwRGlhbG9nIikKKyAgICBmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0CisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgVGV4dCwgQnV0dG9uLCBTRUwsIEVORAorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgR3JlcERpYWxvZyIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCiAKLSAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQotICAgIHRleHQgPSBUZXh0KHJvb3QsIGhlaWdodD01KQorICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHRvcCkKKyAgICB0ZXh0ID0gVGV4dCh0b3AsIGhlaWdodD01KQogICAgIHRleHQucGFjaygpCiAKICAgICBkZWYgc2hvd19ncmVwX2RpYWxvZygpOgpAQCAtMTQ2LDkgKzE0Niw4IEBACiAgICAgICAgIGdyZXAodGV4dCwgZmxpc3Q9Zmxpc3QpCiAgICAgICAgIHRleHQudGFnX3JlbW92ZShTRUwsICIxLjAiLCBFTkQpCiAKLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iU2hvdyBHcmVwRGlhbG9nIiwgY29tbWFuZD1zaG93X2dyZXBfZGlhbG9nKQorICAgIGJ1dHRvbiA9IEJ1dHRvbih0b3AsIHRleHQ9IlNob3cgR3JlcERpYWxvZyIsIGNvbW1hbmQ9c2hvd19ncmVwX2RpYWxvZykKICAgICBidXR0b24ucGFjaygpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnB5IGIvTGliL2lkbGVsaWIvaGVscC5weQppbmRleCBkMGM1OWM1Li5kMThkMWNhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9oZWxwLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHAucHkKQEAgLTQsNyArNCw3IEBACiAKIEhlbHAgPT4gQWJvdXQgSURMRTogZGlwbGF5IEFib3V0IElkbGUgZGlhbG9nCiAKLTx0byBiZSBtb3ZlZCBoZXJlIGZyb20gYWJvdXREaWFsb2cucHk+Cis8dG8gYmUgbW92ZWQgaGVyZSBmcm9tIGhlbHBfYWJvdXQucHk+CiAKIAogSGVscCA9PiBJRExFIEhlbHA6IERpc3BsYXkgaGVscC5odG1sIHdpdGggcHJvcGVyIGZvcm1hdHRpbmcuCkBAIC0yNSwxNCArMjUsMTEgQEAKIHNob3dfaWRsZWhlbHAgLSBDcmVhdGUgSGVscFdpbmRvdy4gIENhbGxlZCBpbiBFZGl0b3JXaW5kb3cuaGVscF9kaWFsb2cuCiAiIiIKIGZyb20gaHRtbC5wYXJzZXIgaW1wb3J0IEhUTUxQYXJzZXIKLWZyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgaXNkaXIsIGlzZmlsZSwgam9pbgotZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVG9wbGV2ZWwsIEZyYW1lLCBUZXh0LCBTY3JvbGxiYXIsIE1lbnUsIE1lbnVidXR0b24KK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgaXNmaWxlLCBqb2luCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZSwgVGV4dCwgTWVudQorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgTWVudWJ1dHRvbiwgU2Nyb2xsYmFyCiBmcm9tIHRraW50ZXIgaW1wb3J0IGZvbnQgYXMgdGtmb250Ci1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKLQotdXNlX3R0ayA9IEZhbHNlICMgdW50aWwgYXZhaWxhYmxlIHRvIGltcG9ydAotaWYgdXNlX3R0azoKLSAgICBmcm9tIHRraW50ZXIudHRrIGltcG9ydCBNZW51YnV0dG9uCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiAjIyBBYm91dCBJRExFICMjCiAKQEAgLTE5NiwxNSArMTkzLDE4IEBACiAgICAgIkRpc3BsYXkgaHRtbCB0ZXh0LCBzY3JvbGxiYXIsIGFuZCB0b2MuIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIGZpbGVuYW1lKToKICAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgcGFyZW50KQotICAgICAgICB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCisgICAgICAgICMga2VlcCByZWZlcmVuY2VzIHRvIHdpZGdldHMgZm9yIHRlc3QgYWNjZXNzLgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gSGVscFRleHQoc2VsZiwgZmlsZW5hbWUpCiAgICAgICAgIHNlbGZbJ2JhY2tncm91bmQnXSA9IHRleHRbJ2JhY2tncm91bmQnXQotICAgICAgICBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQorICAgICAgICBzZWxmLnRvYyA9IHRvYyA9IHNlbGYudG9jX21lbnUodGV4dCkKKyAgICAgICAgc2VsZi5zY3JvbGwgPSBzY3JvbGwgPSBTY3JvbGxiYXIoc2VsZiwgY29tbWFuZD10ZXh0Lnl2aWV3KQogICAgICAgICB0ZXh0Wyd5c2Nyb2xsY29tbWFuZCddID0gc2Nyb2xsLnNldAorCiAgICAgICAgIHNlbGYucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQogICAgICAgICBzZWxmLmNvbHVtbmNvbmZpZ3VyZSgxLCB3ZWlnaHQ9MSkgICMgdGV4dAotICAgICAgICBzZWxmLnRvY19tZW51KHRleHQpLmdyaWQoY29sdW1uPTAsIHJvdz0wLCBzdGlja3k9J253JykKLSAgICAgICAgdGV4dC5ncmlkKGNvbHVtbj0xLCByb3c9MCwgc3RpY2t5PSduc2V3JykKLSAgICAgICAgc2Nyb2xsLmdyaWQoY29sdW1uPTIsIHJvdz0wLCBzdGlja3k9J25zJykKKyAgICAgICAgdG9jLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9J253JykKKyAgICAgICAgdGV4dC5ncmlkKHJvdz0wLCBjb2x1bW49MSwgc3RpY2t5PSduc2V3JykKKyAgICAgICAgc2Nyb2xsLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9J25zJykKIAogICAgIGRlZiB0b2NfbWVudShzZWxmLCB0ZXh0KToKICAgICAgICAgIkNyZWF0ZSB0YWJsZSBvZiBjb250ZW50cyBhcyBkcm9wLWRvd24gbWVudS4iCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICBpZiBub3QgaXNmaWxlKGZpbGVuYW1lKToKICAgICAgICAgIyB0cnkgY29weV9zdHJpcCwgcHJlc2VudCBtZXNzYWdlCiAgICAgICAgIHJldHVybgotICAgIEhlbHBXaW5kb3cocGFyZW50LCBmaWxlbmFtZSwgJ0lETEUgSGVscCcpCisgICAgcmV0dXJuIEhlbHBXaW5kb3cocGFyZW50LCBmaWxlbmFtZSwgJ0lETEUgSGVscCcpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9oZWxwLnR4dCBiL0xpYi9pZGxlbGliL2hlbHAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWZiZTBiLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2hlbHAudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMzcyICswLDAgQEAKLVRoaXMgZmlsZSwgaWRsZWxpYi9oZWxwLnR4dCBpcyBvdXQtb2YtZGF0ZSBhbmQgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS4KLUl0IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBwb3NzaWJseSBpbiAzLjYKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotW1NlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgKiogVElQUyAqKiBvbiB1c2luZyBJRExFICEhXQotCi1JRExFIGlzIHRoZSBQeXRob24gSURFIGJ1aWx0IHdpdGggdGhlIHRraW50ZXIgR1VJIHRvb2xraXQuCi0KLUlETEUgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6Ci0tY29kZWQgaW4gMTAwJSBwdXJlIFB5dGhvbiwgdXNpbmcgdGhlIHRraW50ZXIgR1VJIHRvb2xraXQKLS1jcm9zcy1wbGF0Zm9ybTogd29ya3Mgb24gV2luZG93cywgVW5peCwgYW5kIE9TIFgKLS1tdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZywgc21hcnQgaW5kZW50LAotY2FsbCB0aXBzLCBhbmQgbWFueSBvdGhlciBmZWF0dXJlcwotLVB5dGhvbiBzaGVsbCB3aW5kb3cgKGEuay5hIGludGVyYWN0aXZlIGludGVycHJldGVyKQotLWRlYnVnZ2VyIChub3QgY29tcGxldGUsIGJ1dCB5b3UgY2FuIHNldCBicmVha3BvaW50cywgdmlldyBhbmQgc3RlcCkKLQotTWVudXM6Ci0KLUlETEUgaGFzIHR3byB3aW5kb3cgdHlwZXMgdGhlIFNoZWxsIHdpbmRvdyBhbmQgdGhlIEVkaXRvciB3aW5kb3cuIEl0IGlzCi1wb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGVkaXRvciB3aW5kb3dzIHNpbXVsdGFuZW91c2x5LiBJRExFJ3MKLW1lbnVzIGR5bmFtaWNhbGx5IGNoYW5nZSBiYXNlZCBvbiB3aGljaCB3aW5kb3cgaXMgY3VycmVudGx5IHNlbGVjdGVkLiBFYWNoIG1lbnUKLWRvY3VtZW50ZWQgYmVsb3cgaW5kaWNhdGVzIHdoaWNoIHdpbmRvdyB0eXBlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gCi0KLUZpbGUgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgTmV3IEZpbGUgICAgICAgICAtLSBDcmVhdGUgYSBuZXcgZmlsZSBlZGl0aW5nIHdpbmRvdwotICAgICAgICBPcGVuLi4uICAgICAgICAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgZmlsZQotICAgICAgICBPcGVuIE1vZHVsZS4uLiAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgbW9kdWxlIChzZWFyY2hlcyBzeXMucGF0aCkKLSAgICAgICAgUmVjZW50IEZpbGVzLi4uICAtLSBPcGVuIGEgbGlzdCBvZiByZWNlbnQgZmlsZXMKLSAgICAgICAgQ2xhc3MgQnJvd3NlciAgICAtLSBTaG93IGNsYXNzZXMgYW5kIG1ldGhvZHMgaW4gY3VycmVudCBmaWxlCi0gICAgICAgIFBhdGggQnJvd3NlciAgICAgLS0gU2hvdyBzeXMucGF0aCBkaXJlY3RvcmllcywgbW9kdWxlcywgY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWV0aG9kcwotICAgICAgICAtLS0KLSAgICAgICAgU2F2ZSAgICAgICAgICAgICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIHRoZSBhc3NvY2lhdGVkIGZpbGUgKHVuc2F2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIGhhdmUgYSAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdpbmRvdyB0aXRsZSkKLQotICAgICAgICBTYXZlIEFzLi4uICAgICAgIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gbmV3IGZpbGUsIHdoaWNoIGJlY29tZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBmaWxlCi0gICAgICAgIFNhdmUgQ29weSBBcy4uLiAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byBkaWZmZXJlbnQgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFzc29jaWF0ZWQgZmlsZQotICAgICAgICAtLS0KLSAgICAgICAgUHJpbnQgV2luZG93ICAgICAtLSBQcmludCB0aGUgY3VycmVudCB3aW5kb3cKLSAgICAgICAgLS0tCi0gICAgICAgIENsb3NlICAgICAgICAgICAgLS0gQ2xvc2UgY3VycmVudCB3aW5kb3cgKGFza3MgdG8gc2F2ZSBpZiB1bnNhdmVkKQotICAgICAgICBFeGl0ICAgICAgICAgICAgIC0tIENsb3NlIGFsbCB3aW5kb3dzLCBxdWl0IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKLQotRWRpdCBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBVbmRvICAgICAgICAgICAgIC0tIFVuZG8gbGFzdCBjaGFuZ2UgdG8gY3VycmVudCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYSBtYXhpbXVtIG9mIDEwMDAgY2hhbmdlcyBtYXkgYmUgdW5kb25lKQotICAgICAgICBSZWRvICAgICAgICAgICAgIC0tIFJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93Ci0gICAgICAgIC0tLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZWxlY3QgQWxsICAgICAgIC0tIFNlbGVjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJ1ZmZlcgotICAgICAgICAtLS0KLSAgICAgICAgRmluZC4uLiAgICAgICAgICAtLSBPcGVuIGEgc2VhcmNoIGRpYWxvZyBib3ggd2l0aCBtYW55IG9wdGlvbnMKLSAgICAgICAgRmluZCBBZ2FpbiAgICAgICAtLSBSZXBlYXQgbGFzdCBzZWFyY2gKLSAgICAgICAgRmluZCBTZWxlY3Rpb24gICAtLSBTZWFyY2ggZm9yIHRoZSBzdHJpbmcgaW4gdGhlIHNlbGVjdGlvbgotICAgICAgICBGaW5kIGluIEZpbGVzLi4uIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCBmb3Igc2VhcmNoaW5nIGZpbGVzCi0gICAgICAgIFJlcGxhY2UuLi4gICAgICAgLS0gT3BlbiBhIHNlYXJjaC1hbmQtcmVwbGFjZSBkaWFsb2cgYm94Ci0gICAgICAgIEdvIHRvIExpbmUgICAgICAgLS0gQXNrIGZvciBhIGxpbmUgbnVtYmVyIGFuZCBzaG93IHRoYXQgbGluZQotICAgICAgICBFeHBhbmQgV29yZCAgICAgIC0tIEV4cGFuZCB0aGUgd29yZCB5b3UgaGF2ZSB0eXBlZCB0byBtYXRjaCBhbm90aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZCBpbiB0aGUgc2FtZSBidWZmZXI7IHJlcGVhdCB0byBnZXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBleHBhbnNpb24KLSAgICAgICAgU2hvdyBDYWxsdGlwICAgICAtLSBBZnRlciBhbiB1bmNsb3NlZCBwYXJlbnRoZXNpcyBmb3IgYSBmdW5jdGlvbiwgb3BlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc21hbGwgd2luZG93IHdpdGggZnVuY3Rpb24gcGFyYW1ldGVyIGhpbnRzCi0gICAgICAgIFNob3cgUGFyZW5zICAgICAgLS0gSGlnaGxpZ2h0IHRoZSBzdXJyb3VuZGluZyBwYXJlbnRoZXNpcwotICAgICAgICBTaG93IENvbXBsZXRpb25zIC0tIE9wZW4gYSBzY3JvbGwgd2luZG93IGFsbG93aW5nIHNlbGVjdGlvbiBrZXl3b3JkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhdHRyaWJ1dGVzLiAoc2VlICcqVElQUyonLCBiZWxvdykKLQotRm9ybWF0IE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgSW5kZW50IFJlZ2lvbiAgICAgICAtLSBTaGlmdCBzZWxlY3RlZCBsaW5lcyByaWdodCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIERlZGVudCBSZWdpb24gICAgICAgLS0gU2hpZnQgc2VsZWN0ZWQgbGluZXMgbGVmdCBieSB0aGUgaW5kZW50IHdpZHRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQgNCBzcGFjZXMpCi0gICAgICAgIENvbW1lbnQgT3V0IFJlZ2lvbiAgLS0gSW5zZXJ0ICMjIGluIGZyb250IG9mIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFVuY29tbWVudCBSZWdpb24gICAgLS0gUmVtb3ZlIGxlYWRpbmcgIyBvciAjIyBmcm9tIHNlbGVjdGVkIGxpbmVzCi0gICAgICAgIFRhYmlmeSBSZWdpb24gICAgICAgLS0gVHVybnMgKmxlYWRpbmcqIHN0cmV0Y2hlcyBvZiBzcGFjZXMgaW50byB0YWJzLgotICAgICAgICAgICAgICAgIChOb3RlOiBXZSByZWNvbW1lbmQgdXNpbmcgNCBzcGFjZSBibG9ja3MgdG8gaW5kZW50IFB5dGhvbiBjb2RlLikKLSAgICAgICAgVW50YWJpZnkgUmVnaW9uICAgICAtLSBUdXJuICphbGwqIHRhYnMgaW50byB0aGUgY29ycmVudCBudW1iZXIgb2Ygc3BhY2VzCi0gICAgICAgIFRvZ2dsZSB0YWJzICAgICAgICAgLS0gT3BlbiBhIGRpYWxvZyB0byBzd2l0Y2ggYmV0d2VlbiBpbmRlbnRpbmcgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyBhbmQgdGFicy4KLSAgICAgICAgTmV3IEluZGVudCBXaWR0aC4uLiAtLSBPcGVuIGEgZGlhbG9nIHRvIGNoYW5nZSBpbmRlbnQgd2lkdGguICBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZCBkZWZhdWx0IGJ5IHRoZSBQeXRob24gY29tbXVuaXR5IGlzIDQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMuCi0gICAgICAgIEZvcm1hdCBQYXJhZ3JhcGggICAgLS0gUmVmb3JtYXQgdGhlIGN1cnJlbnQgYmxhbmstbGluZS1zZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhZ3JhcGguIEFsbCBsaW5lcyBpbiB0aGUgcGFyYWdyYXBoIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgdG8gbGVzcyB0aGFuIDgwIGNvbHVtbnMuCi0gICAgICAgIC0tLQotICAgICAgICBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIC0tIFJlbW92ZWQgYW55IHNwYWNlIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5vbi1zcGFjZSBjaGFyYWN0ZXIKLQotUnVuIE1lbnUgKEVkaXRvciB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgUHl0aG9uIFNoZWxsIC0tIE9wZW4gb3Igd2FrZSB1cCB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgQ2hlY2sgTW9kdWxlIC0tIENoZWNrIHRoZSBzeW50YXggb2YgdGhlIG1vZHVsZSBjdXJyZW50bHkgb3BlbiBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIEVkaXRvciB3aW5kb3cuICBJZiB0aGUgbW9kdWxlIGhhcyBub3QgYmVlbiBzYXZlZCBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlIHRoZSBjb2RlLgotICAgICAgICBSdW4gTW9kdWxlICAgLS0gUmVzdGFydCB0aGUgc2hlbGwgdG8gY2xlYW4gdGhlIGVudmlyb25tZW50LCB0aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlIHRoZSBjdXJyZW50bHkgb3BlbiBtb2R1bGUuIElmIHRoZSBtb2R1bGUgaGFzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgYmVlbiBzYXZlZCBJRExFIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLgotCi1TaGVsbCBNZW51IChTaGVsbCB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgVmlldyBMYXN0IFJlc3RhcnQgLS0gU2Nyb2xsIHRoZSBzaGVsbCB3aW5kb3cgdG8gdGhlIGxhc3QgU2hlbGwgcmVzdGFydAotICAgICAgICBSZXN0YXJ0IFNoZWxsICAgICAtLSBSZXN0YXJ0IHRoZSBzaGVsbCB0byBjbGVhbiB0aGUgZW52aXJvbm1lbnQKLQotRGVidWcgTWVudSAoU2hlbGwgd2luZG93IG9ubHkpOgotCi0gICAgICAgIEdvIHRvIEZpbGUvTGluZSAgIC0tIExvb2sgYXJvdW5kIHRoZSBpbnNlcnQgcG9pbnQgZm9yIGEgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyLCBvcGVuIHRoZSBmaWxlLCBhbmQgc2hvdyB0aGUgbGluZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIHRvIHZpZXcgdGhlIHNvdXJjZSBsaW5lcyByZWZlcmVuY2VkIGluIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiB0cmFjZWJhY2suICBBdmFpbGFibGUgaW4gdGhlIGNvbnRleHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudSBvZiB0aGUgU2hlbGwgd2luZG93LgotICAgICAgICBEZWJ1Z2dlciAodG9nZ2xlKSAtLSBUaGlzIGZlYXR1cmUgaXMgbm90IGNvbXBsZXRlIGFuZCBjb25zaWRlcmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRhbC4gUnVuIGNvbW1hbmRzIGluIHRoZSBzaGVsbCB1bmRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdnZXIuCi0gICAgICAgIFN0YWNrIFZpZXdlciAgICAgIC0tIFNob3cgdGhlIHN0YWNrIHRyYWNlYmFjayBvZiB0aGUgbGFzdCBleGNlcHRpb24KLSAgICAgICAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAodG9nZ2xlKSAtLSBUb2dnbGUgYXV0b21hdGljYWxseSBvcGVuaW5nIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIHZpZXdlciBvbiB1bmhhbmRsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24KLQotT3B0aW9ucyBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBDb25maWd1cmUgSURMRSAtLSBPcGVuIGEgY29uZmlndXJhdGlvbiBkaWFsb2cuICBGb250cywgaW5kZW50YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleWJpbmRpbmdzLCBhbmQgY29sb3IgdGhlbWVzIG1heSBiZSBhbHRlcmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydHVwIFByZWZlcmVuY2VzIG1heSBiZSBzZXQsIGFuZCBhZGRpdGlvbmFsIEhlbHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcyBjYW4gYmUgc3BlY2lmaWVkLiAgT24gT1MgWCwgb3BlbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBkaWFsb2cgYnkgc2VsZWN0aW5nIFByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgotCi0gICAgICAgIC0tLQotICAgICAgICBDb2RlIENvbnRleHQgKHRvZ2dsZSkgLS0gT3BlbiBhIHBhbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdCB3aW5kb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHNob3dzIHRoZSBibG9jayBjb250ZXh0IG9mIHRoZSBzZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb2RlIHdoaWNoIGlzIHNjcm9sbGluZyBvZmYgdGhlIHRvcCBvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy4gVGhpcyBpcyBub3QgcHJlc2VudCBpbiB0aGUgU2hlbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBvbmx5IHRoZSBFZGl0b3Igd2luZG93LgotCi1XaW5kb3cgTWVudSAoU2hlbGwgYW5kIEVkaXRvcik6Ci0KLSAgICAgICAgWm9vbSBIZWlnaHQgLS0gVG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gbm9ybWFsIHNpemUgKDQweDgwIGluaXRpYWwKLSAgICAgICAgc2V0dGluZykgYW5kIG1heGltdW0gaGVpZ2h0LiAgVGhlIGluaXRpYWwgc2l6ZSBpcyBpbiB0aGUgQ29uZmlndXJlCi0gICAgICAgIElETEUgZGlhbG9nIHVuZGVyIHRoZSBnZW5lcmFsIHRhYi4KLSAgICAgICAgLS0tCi0gICAgICAgIFRoZSByZXN0IG9mIHRoaXMgbWVudSBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIG9wZW4gd2luZG93czsKLSAgICAgICAgc2VsZWN0IG9uZSB0byBicmluZyBpdCB0byB0aGUgZm9yZWdyb3VuZCAoZGVpY29uaWZ5aW5nIGl0IGlmCi0gICAgICAgIG5lY2Vzc2FyeSkuCi0KLUhlbHAgTWVudToKLQotICAgICAgICBBYm91dCBJRExFICAtLSBWZXJzaW9uLCBjb3B5cmlnaHQsIGxpY2Vuc2UsIGNyZWRpdHMKLSAgICAgICAgLS0tCi0gICAgICAgIElETEUgSGVscCAgIC0tIERpc3BsYXkgdGhpcyBmaWxlIHdoaWNoIGlzIGEgaGVscCBmaWxlIGZvciBJRExFCi0gICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGluZyB0aGUgbWVudSBvcHRpb25zLCBiYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3RoZXIgdGlwcy4KLSAgICAgICAgUHl0aG9uIERvY3MgLS0gQWNjZXNzIGxvY2FsIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpZgotICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQuICBPciB3aWxsIHN0YXJ0IGEgd2ViIGJyb3dzZXIgYW5kIG9wZW4KLSAgICAgICAgICAgICAgICAgICAgICAgZG9jcy5weXRob24ub3JnIHNob3dpbmcgdGhlIGxhdGVzdCBQeXRob24gZG9jdW1lbnRhdGlvbi4KLSAgICAgICAgLS0tCi0gICAgICAgIEFkZGl0aW9uYWwgaGVscCBzb3VyY2VzIG1heSBiZSBhZGRlZCBoZXJlIHdpdGggdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUgR2VuZXJhbCB0YWIuCi0KLUVkaXRvciBjb250ZXh0IG1lbnUgKFJpZ2h0LWNsaWNrIC8gQ29udHJvbC1jbGljayBvbiBPUyBYIGluIEVkaXQgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICBTZXQgQnJlYWtwb2ludCAgIC0tIFNldHMgYSBicmVha3BvaW50LiBCcmVha3BvaW50cyBhcmUgb25seSBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgZGVidWdnZXIgaXMgb3Blbi4KLSAgICAgICAgQ2xlYXIgQnJlYWtwb2ludCAtLSBDbGVhcnMgdGhlIGJyZWFrcG9pbnQgb24gdGhhdCBsaW5lCi0KLVNoZWxsIGNvbnRleHQgbWVudSAoUmlnaHQtY2xpY2sgLyBDb250cm9sLWNsaWNrIG9uIE9TIFggaW4gU2hlbGwgd2luZG93KToKLQotICAgICAgICBDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgotICAgICAgICBDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCi0gICAgICAgIFBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgR28gdG8gZmlsZS9saW5lICAtLSBTYW1lIGFzIGluIERlYnVnIG1lbnUKLQotCi0qKiBUSVBTICoqCi09PT09PT09PT09Ci0KLUFkZGl0aW9uYWwgSGVscCBTb3VyY2VzOgotCi0gICAgICAgIFdpbmRvd3MgdXNlcnMgY2FuIEdvb2dsZSBvbiB6b3Blc2hlbGYuY2htIHRvIGFjY2VzcyBab3BlIGhlbHAgZmlsZXMgaW4KLSAgICAgICAgdGhlIFdpbmRvd3MgaGVscCBmb3JtYXQuICBUaGUgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgZmVhdHVyZSBvZiB0aGUKLSAgICAgICAgY29uZmlndXJhdGlvbiBHVUkgc3VwcG9ydHMgLmNobSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXR5cGVzCi0gICAgICAgIHN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuICBTdXBwbHkgYSBNZW51IEl0ZW0gdGl0bGUsIGFuZCBlbnRlciB0aGUKLSAgICAgICAgbG9jYXRpb24gaW4gdGhlIEhlbHAgRmlsZSBQYXRoIHNsb3Qgb2YgdGhlIE5ldyBIZWxwIFNvdXJjZSBkaWFsb2cuICBVc2UKLSAgICAgICAgaHR0cDovLyBhbmQvb3Igd3d3LiB0byBpZGVudGlmeSBleHRlcm5hbCBVUkxzLCBvciBkb3dubG9hZCB0aGUgZmlsZSBhbmQKLSAgICAgICAgYnJvd3NlIGZvciBpdHMgcGF0aCBvbiB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIEJyb3dzZSBidXR0b24uCi0KLSAgICAgICAgQWxsIHVzZXJzIGNhbiBhY2Nlc3MgdGhlIGV4dGVuc2l2ZSBzb3VyY2VzIG9mIGhlbHAsIGluY2x1ZGluZwotICAgICAgICB0dXRvcmlhbHMsIGF2YWlsYWJsZSBhdCBkb2NzLnB5dGhvbi5vcmcuICBTZWxlY3RlZCBVUkxzIGNhbiBiZSBhZGRlZAotICAgICAgICBvciByZW1vdmVkIGZyb20gdGhlIEhlbHAgbWVudSBhdCBhbnkgdGltZSB1c2luZyBDb25maWd1cmUgSURMRS4KLQotQmFzaWMgZWRpdGluZyBhbmQgbmF2aWdhdGlvbjoKLQotICAgICAgICBCYWNrc3BhY2UgZGVsZXRlcyBjaGFyIHRvIHRoZSBsZWZ0OyBERUwgZGVsZXRlcyBjaGFyIHRvIHRoZSByaWdodC4KLSAgICAgICAgQ29udHJvbC1iYWNrc3BhY2UgZGVsZXRlcyB3b3JkIGxlZnQsIENvbnRyb2wtREVMIGRlbGV0ZXMgd29yZCByaWdodC4KLSAgICAgICAgQXJyb3cga2V5cyBhbmQgUGFnZSBVcC9Eb3duIG1vdmUgYXJvdW5kLgotICAgICAgICBDb250cm9sLWxlZnQvcmlnaHQgQXJyb3cgbW92ZXMgYnkgd29yZHMgaW4gYSBzdHJhbmdlIGJ1dCB1c2VmdWwgd2F5LgotICAgICAgICBIb21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgbGluZS4KLSAgICAgICAgQ29udHJvbC1Ib21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgZmlsZS4KLSAgICAgICAgU29tZSB1c2VmdWwgRW1hY3MgYmluZGluZ3MgYXJlIGluaGVyaXRlZCBmcm9tIFRjbC9UazoKLSAgICAgICAgICAgICAgICBDb250cm9sLWEgICAgIGJlZ2lubmluZyBvZiBsaW5lCi0gICAgICAgICAgICAgICAgQ29udHJvbC1lICAgICBlbmQgb2YgbGluZQotICAgICAgICAgICAgICAgIENvbnRyb2wtayAgICAga2lsbCBsaW5lIChidXQgZG9lc24ndCBwdXQgaXQgaW4gY2xpcGJvYXJkKQotICAgICAgICAgICAgICAgIENvbnRyb2wtbCAgICAgY2VudGVyIHdpbmRvdyBhcm91bmQgdGhlIGluc2VydGlvbiBwb2ludAotICAgICAgICBTdGFuZGFyZCBrZXliaW5kaW5ncyAobGlrZSBDb250cm9sLWMgdG8gY29weSBhbmQgQ29udHJvbC12IHRvCi0gICAgICAgIHBhc3RlKSBtYXkgd29yay4gIEtleWJpbmRpbmdzIGFyZSBzZWxlY3RlZCBpbiB0aGUgQ29uZmlndXJlIElETEUKLSAgICAgICAgZGlhbG9nLgotCi1BdXRvbWF0aWMgaW5kZW50YXRpb246Ci0KLSAgICAgICAgQWZ0ZXIgYSBibG9jay1vcGVuaW5nIHN0YXRlbWVudCwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBieSA0IHNwYWNlcwotICAgICAgICAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgYnkgb25lIHRhYikuICBBZnRlciBjZXJ0YWluIGtleXdvcmRzCi0gICAgICAgIChicmVhaywgcmV0dXJuIGV0Yy4pIHRoZSBuZXh0IGxpbmUgaXMgZGVkZW50ZWQuICBJbiBsZWFkaW5nCi0gICAgICAgIGluZGVudGF0aW9uLCBCYWNrc3BhY2UgZGVsZXRlcyB1cCB0byA0IHNwYWNlcyBpZiB0aGV5IGFyZSB0aGVyZS4gIFRhYgotICAgICAgICBpbnNlcnRzIHNwYWNlcyAoaW4gdGhlIFB5dGhvbiBTaGVsbCB3aW5kb3cgb25lIHRhYiksIG51bWJlciBkZXBlbmRzIG9uCi0gICAgICAgIEluZGVudCBXaWR0aC4gQ3VycmVudGx5IHRhYnMgYXJlIHJlc3RyaWN0ZWQgdG8gZm91ciBzcGFjZXMgZHVlCi0gICAgICAgIHRvIFRjbC9UayBsaW1pdGF0aW9ucy4KLQotICAgICAgICBTZWUgYWxzbyB0aGUgaW5kZW50L2RlZGVudCByZWdpb24gY29tbWFuZHMgaW4gdGhlIGVkaXQgbWVudS4KLQotQ29tcGxldGlvbnM6Ci0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIHN1cHBsaWVkIGZvciBmdW5jdGlvbnMsIGNsYXNzZXMsIGFuZCBhdHRyaWJ1dGVzIG9mCi0gICAgICAgIGNsYXNzZXMsIGJvdGggYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZC4gIENvbXBsZXRpb25zIGFyZSBhbHNvIHByb3ZpZGVkCi0gICAgICAgIGZvciBmaWxlbmFtZXMuCi0KLSAgICAgICAgVGhlIEF1dG9Db21wbGV0ZVdpbmRvdyAoQUNXKSB3aWxsIG9wZW4gYWZ0ZXIgYSBwcmVkZWZpbmVkIGRlbGF5Ci0gICAgICAgIChkZWZhdWx0IGlzIHR3byBzZWNvbmRzKSBhZnRlciBhICcuJyBvciAoaW4gYSBzdHJpbmcpIGFuIG9zLnNlcCBpcwotICAgICAgICB0eXBlZC4gIElmIGFmdGVyIG9uZSBvZiB0aG9zZSBjaGFyYWN0ZXJzIChwbHVzIHplcm8gb3IgbW9yZSBvdGhlcgotICAgICAgICBjaGFyYWN0ZXJzKSBhIHRhYiBpcyB0eXBlZCB0aGUgQUNXIHdpbGwgb3BlbiBpbW1lZGlhdGVseSBpZiBhIHBvc3NpYmxlCi0gICAgICAgIGNvbnRpbnVhdGlvbiBpcyBmb3VuZC4KLQotICAgICAgICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBlbnRlcmVkLCBhCi0gICAgICAgIHRhYiB3aWxsIHN1cHBseSB0aGF0IGNvbXBsZXRpb24gd2l0aG91dCBvcGVuaW5nIHRoZSBBQ1cuCi0KLSAgICAgICAgJ1Nob3cgQ29tcGxldGlvbnMnIHdpbGwgZm9yY2Ugb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdywgYnkgZGVmYXVsdCB0aGUKLSAgICAgICAgQ29udHJvbC1zcGFjZSBrZXlzIHdpbGwgb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdy4gIEluIGFuIGVtcHR5Ci0gICAgICAgIHN0cmluZywgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE9uIGEKLSAgICAgICAgYmxhbmsgbGluZSwgaXQgd2lsbCBjb250YWluIHRoZSBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQKLSAgICAgICAgY2xhc3NlcyBpbiB0aGUgY3VycmVudCBuYW1lIHNwYWNlcywgcGx1cyBhbnkgbW9kdWxlcyBpbXBvcnRlZC4gIElmIHNvbWUKLSAgICAgICAgY2hhcmFjdGVycyBoYXZlIGJlZW4gZW50ZXJlZCwgdGhlIEFDVyB3aWxsIGF0dGVtcHQgdG8gYmUgbW9yZSBzcGVjaWZpYy4KLQotICAgICAgICBJZiBzdHJpbmcgb2YgY2hhcmFjdGVycyBpcyB0eXBlZCwgdGhlIEFDVyBzZWxlY3Rpb24gd2lsbCBqdW1wIHRvIHRoZQotICAgICAgICBlbnRyeSBtb3N0IGNsb3NlbHkgbWF0Y2hpbmcgdGhvc2UgY2hhcmFjdGVycy4gRW50ZXJpbmcgYSB0YWIgd2lsbCBjYXVzZQotICAgICAgICB0aGUgbG9uZ2VzdCBub24tYW1iaWd1b3VzIG1hdGNoIHRvIGJlIGVudGVyZWQgaW4gdGhlIEVkaXQgd2luZG93IG9yCi0gICAgICAgIFNoZWxsLiAgVHdvIHRhYnMgaW4gYSByb3cgd2lsbCBzdXBwbHkgdGhlIGN1cnJlbnQgQUNXIHNlbGVjdGlvbiwgYXMKLSAgICAgICAgd2lsbCByZXR1cm4gb3IgYSBkb3VibGUgY2xpY2suICBDdXJzb3Iga2V5cywgUGFnZSBVcC9Eb3duLCBtb3VzZQotICAgICAgICBzZWxlY3Rpb24sIGFuZCB0aGUgc2Nyb2xsIHdoZWVsIGFsbCBvcGVyYXRlIG9uIHRoZSBBQ1cuCi0KLSAgICAgICAgIkhpZGRlbiIgYXR0cmlidXRlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdHlwaW5nIHRoZSBiZWdpbm5pbmcgb2YgaGlkZGVuCi0gICAgICAgIG5hbWUgYWZ0ZXIgYSAnLicsICBlLmcuICdfJy4gIFRoaXMgYWxsb3dzIGFjY2VzcyB0byBtb2R1bGVzIHdpdGgKLSAgICAgICAgJ19fYWxsX18nIHNldCwgb3IgdG8gY2xhc3MtcHJpdmF0ZSBhdHRyaWJ1dGVzLgotCi0gICAgICAgIENvbXBsZXRpb25zIGFuZCB0aGUgJ0V4cGFuZCBXb3JkJyBmYWNpbGl0eSBjYW4gc2F2ZSBhIGxvdCBvZiB0eXBpbmchCi0KLSAgICAgICAgQ29tcGxldGlvbnMgYXJlIGN1cnJlbnRseSBsaW1pdGVkIHRvIHRob3NlIGluIHRoZSBuYW1lc3BhY2VzLiAgTmFtZXMgaW4KLSAgICAgICAgYW4gRWRpdG9yIHdpbmRvdyB3aGljaCBhcmUgbm90IHZpYSBfX21haW5fXyBvciBzeXMubW9kdWxlcyB3aWxsIG5vdCBiZQotICAgICAgICBmb3VuZC4gIFJ1biB0aGUgbW9kdWxlIG9uY2Ugd2l0aCB5b3VyIGltcG9ydHMgdG8gY29ycmVjdCB0aGlzCi0gICAgICAgIHNpdHVhdGlvbi4gIE5vdGUgdGhhdCBJRExFIGl0c2VsZiBwbGFjZXMgcXVpdGUgYSBmZXcgbW9kdWxlcyBpbgotICAgICAgICBzeXMubW9kdWxlcywgc28gbXVjaCBjYW4gYmUgZm91bmQgYnkgZGVmYXVsdCwgZS5nLiB0aGUgcmUgbW9kdWxlLgotCi0gICAgICAgIElmIHlvdSBkb24ndCBsaWtlIHRoZSBBQ1cgcG9wcGluZyB1cCB1bmJpZGRlbiwgc2ltcGx5IG1ha2UgdGhlIGRlbGF5Ci0gICAgICAgIGxvbmdlciBvciBkaXNhYmxlIHRoZSBleHRlbnNpb24uICBPciBhbm90aGVyIG9wdGlvbiBpcyB0aGUgZGVsYXkgY291bGQKLSAgICAgICAgYmUgc2V0IHRvIHplcm8uIEFub3RoZXIgYWx0ZXJuYXRpdmUgdG8gcHJldmVudGluZyBBQ1cgcG9wdXBzIGlzIHRvCi0gICAgICAgIGRpc2FibGUgdGhlIGNhbGwgdGlwcyBleHRlbnNpb24uCi0KLVB5dGhvbiBTaGVsbCB3aW5kb3c6Ci0KLSAgICAgICAgQ29udHJvbC1jIGludGVycnVwdHMgZXhlY3V0aW5nIGNvbW1hbmQuCi0gICAgICAgIENvbnRyb2wtZCBzZW5kcyBlbmQtb2YtZmlsZTsgY2xvc2VzIHdpbmRvdyBpZiB0eXBlZCBhdCA+Pj4gcHJvbXB0LgotICAgICAgICBBbHQtLyBleHBhbmQgd29yZCBpcyBhbHNvIHVzZWZ1bCB0byByZWR1Y2UgdHlwaW5nLgotCi0gICAgQ29tbWFuZCBoaXN0b3J5OgotCi0gICAgICAgIEFsdC1wIHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQuIE9uIE9TIFgKLSAgICAgICAgdXNlIENvbnRyb2wtcC4KLSAgICAgICAgQWx0LW4gcmV0cmlldmVzIG5leHQuIE9uIE9TIFggdXNlIENvbnRyb2wtbi4KLSAgICAgICAgUmV0dXJuIHdoaWxlIGN1cnNvciBpcyBvbiBhIHByZXZpb3VzIGNvbW1hbmQgcmV0cmlldmVzIHRoYXQgY29tbWFuZC4KLQotICAgIFN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgVGhlIGNvbG9yaW5nIGlzIGFwcGxpZWQgaW4gYSBiYWNrZ3JvdW5kICJ0aHJlYWQiLCBzbyB5b3UgbWF5Ci0gICAgICAgIG9jY2FzaW9uYWxseSBzZWUgdW5jb2xvcml6ZWQgdGV4dC4gIFRvIGNoYW5nZSB0aGUgY29sb3IKLSAgICAgICAgc2NoZW1lLCB1c2UgdGhlIENvbmZpZ3VyZSBJRExFIC8gSGlnaGxpZ2h0aW5nIGRpYWxvZy4KLQotICAgIFB5dGhvbiBkZWZhdWx0IHN5bnRheCBjb2xvcnM6Ci0KLSAgICAgICAgS2V5d29yZHMgICAgICAgIG9yYW5nZQotICAgICAgICBCdWlsdGlucyAgICAgICAgcm95YWwgcHVycGxlCi0gICAgICAgIFN0cmluZ3MgICAgICAgICBncmVlbgotICAgICAgICBDb21tZW50cyAgICAgICAgcmVkCi0gICAgICAgIERlZmluaXRpb25zICAgICBibHVlCi0KLSAgICBTaGVsbCBkZWZhdWx0IGNvbG9yczoKLQotICAgICAgICBDb25zb2xlIG91dHB1dCAgYnJvd24KLSAgICAgICAgc3Rkb3V0ICAgICAgICAgIGJsdWUKLSAgICAgICAgc3RkZXJyICAgICAgICAgIHJlZAotICAgICAgICBzdGRpbiAgICAgICAgICAgYmxhY2sKLQotT3RoZXIgcHJlZmVyZW5jZXM6Ci0KLSAgICAgICAgVGhlIGZvbnQgcHJlZmVyZW5jZXMsIGhpZ2hsaWdodGluZywga2V5cywgYW5kIGdlbmVyYWwgcHJlZmVyZW5jZXMgY2FuCi0gICAgICAgIGJlIGNoYW5nZWQgdmlhIHRoZSBDb25maWd1cmUgSURMRSBtZW51IG9wdGlvbi4gIEJlIHN1cmUgdG8gbm90ZSB0aGF0Ci0gICAgICAgIGtleXMgY2FuIGJlIHVzZXIgZGVmaW5lZCwgSURMRSBzaGlwcyB3aXRoIGZvdXIgYnVpbHQgaW4ga2V5IHNldHMuIEluCi0gICAgICAgIGFkZGl0aW9uIGEgdXNlciBjYW4gY3JlYXRlIGEgY3VzdG9tIGtleSBzZXQgaW4gdGhlIENvbmZpZ3VyZSBJRExFCi0gICAgICAgIGRpYWxvZyB1bmRlciB0aGUga2V5cyB0YWIuCi0KLUNvbW1hbmQgbGluZSB1c2FnZToKLQotICAgICAgICBFbnRlciBpZGxlIC1oIGF0IHRoZSBjb21tYW5kIHByb21wdCB0byBnZXQgYSB1c2FnZSBtZXNzYWdlLgotCi0gICAgICAgIGlkbGUucHkgWy1jIGNvbW1hbmRdIFstZF0gWy1lXSBbLXNdIFstdCB0aXRsZV0gW2FyZ10gLi4uCi0KLSAgICAgICAgLWMgY29tbWFuZCAgcnVuIHRoaXMgY29tbWFuZAotICAgICAgICAtZCAgICAgICAgICBlbmFibGUgZGVidWdnZXIKLSAgICAgICAgLWUgICAgICAgICAgZWRpdCBtb2RlOyBhcmd1bWVudHMgYXJlIGZpbGVzIHRvIGJlIGVkaXRlZAotICAgICAgICAtcyAgICAgICAgICBydW4gJElETEVTVEFSVFVQIG9yICRQWVRIT05TVEFSVFVQIGZpcnN0Ci0gICAgICAgIC10IHRpdGxlICAgIHNldCB0aXRsZSBvZiBzaGVsbCB3aW5kb3cKLQotICAgICAgICBJZiB0aGVyZSBhcmUgYXJndW1lbnRzOgotICAgICAgICAxLiBJZiAtZSBpcyB1c2VkLCBhcmd1bWVudHMgYXJlIGZpbGVzIG9wZW5lZCBmb3IgZWRpdGluZyBhbmQgc3lzLmFyZ3YKLSAgICAgICAgICAgcmVmbGVjdHMgdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gSURMRSBpdHNlbGYuCi0gICAgICAgIDIuIE90aGVyd2lzZSwgaWYgLWMgaXMgdXNlZCwgYWxsIGFyZ3VtZW50cyBhcmUgcGxhY2VkIGluCi0gICAgICAgICAgIHN5cy5hcmd2WzE6Li4uXSwgd2l0aCBzeXMuYXJndlswXSBzZXQgdG8gLWMuCi0gICAgICAgIDMuIE90aGVyd2lzZSwgaWYgbmVpdGhlciAtZSBub3IgLWMgaXMgdXNlZCwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEKLSAgICAgICAgICAgc2NyaXB0IHdoaWNoIGlzIGV4ZWN1dGVkIHdpdGggdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgaW4KLSAgICAgICAgICAgc3lzLmFyZ3ZbMTouLi5dICBhbmQgc3lzLmFyZ3ZbMF0gc2V0IHRvIHRoZSBzY3JpcHQgbmFtZS4gIElmIHRoZQotICAgICAgICAgICBzY3JpcHQgbmFtZSBpcyAtLCBubyBzY3JpcHQgaXMgZXhlY3V0ZWQgYnV0IGFuIGludGVyYWN0aXZlIFB5dGhvbgotICAgICAgICAgICBzZXNzaW9uIGlzIHN0YXJ0ZWQ7IHRoZSBhcmd1bWVudHMgYXJlIHN0aWxsIGF2YWlsYWJsZSBpbiBzeXMuYXJndi4KLQotUnVubmluZyB3aXRob3V0IGEgc3VicHJvY2VzczogKERFUFJFQ0FURUQgaW4gUHl0aG9uIDMuNCBzZWUgSXNzdWUgMTYxMjMpCi0KLSAgICAgICAgSWYgSURMRSBpcyBzdGFydGVkIHdpdGggdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggaXQgd2lsbCBydW4gaW4gYQotICAgICAgICBzaW5nbGUgcHJvY2VzcyBhbmQgd2lsbCBub3QgY3JlYXRlIHRoZSBzdWJwcm9jZXNzIHdoaWNoIHJ1bnMgdGhlIFJQQwotICAgICAgICBQeXRob24gZXhlY3V0aW9uIHNlcnZlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBQeXRob24gY2Fubm90IGNyZWF0ZQotICAgICAgICB0aGUgc3VicHJvY2VzcyBvciB0aGUgUlBDIHNvY2tldCBpbnRlcmZhY2Ugb24geW91ciBwbGF0Zm9ybS4gIEhvd2V2ZXIsCi0gICAgICAgIGluIHRoaXMgbW9kZSB1c2VyIGNvZGUgaXMgbm90IGlzb2xhdGVkIGZyb20gSURMRSBpdHNlbGYuICBBbHNvLCB0aGUKLSAgICAgICAgZW52aXJvbm1lbnQgaXMgbm90IHJlc3RhcnRlZCB3aGVuIFJ1bi9SdW4gTW9kdWxlIChGNSkgaXMgc2VsZWN0ZWQuICBJZgotICAgICAgICB5b3VyIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQsIHlvdSBtdXN0IHJlbG9hZCgpIHRoZSBhZmZlY3RlZCBtb2R1bGVzIGFuZAotICAgICAgICByZS1pbXBvcnQgYW55IHNwZWNpZmljIGl0ZW1zIChlLmcuIGZyb20gZm9vIGltcG9ydCBiYXopIGlmIHRoZSBjaGFuZ2VzCi0gICAgICAgIGFyZSB0byB0YWtlIGVmZmVjdC4gIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyBwcmVmZXJhYmxlIHRvIHJ1biBJRExFCi0gICAgICAgIHdpdGggdGhlIGRlZmF1bHQgc3VicHJvY2VzcyBpZiBhdCBhbGwgcG9zc2libGUuCi0KLUV4dGVuc2lvbnM6Ci0KLSAgICAgICAgSURMRSBjb250YWlucyBhbiBleHRlbnNpb24gZmFjaWxpdHkuICBTZWUgdGhlIGJlZ2lubmluZyBvZgotICAgICAgICBjb25maWctZXh0ZW5zaW9ucy5kZWYgaW4gdGhlIGlkbGVsaWIgZGlyZWN0b3J5IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICAgICAgICBUaGUgZGVmYXVsdCBleHRlbnNpb25zIGFyZSBjdXJyZW50bHk6Ci0KLSAgICAgICAgICAgICAgICBGb3JtYXRQYXJhZ3JhcGgKLSAgICAgICAgICAgICAgICBBdXRvRXhwYW5kCi0gICAgICAgICAgICAgICAgWm9vbUhlaWdodAotICAgICAgICAgICAgICAgIFNjcmlwdEJpbmRpbmcKLSAgICAgICAgICAgICAgICBDYWxsVGlwcwotICAgICAgICAgICAgICAgIFBhcmVuTWF0Y2gKLSAgICAgICAgICAgICAgICBBdXRvQ29tcGxldGUKLSAgICAgICAgICAgICAgICBDb2RlQ29udGV4dApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9oZWxwX2Fib3V0LnB5CmluZGV4IGE4Zjc1ZDIuLjU0ZjM1OTkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2Fib3V0RGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2hlbHBfYWJvdXQucHkKQEAgLTUsNyArNSw3IEBACiBpbXBvcnQgb3MKIGZyb20gc3lzIGltcG9ydCB2ZXJzaW9uCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcKIAogY2xhc3MgQWJvdXREaWFsb2coVG9wbGV2ZWwpOgogICAgICIiIk1vZGFsIGFib3V0IGRpYWxvZyBmb3IgaWRsZQpAQCAtMTM1LDE3ICsxMzUsMTcgQEAKICAgICBkZWYgZGlzcGxheV9wcmludGVyX3RleHQoc2VsZiwgdGl0bGUsIHByaW50ZXIpOgogICAgICAgICBwcmludGVyLl9QcmludGVyX19zZXR1cCgpCiAgICAgICAgIHRleHQgPSAnXG4nLmpvaW4ocHJpbnRlci5fUHJpbnRlcl9fbGluZXMpCi0gICAgICAgIHRleHRWaWV3LnZpZXdfdGV4dChzZWxmLCB0aXRsZSwgdGV4dCkKKyAgICAgICAgdGV4dHZpZXcudmlld190ZXh0KHNlbGYsIHRpdGxlLCB0ZXh0KQogCiAgICAgZGVmIGRpc3BsYXlfZmlsZV90ZXh0KHNlbGYsIHRpdGxlLCBmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgZmlsZW5hbWUpCi0gICAgICAgIHRleHRWaWV3LnZpZXdfZmlsZShzZWxmLCB0aXRsZSwgZm4sIGVuY29kaW5nKQorICAgICAgICB0ZXh0dmlldy52aWV3X2ZpbGUoc2VsZiwgdGl0bGUsIGZuLCBlbmNvZGluZykKIAogICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgc2VsZi5kZXN0cm95KCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2hlbHBhYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaGVscF9hYm91dCcsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihBYm91dERpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5IGIvTGliL2lkbGVsaWIvaGlzdG9yeS5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaGlzdG9yeS5weQppbmRleCAwNzhhZjI5Li42MDY4ZDRmIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQorKysgYi9MaWIvaWRsZWxpYi9oaXN0b3J5LnB5CkBAIC0xLDExICsxLDExIEBACiAiSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20gd2l0aCBIaXN0b3J5IGNsYXNzIgogCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIGNsYXNzIEhpc3Rvcnk6CiAgICAgJycnIEltcGxlbWVudCBJZGxlIFNoZWxsIGhpc3RvcnkgbWVjaGFuaXNtLgogCi0gICAgc3RvcmUgLSBTdG9yZSBzb3VyY2Ugc3RhdGVtZW50IChjYWxsZWQgZnJvbSBQeVNoZWxsLnJlc2V0b3V0cHV0KS4KKyAgICBzdG9yZSAtIFN0b3JlIHNvdXJjZSBzdGF0ZW1lbnQgKGNhbGxlZCBmcm9tIHB5c2hlbGwucmVzZXRvdXRwdXQpLgogICAgIGZldGNoIC0gRmV0Y2ggc3RvcmVkIHN0YXRlbWVudCBtYXRjaGluZyBwcmVmaXggYWxyZWFkeSBlbnRlcmVkLgogICAgIGhpc3RvcnlfbmV4dCAtIEJvdW5kIHRvIDw8aGlzdG9yeS1uZXh0Pj4gZXZlbnQgKGRlZmF1bHQgQWx0LU4pLgogICAgIGhpc3RvcnlfcHJldiAtIEJvdW5kIHRvIDw8aGlzdG9yeS1wcmV2Pj4gZXZlbnQgKGRlZmF1bHQgQWx0LVApLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkgYi9MaWIvaWRsZWxpYi9oeXBlcnBhcnNlci5weQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9IeXBlclBhcnNlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaHlwZXJwYXJzZXIucHkKaW5kZXggNzdjYjA1Ny4uZjkwNGEzOSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvaHlwZXJwYXJzZXIucHkKQEAgLTcsNyArNyw3IEBACiAKIGltcG9ydCBzdHJpbmcKIGZyb20ga2V5d29yZCBpbXBvcnQgaXNrZXl3b3JkCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5UGFyc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlwYXJzZQogCiAKICMgYWxsIEFTQ0lJIGNoYXJzIHRoYXQgbWF5IGJlIGluIGFuIGlkZW50aWZpZXIKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgogICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gZWRpdHdpbi50ZXh0CiAKLSAgICAgICAgcGFyc2VyID0gUHlQYXJzZS5QYXJzZXIoZWRpdHdpbi5pbmRlbnR3aWR0aCwgZWRpdHdpbi50YWJ3aWR0aCkKKyAgICAgICAgcGFyc2VyID0gcHlwYXJzZS5QYXJzZXIoZWRpdHdpbi5pbmRlbnR3aWR0aCwgZWRpdHdpbi50YWJ3aWR0aCkKIAogICAgICAgICBkZWYgaW5kZXgybGluZShpbmRleCk6CiAgICAgICAgICAgICByZXR1cm4gaW50KGZsb2F0KGluZGV4KSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlLnB5CmluZGV4IGEyNDk1NTcuLmMwMWNmOTkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZS5weQpAQCAtNyw1ICs3LDUgQEAKIGlkbGVsaWJfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkKIHN5cy5wYXRoLmluc2VydCgwLCBpZGxlbGliX2RpcikKIAotaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAotaWRsZWxpYi5QeVNoZWxsLm1haW4oKQoraW1wb3J0IGlkbGVsaWIucHlzaGVsbAoraWRsZWxpYi5weXNoZWxsLm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZS5weXcgYi9MaWIvaWRsZWxpYi9pZGxlLnB5dwppbmRleCAxNDJjYjMyLi5lNzNjMDQ5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlLnB5dworKysgYi9MaWIvaWRsZWxpYi9pZGxlLnB5dwpAQCAtMSwxMCArMSwxMCBAQAogdHJ5OgotICAgIGltcG9ydCBpZGxlbGliLlB5U2hlbGwKKyAgICBpbXBvcnQgaWRsZWxpYi5weXNoZWxsCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgIyBJRExFIGlzIG5vdCBpbnN0YWxsZWQsIGJ1dCBtYXliZSBQeVNoZWxsIGlzIG9uIHN5cy5wYXRoOgotICAgIGZyb20gLiBpbXBvcnQgUHlTaGVsbAorICAgICMgSURMRSBpcyBub3QgaW5zdGFsbGVkLCBidXQgbWF5YmUgcHlzaGVsbCBpcyBvbiBzeXMucGF0aDoKKyAgICBmcm9tIC4gaW1wb3J0IHB5c2hlbGwKICAgICBpbXBvcnQgb3MKLSAgICBpZGxlZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChQeVNoZWxsLl9fZmlsZV9fKSkKKyAgICBpZGxlZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChweXNoZWxsLl9fZmlsZV9fKSkKICAgICBpZiBpZGxlZGlyICE9IG9zLmdldGN3ZCgpOgogICAgICAgICAjIFdlJ3JlIG5vdCBpbiB0aGUgSURMRSBkaXJlY3RvcnksIGhlbHAgdGhlIHN1YnByb2Nlc3MgZmluZCBydW4ucHkKICAgICAgICAgcHlwYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykKQEAgLTEyLDYgKzEyLDYgQEAKICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IHB5cGF0aCArICc6JyArIGlkbGVkaXIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IGlkbGVkaXIKLSAgICBQeVNoZWxsLm1haW4oKQorICAgIHB5c2hlbGwubWFpbigpCiBlbHNlOgotICAgIGlkbGVsaWIuUHlTaGVsbC5tYWluKCkKKyAgICBpZGxlbGliLnB5c2hlbGwubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkKaW5kZXggODQ1YzkyZC4uYWQwNjdiNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weQpAQCAtMSw2ICsxLDggQEAKICcnJ2lkbGVsaWIuaWRsZV90ZXN0IGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSwKIHdoaWNoIHRlc3RzIHRoZSBJRExFIGFwcGxpY2F0aW9uIGFzIHBhcnQgb2YgdGhlIHN0ZGxpYiB0ZXN0IHN1aXRlLgogUnVuIElETEUgdGVzdHMgYWxvbmUgd2l0aCAicHl0aG9uIC1tIHRlc3QudGVzdF9pZGxlIi4KK1N0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNiwgSURMRSByZXF1aXJlcyB0Y2wvdGsgOC41IG9yIGxhdGVyLgorCiBUaGlzIHBhY2thZ2UgYW5kIGl0cyBjb250YWluZWQgbW9kdWxlcyBhcmUgc3ViamVjdCB0byBjaGFuZ2UgYW5kCiBhbnkgZGlyZWN0IHVzZSBpcyBhdCB5b3VyIG93biByaXNrLgogJycnCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvaHRlc3QucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvaHRlc3QucHkKaW5kZXggNThlNjJjYi4uNzEzMDJkMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weQpAQCAtNTksMTkgKzU5LDIwIEBACiAKIAogTW9kdWxlcyBhbmQgY2xhc3NlcyBub3QgYmVpbmcgdGVzdGVkIGF0IHRoZSBtb21lbnQ6Ci1QeVNoZWxsLlB5U2hlbGxFZGl0b3JXaW5kb3cKLURlYnVnZ2VyLkRlYnVnZ2VyCi1BdXRvQ29tcGxldGVXaW5kb3cuQXV0b0NvbXBsZXRlV2luZG93Ci1PdXRwdXRXaW5kb3cuT3V0cHV0V2luZG93IChpbmRpcmVjdGx5IGJlaW5nIHRlc3RlZCB3aXRoIGdyZXAgdGVzdCkKK3B5c2hlbGwuUHlTaGVsbEVkaXRvcldpbmRvdworZGVidWdnZXIuRGVidWdnZXIKK2F1dG9jb21wbGV0ZV93LkF1dG9Db21wbGV0ZVdpbmRvdworb3V0d2luLk91dHB1dFdpbmRvdyAoaW5kaXJlY3RseSBiZWluZyB0ZXN0ZWQgd2l0aCBncmVwIHRlc3QpCiAnJycKIAogZnJvbSBpbXBvcnRsaWIgaW1wb3J0IGltcG9ydF9tb2R1bGUKLWZyb20gaWRsZWxpYi5tYWNvc3hTdXBwb3J0IGltcG9ydCBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzCiBpbXBvcnQgdGtpbnRlciBhcyB0aworZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCit0ay5Ob0RlZmF1bHRSb290KCkKIAogQWJvdXREaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdhYm91dERpYWxvZycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ2Fib3V0RGlhbG9nIHRlc3QnLAorICAgICdmaWxlJzogJ2hlbHBfYWJvdXQnLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdoZWxwX2Fib3V0IHRlc3QnLAogICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlLAogICAgICAgICAgICAgIH0sCiAgICAgJ21zZyc6ICJUZXN0IGV2ZXJ5IGJ1dHRvbi4gRW5zdXJlIFB5dGhvbiwgVEsgYW5kIElETEUgdmVyc2lvbnMgIgpAQCAtNzksMTQgKzgwLDE0IEBACiAgICAgfQogCiBfY2FsbHRpcF93aW5kb3dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdDYWxsVGlwV2luZG93JywKKyAgICAnZmlsZSc6ICdjYWxsdGlwX3cnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUeXBpbmcgJygnIHNob3VsZCBkaXNwbGF5IGEgY2FsbHRpcC5cbiIKICAgICAgICAgICAgIlR5cGluZyAnKSBzaG91bGQgaGlkZSB0aGUgY2FsbHRpcC5cbiIKICAgICB9CiAKIF9jbGFzc19icm93c2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnQ2xhc3NCcm93c2VyJywKKyAgICAnZmlsZSc6ICdicm93c2VyJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiSW5zcGVjdCBuYW1lcyBvZiBtb2R1bGUsIGNsYXNzKHdpdGggc3VwZXJjbGFzcyBpZiAiCiAgICAgICAgICAgICJhcHBsaWNhYmxlKSwgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLlxuVG9nZ2xlIG5lc3RlZCBpdGVtcy5cbiIKQEAgLTk1LDcgKzk2LDcgQEAKICAgICB9CiAKIF9jb2xvcl9kZWxlZ2F0b3Jfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdDb2xvckRlbGVnYXRvcicsCisgICAgJ2ZpbGUnOiAnY29sb3JpemVyJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGhlIHRleHQgaXMgc2FtcGxlIFB5dGhvbiBjb2RlLlxuIgogICAgICAgICAgICAiRW5zdXJlIGNvbXBvbmVudHMgbGlrZSBjb21tZW50cywga2V5d29yZHMsIGJ1aWx0aW5zLFxuIgpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAgfQogCiBDb25maWdEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdEaWFsb2cnLAorICAgICdmaWxlJzogJ2NvbmZpZ2RpYWxvZycsCiAgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ0NvbmZpZ0RpYWxvZ1Rlc3QnLAogICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlLH0sCiAgICAgJ21zZyc6ICJJRExFIHByZWZlcmVuY2VzIGRpYWxvZy5cbiIKQEAgLTEyMSw3ICsxMjIsNyBAQAogCiAjIFRPRE8gSW1wcm92ZSBtZXNzYWdlCiBfZHluX29wdGlvbl9tZW51X3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnZHluT3B0aW9uTWVudVdpZGdldCcsCisgICAgJ2ZpbGUnOiAnZHlub3B0aW9uJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiU2VsZWN0IG9uZSBvZiB0aGUgbWFueSBvcHRpb25zIGluIHRoZSAnb2xkIG9wdGlvbiBzZXQnLlxuIgogICAgICAgICAgICAiQ2xpY2sgdGhlIGJ1dHRvbiB0byBjaGFuZ2UgdGhlIG9wdGlvbiBzZXQuXG4iCkBAIC0xMzAsMjYgKzEzMSwxNCBAQAogCiAjIFRPRE8gZWRpdCB3cmFwcGVyCiBfZWRpdG9yX3dpbmRvd19zcGVjID0gewotICAgJ2ZpbGUnOiAnRWRpdG9yV2luZG93JywKKyAgICdmaWxlJzogJ2VkaXRvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRlc3QgZWRpdG9yIGZ1bmN0aW9ucyBvZiBpbnRlcmVzdC5cbiIKICAgICAgICAgICAgIkJlc3QgdG8gY2xvc2UgZWRpdG9yIGZpcnN0LiIKICAgICB9CiAKLUdldENmZ1NlY3Rpb25OYW1lRGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cnLAotICAgICdrd2RzJzogeyd0aXRsZSc6J0dldCBOYW1lJywKLSAgICAgICAgICAgICAnbWVzc2FnZSc6J0VudGVyIHNvbWV0aGluZycsCi0gICAgICAgICAgICAgJ3VzZWRfbmFtZXMnOiB7J2FiYyd9LAotICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKLSAgICAnbXNnJzogIkFmdGVyIHRoZSB0ZXh0IGVudGVyZWQgd2l0aCBbT2tdIGlzIHN0cmlwcGVkLCA8bm90aGluZz4sICIKLSAgICAgICAgICAgIidhYmMnLCBvciBtb3JlIHRoYXQgMzAgY2hhcnMgYXJlIGVycm9ycy5cbiIKLSAgICAgICAgICAgIkNsb3NlICdHZXQgTmFtZScgd2l0aCBhIHZhbGlkIGVudHJ5IChwcmludGVkIHRvIFNoZWxsKSwgIgotICAgICAgICAgICAiW0NhbmNlbF0sIG9yIFtYXSIsCi0gICAgfQotCiBHZXRIZWxwU291cmNlRGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnY29uZmlnSGVscFNvdXJjZUVkaXQnLAorICAgICdmaWxlJzogJ2NvbmZpZ19oZWxwJywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnR2V0IGhlbHBzb3VyY2UnLAogICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKICAgICAnbXNnJzogIkVudGVyIG1lbnUgaXRlbSBuYW1lIGFuZCBoZWxwIGZpbGUgcGF0aFxuICIKQEAgLTE2Miw3ICsxNTEsNyBAQAogCiAjIFVwZGF0ZSBvbmNlIGlzc3VlMjE1MTkgaXMgcmVzb2x2ZWQuCiBHZXRLZXlzRGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAna2V5YmluZGluZ0RpYWxvZycsCisgICAgJ2ZpbGUnOiAnY29uZmlnX2tleScsCiAgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3Qga2V5YmluZGluZ3MnLAogICAgICAgICAgICAgICdhY3Rpb24nOiAnZmluZC1hZ2FpbicsCiAgICAgICAgICAgICAgJ2N1cnJlbnRLZXlTZXF1ZW5jZXMnOiBbJyddICwKQEAgLTE3Nyw3ICsxNjYsNyBAQAogICAgIH0KIAogX2dyZXBfZGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnR3JlcERpYWxvZycsCisgICAgJ2ZpbGUnOiAnZ3JlcCcsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkNsaWNrIHRoZSAnU2hvdyBHcmVwRGlhbG9nJyBidXR0b24uXG4iCiAgICAgICAgICAgICJUZXN0IHRoZSB2YXJpb3VzICdGaW5kLWluLWZpbGVzJyBmdW5jdGlvbnMuXG4iCkBAIC0xODcsNyArMTc2LDcgQEAKICAgICB9CiAKIF9pb19iaW5kaW5nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnSU9CaW5kaW5nJywKKyAgICAnZmlsZSc6ICdpb21lbnUnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IHRoZSBmb2xsb3dpbmcgYmluZGluZ3MuXG4iCiAgICAgICAgICAgICI8Q29udHJvbC1vPiB0byBvcGVuIGZpbGUgZnJvbSBkaWFsb2cuXG4iCkBAIC0yMDAsNyArMTg5LDcgQEAKICAgICB9CiAKIF9tdWx0aV9jYWxsX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlDYWxsJywKKyAgICAnZmlsZSc6ICdtdWx0aWNhbGwnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgZm9sbG93aW5nIGFjdGlvbnMgc2hvdWxkIHRyaWdnZXIgYSBwcmludCB0byBjb25zb2xlIG9yIElETEUiCiAgICAgICAgICAgICIgU2hlbGwuXG5FbnRlcmluZyBhbmQgbGVhdmluZyB0aGUgdGV4dCBhcmVhLCBrZXkgZW50cnksICIKQEAgLTIxMCwxNCArMTk5LDE0IEBACiAgICAgfQogCiBfbXVsdGlzdGF0dXNfYmFyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnTXVsdGlTdGF0dXNCYXInLAorICAgICdmaWxlJzogJ3N0YXR1c2JhcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkVuc3VyZSBwcmVzZW5jZSBvZiBtdWx0aS1zdGF0dXMgYmFyIGJlbG93IHRleHQgYXJlYS5cbiIKICAgICAgICAgICAgIkNsaWNrICdVcGRhdGUgU3RhdHVzJyB0byBjaGFuZ2UgdGhlIG11bHRpLXN0YXR1cyB0ZXh0IgogICAgIH0KIAogX29iamVjdF9icm93c2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnT2JqZWN0QnJvd3NlcicsCisgICAgJ2ZpbGUnOiAnZGVidWdvYmonLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJEb3VibGUgY2xpY2sgb24gaXRlbXMgdXB0byB0aGUgbG93ZXN0IGxldmVsLlxuIgogICAgICAgICAgICAiQXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0cyBhbmQgcmVsYXRlZCBpbmZvcm1hdGlvbiAiCkBAIC0yMjUsNyArMjE0LDcgQEAKICAgICB9CiAKIF9wYXRoX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdQYXRoQnJvd3NlcicsCisgICAgJ2ZpbGUnOiAncGF0aGJyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUZXN0IGZvciBjb3JyZWN0IGRpc3BsYXkgb2YgYWxsIHBhdGhzIGluIHN5cy5wYXRoLlxuIgogICAgICAgICAgICAiVG9nZ2xlIG5lc3RlZCBpdGVtcyB1cHRvIHRoZSBsb3dlc3QgbGV2ZWwuXG4iCkBAIC0yMzQsNyArMjIzLDcgQEAKICAgICB9CiAKIF9wZXJjb2xhdG9yX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUGVyY29sYXRvcicsCisgICAgJ2ZpbGUnOiAncGVyY29sYXRvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRoZXJlIGFyZSB0d28gdHJhY2VycyB3aGljaCBjYW4gYmUgdG9nZ2xlZCB1c2luZyBhIGNoZWNrYm94LlxuIgogICAgICAgICAgICAiVG9nZ2xpbmcgYSB0cmFjZXIgJ29uJyBieSBjaGVja2luZyBpdCBzaG91bGQgcHJpbnQgdHJhY2VyIgpAQCAtMjQ0LDggKzIzMywyMCBAQAogICAgICAgICAgICAiVGVzdCBmb3IgYWN0aW9ucyBsaWtlIHRleHQgZW50cnksIGFuZCByZW1vdmFsLiIKICAgICB9CiAKK1F1ZXJ5X3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdRdWVyeScsCisgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnRW50ZXIgc29tZXRoaW5nJywKKyAgICAgICAgICAgICAndGV4dDAnOiAnR28nLAorICAgICAgICAgICAgICdfaHRlc3QnOiBUcnVlfSwKKyAgICAnbXNnJzogIkVudGVyIHdpdGggPFJldHVybj4gb3IgW09rXS4gIFByaW50IHZhbGlkIGVudHJ5IHRvIFNoZWxsXG4iCisgICAgICAgICAgICJCbGFuayBsaW5lLCBhZnRlciBzdHJpcHBpbmcsIGlzIGlnbm9yZWRcbiIKKyAgICAgICAgICAgIkNsb3NlIGRpYWxvZyB3aXRoIHZhbGlkIGVudHJ5LCBbQ2FuY2VsXSBvciBbWF0iLAorICAgIH0KKworCiBfcmVwbGFjZV9kaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdSZXBsYWNlRGlhbG9nJywKKyAgICAnZmlsZSc6ICdyZXBsYWNlJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdSZXBsYWNlJyBidXR0b24uXG4iCiAgICAgICAgICAgICJUZXN0IHZhcmlvdXMgcmVwbGFjZSBvcHRpb25zIGluIHRoZSAnUmVwbGFjZSBkaWFsb2cnLlxuIgpAQCAtMjUzLDcgKzI1NCw3IEBACiAgICAgfQogCiBfc2VhcmNoX2RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ1NlYXJjaERpYWxvZycsCisgICAgJ2ZpbGUnOiAnc2VhcmNoJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTZWFyY2gnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdmFyaW91cyBzZWFyY2ggb3B0aW9ucyBpbiB0aGUgJ1NlYXJjaCBkaWFsb2cnLlxuIgpAQCAtMjYxLDcgKzI2Miw3IEBACiAgICAgfQogCiBfc2Nyb2xsZWRfbGlzdF9zcGVjID0gewotICAgICdmaWxlJzogJ1Njcm9sbGVkTGlzdCcsCisgICAgJ2ZpbGUnOiAnc2Nyb2xsZWRsaXN0JywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiWW91IHNob3VsZCBzZWUgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgaXRlbXNcbiIKICAgICAgICAgICAgIlNlbGVjdGluZyAoY2xpY2tpbmcpIG9yIGRvdWJsZSBjbGlja2luZyBhbiBpdGVtICIKQEAgLTI3Nyw3ICsyNzgsNyBAQAogICAgIH0KIAogX3N0YWNrX3ZpZXdlcl9zcGVjID0gewotICAgICdmaWxlJzogJ1N0YWNrVmlld2VyJywKKyAgICAnZmlsZSc6ICdzdGFja3ZpZXdlcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkEgc3RhY2t0cmFjZSBmb3IgYSBOYW1lRXJyb3IgZXhjZXB0aW9uLlxuIgogICAgICAgICAgICAiRXhwYW5kICdpZGxlbGliIC4uLicgYW5kICc8bG9jYWxzPicuXG4iCkBAIC0yOTUsOCArMjk2LDggQEAKICAgICB9CiAKIFRleHRWaWV3ZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICd0ZXh0VmlldycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3QgdGV4dFZpZXcnLAorICAgICdmaWxlJzogJ3RleHR2aWV3JywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCB0ZXh0dmlldycsCiAgICAgICAgICAgICAgJ3RleHQnOidUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxuJyozNSwKICAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCiAgICAgJ21zZyc6ICJUZXN0IGZvciByZWFkLW9ubHkgcHJvcGVydHkgb2YgdGV4dC5cbiIKQEAgLTMwNCwyMSArMzA1LDIxIEBACiAgICAgIH0KIAogX3Rvb2x0aXBfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdUb29sVGlwJywKKyAgICAnZmlsZSc6ICd0b29sdGlwJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiUGxhY2UgbW91c2UgY3Vyc29yIG92ZXIgYm90aCB0aGUgYnV0dG9uc1xuIgogICAgICAgICAgICAiQSB0b29sdGlwIHNob3VsZCBhcHBlYXIgd2l0aCBzb21lIHRleHQuIgogICAgIH0KIAogX3RyZWVfd2lkZ2V0X3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnVHJlZVdpZGdldCcsCisgICAgJ2ZpbGUnOiAndHJlZScsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRoZSBjYW52YXMgaXMgc2Nyb2xsYWJsZS5cbiIKICAgICAgICAgICAgIkNsaWNrIG9uIGZvbGRlcnMgdXB0byB0byB0aGUgbG93ZXN0IGxldmVsLiIKICAgICB9CiAKIF91bmRvX2RlbGVnYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ1VuZG9EZWxlZ2F0b3InLAorICAgICdmaWxlJzogJ3VuZG8nLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJDbGljayBbVW5kb10gdG8gdW5kbyBhbnkgYWN0aW9uLlxuIgogICAgICAgICAgICAiQ2xpY2sgW1JlZG9dIHRvIHJlZG8gYW55IGFjdGlvbi5cbiIKQEAgLTMyNyw3ICszMjgsNyBAQAogICAgIH0KIAogX3dpZGdldF9yZWRpcmVjdG9yX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnV2lkZ2V0UmVkaXJlY3RvcicsCisgICAgJ2ZpbGUnOiAncmVkaXJlY3RvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkV2ZXJ5IHRleHQgaW5zZXJ0IHNob3VsZCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLiIKICAgICAgICAgICAgIm9yIHRoZSBJRExFIHNoZWxsLiIKQEAgLTMzNywxNCArMzM4LDEzIEBACiAgICAgcm9vdCA9IHRrLlRrKCkKICAgICByb290LnRpdGxlKCdJRExFIGh0ZXN0JykKICAgICByb290LnJlc2l6YWJsZSgwLCAwKQotICAgIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCkKIAogICAgICMgYSBzY3JvbGxhYmxlIExhYmVsIGxpa2UgY29uc3RhbnQgd2lkdGggdGV4dCB3aWRnZXQuCiAgICAgZnJhbWVMYWJlbCA9IHRrLkZyYW1lKHJvb3QsIHBhZHg9MTApCiAgICAgZnJhbWVMYWJlbC5wYWNrKCkKICAgICB0ZXh0ID0gdGsuVGV4dChmcmFtZUxhYmVsLCB3cmFwPSd3b3JkJykKICAgICB0ZXh0LmNvbmZpZ3VyZShiZz1yb290LmNnZXQoJ2JnJyksIHJlbGllZj0nZmxhdCcsIGhlaWdodD00LCB3aWR0aD03MCkKLSAgICBzY3JvbGxiYXIgPSB0ay5TY3JvbGxiYXIoZnJhbWVMYWJlbCwgY29tbWFuZD10ZXh0Lnl2aWV3KQorICAgIHNjcm9sbGJhciA9IFNjcm9sbGJhcihmcmFtZUxhYmVsLCBjb21tYW5kPXRleHQueXZpZXcpCiAgICAgdGV4dC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsYmFyLnNldCkKICAgICBzY3JvbGxiYXIucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3knLCBleHBhbmQ9RmFsc2UpCiAgICAgdGV4dC5wYWNrKHNpZGU9J2xlZnQnLCBmaWxsPSdib3RoJywgZXhwYW5kPVRydWUpCkBAIC0zNjUsNyArMzY1LDcgQEAKICAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihtb2QsIHRlc3RfbmFtZSkKICAgICAgICAgICAgICAgICB0ZXN0X2xpc3QuYXBwZW5kKCh0ZXN0X3NwZWMsIHRlc3QpKQogCi0gICAgdGVzdF9uYW1lID0gdGsuU3RyaW5nVmFyKCcnKQorICAgIHRlc3RfbmFtZSA9IHRrLlN0cmluZ1Zhcihyb290KQogICAgIGNhbGxhYmxlX29iamVjdCA9IE5vbmUKICAgICB0ZXN0X2t3ZHMgPSBOb25lCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5CmluZGV4IDE2NzJhMzQuLmM3YjQ5ZWYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfaWRsZS5weQpAQCAtMzMsNyArMzMsNyBAQAogCiAKIGNsYXNzIEVkaXRvcjoKLSAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93IGNsYXNzLgorICAgICcnJ01pbmltYWxseSBpbWl0YXRlIGVkaXRvci5FZGl0b3JXaW5kb3cgY2xhc3MuCiAgICAgJycnCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgogICAgICAgICBzZWxmLnRleHQgPSBUZXh0KCkKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogCiBjbGFzcyBVbmRvRGVsZWdhdG9yOgotICAgICcnJ01pbmltYWxseSBpbWl0YXRlIFVuZG9EZWxlZ2F0b3IsVW5kb0RlbGVnYXRvciBjbGFzcy4KKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSB1bmRvLlVuZG9EZWxlZ2F0b3IgY2xhc3MuCiAgICAgJycnCiAgICAgIyBBIHJlYWwgdW5kbyBibG9jayBpcyBvbmx5IG5lZWRlZCBmb3IgdXNlciBpbnRlcmFjdGlvbi4KICAgICBkZWYgdW5kb19ibG9ja19zdGFydCgqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkKaW5kZXggZTQ0OTNkMS4uYTE0YzZkYiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9jb21wbGV0ZS5weQpAQCAtMSwxMCArMSwxNCBAQAorJycnIFRlc3QgYXV0b2NvbXBsZXRlIGFuZCBhdXRvY29tcGxlX3cKKworQ292ZXJhZ2Ugb2YgYXV0b2NvbXBsZTogNTYlCisnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiAKLWltcG9ydCBpZGxlbGliLkF1dG9Db21wbGV0ZSBhcyBhYwotaW1wb3J0IGlkbGVsaWIuQXV0b0NvbXBsZXRlV2luZG93IGFzIGFjdwotaW1wb3J0IGlkbGVsaWIubWFjb3N4U3VwcG9ydCBhcyBtYWMKK2ltcG9ydCBpZGxlbGliLmF1dG9jb21wbGV0ZSBhcyBhYworaW1wb3J0IGlkbGVsaWIuYXV0b2NvbXBsZXRlX3cgYXMgYWN3Citmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgRXZlbnQKIApAQCAtMjcsNyArMzEsNyBAQAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgIHJlcXVpcmVzKCdndWknKQogICAgICAgICBjbHMucm9vdCA9IFRrKCkKLSAgICAgICAgbWFjLnNldHVwQXBwKGNscy5yb290LCBOb25lKQorICAgICAgICBtYWNvc3guc2V0dXBBcHAoY2xzLnJvb3QsIE5vbmUpCiAgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMucm9vdCkKICAgICAgICAgY2xzLmVkaXRvciA9IER1bW15RWRpdHdpbihjbHMucm9vdCwgY2xzLnRleHQpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvZXhwYW5kLnB5CmluZGV4IGQyYTMxNTYuLjVkMjM0ZGQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weQpAQCAtMSw5ICsxLDkgQEAKLSIiIlVuaXQgdGVzdHMgZm9yIGlkbGVsaWIuQXV0b0V4cGFuZCIiIgorIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5hdXRvZXhwYW5kIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUZXh0LCBUawogI2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAotZnJvbSBpZGxlbGliLkF1dG9FeHBhbmQgaW1wb3J0IEF1dG9FeHBhbmQKK2Zyb20gaWRsZWxpYi5hdXRvZXhwYW5kIGltcG9ydCBBdXRvRXhwYW5kCiAKIAogY2xhc3MgRHVtbXlfRWRpdHdpbjoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKaW5kZXggYjJhNzMzYy4uMGIxMTYwMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpZGxlbGliLkNhbGxUaXBzIGFzIGN0CitpbXBvcnQgaWRsZWxpYi5jYWxsdGlwcyBhcyBjdAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdHlwZXMKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOGJjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb2xvcml6ZXIucHkKQEAgLTAsMCArMSw1NiBAQAorJycnVGVzdCBpZGxlbGliL2NvbG9yaXplci5weQorCitQZXJmb3JtIG1pbmltYWwgc2FuaXR5IGNoZWNrcyB0aGF0IG1vZHVsZSBpbXBvcnRzIGFuZCBzb21lIHRoaW5ncyBydW4uCisKK0NvdmVyYWdlIDIyJS4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBjb2xvcml6ZXIgICMgYWx3YXlzIHRlc3QgaW1wb3J0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZ1bmN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xvcml6ZXIuYW55KCd0ZXN0JywgKCdhJywgJ2InKSkpCisKKyAgICBkZWYgdGVzdF9tYWtlX3BhdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbG9yaXplci5tYWtlX3BhdCgpKQorCisKK2NsYXNzIENvbG9yQ29uZmlnVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMucm9vdCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGRlbCBjbHMudGV4dAorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9jb2xvcml6ZXIoc2VsZik6CisgICAgICAgIGNvbG9yaXplci5jb2xvcl9jb25maWcoc2VsZi50ZXh0KQorCitjbGFzcyBDb2xvckRlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfY29sb3JpemVyKHNlbGYpOgorICAgICAgICBjb2xvcml6ZXIuQ29sb3JEZWxlZ2F0b3IoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19oZWxwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkKaW5kZXggNjY0ZjhlZC4uYjg5YjRlMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkKQEAgLTEsNyArMSw3IEBACi0iIiJVbml0dGVzdHMgZm9yIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQiIiIKKyIiIlVuaXR0ZXN0cyBmb3IgaWRsZWxpYi5jb25maWdfaGVscC5weSIiIgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhciwgTWJveCwgRW50cnkKLWZyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnSGVscFNvdXJjZUVkaXQgYXMgaGVscF9kaWFsb2dfbW9kdWxlCitmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ19oZWxwIGFzIGhlbHBfZGlhbG9nX21vZHVsZQogCiBoZWxwX2RpYWxvZyA9IGhlbHBfZGlhbG9nX21vZHVsZS5HZXRIZWxwU291cmNlRGlhbG9nCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19rZXkucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfa2V5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMDk4MjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfa2V5LnB5CkBAIC0wLDAgKzEsMzEgQEAKKycnJyBUZXN0IGlkbGVsaWIuY29uZmlnX2tleS4KKworQ292ZXJhZ2U6IDU2JQorJycnCitmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ19rZXkKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworcmVxdWlyZXMoJ2d1aScpCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKKworCitjbGFzcyBHZXRLZXlzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgZGlhID0gY29uZmlnX2tleS5HZXRLZXlzRGlhbG9nKAorICAgICAgICAgICAgc2VsZi5yb290LCAndGVzdCcsICc8PFRlc3Q+PicsIFsnPEtleS1GMTI+J10sIF91dGVzdD1UcnVlKQorICAgICAgICBkaWEuQ2FuY2VsKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdfbmFtZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19uYW1lLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGU3MmI5Li4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19uYW1lLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5jb25maWdTZWN0aW9uTmFtZURpYWxvZyIiIgotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhciwgTWJveAotZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdTZWN0aW9uTmFtZURpYWxvZyBhcyBuYW1lX2RpYWxvZ19tb2R1bGUKLQotbmFtZV9kaWFsb2cgPSBuYW1lX2RpYWxvZ19tb2R1bGUuR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cKLQotY2xhc3MgRHVtbXlfbmFtZV9kaWFsb2c6Ci0gICAgIyBNb2NrIGZvciB0ZXN0aW5nIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiBuYW1lX2RpYWxvZwotICAgIG5hbWVfb2sgPSBuYW1lX2RpYWxvZy5uYW1lX29rCi0gICAgT2sgPSBuYW1lX2RpYWxvZy5PawotICAgIENhbmNlbCA9IG5hbWVfZGlhbG9nLkNhbmNlbAotICAgICMgQXR0cmlidXRlcywgY29uc3RhbnQgb3IgdmFyaWFibGUsIG5lZWRlZCBmb3IgdGVzdHMKLSAgICB1c2VkX25hbWVzID0gWyd1c2VkJ10KLSAgICBuYW1lID0gVmFyKCkKLSAgICByZXN1bHQgPSBOb25lCi0gICAgZGVzdHJveWVkID0gRmFsc2UKLSAgICBkZWYgZGVzdHJveShzZWxmKToKLSAgICAgICAgc2VsZi5kZXN0cm95ZWQgPSBUcnVlCi0KLSMgbmFtZV9vayBjYWxscyBNYm94LnNob3dlcnJvciBpZiBuYW1lIGlzIG5vdCBvawotb3JpZ19tYm94ID0gbmFtZV9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveAotc2hvd2Vycm9yID0gTWJveC5zaG93ZXJyb3IKLQotY2xhc3MgQ29uZmlnTmFtZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRpYWxvZyA9IER1bW15X25hbWVfZGlhbG9nKCkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIG5hbWVfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBNYm94Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgotICAgICAgICBuYW1lX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94ID0gb3JpZ19tYm94Ci0KLSAgICBkZWYgdGVzdF9ibGFua19uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnICcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cubmFtZV9vaygpLCAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignTm8nLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X3VzZWRfbmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cubmFtZS5zZXQoJ3VzZWQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZScsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfbG9uZ19uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnZ29vZCcqOCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICcnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCd0b28gbG9uZycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfZ29vZF9uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnICBnb29kICcpCi0gICAgICAgIHNob3dlcnJvci50aXRsZSA9ICdObyBFcnJvcicgICMgc2hvdWxkIG5vdCBiZSBjYWxsZWQKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICdnb29kJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdObyBFcnJvcicpCi0KLSAgICBkZWYgdGVzdF9vayhzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5kaWFsb2cubmFtZS5zZXQoJ2dvb2QnKQotICAgICAgICBzZWxmLmRpYWxvZy5PaygpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cucmVzdWx0LCAnZ29vZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRpYWxvZy5kZXN0cm95ZWQpCi0KLSAgICBkZWYgdGVzdF9jYW5jZWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLmRlc3Ryb3llZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuZGlhbG9nLkNhbmNlbCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cucmVzdWx0LCAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdkaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdkaWFsb2cucHkKaW5kZXggYjA2MzYwMS4uMTgwMWE3ZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnZGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weQpAQCAtMSwyMSArMSwxOSBAQAotJycnVGVzdCBpZGxlbGliLmNvbmZpZ0RpYWxvZy4KKycnJ1Rlc3QgaWRsZWxpYi5jb25maWdkaWFsb2cuCiAKIENvdmVyYWdlOiA0NiUganVzdCBieSBjcmVhdGluZyBkaWFsb2cuCiBUaGUgb3RoZXIgaGFsZiBpcyBjb2RlIGZvciB3b3JraW5nIHdpdGggdXNlciBjdXN0b21pemF0aW9ucy4KICcnJwotZnJvbSBpZGxlbGliLmNvbmZpZ0RpYWxvZyBpbXBvcnQgQ29uZmlnRGlhbG9nICAjIGFsd2F5cyB0ZXN0IGltcG9ydAorZnJvbSBpZGxlbGliLmNvbmZpZ2RpYWxvZyBpbXBvcnQgQ29uZmlnRGlhbG9nICAjIGFsd2F5cyB0ZXN0IGltcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKIGltcG9ydCB1bml0dGVzdAotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0IGFzIG1hY29zeAogCiBjbGFzcyBDb25maWdEaWFsb2dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgIGNscy5yb290ID0gVGsoKQotICAgICAgICBtYWNvc3guX2luaXRpYWxpemVUa1ZhcmlhbnRUZXN0cyhjbHMucm9vdCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmE5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWJ1Z2dlci5weQpAQCAtMCwwICsxLDI5IEBACisnJycgVGVzdCBpZGxlbGliLmRlYnVnZ2VyLgorCitDb3ZlcmFnZTogMTklCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXIKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworcmVxdWlyZXMoJ2d1aScpCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKKworCitjbGFzcyBOYW1lU3BhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBkZWJ1Z2dlci5OYW1lc3BhY2VWaWV3ZXIoc2VsZi5yb290LCAnVGVzdCcpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5CmluZGV4IDFmMGJhYTkuLjg1NjI0ZmIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLmRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCiAKIGNsYXNzIERlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0bWVudS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CmluZGV4IDUwMzE3YTkuLjY1NGYwNjAgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CkBAIC01LDggKzUsOSBAQAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIGltcG9ydCB0a2ludGVyIGFzIHRrCitmcm9tIHRraW50ZXIgaW1wb3J0IHR0awogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlzaGVsbAogCiBjbGFzcyBQYXN0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICcnJ1Rlc3QgcGFzdGluZyBpbnRvIHdpZGdldHMgdGhhdCBhbGxvdyBwYXN0aW5nLgpAQCAtMTYsMTYgKzE3LDE3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnJvb3QgPSByb290ID0gdGsuVGsoKQotICAgICAgICBQeVNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKKyAgICAgICAgcHlzaGVsbC5maXhfeDExX3Bhc3RlKHJvb3QpCiAgICAgICAgIGNscy50ZXh0ID0gdGsuVGV4dChyb290KQogICAgICAgICBjbHMuZW50cnkgPSB0ay5FbnRyeShyb290KQorICAgICAgICBjbHMudGVudHJ5ID0gdHRrLkVudHJ5KHJvb3QpCiAgICAgICAgIGNscy5zcGluID0gdGsuU3BpbmJveChyb290KQogICAgICAgICByb290LmNsaXBib2FyZF9jbGVhcigpCiAgICAgICAgIHJvb3QuY2xpcGJvYXJkX2FwcGVuZCgndHdvJykKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLmVudHJ5LCBjbHMuc3BpbgorICAgICAgICBkZWwgY2xzLnRleHQsIGNscy5lbnRyeSwgY2xzLnRlbnRyeQogICAgICAgICBjbHMucm9vdC5jbGlwYm9hcmRfY2xlYXIoKQogICAgICAgICBjbHMucm9vdC51cGRhdGVfaWRsZXRhc2tzKCkKICAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCkBAIC00MywxNiArNDUsMTYgQEAKIAogICAgIGRlZiB0ZXN0X3Bhc3RlX2VudHJ5KHNlbGYpOgogICAgICAgICAiVGVzdCBwYXN0aW5nIGludG8gYW4gZW50cnkgd2l0aCBhbmQgd2l0aG91dCBhIHNlbGVjdGlvbi4iCi0gICAgICAgICMgT24gMy42LCBnZW5lcmF0ZWQgPDxQYXN0ZT4+IGZhaWxzIHdpdGhvdXQgZW1wdHkgc2VsZWN0IHJhbmdlCi0gICAgICAgICMgZm9yICdubyBzZWxlY3Rpb24nLiAgTGl2ZSB3aWRnZXQgd29ya3MgZmluZS4KLSAgICAgICAgZW50cnkgPSBzZWxmLmVudHJ5Ci0gICAgICAgIGZvciBlbmQsIGFucyBpbiAoMCwgJ29uZXR3bycpLCAoJ2VuZCcsICd0d28nKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGVudHJ5PWVudHJ5LCBlbmQ9ZW5kLCBhbnM9YW5zKToKLSAgICAgICAgICAgICAgICBlbnRyeS5kZWxldGUoMCwgJ2VuZCcpCi0gICAgICAgICAgICAgICAgZW50cnkuaW5zZXJ0KDAsICdvbmUnKQotICAgICAgICAgICAgICAgIGVudHJ5LnNlbGVjdF9yYW5nZSgwLCBlbmQpICAjIHNlZSBub3RlCi0gICAgICAgICAgICAgICAgZW50cnkuZXZlbnRfZ2VuZXJhdGUoJzw8UGFzdGU+PicpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5nZXQoKSwgYW5zKQorICAgICAgICAjIEdlbmVyYXRlZCA8PFBhc3RlPj4gZmFpbHMgZm9yIHRrIGVudHJ5IHdpdGhvdXQgZW1wdHkgc2VsZWN0CisgICAgICAgICMgcmFuZ2UgZm9yICdubyBzZWxlY3Rpb24nLiAgTGl2ZSB3aWRnZXQgd29ya3MgZmluZS4KKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cnksIHNlbGYudGVudHJ5OgorICAgICAgICAgICAgZm9yIGVuZCwgYW5zIGluICgwLCAnb25ldHdvJyksICgnZW5kJywgJ3R3bycpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGVudHJ5PWVudHJ5LCBlbmQ9ZW5kLCBhbnM9YW5zKToKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGVsZXRlKDAsICdlbmQnKQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnNlcnQoMCwgJ29uZScpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNlbGVjdF9yYW5nZSgwLCBlbmQpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmV2ZW50X2dlbmVyYXRlKCc8PFBhc3RlPj4nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmdldCgpLCBhbnMpCiAKICAgICBkZWYgdGVzdF9wYXN0ZV9zcGluKHNlbGYpOgogICAgICAgICAiVGVzdCBwYXN0aW5nIGludG8gYSBzcGluYm94IHdpdGggYW5kIHdpdGhvdXQgYSBzZWxlY3Rpb24uIgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5CmluZGV4IGEzMWQyNmQuLmU5ZDI5ZDQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkKQEAgLTEsNiArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIAogY2xhc3MgRWRpdG9yX2Z1bmNfdGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZ3JlcC5weQppbmRleCAwZDhmZjBkLi42YjU0YzEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKQEAgLTEsNSArMSw1IEBACiAiIiIgIUNoYW5naW5nIHRoaXMgbGluZSB3aWxsIGJyZWFrIFRlc3RfZmluZGZpbGUudGVzdF9mb3VuZCEKLU5vbi1ndWkgdW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5HcmVwRGlhbG9nIG1ldGhvZHMuCitOb24tZ3VpIHVuaXQgdGVzdHMgZm9yIGdyZXAuR3JlcERpYWxvZyBtZXRob2RzLgogZHVtbXlfY29tbWFuZCBjYWxscyBncmVwX2l0IGNhbGxzIGZpbmRmaWxlcy4KIEFuIGV4Y2VwdGlvbiByYWlzZWQgaW4gb25lIG1ldGhvZCB3aWxsIGZhaWwgY2FsbGVycy4KIE90aGVyd2lzZSwgdGVzdHMgYXJlIG1vc3RseSBpbmRlcGVuZGVudC4KQEAgLTgsNyArOCw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyCi1mcm9tIGlkbGVsaWIuR3JlcERpYWxvZyBpbXBvcnQgR3JlcERpYWxvZworZnJvbSBpZGxlbGliLmdyZXAgaW1wb3J0IEdyZXBEaWFsb2cKIGltcG9ydCByZQogCiBjbGFzcyBEdW1teV9zZWFyY2hlbmdpbmU6CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lc1s0XS5zdGFydHN3aXRoKCcoSGludDonKSkKIAogY2xhc3MgRGVmYXVsdF9jb21tYW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUbyB3cml0ZSB0aGlzLCBtb2RlIE91dHB1dFdpbmRvdyBpbXBvcnQgdG8gdG9wIG9mIEdyZXBEaWFsb2cKKyAgICAjIFRvIHdyaXRlIHRoaXMsIG1vdmUgb3V0d2luIGltcG9ydCB0byB0b3Agb2YgR3JlcERpYWxvZwogICAgICMgc28gaXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGNhcHR1cmVkX3N0ZG91dCBpbiBjbGFzcyBzZXR1cC90ZWFyZG93bi4KICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGVkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwLnB5CkBAIC0wLDAgKzEsMzQgQEAKKycnJ1Rlc3QgaWRsZWxpYi5oZWxwLgorCitDb3ZlcmFnZTogODclCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaGVscAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgam9pbgorZnJvbSB0a2ludGVyIGltcG9ydCBUaworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIEhlbHBGcmFtZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgIkJ5IGl0c2VsZiwgdGhpcyB0ZXN0cyB0aGF0IGZpbGUgcGFyc2VkIHdpdGhvdXQgZXhjZXB0aW9uLiIKKyAgICAgICAgY2xzLnJvb3QgPSByb290ID0gVGsoKQorICAgICAgICByb290LndpdGhkcmF3KCkKKyAgICAgICAgaGVscGZpbGUgPSBqb2luKGFic3BhdGgoZGlybmFtZShkaXJuYW1lKF9fZmlsZV9fKSkpLCAnaGVscC5odG1sJykKKyAgICAgICAgY2xzLmZyYW1lID0gaGVscC5IZWxwRnJhbWUocm9vdCwgaGVscGZpbGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLmZyYW1lCisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9saW5lMShzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYuZnJhbWUudGV4dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZ2V0KCcxLjAnLCAnMS5lbmQnKSwgJyBJRExFICcpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwX2Fib3V0LnB5CmluZGV4IGQwYTAxMjcuLjg0M2VmYjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weQpAQCAtMiwxMCArMiwxMCBAQAogCiBDb3ZlcmFnZToKICcnJwotZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZyBhcyBoZWxwX2Fib3V0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IHRleHRWaWV3IGFzIHRleHR2aWV3Citmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCi1mcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IE1ib3gKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveF9mdW5jCiBpbXBvcnQgdW5pdHRlc3QKIAogQWJvdXQgPSBoZWxwX2Fib3V0LkFib3V0RGlhbG9nCkBAIC0xOSwzMyArMTksMzMgQEAKIAogCiBjbGFzcyBEaXNwbGF5RmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICJUZXN0IHRoYXQgLnR4dCBmaWxlcyBhcmUgZm91bmQgYW5kIHByb3Blcmx5IGRlY29kZWQuIgogICAgIGRpYWxvZyA9IER1bW15X2Fib3V0X2RpYWxvZygpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgotICAgICAgICBjbHMub3JpZ19tYm94ID0gdGV4dHZpZXcudGtNZXNzYWdlQm94CisgICAgICAgIGNscy5vcmlnX2Vycm9yID0gdGV4dHZpZXcuc2hvd2Vycm9yCiAgICAgICAgIGNscy5vcmlnX3ZpZXcgPSB0ZXh0dmlldy52aWV3X3RleHQKLSAgICAgICAgY2xzLm1ib3ggPSBNYm94KCkKKyAgICAgICAgY2xzLmVycm9yID0gTWJveF9mdW5jKCkKICAgICAgICAgY2xzLnZpZXcgPSBGdW5jKCkKLSAgICAgICAgdGV4dHZpZXcudGtNZXNzYWdlQm94ID0gY2xzLm1ib3gKKyAgICAgICAgdGV4dHZpZXcuc2hvd2Vycm9yID0gY2xzLmVycm9yCiAgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dCA9IGNscy52aWV3CiAgICAgICAgIGNscy5BYm91dCA9IER1bW15X2Fib3V0X2RpYWxvZygpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgotICAgICAgICB0ZXh0dmlldy50a01lc3NhZ2VCb3ggPSBjbHMub3JpZ19tYm94CisgICAgICAgIHRleHR2aWV3LnNob3dlcnJvciA9IGNscy5vcmlnX2Vycm9yCiAgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dCA9IGNscy5vcmlnX3ZpZXcKIAogICAgIGRlZiB0ZXN0X2ZpbGVfaXNwbGF5KHNlbGYpOgogICAgICAgICBmb3IgaGFuZGxlciBpbiAoc2VsZi5kaWFsb2cuaWRsZV9jcmVkaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cuaWRsZV9yZWFkbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5pZGxlX25ld3MpOgotICAgICAgICAgICAgc2VsZi5tYm94LnNob3dlcnJvci5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuZXJyb3IubWVzc2FnZSA9ICcnCiAgICAgICAgICAgICBzZWxmLnZpZXcuY2FsbGVkID0gRmFsc2UKLSAgICAgICAgICAgIGhhbmRsZXIoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1ib3guc2hvd2Vycm9yLm1lc3NhZ2UsICcnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnZpZXcuY2FsbGVkLCBUcnVlKQorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoaGFuZGxlcj1oYW5kbGVyKToKKyAgICAgICAgICAgICAgICBoYW5kbGVyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZXJyb3IubWVzc2FnZSwgJycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnZpZXcuY2FsbGVkLCBUcnVlKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hpc3RvcnkucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaWRsZWhpc3RvcnkucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hpc3RvcnkucHkKaW5kZXggZDdjM2Q3MC4uNmU4MjY5YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaWRsZWhpc3RvcnkucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQpAQCAtNCw4ICs0LDggQEAKIGltcG9ydCB0a2ludGVyIGFzIHRrCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQgYXMgdGtUZXh0CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQgYXMgbWtUZXh0Ci1mcm9tIGlkbGVsaWIuSWRsZUhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIGxpbmUxID0gJ2EgPSA3JwogbGluZTIgPSAnYiA9IGEnCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oeXBlcnBhcnNlci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CmluZGV4IGVkZmM3ODMuLjA2N2U1YjEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CkBAIC0xLDkgKzEsOSBAQAotIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIuSHlwZXJQYXJzZXIiIiIKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLmh5cGVycGFyc2VyLnB5LiIiIgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdwotZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiAKIGNsYXNzIER1bW15RWRpdHdpbjoKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pby5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvbWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pby5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CmluZGV4IGUwZTNiOTguLmY4ZmYxMTIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvbWVudS5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGlvCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCiAKIAogY2xhc3MgUyhzdHIpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9tYWNvc3gucHkKQEAgLTAsMCArMSwxMDEgQEAKKycnJ1Rlc3QgaWRsZWxpYi5tYWNvc3gucHkuCisKK0NvdmVyYWdlOiA3MSUgb24gV2luZG93cy4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHN5cworaW1wb3J0IHRraW50ZXIgYXMgdGsKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0Lm1vY2sgYXMgbW9jaworZnJvbSBpZGxlbGliLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorCittYWN0eXBlcyA9IHsnY2FyYm9uJywgJ2NvY29hJywgJ3hxdWFydHonfQorbm9udHlwZXMgPSB7J290aGVyJ30KK2FsbHR5cGVzID0gbWFjdHlwZXMgfCBub250eXBlcworCisKK2NsYXNzIEluaXRUa3R5cGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBfaW5pdF90a190eXBlLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKyAgICAgICAgY2xzLm9yaWdfcGxhdGZvcm0gPSBtYWNvc3gucGxhdGZvcm0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisgICAgICAgIG1hY29zeC5wbGF0Zm9ybSA9IGNscy5vcmlnX3BsYXRmb3JtCisKKyAgICBkZWYgdGVzdF9pbml0X3NldHNfdGt0eXBlKHNlbGYpOgorICAgICAgICAiVGVzdCB0aGF0IF9pbml0X3RrX3R5cGUgc2V0cyBfdGtfdHlwZSBhY2NvcmRpbmcgdG8gcGxhdGZvcm0uIgorICAgICAgICBmb3IgcGxhdGZvcm0sIHR5cGVzIGluICgnZGFyd2luJywgYWxsdHlwZXMpLCAoJ290aGVyJywgbm9udHlwZXMpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QocGxhdGZvcm09cGxhdGZvcm0pOgorICAgICAgICAgICAgICAgIG1hY29zeC5wbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgICAgICAgICAgbWFjb3N4Ll90a190eXBlID09IE5vbmUKKyAgICAgICAgICAgICAgICBtYWNvc3guX2luaXRfdGtfdHlwZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtYWNvc3guX3RrX3R5cGUsIHR5cGVzKQorCisKK2NsYXNzIElzVHlwZVRrVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgZWFjaCBvZiB0aGUgZm91ciBpc1R5cGVUayBwcmVkZWNhdGVzLiIKKyAgICBpc2Z1bmNzID0gKChtYWNvc3guaXNBcXVhVGssICgnY2FyYm9uJywgJ2NvY29hJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc0NhcmJvblRrLCAoJ2NhcmJvbicpKSwKKyAgICAgICAgICAgICAgIChtYWNvc3guaXNDb2NvYVRrLCAoJ2NvY29hJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc1hRdWFydHosICgneHF1YXJ0eicpKSwKKyAgICAgICAgICAgICAgICkKKworICAgIEBtb2NrLnBhdGNoKCdpZGxlbGliLm1hY29zeC5faW5pdF90a190eXBlJykKKyAgICBkZWYgdGVzdF9pc19jYWxsc19pbml0KHNlbGYsIG1vY2tpbml0KToKKyAgICAgICAgIlRlc3QgdGhhdCBlYWNoIGlzVHlwZVRrIGNhbGxzIF9pbml0X3RrX3R5cGUgd2hlbiBfdGtfdHlwZSBpcyBOb25lLiIKKyAgICAgICAgbWFjb3N4Ll90a190eXBlID0gTm9uZQorICAgICAgICBmb3IgZnVuYywgd2hlbnRydWUgaW4gc2VsZi5pc2Z1bmNzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja2luaXQuY2FsbGVkKQorICAgICAgICAgICAgICAgIG1vY2tpbml0LnJlc2V0X21vY2soKQorCisgICAgZGVmIHRlc3RfaXNmdW5jcyhzZWxmKToKKyAgICAgICAgIlRlc3QgdGhhdCBlYWNoIGlzVHlwZVRrIHJldHVybiBjb3JyZWN0IGJvb2wuIgorICAgICAgICBmb3IgZnVuYywgd2hlbnRydWUgaW4gc2VsZi5pc2Z1bmNzOgorICAgICAgICAgICAgZm9yIHRrdHlwZSBpbiBhbGx0eXBlczoKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChmdW5jPWZ1bmMsIHdoZW50cnVlPXdoZW50cnVlLCB0a3R5cGU9dGt0eXBlKToKKyAgICAgICAgICAgICAgICAgICAgbWFjb3N4Ll90a190eXBlID0gdGt0eXBlCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmFzc2VydFRydWUgaWYgdGt0eXBlIGluIHdoZW50cnVlIGVsc2Ugc2VsZi5hc3NlcnRGYWxzZSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmMoKSkKKworCitjbGFzcyBTZXR1cFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IHNldHVwQXBwLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBAbW9jay5wYXRjaCgnaWRsZWxpYi5tYWNvc3gub3ZlcnJpZGVSb290TWVudScpICAjMjczMTIKKyAgICBkZWYgdGVzdF9zZXR1cGFwcChzZWxmLCBvdmVycmlkZVJvb3RNZW51KToKKyAgICAgICAgIkNhbGwgc2V0dXBBcHAgd2l0aCBlYWNoIHBvc3NpYmxlIGdyYXBoaWNzIHR5cGUuIgorICAgICAgICByb290ID0gc2VsZi5yb290CisgICAgICAgIGZsaXN0ID0gRmlsZUxpc3Qocm9vdCkKKyAgICAgICAgZm9yIHRrdHlwZSBpbiBhbGx0eXBlczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRrdHlwZT10a3R5cGUpOgorICAgICAgICAgICAgICAgIG1hY29zeC5fdGtfdHlwZSA9IHRrdHlwZQorICAgICAgICAgICAgICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBmbGlzdCkKKyAgICAgICAgICAgICAgICBpZiB0a3R5cGUgaW4gKCdjYXJib24nLCAnY29jb2EnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG92ZXJyaWRlUm9vdE1lbnUuY2FsbGVkKQorICAgICAgICAgICAgICAgIG92ZXJyaWRlUm9vdE1lbnUucmVzZXRfbW9jaygpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZm9ybWF0cGFyYWdyYXBoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CmluZGV4IGU1NTYxZDguLjQ3NDFlYjggMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJhZ3JhcGgucHkKQEAgLTEsNyArMSw3IEBACi0jIFRlc3QgdGhlIGZ1bmN0aW9ucyBhbmQgbWFpbiBjbGFzcyBtZXRob2Qgb2YgRm9ybWF0UGFyYWdyYXBoLnB5CisjIFRlc3QgdGhlIGZ1bmN0aW9ucyBhbmQgbWFpbiBjbGFzcyBtZXRob2Qgb2YgcGFyYWdyYXBoLnB5CiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgRm9ybWF0UGFyYWdyYXBoIGFzIGZwCi1mcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcGFyYWdyYXBoIGFzIGZwCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogCkBAIC0zOCw3ICszOCw3IEBACiAKIAogY2xhc3MgRmluZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICIiIlRlc3QgdGhlIGZpbmRfcGFyYWdyYXBoIGZ1bmN0aW9uIGluIEZvcm1hdFBhcmFncmFwaC4KKyAgICAiIiJUZXN0IHRoZSBmaW5kX3BhcmFncmFwaCBmdW5jdGlvbiBpbiBwYXJhZ3JhcGggbW9kdWxlLgogCiAgICAgVXNpbmcgdGhlIHJ1bmNhc2UoKSBmdW5jdGlvbiwgZmluZF9wYXJhZ3JhcGgoKSBpcyBjYWxsZWQgd2l0aCAnbWFyaycgc2V0IGF0CiAgICAgbXVsdGlwbGUgaW5kZXhlcyBiZWZvcmUgYW5kIGluc2lkZSB0aGUgdGVzdCBwYXJhZ3JhcGguCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQppbmRleCA5NWNjMjJjLi5kNDY3YTlhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmVubWF0Y2gucHkKQEAgLTEsNCArMSw0IEBACi0nJydUZXN0IGlkbGVsaWIuUGFyZW5NYXRjaC4KKycnJ1Rlc3QgaWRsZWxpYi5wYXJlbm1hdGNoLgogCiBUaGlzIG11c3QgY3VycmVudGx5IGJlIGEgZ3VpIHRlc3QgYmVjYXVzZSBQYXJlbk1hdGNoIG1ldGhvZHMgdXNlCiBzZXZlcmFsIHRleHQgbWV0aG9kcyBub3QgZGVmaW5lZCBvbiBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrLlRleHQuCkBAIC05LDcgKzksNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5QYXJlbk1hdGNoIGltcG9ydCBQYXJlbk1hdGNoCitmcm9tIGlkbGVsaWIucGFyZW5tYXRjaCBpbXBvcnQgUGFyZW5NYXRjaAogCiBjbGFzcyBEdW1teUVkaXR3aW46CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQppbmRleCBhZmI4ODZmLi44MTNjYmNjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQpAQCAtMiwxMyArMiwxMyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgaWRsZWxpYgotZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgorZnJvbSBpZGxlbGliIGltcG9ydCBwYXRoYnJvd3NlcgogCiBjbGFzcyBQYXRoQnJvd3NlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfRGlyQnJvd3NlclRyZWVJdGVtKHNlbGYpOgogICAgICAgICAjIElzc3VlMTYyMjYgLSBtYWtlIHN1cmUgdGhhdCBnZXR0aW5nIGEgc3VibGlzdCB3b3JrcwotICAgICAgICBkID0gUGF0aEJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKCcnKQorICAgICAgICBkID0gcGF0aGJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKCcnKQogICAgICAgICBkLkdldFN1Ykxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBkLkdldFRleHQoKSkKIApAQCAtMTcsMTEgKzE3LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc3BhY2thZ2VkaXIoZGlyICsgJy9JY29ucycpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X1BhdGhCcm93c2VyVHJlZUl0ZW0oc2VsZik6Ci0gICAgICAgIHAgPSBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlclRyZWVJdGVtKCkKKyAgICAgICAgcCA9IHBhdGhicm93c2VyLlBhdGhCcm93c2VyVHJlZUl0ZW0oKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuR2V0VGV4dCgpLCAnc3lzLnBhdGgnKQogICAgICAgICBzdWIgPSBwLkdldFN1Ykxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWIpLCBsZW4oc3lzLnBhdGgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3ViWzBdKSwgUGF0aEJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3ViWzBdKSwgcGF0aGJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGVyY29sYXRvci5weQppbmRleCA0YzBhN2FkLi41NzNiOWExIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BlcmNvbGF0b3IucHkKQEAgLTEsMTAgKzEsMTAgQEAKLScnJ1Rlc3QgUGVyY29sYXRvcicnJworJycnVGVzdCBwZXJjb2xhdG9yLnB5LicnJwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrLCBFTkQKLWZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yLCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yLCBEZWxlZ2F0b3IKIAogCiBjbGFzcyBNeUZpbHRlcihEZWxlZ2F0b3IpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcXVlcnkucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9xdWVyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODg3M2M0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcXVlcnkucHkKQEAgLTAsMCArMSwyNDIgQEAKKyIiIlRlc3QgaWRsZWxpYi5xdWVyeS4KKworQ292ZXJhZ2U6IDEwMCUuCisiIiIKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworZnJvbSB0a2ludGVyIGltcG9ydCBUaworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhciwgTWJveF9mdW5jCitmcm9tIGlkbGVsaWIgaW1wb3J0IHF1ZXJ5CisKK1F1ZXJ5ID0gcXVlcnkuUXVlcnkKK2NsYXNzIER1bW15X1F1ZXJ5OgorICAgICMgTW9jayBmb3IgdGVzdGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgUXVlcnkKKyAgICBlbnRyeV9vayA9IFF1ZXJ5LmVudHJ5X29rCisgICAgb2sgPSBRdWVyeS5vaworICAgIGNhbmNlbCA9IFF1ZXJ5LmNhbmNlbAorICAgICMgQXR0cmlidXRlcywgY29uc3RhbnQgb3IgdmFyaWFibGUsIG5lZWRlZCBmb3IgdGVzdHMKKyAgICBlbnRyeSA9IFZhcigpCisgICAgcmVzdWx0ID0gTm9uZQorICAgIGRlc3Ryb3llZCA9IEZhbHNlCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgIHNlbGYuZGVzdHJveWVkID0gVHJ1ZQorCisjIGVudHJ5X29rIGNhbGxzIG1vZGFsIG1lc3NhZ2Vib3guc2hvd2Vycm9yIGlmIGVudHJ5IGlzIG5vdCBvay4KKyMgTW9jayBzaG93ZXJyZXIgc28gZG9uJ3QgbmVlZCB0byBjbGljayB0byBjb250aW51ZS4KK29yaWdfc2hvd2Vycm9yID0gcXVlcnkuc2hvd2Vycm9yCitzaG93ZXJyb3IgPSBNYm94X2Z1bmMoKSAgIyBJbnN0YW5jZSBoYXMgX19jYWxsX18gbWV0aG9kLgorCitkZWYgc2V0VXBNb2R1bGUoKToKKyAgICBxdWVyeS5zaG93ZXJyb3IgPSBzaG93ZXJyb3IKKworZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgcXVlcnkuc2hvd2Vycm9yID0gb3JpZ19zaG93ZXJyb3IKKworCitjbGFzcyBRdWVyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRpYWxvZyA9IER1bW15X1F1ZXJ5KCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gTm9uZQorICAgICAgICBzZWxmLmRpYWxvZy5yZXN1bHQgPSBOb25lCisgICAgICAgIHNlbGYuZGlhbG9nLmRlc3Ryb3llZCA9IEZhbHNlCisKKyAgICBkZWYgdGVzdF9ibGFua19lbnRyeShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5lbnRyeS5zZXQoJyAnKQorICAgICAgICBFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgRXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgRmFsc2UpKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdFbnRyeSBFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JsYW5rJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9nb29kX2VudHJ5KHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnICBnb29kICcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCAnZ29vZCcpCisgICAgICAgIEVxdWFsKChkaWFsb2cucmVzdWx0LCBkaWFsb2cuZGVzdHJveWVkKSwgKE5vbmUsIEZhbHNlKSkKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCBOb25lKQorCisgICAgZGVmIHRlc3Rfb2soc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdnb29kJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLm9rKCksIE5vbmUpCisgICAgICAgIEVxdWFsKChkaWFsb2cucmVzdWx0LCBkaWFsb2cuZGVzdHJveWVkKSwgKCdnb29kJywgVHJ1ZSkpCisKKyAgICBkZWYgdGVzdF9jYW5jZWwoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5jYW5jZWwoKSwgTm9uZSkKKyAgICAgICAgRXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgVHJ1ZSkpCisKKworY2xhc3MgRHVtbXlfU2VjdGlvbk5hbWU6CisgICAgZW50cnlfb2sgPSBxdWVyeS5TZWN0aW9uTmFtZS5lbnRyeV9vayAgIyBUZXN0IG92ZXJyaWRlLgorICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQorICAgIGVudHJ5ID0gVmFyKCkKKworY2xhc3MgU2VjdGlvbk5hbWVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkaWFsb2cgPSBEdW1teV9TZWN0aW9uTmFtZSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNob3dlcnJvci50aXRsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2JsYW5rX3NlY3Rpb25fbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5lbnRyeS5zZXQoJyAnKQorICAgICAgICBFcXVhbChkaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ05vJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF91c2VkX3NlY3Rpb25fbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5lbnRyeS5zZXQoJ3VzZWQnKQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9sb25nX3NlY3Rpb25fbmFtZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5lbnRyeS5zZXQoJ2dvb2QnKjgpCisgICAgICAgIEVxdWFsKHNlbGYuZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCd0b28gbG9uZycsIHNob3dlcnJvci5tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZ29vZF9zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCcgIGdvb2QgJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5X29rKCksICdnb29kJykKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCBOb25lKQorCisKK2NsYXNzIER1bW15X01vZHVsZU5hbWU6CisgICAgZW50cnlfb2sgPSBxdWVyeS5Nb2R1bGVOYW1lLmVudHJ5X29rICAjIFRlc3Qgb3ZlcnJpZGUKKyAgICB0ZXh0MCA9ICcnCisgICAgZW50cnkgPSBWYXIoKQorCitjbGFzcyBNb2R1bGVOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGlhbG9nID0gRHVtbXlfTW9kdWxlTmFtZSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNob3dlcnJvci50aXRsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2JsYW5rX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnICcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignTm8nLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnX19uYW1lX3h5ejEyM19zaG91bGRfbm90X2V4aXN0X18nKQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdJbXBvcnQgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZm91bmQnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2Nfc291cmNlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdpdGVydG9vbHMnKQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdJbXBvcnQgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdzb3VyY2UtYmFzZWQnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2dvb2RfbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdpZGxlbGliJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5lbnRyeV9vaygpLmVuZHN3aXRoKCdfX2luaXRfXy5weScpKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsIE5vbmUpCisKKworY2xhc3MgUXVlcnlHdWlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSBUaygpCisgICAgICAgIGNscy5kaWFsb2cgPSBRdWVyeShyb290LCAnVEVTVCcsICd0ZXN0JywgX3V0ZXN0PVRydWUpCisgICAgICAgIGNscy5kaWFsb2cuZGVzdHJveSA9IG1vY2suTW9jaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLmRpYWxvZworICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLmVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgc2VsZi5kaWFsb2cucmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95LnJlc2V0X21vY2soKQorCisgICAgZGVmIHRlc3RfY2xpY2tfb2soc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucmVzdWx0LCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworICAgIGRlZiB0ZXN0X2NsaWNrX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaWFsb2cuZGVzdHJveS5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9jbGlja19jYW5jZWwoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fY2FuY2VsLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworCitjbGFzcyBTZWN0aW9ubmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIHJvb3QgPSBUaygpCisgICAgICAgIGRpYWxvZyA9ICBxdWVyeS5TZWN0aW9uTmFtZShyb290LCAnVCcsICd0JywgeydhYmMnfSwgX3V0ZXN0PVRydWUpCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChkaWFsb2cudXNlZF9uYW1lcywgeydhYmMnfSkKKyAgICAgICAgZGlhbG9nLmVudHJ5Lmluc2VydCgwLCAnb2theScpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgRXF1YWwoZGlhbG9nLnJlc3VsdCwgJ29rYXknKQorICAgICAgICBkZWwgZGlhbG9nCisgICAgICAgIHJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCByb290CisKKworY2xhc3MgTW9kdWxlbmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgcm9vdCA9IFRrKCkKKyAgICAgICAgZGlhbG9nID0gIHF1ZXJ5Lk1vZHVsZU5hbWUocm9vdCwgJ1QnLCAndCcsICdpZGxlbGliJywgX3V0ZXN0PVRydWUpCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChkaWFsb2cudGV4dDAsICdpZGxlbGliJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5LmdldCgpLCAnaWRsZWxpYicpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5yZXN1bHQuZW5kc3dpdGgoJ19faW5pdF9fLnB5JykpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKaW5kZXggYzY4ZGZjYy4uYzhkZDExOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVkaXJlY3Rvci5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3QgaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yLgorJycnVGVzdCBpZGxlbGliLnJlZGlyZWN0b3IuCiAKIDEwMCUgY292ZXJhZ2UKICcnJwpAQCAtNiw3ICs2LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQsIFRjbEVycm9yCi1mcm9tIGlkbGVsaWIuV2lkZ2V0UmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgorZnJvbSBpZGxlbGliLnJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKIAogCiBjbGFzcyBJbml0Q2xvc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTExOCw2ICsxMTgsNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5jYWxsKHNlbGYudGV4dC5fdywgJ2luc2VydCcsICdib28nKSwgJycpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlLnB5CmluZGV4IGZmNDQ4MjAuLmE5ZjNlMTUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2VkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLlJlcGxhY2VEaWFsb2ciIiIKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLnJlcGxhY2UucHkiIiIKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogcmVxdWlyZXMoJ2d1aScpCiAKQEAgLTYsOCArNiw4IEBACiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRW5naW5lIGFzIHNlCi1pbXBvcnQgaWRsZWxpYi5SZXBsYWNlRGlhbG9nIGFzIHJkCitpbXBvcnQgaWRsZWxpYi5zZWFyY2hlbmdpbmUgYXMgc2UKK2ltcG9ydCBpZGxlbGliLnJlcGxhY2UgYXMgcmQKIAogb3JpZ19tYm94ID0gc2UudGtNZXNzYWdlQm94CiBzaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5CmluZGV4IDFjOTBiOTMuLjEzMGU2YmUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JzdHJpcC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpZGxlbGliLlJzdHJpcEV4dGVuc2lvbiBhcyBycworaW1wb3J0IGlkbGVsaWIucnN0cmlwIGFzIHJzCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRWRpdG9yCiAKIGNsYXNzIHJzdHJpcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMjEsNyArMjEsNyBAQAogICAgIGRlZiB0ZXN0X3JzdHJpcF9tdWx0aXBsZShzZWxmKToKICAgICAgICAgZWRpdG9yID0gRWRpdG9yKCkKICAgICAgICAgIyAgVW5jb21tZW50IGZvbGxvd2luZyB0byB2ZXJpZnkgdGhhdCB0ZXN0IHBhc3NlcyB3aXRoIHJlYWwgd2lkZ2V0cy4KLSMjICAgICAgICBmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cgYXMgRWRpdG9yCisjIyAgICAgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93IGFzIEVkaXRvcgogIyMgICAgICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKICMjICAgICAgICBlZGl0b3IgPSBFZGl0b3Iocm9vdD1UaygpKQogICAgICAgICB0ZXh0ID0gZWRpdG9yLnRleHQKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3Njcm9sbGVkbGlzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3Njcm9sbGVkbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFhYmZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2Nyb2xsZWRsaXN0LnB5CkBAIC0wLDAgKzEsMjkgQEAKKycnJyBUZXN0IGlkbGVsaWIuc2Nyb2xsZWRsaXN0LgorCitDb3ZlcmFnZTogMzklCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2Nyb2xsZWRsaXN0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRraW50ZXIgaW1wb3J0IFRrCisKKworY2xhc3MgU2Nyb2xsZWRMaXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgc2Nyb2xsZWRsaXN0LlNjcm9sbGVkTGlzdChzZWxmLnJvb3QpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoLnB5CmluZGV4IDE5MGM4NjYuLjA3MzVkODQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2gucHkKQEAgLTEsNCArMSw0IEBACi0iIiJUZXN0IFNlYXJjaERpYWxvZyBjbGFzcyBpbiBTZWFyY2hEaWFsb2d1ZS5weSIiIgorIiIiVGVzdCBTZWFyY2hEaWFsb2cgY2xhc3MgaW4gaWRsZWxpYi5zZWFyY2gucHkiIiIKIAogIyBEb2VzIG5vdCBjdXJyZW50bHkgdGVzdCB0aGUgZXZlbnQgaGFuZGxlciB3cmFwcGVycy4KICMgQSB1c2FnZSB0ZXN0IHNob3VsZCBzaW11bGF0ZSBjbGlja3MgYW5kIGNoZWNrIGhpbGlnaHRpbmcuCkBAIC0xMSw4ICsxMSw4IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0a2ludGVyIGFzIHRrCiBmcm9tIHRraW50ZXIgaW1wb3J0IEJvb2xlYW5WYXIKLWltcG9ydCBpZGxlbGliLlNlYXJjaEVuZ2luZSBhcyBzZQotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRGlhbG9nIGFzIHNkCitpbXBvcnQgaWRsZWxpYi5zZWFyY2hlbmdpbmUgYXMgc2UKK2ltcG9ydCBpZGxlbGliLnNlYXJjaCBhcyBzZAogCiAKIGNsYXNzIFNlYXJjaERpYWxvZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGJhc2UucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoYmFzZS5weQppbmRleCA4MDM2YjkxLi5hMGIxMjMxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2diYXNlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGJhc2UucHkKQEAgLTEsNCArMSw0IEBACi0nJydVbml0dGVzdHMgZm9yIGlkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQorJycnVW5pdHRlc3RzIGZvciBpZGxlbGliL3NlYXJjaGJhc2UucHkKIAogQ292ZXJhZ2U6IDk5JS4gVGhlIG9ubHkgdGhpbmcgbm90IGNvdmVyZWQgaXMgaW5jb25zZXF1ZW50aWFsIC0tCiB0ZXN0aW5nIHNraXBwaW5nIG9mIHN1aXRlIHdoZW4gc2VsZi5uZWVkd3JhcGJ1dHRvbiBpcyBmYWxzZS4KQEAgLTcsOCArNyw4IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVG9wbGV2ZWwsIEZyYW1lICMjLCBCb29sZWFuVmFyLCBTdHJpbmdWYXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lIGFzIHNlCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UgYXMgc2RiCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZSBhcyBzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hiYXNlIGFzIHNkYgogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKICMjIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyCiAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBkZWYgdGVzdF9tYWtlX2VudHJ5KHNlbGYpOgogICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBlbnRyeSwgbGFiZWwgPSBzZWxmLmRpYWxvZy5tYWtlX2VudHJ5KCJUZXN0OiIsICdoZWxsbycpCiAgICAgICAgIGVxdWFsKGxhYmVsWyd0ZXh0J10sICdUZXN0OicpCiAKQEAgLTg3LDYgKzg3LDcgQEAKICAgICAgICAgZXF1YWwoc2VsZi5kaWFsb2cucm93LCAxKQogCiAgICAgZGVmIHRlc3RfY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCiAgICAgICAgIHNlbGYuZW5naW5lLnNldHBhdCgnaGVsbG8nKQogICAgICAgICBzZWxmLmRpYWxvZy5jcmVhdGVfZW50cmllcygpCkBAIC05NCw3ICs5NSw3IEBACiAKICAgICBkZWYgdGVzdF9tYWtlX2ZyYW1lKHNlbGYpOgogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCi0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIGZyYW1lLCBsYWJlbCA9IHNlbGYuZGlhbG9nLm1ha2VfZnJhbWUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhYmVsLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZyYW1lLCBGcmFtZSkKQEAgLTEwNCw3ICsxMDUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZnJhbWUsIEZyYW1lKQogCiAgICAgZGVmIGJ0bl90ZXN0X3NldHVwKHNlbGYsIG1ldGgpOgotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBzZWxmLmRpYWxvZy5yb3cgPSAwCiAgICAgICAgIHJldHVybiBtZXRoKCkKIApAQCAtMTQ1LDEyICsxNDYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQogCiAgICAgZGVmIHRlc3RfbWFrZV9idXR0b24oc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIHNlbGYuZGlhbG9nLmJ1dHRvbmZyYW1lID0gRnJhbWUoc2VsZi5kaWFsb2cudG9wKQogICAgICAgICBidG4gPSBzZWxmLmRpYWxvZy5tYWtlX2J1dHRvbignVGVzdCcsIHNlbGYuZGlhbG9nLmNsb3NlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ0blsndGV4dCddLCAnVGVzdCcpCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucygpCiAgICAgICAgICMgTG9vayBmb3IgY2xvc2UgYnV0dG9uIGNvbW1hbmQgaW4gYnV0dG9uZnJhbWUKICAgICAgICAgY2xvc2VidXR0b25jb21tYW5kID0gJycKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weQppbmRleCBlZGJkNTU4Li43ZTZmOGI3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hlbmdpbmUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCBmdW5jdGlvbnMgYW5kIFNlYXJjaEVuZ2luZSBjbGFzcyBpbiBTZWFyY2hFbmdpbmUucHkuJycnCisnJydUZXN0IGZ1bmN0aW9ucyBhbmQgU2VhcmNoRW5naW5lIGNsYXNzIGluIGlkbGVsaWIuc2VhcmNoZW5naW5lLnB5LicnJwogCiAjIFdpdGggbW9jayByZXBsYWNlbWVudHMsIHRoZSBtb2R1bGUgZG9lcyBub3QgdXNlIGFueSBndWkgd2lkZ2V0cy4KICMgVGhlIHVzZSBvZiB0ay5UZXh0IGlzIGF2b2lkZWQgKGZvciBub3csIHVudGlsIG1vY2sgVGV4dCBpcyBpbXByb3ZlZCkKQEAgLTEwLDcgKzEwLDcgQEAKICMgZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0ICBCb29sZWFuVmFyLCBTdHJpbmdWYXIsIFRjbEVycm9yICAjICxUaywgVGV4dAogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lIGFzIHNlCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZSBhcyBzZQogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBWYXIsIE1ib3gKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dCBhcyBtb2NrVGV4dAogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weQppbmRleCA3ZTgyM2RmLi5hNWJhN2JiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKQEAgLTEsMTcgKzEsMTkgQEAKLSMgVGVzdCBtb2NrX3RrLlRleHQgY2xhc3MgYWdhaW5zdCB0a2ludGVyLlRleHQgY2xhc3MgYnkgcnVubmluZyBzYW1lIHRlc3RzIHdpdGggYm90aC4KKycnJyBUZXN0IG1vY2tfdGsuVGV4dCBjbGFzcyBhZ2FpbnN0IHRraW50ZXIuVGV4dCBjbGFzcworCitSdW4gc2FtZSB0ZXN0cyB3aXRoIGJvdGggYnkgY3JlYXRpbmcgYSBtaXhpbiBjbGFzcy4KKycnJwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKLQogZnJvbSBfdGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKIAogY2xhc3MgVGV4dFRlc3Qob2JqZWN0KToKKyAgICAiRGVmaW5lIGl0ZW1zIGNvbW1vbiB0byBib3RoIHNldHMgb2YgdGVzdHMuIgogCi0gICAgaHcgPSAnaGVsbG9cbndvcmxkJyAgIyB1c3VhbCBpbml0aWFsIGluc2VydCBhZnRlciBpbml0aWFsaXphdGlvbgorICAgIGh3ID0gJ2hlbGxvXG53b3JsZCcgICMgU2V2ZXJhbCB0ZXN0cyBpbnNlcnQgdGhpcyBhZnRlciBhZnRlciBpbml0aWFsaXphdGlvbi4KICAgICBod24gPSBodysnXG4nICAjIFxuIHByZXNlbnQgYXQgaW5pdGlhbGl6YXRpb24sIGJlZm9yZSBpbnNlcnQKIAotICAgIFRleHQgPSBOb25lCi0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLnRleHQgPSBzZWxmLlRleHQoKQorICAgICMgc2V0VXBDbGFzcyBkZWZpbmVzIGNscy5UZXh0IGFuZCBtYXliZSBjbHMucm9vdC4KKyAgICAjIHNldFVwIGRlZmluZXMgc2VsZi50ZXh0IGZyb20gVGV4dCBhbmQgbWF5YmUgcm9vdC4KIAogICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmdldCgnMS4wJyksICdcbicpCkBAIC0xOTYsNiArMTk4LDEwIEBACiAgICAgICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAogICAgICAgICBjbHMuVGV4dCA9IFRleHQKIAorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5UZXh0KCkKKworCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgogICAgICAgICAjIHRlc3QgZW5kZmxhZ3MgKC0xLCAwKSBub3QgdGVzdGVkIGJ5IHRlc3RfaW5kZXggKHdoaWNoIHVzZXMgKzEpCiAgICAgICAgIGRlY29kZSA9IHNlbGYudGV4dC5fZGVjb2RlCkBAIC0yMjIsNiArMjI4LDkgQEAKICAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCiAgICAgICAgIGRlbCBjbHMucm9vdAogCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQgPSBzZWxmLlRleHQoc2VsZi5yb290KQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHR2aWV3LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKaW5kZXggMDJkMTQ3Mi4uMGM2MjVlZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkKQEAgLTEsMjEgKzEsMjEgQEAKLScnJ1Rlc3QgaWRsZWxpYi50ZXh0Vmlldy4KKycnJ1Rlc3QgaWRsZWxpYi50ZXh0dmlldy4KIAogU2luY2UgYWxsIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucyBjcmVhdGUgKG9yIGRlc3Ryb3kpIGEgVGV4dFZpZXdlciwgd2hpY2gKIGlzIGEgd2lkZ2V0IGNvbnRhaW5pbmcgbXVsdGlwbGUgd2lkZ2V0cywgYWxsIHRlc3RzIG11c3QgYmUgZ3VpIHRlc3RzLgogVXNpbmcgbW9jayBUZXh0IHdvdWxkIG5vdCBjaGFuZ2UgdGhpcy4gIE90aGVyIG1vY2tzIGFyZSB1c2VkIHRvIHJldHJpZXZlCiBpbmZvcm1hdGlvbiBhYm91dCBjYWxscy4KIAotVGhlIGNvdmVyYWdlIGlzIGVzc2VudGlhbGx5IDEwMCUuCitDb3ZlcmFnZTogOTQlLgogJycnCitmcm9tIGlkbGVsaWIgaW1wb3J0IHRleHR2aWV3IGFzIHR2CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwogZnJvbSB0a2ludGVyIGltcG9ydCBUawotZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldyBhcyB0dgogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAorZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94X2Z1bmMKIAogZGVmIHNldFVwTW9kdWxlKCk6CiAgICAgZ2xvYmFsIHJvb3QKQEAgLTY0LDE3ICs2NCwxNyBAQAogICAgICAgICB2aWV3LmRlc3Ryb3kKIAogCi1jbGFzcyB0ZXh0dmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorY2xhc3MgVmlld0Z1bmN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgotICAgICAgICBjbHMub3JpZ19tYm94ID0gdHYudGtNZXNzYWdlQm94Ci0gICAgICAgIHR2LnRrTWVzc2FnZUJveCA9IE1ib3gKKyAgICAgICAgY2xzLm9yaWdfZXJyb3IgPSB0di5zaG93ZXJyb3IKKyAgICAgICAgdHYuc2hvd2Vycm9yID0gTWJveF9mdW5jKCkKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIHR2LnRrTWVzc2FnZUJveCA9IGNscy5vcmlnX21ib3gKLSAgICAgICAgZGVsIGNscy5vcmlnX21ib3gKKyAgICAgICAgdHYuc2hvd2Vycm9yID0gY2xzLm9yaWdfZXJyb3IKKyAgICAgICAgZGVsIGNscy5vcmlnX2Vycm9yCiAKICAgICBkZWYgdGVzdF92aWV3X3RleHQoc2VsZik6CiAgICAgICAgICMgSWYgbW9kYWwgVHJ1ZSwgdGtpbnRlciB3aWxsIGVycm9yIHdpdGggJ2Nhbid0IGludm9rZSAiZXZlbnQiIGNvbW1hbmQnCkBAIC04OSw3ICs4OSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1Rlc3QnLCB2aWV3LnRleHRWaWV3LmdldCgnMS4wJywgJzEuZW5kJykpCiAgICAgICAgIHZpZXcuT2soKQogCi0gICAgICAgICMgTW9jayBtZXNzYWdlYm94IHdpbGwgYmUgdXNlZCBhbmQgdmlld19maWxlIHdpbGwgbm90IHJldHVybiBhbnl0aGluZworICAgICAgICAjIE1vY2sgc2hvd2Vycm9yIHdpbGwgYmUgdXNlZCBhbmQgdmlld19maWxlIHdpbGwgcmV0dXJuIE5vbmUKICAgICAgICAgdGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICcuLi9ub3R0aGVyZS5weScpCiAgICAgICAgIHZpZXcgPSB0di52aWV3X2ZpbGUocm9vdCwgJ1RpdGxlJywgdGVzdGZpbGUsIG1vZGFsPUZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh2aWV3KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RyZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYTk2NAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RyZWUucHkKQEAgLTAsMCArMSwzNiBAQAorJycnIFRlc3QgaWRsZWxpYi50cmVlLgorCitDb3ZlcmFnZTogNTYlCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdHJlZQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRraW50ZXIgaW1wb3J0IFRrCisKKworY2xhc3MgVHJlZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy5yb290LndpdGhkcmF3KCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgICMgU3RhcnQgd2l0aCBjb2RlIHNsaWdodGx5IGFkYXB0ZWQgZnJvbSBodGVzdC4KKyAgICAgICAgc2MgPSB0cmVlLlNjcm9sbGVkQ2FudmFzKAorICAgICAgICAgICAgc2VsZi5yb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgICAgIHNjLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiLCBzaWRlPSdsZWZ0JykKKyAgICAgICAgaXRlbSA9IHRyZWUuRmlsZVRyZWVJdGVtKHRyZWUuSUNPTkRJUikKKyAgICAgICAgbm9kZSA9IHRyZWUuVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQorICAgICAgICBub2RlLmV4cGFuZCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kb2RlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG8ucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kb2RlbGVnYXRvci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQppbmRleCAyYjgzYzk5Li44MGYxYjgwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG8ucHkKQEAgLTEsNCArMSw0IEBACi0iIiJVbml0dGVzdCBmb3IgVW5kb0RlbGVnYXRvciBpbiBpZGxlbGliLlVuZG9EZWxlZ2F0b3IuCisiIiJVbml0dGVzdCBmb3IgVW5kb0RlbGVnYXRvciBpbiBpZGxlbGliLnVuZG8ucHkuCiAKIENvdmVyYWdlIGFib3V0IDgwJSAocmV0ZXN0KS4KICIiIgpAQCAtOCw4ICs4LDggQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrCi1mcm9tIGlkbGVsaWIuVW5kb0RlbGVnYXRvciBpbXBvcnQgVW5kb0RlbGVnYXRvcgotZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKK2Zyb20gaWRsZWxpYi51bmRvIGltcG9ydCBVbmRvRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgogCiAKIGNsYXNzIFVuZG9EZWxlZ2F0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dhcm5pbmcucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5CmluZGV4IDE4NjI3ZGQuLmYzMjY5ZjEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dhcm5pbmcucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3Qgd2FybmluZ3MgcmVwbGFjZW1lbnQgaW4gUHlTaGVsbC5weSBhbmQgcnVuLnB5LgorJycnVGVzdCB3YXJuaW5ncyByZXBsYWNlbWVudCBpbiBweXNoZWxsLnB5IGFuZCBydW4ucHkuCiAKIFRoaXMgZmlsZSBjb3VsZCBiZSBleHBhbmRlZCB0byBpbmNsdWRlIHRyYWNlYmFjayBvdmVycmlkZXMKIChpbiBzYW1lIHR3byBtb2R1bGVzKS4gSWYgc28sIGNoYW5nZSBuYW1lLgpAQCAtMTcsOSArMTcsOSBAQAogcnVubmluZ19pbl9pZGxlID0gJ2lkbGUnIGluIHNob3d3YXJuaW5nLl9fbmFtZV9fCiAKIGZyb20gaWRsZWxpYiBpbXBvcnQgcnVuCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwgYXMgc2hlbGwKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlzaGVsbCBhcyBzaGVsbAogCi0jIFRoZSBmb2xsb3dpbmcgd2FzIGdlbmVyYXRlZCBmcm9tIFB5U2hlbGwuaWRsZV9mb3JtYXR3YXJuaW5nCisjIFRoZSBmb2xsb3dpbmcgd2FzIGdlbmVyYXRlZCBmcm9tIHB5c2hlbGwuaWRsZV9mb3JtYXR3YXJuaW5nCiAjIGFuZCBjaGVja2VkIGFzIG1hdGNoaW5nIGV4cGVjdGF0aW9uLgogaWRsZW1zZyA9ICcnJwogV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZXZlci5weSBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOWY2OWEuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaWRsZXZlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSIiIgotVGhlIHNlcGFyYXRlIElkbGUgdmVyc2lvbiB3YXMgZWxpbWluYXRlZCB5ZWFycyBhZ287Ci1pZGxlbGliLmlkbGV2ZXIgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZQotYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjYgb3IgbGF0ZXIuICBVc2UKLSAgICBmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbgotICAgIElETEVfVkVSU0lPTiA9IHZlcnNpb25bOnZlcnNpb24uaW5kZXgoJyAnKV0KLSIiIgotIyBLZXB0IGZvciBub3cgb25seSBmb3IgcG9zc2libGUgZXhpc3RpbmcgZXh0ZW5zaW9uIHVzZQotaW1wb3J0IHdhcm5pbmdzIGFzIHcKLXcud2FybihfX2RvY19fLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLWZyb20gc3lzIGltcG9ydCB2ZXJzaW9uCi1JRExFX1ZFUlNJT04gPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkgYi9MaWIvaWRsZWxpYi9pb21lbnUucHkKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pb21lbnUucHkKaW5kZXggODRmMzlhMi4uMThjNjhiZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL2lvbWVudS5weQpAQCAtMTAsNTcgKzEwLDYwIEBACiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogZnJvbSB0a2ludGVyLnNpbXBsZWRpYWxvZyBpbXBvcnQgYXNrc3RyaW5nCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgoraW1wb3J0IGlkbGVsaWIKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKLQotIyBUcnkgc2V0dGluZyB0aGUgbG9jYWxlLCBzbyB0aGF0IHdlIGNhbiBmaW5kIG91dAotIyB3aGF0IGVuY29kaW5nIHRvIHVzZQotdHJ5OgotICAgIGltcG9ydCBsb2NhbGUKLSAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgIiIpCi1leGNlcHQgKEltcG9ydEVycm9yLCBsb2NhbGUuRXJyb3IpOgotICAgIHBhc3MKLQotIyBFbmNvZGluZyBmb3IgZmlsZSBuYW1lcwotZmlsZXN5c3RlbWVuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpICAjIyMgY3VycmVudGx5IHVudXNlZAotCi1sb2NhbGVfZW5jb2RpbmcgPSAnYXNjaWknCi1pZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKLSAgICAjIE9uIFdpbmRvd3MsIHdlIGNvdWxkIHVzZSAibWJjcyIuIEhvd2V2ZXIsIHRvIGdpdmUgdGhlIHVzZXIKLSAgICAjIGEgcG9ydGFibGUgZW5jb2RpbmcgbmFtZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBjb2RlIHBhZ2UKLSAgICB0cnk6Ci0gICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KLSAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCi0gICAgZXhjZXB0IExvb2t1cEVycm9yOgotICAgICAgICBwYXNzCitpZiBpZGxlbGliLnRlc3Rpbmc6ICAjIFNldCBUcnVlIGJ5IHRlc3QudGVzdF9pZGxlIHRvIGF2b2lkIHNldGxvY2FsZS4KKyAgICBlbmNvZGluZyA9ICd1dGYtOCcKIGVsc2U6CisgICAgIyBUcnkgc2V0dGluZyB0aGUgbG9jYWxlLCBzbyB0aGF0IHdlIGNhbiBmaW5kIG91dAorICAgICMgd2hhdCBlbmNvZGluZyB0byB1c2UKICAgICB0cnk6Ci0gICAgICAgICMgRGlmZmVyZW50IHRoaW5ncyBjYW4gZmFpbCBoZXJlOiB0aGUgbG9jYWxlIG1vZHVsZSBtYXkgbm90IGJlCi0gICAgICAgICMgbG9hZGVkLCBpdCBtYXkgbm90IG9mZmVyIG5sX2xhbmdpbmZvLCBvciBDT0RFU0VULCBvciB0aGUKLSAgICAgICAgIyByZXN1bHRpbmcgY29kZXNldCBtYXkgYmUgdW5rbm93biB0byBQeXRob24uIFdlIGlnbm9yZSBhbGwKLSAgICAgICAgIyB0aGVzZSBwcm9ibGVtcywgZmFsbGluZyBiYWNrIHRvIEFTQ0lJCi0gICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5ubF9sYW5naW5mbyhsb2NhbGUuQ09ERVNFVCkKLSAgICAgICAgaWYgbG9jYWxlX2VuY29kaW5nIGlzIE5vbmUgb3IgbG9jYWxlX2VuY29kaW5nIGlzICcnOgotICAgICAgICAgICAgIyBzaXR1YXRpb24gb2NjdXJzIG9uIE1hYyBPUyBYCi0gICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSAnYXNjaWknCi0gICAgICAgIGNvZGVjcy5sb29rdXAobG9jYWxlX2VuY29kaW5nKQotICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgTG9va3VwRXJyb3IpOgotICAgICAgICAjIFRyeSBnZXRkZWZhdWx0bG9jYWxlOiBpdCBwYXJzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLAotICAgICAgICAjIHdoaWNoIG1heSBnaXZlIGEgY2x1ZS4gVW5mb3J0dW5hdGVseSwgZ2V0ZGVmYXVsdGxvY2FsZSBoYXMKLSAgICAgICAgIyBidWdzIHRoYXQgY2FuIGNhdXNlIFZhbHVlRXJyb3IuCisgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICIiKQorICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIGxvY2FsZS5FcnJvcik6CisgICAgICAgIHBhc3MKKworICAgIGxvY2FsZV9kZWNvZGUgPSAnYXNjaWknCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICMgT24gV2luZG93cywgd2UgY291bGQgdXNlICJtYmNzIi4gSG93ZXZlciwgdG8gZ2l2ZSB0aGUgdXNlcgorICAgICAgICAjIGEgcG9ydGFibGUgZW5jb2RpbmcgbmFtZSwgd2UgbmVlZCB0byBmaW5kIHRoZSBjb2RlIHBhZ2UKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKVsxXQorICAgICAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIERpZmZlcmVudCB0aGluZ3MgY2FuIGZhaWwgaGVyZTogdGhlIGxvY2FsZSBtb2R1bGUgbWF5IG5vdCBiZQorICAgICAgICAgICAgIyBsb2FkZWQsIGl0IG1heSBub3Qgb2ZmZXIgbmxfbGFuZ2luZm8sIG9yIENPREVTRVQsIG9yIHRoZQorICAgICAgICAgICAgIyByZXN1bHRpbmcgY29kZXNldCBtYXkgYmUgdW5rbm93biB0byBQeXRob24uIFdlIGlnbm9yZSBhbGwKKyAgICAgICAgICAgICMgdGhlc2UgcHJvYmxlbXMsIGZhbGxpbmcgYmFjayB0byBBU0NJSQorICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLm5sX2xhbmdpbmZvKGxvY2FsZS5DT0RFU0VUKQogICAgICAgICAgICAgaWYgbG9jYWxlX2VuY29kaW5nIGlzIE5vbmUgb3IgbG9jYWxlX2VuY29kaW5nIGlzICcnOgogICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAogICAgICAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKICAgICAgICAgICAgIGNvZGVjcy5sb29rdXAobG9jYWxlX2VuY29kaW5nKQotICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIExvb2t1cEVycm9yKToKLSAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IChOYW1lRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBMb29rdXBFcnJvcik6CisgICAgICAgICAgICAjIFRyeSBnZXRkZWZhdWx0bG9jYWxlOiBpdCBwYXJzZXMgZW52aXJvbm1lbnQgdmFyaWFibGVzLAorICAgICAgICAgICAgIyB3aGljaCBtYXkgZ2l2ZSBhIGNsdWUuIFVuZm9ydHVuYXRlbHksIGdldGRlZmF1bHRsb2NhbGUgaGFzCisgICAgICAgICAgICAjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgVmFsdWVFcnJvci4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgICAgICAgICAgICAgaWYgbG9jYWxlX2VuY29kaW5nIGlzIE5vbmUgb3IgbG9jYWxlX2VuY29kaW5nIGlzICcnOgorICAgICAgICAgICAgICAgICAgICAjIHNpdHVhdGlvbiBvY2N1cnMgb24gTWFjIE9TIFgKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gJ2FzY2lpJworICAgICAgICAgICAgICAgIGNvZGVjcy5sb29rdXAobG9jYWxlX2VuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBMb29rdXBFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcwogCi1sb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmcubG93ZXIoKQorICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZy5sb3dlcigpCiAKLWVuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nICAjIyMgS0JLIDA3U2VwMDcgIFRoaXMgaXMgdXNlZCBhbGwgb3ZlciBJRExFLCBjaGVjayEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgJ2VuY29kaW5nJyBpcyB1c2VkIGJlbG93IGluIGVuY29kZSgpLCBjaGVjayEKKyAgICBlbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZworICAgICMgRW5jb2RpbmcgaXMgdXNlZCBpbiBtdWx0aXBsZSBmaWxlczsgbG9jYWxlX2VuY29kaW5nIG5vd2hlcmUuCisgICAgIyBUaGUgb25seSB1c2Ugb2YgJ2VuY29kaW5nJyBiZWxvdyBpcyBpbiBfZGVjb2RlIGFzIGluaXRpYWwgdmFsdWUKKyAgICAjIG9mIGRlcHJlY2F0ZWQgYmxvY2sgYXNraW5nIHVzZXIgZm9yIGVuY29kaW5nLgorICAgICMgUGVyaGFwcyB1c2UgZWxzZXdoZXJlIHNob3VsZCBiZSByZXZpZXdlZC4KIAogY29kaW5nX3JlID0gcmUuY29tcGlsZShyJ15bIFx0XGZdKiMuKj9jb2RpbmdbOj1dWyBcdF0qKFstXHcuXSspJywgcmUuQVNDSUkpCiBibGFua19yZSA9IHJlLmNvbXBpbGUocideWyBcdFxmXSooPzpbI1xyXG5dfCQpJywgcmUuQVNDSUkpCkBAIC0xMDcsNiArMTEwLDkgQEAKIAogCiBjbGFzcyBJT0JpbmRpbmc6CisjIE9uZSBpbnN0YW5jZSBwZXIgZWRpdG9yIFdpbmRvdyBzbyBtZXRob2RzIGtub3cgd2hpY2ggdG8gc2F2ZSwgY2xvc2UuCisjIE9wZW4gcmV0dXJucyBmb2N1cyB0byBzZWxmLmVkaXR3aW4gaWYgYWJvcnRlZC4KKyMgRWRpdG9yV2luZG93Lm9wZW5fbW9kdWxlLCBvdGhlcnMsIGJlbG9uZyBoZXJlLgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCkBAIC0zMDEsNyArMzA3LDcgQEAKICAgICAgICAgICAgICAgICAiVGhlIGZpbGUncyBlbmNvZGluZyBpcyBpbnZhbGlkIGZvciBQeXRob24gMy54LlxuIgogICAgICAgICAgICAgICAgICJJRExFIHdpbGwgY29udmVydCBpdCB0byBVVEYtOC5cbiIKICAgICAgICAgICAgICAgICAiV2hhdCBpcyB0aGUgY3VycmVudCBlbmNvZGluZyBvZiB0aGUgZmlsZT8iLAotICAgICAgICAgICAgICAgIGluaXRpYWx2YWx1ZSA9IGxvY2FsZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICBpbml0aWFsdmFsdWUgPSBlbmNvZGluZywKICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLmVkaXR3aW4udGV4dCkKIAogICAgICAgICAgICAgaWYgZW5jOgpAQCAtNTYxLDUgKzU2Nyw4IEBACiAgICAgSU9CaW5kaW5nKGVkaXR3aW4pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9pb21lbnUnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfaW9fYmluZGluZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkgYi9MaWIvaWRsZWxpYi9tYWNvc3gucHkKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbWFjb3N4LnB5CmluZGV4IGI5NmJhZTEuLmY5ZjU1OGQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKKysrIGIvTGliL2lkbGVsaWIvbWFjb3N4LnB5CkBAIC0xLDMwICsxLDI0IEBACiAiIiIKIEEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IGVuaGFuY2UgSURMRSBvbiBNYWMgT1NYLgogIiIiCi1pbXBvcnQgc3lzCitmcm9tIHN5cyBpbXBvcnQgcGxhdGZvcm0gICMgVXNlZCBpbiBfaW5pdF90a190eXBlLCBjaGFuZ2VkIGJ5IHRlc3QuCiBpbXBvcnQgdGtpbnRlcgotZnJvbSBvcyBpbXBvcnQgcGF0aAogaW1wb3J0IHdhcm5pbmdzCiAKLWRlZiBydW5uaW5nQXNPU1hBcHAoKToKLSAgICB3YXJuaW5ncy53YXJuKCJydW5uaW5nQXNPU1hBcHAoKSBpcyBkZXByZWNhdGVkLCB1c2UgaXNBcXVhVGsoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICByZXR1cm4gaXNBcXVhVGsoKQogCi1kZWYgaXNDYXJib25BcXVhVGsocm9vdCk6Ci0gICAgd2FybmluZ3Mud2FybigiaXNDYXJib25BcXVhVGsocm9vdCkgaXMgZGVwcmVjYXRlZCwgdXNlIGlzQ2FyYm9uVGsoKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICByZXR1cm4gaXNDYXJib25UaygpCisjIyBEZWZpbmUgZnVuY3Rpb25zIHRoYXQgcXVlcnkgdGhlIE1hYyBncmFwaGljcyB0eXBlLgorIyMgX3RrX3R5cGUgYW5kIGl0cyBpbml0aWFsaXplciBhcmUgcHJpdmF0ZSB0byB0aGlzIHNlY3Rpb24uCiAKIF90a190eXBlID0gTm9uZQogCi1kZWYgX2luaXRpYWxpemVUa1ZhcmlhbnRUZXN0cyhyb290KToKK2RlZiBfaW5pdF90a190eXBlKCk6CiAgICAgIiIiCiAgICAgSW5pdGlhbGl6ZXMgT1MgWCBUayB2YXJpYW50IHZhbHVlcyBmb3IKICAgICBpc0FxdWFUaygpLCBpc0NhcmJvblRrKCksIGlzQ29jb2FUaygpLCBhbmQgaXNYUXVhcnR6KCkuCiAgICAgIiIiCiAgICAgZ2xvYmFsIF90a190eXBlCi0gICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGlmIHBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICByb290ID0gdGtpbnRlci5UaygpCiAgICAgICAgIHdzID0gcm9vdC50ay5jYWxsKCd0aycsICd3aW5kb3dpbmdzeXN0ZW0nKQogICAgICAgICBpZiAneDExJyBpbiB3czoKICAgICAgICAgICAgIF90a190eXBlID0gInhxdWFydHoiCkBAIC0zNCw2ICsyOCw3IEBACiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJjb2NvYSIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIF90a190eXBlID0gImNhcmJvbiIKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKICAgICBlbHNlOgogICAgICAgICBfdGtfdHlwZSA9ICJvdGhlciIKIApAQCAtNDEsNyArMzYsOCBAQAogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgbmF0aXZlIE9TIFggVGsgKENvY29hIG9yIENhcmJvbikuCiAgICAgIiIiCi0gICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgaWYgbm90IF90a190eXBlOgorICAgICAgICBfaW5pdF90a190eXBlKCkKICAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNvY29hIiBvciBfdGtfdHlwZSA9PSAiY2FyYm9uIgogCiBkZWYgaXNDYXJib25UaygpOgpAQCAtNDksMjMgKzQ1LDI3IEBACiAgICAgUmV0dXJucyBUcnVlIGlmIElETEUgaXMgdXNpbmcgYSBDYXJib24gQXF1YSBUayAoaW5zdGVhZCBvZiB0aGUKICAgICBuZXdlciBDb2NvYSBBcXVhIFRrKS4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAiY2FyYm9uIgogCiBkZWYgaXNDb2NvYVRrKCk6CiAgICAgIiIiCiAgICAgUmV0dXJucyBUcnVlIGlmIElETEUgaXMgdXNpbmcgYSBDb2NvYSBBcXVhIFRrLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJjb2NvYSIKIAogZGVmIGlzWFF1YXJ0eigpOgogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGFuIE9TIFggWDExIFRrLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJ4cXVhcnR6IgogCisKIGRlZiB0a1ZlcnNpb25XYXJuaW5nKHJvb3QpOgogICAgICIiIgogICAgIFJldHVybnMgYSBzdHJpbmcgd2FybmluZyBtZXNzYWdlIGlmIHRoZSBUayB2ZXJzaW9uIGluIHVzZSBhcHBlYXJzIHRvCkBAIC04Niw2ICs4Niw5IEBACiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKKworIyMgRml4IHRoZSBtZW51IGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KKwogZGVmIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpOgogICAgICIiIgogICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlc3BvbmQgdG8gb3BlbiBBcHBsZUV2ZW50cywgd2hpY2gKQEAgLTEyNCwyMyArMTI3LDIzIEBACiAgICAgIyBEdWUgdG8gYSAobWlzLSlmZWF0dXJlIG9mIFRrQXF1YSB0aGUgdXNlciB3aWxsIGFsc28gc2VlIGFuIGVtcHR5IEhlbHAKICAgICAjIG1lbnUuCiAgICAgZnJvbSB0a2ludGVyIGltcG9ydCBNZW51Ci0gICAgZnJvbSBpZGxlbGliIGltcG9ydCBCaW5kaW5ncwotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAorICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgbWFpbm1lbnUKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHdpbmRvd3MKIAotICAgIGNsb3NlSXRlbSA9IEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdWy0yXQorICAgIGNsb3NlSXRlbSA9IG1haW5tZW51Lm1lbnVkZWZzWzBdWzFdWy0yXQogCiAgICAgIyBSZW1vdmUgdGhlIGxhc3QgMyBpdGVtcyBvZiB0aGUgZmlsZSBtZW51OiBhIHNlcGFyYXRvciwgY2xvc2Ugd2luZG93IGFuZAogICAgICMgcXVpdC4gQ2xvc2Ugd2luZG93IHdpbGwgYmUgcmVpbnNlcnRlZCBqdXN0IGFib3ZlIHRoZSBzYXZlIGl0ZW0sIHdoZXJlCiAgICAgIyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBISUcuIFF1aXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCi0gICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdWy0zOl0KLSAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5pbnNlcnQoNiwgY2xvc2VJdGVtKQorICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1swXVsxXVstMzpdCisgICAgbWFpbm1lbnUubWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKIAogICAgICMgUmVtb3ZlIHRoZSAnQWJvdXQnIGVudHJ5IGZyb20gdGhlIGhlbHAgbWVudSwgaXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uCiAgICAgIyBtZW51Ci0gICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWy0xXVsxXVswOjJdCisgICAgZGVsIG1haW5tZW51Lm1lbnVkZWZzWy0xXVsxXVswOjJdCiAgICAgIyBSZW1vdmUgdGhlICdDb25maWd1cmUgSWRsZScgZW50cnkgZnJvbSB0aGUgb3B0aW9ucyBtZW51LCBpdCBpcyBpbiB0aGUKICAgICAjIGFwcGxpY2F0aW9uIG1lbnUgYXMgJ1ByZWZlcmVuY2VzJwotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMl1bMV1bMF0KKyAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbLTJdWzFdWzBdCiAgICAgbWVudWJhciA9IE1lbnUocm9vdCkKICAgICByb290LmNvbmZpZ3VyZShtZW51PW1lbnViYXIpCiAgICAgbWVudWRpY3QgPSB7fQpAQCAtMTU1LDMwICsxNTgsMzAgQEAKIAogICAgICAgICBpZiBlbmQgPiAwOgogICAgICAgICAgICAgbWVudS5kZWxldGUoMCwgZW5kKQotICAgICAgICBXaW5kb3dMaXN0LmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKLSAgICBXaW5kb3dMaXN0LnJlZ2lzdGVyX2NhbGxiYWNrKHBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgd2luZG93cy5hZGRfd2luZG93c190b19tZW51KG1lbnUpCisgICAgd2luZG93cy5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCiAKICAgICBkZWYgYWJvdXRfZGlhbG9nKGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIEhlbHAgJ0Fib3V0IElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIEVkaXRvcldpbmRvdy5FZGl0b3JXaW5kb3cuYWJvdXRfZGlhbG9nLgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nCi0gICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCBJRExFJykKKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuYWJvdXRfZGlhbG9nLgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKKyAgICAgICAgaGVscF9hYm91dC5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCiAKICAgICBkZWYgY29uZmlnX2RpYWxvZyhldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBPcHRpb25zICdDb25maWd1cmUgSURMRScgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdy5jb25maWdfZGlhbG9nLgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ0RpYWxvZworICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggZWRpdG9yLkVkaXRvcldpbmRvdy5jb25maWdfZGlhbG9nLgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ2RpYWxvZwogCiAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHJvb3Qgb2JqZWN0IGhhcyBhbiBpbnN0YW5jZV9kaWN0IGF0dHJpYnV0ZSwKICAgICAgICAgIyBtaXJyb3JzIGNvZGUgaW4gRWRpdG9yV2luZG93IChhbHRob3VnaCB0aGF0IHNldHMgdGhlIGF0dHJpYnV0ZQogICAgICAgICAjIG9uIGFuIEVkaXRvcldpbmRvdyBpbnN0YW5jZSB0aGF0IGlzIHRoZW4gcGFzc2VkIGFzIHRoZSBmaXJzdAogICAgICAgICAjIGFyZ3VtZW50IHRvIENvbmZpZ0RpYWxvZykKICAgICAgICAgcm9vdC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKLSAgICAgICAgY29uZmlnRGlhbG9nLkNvbmZpZ0RpYWxvZyhyb290LCAnU2V0dGluZ3MnKQorICAgICAgICBjb25maWdkaWFsb2cuQ29uZmlnRGlhbG9nKHJvb3QsICdTZXR0aW5ncycpCiAKICAgICBkZWYgaGVscF9kaWFsb2coZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnSURMRSBIZWxwJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93LmhlbHBfZGlhbG9nLgorICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggZWRpdG9yLkVkaXRvcldpbmRvdy5oZWxwX2RpYWxvZy4KICAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwCiAgICAgICAgIGhlbHAuc2hvd19pZGxlaGVscChyb290KQogCkBAIC0xOTgsMjkgKzIwMSwzMyBAQAogICAgICAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1lbnViYXIsIG5hbWU9J2FwcGxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFyb2ZmPTApCiAgICAgICAgIG1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCi0gICAgICAgIEJpbmRpbmdzLm1lbnVkZWZzLmluc2VydCgwLAorICAgICAgICBtYWlubWVudS5tZW51ZGVmcy5pbnNlcnQoMCwKICAgICAgICAgICAgICgnYXBwbGljYXRpb24nLCBbCiAgICAgICAgICAgICAgICAgKCdBYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCiAgICAgICAgICAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgICAgICAgXSkpCi0gICAgICAgIHRrdmVyc2lvbiA9IHJvb3QudGsuZXZhbCgnaW5mbyBwYXRjaGxldmVsJykKLSAgICAgICAgaWYgdHVwbGUobWFwKGludCwgdGt2ZXJzaW9uLnNwbGl0KCcuJykpKSA8ICg4LCA0LCAxNCk6Ci0gICAgICAgICAgICAjIGZvciBlYXJsaWVyIEFxdWFUayB2ZXJzaW9ucywgc3VwcGx5IGEgUHJlZmVyZW5jZXMgbWVudSBpdGVtCi0gICAgICAgICAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgICAgICgnX1ByZWZlcmVuY2VzLi4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCi0gICAgICAgICAgICAgICAgKQogICAgIGlmIGlzQ29jb2FUaygpOgogICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCBBYm91dCBkaWFsb2cgd2l0aCBBYm91dCBJRExFIG9uZQogICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJ3RrQWJvdXREaWFsb2cnLCBhYm91dF9kaWFsb2cpCiAgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0ICJIZWxwIiBpdGVtIGluIEhlbHAgbWVudQogICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJzo6dGs6Om1hYzo6U2hvd0hlbHAnLCBoZWxwX2RpYWxvZykKICAgICAgICAgIyByZW1vdmUgcmVkdW5kYW50ICJJRExFIEhlbHAiIGZyb20gbWVudQotICAgICAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTFdWzFdWzBdCisgICAgICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1stMV1bMV1bMF0KKworZGVmIGZpeGIyY29udGV4dChyb290KToKKyAgICAnJydSZW1vdmVkIGJhZCBBcXVhVGsgQnV0dG9uLTIgKHJpZ2h0KSBhbmQgUGFzdGUgYmluZGluZ3MuCisKKyAgICBUaGV5IHByZXZlbnQgY29udGV4dCBtZW51IGFjY2VzcyBhbmQgc2VlbSB0byBiZSBnb25lIGluIEFxdWFUazguNi4KKyAgICBTZWUgaXNzdWUgIzI0ODAxLgorICAgICcnJworICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzxCMj4nKQorICAgIHJvb3QudW5iaW5kX2NsYXNzKCdUZXh0JywgJzxCMi1Nb3Rpb24+JykKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8PFBhc3RlU2VsZWN0aW9uPj4nKQogCiBkZWYgc2V0dXBBcHAocm9vdCwgZmxpc3QpOgogICAgICIiIgogICAgIFBlcmZvcm0gaW5pdGlhbCBPUyBYIGN1c3RvbWl6YXRpb25zIGlmIG5lZWRlZC4KLSAgICBDYWxsZWQgZnJvbSBQeVNoZWxsLm1haW4oKSBhZnRlciBpbml0aWFsIGNhbGxzIHRvIFRrKCkKKyAgICBDYWxsZWQgZnJvbSBweXNoZWxsLm1haW4oKSBhZnRlciBpbml0aWFsIGNhbGxzIHRvIFRrKCkKIAogICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdGhyZWUgbWFqb3IgdmVyc2lvbnMgb2YgVGsgaW4gdXNlIG9uIE9TIFg6CiAgICAgICAgIDEuIEFxdWEgQ29jb2EgVGsgKG5hdGl2ZSBkZWZhdWx0IHNpbmNlIE9TIFggMTAuNikKQEAgLTIzMyw4ICsyNDAsMTMgQEAKICAgICBpc0FxdWFUaygpLCBpc0NhcmJvblRrKCksIGlzQ29jb2FUaygpLCBpc1hRdWFydHooKSBmdW5jdGlvbnMgd2hpY2gKICAgICBhcmUgaW5pdGlhbGl6ZWQgaGVyZSBhcyB3ZWxsLgogICAgICIiIgotICAgIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCkKICAgICBpZiBpc0FxdWFUaygpOgogICAgICAgICBoaWRlVGtDb25zb2xlKHJvb3QpCiAgICAgICAgIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpCiAgICAgICAgIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpCisgICAgICAgIGZpeGIyY29udGV4dChyb290KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZnJvbSB1bml0dGVzdCBpbXBvcnQgbWFpbgorICAgIG1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfbWFjb3N4JywgdmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weSBiL0xpYi9pZGxlbGliL21haW5tZW51LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0JpbmRpbmdzLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9tYWlubWVudS5weQppbmRleCBhYjI1ZmYxLi45NjVhZGEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weQorKysgYi9MaWIvaWRsZWxpYi9tYWlubWVudS5weQpAQCAtMTAsOSArMTAsOSBAQAogIiIiCiBmcm9tIGltcG9ydGxpYi51dGlsIGltcG9ydCBmaW5kX3NwZWMKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCi0jICAgV2FybmluZzogbWVudWRlZnMgaXMgYWx0ZXJlZCBpbiBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUoKQorIyAgIFdhcm5pbmc6IG1lbnVkZWZzIGlzIGFsdGVyZWQgaW4gbWFjb3N4Lm92ZXJyaWRlUm9vdE1lbnUoKQogIyAgIGFmdGVyIGl0IGlzIGRldGVybWluZWQgdGhhdCBhbiBPUyBYIEFxdWEgVGsgaXMgaW4gdXNlLAogIyAgIHdoaWNoIGNhbm5vdCBiZSBkb25lIHVudGlsIGFmdGVyIFRrKCkgaXMgZmlyc3QgY2FsbGVkLgogIyAgIERvIG5vdCBhbHRlciB0aGUgJ2ZpbGUnLCAnb3B0aW9ucycsIG9yICdoZWxwJyBjYXNjYWRlcyBoZXJlCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9NdWx0aUNhbGwucHkgYi9MaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKaW5kZXggODQ2Mjg1NC4uYmYwMmY1OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL211bHRpY2FsbC5weQpAQCAtNDE0LDEyICs0MTQsMTIgQEAKICAgICByZXR1cm4gTXVsdGlDYWxsCiAKIAotZGVmIF9tdWx0aV9jYWxsKHBhcmVudCk6Ci0gICAgcm9vdCA9IHRraW50ZXIuVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgTXVsdGlDYWxsIikKK2RlZiBfbXVsdGlfY2FsbChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gdGtpbnRlci5Ub3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IE11bHRpQ2FsbCIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKHRraW50ZXIuVGV4dCkocm9vdCkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKHRraW50ZXIuVGV4dCkodG9wKQogICAgIHRleHQucGFjaygpCiAgICAgZGVmIGJpbmRzZXEoc2VxLCBuPVswXSk6CiAgICAgICAgIGRlZiBoYW5kbGVyKGV2ZW50KToKQEAgLTQzOSw3ICs0MzksNiBAQAogICAgIGJpbmRzZXEoIjxGb2N1c091dD4iKQogICAgIGJpbmRzZXEoIjxFbnRlcj4iKQogICAgIGJpbmRzZXEoIjxMZWF2ZT4iKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvT3V0cHV0V2luZG93LnB5IGIvTGliL2lkbGVsaWIvb3V0d2luLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvb3V0d2luLnB5CmluZGV4IGU2MTRmOWIuLmIzYmM3ODYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9vdXR3aW4ucHkKQEAgLTEsOCArMSw4IEBACiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiBpbXBvcnQgcmUKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKIAogY2xhc3MgT3V0cHV0V2luZG93KEVkaXRvcldpbmRvdyk6CiAKQEAgLTM2LDcgKzM2LDcgQEAKIAogICAgIGRlZiB3cml0ZShzZWxmLCBzLCB0YWdzPSgpLCBtYXJrPSJpbnNlcnQiKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCAoYnl0ZXMsIGJ5dGVzKSk6Ci0gICAgICAgICAgICBzID0gcy5kZWNvZGUoSU9CaW5kaW5nLmVuY29kaW5nLCAicmVwbGFjZSIpCisgICAgICAgICAgICBzID0gcy5kZWNvZGUoaW9tZW51LmVuY29kaW5nLCAicmVwbGFjZSIpCiAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQobWFyaywgcywgdGFncykKICAgICAgICAgc2VsZi50ZXh0LnNlZShtYXJrKQogICAgICAgICBzZWxmLnRleHQudXBkYXRlKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weSBiL0xpYi9pZGxlbGliL3BhcmFncmFwaC5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BhcmFncmFwaC5weQppbmRleCA3YTlkMTg1Li4wMzIzYjUzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkKKysrIGIvTGliL2lkbGVsaWIvcGFyYWdyYXBoLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAiIiIKIAogaW1wb3J0IHJlCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIGNsYXNzIEZvcm1hdFBhcmFncmFwaDoKIApAQCAtMTkxLDUgKzE5MSw1IEBACiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9mb3JtYXRwYXJhZ3JhcGgnLAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcGFyYWdyYXBoJywKICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weSBiL0xpYi9pZGxlbGliL3BhcmVubWF0Y2gucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcGFyZW5tYXRjaC5weQppbmRleCAxOWJhZDhjLi5lOThmYWMxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CisrKyBiL0xpYi9pZGxlbGliL3BhcmVubWF0Y2gucHkKQEAgLTUsOCArNSw4IEBACiBwYXJlbnRoZXNlcywgc3F1YXJlIGJyYWNrZXRzLCBhbmQgY3VybHkgYnJhY2VzLgogIiIiCiAKLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmh5cGVycGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogX29wZW5lcnMgPSB7JyknOicoJywnXSc6J1snLCd9Jzoneyd9CiBDSEVDS19ERUxBWSA9IDEwMCAjIG1pbGlzZWNvbmRzCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL3BhdGhicm93c2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BhdGhCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQppbmRleCA5YWI3NjMyLi45NjZhZjRiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQpAQCAtMiw5ICsyLDkgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5CiAKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbQotZnJvbSBpZGxlbGliLkNsYXNzQnJvd3NlciBpbXBvcnQgQ2xhc3NCcm93c2VyLCBNb2R1bGVCcm93c2VyVHJlZUl0ZW0KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlSXRlbQorZnJvbSBpZGxlbGliLmJyb3dzZXIgaW1wb3J0IENsYXNzQnJvd3NlciwgTW9kdWxlQnJvd3NlclRyZWVJdGVtCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0CiAKIAogY2xhc3MgUGF0aEJyb3dzZXIoQ2xhc3NCcm93c2VyKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkgYi9MaWIvaWRsZWxpYi9wZXJjb2xhdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BlcmNvbGF0b3IucHkKaW5kZXggYjhiZTJhYS4uMjExMWUwMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGVyY29sYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9wZXJjb2xhdG9yLnB5CkBAIC0xLDUgKzEsNSBAQAotZnJvbSBpZGxlbGliLldpZGdldFJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKLWZyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLnJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgogCiAKIGNsYXNzIFBlcmNvbGF0b3I6CkBAIC04OSwxMCArODksMTAgQEAKICAgICAgICAgKHBpbiBpZiB2YXIyLmdldCgpIGVsc2UgcG91dCkodDIpCiAKICAgICB0ZXh0LnBhY2soKQotICAgIHZhcjEgPSB0ay5JbnRWYXIoKQorICAgIHZhcjEgPSB0ay5JbnRWYXIocGFyZW50KQogICAgIGNiMSA9IHRrLkNoZWNrYnV0dG9uKGJveCwgdGV4dD0iVHJhY2VyMSIsIGNvbW1hbmQ9dG9nZ2xlMSwgdmFyaWFibGU9dmFyMSkKICAgICBjYjEucGFjaygpCi0gICAgdmFyMiA9IHRrLkludFZhcigpCisgICAgdmFyMiA9IHRrLkludFZhcihwYXJlbnQpCiAgICAgY2IyID0gdGsuQ2hlY2tidXR0b24oYm94LCB0ZXh0PSJUcmFjZXIyIiwgY29tbWFuZD10b2dnbGUyLCB2YXJpYWJsZT12YXIyKQogICAgIGNiMi5wYWNrKCkKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUHlQYXJzZS5weSBiL0xpYi9pZGxlbGliL3B5cGFyc2UucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1B5UGFyc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3B5cGFyc2UucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1B5U2hlbGwucHkgYi9MaWIvaWRsZWxpYi9weXNoZWxsLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1B5U2hlbGwucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3B5c2hlbGwucHkKaW5kZXggNWRlYzY4ZS4uODJlNzdmOSAxMDA3NTUKLS0tIGEvTGliL2lkbGVsaWIvUHlTaGVsbC5weQorKysgYi9MaWIvaWRsZWxpYi9weXNoZWxsLnB5CkBAIC0xLDUgKzEsMjAgQEAKICMhIC91c3IvYmluL2VudiBweXRob24zCiAKK3RyeToKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0ICoKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwcmludCgiKiogSURMRSBjYW4ndCBpbXBvcnQgVGtpbnRlci5cbiIKKyAgICAgICAgICAiWW91ciBQeXRob24gbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciBUay4gKioiLCBmaWxlPXN5cy5fX3N0ZGVycl9fKQorICAgIHN5cy5leGl0KDEpCitpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAoraWYgVGtWZXJzaW9uIDwgOC41OgorICAgIHJvb3QgPSBUaygpICAjIG90aGVyd2lzZSBjcmVhdGUgcm9vdCBpbiBtYWluCisgICAgcm9vdC53aXRoZHJhdygpCisgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSWRsZSBDYW5ub3QgU3RhcnQiLAorICAgICAgICAgICAgIklkbGUgcmVxdWlyZXMgdGNsL3RrIDguNSssIG5vdCAkcy4iICUgVGtWZXJzaW9uLAorICAgICAgICAgICAgcGFyZW50PXJvb3QpCisgICAgc3lzLmV4aXQoMSkKKwogaW1wb3J0IGdldG9wdAogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aApAQCAtMTYsMjQgKzMxLDE2IEBACiBmcm9tIGNvZGUgaW1wb3J0IEludGVyYWN0aXZlSW50ZXJwcmV0ZXIKIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uLCBzeXN0ZW0KIAotdHJ5OgotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHByaW50KCIqKiBJRExFIGNhbid0IGltcG9ydCBUa2ludGVyLlxuIgotICAgICAgICAgICJZb3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrLiAqKiIsIGZpbGU9c3lzLl9fc3RkZXJyX18pCi0gICAgc3lzLmV4aXQoMSkKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci0KLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdywgZml4d29yZGJyZWFrcwotZnJvbSBpZGxlbGliLkZpbGVMaXN0IGltcG9ydCBGaWxlTGlzdAotZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvcgotZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdwotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3csIGZpeHdvcmRicmVha3MKK2Zyb20gaWRsZWxpYi5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi5jb2xvcml6ZXIgaW1wb3J0IENvbG9yRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIudW5kbyBpbXBvcnQgVW5kb0RlbGVnYXRvcgorZnJvbSBpZGxlbGliLm91dHdpbiBpbXBvcnQgT3V0cHV0V2luZG93Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogZnJvbSBpZGxlbGliIGltcG9ydCBycGMKLWZyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgUmVtb3RlRGVidWdnZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcl9yCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeAogCiBIT1NUID0gJzEyNy4wLjAuMScgIyBweXRob24gZXhlY3V0aW9uIHNlcnZlciBvbiBsb2NhbGhvc3QgbG9vcGJhY2sKIFBPUlQgPSAwICAjIHNvbWVkYXkgcGFzcyBpbiBob3N0LCBwb3J0IGZvciByZW1vdGUgZGVidWcgY2FwYWJpbGl0eQpAQCAtNDEwLDcgKzQxNyw3IEBACiAgICAgICAgICMgcnVuIGZyb20gdGhlIElETEUgc291cmNlIGRpcmVjdG9yeS4KICAgICAgICAgZGVsX2V4aXRmID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLCAnZGVsZXRlLWV4aXRmdW5jJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsIHR5cGU9J2Jvb2wnKQotICAgICAgICBpZiBfX25hbWVfXyA9PSAnaWRsZWxpYi5QeVNoZWxsJzoKKyAgICAgICAgaWYgX19uYW1lX18gPT0gJ2lkbGVsaWIucHlzaGVsbCc6CiAgICAgICAgICAgICBjb21tYW5kID0gIl9faW1wb3J0X18oJ2lkbGVsaWIucnVuJykucnVuLm1haW4oJXIpIiAlIChkZWxfZXhpdGYsKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgY29tbWFuZCA9ICJfX2ltcG9ydF9fKCdydW4nKS5tYWluKCVyKSIgJSAoZGVsX2V4aXRmLCkKQEAgLTQ2OCw3ICs0NzUsNyBAQAogICAgICAgICBpZiBkZWJ1ZzoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAjIE9ubHkgY2xvc2Ugc3VicHJvY2VzcyBkZWJ1Z2dlciwgZG9uJ3QgdW5yZWdpc3RlciBndWlfYWRhcCEKLSAgICAgICAgICAgICAgICBSZW1vdGVEZWJ1Z2dlci5jbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQorICAgICAgICAgICAgICAgIGRlYnVnZ2VyX3IuY2xvc2Vfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgS2lsbCBzdWJwcm9jZXNzLCBzcGF3biBhIG5ldyBvbmUsIGFjY2VwdCBjb25uZWN0aW9uLgpAQCAtNDk3LDcgKzUwNCw3IEBACiAgICAgICAgICMgcmVzdGFydCBzdWJwcm9jZXNzIGRlYnVnZ2VyCiAgICAgICAgIGlmIGRlYnVnOgogICAgICAgICAgICAgIyBSZXN0YXJ0ZWQgZGVidWdnZXIgY29ubmVjdHMgdG8gY3VycmVudCBpbnN0YW5jZSBvZiBkZWJ1ZyBHVUkKLSAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLnJlc3RhcnRfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKKyAgICAgICAgICAgIGRlYnVnZ2VyX3IucmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQogICAgICAgICAgICAgIyByZWxvYWQgcmVtb3RlIGRlYnVnZ2VyIGJyZWFrcG9pbnRzIGZvciBhbGwgUHlTaGVsbEVkaXRXaW5kb3dzCiAgICAgICAgICAgICBkZWJ1Zy5sb2FkX2JyZWFrcG9pbnRzKCkKICAgICAgICAgc2VsZi5jb21waWxlLmNvbXBpbGVyLmZsYWdzID0gc2VsZi5vcmlnaW5hbF9jb21waWxlcl9mbGFncwpAQCAtNTc4LDcgKzU4NSw3IEBACiAgICAgICAgICAgICAgICAgaWYgc2VsZi50a2NvbnNvbGUuZ2V0dmFyKCI8PHRvZ2dsZS1qaXQtc3RhY2stdmlld2VyPj4iKToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZW1vdGVfc3RhY2tfdmlld2VyKCkKICAgICAgICAgICAgIGVsaWYgaG93ID09ICJFUlJPUiI6Ci0gICAgICAgICAgICAgICAgZXJybXNnID0gIlB5U2hlbGwuTW9kaWZpZWRJbnRlcnByZXRlcjogU3VicHJvY2VzcyBFUlJPUjpcbiIKKyAgICAgICAgICAgICAgICBlcnJtc2cgPSAicHlzaGVsbC5Nb2RpZmllZEludGVycHJldGVyOiBTdWJwcm9jZXNzIEVSUk9SOlxuIgogICAgICAgICAgICAgICAgIHByaW50KGVycm1zZywgd2hhdCwgZmlsZT1zeXMuX19zdGRlcnJfXykKICAgICAgICAgICAgICAgICBwcmludChlcnJtc2csIHdoYXQsIGZpbGU9Y29uc29sZSkKICAgICAgICAgICAgICMgd2UgcmVjZWl2ZWQgYSByZXNwb25zZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBzZXEgbnVtYmVyOgpAQCAtNjEzLDEzICs2MjAsMTMgQEAKICAgICAgICAgcmV0dXJuCiAKICAgICBkZWYgcmVtb3RlX3N0YWNrX3ZpZXdlcihzZWxmKToKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdvYmpfcgogICAgICAgICBvaWQgPSBzZWxmLnJwY2NsdC5yZW1vdGVxdWV1ZSgiZXhlYyIsICJzdGFja3ZpZXdlciIsICgiZmxpc3QiLCksIHt9KQogICAgICAgICBpZiBvaWQgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJvb3QuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaXRlbSA9IFJlbW90ZU9iamVjdEJyb3dzZXIuU3R1Yk9iamVjdFRyZWVJdGVtKHNlbGYucnBjY2x0LCBvaWQpCi0gICAgICAgIGZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBTY3JvbGxlZENhbnZhcywgVHJlZU5vZGUKKyAgICAgICAgaXRlbSA9IGRlYnVnb2JqX3IuU3R1Yk9iamVjdFRyZWVJdGVtKHNlbGYucnBjY2x0LCBvaWQpCisgICAgICAgIGZyb20gaWRsZWxpYi50cmVlIGltcG9ydCBTY3JvbGxlZENhbnZhcywgVHJlZU5vZGUKICAgICAgICAgdG9wID0gVG9wbGV2ZWwoc2VsZi50a2NvbnNvbGUucm9vdCkKICAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5DdXJyZW50VGhlbWUoKQogICAgICAgICBiYWNrZ3JvdW5kID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnbm9ybWFsJylbJ2JhY2tncm91bmQnXQpAQCAtNjYyLDkgKzY2OSw5IEBACiAgICAgICAgICMgYXQgdGhlIG1vbWVudCwgSW50ZXJhY3RpdmVJbnRlcnByZXRlciBleHBlY3RzIHN0cgogICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzb3VyY2UsIHN0cikKICAgICAgICAgI2lmIGlzaW5zdGFuY2Uoc291cmNlLCBzdHIpOgotICAgICAgICAjICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisgICAgICAgICMgICAgZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKICAgICAgICAgIyAgICB0cnk6Ci0gICAgICAgICMgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICAjICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZW5jb2RlKGlvbWVudS5lbmNvZGluZykKICAgICAgICAgIyAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgICAjICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCiAgICAgICAgICMgICAgICAgIHNlbGYud3JpdGUoIlVuc3VwcG9ydGVkIGNoYXJhY3RlcnMgaW4gaW5wdXRcbiIpCkBAIC04NTAsNyArODU3LDcgQEAKIAogCiAgICAgIyBOZXcgY2xhc3NlcwotICAgIGZyb20gaWRsZWxpYi5JZGxlSGlzdG9yeSBpbXBvcnQgSGlzdG9yeQorICAgIGZyb20gaWRsZWxpYi5oaXN0b3J5IGltcG9ydCBIaXN0b3J5CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3Q9Tm9uZSk6CiAgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgpAQCAtODg4LDExICs4OTUsMTEgQEAKICAgICAgICAgc2VsZi5zYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKICAgICAgICAgc2VsZi5zYXZlX3N0ZGVyciA9IHN5cy5zdGRlcnIKICAgICAgICAgc2VsZi5zYXZlX3N0ZGluID0gc3lzLnN0ZGluCi0gICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCi0gICAgICAgIHNlbGYuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZiwgInN0ZGluIiwgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzZWxmLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZG91dCIsIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc2VsZi5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRlcnIiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuY29uc29sZSA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgImNvbnNvbGUiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51CisgICAgICAgIHNlbGYuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZiwgInN0ZGluIiwgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZG91dCIsIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRlcnIiLCBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuY29uc29sZSA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgImNvbnNvbGUiLCBpb21lbnUuZW5jb2RpbmcpCiAgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLnN0ZG91dAogICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuc3RkZXJyCkBAIC05MDAsNyArOTA3LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBwYWdlIGhlbHAoKSB0ZXh0IHRvIHNoZWxsLgogICAgICAgICAgICAgaW1wb3J0IHB5ZG9jICMgaW1wb3J0IG11c3QgYmUgZG9uZSBoZXJlIHRvIGNhcHR1cmUgaS9vIHJlYmluZGluZy4KLSAgICAgICAgICAgICMgWFhYIEtCSyAyN0RlYzA3IHVzZSBhIHRleHRWaWV3IHNvbWVkYXksIGJ1dCBtdXN0IHdvcmsgdy9vIHN1YnByb2MKKyAgICAgICAgICAgICMgWFhYIEtCSyAyN0RlYzA3IHVzZSBUZXh0Vmlld2VyIHNvbWVkYXksIGJ1dCBtdXN0IHdvcmsgdy9vIHN1YnByb2MKICAgICAgICAgICAgIHB5ZG9jLnBhZ2VyID0gcHlkb2MucGxhaW5wYWdlcgogICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KQEAgLTk1NCw3ICs5NjEsNyBAQAogICAgICAgICAgICAgc2VsZi5pbnRlcnAuc2V0ZGVidWdnZXIoTm9uZSkKICAgICAgICAgICAgIGRiLmNsb3NlKCkKICAgICAgICAgICAgIGlmIHNlbGYuaW50ZXJwLnJwY2NsdDoKLSAgICAgICAgICAgICAgICBSZW1vdGVEZWJ1Z2dlci5jbG9zZV9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0KQorICAgICAgICAgICAgICAgIGRlYnVnZ2VyX3IuY2xvc2VfcmVtb3RlX2RlYnVnZ2VyKHNlbGYuaW50ZXJwLnJwY2NsdCkKICAgICAgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQogICAgICAgICAgICAgc2VsZi5jb25zb2xlLndyaXRlKCJbREVCVUcgT0ZGXVxuIikKICAgICAgICAgICAgIHN5cy5wczEgPSAiPj4+ICIKQEAgLTk2MywxMCArOTcwLDEwIEBACiAKICAgICBkZWYgb3Blbl9kZWJ1Z2dlcihzZWxmKToKICAgICAgICAgaWYgc2VsZi5pbnRlcnAucnBjY2x0OgotICAgICAgICAgICAgZGJnX2d1aSA9IFJlbW90ZURlYnVnZ2VyLnN0YXJ0X3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQsCisgICAgICAgICAgICBkYmdfZ3VpID0gZGVidWdnZXJfci5zdGFydF9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGJnX2d1aSA9IERlYnVnZ2VyLkRlYnVnZ2VyKHNlbGYpCisgICAgICAgICAgICBkYmdfZ3VpID0gZGVidWdnZXIuRGVidWdnZXIoc2VsZikKICAgICAgICAgc2VsZi5pbnRlcnAuc2V0ZGVidWdnZXIoZGJnX2d1aSkKICAgICAgICAgZGJnX2d1aS5sb2FkX2JyZWFrcG9pbnRzKCkKICAgICAgICAgc3lzLnBzMSA9ICJbREVCVUcgT05dXG4+Pj4gIgpAQCAtMTI0MSw3ICsxMjQ4LDcgQEAKICAgICAgICAgICAgICAgICAiKHN5cy5sYXN0X3RyYWNlYmFjayBpcyBub3QgZGVmaW5lZCkiLAogICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZnJvbSBpZGxlbGliLlN0YWNrVmlld2VyIGltcG9ydCBTdGFja0Jyb3dzZXIKKyAgICAgICAgZnJvbSBpZGxlbGliLnN0YWNrdmlld2VyIGltcG9ydCBTdGFja0Jyb3dzZXIKICAgICAgICAgU3RhY2tCcm93c2VyKHNlbGYucm9vdCwgc2VsZi5mbGlzdCkKIAogICAgIGRlZiB2aWV3X3Jlc3RhcnRfbWFyayhzZWxmLCBldmVudD1Ob25lKToKQEAgLTE1NDAsNyArMTU0Nyw5IEBACiAgICAgZW5hYmxlX2VkaXQgPSBlbmFibGVfZWRpdCBvciBlZGl0X3N0YXJ0CiAgICAgZW5hYmxlX3NoZWxsID0gZW5hYmxlX3NoZWxsIG9yIG5vdCBlbmFibGVfZWRpdAogCi0gICAgIyBzdGFydCBlZGl0b3IgYW5kL29yIHNoZWxsIHdpbmRvd3M6CisgICAgIyBTZXR1cCByb290LgorICAgIGlmIHVzZV9zdWJwcm9jZXNzOiAgIyBEb24ndCBicmVhayB1c2VyIGNvZGUgcnVuIGluIElETEUgcHJvY2VzcworICAgICAgICBOb0RlZmF1bHRSb290KCkKICAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKICAgICByb290LndpdGhkcmF3KCkKIApAQCAtMTU0OSwyNSArMTU1OCwxOSBAQAogICAgIGlmIHN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgICAgICAgaWNvbmZpbGUgPSBvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGUuaWNvJykKICAgICAgICAgcm9vdC53bV9pY29uYml0bWFwKGRlZmF1bHQ9aWNvbmZpbGUpCi0gICAgZWxpZiBUa1ZlcnNpb24gPj0gOC41OgorICAgIGVsc2U6CiAgICAgICAgIGV4dCA9ICcucG5nJyBpZiBUa1ZlcnNpb24gPj0gOC42IGVsc2UgJy5naWYnCiAgICAgICAgIGljb25maWxlcyA9IFtvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGVfJWQlcycgJSAoc2l6ZSwgZXh0KSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBzaXplIGluICgxNiwgMzIsIDQ4KV0KLSAgICAgICAgaWNvbnMgPSBbUGhvdG9JbWFnZShmaWxlPWljb25maWxlKSBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQorICAgICAgICBpY29ucyA9IFtQaG90b0ltYWdlKG1hc3Rlcj1yb290LCBmaWxlPWljb25maWxlKQorICAgICAgICAgICAgICAgICBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQogICAgICAgICByb290LndtX2ljb25waG90byhUcnVlLCAqaWNvbnMpCiAKKyAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKICAgICBmaXh3b3JkYnJlYWtzKHJvb3QpCiAgICAgZml4X3gxMV9wYXN0ZShyb290KQogICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBmbGlzdCkKLQotICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKToKLSAgICAgICAgIyBUaGVyZSBhcmUgc29tZSBzY3Jld2VkIHVwIDwyPiBjbGFzcyBiaW5kaW5ncyBmb3IgdGV4dAotICAgICAgICAjIHdpZGdldHMgZGVmaW5lZCBpbiBUayB3aGljaCB3ZSBuZWVkIHRvIGRvIGF3YXkgd2l0aC4KLSAgICAgICAgIyBTZWUgaXNzdWUgIzI0ODAxLgotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjI+JykKLSAgICAgICAgcm9vdC51bmJpbmRfY2xhc3MoJ1RleHQnLCAnPEIyLU1vdGlvbj4nKQotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8PFBhc3RlU2VsZWN0aW9uPj4nKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBmbGlzdCkKIAogICAgIGlmIGVuYWJsZV9lZGl0OgogICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgpAQCAtMTU4Miw3ICsxNTg1LDcgQEAKICAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKICAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpIGFuZCBmbGlzdC5kaWN0OgogICAgICAgICAgICAgIyBPbiBPU1g6IHdoZW4gdGhlIHVzZXIgaGFzIGRvdWJsZS1jbGlja2VkIG9uIGEgZmlsZSB0aGF0IGNhdXNlcwogICAgICAgICAgICAgIyBJRExFIHRvIGJlIGxhdW5jaGVkIHRoZSBzaGVsbCB3aW5kb3cgd2lsbCBvcGVuIGp1c3QgaW4gZnJvbnQgb2YKICAgICAgICAgICAgICMgdGhlIGZpbGUgc2hlIHdhbnRzIHRvIHNlZS4gTG93ZXIgdGhlIGludGVycHJldGVyIHdpbmRvdyB3aGVuCkBAIC0xNjE2LDcgKzE2MTksNyBAQAogICAgICAgICAjIGNoZWNrIGZvciBwcm9ibGVtYXRpYyBPUyBYIFRrIHZlcnNpb25zIGFuZCBwcmludCBhIHdhcm5pbmcKICAgICAgICAgIyBtZXNzYWdlIGluIHRoZSBJRExFIHNoZWxsIHdpbmRvdzsgdGhpcyBpcyBsZXNzIGludHJ1c2l2ZQogICAgICAgICAjIHRoYW4gYWx3YXlzIG9wZW5pbmcgYSBzZXBhcmF0ZSB3aW5kb3cuCi0gICAgICAgIHRrdmVyc2lvbndhcm5pbmcgPSBtYWNvc3hTdXBwb3J0LnRrVmVyc2lvbldhcm5pbmcocm9vdCkKKyAgICAgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeC50a1ZlcnNpb25XYXJuaW5nKHJvb3QpCiAgICAgICAgIGlmIHRrdmVyc2lvbndhcm5pbmc6CiAgICAgICAgICAgICBzaGVsbC5pbnRlcnAucnVuY29tbWFuZCgicHJpbnQoJyVzJykiICUgdGt2ZXJzaW9ud2FybmluZykKIApAQCAtMTYyNiw3ICsxNjI5LDcgQEAKICAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHN5cy5tb2R1bGVzWydQeVNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIHN5cy5tb2R1bGVzWydweXNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQogICAgIG1haW4oKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9xdWVyeS5weSBiL0xpYi9pZGxlbGliL3F1ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTcxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9xdWVyeS5weQpAQCAtMCwwICsxLDE5NSBAQAorIiIiCitEaWFsb2dzIHRoYXQgcXVlcnkgdXNlcnMgYW5kIHZlcmlmeSB0aGUgYW5zd2VyIGJlZm9yZSBhY2NlcHRpbmcuCitVc2UgdHRrIHdpZGdldHMsIGxpbWl0aW5nIHVzZSB0byB0Y2wvdGsgOC41KywgYXMgaW4gSURMRSAzLjYrLgorCitRdWVyeSBpcyB0aGUgZ2VuZXJpYyBiYXNlIGNsYXNzIGZvciBhIHBvcHVwIGRpYWxvZy4KK1RoZSB1c2VyIG11c3QgZWl0aGVyIGVudGVyIGEgdmFsaWQgYW5zd2VyIG9yIGNsb3NlIHRoZSBkaWFsb2cuCitFbnRyaWVzIGFyZSB2YWxpZGF0ZWQgd2hlbiA8UmV0dXJuPiBpcyBlbnRlcmVkIG9yIFtPa10gaXMgY2xpY2tlZC4KK0VudHJpZXMgYXJlIGlnbm9yZWQgd2hlbiBbQ2FuY2VsXSBvciBbWF0gYXJlIGNsaWNrZWQuCitUaGUgJ3JldHVybiB2YWx1ZScgaXMgLnJlc3VsdCBzZXQgdG8gZWl0aGVyIGEgdmFsaWQgYW5zd2VyIG9yIE5vbmUuCisKK1N1YmNsYXNzIFNlY3Rpb25OYW1lIGdldHMgYSBuYW1lIGZvciBhIG5ldyBjb25maWcgZmlsZSBzZWN0aW9uLgorQ29uZmlnZGlhbG9nIHVzZXMgaXQgZm9yIG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgorIiIiCisjIFF1ZXJ5IGFuZCBTZWN0aW9uIG5hbWUgcmVzdWx0IGZyb20gc3BsaXR0aW5nIEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCisjIG9mIGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5ICh0ZW1wb3JhcmlseSBjb25maWdfc2VjLnB5KSBpbnRvCisjIGdlbmVyaWMgYW5kIHNwZWNpZmljIHBhcnRzLgorCitpbXBvcnQgaW1wb3J0bGliCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBTdHJpbmdWYXIKK2Zyb20gdGtpbnRlci5tZXNzYWdlYm94IGltcG9ydCBzaG93ZXJyb3IKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IEZyYW1lLCBCdXR0b24sIEVudHJ5LCBMYWJlbAorCitjbGFzcyBRdWVyeShUb3BsZXZlbCk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgZ2V0dGluZyB2ZXJpZmllZCBhbnN3ZXIgZnJvbSBhIHVzZXIuCisKKyAgICBGb3IgdGhpcyBiYXNlIGNsYXNzLCBhY2NlcHQgYW55IG5vbi1ibGFuayBzdHJpbmcuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwPScnLAorICAgICAgICAgICAgICAgICAqLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgICIiIkNyZWF0ZSBwb3B1cCwgZG8gbm90IHJldHVybiB1bnRpbCB0ayB3aWRnZXQgZGVzdHJveWVkLgorCisgICAgICAgIEFkZGl0aW9uYWwgc3ViY2xhc3MgaW5pdCBtdXN0IGJlIGRvbmUgYmVmb3JlIGNhbGxpbmcgdGhpcworICAgICAgICB1bmxlc3MgIF91dGVzdD1UcnVlIGlzIHBhc3NlZCB0byBzdXBwcmVzcyB3YWl0X3dpbmRvdygpLgorCisgICAgICAgIHRpdGxlIC0gc3RyaW5nLCB0aXRsZSBvZiBwb3B1cCBkaWFsb2cKKyAgICAgICAgbWVzc2FnZSAtIHN0cmluZywgaW5mb3JtYXRpb25hbCBtZXNzYWdlIHRvIGRpc3BsYXkKKyAgICAgICAgdGV4dDAgLSBpbml0aWFsIHZhbHVlIGZvciBlbnRyeQorICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAorICAgICAgICBfdXRlc3QgLSBib29sLCBsZWF2ZSB3aW5kb3cgaGlkZGVuIGFuZCBub3QgbW9kYWwKKyAgICAgICAgIiIiCisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZhbHNlLCB3aWR0aD1GYWxzZSkKKyAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQorICAgICAgICBzZWxmLmdyYWJfc2V0KCkKKyAgICAgICAgc2VsZi5iaW5kKCc8S2V5LVJldHVybj4nLCBzZWxmLm9rKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jYW5jZWwpCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKKyAgICAgICAgc2VsZi50ZXh0MCA9IHRleHQwCisgICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICAjbmVlZHMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgdGhlIHdpbmZvX3JlcXdpZHRoIGlzIHZhbGlkCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAgIyBIaWRlIHdoaWxlIGNvbmZpZ3VyaW5nLCBlc3BlY2lhbGx5IGdlb21ldHJ5LgorICAgICAgICBzZWxmLmdlb21ldHJ5KAorICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCisgICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCisgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxNTApCisgICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQorICAgICAgICBpZiBub3QgX3V0ZXN0OgorICAgICAgICAgICAgc2VsZi5kZWljb25pZnkoKSAgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKworICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKTogICMgQ2FsbCBmcm9tIG92ZXJyaWRlLCBpZiBhbnkuCisgICAgICAgICMgQmluZCB3aWRnZXRzIG5lZWRlZCBmb3IgZW50cnlfb2sgb3IgdW5pdHRlc3QgdG8gc2VsZi4KKyAgICAgICAgZnJhbWUgPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9J3N1bmtlbicsICkKKyAgICAgICAgbGFiZWwgPSBMYWJlbChmcmFtZSwgYW5jaG9yPSd3JywganVzdGlmeT0nbGVmdCcsCisgICAgICAgICAgICAgICAgICAgIHRleHQ9c2VsZi5tZXNzYWdlKQorICAgICAgICBzZWxmLmVudHJ5dmFyID0gU3RyaW5nVmFyKHNlbGYsIHNlbGYudGV4dDApCisgICAgICAgIHNlbGYuZW50cnkgPSBFbnRyeShmcmFtZSwgd2lkdGg9MzAsIHRleHR2YXJpYWJsZT1zZWxmLmVudHJ5dmFyKQorICAgICAgICBzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisKKyAgICAgICAgYnV0dG9ucyA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYuYnV0dG9uX29rID0gQnV0dG9uKGJ1dHRvbnMsIHRleHQ9J09rJywKKyAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYub2spCisgICAgICAgIHNlbGYuYnV0dG9uX2NhbmNlbCA9IEJ1dHRvbihidXR0b25zLCB0ZXh0PSdDYW5jZWwnLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCisKKyAgICAgICAgZnJhbWUucGFjayhzaWRlPSd0b3AnLCBleHBhbmQ9VHJ1ZSwgZmlsbD0nYm90aCcpCisgICAgICAgIGxhYmVsLnBhY2socGFkeD01LCBwYWR5PTUpCisgICAgICAgIHNlbGYuZW50cnkucGFjayhwYWR4PTUsIHBhZHk9NSkKKyAgICAgICAgYnV0dG9ucy5wYWNrKHNpZGU9J2JvdHRvbScpCisgICAgICAgIHNlbGYuYnV0dG9uX29rLnBhY2soc2lkZT0nbGVmdCcsIHBhZHg9NSkKKyAgICAgICAgc2VsZi5idXR0b25fY2FuY2VsLnBhY2soc2lkZT0ncmlnaHQnLCBwYWR4PTUpCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6ICAjIEV4YW1wbGU6IHVzdWFsbHkgcmVwbGFjZS4KKyAgICAgICAgIlJldHVybiBub24tYmxhbmsgZW50cnkgb3IgTm9uZS4iCisgICAgICAgIGVudHJ5ID0gc2VsZi5lbnRyeS5nZXQoKS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBlbnRyeToKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nRW50cnkgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdCbGFuayBsaW5lLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBlbnRyeQorCisgICAgZGVmIG9rKHNlbGYsIGV2ZW50PU5vbmUpOiAgIyBEbyBub3QgcmVwbGFjZS4KKyAgICAgICAgJycnSWYgZW50cnkgaXMgdmFsaWQsIGJpbmQgaXQgdG8gJ3Jlc3VsdCcgYW5kIGRlc3Ryb3kgdGsgd2lkZ2V0LgorCisgICAgICAgIE90aGVyd2lzZSBsZWF2ZSBkaWFsb2cgb3BlbiBmb3IgdXNlciB0byBjb3JyZWN0IGVudHJ5IG9yIGNhbmNlbC4KKyAgICAgICAgJycnCisgICAgICAgIGVudHJ5ID0gc2VsZi5lbnRyeV9vaygpCisgICAgICAgIGlmIGVudHJ5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBlbnRyeQorICAgICAgICAgICAgc2VsZi5kZXN0cm95KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgW09rXSAoYnV0IG5vdCA8UmV0dXJuPikgbW92ZXMgZm9jdXMuICBNb3ZlIGl0IGJhY2suCisgICAgICAgICAgICBzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOiAgIyBEbyBub3QgcmVwbGFjZS4KKyAgICAgICAgIlNldCBkaWFsb2cgcmVzdWx0IHRvIE5vbmUgYW5kIGRlc3Ryb3kgdGsgd2lkZ2V0LiIKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKworY2xhc3MgU2VjdGlvbk5hbWUoUXVlcnkpOgorICAgICJHZXQgYSBuYW1lIGZvciBhIGNvbmZpZyBmaWxlIHNlY3Rpb24gbmFtZS4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcywKKyAgICAgICAgICAgICAgICAgKiwgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICAidXNlZF9uYW1lcyAtIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncyBhbHJlYWR5IGluIHVzZSIKKyAgICAgICAgc2VsZi51c2VkX25hbWVzID0gdXNlZF9uYW1lcworICAgICAgICBRdWVyeS5fX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHNlbnNpYmxlIENvbmZpZ1BhcnNlciBzZWN0aW9uIG5hbWUgb3IgTm9uZS4iCisgICAgICAgIG5hbWUgPSBzZWxmLmVudHJ5LmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBzaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBuYW1lIHNwZWNpZmllZC4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIGxlbihuYW1lKT4zMDoKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gJysKKyAgICAgICAgICAgICAgICAgICAgJzMwIGNoYXJhY3RlcnMuJywgcGFyZW50PXNlbGYpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gbmFtZQorCisKK2NsYXNzIE1vZHVsZU5hbWUoUXVlcnkpOgorICAgICJHZXQgYSBtb2R1bGUgbmFtZSBmb3IgT3BlbiBNb2R1bGUgbWVudSBlbnRyeS4iCisgICAgIyBVc2VkIGluIG9wZW5fbW9kdWxlIChlZGl0b3IuRWRpdG9yV2luZG93IHVudGlsIG1vdmUgdG8gaW9iaW5kaW5nKS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB0ZXh0MD0nJywKKyAgICAgICAgICAgICAgICAgKiwgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICAiIiJ0ZXh0MCAtIG5hbWUgc2VsZWN0ZWQgaW4gdGV4dCBiZWZvcmUgT3BlbiBNb2R1bGUgaW52b2tlZCIKKyAgICAgICAgIiIiCisgICAgICAgIFF1ZXJ5Ll9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwPXRleHQwLAorICAgICAgICAgICAgICAgICBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGVudHJ5X29rKHNlbGYpOgorICAgICAgICAiUmV0dXJuIGVudGVyZWQgbW9kdWxlIG5hbWUgYXMgZmlsZSBwYXRoIG9yIE5vbmUuIgorICAgICAgICAjIE1vdmVkIGhlcmUgZnJvbSBFZGl0b3JfV2luZG93LmxvYWRfbW9kdWxlIDIwMTYgSnVseS4KKyAgICAgICAgbmFtZSA9IHNlbGYuZW50cnkuZ2V0KCkuc3RyaXAoKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG5hbWUgc3BlY2lmaWVkLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW1wb3J0RXJyb3IpIGFzIG1zZzoKKyAgICAgICAgICAgIHNob3dlcnJvcigiSW1wb3J0IEVycm9yIiwgc3RyKG1zZyksIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNwZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHNob3dlcnJvcigiSW1wb3J0IEVycm9yIiwgIm1vZHVsZSBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMubG9hZGVyLCBpbXBvcnRsaWIuYWJjLlNvdXJjZUxvYWRlcik6CisgICAgICAgICAgICBzaG93ZXJyb3IoIkltcG9ydCBFcnJvciIsICJub3QgYSBzb3VyY2UtYmFzZWQgbW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlX3BhdGggPSBzcGVjLmxvYWRlci5nZXRfZmlsZW5hbWUobmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2hvd2Vycm9yKCJJbXBvcnQgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICJsb2FkZXIgZG9lcyBub3Qgc3VwcG9ydCBnZXRfZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBmaWxlX3BhdGgKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcXVlcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKworICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihRdWVyeSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkgYi9MaWIvaWRsZWxpYi9yZWRpcmVjdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3JlZGlyZWN0b3IucHkKaW5kZXggYjY2YmU5ZS4uM2ExMTA1NSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQorKysgYi9MaWIvaWRsZWxpYi9yZWRpcmVjdG9yLnB5CkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgICAgICBOb3RlIHRoYXQgaWYgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG9wZXJhdGlvbiBpcyBub3QKICAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gVGsuICBBcHBseSB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc2VsZi5yZWdpc3RlcigpCi0gICAgICAgIHRvICphcmdzIHRvIGFjY29tcGxpc2ggdGhhdC4gIEZvciBhbiBleGFtcGxlLCBzZWUgQ29sb3JEZWxlZ2F0b3IucHkuCisgICAgICAgIHRvICphcmdzIHRvIGFjY29tcGxpc2ggdGhhdC4gIEZvciBhbiBleGFtcGxlLCBzZWUgY29sb3JpemVyLnB5LgogCiAgICAgICAgICcnJwogICAgICAgICBtID0gc2VsZi5fb3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uKQpAQCAtMTUxLDE0ICsxNTEsMTQgQEAKIAogCiBkZWYgX3dpZGdldF9yZWRpcmVjdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgVGV4dAogICAgIGltcG9ydCByZQogCi0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IFdpZGdldFJlZGlyZWN0b3IiKQorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgV2lkZ2V0UmVkaXJlY3RvciIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHRleHQgPSBUZXh0KHJvb3QpCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB0ZXh0ID0gVGV4dCh0b3ApCiAgICAgdGV4dC5wYWNrKCkKICAgICB0ZXh0LmZvY3VzX3NldCgpCiAgICAgcmVkaXIgPSBXaWRnZXRSZWRpcmVjdG9yKHRleHQpCkBAIC0xNjYsMTEgKzE2NiwxMCBAQAogICAgICAgICBwcmludCgiaW5zZXJ0IiwgYXJncykKICAgICAgICAgb3JpZ2luYWxfaW5zZXJ0KCphcmdzKQogICAgIG9yaWdpbmFsX2luc2VydCA9IHJlZGlyLnJlZ2lzdGVyKCJpbnNlcnQiLCBteV9pbnNlcnQpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF93aWRnZXRyZWRpcicsCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9yZWRpcmVjdG9yJywKICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfd2lkZ2V0X3JlZGlyZWN0b3IpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvcmVwbGFjZS5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9yZXBsYWNlLnB5CmluZGV4IGYyZWEyMmUuLjU4OWI4MTQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvcmVwbGFjZS5weQpAQCAtNSw4ICs1LDggQEAKICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKK2Zyb20gaWRsZWxpYi5zZWFyY2hiYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCiBpbXBvcnQgcmUKIAogCkBAIC0xNCw3ICsxNCw3IEBACiAgICAgIiIiUmV0dXJucyBhIHNpbmdsZXRvbiBSZXBsYWNlRGlhbG9nIGluc3RhbmNlLlRoZSBzaW5nbGUgZGlhbG9nCiAgICAgIHNhdmVzIHVzZXIgZW50cmllcyBhbmQgcHJlZmVyZW5jZXMgYWNyb3NzIGluc3RhbmNlcy4iIiIKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfcmVwbGFjZWRpYWxvZyIpOgogICAgICAgICBlbmdpbmUuX3JlcGxhY2VkaWFsb2cgPSBSZXBsYWNlRGlhbG9nKHJvb3QsIGVuZ2luZSkKICAgICBkaWFsb2cgPSBlbmdpbmUuX3JlcGxhY2VkaWFsb2cKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgcG9zID0gTm9uZQogICAgICAgICBpZiBub3QgcG9zOgogICAgICAgICAgICAgZmlyc3QgPSBsYXN0ID0gcG9zID0gdGV4dC5pbmRleCgiaW5zZXJ0IikKLSAgICAgICAgbGluZSwgY29sID0gU2VhcmNoRW5naW5lLmdldF9saW5lX2NvbChwb3MpCisgICAgICAgIGxpbmUsIGNvbCA9IHNlYXJjaGVuZ2luZS5nZXRfbGluZV9jb2wocG9zKQogICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQogICAgICAgICBtID0gcHJvZy5tYXRjaChjaGFycywgY29sKQogICAgICAgICBpZiBub3QgcHJvZzoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weSBiL0xpYi9pZGxlbGliL3JzdHJpcC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9yc3RyaXAucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3J1bi5weSBiL0xpYi9pZGxlbGliL3J1bi5weQppbmRleCA1OTVlN2JjLi5lYjM0OTQ0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9ydW4ucHkKKysrIGIvTGliL2lkbGVsaWIvcnVuLnB5CkBAIC03LDE1ICs3LDE1IEBACiBpbXBvcnQgcXVldWUKIGltcG9ydCB0a2ludGVyCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgQ2FsbFRpcHMKLWZyb20gaWRsZWxpYiBpbXBvcnQgQXV0b0NvbXBsZXRlCitmcm9tIGlkbGVsaWIgaW1wb3J0IGNhbGx0aXBzCitmcm9tIGlkbGVsaWIgaW1wb3J0IGF1dG9jb21wbGV0ZQogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZURlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKLWZyb20gaWRsZWxpYiBpbXBvcnQgU3RhY2tWaWV3ZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXJfcgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z29ial9yCitmcm9tIGlkbGVsaWIgaW1wb3J0IHN0YWNrdmlld2VyCiBmcm9tIGlkbGVsaWIgaW1wb3J0IHJwYwotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCi1mcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCitmcm9tIGlkbGVsaWIgaW1wb3J0IGlvbWVudQogCiBpbXBvcnQgX19tYWluX18KIApAQCAtMzIsNyArMzIsNyBAQAogICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKICAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUoUHlTaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcoCisgICAgICAgIGZpbGUud3JpdGUocHlzaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcoCiAgICAgICAgICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUpKQogICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICBwYXNzICMgdGhlIGZpbGUgKHByb2JhYmx5IHN0ZGVycikgaXMgaW52YWxpZCAtIHRoaXMgd2FybmluZyBnZXRzIGxvc3QuCkBAIC04Miw3ICs4Miw3IEBACiAgICAgTXlIYW5kbGVyIG9iamVjdC4gIFRoYXQgcmVmZXJlbmNlIGlzIHNhdmVkIGFzIGF0dHJpYnV0ZSBycGNoYW5kbGVyIG9mIHRoZQogICAgIEV4ZWN1dGl2ZSBpbnN0YW5jZS4gIFRoZSBFeGVjdXRpdmUgbWV0aG9kcyBoYXZlIGFjY2VzcyB0byB0aGUgcmVmZXJlbmNlIGFuZAogICAgIGNhbiBwYXNzIGl0IG9uIHRvIGVudGl0aWVzIHRoYXQgdGhleSBjb21tYW5kCi0gICAgKGUuZy4gUmVtb3RlRGVidWdnZXIuRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoKSkuICBUaGUgbGF0dGVyLCBpbiB0dXJuLCBjYW4KKyAgICAoZS5nLiBkZWJ1Z2dlcl9yLkRlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKCkpLiAgVGhlIGxhdHRlciwgaW4gdHVybiwgY2FuCiAgICAgY2FsbCBNeUhhbmRsZXIoU29ja2V0SU8pIHJlZ2lzdGVyL3VucmVnaXN0ZXIgbWV0aG9kcyB2aWEgdGhlIHJlZmVyZW5jZSB0bwogICAgIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyIHRoZW1zZWx2ZXMuCiAKQEAgLTIwNCw3ICsyMDQsNyBAQAogICAgICAgICAgICAgdGJlID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCiAgICAgICAgICAgICBwcmludCgnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOicsIGZpbGU9ZWZpbGUpCiAgICAgICAgICAgICBleGNsdWRlID0gKCJydW4ucHkiLCAicnBjLnB5IiwgInRocmVhZGluZy5weSIsICJxdWV1ZS5weSIsCi0gICAgICAgICAgICAgICAgICAgICAgICJSZW1vdGVEZWJ1Z2dlci5weSIsICJiZGIucHkiKQorICAgICAgICAgICAgICAgICAgICAgICAiZGVidWdnZXJfci5weSIsICJiZGIucHkiKQogICAgICAgICAgICAgY2xlYW51cF90cmFjZWJhY2sodGJlLCBleGNsdWRlKQogICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2xpc3QodGJlLCBmaWxlPWVmaWxlKQogICAgICAgICBsaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwLCBleGMpCkBAIC0yOTgsMTIgKzI5OCwxMiBAQAogICAgICAgICBleGVjdXRpdmUgPSBFeGVjdXRpdmUoc2VsZikKICAgICAgICAgc2VsZi5yZWdpc3RlcigiZXhlYyIsIGV4ZWN1dGl2ZSkKICAgICAgICAgc2VsZi5jb25zb2xlID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJjb25zb2xlIikKLSAgICAgICAgc3lzLnN0ZGluID0gUHlTaGVsbC5Qc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZG91dCA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRvdXQiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZGVyciA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZGluID0gcHlzaGVsbC5Qc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZG91dCA9IHB5c2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRvdXQiLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZGVyciA9IHB5c2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKIAogICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBycGMuZGlzcGxheWhvb2sKICAgICAgICAgIyBwYWdlIGhlbHAoKSB0ZXh0IHRvIHNoZWxsLgpAQCAtMzM5LDggKzMzOSw4IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJwY2hhbmRsZXIpOgogICAgICAgICBzZWxmLnJwY2hhbmRsZXIgPSBycGNoYW5kbGVyCiAgICAgICAgIHNlbGYubG9jYWxzID0gX19tYWluX18uX19kaWN0X18KLSAgICAgICAgc2VsZi5jYWxsdGlwID0gQ2FsbFRpcHMuQ2FsbFRpcHMoKQotICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZSA9IEF1dG9Db21wbGV0ZS5BdXRvQ29tcGxldGUoKQorICAgICAgICBzZWxmLmNhbGx0aXAgPSBjYWxsdGlwcy5DYWxsVGlwcygpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gYXV0b2NvbXBsZXRlLkF1dG9Db21wbGV0ZSgpCiAKICAgICBkZWYgcnVuY29kZShzZWxmLCBjb2RlKToKICAgICAgICAgZ2xvYmFsIGludGVycnVwdGFibGUKQEAgLTM3Miw3ICszNzIsNyBAQAogICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKIAogICAgIGRlZiBzdGFydF90aGVfZGVidWdnZXIoc2VsZiwgZ3VpX2FkYXBfb2lkKToKLSAgICAgICAgcmV0dXJuIFJlbW90ZURlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKHNlbGYucnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQorICAgICAgICByZXR1cm4gZGVidWdnZXJfci5zdGFydF9kZWJ1Z2dlcihzZWxmLnJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKIAogICAgIGRlZiBzdG9wX3RoZV9kZWJ1Z2dlcihzZWxmLCBpZGJfYWRhcF9vaWQpOgogICAgICAgICAiVW5yZWdpc3RlciB0aGUgSWRiIEFkYXB0ZXIuICBMaW5rIG9iamVjdHMgYW5kIElkYiB0aGVuIHN1YmplY3QgdG8gR0MiCkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgICAgIHRiID0gdGIudGJfbmV4dAogICAgICAgICBzeXMubGFzdF90eXBlID0gdHlwCiAgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsCi0gICAgICAgIGl0ZW0gPSBTdGFja1ZpZXdlci5TdGFja1RyZWVJdGVtKGZsaXN0LCB0YikKLSAgICAgICAgcmV0dXJuIFJlbW90ZU9iamVjdEJyb3dzZXIucmVtb3RlX29iamVjdF90cmVlX2l0ZW0oaXRlbSkKKyAgICAgICAgaXRlbSA9IHN0YWNrdmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQorICAgICAgICByZXR1cm4gZGVidWdvYmpfci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5IGIvTGliL2lkbGVsaWIvcnVuc2NyaXB0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3J1bnNjcmlwdC5weQppbmRleCA1Y2I4MThkLi43ZTc1MjRhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL3J1bnNjcmlwdC5weQpAQCAtMjEsMTAgKzIxLDEwIEBACiBpbXBvcnQgdGFibmFubnkKIGltcG9ydCB0b2tlbml6ZQogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogaW5kZW50X21lc3NhZ2UgPSAiIiJFcnJvcjogSW5jb25zaXN0ZW50IGluZGVudGF0aW9uIGRldGVjdGVkIQogCkBAIC00NiwxMiArNDYsMTIgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKICAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgotICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgRGVidWdnZXIKKyAgICAgICAgIyBQcm92aWRlIGluc3RhbmNlIHZhcmlhYmxlcyByZWZlcmVuY2VkIGJ5IGRlYnVnZ2VyCiAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHkKICAgICAgICAgc2VsZi5mbGlzdCA9IHNlbGYuZWRpdHdpbi5mbGlzdAogICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLmVkaXR3aW4ucm9vdAogCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDb2NvYVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NvY29hVGsoKToKICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmJpbmQoJzw8cnVuLW1vZHVsZS1ldmVudC0yPj4nLCBzZWxmLl9ydW5fbW9kdWxlX2V2ZW50KQogCiAgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgIHNoZWxsLnNldF93YXJuaW5nX3N0cmVhbShzYXZlZF9zdHJlYW0pCiAKICAgICBkZWYgcnVuX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6Ci0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDb2NvYVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NvY29hVGsoKToKICAgICAgICAgICAgICMgVGstQ29jb2EgaW4gTWFjT1NYIGlzIGJyb2tlbiB1bnRpbCBhdCBsZWFzdAogICAgICAgICAgICAgIyBUayA4LjUuOSwgYW5kIHdpdGhvdXQgdGhpcyByYXRoZXIKICAgICAgICAgICAgICMgY3J1ZGUgd29ya2Fyb3VuZCBJRExFIHdvdWxkIGhhbmcgd2hlbiBhIHVzZXIKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICBpZiBub3Qgc2VsZi50YWJuYW5ueShmaWxlbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJwogICAgICAgICBpbnRlcnAgPSBzZWxmLnNoZWxsLmludGVycAotICAgICAgICBpZiBQeVNoZWxsLnVzZV9zdWJwcm9jZXNzOgorICAgICAgICBpZiBweXNoZWxsLnVzZV9zdWJwcm9jZXNzOgogICAgICAgICAgICAgaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1GYWxzZSwgZmlsZW5hbWU9CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZW5hbWUpKQogICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIGludGVycC5wcmVwZW5kX3N5c3BhdGgoZmlsZW5hbWUpCiAgICAgICAgICMgWFhYIEtCSyAwM0p1bDA0IFdoZW4gcnVuIHcvbyBzdWJwcm9jZXNzLCBydW50aW1lIHdhcm5pbmdzIHN0aWxsCiAgICAgICAgICMgICAgICAgICBnbyB0byBfX3N0ZGVycl9fLiAgV2l0aCBzdWJwcm9jZXNzLCB0aGV5IGdvIHRvIHRoZSBzaGVsbC4KLSAgICAgICAgIyAgICAgICAgIE5lZWQgdG8gY2hhbmdlIHN0cmVhbXMgaW4gUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyLgorICAgICAgICAjICAgICAgICAgTmVlZCB0byBjaGFuZ2Ugc3RyZWFtcyBpbiBweXNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXIuCiAgICAgICAgIGludGVycC5ydW5jb2RlKGNvZGUpCiAgICAgICAgIHJldHVybiAnYnJlYWsnCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weSBiL0xpYi9pZGxlbGliL3Njcm9sbGVkbGlzdC5weQpzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3Njcm9sbGVkbGlzdC5weQppbmRleCA1MzU3NmI1Li5kMGI2NjEwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvc2Nyb2xsZWRsaXN0LnB5CkBAIC0xLDUgKzEsNiBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIAogY2xhc3MgU2Nyb2xsZWRMaXN0OgogCkBAIC0yMyw3ICsyNCw3IEBACiAgICAgICAgICMgQmluZCBldmVudHMgdG8gdGhlIGxpc3QgYm94CiAgICAgICAgIGxpc3Rib3guYmluZCgiPEJ1dHRvblJlbGVhc2UtMT4iLCBzZWxmLmNsaWNrX2V2ZW50KQogICAgICAgICBsaXN0Ym94LmJpbmQoIjxEb3VibGUtQnV0dG9uUmVsZWFzZS0xPiIsIHNlbGYuZG91YmxlX2NsaWNrX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUHJlc3MtMj4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8Q29udHJvbC1CdXR0b24tMT4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICBlbHNlOgpAQCAtMTI0LDIyICsxMjUsMjAgQEAKICAgICAgICAgcGFzcwogCiAKLWRlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBTY3JvbGxlZExpc3QiKQorZGVmIF9zY3JvbGxlZF9saXN0KHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiUoeCsyMDAsIHkgKyAxNzUpKQogICAgIGNsYXNzIE15U2Nyb2xsZWRMaXN0KFNjcm9sbGVkTGlzdCk6CiAgICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icmlnaHQgY2xpY2siKQogICAgICAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KTogcHJpbnQoInNlbGVjdCIsIHNlbGYuZ2V0KGluZGV4KSkKICAgICAgICAgZGVmIG9uX2RvdWJsZShzZWxmLCBpbmRleCk6IHByaW50KCJkb3VibGUiLCBzZWxmLmdldChpbmRleCkpCiAKLSAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3Qocm9vdCkKKyAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3QodG9wKQogICAgIGZvciBpIGluIHJhbmdlKDMwKToKICAgICAgICAgc2Nyb2xsZWRfbGlzdC5hcHBlbmQoIkl0ZW0gJTAyZCIgJSBpKQogCi0gICAgcm9vdC5tYWlubG9vcCgpCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBBdCB0aGUgbW9tZW50LCB0ZXN0X3Njcm9sbGVkbGlzdCBtZXJlbHkgY3JlYXRlcyBpbnN0YW5jZSwgbGlrZSBodGVzdC4KICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3Njcm9sbGVkX2xpc3QpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2gucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zZWFyY2gucHkKaW5kZXggNzY1ZDUzZi4uYTYwOWZkOSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaC5weQpAQCAtMSwxMiArMSwxMiBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKK2Zyb20gaWRsZWxpYi5zZWFyY2hiYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCiAKIGRlZiBfc2V0dXAodGV4dCk6CiAgICAgIkNyZWF0ZSBvciBmaW5kIHRoZSBzaW5nbGV0b24gU2VhcmNoRGlhbG9nIGluc3RhbmNlLiIKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfc2VhcmNoZGlhbG9nIik6CiAgICAgICAgIGVuZ2luZS5fc2VhcmNoZGlhbG9nID0gU2VhcmNoRGlhbG9nKHJvb3QsIGVuZ2luZSkKICAgICByZXR1cm4gZW5naW5lLl9zZWFyY2hkaWFsb2cKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaGJhc2UucHkKaW5kZXggNWZhODRlMi4uOTIwNmJmNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQorKysgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBkZWYgY3JlYXRlX29wdGlvbl9idXR0b25zKHNlbGYpOgogICAgICAgICAnJydSZXR1cm4gKGZpbGxlZCBmcmFtZSwgb3B0aW9ucykgZm9yIHRlc3RpbmcuCiAKLSAgICAgICAgT3B0aW9ucyBpcyBhIGxpc3Qgb2YgU2VhcmNoRW5naW5lIGJvb2xlYW52YXIsIGxhYmVsIHBhaXJzLgorICAgICAgICBPcHRpb25zIGlzIGEgbGlzdCBvZiBzZWFyY2hlbmdpbmUgYm9vbGVhbnZhciwgbGFiZWwgcGFpcnMuCiAgICAgICAgIEEgZ3JpZGRlZCBmcmFtZSBmcm9tIG1ha2VfZnJhbWUgaXMgZmlsbGVkIHdpdGggYSBDaGVja2J1dHRvbgogICAgICAgICBmb3IgZWFjaCBwYWlyLCBib3VuZCB0byB0aGUgdmFyLCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGxhYmVsLgogICAgICAgICAnJycKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaEVuZ2luZS5weSBiL0xpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQppbmRleCAzNzg4M2JmLi4yZTM3MDBlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKKysrIGIvTGliL2lkbGVsaWIvc2VhcmNoZW5naW5lLnB5CkBAIC01Nyw3ICs1Nyw3IEBACiAKICAgICBkZWYgc2V0Y29va2VkcGF0KHNlbGYsIHBhdCk6CiAgICAgICAgICJTZXQgcGF0dGVybiBhZnRlciBlc2NhcGluZyBpZiByZS4iCi0gICAgICAgICMgY2FsbGVkIG9ubHkgaW4gU2VhcmNoRGlhbG9nLnB5OiA2NgorICAgICAgICAjIGNhbGxlZCBvbmx5IGluIHNlYXJjaC5weTogNjYKICAgICAgICAgaWYgc2VsZi5pc3JlKCk6CiAgICAgICAgICAgICBwYXQgPSByZS5lc2NhcGUocGF0KQogICAgICAgICBzZWxmLnNldHBhdChwYXQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weSBiL0xpYi9pZGxlbGliL3N0YWNrdmlld2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1N0YWNrVmlld2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zdGFja3ZpZXdlci5weQppbmRleCBjY2M3NTVjLi5iM2I5OWJjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weQorKysgYi9MaWIvaWRsZWxpYi9zdGFja3ZpZXdlci5weQpAQCAtNCw5ICs0LDkgQEAKIGltcG9ydCByZQogaW1wb3J0IHRraW50ZXIgYXMgdGsKIAotZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVOb2RlLCBUcmVlSXRlbSwgU2Nyb2xsZWRDYW52YXMKLWZyb20gaWRsZWxpYi5PYmplY3RCcm93c2VyIGltcG9ydCBPYmplY3RUcmVlSXRlbSwgbWFrZV9vYmplY3R0cmVlaXRlbQotZnJvbSBpZGxlbGliLlB5U2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAorZnJvbSBpZGxlbGliLnRyZWUgaW1wb3J0IFRyZWVOb2RlLCBUcmVlSXRlbSwgU2Nyb2xsZWRDYW52YXMKK2Zyb20gaWRsZWxpYi5kZWJ1Z29iaiBpbXBvcnQgT2JqZWN0VHJlZUl0ZW0sIG1ha2Vfb2JqZWN0dHJlZWl0ZW0KK2Zyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKIAogZGVmIFN0YWNrQnJvd3Nlcihyb290LCBmbGlzdD1Ob25lLCB0Yj1Ob25lLCB0b3A9Tm9uZSk6CiAgICAgaWYgdG9wIGlzIE5vbmU6CkBAIC0xMjAsMTUgKzEyMCwxMiBAQAogICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgcmV0dXJuIHN1Ymxpc3QKIAotICAgIGRlZiBrZXlzKHNlbGYpOiAgIyB1bnVzZWQsIGxlZnQgZm9yIHBvc3NpYmxlIDNyZCBwYXJ0eSB1c2UKLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5vYmplY3Qua2V5cygpKQotCiBkZWYgX3N0YWNrX3ZpZXdlcihwYXJlbnQpOgotICAgIHJvb3QgPSB0ay5UaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBTdGFja1ZpZXdlciIpCisgICAgdG9wID0gdGsuVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCBTdGFja1ZpZXdlciIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdCh0b3ApCiAgICAgdHJ5OiAjIHRvIG9idGFpbiBhIHRyYWNlYmFjayBvYmplY3QKICAgICAgICAgaW50ZW50aW9uYWxfbmFtZV9lcnJvcgogICAgIGV4Y2VwdCBOYW1lRXJyb3I6CkBAIC0xMzksNyArMTM2LDcgQEAKICAgICBzeXMubGFzdF92YWx1ZSA9IGV4Y192YWx1ZQogICAgIHN5cy5sYXN0X3RyYWNlYmFjayA9IGV4Y190YgogCi0gICAgU3RhY2tCcm93c2VyKHJvb3QsIGZsaXN0PWZsaXN0LCB0b3A9cm9vdCwgdGI9ZXhjX3RiKQorICAgIFN0YWNrQnJvd3Nlcih0b3AsIGZsaXN0PWZsaXN0LCB0b3A9dG9wLCB0Yj1leGNfdGIpCiAKICAgICAjIHJlc3RvcmUgc3lzIHRvIG9yaWdpbmFsIHN0YXRlCiAgICAgZGVsIHN5cy5sYXN0X3R5cGUKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5IGIvTGliL2lkbGVsaWIvc3RhdHVzYmFyLnB5CnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zdGF0dXNiYXIucHkKaW5kZXggZTgyYmE5YS4uYzA5MzkyMCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkKKysrIGIvTGliL2lkbGVsaWIvc3RhdHVzYmFyLnB5CkBAIC0xLDE2ICsxLDE0IEBACi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlciBpbXBvcnQgRnJhbWUsIExhYmVsCiAKIGNsYXNzIE11bHRpU3RhdHVzQmFyKEZyYW1lKToKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6Ci0gICAgICAgIGlmIG1hc3RlciBpcyBOb25lOgotICAgICAgICAgICAgbWFzdGVyID0gVGsoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqa3cpOgogICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqa3cpCiAgICAgICAgIHNlbGYubGFiZWxzID0ge30KIAotICAgIGRlZiBzZXRfbGFiZWwoc2VsZiwgbmFtZSwgdGV4dD0nJywgc2lkZT1MRUZULCB3aWR0aD0wKToKKyAgICBkZWYgc2V0X2xhYmVsKHNlbGYsIG5hbWUsIHRleHQ9JycsIHNpZGU9J2xlZnQnLCB3aWR0aD0wKToKICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5sYWJlbHM6Ci0gICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYsIGJvcmRlcndpZHRoPTAsIGFuY2hvcj1XKQorICAgICAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLCBib3JkZXJ3aWR0aD0wLCBhbmNob3I9J3cnKQogICAgICAgICAgICAgbGFiZWwucGFjayhzaWRlPXNpZGUsIHBhZHk9MCwgcGFkeD00KQogICAgICAgICAgICAgc2VsZi5sYWJlbHNbbmFtZV0gPSBsYWJlbAogICAgICAgICBlbHNlOgpAQCAtMjAsMjcgKzE4LDI3IEBACiAgICAgICAgIGxhYmVsLmNvbmZpZyh0ZXh0PXRleHQpCiAKIGRlZiBfbXVsdGlzdGF0dXNfYmFyKHBhcmVudCk6Ci0gICAgcm9vdCA9IFRrKCkKKyAgICBpbXBvcnQgcmUKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZSwgVGV4dCwgQnV0dG9uCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQogICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiICUoeCwgeSArIDE1MCkpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBtdWx0aXN0YXR1cyBiYXIiKQotICAgIGZyYW1lID0gRnJhbWUocm9vdCkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSh4LCB5ICsgMTUwKSkKKyAgICB0b3AudGl0bGUoIlRlc3QgbXVsdGlzdGF0dXMgYmFyIikKKyAgICBmcmFtZSA9IEZyYW1lKHRvcCkKICAgICB0ZXh0ID0gVGV4dChmcmFtZSkKICAgICB0ZXh0LnBhY2soKQogICAgIG1zYiA9IE11bHRpU3RhdHVzQmFyKGZyYW1lKQogICAgIG1zYi5zZXRfbGFiZWwoIm9uZSIsICJoZWxsbyIpCiAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgIndvcmxkIikKLSAgICBtc2IucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQorICAgIG1zYi5wYWNrKHNpZGU9J2JvdHRvbScsIGZpbGw9J3gnKQogCiAgICAgZGVmIGNoYW5nZSgpOgogICAgICAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiZm9vIikKICAgICAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgImJhciIpCiAKLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iVXBkYXRlIHN0YXR1cyIsIGNvbW1hbmQ9Y2hhbmdlKQotICAgIGJ1dHRvbi5wYWNrKHNpZGU9Qk9UVE9NKQorICAgIGJ1dHRvbiA9IEJ1dHRvbih0b3AsIHRleHQ9IlVwZGF0ZSBzdGF0dXMiLCBjb21tYW5kPWNoYW5nZSkKKyAgICBidXR0b24ucGFjayhzaWRlPSdib3R0b20nKQogICAgIGZyYW1lLnBhY2soKQotICAgIGZyYW1lLm1haW5sb29wKCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5IGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKaW5kZXggOTY1ZjlmOC4uNWY2NzA5NyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKKysrIGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKQEAgLTQ2NywzMSArNDY3LDI5IEBACiAKICAgICAgICAgc2VsZi5fdGFiX3NldC5zZXRfc2VsZWN0ZWRfdGFiKHBhZ2VfbmFtZSkKIAotZGVmIF90YWJiZWRfcGFnZXMocGFyZW50KToKLSAgICAjIHRlc3QgZGlhbG9nCi0gICAgcm9vdD1UaygpCitkZWYgX3RhYmJlZF9wYWdlcyhwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgaW1wb3J0IHJlCisgICAgdG9wPVRvcGxldmVsKHBhcmVudCkKICAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE3NSkpCi0gICAgcm9vdC50aXRsZSgiVGVzdCB0YWJiZWQgcGFnZXMiKQotICAgIHRhYlBhZ2U9VGFiYmVkUGFnZVNldChyb290LCBwYWdlX25hbWVzPVsnRm9vYmFyJywnQmF6J10sIG5fcm93cz0wLAorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE3NSkpCisgICAgdG9wLnRpdGxlKCJUZXN0IHRhYmJlZCBwYWdlcyIpCisgICAgdGFiUGFnZT1UYWJiZWRQYWdlU2V0KHRvcCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICB0YWJQYWdlLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCiAgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0ZvbycsIHBhZHk9MjApLnBhY2soKQogICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0Zvb2JhciddLmZyYW1lLCB0ZXh0PSdCYXInLCBwYWR5PTIwKS5wYWNrKCkKICAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydCYXonXS5mcmFtZSwgdGV4dD0nQmF6JykucGFjaygpCi0gICAgZW50cnlQZ05hbWU9RW50cnkocm9vdCkKLSAgICBidXR0b25BZGQ9QnV0dG9uKHJvb3QsIHRleHQ9J0FkZCBQYWdlJywKKyAgICBlbnRyeVBnTmFtZT1FbnRyeSh0b3ApCisgICAgYnV0dG9uQWRkPUJ1dHRvbih0b3AsIHRleHQ9J0FkZCBQYWdlJywKICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnRhYlBhZ2UuYWRkX3BhZ2UoZW50cnlQZ05hbWUuZ2V0KCkpKQotICAgIGJ1dHRvblJlbW92ZT1CdXR0b24ocm9vdCwgdGV4dD0nUmVtb3ZlIFBhZ2UnLAorICAgIGJ1dHRvblJlbW92ZT1CdXR0b24odG9wLCB0ZXh0PSdSZW1vdmUgUGFnZScsCiAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp0YWJQYWdlLnJlbW92ZV9wYWdlKGVudHJ5UGdOYW1lLmdldCgpKSkKLSAgICBsYWJlbFBnTmFtZT1MYWJlbChyb290LCB0ZXh0PSduYW1lIG9mIHBhZ2UgdG8gYWRkL3JlbW92ZTonKQorICAgIGxhYmVsUGdOYW1lPUxhYmVsKHRvcCwgdGV4dD0nbmFtZSBvZiBwYWdlIHRvIGFkZC9yZW1vdmU6JykKICAgICBidXR0b25BZGQucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBidXR0b25SZW1vdmUucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBsYWJlbFBnTmFtZS5wYWNrKHBhZHg9NSkKICAgICBlbnRyeVBnTmFtZS5wYWNrKHBhZHg9NSkKLSAgICByb290Lm1haW5sb29wKCkKLQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkgYi9MaWIvaWRsZWxpYi90ZXh0dmlldy5weQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi90ZXh0Vmlldy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKaW5kZXggMTJhYzMxOS4uNzY2NDUyNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkKKysrIGIvTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKQEAgLTMsNyArMyw4IEBACiAiIiIKIAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIHRraW50ZXIubWVzc2FnZWJveCBpbXBvcnQgc2hvd2Vycm9yCiAKIGNsYXNzIFRleHRWaWV3ZXIoVG9wbGV2ZWwpOgogICAgICIiIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRQpAQCAtNTAsNyArNTEsNyBAQAogICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5PaywgdGFrZWZvY3VzPUZBTFNFKQogICAgICAgICBzZWxmLnNjcm9sbGJhclZpZXcgPSBTY3JvbGxiYXIoZnJhbWVUZXh0LCBvcmllbnQ9VkVSVElDQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlZm9jdXM9RkFMU0UsIGhpZ2hsaWdodHRoaWNrbmVzcz0wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFKQogICAgICAgICBzZWxmLnRleHRWaWV3ID0gVGV4dChmcmFtZVRleHQsIHdyYXA9V09SRCwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCiAgICAgICAgIHNlbGYuc2Nyb2xsYmFyVmlldy5jb25maWcoY29tbWFuZD1zZWxmLnRleHRWaWV3Lnl2aWV3KQpAQCAtNzIsMTQgKzczLDE0IEBACiAgICAgdHJ5OgogICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJywgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGZpbGU6CiAgICAgICAgICAgICBjb250ZW50cyA9IGZpbGUucmVhZCgpCi0gICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgTG9hZCBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIGxvYWQgZmlsZSAlciAuJyAlIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHNob3dlcnJvcih0aXRsZT0nRmlsZSBMb2FkIEVycm9yJywKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byBsb2FkIGZpbGUgJXIgLicgJSBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCiAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciBhcyBlcnI6Ci0gICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J1VuaWNvZGUgRGVjb2RlIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cihlcnIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCisgICAgICAgIHNob3dlcnJvcih0aXRsZT0nVW5pY29kZSBEZWNvZGUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIoZXJyKSwKKyAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIHZpZXdfdGV4dChwYXJlbnQsIHRpdGxlLCBjb250ZW50cywgbW9kYWwpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Rvb2xUaXAucHkgYi9MaWIvaWRsZWxpYi90b29sdGlwLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1Rvb2xUaXAucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3Rvb2x0aXAucHkKaW5kZXggOTY0MTA3ZS4uYzNlYWZlZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvVG9vbFRpcC5weQorKysgYi9MaWIvaWRsZWxpYi90b29sdGlwLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBnZW5lcmFsIHB1cnBvc2UgJ3Rvb2x0aXAnIHJvdXRpbmVzIC0gY3VycmVudGx5IHVudXNlZCBpbiBpZGxlZm9yaworIyBnZW5lcmFsIHB1cnBvc2UgJ3Rvb2x0aXAnIHJvdXRpbmVzIC0gY3VycmVudGx5IHVudXNlZCBpbiBpZGxlbGliCiAjIChhbHRob3VnaCB0aGUgJ2NhbGx0aXBzJyBleHRlbnNpb24gaXMgcGFydGx5IGJhc2VkIG9uIHRoaXMgY29kZSkKICMgbWF5IGJlIHVzZWZ1bCBmb3Igc29tZSBwdXJwb3NlcyBpbiAob3IgYWxtb3N0IGluIDspIHRoZSBjdXJyZW50IHByb2plY3Qgc2NvcGUKICMgSWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuaXRlbXM6CiAgICAgICAgICAgICBsaXN0Ym94Lmluc2VydChFTkQsIGl0ZW0pCiAKLWRlZiBfdG9vbHRpcChwYXJlbnQpOgorZGVmIF90b29sdGlwKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICByb290ID0gVGsoKQogICAgIHJvb3QudGl0bGUoIlRlc3QgdG9vbHRpcCIpCiAgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weSBiL0xpYi9pZGxlbGliL3RyZWUucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdHJlZS5weQppbmRleCBhMTk1NzhmLi5jYjdmOWFlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL3RyZWUucHkKQEAgLTE2LDkgKzE2LDkgQEAKIAogaW1wb3J0IG9zCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLQotZnJvbSBpZGxlbGliIGltcG9ydCBab29tSGVpZ2h0Ci1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgorZnJvbSBpZGxlbGliIGltcG9ydCB6b29taGVpZ2h0Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiBJQ09ORElSID0gIkljb25zIgogCkBAIC00NDUsMjIgKzQ0NSwyMSBAQAogICAgICAgICBzZWxmLmNhbnZhcy55dmlld19zY3JvbGwoMSwgInVuaXQiKQogICAgICAgICByZXR1cm4gImJyZWFrIgogICAgIGRlZiB6b29tX2hlaWdodChzZWxmLCBldmVudCk6Ci0gICAgICAgIFpvb21IZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCisgICAgICAgIHpvb21oZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKIAotZGVmIF90cmVlX3dpZGdldChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBUcmVlV2lkZ2V0IikKK2RlZiBfdHJlZV93aWRnZXQocGFyZW50KTogICMgaHRlc3QgIworICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKICAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiJSh4KzUwLCB5KzE3NSkpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIiwgc2lkZT1MRUZUKQotICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MuZ2V0Y3dkKCkpCisgICAgaXRlbSA9IEZpbGVUcmVlSXRlbShJQ09ORElSKQogICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCiAgICAgbm9kZS5leHBhbmQoKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdGVzdF90cmVlIGlzIGN1cnJlbnRseSBhIGNvcHkgb2YgdGhpcwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfdHJlZV93aWRnZXQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvdW5kby5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi91bmRvLnB5CmluZGV4IDFjMjUwMmQuLmNjYzk2MmEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvdW5kby5weQpAQCAtMSw3ICsxLDcgQEAKIGltcG9ydCBzdHJpbmcKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorIyB0a2ludHRlciBpbXBvcnQgbm90IG5lZWRlZCBiZWNhdXNlIG1vZHVsZSBkb2VzIG5vdCBjcmVhdGUgd2lkZ2V0cywKKyMgYWx0aG91Z2ggbWFueSBtZXRob2RzIG9wZXJhdGUgb24gdGV4dCB3aWRnZXQgYXJndW1lbnRzLgogCiAjJCBldmVudCA8PHJlZG8+PgogIyQgd2luIDxDb250cm9sLXk+CkBAIC0zMzksMTIgKzMzOSwxMiBAQAogCiBkZWYgX3VuZG9fZGVsZWdhdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICBpbXBvcnQgcmUKLSAgICBpbXBvcnQgdGtpbnRlciBhcyB0awotICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi0gICAgdW5kb3dpbiA9IHRrLlRvcGxldmVsKCkKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0LCBCdXR0b24KKyAgICBmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIHVuZG93aW4gPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdW5kb3dpbi50aXRsZSgiVGVzdCBVbmRvRGVsZWdhdG9yIikKICAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgdW5kb3dpbi5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgdW5kb3dpbi5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE3NSkpCiAKICAgICB0ZXh0ID0gVGV4dCh1bmRvd2luLCBoZWlnaHQ9MTApCiAgICAgdGV4dC5wYWNrKCkKQEAgLTM2Miw3ICszNjIsNyBAQAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfdW5kb2RlbGVnYXRvcicsIHZlcmJvc2l0eT0yLAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfdW5kbycsIHZlcmJvc2l0eT0yLAogICAgICAgICAgICAgICAgICAgZXhpdD1GYWxzZSkKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3VuZG9fZGVsZWdhdG9yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvV2luZG93TGlzdC5weSBiL0xpYi9pZGxlbGliL3dpbmRvd3MucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1dpbmRvd0xpc3QucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3dpbmRvd3MucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkgYi9MaWIvaWRsZWxpYi96b29taGVpZ2h0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3pvb21oZWlnaHQucHkKaW5kZXggYTVkNjc5ZS4uMDAxNmU5ZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQorKysgYi9MaWIvaWRsZWxpYi96b29taGVpZ2h0LnB5CkBAIC0zLDcgKzMsNyBAQAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogY2xhc3MgWm9vbUhlaWdodDoKIApAQCAtMzIsNyArMzIsNyBAQAogICAgICAgICBuZXd5ID0gMAogICAgICAgICBuZXdoZWlnaHQgPSBuZXdoZWlnaHQgLSA3MgogCi0gICAgZWxpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgZWxpZiBtYWNvc3guaXNBcXVhVGsoKToKICAgICAgICAgIyBUaGUgJzg4JyBiZWxvdyBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IGF2b2lkcyBwbGFjaW5nIHRoZSBib3R0b20KICAgICAgICAgIyBvZiB0aGUgd2luZG93IGJlbG93IHRoZSBwYW5lbCBvbiBteSBtYWNoaW5lLiBJIGRvbid0IGtub3cgaG93CiAgICAgICAgICMgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIHdpdGggdGtpbnRlci4KZGlmZiAtLWdpdCBhL0xpYi9pbWFwbGliLnB5IGIvTGliL2ltYXBsaWIucHkKaW5kZXggNGU4YTRiYi4uYTYzYmE4ZCAxMDA2NDQKLS0tIGEvTGliL2ltYXBsaWIucHkKKysrIGIvTGliL2ltYXBsaWIucHkKQEAgLTExMSw3ICsxMTEsMTUgQEAKICMgTGl0ZXJhbCBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KIExpdGVyYWwgPSByZS5jb21waWxlKGJyJy4qeyg/UDxzaXplPlxkKyl9JCcsIHJlLkFTQ0lJKQogTWFwQ1JMRiA9IHJlLmNvbXBpbGUoYnInXHJcbnxccnxcbicpCi1SZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShicidcWyg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT5bXlxdXSopKT9cXScpCisjIFdlIG5vIGxvbmdlciBleGNsdWRlIHRoZSAnXScgY2hhcmFjdGVyIGZyb20gdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgY29kZSwgZXZlbiB0aG91Z2ggaXQgdmlvbGF0ZXMgdGhlIFJGQy4gIFBvcHVsYXIgSU1BUCBzZXJ2ZXJzIHN1Y2ggYXMgR21haWwKKyMgYWxsb3cgZmxhZ3Mgd2l0aCAnXScsIGFuZCB0aGVyZSBhcmUgcHJvZ3JhbXMgKGluY2x1ZGluZyBpbWFwbGliISkgdGhhdCBjYW4KKyMgcHJvZHVjZSB0aGVtLiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIGlmIHRoZSAndGV4dCcgcG9ydGlvbiBvZiB0aGUgcmVzcG9uc2UKKyMgaW5jbHVkZXMgYSAnXScgd2UnbGwgcGFyc2UgdGhlIHJlc3BvbnNlIHdyb25nICh3aGljaCBpcyB0aGUgcG9pbnQgb2YgdGhlIFJGQworIyByZXN0cmljdGlvbikuICBIb3dldmVyLCB0aGF0IHNlZW1zIGxlc3MgbGlrZWx5IHRvIGJlIGEgcHJvYmxlbSBpbiBwcmFjdGljZQorIyB0aGFuIGJlaW5nIHVuYWJsZSB0byBjb3JyZWN0bHkgcGFyc2UgZmxhZ3MgdGhhdCBpbmNsdWRlICddJyBjaGFycywgd2hpY2gKKyMgd2FzIHJlcG9ydGVkIGFzIGEgcmVhbC13b3JsZCBwcm9ibGVtIGluIGlzc3VlICMyMTgxNS4KK1Jlc3BvbnNlX2NvZGUgPSByZS5jb21waWxlKGJyJ1xbKD9QPHR5cGU+W0EtWi1dKykoICg/UDxkYXRhPi4qKSk/XF0nKQogVW50YWdnZWRfcmVzcG9uc2UgPSByZS5jb21waWxlKGJyJ1wqICg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpPycpCiAjIFVudGFnZ2VkX3N0YXR1cyBpcyBubyBsb25nZXIgdXNlZDsga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogVW50YWdnZWRfc3RhdHVzID0gcmUuY29tcGlsZSgKZGlmZiAtLWdpdCBhL0xpYi9pbXAucHkgYi9MaWIvaW1wLnB5CmluZGV4IGY2ZmZmNDQuLmIzMzk5NTIgMTAwNjQ0Ci0tLSBhL0xpYi9pbXAucHkKKysrIGIvTGliL2ltcC5weQpAQCAtMzAsNyArMzAsNyBAQAogCiB3YXJuaW5ncy53YXJuKCJ0aGUgaW1wIG1vZHVsZSBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBpbXBvcnRsaWI7ICIKICAgICAgICAgICAgICAgInNlZSB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiBmb3IgYWx0ZXJuYXRpdmUgdXNlcyIsCi0gICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAKICMgREVQUkVDQVRFRAogU0VBUkNIX0VSUk9SID0gMApkaWZmIC0tZ2l0IGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5IGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5CmluZGV4IDllZWNiZmUuLmFmYzMxZWUgMTAwNjQ0Ci0tLSBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weQorKysgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkKQEAgLTg3OCwxMyArODc4LDIwIEBACiAKIGRlZiBfZmluZF9zcGVjKG5hbWUsIHBhdGgsIHRhcmdldD1Ob25lKToKICAgICAiIiJGaW5kIGEgbW9kdWxlJ3MgbG9hZGVyLiIiIgotICAgIGlmIHN5cy5tZXRhX3BhdGggaXMgbm90IE5vbmUgYW5kIG5vdCBzeXMubWV0YV9wYXRoOgorICAgIG1ldGFfcGF0aCA9IHN5cy5tZXRhX3BhdGgKKyAgICBpZiBtZXRhX3BhdGggaXMgTm9uZToKKyAgICAgICAgIyBQeUltcG9ydF9DbGVhbnVwKCkgaXMgcnVubmluZyBvciBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJzeXMubWV0YV9wYXRoIGlzIE5vbmUsIFB5dGhvbiBpcyBsaWtlbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2h1dHRpbmcgZG93biIpCisKKyAgICBpZiBub3QgbWV0YV9wYXRoOgogICAgICAgICBfd2FybmluZ3Mud2Fybignc3lzLm1ldGFfcGF0aCBpcyBlbXB0eScsIEltcG9ydFdhcm5pbmcpCisKICAgICAjIFdlIGNoZWNrIHN5cy5tb2R1bGVzIGhlcmUgZm9yIHRoZSByZWxvYWQgY2FzZS4gIFdoaWxlIGEgcGFzc2VkLWluCiAgICAgIyB0YXJnZXQgd2lsbCB1c3VhbGx5IGluZGljYXRlIGEgcmVsb2FkIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSwgd2hlcmVhcwogICAgICMgc3lzLm1vZHVsZXMgcHJvdmlkZXMgb25lLgogICAgIGlzX3JlbG9hZCA9IG5hbWUgaW4gc3lzLm1vZHVsZXMKLSAgICBmb3IgZmluZGVyIGluIHN5cy5tZXRhX3BhdGg6CisgICAgZm9yIGZpbmRlciBpbiBtZXRhX3BhdGg6CiAgICAgICAgIHdpdGggX0ltcG9ydExvY2tDb250ZXh0KCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmluZF9zcGVjID0gZmluZGVyLmZpbmRfc3BlYwpAQCAtOTI1LDYgKzkzMiw5IEBACiAgICAgaWYgbGV2ZWwgPiAwOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlLCBzdHIpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX3BhY2thZ2VfXyBub3Qgc2V0IHRvIGEgc3RyaW5nJykKKyAgICAgICAgZWxpZiBub3QgcGFja2FnZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IHdpdGggbm8ga25vd24gcGFyZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlJykKICAgICAgICAgZWxpZiBwYWNrYWdlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIG1zZyA9ICgnUGFyZW50IG1vZHVsZSB7IXJ9IG5vdCBsb2FkZWQsIGNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlICcKICAgICAgICAgICAgICAgICAgICAnaW1wb3J0JykKQEAgLTEwMzMsNyArMTA0MywxOSBAQAogCiAgICAgIiIiCiAgICAgcGFja2FnZSA9IGdsb2JhbHMuZ2V0KCdfX3BhY2thZ2VfXycpCi0gICAgaWYgcGFja2FnZSBpcyBOb25lOgorICAgIHNwZWMgPSBnbG9iYWxzLmdldCgnX19zcGVjX18nKQorICAgIGlmIHBhY2thZ2UgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmUgYW5kIHBhY2thZ2UgIT0gc3BlYy5wYXJlbnQ6CisgICAgICAgICAgICBfd2FybmluZ3Mud2FybigiX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYiKHtwYWNrYWdlIXJ9ICE9IHtzcGVjLnBhcmVudCFyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQorICAgICAgICByZXR1cm4gcGFja2FnZQorICAgIGVsaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHNwZWMucGFyZW50CisgICAgZWxzZToKKyAgICAgICAgX3dhcm5pbmdzLndhcm4oImNhbid0IHJlc29sdmUgcGFja2FnZSBmcm9tIF9fc3BlY19fIG9yIF9fcGFja2FnZV9fLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgb24gX19uYW1lX18gYW5kIF9fcGF0aF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQogICAgICAgICBwYWNrYWdlID0gZ2xvYmFsc1snX19uYW1lX18nXQogICAgICAgICBpZiAnX19wYXRoX18nIG5vdCBpbiBnbG9iYWxzOgogICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2UucnBhcnRpdGlvbignLicpWzBdCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKaW5kZXggMDhkZGIyYi4uMzBlODMzMCAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQpAQCAtMTMwLDEwICsxMzAsNiBAQAogIyBhIC5weWMgZmlsZSBpbiB0ZXh0IG1vZGUgdGhlIG1hZ2ljIG51bWJlciB3aWxsIGJlIHdyb25nOyBhbHNvLCB0aGUKICMgQXBwbGUgTVBXIGNvbXBpbGVyIHN3YXBzIHRoZWlyIHZhbHVlcywgYm90Y2hpbmcgc3RyaW5nIGNvbnN0YW50cy4KICMKLSMgVGhlIG1hZ2ljIG51bWJlcnMgbXVzdCBiZSBzcGFjZWQgYXBhcnQgYXQgbGVhc3QgMiB2YWx1ZXMsIGFzIHRoZQotIyAtVSBpbnRlcnBldGVyIGZsYWcgd2lsbCBjYXVzZSBNQUdJQysxIGJlaW5nIHVzZWQuIFRoZXkgaGF2ZSBiZWVuCi0jIG9kZCBudW1iZXJzIGZvciBzb21lIHRpbWUgbm93LgotIwogIyBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZiBvbGQgc2NoZW1lcyBmb3Igc2V0dGluZyB0aGUgbWFnaWMgbnVtYmVyLgogIyBUaGUgY3VycmVudCB3b3JraW5nIHNjaGVtZSBpcyB0byBpbmNyZW1lbnQgdGhlIHByZXZpb3VzIHZhbHVlIGJ5CiAjIDEwLgpAQCAtMjI0LDYgKzIyMCwxMiBAQAogIyAgICAgUHl0aG9uIDMuNWIyICAzMzQwIChmaXggZGljdGlvbmFyeSBkaXNwbGF5IGV2YWx1YXRpb24gb3JkZXIgIzExMjA1KQogIyAgICAgUHl0aG9uIDMuNWIyICAzMzUwIChhZGQgR0VUX1lJRUxEX0ZST01fSVRFUiBvcGNvZGUgIzI0NDAwKQogIyAgICAgUHl0aG9uIDMuNS4yICAzMzUxIChmaXggQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlICMyNzI4NikKKyMgICAgIFB5dGhvbiAzLjZhMCAgMzM2MCAoYWRkIEZPUk1BVF9WQUxVRSBvcGNvZGUgIzI1NDgzCisjICAgICBQeXRob24gMy42YTAgIDMzNjEgKGxpbmVubyBkZWx0YSBvZiBjb2RlLmNvX2xub3RhYiBiZWNvbWVzIHNpZ25lZCkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MCAoMTYgYml0IHdvcmRjb2RlKQorIyAgICAgUHl0aG9uIDMuNmExICAzMzcxIChhZGQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUgIzI3MTQwKQorIyAgICAgUHl0aG9uIDMuNmExICAzMzcyIChNQUtFX0ZVTkNUSU9OIHNpbXBsaWZpY2F0aW9uLCByZW1vdmUgTUFLRV9DTE9TVVJFCisgICAgICAgICAgICAgICAgICAgICAgICAgICMyNzA5NSkKICMKICMgTUFHSUMgbXVzdCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGJ5dGVjb2RlIGVtaXR0ZWQgYnkgdGhlIGNvbXBpbGVyIG1heSBubwogIyBsb25nZXIgYmUgdW5kZXJzdG9vZCBieSBvbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGV2YWwgbG9vcCAodXN1YWxseQpAQCAtMjMyLDcgKzIzNCw3IEBACiAjIFdoZW5ldmVyIE1BR0lDX05VTUJFUiBpcyBjaGFuZ2VkLCB0aGUgcmFuZ2VzIGluIHRoZSBtYWdpY192YWx1ZXMgYXJyYXkKICMgaW4gUEMvbGF1bmNoZXIuYyBtdXN0IGFsc28gYmUgdXBkYXRlZC4KIAotTUFHSUNfTlVNQkVSID0gKDMzNTEpLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKK01BR0lDX05VTUJFUiA9ICgzMzcyKS50b19ieXRlcygyLCAnbGl0dGxlJykgKyBiJ1xyXG4nCiBfUkFXX01BR0lDX05VTUJFUiA9IGludC5mcm9tX2J5dGVzKE1BR0lDX05VTUJFUiwgJ2xpdHRsZScpICAjIEZvciBpbXBvcnQuYwogCiBfUFlDQUNIRSA9ICdfX3B5Y2FjaGVfXycKQEAgLTM2NCwxNCArMzY2LDYgQEAKICAgICByZXR1cm4gbW9kZQogCiAKLWRlZiBfdmVyYm9zZV9tZXNzYWdlKG1lc3NhZ2UsICphcmdzLCB2ZXJib3NpdHk9MSk6Ci0gICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2UgdG8gc3RkZXJyIGlmIC12L1BZVEhPTlZFUkJPU0UgaXMgdHVybmVkIG9uLiIiIgotICAgIGlmIHN5cy5mbGFncy52ZXJib3NlID49IHZlcmJvc2l0eToKLSAgICAgICAgaWYgbm90IG1lc3NhZ2Uuc3RhcnRzd2l0aCgoJyMnLCAnaW1wb3J0ICcpKToKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAnIyAnICsgbWVzc2FnZQotICAgICAgICBwcmludChtZXNzYWdlLmZvcm1hdCgqYXJncyksIGZpbGU9c3lzLnN0ZGVycikKLQotCiBkZWYgX2NoZWNrX25hbWUobWV0aG9kKToKICAgICAiIiJEZWNvcmF0b3IgdG8gdmVyaWZ5IHRoYXQgdGhlIG1vZHVsZSBiZWluZyByZXF1ZXN0ZWQgbWF0Y2hlcyB0aGUgb25lIHRoZQogICAgIGxvYWRlciBjYW4gaGFuZGxlLgpAQCAtNDQxLDE1ICs0MzUsMTUgQEAKICAgICByYXdfc2l6ZSA9IGRhdGFbODoxMl0KICAgICBpZiBtYWdpYyAhPSBNQUdJQ19OVU1CRVI6CiAgICAgICAgIG1lc3NhZ2UgPSAnYmFkIG1hZ2ljIG51bWJlciBpbiB7IXJ9OiB7IXJ9Jy5mb3JtYXQobmFtZSwgbWFnaWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1lc3NhZ2UsICoqZXhjX2RldGFpbHMpCiAgICAgZWxpZiBsZW4ocmF3X3RpbWVzdGFtcCkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHRpbWVzdGFtcCBpbiB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgRU9GRXJyb3IobWVzc2FnZSkKICAgICBlbGlmIGxlbihyYXdfc2l6ZSkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHNpemUgb2Ygc291cmNlIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGlmIHNvdXJjZV9zdGF0cyBpcyBub3QgTm9uZToKICAgICAgICAgdHJ5OgpAQCAtNDU5LDcgKzQ1Myw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBfcl9sb25nKHJhd190aW1lc3RhbXApICE9IHNvdXJjZV9tdGltZToKICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ2J5dGVjb2RlIGlzIHN0YWxlIGZvciB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc291cmNlX3NpemUgPSBzb3VyY2Vfc3RhdHNbJ3NpemUnXSAmIDB4RkZGRkZGRkYKQEAgLTQ3Niw3ICs0NzAsNyBAQAogICAgICIiIkNvbXBpbGUgYnl0ZWNvZGUgYXMgcmV0dXJuZWQgYnkgX3ZhbGlkYXRlX2J5dGVjb2RlX2hlYWRlcigpLiIiIgogICAgIGNvZGUgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCiAgICAgaWYgaXNpbnN0YW5jZShjb2RlLCBfY29kZV90eXBlKToKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQogICAgICAgICBpZiBzb3VyY2VfcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIF9pbXAuX2ZpeF9jb19maWxlbmFtZShjb2RlLCBzb3VyY2VfcGF0aCkKICAgICAgICAgcmV0dXJuIGNvZGUKQEAgLTYwMyw3ICs1OTcsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmVnaXN0cnlfa2V5ID0gY2xzLlJFR0lTVFJZX0tFWQogICAgICAgICBrZXkgPSByZWdpc3RyeV9rZXkuZm9ybWF0KGZ1bGxuYW1lPWZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPXN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj0nJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggY2xzLl9vcGVuX3JlZ2lzdHJ5KGtleSkgYXMgaGtleToKICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IF93aW5yZWcuUXVlcnlWYWx1ZShoa2V5LCAnJykKQEAgLTY2Niw2ICs2NjAsNyBAQAogICAgICAgICBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoZXhlYywgY29kZSwgbW9kdWxlLl9fZGljdF9fKQogCiAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgIiIiVGhpcyBtb2R1bGUgaXMgZGVwcmVjYXRlZC4iIiIKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtNzU5LDIxICs3NTQsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRU9GRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30gbWF0Y2hlcyB7fScsIGJ5dGVjb2RlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9IG1hdGNoZXMge30nLCBieXRlY29kZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlX2J5dGVjb2RlKGJ5dGVzX2RhdGEsIG5hbWU9ZnVsbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVfcGF0aD1ieXRlY29kZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoPXNvdXJjZV9wYXRoKQogICAgICAgICBzb3VyY2VfYnl0ZXMgPSBzZWxmLmdldF9kYXRhKHNvdXJjZV9wYXRoKQogICAgICAgICBjb2RlX29iamVjdCA9IHNlbGYuc291cmNlX3RvX2NvZGUoc291cmNlX2J5dGVzLCBzb3VyY2VfcGF0aCkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7fScsIHNvdXJjZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20ge30nLCBzb3VyY2VfcGF0aCkKICAgICAgICAgaWYgKG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSBhbmQgYnl0ZWNvZGVfcGF0aCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBzb3VyY2VfbXRpbWUgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgZGF0YSA9IF9jb2RlX3RvX2J5dGVjb2RlKGNvZGVfb2JqZWN0LCBzb3VyY2VfbXRpbWUsCiAgICAgICAgICAgICAgICAgICAgIGxlbihzb3VyY2VfYnl0ZXMpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2J5dGVjb2RlKHNvdXJjZV9wYXRoLCBieXRlY29kZV9wYXRoLCBkYXRhKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3dyb3RlIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnd3JvdGUgeyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHJldHVybiBjb2RlX29iamVjdApAQCAtODUzLDE0ICs4NDgsMTYgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGVybWlzc2lvbiBlcnJvciwgcmVhZC1vbmx5IGZpbGVzeXN0ZW06IGp1c3QgZm9yZ2V0CiAgICAgICAgICAgICAgICAgIyBhYm91dCB3cml0aW5nIHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhcmVudCwgZXhjKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBleGMpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF93cml0ZV9hdG9taWMocGF0aCwgZGF0YSwgX21vZGUpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAjIFNhbWUgYXMgYWJvdmU6IGp1c3QgZG9uJ3Qgd3JpdGUgdGhlIGJ5dGVjb2RlLgotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGF0aCwgZXhjKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YykKIAogCiBjbGFzcyBTb3VyY2VsZXNzRmlsZUxvYWRlcihGaWxlTG9hZGVyLCBfTG9hZGVyQmFzaWNzKToKQEAgLTkwNSwxNCArOTAyLDE0IEBACiAgICAgICAgICIiIkNyZWF0ZSBhbiB1bml0aWFsaXplZCBleHRlbnNpb24gbW9kdWxlIiIiCiAgICAgICAgIG1vZHVsZSA9IF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZCgKICAgICAgICAgICAgIF9pbXAuY3JlYXRlX2R5bmFtaWMsIHNwZWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBsb2FkZWQgZnJvbSB7IXJ9JywKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gbG9hZGVkIGZyb20geyFyfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5uYW1lLCBzZWxmLnBhdGgpCiAgICAgICAgIHJldHVybiBtb2R1bGUKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuIGV4dGVuc2lvbiBtb2R1bGUiIiIKICAgICAgICAgX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKF9pbXAuZXhlY19keW5hbWljLCBtb2R1bGUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5wYXRoKQogCiAgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgpAQCAtOTc4LDYgKzk3NSw5IEBACiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBwYXRoKToKKyAgICAgICAgc2VsZi5fcGF0aFtpbmRleF0gPSBwYXRoCisKICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCkBAIC0xMDI3LDcgKzEwMjcsOCBAQAogCiAgICAgICAgICIiIgogICAgICAgICAjIFRoZSBpbXBvcnQgc3lzdGVtIG5ldmVyIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCduYW1lc3BhY2UgbW9kdWxlIGxvYWRlZCB3aXRoIHBhdGggeyFyfScsIHNlbGYuX3BhdGgpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnbmFtZXNwYWNlIG1vZHVsZSBsb2FkZWQgd2l0aCBwYXRoIHshcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGF0aCkKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtMTI0NywxMiArMTI0OCwxMyBAQAogICAgICAgICAjIENoZWNrIGZvciBhIGZpbGUgdy8gYSBwcm9wZXIgc3VmZml4IGV4aXN0cy4KICAgICAgICAgZm9yIHN1ZmZpeCwgbG9hZGVyX2NsYXNzIGluIHNlbGYuX2xvYWRlcnM6CiAgICAgICAgICAgICBmdWxsX3BhdGggPSBfcGF0aF9qb2luKHNlbGYucGF0aCwgdGFpbF9tb2R1bGUgKyBzdWZmaXgpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd0cnlpbmcge30nLmZvcm1hdChmdWxsX3BhdGgpLCB2ZXJib3NpdHk9MikKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgndHJ5aW5nIHt9JywgZnVsbF9wYXRoLCB2ZXJib3NpdHk9MikKICAgICAgICAgICAgIGlmIGNhY2hlX21vZHVsZSArIHN1ZmZpeCBpbiBjYWNoZToKICAgICAgICAgICAgICAgICBpZiBfcGF0aF9pc2ZpbGUoZnVsbF9wYXRoKToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zcGVjKGxvYWRlcl9jbGFzcywgZnVsbG5hbWUsIGZ1bGxfcGF0aCwgTm9uZSwgdGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3NwZWMobG9hZGVyX2NsYXNzLCBmdWxsbmFtZSwgZnVsbF9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgdGFyZ2V0KQogICAgICAgICBpZiBpc19uYW1lc3BhY2U6Ci0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdwb3NzaWJsZSBuYW1lc3BhY2UgZm9yIHt9Jy5mb3JtYXQoYmFzZV9wYXRoKSkKKyAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgncG9zc2libGUgbmFtZXNwYWNlIGZvciB7fScsIGJhc2VfcGF0aCkKICAgICAgICAgICAgIHNwZWMgPSBfYm9vdHN0cmFwLk1vZHVsZVNwZWMoZnVsbG5hbWUsIE5vbmUpCiAgICAgICAgICAgICBzcGVjLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW2Jhc2VfcGF0aF0KICAgICAgICAgICAgIHJldHVybiBzcGVjCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL3V0aWwucHkgYi9MaWIvaW1wb3J0bGliL3V0aWwucHkKaW5kZXggZTFmYTA3YS4uNmJkZjBkNCAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi91dGlsLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvdXRpbC5weQpAQCAtMjIsOCArMjIsOCBAQAogICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy4nKToKICAgICAgICAgcmV0dXJuIG5hbWUKICAgICBlbGlmIG5vdCBwYWNrYWdlOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd7IXJ9IGlzIG5vdCBhIHJlbGF0aXZlIG5hbWUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICcobm8gbGVhZGluZyBkb3QpJy5mb3JtYXQobmFtZSkpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZidubyBwYWNrYWdlIHNwZWNpZmllZCBmb3Ige3JlcHIobmFtZSl9ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnKHJlcXVpcmVkIGZvciByZWxhdGl2ZSBtb2R1bGUgbmFtZXMpJykKICAgICBsZXZlbCA9IDAKICAgICBmb3IgY2hhcmFjdGVyIGluIG5hbWU6CiAgICAgICAgIGlmIGNoYXJhY3RlciAhPSAnLic6CkBAIC0yMDQsMTEgKzIwNCw2IEBACiAgICAgcmV0dXJuIG1vZHVsZV9mb3JfbG9hZGVyX3dyYXBwZXIKIAogCi1jbGFzcyBfTW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgotCi0gICAgIiIiQSBzdWJjbGFzcyBvZiB0aGUgbW9kdWxlIHR5cGUgdG8gYWxsb3cgX19jbGFzc19fIG1hbmlwdWxhdGlvbi4iIiIKLQotCiBjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKIAogICAgICIiIkEgc3ViY2xhc3Mgb2YgdGhlIG1vZHVsZSB0eXBlIHdoaWNoIHRyaWdnZXJzIGxvYWRpbmcgdXBvbiBhdHRyaWJ1dGUgYWNjZXNzLiIiIgpAQCAtMjE4LDEzICsyMTMsMTQgQEAKICAgICAgICAgIyBBbGwgbW9kdWxlIG1ldGFkYXRhIG11c3QgYmUgZ2FybmVyZWQgZnJvbSBfX3NwZWNfXyBpbiBvcmRlciB0byBhdm9pZAogICAgICAgICAjIHVzaW5nIG11dGF0ZWQgdmFsdWVzLgogICAgICAgICAjIFN0b3AgdHJpZ2dlcmluZyB0aGlzIG1ldGhvZC4KLSAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBfTW9kdWxlCisgICAgICAgIHNlbGYuX19jbGFzc19fID0gdHlwZXMuTW9kdWxlVHlwZQogICAgICAgICAjIEdldCB0aGUgb3JpZ2luYWwgbmFtZSB0byBtYWtlIHN1cmUgbm8gb2JqZWN0IHN1YnN0aXR1dGlvbiBvY2N1cnJlZAogICAgICAgICAjIGluIHN5cy5tb2R1bGVzLgogICAgICAgICBvcmlnaW5hbF9uYW1lID0gc2VsZi5fX3NwZWNfXy5uYW1lCiAgICAgICAgICMgRmlndXJlIG91dCBleGFjdGx5IHdoYXQgYXR0cmlidXRlcyB3ZXJlIG11dGF0ZWQgYmV0d2VlbiB0aGUgY3JlYXRpb24KICAgICAgICAgIyBvZiB0aGUgbW9kdWxlIGFuZCBub3cuCi0gICAgICAgIGF0dHJzX3RoZW4gPSBzZWxmLl9fc3BlY19fLmxvYWRlcl9zdGF0ZQorICAgICAgICBhdHRyc190aGVuID0gc2VsZi5fX3NwZWNfXy5sb2FkZXJfc3RhdGVbJ19fZGljdF9fJ10KKyAgICAgICAgb3JpZ2luYWxfdHlwZSA9IHNlbGYuX19zcGVjX18ubG9hZGVyX3N0YXRlWydfX2NsYXNzX18nXQogICAgICAgICBhdHRyc19ub3cgPSBzZWxmLl9fZGljdF9fCiAgICAgICAgIGF0dHJzX3VwZGF0ZWQgPSB7fQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyc19ub3cuaXRlbXMoKToKQEAgLTIzOSw5ICsyMzUsOSBAQAogICAgICAgICAjIG9iamVjdCB3YXMgcHV0IGludG8gc3lzLm1vZHVsZXMuCiAgICAgICAgIGlmIG9yaWdpbmFsX25hbWUgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgICBpZiBpZChzZWxmKSAhPSBpZChzeXMubW9kdWxlc1tvcmlnaW5hbF9uYW1lXSk6Ci0gICAgICAgICAgICAgICAgbXNnID0gKCdtb2R1bGUgb2JqZWN0IGZvciB7IXJ9IHN1YnN0aXR1dGVkIGluIHN5cy5tb2R1bGVzICcKLSAgICAgICAgICAgICAgICAgICAgICAgJ2R1cmluZyBhIGxhenkgbG9hZCcpCi0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cuZm9ybWF0KG9yaWdpbmFsX25hbWUpKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZiJtb2R1bGUgb2JqZWN0IGZvciB7b3JpZ2luYWxfbmFtZSFyfSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0aXR1dGVkIGluIHN5cy5tb2R1bGVzIGR1cmluZyBhIGxhenkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2FkIikKICAgICAgICAgIyBVcGRhdGUgYWZ0ZXIgbG9hZGluZyBzaW5jZSB0aGF0J3Mgd2hhdCB3b3VsZCBoYXBwZW4gaW4gYW4gZWFnZXIKICAgICAgICAgIyBsb2FkaW5nIHNpdHVhdGlvbi4KICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoYXR0cnNfdXBkYXRlZCkKQEAgLTI3NSw4ICsyNzEsNyBAQAogICAgICAgICBzZWxmLmxvYWRlciA9IGxvYWRlcgogCiAgICAgZGVmIGNyZWF0ZV9tb2R1bGUoc2VsZiwgc3BlYyk6Ci0gICAgICAgICIiIkNyZWF0ZSBhIG1vZHVsZSB3aGljaCBjYW4gaGF2ZSBpdHMgX19jbGFzc19fIG1hbmlwdWxhdGVkLiIiIgotICAgICAgICByZXR1cm4gX01vZHVsZShzcGVjLm5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5jcmVhdGVfbW9kdWxlKHNwZWMpCiAKICAgICBkZWYgZXhlY19tb2R1bGUoc2VsZiwgbW9kdWxlKToKICAgICAgICAgIiIiTWFrZSB0aGUgbW9kdWxlIGxvYWQgbGF6aWx5LiIiIgpAQCAtMjg2LDUgKzI4MSw4IEBACiAgICAgICAgICMgb24gYW4gb2JqZWN0IHdvdWxkIGhhdmUgdHJpZ2dlcmVkIHRoZSBsb2FkLAogICAgICAgICAjIGUuZy4gYGBtb2R1bGUuX19zcGVjX18ubG9hZGVyID0gTm9uZWBgIHdvdWxkIHRyaWdnZXIgYSBsb2FkIGZyb20KICAgICAgICAgIyB0cnlpbmcgdG8gYWNjZXNzIG1vZHVsZS5fX3NwZWNfXy4KLSAgICAgICAgbW9kdWxlLl9fc3BlY19fLmxvYWRlcl9zdGF0ZSA9IG1vZHVsZS5fX2RpY3RfXy5jb3B5KCkKKyAgICAgICAgbG9hZGVyX3N0YXRlID0ge30KKyAgICAgICAgbG9hZGVyX3N0YXRlWydfX2RpY3RfXyddID0gbW9kdWxlLl9fZGljdF9fLmNvcHkoKQorICAgICAgICBsb2FkZXJfc3RhdGVbJ19fY2xhc3NfXyddID0gbW9kdWxlLl9fY2xhc3NfXworICAgICAgICBtb2R1bGUuX19zcGVjX18ubG9hZGVyX3N0YXRlID0gbG9hZGVyX3N0YXRlCiAgICAgICAgIG1vZHVsZS5fX2NsYXNzX18gPSBfTGF6eU1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCBlODMwZWI2Li40NWQyMTEwIDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtMTYsNyArMTYsNyBAQAogICAgIGdldG1vZHVsZSgpIC0gZGV0ZXJtaW5lIHRoZSBtb2R1bGUgdGhhdCBhbiBvYmplY3QgY2FtZSBmcm9tCiAgICAgZ2V0Y2xhc3N0cmVlKCkgLSBhcnJhbmdlIGNsYXNzZXMgc28gYXMgdG8gcmVwcmVzZW50IHRoZWlyIGhpZXJhcmNoeQogCi0gICAgZ2V0YXJnc3BlYygpLCBnZXRhcmd2YWx1ZXMoKSwgZ2V0Y2FsbGFyZ3MoKSAtIGdldCBpbmZvIGFib3V0IGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGdldGFyZ3ZhbHVlcygpLCBnZXRjYWxsYXJncygpIC0gZ2V0IGluZm8gYWJvdXQgZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgZ2V0ZnVsbGFyZ3NwZWMoKSAtIHNhbWUsIHdpdGggc3VwcG9ydCBmb3IgUHl0aG9uIDMgZmVhdHVyZXMKICAgICBmb3JtYXRhcmdzcGVjKCksIGZvcm1hdGFyZ3ZhbHVlcygpIC0gZm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMKICAgICBnZXRvdXRlcmZyYW1lcygpLCBnZXRpbm5lcmZyYW1lcygpIC0gZ2V0IGluZm8gYWJvdXQgZnJhbWVzCkBAIC02MjQsMjMgKzYyNCw2IEBACiAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgJwogICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24sIHRyYWNlYmFjaywgZnJhbWUsIG9yIGNvZGUgb2JqZWN0Jy5mb3JtYXQob2JqZWN0KSkKIAotTW9kdWxlSW5mbyA9IG5hbWVkdHVwbGUoJ01vZHVsZUluZm8nLCAnbmFtZSBzdWZmaXggbW9kZSBtb2R1bGVfdHlwZScpCi0KLWRlZiBnZXRtb2R1bGVpbmZvKHBhdGgpOgotICAgICIiIkdldCB0aGUgbW9kdWxlIG5hbWUsIHN1ZmZpeCwgbW9kZSwgYW5kIG1vZHVsZSB0eXBlIGZvciBhIGdpdmVuIGZpbGUuIiIiCi0gICAgd2FybmluZ3Mud2FybignaW5zcGVjdC5nZXRtb2R1bGVpbmZvKCkgaXMgZGVwcmVjYXRlZCcsIERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgIDIpCi0gICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgIGltcG9ydCBpbXAKLSAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLSAgICBzdWZmaXhlcyA9IFsoLWxlbihzdWZmaXgpLCBzdWZmaXgsIG1vZGUsIG10eXBlKQotICAgICAgICAgICAgICAgICAgICBmb3Igc3VmZml4LCBtb2RlLCBtdHlwZSBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCldCi0gICAgc3VmZml4ZXMuc29ydCgpICMgdHJ5IGxvbmdlc3Qgc3VmZml4ZXMgZmlyc3QsIGluIGNhc2UgdGhleSBvdmVybGFwCi0gICAgZm9yIG5lZ2xlbiwgc3VmZml4LCBtb2RlLCBtdHlwZSBpbiBzdWZmaXhlczoKLSAgICAgICAgaWYgZmlsZW5hbWVbbmVnbGVuOl0gPT0gc3VmZml4OgotICAgICAgICAgICAgcmV0dXJuIE1vZHVsZUluZm8oZmlsZW5hbWVbOm5lZ2xlbl0sIHN1ZmZpeCwgbW9kZSwgbXR5cGUpCi0KIGRlZiBnZXRtb2R1bGVuYW1lKHBhdGgpOgogICAgICIiIlJldHVybiB0aGUgbW9kdWxlIG5hbWUgZm9yIGEgZ2l2ZW4gZmlsZSwgb3IgTm9uZS4iIiIKICAgICBmbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKQEAgLTEwNjEsOCArMTA0NCw2IEBACiAgICAgJ2t3b25seWRlZmF1bHRzJyBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBuYW1lcyBmcm9tIGt3b25seWFyZ3MgdG8gZGVmYXVsdHMuCiAgICAgJ2Fubm90YXRpb25zJyBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBhcmd1bWVudCBuYW1lcyB0byBhbm5vdGF0aW9ucy4KIAotICAgIFRoZSBmaXJzdCBmb3VyIGl0ZW1zIGluIHRoZSB0dXBsZSBjb3JyZXNwb25kIHRvIGdldGFyZ3NwZWMoKS4KLQogICAgIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCwgdXNlIGluc3BlY3Quc2lnbmF0dXJlKCkgaW5zdGVhZC4KICAgICAiIiIKIApAQCAtMTE3Myw4ICsxMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgIGZvcm1hdHZhbHVlPWxhbWJkYSB2YWx1ZTogJz0nICsgcmVwcih2YWx1ZSksCiAgICAgICAgICAgICAgICAgICBmb3JtYXRyZXR1cm5zPWxhbWJkYSB0ZXh0OiAnIC0+ICcgKyB0ZXh0LAogICAgICAgICAgICAgICAgICAgZm9ybWF0YW5ub3RhdGlvbj1mb3JtYXRhbm5vdGF0aW9uKToKLSAgICAiIiJGb3JtYXQgYW4gYXJndW1lbnQgc3BlYyBmcm9tIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0YXJnc3BlYwotICAgIG9yIGdldGZ1bGxhcmdzcGVjLgorICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXRmdWxsYXJnc3BlYy4KIAogICAgIFRoZSBmaXJzdCBzZXZlbiBhcmd1bWVudHMgYXJlIChhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsCiAgICAga3dvbmx5YXJncywga3dvbmx5ZGVmYXVsdHMsIGFubm90YXRpb25zKS4gIFRoZSBvdGhlciBmaXZlIGFyZ3VtZW50cwpAQCAtMjQxNiw2ICsyMzk2LDIwIEBACiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsIHN0cik6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIm5hbWUgbXVzdCBiZSBhIHN0ciwgbm90IGEgeyFyfSIuZm9ybWF0KG5hbWUpKQogCisgICAgICAgIGlmIG5hbWVbMF0gPT0gJy4nIGFuZCBuYW1lWzE6XS5pc2RpZ2l0KCk6CisgICAgICAgICAgICAjIFRoZXNlIGFyZSBpbXBsaWNpdCBhcmd1bWVudHMgZ2VuZXJhdGVkIGJ5IGNvbXByZWhlbnNpb25zLiBJbgorICAgICAgICAgICAgIyBvcmRlciB0byBwcm92aWRlIGEgZnJpZW5kbGllciBpbnRlcmZhY2UgdG8gdXNlcnMsIHdlIHJlY2FzdAorICAgICAgICAgICAgIyB0aGVpciBuYW1lIGFzICJpbXBsaWNpdE4iIGFuZCB0cmVhdCB0aGVtIGFzIHBvc2l0aW9uYWwtb25seS4KKyAgICAgICAgICAgICMgU2VlIGlzc3VlIDE5NjExLgorICAgICAgICAgICAgaWYga2luZCAhPSBfUE9TSVRJT05BTF9PUl9LRVlXT1JEOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICdpbXBsaWNpdCBhcmd1bWVudHMgbXVzdCBiZSBwYXNzZWQgaW4gYXMge30nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QT1NJVElPTkFMX09SX0tFWVdPUkQKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuX2tpbmQgPSBfUE9TSVRJT05BTF9PTkxZCisgICAgICAgICAgICBuYW1lID0gJ2ltcGxpY2l0e30nLmZvcm1hdChuYW1lWzE6XSkKKwogICAgICAgICBpZiBub3QgbmFtZS5pc2lkZW50aWZpZXIoKToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3shcn0gaXMgbm90IGEgdmFsaWQgcGFyYW1ldGVyIG5hbWUnLmZvcm1hdChuYW1lKSkKIApkaWZmIC0tZ2l0IGEvTGliL2lwYWRkcmVzcy5weSBiL0xpYi9pcGFkZHJlc3MucHkKaW5kZXggMWY5MDA1OC4uMjBmMzNjYiAxMDA2NDQKLS0tIGEvTGliL2lwYWRkcmVzcy5weQorKysgYi9MaWIvaXBhZGRyZXNzLnB5CkBAIC02MzYsMTIgKzYzNiwxMiBAQAogICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICAgaWYgbiA+PSAwOgogICAgICAgICAgICAgaWYgbmV0d29yayArIG4gPiBicm9hZGNhc3Q6Ci0gICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoJ2FkZHJlc3Mgb3V0IG9mIHJhbmdlJykKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRyZXNzX2NsYXNzKG5ldHdvcmsgKyBuKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbiArPSAxCiAgICAgICAgICAgICBpZiBicm9hZGNhc3QgKyBuIDwgbmV0d29yazoKLSAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MoYnJvYWRjYXN0ICsgbikKIAogICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgpkaWZmIC0tZ2l0IGEvTGliL2pzb24vX19pbml0X18ucHkgYi9MaWIvanNvbi9fX2luaXRfXy5weQppbmRleCBmNzJiMDU4Li5mMmMwZDIzIDEwMDY0NAotLS0gYS9MaWIvanNvbi9fX2luaXRfXy5weQorKysgYi9MaWIvanNvbi9fX2luaXRfXy5weQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgZGVmYXVsdD1Ob25lLAogKQogCi1kZWYgZHVtcChvYmosIGZwLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsCitkZWYgZHVtcChvYmosIGZwLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsCiAgICAgICAgIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwKICAgICAgICAgZGVmYXVsdD1Ob25lLCBzb3J0X2tleXM9RmFsc2UsICoqa3cpOgogICAgICIiIlNlcmlhbGl6ZSBgYG9iamBgIGFzIGEgSlNPTiBmb3JtYXR0ZWQgc3RyZWFtIHRvIGBgZnBgYCAoYQpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICAgIGZwLndyaXRlKGNodW5rKQogCiAKLWRlZiBkdW1wcyhvYmosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKK2RlZiBkdW1wcyhvYmosICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKICAgICAgICAgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLAogICAgICAgICBkZWZhdWx0PU5vbmUsIHNvcnRfa2V5cz1GYWxzZSwgKiprdyk6CiAgICAgIiIiU2VyaWFsaXplIGBgb2JqYGAgdG8gYSBKU09OIGZvcm1hdHRlZCBgYHN0cmBgLgpAQCAtMjQwLDcgKzI0MCw3IEBACiBfZGVmYXVsdF9kZWNvZGVyID0gSlNPTkRlY29kZXIob2JqZWN0X2hvb2s9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSkKIAogCi1kZWYgbG9hZChmcCwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCitkZWYgbG9hZChmcCwgKiwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCiAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KToKICAgICAiIiJEZXNlcmlhbGl6ZSBgYGZwYGAgKGEgYGAucmVhZCgpYGAtc3VwcG9ydGluZyBmaWxlLWxpa2Ugb2JqZWN0IGNvbnRhaW5pbmcKICAgICBhIEpTT04gZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KQEAgLTI2OCw3ICsyNjgsNyBAQAogICAgICAgICBwYXJzZV9jb25zdGFudD1wYXJzZV9jb25zdGFudCwgb2JqZWN0X3BhaXJzX2hvb2s9b2JqZWN0X3BhaXJzX2hvb2ssICoqa3cpCiAKIAotZGVmIGxvYWRzKHMsIGVuY29kaW5nPU5vbmUsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorZGVmIGxvYWRzKHMsICosIGVuY29kaW5nPU5vbmUsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAogICAgICAgICBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdyk6CiAgICAgIiIiRGVzZXJpYWxpemUgYGBzYGAgKGEgYGBzdHJgYCBpbnN0YW5jZSBjb250YWluaW5nIGEgSlNPTgogICAgIGRvY3VtZW50KSB0byBhIFB5dGhvbiBvYmplY3QuCmRpZmYgLS1naXQgYS9MaWIvanNvbi9kZWNvZGVyLnB5IGIvTGliL2pzb24vZGVjb2Rlci5weQppbmRleCAwZjAzZjIwLi4yNDIyYzZhIDEwMDY0NAotLS0gYS9MaWIvanNvbi9kZWNvZGVyLnB5CisrKyBiL0xpYi9qc29uL2RlY29kZXIucHkKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAgICAgIiIiCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKICAgICAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBzdHJpY3Q9VHJ1ZSwKICAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rPU5vbmUpOgogICAgICAgICAiIiJgYG9iamVjdF9ob29rYGAsIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0CmRpZmYgLS1naXQgYS9MaWIvanNvbi9lbmNvZGVyLnB5IGIvTGliL2pzb24vZW5jb2Rlci5weQppbmRleCBkNTk2NDg5Li40MWE0OTdjIDEwMDY0NAotLS0gYS9MaWIvanNvbi9lbmNvZGVyLnB5CisrKyBiL0xpYi9qc29uL2VuY29kZXIucHkKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICIiIgogICAgIGl0ZW1fc2VwYXJhdG9yID0gJywgJwogICAgIGtleV9zZXBhcmF0b3IgPSAnOiAnCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLAogICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIHNvcnRfa2V5cz1GYWxzZSwKICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdG9yIGZvciBKU09ORW5jb2Rlciwgd2l0aCBzZW5zaWJsZSBkZWZhdWx0cy4KQEAgLTE3Niw3ICsxNzYsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBKU09ORW5jb2Rlci5kZWZhdWx0KHNlbGYsIG8pCiAKICAgICAgICAgIiIiCi0gICAgICAgIHJhaXNlIFR5cGVFcnJvcihyZXByKG8pICsgIiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk9iamVjdCBvZiB0eXBlICclcycgaXMgbm90IEpTT04gc2VyaWFsaXphYmxlIiAlCisgICAgICAgICAgICAgICAgICAgICAgICBvLl9fY2xhc3NfXy5fX25hbWVfXykKIAogICAgIGRlZiBlbmNvZGUoc2VsZiwgbyk6CiAgICAgICAgICIiIlJldHVybiBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIGRhdGEgc3RydWN0dXJlLgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weSBiL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKaW5kZXggNDQ1MDJiZi4uYmFiZTZjYiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CkBAIC0xLDggKzEsNiBAQAogIiIiVXRpbGl0eSBmdW5jdGlvbnMsIG5vZGUgY29uc3RydWN0aW9uIG1hY3JvcywgZXRjLiIiIgogIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKIAotZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZQotCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAucHl0cmVlIGltcG9ydCBMZWFmLCBOb2RlCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZGljdC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5CmluZGV4IDk2M2Y5NTIuLmQzNjU1YzkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5CkBAIC0zMCw5ICszMCw4IEBACiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IHB5dHJlZQogZnJvbSAuLiBpbXBvcnQgcGF0Y29tcAotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQotZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExQYXJlbiwgUlBhcmVuLCBBcmdMaXN0LCBEb3QKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBEb3QKIGZyb20gLi4gaW1wb3J0IGZpeGVyX3V0aWwKIAogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CmluZGV4IDJjOWI3MmQuLmFiOTIxZWUgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CkBAIC0xMCw3ICsxMCw2IEBACiAiIiIKIAogIyBMb2NhbCBpbXBvcnRzCi1mcm9tIC4uIGltcG9ydCBweXRyZWUKIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBDb21tYSwgTmFtZSwgQ2FsbAogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQppbmRleCAzOTE4ODlmLi5iYjY3MThjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKQEAgLTE0LDcgKzE0LDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBMaXN0Q29tcCwgaW5fc3BlY2lhbF9jb250ZXh0CiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKaW5kZXggMThjNTYwZi4uNDM5NzA4YyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKQEAgLTMxLDcgKzMxLDYgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIC4uIGltcG9ydCBweXRyZWUKLWZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBwYXJlbnRoZXNpemUKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKaW5kZXggNDZjN2FhZi4uOGUzNDQ2MyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CkBAIC0yMCw3ICsyMCw3IEBACiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5weWdyYW0gaW1wb3J0IHRva2VuCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgc3ltcywgTm9kZSwgTGVhZgorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IHN5bXMsIE5vZGUsIExlYWYKIAogCiBkZWYgaGFzX21ldGFjbGFzcyhwYXJlbnQpOgpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weQppbmRleCBhZDkxYTI5Li5jMjI5NTk2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weQpAQCAtMyw3ICszLDcgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgc3ltcworZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKIAogY2xhc3MgRml4Tm9uemVybyhmaXhlcl9iYXNlLkJhc2VGaXgpOgogICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKaW5kZXggYTFmZTJmNS4uODc4MDMyMiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQpAQCAtMTgsNyArMTgsNyBAQAogZnJvbSAuLiBpbXBvcnQgcHl0cmVlCiBmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgQ29tbWEsIFN0cmluZywgaXNfdHVwbGUKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBDb21tYSwgU3RyaW5nCiAKIAogcGFyZW5kX2V4cHIgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybigKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQppbmRleCBkYjM0MTA0Li42N2JmNTFmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CkBAIC0yMCw3ICsyMCw2IEBACiAiIiIKIAogIyBMb2NhbCBpbXBvcnRzCi1mcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCiBmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQogCkBAIC00Miw3ICs0MSw3IEBACiAgICAgICAgICdOb3RJbXBsZW1lbnRlZFR5cGUnIDogJ3R5cGUoTm90SW1wbGVtZW50ZWQpJywKICAgICAgICAgJ1NsaWNlVHlwZScgOiAnc2xpY2UnLAogICAgICAgICAnU3RyaW5nVHlwZSc6ICdieXRlcycsICMgWFhYID8KLSAgICAgICAgJ1N0cmluZ1R5cGVzJyA6ICdzdHInLCAjIFhYWCA/CisgICAgICAgICdTdHJpbmdUeXBlcycgOiAnKHN0ciwpJywgIyBYWFggPwogICAgICAgICAnVHVwbGVUeXBlJzogJ3R1cGxlJywKICAgICAgICAgJ1R5cGVUeXBlJyA6ICd0eXBlJywKICAgICAgICAgJ1VuaWNvZGVUeXBlJzogJ3N0cicsCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQppbmRleCAxNDgxY2Q5Li41YTM2MDQ5IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKQEAgLTYsNyArNiw2IEBACiAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSBsaWIydG8zLmZpeGVzLmZpeF9pbXBvcnRzIGltcG9ydCBhbHRlcm5hdGVzLCBGaXhJbXBvcnRzCi1mcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCAoTmFtZSwgQ29tbWEsIEZyb21JbXBvcnQsIE5ld2xpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfaW5kZW50YXRpb24sIE5vZGUsIHN5bXMpCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKaW5kZXggMDcyODA4My4uYjYwYjlkZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKKysrIGIvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkKQEAgLTI2LDcgKzI2LDYgQEAKIGZyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIHRva2VuaXplLCB0b2tlbgogZnJvbSAuZml4ZXJfdXRpbCBpbXBvcnQgZmluZF9yb290CiBmcm9tIC4gaW1wb3J0IHB5dHJlZSwgcHlncmFtCi1mcm9tIC4gaW1wb3J0IGJ0bV91dGlscyBhcyBidQogZnJvbSAuIGltcG9ydCBidG1fbWF0Y2hlciBhcyBibQogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weSBiL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weQppbmRleCBjMGJmN2YyLi5jZjMxYTU0IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICAgICAgZGVmIGYoeCkgLT4gbGlzdDogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeydyZXR1cm4nOiBsaXN0fSkKIAotICAgICAgICAjIHRlc3QgTUFLRV9DTE9TVVJFIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJnJ3MKKyAgICAgICAgIyB0ZXN0IGNsb3N1cmVzIHdpdGggYSB2YXJpZXR5IG9mIG9wYXJnJ3MKICAgICAgICAgY2xvc3VyZSA9IDEKICAgICAgICAgZGVmIGYoKTogcmV0dXJuIGNsb3N1cmUKICAgICAgICAgZGVmIGYoeD0xKTogcmV0dXJuIGNsb3N1cmUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkgYi9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CmluZGV4IDZmMmQyMTQuLjcxNTNiYjYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQpAQCAtMywxMCArMyw4IEBACiAKICMgUHl0aG9uIGltcG9ydHMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHJlCiBmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKIAogIyBMb2NhbCBpbXBvcnRzCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKaW5kZXggMTUwNzlmZS4uYzA1MDdjZiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpAQCAtMTAsNyArMTAsNiBAQAogaW1wb3J0IHRlc3Quc3VwcG9ydAogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgcmVmYWN0b3IKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKaW5kZXggMDZiMDAzMy4uYjk3YjczYSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKQEAgLTIsMTIgKzIsMTEgQEAKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCi1pbXBvcnQgdW5pdHRlc3QKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgogZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgcHlncmFtLCBweXRyZWUsIHJlZmFjdG9yLCBmaXhlcl91dGlsCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5Z3JhbSwgZml4ZXJfdXRpbAogZnJvbSBsaWIydG8zLnRlc3RzIGltcG9ydCBzdXBwb3J0CiAKIApAQCAtMzMyMiw2ICszMzIxLDEwIEBACiAgICAgICAgIGEgPSAiIiJ0eXBlKE5vbmUpIiIiCiAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKIAorICAgICAgICBiID0gInR5cGVzLlN0cmluZ1R5cGVzIgorICAgICAgICBhID0gIihzdHIsKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCiBjbGFzcyBUZXN0X2lkaW9tcyhGaXhlclRlc3RDYXNlKToKICAgICBmaXhlciA9ICJpZGlvbXMiCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKaW5kZXggYjUzM2MwMS4uMzZlYjE3NiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKQEAgLTEwLDEyICsxMCwxMSBAQAogCiAjIFRlc3RpbmcgaW1wb3J0cwogZnJvbSAuIGltcG9ydCBzdXBwb3J0Ci1mcm9tIC5zdXBwb3J0IGltcG9ydCBkcml2ZXIsIHRlc3RfZGlyCitmcm9tIC5zdXBwb3J0IGltcG9ydCBkcml2ZXIKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB2ZXJib3NlCiAKICMgUHl0aG9uIGltcG9ydHMKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBzdWJwcm9jZXNzCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CmluZGV4IDRkNTg1YTguLmE2MTFkMTcgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CkBAIC0xMSw5ICsxMSw2IEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKIAotaW1wb3J0IHN5cwotaW1wb3J0IHdhcm5pbmdzCi0KICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKaW5kZXggODU2MzAwMS4uOTRkYzEzNSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CkBAIC03LDE5ICs3LDE1IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBjb2RlY3MKLWltcG9ydCBvcGVyYXRvcgogaW1wb3J0IGlvCiBpbXBvcnQgcmUKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHNodXRpbAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogZnJvbSBsaWIydG8zIGltcG9ydCByZWZhY3RvciwgcHlncmFtLCBmaXhlcl9iYXNlCiBmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IHRva2VuCiAKLWZyb20gLiBpbXBvcnQgc3VwcG9ydAotCiAKIFRFU1RfREFUQV9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImRhdGEiKQogRklYRVJfRElSID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJmaXhlcnMiKQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CmluZGV4IGQyYmU4MmMuLmM2YzYxMzkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKQEAgLTMsOSArMyw2IEBACiAjIFRlc3RpbmcgaW1wb3J0cwogZnJvbSAuIGltcG9ydCBzdXBwb3J0CiAKLSMgUHl0aG9uIGltcG9ydHMKLWltcG9ydCBvcy5wYXRoCi0KICMgTG9jYWwgaW1wb3J0cwogZnJvbSBsaWIydG8zLnB5dHJlZSBpbXBvcnQgTm9kZSwgTGVhZgogZnJvbSBsaWIydG8zIGltcG9ydCBmaXhlcl91dGlsCmRpZmYgLS1naXQgYS9MaWIvbG9jYWxlLnB5IGIvTGliL2xvY2FsZS5weQppbmRleCA2ZDU5Y2Q4Li40ZGUwMDkwIDEwMDY0NAotLS0gYS9MaWIvbG9jYWxlLnB5CisrKyBiL0xpYi9sb2NhbGUucHkKQEAgLTMwMiwxMiArMzAyLDE2IEBACiAKIGRlZiBkZWxvY2FsaXplKHN0cmluZyk6CiAgICAgIlBhcnNlcyBhIHN0cmluZyBhcyBhIG5vcm1hbGl6ZWQgbnVtYmVyIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIHNldHRpbmdzLiIKKworICAgIGNvbnYgPSBsb2NhbGVjb252KCkKKwogICAgICNGaXJzdCwgZ2V0IHJpZCBvZiB0aGUgZ3JvdXBpbmcKLSAgICB0cyA9IGxvY2FsZWNvbnYoKVsndGhvdXNhbmRzX3NlcCddCisgICAgdHMgPSBjb252Wyd0aG91c2FuZHNfc2VwJ10KICAgICBpZiB0czoKICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UodHMsICcnKQorCiAgICAgI25leHQsIHJlcGxhY2UgdGhlIGRlY2ltYWwgcG9pbnQgd2l0aCBhIGRvdAotICAgIGRkID0gbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10KKyAgICBkZCA9IGNvbnZbJ2RlY2ltYWxfcG9pbnQnXQogICAgIGlmIGRkOgogICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShkZCwgJy4nKQogICAgIHJldHVybiBzdHJpbmcKZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5IGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKaW5kZXggYTdiZDg5MC4uZjk0MWY0OCAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKKysrIGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKQEAgLTMzLDggKzMzLDkgQEAKICAgICAgICAgICAgJ1N0cmVhbUhhbmRsZXInLCAnV0FSTicsICdXQVJOSU5HJywgJ2FkZExldmVsTmFtZScsICdiYXNpY0NvbmZpZycsCiAgICAgICAgICAgICdjYXB0dXJlV2FybmluZ3MnLCAnY3JpdGljYWwnLCAnZGVidWcnLCAnZGlzYWJsZScsICdlcnJvcicsCiAgICAgICAgICAgICdleGNlcHRpb24nLCAnZmF0YWwnLCAnZ2V0TGV2ZWxOYW1lJywgJ2dldExvZ2dlcicsICdnZXRMb2dnZXJDbGFzcycsCi0gICAgICAgICAgICdpbmZvJywgJ2xvZycsICdtYWtlTG9nUmVjb3JkJywgJ3NldExvZ2dlckNsYXNzJywgJ3dhcm4nLCAnd2FybmluZycsCi0gICAgICAgICAgICdnZXRMb2dSZWNvcmRGYWN0b3J5JywgJ3NldExvZ1JlY29yZEZhY3RvcnknLCAnbGFzdFJlc29ydCddCisgICAgICAgICAgICdpbmZvJywgJ2xvZycsICdtYWtlTG9nUmVjb3JkJywgJ3NldExvZ2dlckNsYXNzJywgJ3NodXRkb3duJywKKyAgICAgICAgICAgJ3dhcm4nLCAnd2FybmluZycsICdnZXRMb2dSZWNvcmRGYWN0b3J5JywgJ3NldExvZ1JlY29yZEZhY3RvcnknLAorICAgICAgICAgICAnbGFzdFJlc29ydCcsICdyYWlzZUV4Y2VwdGlvbnMnXQogCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCBjOWY4MjE3Li5jMDc0OGE4IDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtNDQwLDExICs0NDAsMTEgQEAKICAgICAgICAgICAgIHNyZXMgPSBvcy5mc3RhdChzZWxmLnN0cmVhbS5maWxlbm8oKSkKICAgICAgICAgICAgIHNlbGYuZGV2LCBzZWxmLmlubyA9IHNyZXNbU1RfREVWXSwgc3Jlc1tTVF9JTk9dCiAKLSAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgIGRlZiByZW9wZW5JZk5lZWRlZChzZWxmKToKICAgICAgICAgIiIiCi0gICAgICAgIEVtaXQgYSByZWNvcmQuCisgICAgICAgIFJlb3BlbiBsb2cgZmlsZSBpZiBuZWVkZWQuCiAKLSAgICAgICAgRmlyc3QgY2hlY2sgaWYgdGhlIHVuZGVybHlpbmcgZmlsZSBoYXMgY2hhbmdlZCwgYW5kIGlmIGl0CisgICAgICAgIENoZWNrcyBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKICAgICAgICAgaGFzLCBjbG9zZSB0aGUgb2xkIHN0cmVhbSBhbmQgcmVvcGVuIHRoZSBmaWxlIHRvIGdldCB0aGUKICAgICAgICAgY3VycmVudCBzdHJlYW0uCiAgICAgICAgICIiIgpAQCAtNDY3LDYgKzQ2NywxNSBAQAogICAgICAgICAgICAgICAgICMgb3BlbiBhIG5ldyBmaWxlIGhhbmRsZSBhbmQgZ2V0IG5ldyBzdGF0IGluZm8gZnJvbSB0aGF0IGZkCiAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0c3RyZWFtKCkKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIElmIHVuZGVybHlpbmcgZmlsZSBoYXMgY2hhbmdlZCwgcmVvcGVuIHRoZSBmaWxlIGJlZm9yZSBlbWl0dGluZyB0aGUKKyAgICAgICAgcmVjb3JkIHRvIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5yZW9wZW5JZk5lZWRlZCgpCiAgICAgICAgIGxvZ2dpbmcuRmlsZUhhbmRsZXIuZW1pdChzZWxmLCByZWNvcmQpCiAKIApkaWZmIC0tZ2l0IGEvTGliL21haWxib3gucHkgYi9MaWIvbWFpbGJveC5weQppbmRleCAwMjcwZTI1Li4wZTIzOTg3IDEwMDY0NAotLS0gYS9MaWIvbWFpbGJveC5weQorKysgYi9MaWIvbWFpbGJveC5weQpAQCAtMjMsOSArMjMsMTAgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBmY250bCA9IE5vbmUKIAotX19hbGxfXyA9IFsgJ01haWxib3gnLCAnTWFpbGRpcicsICdtYm94JywgJ01IJywgJ0JhYnlsJywgJ01NREYnLAotICAgICAgICAgICAgJ01lc3NhZ2UnLCAnTWFpbGRpck1lc3NhZ2UnLCAnbWJveE1lc3NhZ2UnLCAnTUhNZXNzYWdlJywKLSAgICAgICAgICAgICdCYWJ5bE1lc3NhZ2UnLCAnTU1ERk1lc3NhZ2UnXQorX19hbGxfXyA9IFsnTWFpbGJveCcsICdNYWlsZGlyJywgJ21ib3gnLCAnTUgnLCAnQmFieWwnLCAnTU1ERicsCisgICAgICAgICAgICdNZXNzYWdlJywgJ01haWxkaXJNZXNzYWdlJywgJ21ib3hNZXNzYWdlJywgJ01ITWVzc2FnZScsCisgICAgICAgICAgICdCYWJ5bE1lc3NhZ2UnLCAnTU1ERk1lc3NhZ2UnLCAnRXJyb3InLCAnTm9TdWNoTWFpbGJveEVycm9yJywKKyAgICAgICAgICAgJ05vdEVtcHR5RXJyb3InLCAnRXh0ZXJuYWxDbGFzaEVycm9yJywgJ0Zvcm1hdEVycm9yJ10KIAogbGluZXNlcCA9IG9zLmxpbmVzZXAuZW5jb2RlKCdhc2NpaScpCiAKZGlmZiAtLWdpdCBhL0xpYi9taW1ldHlwZXMucHkgYi9MaWIvbWltZXR5cGVzLnB5CmluZGV4IDBiZTc2YWQuLjlhODg2ODAgMTAwNjQ0Ci0tLSBhL0xpYi9taW1ldHlwZXMucHkKKysrIGIvTGliL21pbWV0eXBlcy5weQpAQCAtMzMsOCArMzMsMTAgQEAKICAgICBfd2lucmVnID0gTm9uZQogCiBfX2FsbF9fID0gWwotICAgICJndWVzc190eXBlIiwiZ3Vlc3NfZXh0ZW5zaW9uIiwiZ3Vlc3NfYWxsX2V4dGVuc2lvbnMiLAotICAgICJhZGRfdHlwZSIsInJlYWRfbWltZV90eXBlcyIsImluaXQiCisgICAgImtub3duZmlsZXMiLCAiaW5pdGVkIiwgIk1pbWVUeXBlcyIsCisgICAgImd1ZXNzX3R5cGUiLCAiZ3Vlc3NfYWxsX2V4dGVuc2lvbnMiLCAiZ3Vlc3NfZXh0ZW5zaW9uIiwKKyAgICAiYWRkX3R5cGUiLCAiaW5pdCIsICJyZWFkX21pbWVfdHlwZXMiLAorICAgICJzdWZmaXhfbWFwIiwgImVuY29kaW5nc19tYXAiLCAidHlwZXNfbWFwIiwgImNvbW1vbl90eXBlcyIKIF0KIAoga25vd25maWxlcyA9IFsKZGlmZiAtLWdpdCBhL0xpYi9tb2R1bGVmaW5kZXIucHkgYi9MaWIvbW9kdWxlZmluZGVyLnB5CmluZGV4IDgxMDM1MDIuLmUyMjAzMTUgMTAwNjQ0Ci0tLSBhL0xpYi9tb2R1bGVmaW5kZXIucHkKKysrIGIvTGliL21vZHVsZWZpbmRlci5weQpAQCAtMTAsNyArMTAsNyBAQAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IHdhcm5pbmdzCiB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgIGltcG9ydCBpbXAKIAogTE9BRF9DT05TVCA9IGRpcy5vcG1hcFsnTE9BRF9DT05TVCddCkBAIC0zMzYsOCArMzM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gbmFtZSArICIuIiArIHN1YgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2JhZG1vZHVsZShmdWxsbmFtZSwgY2FsbGVyKQogCi0gICAgZGVmIHNjYW5fb3Bjb2Rlc18yNShzZWxmLCBjbywKLSAgICAgICAgICAgICAgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2spOgorICAgIGRlZiBzY2FuX29wY29kZXMoc2VsZiwgY28pOgogICAgICAgICAjIFNjYW4gdGhlIGNvZGUsIGFuZCB5aWVsZCAnaW50ZXJlc3RpbmcnIG9wY29kZSBjb21iaW5hdGlvbnMKICAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKICAgICAgICAgbmFtZXMgPSBjby5jb19uYW1lcwpAQCAtMzYwLDcgKzM1OSw3IEBACiAKICAgICBkZWYgc2Nhbl9jb2RlKHNlbGYsIGNvLCBtKToKICAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKLSAgICAgICAgc2Nhbm5lciA9IHNlbGYuc2Nhbl9vcGNvZGVzXzI1CisgICAgICAgIHNjYW5uZXIgPSBzZWxmLnNjYW5fb3Bjb2RlcwogICAgICAgICBmb3Igd2hhdCwgYXJncyBpbiBzY2FubmVyKGNvKToKICAgICAgICAgICAgIGlmIHdoYXQgPT0gInN0b3JlIjoKICAgICAgICAgICAgICAgICBuYW1lLCA9IGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CmluZGV4IDZkMGEyOGYuLjgyMzY0NGEgMTAwNjQ0Ci0tLSBhL0xpYi9tc2lsaWIvX19pbml0X18ucHkKKysrIGIvTGliL21zaWxpYi9fX2luaXRfXy5weQpAQCAtMSw3ICsxLDcgQEAKICMgQ29weXJpZ2h0IChDKSAyMDA1IE1hcnRpbiB2LiBMw7Z3aXMKICMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgogZnJvbSBfbXNpIGltcG9ydCAqCi1pbXBvcnQgZ2xvYgoraW1wb3J0IGZubWF0Y2gKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgc3RyaW5nCkBAIC0zNzksNyArMzc5LDEzIEBACiAgICAgZGVmIGdsb2Ioc2VsZiwgcGF0dGVybiwgZXhjbHVkZSA9IE5vbmUpOgogICAgICAgICAiIiJBZGQgYSBsaXN0IG9mIGZpbGVzIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudCBhcyBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgIGdsb2IgcGF0dGVybi4gSW5kaXZpZHVhbCBmaWxlcyBjYW4gYmUgZXhjbHVkZWQgaW4gdGhlIGV4Y2x1ZGUgbGlzdC4iIiIKLSAgICAgICAgZmlsZXMgPSBnbG9iLmdsb2IxKHNlbGYuYWJzb2x1dGUsIHBhdHRlcm4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihzZWxmLmFic29sdXRlKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpZiBwYXR0ZXJuWzoxXSAhPSAnLic6CisgICAgICAgICAgICBmaWxlcyA9IChmIGZvciBmIGluIGZpbGVzIGlmIGZbMF0gIT0gJy4nKQorICAgICAgICBmaWxlcyA9IGZubWF0Y2guZmlsdGVyKGZpbGVzLCBwYXR0ZXJuKQogICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgIGlmIGV4Y2x1ZGUgYW5kIGYgaW4gZXhjbHVkZTogY29udGludWUKICAgICAgICAgICAgIHNlbGYuYWRkX2ZpbGUoZikKZGlmZiAtLWdpdCBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weSBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQppbmRleCA2ZDI1NDY5Li5mZmRmNDI2IDEwMDY0NAotLS0gYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKKysrIGIvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CkBAIC02MzgsMjIgKzYzOCwyNiBAQAogICAgICAgICAgICAgc2VsZi5fbnVtYmVyX2xlZnQgPSBsZW5ndGgvL2NodW5rc2l6ZSArIGJvb2wobGVuZ3RoICUgY2h1bmtzaXplKQogCiAgICAgZGVmIF9zZXQoc2VsZiwgaSwgc3VjY2Vzc19yZXN1bHQpOgorICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCAtPSAxCiAgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHN1Y2Nlc3NfcmVzdWx0Ci0gICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgIGlmIHN1Y2Nlc3MgYW5kIHNlbGYuX3N1Y2Nlc3M6CiAgICAgICAgICAgICBzZWxmLl92YWx1ZVtpKnNlbGYuX2NodW5rc2l6ZTooaSsxKSpzZWxmLl9jaHVua3NpemVdID0gcmVzdWx0Ci0gICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCAtPSAxCiAgICAgICAgICAgICBpZiBzZWxmLl9udW1iZXJfbGVmdCA9PSAwOgogICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgogICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQogICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLl9zdWNjZXNzID0gRmFsc2UKLSAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gcmVzdWx0Ci0gICAgICAgICAgICBpZiBzZWxmLl9lcnJvcl9jYWxsYmFjazoKLSAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKLSAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCi0gICAgICAgICAgICBzZWxmLl9ldmVudC5zZXQoKQorICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3MgYW5kIHNlbGYuX3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgIyBvbmx5IHN0b3JlIGZpcnN0IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuX3N1Y2Nlc3MgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gcmVzdWx0CisgICAgICAgICAgICBpZiBzZWxmLl9udW1iZXJfbGVmdCA9PSAwOgorICAgICAgICAgICAgICAgICMgb25seSBjb25zaWRlciB0aGUgcmVzdWx0IHJlYWR5IG9uY2UgYWxsIGpvYnMgYXJlIGRvbmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9lcnJvcl9jYWxsYmFjazoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3JfY2FsbGJhY2soc2VsZi5fdmFsdWUpCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgICAgICAgICBzZWxmLl9ldmVudC5zZXQoKQogCiAjCiAjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wuaW1hcCgpYApkaWZmIC0tZ2l0IGEvTGliL29wY29kZS5weSBiL0xpYi9vcGNvZGUucHkKaW5kZXggNGM4MjZhNy4uMDY0MDgxOSAxMDA2NDQKLS0tIGEvTGliL29wY29kZS5weQorKysgYi9MaWIvb3Bjb2RlLnB5CkBAIC0zNCw5ICszNCw3IEBACiBoYXNuYXJncyA9IFtdCiAKIG9wbWFwID0ge30KLW9wbmFtZSA9IFsnJ10gKiAyNTYKLWZvciBvcCBpbiByYW5nZSgyNTYpOiBvcG5hbWVbb3BdID0gJzwlcj4nICUgKG9wLCkKLWRlbCBvcAorb3BuYW1lID0gWyc8JXI+JyAlIChvcCwpIGZvciBvcCBpbiByYW5nZSgyNTYpXQogCiBkZWYgZGVmX29wKG5hbWUsIG9wKToKICAgICBvcG5hbWVbb3BdID0gbmFtZQpAQCAtMTc1LDkgKzE3Myw4IEBACiBkZWZfb3AoJ1JBSVNFX1ZBUkFSR1MnLCAxMzApICAgICMgTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiwgb3IgMykKIGRlZl9vcCgnQ0FMTF9GVU5DVElPTicsIDEzMSkgICAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCiBoYXNuYXJncy5hcHBlbmQoMTMxKQotZGVmX29wKCdNQUtFX0ZVTkNUSU9OJywgMTMyKSAgICAjIE51bWJlciBvZiBhcmdzIHdpdGggZGVmYXVsdCB2YWx1ZXMKK2RlZl9vcCgnTUFLRV9GVU5DVElPTicsIDEzMikgICAgIyBGbGFncwogZGVmX29wKCdCVUlMRF9TTElDRScsIDEzMykgICAgICAjIE51bWJlciBvZiBpdGVtcwotZGVmX29wKCdNQUtFX0NMT1NVUkUnLCAxMzQpCiBkZWZfb3AoJ0xPQURfQ0xPU1VSRScsIDEzNSkKIGhhc2ZyZWUuYXBwZW5kKDEzNSkKIGRlZl9vcCgnTE9BRF9ERVJFRicsIDEzNikKQEAgLTIxNCw0ICsyMTEsNyBAQAogZGVmX29wKCdCVUlMRF9UVVBMRV9VTlBBQ0snLCAxNTIpCiBkZWZfb3AoJ0JVSUxEX1NFVF9VTlBBQ0snLCAxNTMpCiAKK2RlZl9vcCgnRk9STUFUX1ZBTFVFJywgMTU1KQorZGVmX29wKCdCVUlMRF9DT05TVF9LRVlfTUFQJywgMTU2KQorCiBkZWwgZGVmX29wLCBuYW1lX29wLCBqcmVsX29wLCBqYWJzX29wCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggNzRiM2IzNi4uZThhYzFlMSAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMzgsNyArMzgsOCBAQAogICAgICAgICAgICAnT3B0aW9uRXJyb3InLAogICAgICAgICAgICAnT3B0aW9uQ29uZmxpY3RFcnJvcicsCiAgICAgICAgICAgICdPcHRpb25WYWx1ZUVycm9yJywKLSAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJ10KKyAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJywKKyAgICAgICAgICAgJ2NoZWNrX2Nob2ljZSddCiAKIF9fY29weXJpZ2h0X18gPSAiIiIKIENvcHlyaWdodCAoYykgMjAwMS0yMDA2IEdyZWdvcnkgUC4gV2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCmRpZmYgLS1naXQgYS9MaWIvb3MucHkgYi9MaWIvb3MucHkKaW5kZXggYjRjNjUxZC4uYzMxZWNiMiAxMDA2NDQKLS0tIGEvTGliL29zLnB5CisrKyBiL0xpYi9vcy5weQpAQCAtMjIsNyArMjIsNyBAQAogIiIiCiAKICMnCi0KK2ltcG9ydCBhYmMKIGltcG9ydCBzeXMsIGVycm5vCiBpbXBvcnQgc3RhdCBhcyBzdAogCkBAIC0zNTYsNiArMzU2LDcgQEAKIAogICAgIGRpcnMgPSBbXQogICAgIG5vbmRpcnMgPSBbXQorICAgIHdhbGtfZGlycyA9IFtdCiAKICAgICAjIFdlIG1heSBub3QgaGF2ZSByZWFkIHBlcm1pc3Npb24gZm9yIHRvcCwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndAogICAgICMgZ2V0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhlIGRpcmVjdG9yeSBjb250YWlucy4gIG9zLndhbGsKQEAgLTM2OSw0MiArMzcwLDUyIEBACiAgICAgICAgICAgICAjIE5vdGUgdGhhdCBzY2FuZGlyIGlzIGdsb2JhbCBpbiB0aGlzIG1vZHVsZSBkdWUKICAgICAgICAgICAgICMgdG8gZWFybGllciBpbXBvcnQtKi4KICAgICAgICAgICAgIHNjYW5kaXJfaXQgPSBzY2FuZGlyKHRvcCkKLSAgICAgICAgZW50cmllcyA9IGxpc3Qoc2NhbmRpcl9pdCkKICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnJvcjoKICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKICAgICAgICAgICAgIG9uZXJyb3IoZXJyb3IpCiAgICAgICAgIHJldHVybgogCi0gICAgZm9yIGVudHJ5IGluIGVudHJpZXM6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlzX2RpciA9IGVudHJ5LmlzX2RpcigpCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgIyBJZiBpc19kaXIoKSByYWlzZXMgYW4gT1NFcnJvciwgY29uc2lkZXIgdGhhdCB0aGUgZW50cnkgaXMgbm90Ci0gICAgICAgICAgICAjIGEgZGlyZWN0b3J5LCBzYW1lIGJlaGF2aW91ciB0aGFuIG9zLnBhdGguaXNkaXIoKS4KLSAgICAgICAgICAgIGlzX2RpciA9IEZhbHNlCi0KLSAgICAgICAgaWYgaXNfZGlyOgotICAgICAgICAgICAgZGlycy5hcHBlbmQoZW50cnkubmFtZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5vbmRpcnMuYXBwZW5kKGVudHJ5Lm5hbWUpCi0KLSAgICAgICAgaWYgbm90IHRvcGRvd24gYW5kIGlzX2RpcjoKLSAgICAgICAgICAgICMgQm90dG9tLXVwOiByZWN1cnNlIGludG8gc3ViLWRpcmVjdG9yeSwgYnV0IGV4Y2x1ZGUgc3ltbGlua3MgdG8KLSAgICAgICAgICAgICMgZGlyZWN0b3JpZXMgaWYgZm9sbG93bGlua3MgaXMgRmFsc2UKLSAgICAgICAgICAgIGlmIGZvbGxvd2xpbmtzOgotICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IFRydWUKLSAgICAgICAgICAgIGVsc2U6CisgICAgd2l0aCBzY2FuZGlyX2l0OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaXNfc3ltbGluayA9IGVudHJ5LmlzX3N5bWxpbmsoKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgICAgICAgICAjIElmIGlzX3N5bWxpbmsoKSByYWlzZXMgYW4gT1NFcnJvciwgY29uc2lkZXIgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIyBlbnRyeSBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLCBzYW1lIGJlaGF2aW91ciB0aGFuCi0gICAgICAgICAgICAgICAgICAgICMgb3MucGF0aC5pc2xpbmsoKS4KLSAgICAgICAgICAgICAgICAgICAgaXNfc3ltbGluayA9IEZhbHNlCi0gICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gbm90IGlzX3N5bWxpbmsKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBuZXh0KHNjYW5kaXJfaXQpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvbmVycm9yKGVycm9yKQorICAgICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgICAgICBpZiB3YWxrX2ludG86Ci0gICAgICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrKGVudHJ5LnBhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzX2RpciA9IGVudHJ5LmlzX2RpcigpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAjIElmIGlzX2RpcigpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZSBlbnRyeSBpcyBub3QKKyAgICAgICAgICAgICAgICAjIGEgZGlyZWN0b3J5LCBzYW1lIGJlaGF2aW91ciB0aGFuIG9zLnBhdGguaXNkaXIoKS4KKyAgICAgICAgICAgICAgICBpc19kaXIgPSBGYWxzZQorCisgICAgICAgICAgICBpZiBpc19kaXI6CisgICAgICAgICAgICAgICAgZGlycy5hcHBlbmQoZW50cnkubmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbm9uZGlycy5hcHBlbmQoZW50cnkubmFtZSkKKworICAgICAgICAgICAgaWYgbm90IHRvcGRvd24gYW5kIGlzX2RpcjoKKyAgICAgICAgICAgICAgICAjIEJvdHRvbS11cDogcmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcnksIGJ1dCBleGNsdWRlIHN5bWxpbmtzIHRvCisgICAgICAgICAgICAgICAgIyBkaXJlY3RvcmllcyBpZiBmb2xsb3dsaW5rcyBpcyBGYWxzZQorICAgICAgICAgICAgICAgIGlmIGZvbGxvd2xpbmtzOgorICAgICAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaXNfc3ltbGluayA9IGVudHJ5LmlzX3N5bWxpbmsoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgaXNfc3ltbGluaygpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBlbnRyeSBpcyBub3QgYSBzeW1ib2xpYyBsaW5rLCBzYW1lIGJlaGF2aW91ciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICAjIG9zLnBhdGguaXNsaW5rKCkuCisgICAgICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gbm90IGlzX3N5bWxpbmsKKworICAgICAgICAgICAgICAgIGlmIHdhbGtfaW50bzoKKyAgICAgICAgICAgICAgICAgICAgd2Fsa19kaXJzLmFwcGVuZChlbnRyeS5wYXRoKQogCiAgICAgIyBZaWVsZCBiZWZvcmUgcmVjdXJzaW9uIGlmIGdvaW5nIHRvcCBkb3duCiAgICAgaWYgdG9wZG93bjoKQEAgLTQyMSw2ICs0MzIsOSBAQAogICAgICAgICAgICAgaWYgZm9sbG93bGlua3Mgb3Igbm90IGlzbGluayhuZXdfcGF0aCk6CiAgICAgICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrKG5ld19wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKICAgICBlbHNlOgorICAgICAgICAjIFJlY3Vyc2UgaW50byBzdWItZGlyZWN0b3JpZXMKKyAgICAgICAgZm9yIG5ld19wYXRoIGluIHdhbGtfZGlyczoKKyAgICAgICAgICAgIHlpZWxkIGZyb20gd2FsayhuZXdfcGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCiAgICAgICAgICMgWWllbGQgYWZ0ZXIgcmVjdXJzaW9uIGlmIGdvaW5nIGJvdHRvbSB1cAogICAgICAgICB5aWVsZCB0b3AsIGRpcnMsIG5vbmRpcnMKIApAQCAtNDY3LDEwICs0ODEsMjMgQEAKICAgICAgICAgc3RhdCA9IHNlbGYuc3RhdChmb2xsb3dfc3ltbGlua3M9RmFsc2UpCiAgICAgICAgIHJldHVybiBzdC5TX0lTTE5LKHN0YXQuc3RfbW9kZSkKIAotZGVmIF9kdW1teV9zY2FuZGlyKGRpcik6CitjbGFzcyBfZHVtbXlfc2NhbmRpcjoKICAgICAjIGxpc3RkaXItYmFzZWQgaW1wbGVtZW50YXRpb24gZm9yIGJ5dGVzIHBhdGNoZXMgb24gV2luZG93cwotICAgIGZvciBuYW1lIGluIGxpc3RkaXIoZGlyKToKLSAgICAgICAgeWllbGQgX0R1bW15RGlyRW50cnkoZGlyLCBuYW1lKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXIpOgorICAgICAgICBzZWxmLmRpciA9IGRpcgorICAgICAgICBzZWxmLml0ID0gaXRlcihsaXN0ZGlyKGRpcikpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHJldHVybiBfRHVtbXlEaXJFbnRyeShzZWxmLmRpciwgbmV4dChzZWxmLml0KSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLml0ID0gaXRlcigoKSkKIAogX19hbGxfXy5hcHBlbmQoIndhbGsiKQogCkBAIC04NDksMzAgKzg3NiwyOCBAQAogICAgICAgICBlcnJvcnMgPSAnc3Vycm9nYXRlZXNjYXBlJwogCiAgICAgZGVmIGZzZW5jb2RlKGZpbGVuYW1lKToKKyAgICAgICAgIiIiRW5jb2RlIGZpbGVuYW1lIChhbiBvcy5QYXRoTGlrZSwgYnl0ZXMsIG9yIHN0cikgdG8gdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVyLCByZXR1cm4gYnl0ZXMgdW5jaGFuZ2VkLgorICAgICAgICBPbiBXaW5kb3dzLCB1c2UgJ3N0cmljdCcgZXJyb3IgaGFuZGxlciBpZiB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMKKyAgICAgICAgJ21iY3MnICh3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCiAgICAgICAgICIiIgotICAgICAgICBFbmNvZGUgZmlsZW5hbWUgdG8gdGhlIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvcgotICAgICAgICBoYW5kbGVyLCByZXR1cm4gYnl0ZXMgdW5jaGFuZ2VkLiBPbiBXaW5kb3dzLCB1c2UgJ3N0cmljdCcgZXJyb3IgaGFuZGxlciBpZgotICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgJ21iY3MnICh3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCi0gICAgICAgICIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgorICAgICAgICBmaWxlbmFtZSA9IGZzcGF0aChmaWxlbmFtZSkgICMgRG9lcyB0eXBlLWNoZWNraW5nIG9mIGBmaWxlbmFtZWAuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHN0cik6CiAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJSB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgZGVmIGZzZGVjb2RlKGZpbGVuYW1lKToKKyAgICAgICAgIiIiRGVjb2RlIGZpbGVuYW1lIChhbiBvcy5QYXRoTGlrZSwgYnl0ZXMsIG9yIHN0cikgZnJvbSB0aGUgZmlsZXN5c3RlbQorICAgICAgICBlbmNvZGluZyB3aXRoICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXIsIHJldHVybiBzdHIgdW5jaGFuZ2VkLiBPbgorICAgICAgICBXaW5kb3dzLCB1c2UgJ3N0cmljdCcgZXJyb3IgaGFuZGxlciBpZiB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMKKyAgICAgICAgJ21iY3MnICh3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCiAgICAgICAgICIiIgotICAgICAgICBEZWNvZGUgZmlsZW5hbWUgZnJvbSB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyB3aXRoICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yCi0gICAgICAgIGhhbmRsZXIsIHJldHVybiBzdHIgdW5jaGFuZ2VkLiBPbiBXaW5kb3dzLCB1c2UgJ3N0cmljdCcgZXJyb3IgaGFuZGxlciBpZgotICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgJ21iY3MnICh3aGljaCBpcyB0aGUgZGVmYXVsdCBlbmNvZGluZykuCi0gICAgICAgICIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBzdHIpOgotICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgorICAgICAgICBmaWxlbmFtZSA9IGZzcGF0aChmaWxlbmFtZSkgICMgRG9lcyB0eXBlLWNoZWNraW5nIG9mIGBmaWxlbmFtZWAuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5kZWNvZGUoZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAKICAgICByZXR1cm4gZnNlbmNvZGUsIGZzZGVjb2RlCiAKQEAgLTEwNzAsMyArMTA5NSw1NSBAQAogICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZmQgdHlwZSAoJXMsIGV4cGVjdGVkIGludGVnZXIpIiAlIHR5cGUoZmQpKQogICAgIGltcG9ydCBpbwogICAgIHJldHVybiBpby5vcGVuKGZkLCAqYXJncywgKiprd2FyZ3MpCisKKworIyBGb3IgdGVzdGluZyBwdXJwb3NlcywgbWFrZSBzdXJlIHRoZSBmdW5jdGlvbiBpcyBhdmFpbGFibGUgd2hlbiB0aGUgQworIyBpbXBsZW1lbnRhdGlvbiBleGlzdHMuCitkZWYgX2ZzcGF0aChwYXRoKToKKyAgICAiIiJSZXR1cm4gdGhlIHBhdGggcmVwcmVzZW50YXRpb24gb2YgYSBwYXRoLWxpa2Ugb2JqZWN0LgorCisgICAgSWYgc3RyIG9yIGJ5dGVzIGlzIHBhc3NlZCBpbiwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLiBPdGhlcndpc2UgdGhlCisgICAgb3MuUGF0aExpa2UgaW50ZXJmYWNlIGlzIHVzZWQgdG8gZ2V0IHRoZSBwYXRoIHJlcHJlc2VudGF0aW9uLiBJZiB0aGUKKyAgICBwYXRoIHJlcHJlc2VudGF0aW9uIGlzIG5vdCBzdHIgb3IgYnl0ZXMsIFR5cGVFcnJvciBpcyByYWlzZWQuIElmIHRoZQorICAgIHByb3ZpZGVkIHBhdGggaXMgbm90IHN0ciwgYnl0ZXMsIG9yIG9zLlBhdGhMaWtlLCBUeXBlRXJyb3IgaXMgcmFpc2VkLgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgKHN0ciwgYnl0ZXMpKToKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgICMgV29yayBmcm9tIHRoZSBvYmplY3QncyB0eXBlIHRvIG1hdGNoIG1ldGhvZCByZXNvbHV0aW9uIG9mIG90aGVyIG1hZ2ljCisgICAgIyBtZXRob2RzLgorICAgIHBhdGhfdHlwZSA9IHR5cGUocGF0aCkKKyAgICB0cnk6CisgICAgICAgIHBhdGhfcmVwciA9IHBhdGhfdHlwZS5fX2ZzcGF0aF9fKHBhdGgpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBpZiBoYXNhdHRyKHBhdGhfdHlwZSwgJ19fZnNwYXRoX18nKToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdGVkIHN0ciwgYnl0ZXMgb3Igb3MuUGF0aExpa2Ugb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAiICsgcGF0aF90eXBlLl9fbmFtZV9fKQorICAgIGlmIGlzaW5zdGFuY2UocGF0aF9yZXByLCAoc3RyLCBieXRlcykpOgorICAgICAgICByZXR1cm4gcGF0aF9yZXByCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3RlZCB7fS5fX2ZzcGF0aF9fKCkgdG8gcmV0dXJuIHN0ciBvciBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCB7fSIuZm9ybWF0KHBhdGhfdHlwZS5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHBhdGhfcmVwcikuX19uYW1lX18pKQorCisjIElmIHRoZXJlIGlzIG5vIEMgaW1wbGVtZW50YXRpb24sIG1ha2UgdGhlIHB1cmUgUHl0aG9uIHZlcnNpb24gdGhlCisjIGltcGxlbWVudGF0aW9uIGFzIHRyYW5zcGFyZW50bHkgYXMgcG9zc2libGUuCitpZiBub3QgX2V4aXN0cygnZnNwYXRoJyk6CisgICAgZnNwYXRoID0gX2ZzcGF0aAorICAgIGZzcGF0aC5fX25hbWVfXyA9ICJmc3BhdGgiCisKKworY2xhc3MgUGF0aExpa2UoYWJjLkFCQyk6CisKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBpbXBsZW1lbnRpbmcgdGhlIGZpbGUgc3lzdGVtIHBhdGggcHJvdG9jb2wuIiIiCisKKyAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIHN1YmNsYXNzKToKKyAgICAgICAgcmV0dXJuIGhhc2F0dHIoc3ViY2xhc3MsICdfX2ZzcGF0aF9fJykKZGlmZiAtLWdpdCBhL0xpYi9wYXRobGliLnB5IGIvTGliL3BhdGhsaWIucHkKaW5kZXggMTQ4MGUyZi4uYTA2Njc2ZiAxMDA2NDQKLS0tIGEvTGliL3BhdGhsaWIucHkKKysrIGIvTGliL3BhdGhsaWIucHkKQEAgLTYzNCwxMyArNjM0LDE2IEBACiAgICAgICAgIGZvciBhIGluIGFyZ3M6CiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIFB1cmVQYXRoKToKICAgICAgICAgICAgICAgICBwYXJ0cyArPSBhLl9wYXJ0cwotICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGEsIHN0cik6Ci0gICAgICAgICAgICAgICAgIyBGb3JjZS1jYXN0IHN0ciBzdWJjbGFzc2VzIHRvIHN0ciAoaXNzdWUgIzIxMTI3KQotICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoYSkpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSBhIHBhdGggb3Igc3RyIG9iamVjdCwgbm90ICVyIgotICAgICAgICAgICAgICAgICAgICAlIHR5cGUoYSkpCisgICAgICAgICAgICAgICAgYSA9IG9zLmZzcGF0aChhKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgIyBGb3JjZS1jYXN0IHN0ciBzdWJjbGFzc2VzIHRvIHN0ciAoaXNzdWUgIzIxMTI3KQorICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKGEpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgYSBzdHIgb2JqZWN0IG9yIGFuIG9zLlBhdGhMaWtlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuaW5nIHN0ciwgbm90ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgJSB0eXBlKGEpKQogICAgICAgICByZXR1cm4gY2xzLl9mbGF2b3VyLnBhcnNlX3BhcnRzKHBhcnRzKQogCiAgICAgQGNsYXNzbWV0aG9kCkBAIC02OTMsNiArNjk2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFydHMpIG9yICcuJwogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3N0cgogCisgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikKKwogICAgIGRlZiBhc19wb3NpeChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhdGggd2l0aCBmb3J3YXJkICgvKQogICAgICAgICBzbGFzaGVzLiIiIgpAQCAtOTQzLDYgKzk0OSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICByZXR1cm4gVHJ1ZQogCisjIENhbid0IHN1YmNsYXNzIG9zLlBhdGhMaWtlIGZyb20gUHVyZVBhdGggYW5kIGtlZXAgdGhlIGNvbnN0cnVjdG9yCisjIG9wdGltaXphdGlvbnMgaW4gUHVyZVBhdGguX3BhcnNlX2FyZ3MoKS4KK29zLlBhdGhMaWtlLnJlZ2lzdGVyKFB1cmVQYXRoKQorCiAKIGNsYXNzIFB1cmVQb3NpeFBhdGgoUHVyZVBhdGgpOgogICAgIF9mbGF2b3VyID0gX3Bvc2l4X2ZsYXZvdXIKZGlmZiAtLWdpdCBhL0xpYi9waWNrbGUucHkgYi9MaWIvcGlja2xlLnB5CmluZGV4IDc3NjA0MjUuLjk2M2I1OTUgMTAwNjQ0Ci0tLSBhL0xpYi9waWNrbGUucHkKKysrIGIvTGliL3BpY2tsZS5weQpAQCAtMjcsNiArMjcsNyBAQAogZnJvbSBjb3B5cmVnIGltcG9ydCBkaXNwYXRjaF90YWJsZQogZnJvbSBjb3B5cmVnIGltcG9ydCBfZXh0ZW5zaW9uX3JlZ2lzdHJ5LCBfaW52ZXJ0ZWRfcmVnaXN0cnksIF9leHRlbnNpb25fY2FjaGUKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCiBpbXBvcnQgc3lzCiBmcm9tIHN5cyBpbXBvcnQgbWF4c2l6ZQogZnJvbSBzdHJ1Y3QgaW1wb3J0IHBhY2ssIHVucGFjawpAQCAtNTQ0LDcgKzU0NSw3IEBACiAgICAgICAgIHdyaXRlID0gc2VsZi53cml0ZQogCiAgICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgIl9fbmFtZV9fIiwgIiIpCi0gICAgICAgIGlmIHNlbGYucHJvdG8gPj0gNCBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9leF9fIjoKKyAgICAgICAgaWYgc2VsZi5wcm90byA+PSAyIGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX2V4X18iOgogICAgICAgICAgICAgY2xzLCBhcmdzLCBrd2FyZ3MgPSBhcmdzCiAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsICJfX25ld19fIik6CiAgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiYXJnc1swXSBmcm9tIHt9IGFyZ3MgaGFzIG5vIF9fbmV3X18iCkBAIC01NTIsMTAgKzU1MywxNiBAQAogICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBjbHMgaXMgbm90IG9iai5fX2NsYXNzX186CiAgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiYXJnc1swXSBmcm9tIHt9IGFyZ3MgaGFzIHRoZSB3cm9uZyBjbGFzcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoZnVuY19uYW1lKSkKLSAgICAgICAgICAgIHNhdmUoY2xzKQotICAgICAgICAgICAgc2F2ZShhcmdzKQotICAgICAgICAgICAgc2F2ZShrd2FyZ3MpCi0gICAgICAgICAgICB3cml0ZShORVdPQkpfRVgpCisgICAgICAgICAgICBpZiBzZWxmLnByb3RvID49IDQ6CisgICAgICAgICAgICAgICAgc2F2ZShjbHMpCisgICAgICAgICAgICAgICAgc2F2ZShhcmdzKQorICAgICAgICAgICAgICAgIHNhdmUoa3dhcmdzKQorICAgICAgICAgICAgICAgIHdyaXRlKE5FV09CSl9FWCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVuYyA9IHBhcnRpYWwoY2xzLl9fbmV3X18sIGNscywgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgICAgIHNhdmUoZnVuYykKKyAgICAgICAgICAgICAgICBzYXZlKCgpKQorICAgICAgICAgICAgICAgIHdyaXRlKFJFRFVDRSkKICAgICAgICAgZWxpZiBzZWxmLnByb3RvID49IDIgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfXyI6CiAgICAgICAgICAgICAjIEEgX19yZWR1Y2VfXyBpbXBsZW1lbnRhdGlvbiBjYW4gZGlyZWN0IHByb3RvY29sIDIgb3IgbmV3ZXIgdG8KICAgICAgICAgICAgICMgdXNlIHRoZSBtb3JlIGVmZmljaWVudCBORVdPQkogb3Bjb2RlLCB3aGlsZSBzdGlsbApAQCAtMTAyNCw3ICsxMDMxLDcgQEAKICAgICAgICAgc2VsZi5fdW5mcmFtZXIgPSBfVW5mcmFtZXIoc2VsZi5fZmlsZV9yZWFkLCBzZWxmLl9maWxlX3JlYWRsaW5lKQogICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLl91bmZyYW1lci5yZWFkCiAgICAgICAgIHNlbGYucmVhZGxpbmUgPSBzZWxmLl91bmZyYW1lci5yZWFkbGluZQotICAgICAgICBzZWxmLm1hcmsgPSBvYmplY3QoKSAjIGFueSBuZXcgdW5pcXVlIG9iamVjdAorICAgICAgICBzZWxmLm1ldGFzdGFjayA9IFtdCiAgICAgICAgIHNlbGYuc3RhY2sgPSBbXQogICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCiAgICAgICAgIHNlbGYucHJvdG8gPSAwCkBAIC0xMDQwLDIwICsxMDQ3LDEyIEBACiAgICAgICAgIGV4Y2VwdCBfU3RvcCBhcyBzdG9waW5zdDoKICAgICAgICAgICAgIHJldHVybiBzdG9waW5zdC52YWx1ZQogCi0gICAgIyBSZXR1cm4gbGFyZ2VzdCBpbmRleCBrIHN1Y2ggdGhhdCBzZWxmLnN0YWNrW2tdIGlzIHNlbGYubWFyay4KLSAgICAjIElmIHRoZSBzdGFjayBkb2Vzbid0IGNvbnRhaW4gYSBtYXJrLCBldmVudHVhbGx5IHJhaXNlcyBJbmRleEVycm9yLgotICAgICMgVGhpcyBjb3VsZCBiZSBzcGVkIGJ5IG1haW50YWluaW5nIGFub3RoZXIgc3RhY2ssIG9mIGluZGljZXMgYXQgd2hpY2gKLSAgICAjIHRoZSBtYXJrIGFwcGVhcnMuICBGb3IgdGhhdCBtYXR0ZXIsIHRoZSBsYXR0ZXIgc3RhY2sgd291bGQgc3VmZmljZSwKLSAgICAjIGFuZCB3ZSB3b3VsZG4ndCBuZWVkIHRvIHB1c2ggbWFyayBvYmplY3RzIG9uIHNlbGYuc3RhY2sgYXQgYWxsLgotICAgICMgRG9pbmcgc28gaXMgcHJvYmFibHkgYSBnb29kIHRoaW5nLCB0aG91Z2gsIHNpbmNlIGlmIHRoZSBwaWNrbGUgaXMKLSAgICAjIGNvcnJ1cHQgKG9yIGhvc3RpbGUpIHdlIG1heSBnZXQgYSBjbHVlIGZyb20gZmluZGluZyBzZWxmLm1hcmsgZW1iZWRkZWQKLSAgICAjIGluIHVucGlja2xlZCBvYmplY3RzLgotICAgIGRlZiBtYXJrZXIoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrCi0gICAgICAgIGsgPSBsZW4oc3RhY2spLTEKLSAgICAgICAgd2hpbGUgc3RhY2tba10gaXMgbm90IG1hcms6IGsgPSBrLTEKLSAgICAgICAgcmV0dXJuIGsKKyAgICAjIFJldHVybiBhIGxpc3Qgb2YgaXRlbXMgcHVzaGVkIGluIHRoZSBzdGFjayBhZnRlciBsYXN0IE1BUksgaW5zdHJ1Y3Rpb24uCisgICAgZGVmIHBvcF9tYXJrKHNlbGYpOgorICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2sKKyAgICAgICAgc2VsZi5zdGFjayA9IHNlbGYubWV0YXN0YWNrLnBvcCgpCisgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5zdGFjay5hcHBlbmQKKyAgICAgICAgcmV0dXJuIGl0ZW1zCiAKICAgICBkZWYgcGVyc2lzdGVudF9sb2FkKHNlbGYsIHBpZCk6CiAgICAgICAgIHJhaXNlIFVucGlja2xpbmdFcnJvcigidW5zdXBwb3J0ZWQgcGVyc2lzdGVudCBpZCBlbmNvdW50ZXJlZCIpCkBAIC0xMjMwLDggKzEyMjksOCBAQAogICAgIGRpc3BhdGNoW1NIT1JUX0JJTlVOSUNPREVbMF1dID0gbG9hZF9zaG9ydF9iaW51bmljb2RlCiAKICAgICBkZWYgbG9hZF90dXBsZShzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbdHVwbGUoc2VsZi5zdGFja1trKzE6XSldCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKHR1cGxlKGl0ZW1zKSkKICAgICBkaXNwYXRjaFtUVVBMRVswXV0gPSBsb2FkX3R1cGxlCiAKICAgICBkZWYgbG9hZF9lbXB0eV90dXBsZShzZWxmKToKQEAgLTEyNjMsMjEgKzEyNjIsMjAgQEAKICAgICBkaXNwYXRjaFtFTVBUWV9TRVRbMF1dID0gbG9hZF9lbXB0eV9zZXQKIAogICAgIGRlZiBsb2FkX2Zyb3plbnNldChzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbZnJvemVuc2V0KHNlbGYuc3RhY2tbaysxOl0pXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZChmcm96ZW5zZXQoaXRlbXMpKQogICAgIGRpc3BhdGNoW0ZST1pFTlNFVFswXV0gPSBsb2FkX2Zyb3plbnNldAogCiAgICAgZGVmIGxvYWRfbGlzdChzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbc2VsZi5zdGFja1trKzE6XV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQoaXRlbXMpCiAgICAgZGlzcGF0Y2hbTElTVFswXV0gPSBsb2FkX2xpc3QKIAogICAgIGRlZiBsb2FkX2RpY3Qoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGl0ZW1zID0gc2VsZi5zdGFja1trKzE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQogICAgICAgICBkID0ge2l0ZW1zW2ldOiBpdGVtc1tpKzFdCiAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMil9Ci0gICAgICAgIHNlbGYuc3RhY2tbazpdID0gW2RdCisgICAgICAgIHNlbGYuYXBwZW5kKGQpCiAgICAgZGlzcGF0Y2hbRElDVFswXV0gPSBsb2FkX2RpY3QKIAogICAgICMgSU5TVCBhbmQgT0JKIGRpZmZlciBvbmx5IGluIGhvdyB0aGV5IGdldCBhIGNsYXNzIG9iamVjdC4gIEl0J3Mgbm90CkBAIC0xMjg1LDkgKzEyODMsNyBAQAogICAgICMgcHJldmlvdXNseSBkaXZlcmdlZCBhbmQgZ3JldyBkaWZmZXJlbnQgYnVncy4KICAgICAjIGtsYXNzIGlzIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSwgYW5kIGsgcG9pbnRzIHRvIHRoZSB0b3Btb3N0IG1hcmsKICAgICAjIG9iamVjdCwgZm9sbG93aW5nIHdoaWNoIGFyZSB0aGUgYXJndW1lbnRzIGZvciBrbGFzcy5fX2luaXRfXy4KLSAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBrKToKLSAgICAgICAgYXJncyA9IHR1cGxlKHNlbGYuc3RhY2tbaysxOl0pCi0gICAgICAgIGRlbCBzZWxmLnN0YWNrW2s6XQorICAgIGRlZiBfaW5zdGFudGlhdGUoc2VsZiwga2xhc3MsIGFyZ3MpOgogICAgICAgICBpZiAoYXJncyBvciBub3QgaXNpbnN0YW5jZShrbGFzcywgdHlwZSkgb3IKICAgICAgICAgICAgIGhhc2F0dHIoa2xhc3MsICJfX2dldGluaXRhcmdzX18iKSk6CiAgICAgICAgICAgICB0cnk6CkBAIC0xMzAzLDE0ICsxMjk5LDE0IEBACiAgICAgICAgIG1vZHVsZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdLmRlY29kZSgiYXNjaWkiKQogICAgICAgICBuYW1lID0gc2VsZi5yZWFkbGluZSgpWzotMV0uZGVjb2RlKCJhc2NpaSIpCiAgICAgICAgIGtsYXNzID0gc2VsZi5maW5kX2NsYXNzKG1vZHVsZSwgbmFtZSkKLSAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIHNlbGYubWFya2VyKCkpCisgICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLnBvcF9tYXJrKCkpCiAgICAgZGlzcGF0Y2hbSU5TVFswXV0gPSBsb2FkX2luc3QKIAogICAgIGRlZiBsb2FkX29iaihzZWxmKToKICAgICAgICAgIyBTdGFjayBpcyAuLi4gbWFya29iamVjdCBjbGFzc29iamVjdCBhcmcxIGFyZzIgLi4uCi0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGtsYXNzID0gc2VsZi5zdGFjay5wb3AoaysxKQotICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgaykKKyAgICAgICAgYXJncyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBjbHMgPSBhcmdzLnBvcCgwKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShjbHMsIGFyZ3MpCiAgICAgZGlzcGF0Y2hbT0JKWzBdXSA9IGxvYWRfb2JqCiAKICAgICBkZWYgbG9hZF9uZXdvYmooc2VsZik6CkBAIC0xMzk1LDEyICsxMzkxLDE0IEBACiAgICAgZGlzcGF0Y2hbUkVEVUNFWzBdXSA9IGxvYWRfcmVkdWNlCiAKICAgICBkZWYgbG9hZF9wb3Aoc2VsZik6Ci0gICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgICAgICBpZiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgZGVsIHNlbGYuc3RhY2tbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBvcF9tYXJrKCkKICAgICBkaXNwYXRjaFtQT1BbMF1dID0gbG9hZF9wb3AKIAogICAgIGRlZiBsb2FkX3BvcF9tYXJrKHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICAgICAgc2VsZi5wb3BfbWFyaygpCiAgICAgZGlzcGF0Y2hbUE9QX01BUktbMF1dID0gbG9hZF9wb3BfbWFyawogCiAgICAgZGVmIGxvYWRfZHVwKHNlbGYpOgpAQCAtMTQ1NiwxNyArMTQ1NCwxNCBAQAogICAgIGRpc3BhdGNoW0FQUEVORFswXV0gPSBsb2FkX2FwcGVuZAogCiAgICAgZGVmIGxvYWRfYXBwZW5kcyhzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGxpc3Rfb2JqID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGl0ZW1zID0gc3RhY2tbbWFyayArIDE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBsaXN0X29iaiA9IHNlbGYuc3RhY2tbLTFdCiAgICAgICAgIGlmIGlzaW5zdGFuY2UobGlzdF9vYmosIGxpc3QpOgogICAgICAgICAgICAgbGlzdF9vYmouZXh0ZW5kKGl0ZW1zKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYXBwZW5kID0gbGlzdF9vYmouYXBwZW5kCiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgICAgICBhcHBlbmQoaXRlbSkKLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQogICAgIGRpc3BhdGNoW0FQUEVORFNbMF1dID0gbG9hZF9hcHBlbmRzCiAKICAgICBkZWYgbG9hZF9zZXRpdGVtKHNlbGYpOgpAQCAtMTQ3OCwyNyArMTQ3MywyMSBAQAogICAgIGRpc3BhdGNoW1NFVElURU1bMF1dID0gbG9hZF9zZXRpdGVtCiAKICAgICBkZWYgbG9hZF9zZXRpdGVtcyhzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGRpY3QgPSBzdGFja1ttYXJrIC0gMV0KLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobWFyayArIDEsIGxlbihzdGFjayksIDIpOgotICAgICAgICAgICAgZGljdFtzdGFja1tpXV0gPSBzdGFja1tpICsgMV0KLQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIGRpY3QgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oaXRlbXMpLCAyKToKKyAgICAgICAgICAgIGRpY3RbaXRlbXNbaV1dID0gaXRlbXNbaSArIDFdCiAgICAgZGlzcGF0Y2hbU0VUSVRFTVNbMF1dID0gbG9hZF9zZXRpdGVtcwogCiAgICAgZGVmIGxvYWRfYWRkaXRlbXMoc2VsZik6Ci0gICAgICAgIHN0YWNrID0gc2VsZi5zdGFjawotICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBzZXRfb2JqID0gc3RhY2tbbWFyayAtIDFdCi0gICAgICAgIGl0ZW1zID0gc3RhY2tbbWFyayArIDE6XQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZXRfb2JqID0gc2VsZi5zdGFja1stMV0KICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXRfb2JqLCBzZXQpOgogICAgICAgICAgICAgc2V0X29iai51cGRhdGUoaXRlbXMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhZGQgPSBzZXRfb2JqLmFkZAogICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CiAgICAgICAgICAgICAgICAgYWRkKGl0ZW0pCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KICAgICBkaXNwYXRjaFtBRERJVEVNU1swXV0gPSBsb2FkX2FkZGl0ZW1zCiAKICAgICBkZWYgbG9hZF9idWlsZChzZWxmKToKQEAgLTE1MjYsNyArMTUxNSw5IEBACiAgICAgZGlzcGF0Y2hbQlVJTERbMF1dID0gbG9hZF9idWlsZAogCiAgICAgZGVmIGxvYWRfbWFyayhzZWxmKToKLSAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5tYXJrKQorICAgICAgICBzZWxmLm1ldGFzdGFjay5hcHBlbmQoc2VsZi5zdGFjaykKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5zdGFjay5hcHBlbmQKICAgICBkaXNwYXRjaFtNQVJLWzBdXSA9IGxvYWRfbWFyawogCiAgICAgZGVmIGxvYWRfc3RvcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9waWNrbGV0b29scy5weSBiL0xpYi9waWNrbGV0b29scy5weQppbmRleCAxNmFlN2Q1Li40ZWVmYzE5IDEwMDY0NAotLS0gYS9MaWIvcGlja2xldG9vbHMucHkKKysrIGIvTGliL3BpY2tsZXRvb2xzLnB5CkBAIC0yNDQwLDYgKzI0NDAsNyBAQAogICAgICAgICBpZiBvcGNvZGUubmFtZSBpbiAoIlBVVCIsICJCSU5QVVQiLCAiTE9OR19CSU5QVVQiLCAiTUVNT0laRSIpOgogICAgICAgICAgICAgaWYgb3Bjb2RlLm5hbWUgPT0gIk1FTU9JWkUiOgogICAgICAgICAgICAgICAgIG1lbW9faWR4ID0gbGVuKG1lbW8pCisgICAgICAgICAgICAgICAgbWFya21zZyA9ICIoYXMgJWQpIiAlIG1lbW9faWR4CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGFzc2VydCBhcmcgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICBtZW1vX2lkeCA9IGFyZwpkaWZmIC0tZ2l0IGEvTGliL3BrZ3V0aWwucHkgYi9MaWIvcGtndXRpbC5weQppbmRleCA5NzcyNmE5Li5hMDRiN2QxIDEwMDY0NAotLS0gYS9MaWIvcGtndXRpbC5weQorKysgYi9MaWIvcGtndXRpbC5weQpAQCAtMTgwLDcgKzE4MCw3IEBACiBkZWYgX2ltcG9ydF9pbXAoKToKICAgICBnbG9iYWwgaW1wCiAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgICBpbXAgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnaW1wJykKIAogY2xhc3MgSW1wSW1wb3J0ZXI6CmRpZmYgLS1naXQgYS9MaWIvcGxhdC1saW51eC9yZWdlbiBiL0xpYi9wbGF0LWxpbnV4L3JlZ2VuCmluZGV4IGM3Njk1MGUuLjEwNjMzY2IgMTAwNzU1Ci0tLSBhL0xpYi9wbGF0LWxpbnV4L3JlZ2VuCisrKyBiL0xpYi9wbGF0LWxpbnV4L3JlZ2VuCkBAIC0xLDggKzEsMzMgQEAKICMhIC9iaW4vc2gKIGNhc2UgYHVuYW1lYCBpbgotTGludXgqKQk7OworTGludXgqfEdOVSopCTs7CiAqKQllY2hvIFByb2JhYmx5IG5vdCBvbiBhIExpbnV4IHN5c3RlbSAxPiYyCiAJZXhpdCAxOzsKIGVzYWMKLXNldCAtdgotaDJweSAtaSAnKHVfbG9uZyknIC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaCAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oIC91c3IvaW5jbHVkZS9kbGZjbi5oCitpZiBbIC16ICIkQ0MiIF07IHRoZW4KKyAgICBlY2hvID4mMiAiJChiYXNlbmFtZSAkMCk6IENDIGlzIG5vdCBzZXQiCisgICAgZXhpdCAxCitmaQoraGVhZGVycz0ic3lzL3R5cGVzLmggbmV0aW5ldC9pbi5oIGRsZmNuLmgiCitpbmNkaXJzPSIkKGVjaG8gJCgkQ0MgLXYgLUUgLSA8IC9kZXYvbnVsbCAyPiYxfGF3ayAnL14jaW5jbHVkZS8sIC9eRW5kIG9mIHNlYXJjaC8nIHwgZ3JlcCAnXiAnKSkiCitpZiBbIC16ICIkaW5jZGlycyIgXTsgdGhlbgorICAgIGluY2RpcnM9Ii91c3IvaW5jbHVkZSIKK2ZpCitmb3IgaCBpbiAkaGVhZGVyczsgZG8KKyAgICBhYnNoPQorICAgIGZvciBkIGluICRpbmNkaXJzOyBkbworCWlmIFsgLWYgIiRkLyRoIiBdOyB0aGVuCisJICAgIGFic2g9IiRkLyRoIgorCSAgICBicmVhaworCWZpCisgICAgZG9uZQorICAgIGlmIFsgLW4gIiRhYnNoIiBdOyB0aGVuCisJYWJzaGVhZGVycz0iJGFic2hlYWRlcnMgJGFic2giCisgICAgZWxzZQorCWVjaG8gPiYyICIkKGJhc2VuYW1lICQwKTogaGVhZGVyICRoIG5vdCBmb3VuZCIKKwlleGl0IDEKKyAgICBmaQorZG9uZQorCitzZXQgLXgKKyR7SDJQWTotaDJweX0gLWkgJyh1X2xvbmcpJyAkYWJzaGVhZGVycwpkaWZmIC0tZ2l0IGEvTGliL3BsaXN0bGliLnB5IGIvTGliL3BsaXN0bGliLnB5CmluZGV4IGI2NjYzOWMuLjRmMzYwZjMgMTAwNjQ0Ci0tLSBhL0xpYi9wbGlzdGxpYi5weQorKysgYi9MaWIvcGxpc3RsaWIucHkKQEAgLTQ3LDcgKzQ3LDcgQEAKICIiIgogX19hbGxfXyA9IFsKICAgICAicmVhZFBsaXN0IiwgIndyaXRlUGxpc3QiLCAicmVhZFBsaXN0RnJvbUJ5dGVzIiwgIndyaXRlUGxpc3RUb0J5dGVzIiwKLSAgICAiUGxpc3QiLCAiRGF0YSIsICJEaWN0IiwgIkZNVF9YTUwiLCAiRk1UX0JJTkFSWSIsCisgICAgIlBsaXN0IiwgIkRhdGEiLCAiRGljdCIsICJJbnZhbGlkRmlsZUV4Y2VwdGlvbiIsICJGTVRfWE1MIiwgIkZNVF9CSU5BUlkiLAogICAgICJsb2FkIiwgImR1bXAiLCAibG9hZHMiLCAiZHVtcHMiCiBdCiAKZGlmZiAtLWdpdCBhL0xpYi9weWNsYnIucHkgYi9MaWIvcHljbGJyLnB5CmluZGV4IDRkNDBiODcuLmQ3ZGJhOTcgMTAwNjQ0Ci0tLSBhL0xpYi9weWNsYnIucHkKKysrIGIvTGliL3B5Y2xici5weQpAQCAtNDAsMTIgKzQwLDEwIEBACiAiIiIKIAogaW1wb3J0IGlvCi1pbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBpbXBvcnRsaWIudXRpbAogaW1wb3J0IHRva2VuaXplCiBmcm9tIHRva2VuIGltcG9ydCBOQU1FLCBERURFTlQsIE9QCi1mcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCiAKIF9fYWxsX18gPSBbInJlYWRtb2R1bGUiLCAicmVhZG1vZHVsZV9leCIsICJDbGFzcyIsICJGdW5jdGlvbiJdCiAKQEAgLTMyOCw2ICszMjYsNyBAQAogZGVmIF9tYWluKCk6CiAgICAgIyBNYWluIHByb2dyYW0gZm9yIHRlc3RpbmcuCiAgICAgaW1wb3J0IG9zCisgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogICAgIG1vZCA9IHN5cy5hcmd2WzFdCiAgICAgaWYgb3MucGF0aC5leGlzdHMobW9kKToKICAgICAgICAgcGF0aCA9IFtvcy5wYXRoLmRpcm5hbWUobW9kKV0KZGlmZiAtLWdpdCBhL0xpYi9weWRvYy5weSBiL0xpYi9weWRvYy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDBkMGQwYWIuLmQ3YTE3N2YKLS0tIGEvTGliL3B5ZG9jLnB5CisrKyBiL0xpYi9weWRvYy5weQpAQCAtMjA5LDYgKzIwOSwxOCBAQAogICAgICAgICByZXN1bHRzLmFwcGVuZCgobmFtZSwga2luZCwgY2xzLCB2YWx1ZSkpCiAgICAgcmV0dXJuIHJlc3VsdHMKIAorZGVmIHNvcnRfYXR0cmlidXRlcyhhdHRycywgb2JqZWN0KToKKyAgICAnU29ydCB0aGUgYXR0cnMgbGlzdCBpbi1wbGFjZSBieSBfZmllbGRzIGFuZCB0aGVuIGFscGhhYmV0aWNhbGx5IGJ5IG5hbWUnCisgICAgIyBUaGlzIGFsbG93cyBkYXRhIGRlc2NyaXB0b3JzIHRvIGJlIG9yZGVyZWQgYWNjb3JkaW5nCisgICAgIyB0byBhIF9maWVsZHMgYXR0cmlidXRlIGlmIHByZXNlbnQuCisgICAgZmllbGRzID0gZ2V0YXR0cihvYmplY3QsICdfZmllbGRzJywgW10pCisgICAgdHJ5OgorICAgICAgICBmaWVsZF9vcmRlciA9IHtuYW1lIDogaS1sZW4oZmllbGRzKSBmb3IgKGksIG5hbWUpIGluIGVudW1lcmF0ZShmaWVsZHMpfQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIGZpZWxkX29yZGVyID0ge30KKyAgICBrZXlmdW5jID0gbGFtYmRhIGF0dHI6IChmaWVsZF9vcmRlci5nZXQoYXR0clswXSwgMCksIGF0dHJbMF0pCisgICAgYXR0cnMuc29ydChrZXk9a2V5ZnVuYykKKwogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtb2R1bGUgbWFuaXB1bGF0aW9uCiAKIGRlZiBpc3BhY2thZ2UocGF0aCk6CkBAIC04NjgsOCArODgwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ll9fbW9kdWxlX18pCiAgICAgICAgICAgICB0YWcgKz0gJzo8YnI+XG4nCiAKLSAgICAgICAgICAgICMgU29ydCBhdHRycyBieSBuYW1lLgotICAgICAgICAgICAgYXR0cnMuc29ydChrZXk9bGFtYmRhIHQ6IHRbMF0pCisgICAgICAgICAgICBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCkKIAogICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KICAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoJ01ldGhvZHMgJXMnICUgdGFnLCBhdHRycywKQEAgLTEyODcsOCArMTI5OCw4IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHRhZyA9ICJpbmhlcml0ZWQgZnJvbSAlcyIgJSBjbGFzc25hbWUodGhpc2NsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ll9fbW9kdWxlX18pCi0gICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoKQorCisgICAgICAgICAgICBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCkKIAogICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KICAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoIk1ldGhvZHMgJXM6XG4iICUgdGFnLCBhdHRycywKQEAgLTE0MTgsMTMgKzE0MjksMTQgQEAKICAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKICAgICBpZiBub3Qgc3lzLnN0ZGluLmlzYXR0eSgpIG9yIG5vdCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgogICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgotICAgIGlmICdQQUdFUicgaW4gb3MuZW52aXJvbjoKKyAgICB1c2VfcGFnZXIgPSBvcy5lbnZpcm9uLmdldCgnTUFOUEFHRVInKSBvciBvcy5lbnZpcm9uLmdldCgnUEFHRVInKQorICAgIGlmIHVzZV9wYWdlcjoKICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6ICMgcGlwZXMgY29tcGxldGVseSBicm9rZW4gaW4gV2luZG93cwotICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiB0ZW1wZmlsZXBhZ2VyKHBsYWluKHRleHQpLCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiB0ZW1wZmlsZXBhZ2VyKHBsYWluKHRleHQpLCB1c2VfcGFnZXIpCiAgICAgICAgIGVsaWYgb3MuZW52aXJvbi5nZXQoJ1RFUk0nKSBpbiAoJ2R1bWInLCAnZW1hY3MnKToKLSAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHBsYWluKHRleHQpLCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIocGxhaW4odGV4dCksIHVzZV9wYWdlcikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHRleHQsIG9zLmVudmlyb25bJ1BBR0VSJ10pCisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcih0ZXh0LCB1c2VfcGFnZXIpCiAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1RFUk0nKSBpbiAoJ2R1bWInLCAnZW1hY3MnKToKICAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKQEAgLTE5MDEsMTAgKzE5MTMsMTAgQEAKIAogICAgIGRlZiBpbnRybyhzZWxmKToKICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCi1XZWxjb21lIHRvIFB5dGhvbiAlcydzIGhlbHAgdXRpbGl0eSEKK1dlbGNvbWUgdG8gUHl0aG9uIHswfSdzIGhlbHAgdXRpbGl0eSEKIAogSWYgdGhpcyBpcyB5b3VyIGZpcnN0IHRpbWUgdXNpbmcgUHl0aG9uLCB5b3Ugc2hvdWxkIGRlZmluaXRlbHkgY2hlY2sgb3V0Ci10aGUgdHV0b3JpYWwgb24gdGhlIEludGVybmV0IGF0IGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvJXMvdHV0b3JpYWwvLgordGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnL3swfS90dXRvcmlhbC8uCiAKIEVudGVyIHRoZSBuYW1lIG9mIGFueSBtb2R1bGUsIGtleXdvcmQsIG9yIHRvcGljIHRvIGdldCBoZWxwIG9uIHdyaXRpbmcKIFB5dGhvbiBwcm9ncmFtcyBhbmQgdXNpbmcgUHl0aG9uIG1vZHVsZXMuICBUbyBxdWl0IHRoaXMgaGVscCB1dGlsaXR5IGFuZApAQCAtMTkxNCw3ICsxOTI2LDcgQEAKICJtb2R1bGVzIiwgImtleXdvcmRzIiwgInN5bWJvbHMiLCBvciAidG9waWNzIi4gIEVhY2ggbW9kdWxlIGFsc28gY29tZXMKIHdpdGggYSBvbmUtbGluZSBzdW1tYXJ5IG9mIHdoYXQgaXQgZG9lczsgdG8gbGlzdCB0aGUgbW9kdWxlcyB3aG9zZSBuYW1lCiBvciBzdW1tYXJ5IGNvbnRhaW4gYSBnaXZlbiBzdHJpbmcgc3VjaCBhcyAic3BhbSIsIHR5cGUgIm1vZHVsZXMgc3BhbSIuCi0nJycgJSB0dXBsZShbc3lzLnZlcnNpb25bOjNdXSoyKSkKKycnJy5mb3JtYXQoJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKSkKIAogICAgIGRlZiBsaXN0KHNlbGYsIGl0ZW1zLCBjb2x1bW5zPTQsIHdpZHRoPTgwKToKICAgICAgICAgaXRlbXMgPSBsaXN0KHNvcnRlZChpdGVtcykpCmRpZmYgLS1naXQgYS9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKaW5kZXggZDZmMTM2Ni4uYmU2MWJkZCAxMDA2NDQKLS0tIGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CisrKyBiL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQpAQCAtMSw3OSArMSwxMjcyOCBAQAogIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KLSMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gU2F0IEp1biAyNSAxNDowODo0NCAyMDE2Ci10b3BpY3MgPSB7J2Fzc2VydCc6IHUnXG5UaGUgImFzc2VydCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2VydCBzdGF0ZW1lbnRzIGFyZSBhIGNvbnZlbmllbnQgd2F5IHRvIGluc2VydCBkZWJ1Z2dpbmcgYXNzZXJ0aW9uc1xuaW50byBhIHByb2dyYW06XG5cbiAgIGFzc2VydF9zdG10IDo6PSAiYXNzZXJ0IiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1cblxuVGhlIHNpbXBsZSBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24iLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3JcblxuVGhlIGV4dGVuZGVkIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yIiwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICAgaWYgbm90IGV4cHJlc3Npb24xOiByYWlzZSBBc3NlcnRpb25FcnJvcihleHByZXNzaW9uMilcblxuVGhlc2UgZXF1aXZhbGVuY2VzIGFzc3VtZSB0aGF0ICJfX2RlYnVnX18iIGFuZCAiQXNzZXJ0aW9uRXJyb3IiIHJlZmVyXG50byB0aGUgYnVpbHQtaW4gdmFyaWFibGVzIHdpdGggdGhvc2UgbmFtZXMuICBJbiB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiB2YXJpYWJsZSAiX19kZWJ1Z19fIiBpcyAiVHJ1ZSIgdW5kZXJcbm5vcm1hbCBjaXJjdW1zdGFuY2VzLCAiRmFsc2UiIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCAoY29tbWFuZFxubGluZSBvcHRpb24gLU8pLiAgVGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0b3IgZW1pdHMgbm8gY29kZSBmb3IgYW5cbmFzc2VydCBzdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGUgdGltZS4gIE5vdGVcbnRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uXG50aGF0IGZhaWxlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZTsgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXMgcGFydCBvZiB0aGVcbnN0YWNrIHRyYWNlLlxuXG5Bc3NpZ25tZW50cyB0byAiX19kZWJ1Z19fIiBhcmUgaWxsZWdhbC4gIFRoZSB2YWx1ZSBmb3IgdGhlIGJ1aWx0LWluXG52YXJpYWJsZSBpcyBkZXRlcm1pbmVkIHdoZW4gdGhlIGludGVycHJldGVyIHN0YXJ0cy5cbicsCi0gJ2Fzc2lnbm1lbnQnOiB1J1xuQXNzaWdubWVudCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqKipcblxuQXNzaWdubWVudCBzdGF0ZW1lbnRzIGFyZSB1c2VkIHRvIChyZSliaW5kIG5hbWVzIHRvIHZhbHVlcyBhbmQgdG9cbm1vZGlmeSBhdHRyaWJ1dGVzIG9yIGl0ZW1zIG9mIG11dGFibGUgb2JqZWN0czpcblxuICAgYXNzaWdubWVudF9zdG10IDo6PSAodGFyZ2V0X2xpc3QgIj0iKSsgKHN0YXJyZWRfZXhwcmVzc2lvbiB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICB0YXJnZXRfbGlzdCAgICAgOjo9IHRhcmdldCAoIiwiIHRhcmdldCkqIFsiLCJdXG4gICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgfCAiKCIgdGFyZ2V0X2xpc3QgIikiXG4gICAgICAgICAgICAgIHwgIlsiIFt0YXJnZXRfbGlzdF0gIl0iXG4gICAgICAgICAgICAgIHwgYXR0cmlidXRlcmVmXG4gICAgICAgICAgICAgIHwgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICAgIHwgc2xpY2luZ1xuICAgICAgICAgICAgICB8ICIqIiB0YXJnZXRcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvclxuKmF0dHJpYnV0ZXJlZiosICpzdWJzY3JpcHRpb24qLCBhbmQgKnNsaWNpbmcqLilcblxuQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgKHJlbWVtYmVyIHRoYXRcbnRoaXMgY2FuIGJlIGEgc2luZ2xlIGV4cHJlc3Npb24gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCwgdGhlIGxhdHRlclxueWllbGRpbmcgYSB0dXBsZSkgYW5kIGFzc2lnbnMgdGhlIHNpbmdsZSByZXN1bHRpbmcgb2JqZWN0IHRvIGVhY2ggb2ZcbnRoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC5cblxuQXNzaWdubWVudCBpcyBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGRlcGVuZGluZyBvbiB0aGUgZm9ybSBvZiB0aGUgdGFyZ2V0XG4obGlzdCkuIFdoZW4gYSB0YXJnZXQgaXMgcGFydCBvZiBhIG11dGFibGUgb2JqZWN0IChhbiBhdHRyaWJ1dGVcbnJlZmVyZW5jZSwgc3Vic2NyaXB0aW9uIG9yIHNsaWNpbmcpLCB0aGUgbXV0YWJsZSBvYmplY3QgbXVzdFxudWx0aW1hdGVseSBwZXJmb3JtIHRoZSBhc3NpZ25tZW50IGFuZCBkZWNpZGUgYWJvdXQgaXRzIHZhbGlkaXR5LCBhbmRcbm1heSByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGFzc2lnbm1lbnQgaXMgdW5hY2NlcHRhYmxlLiAgVGhlIHJ1bGVzXG5vYnNlcnZlZCBieSB2YXJpb3VzIHR5cGVzIGFuZCB0aGUgZXhjZXB0aW9ucyByYWlzZWQgYXJlIGdpdmVuIHdpdGggdGhlXG5kZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgdHlwZXMgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZVxuaGllcmFyY2h5KikuXG5cbkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgdGFyZ2V0IGxpc3QsIG9wdGlvbmFsbHkgZW5jbG9zZWQgaW5cbnBhcmVudGhlc2VzIG9yIHNxdWFyZSBicmFja2V0cywgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhcyBmb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBlbXB0eTogVGhlIG9iamVjdCBtdXN0IGFsc28gYmUgYW4gZW1wdHlcbiAgaXRlcmFibGUuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldCBpbiBwYXJlbnRoZXNlczogVGhlIG9iamVjdFxuICBpcyBhc3NpZ25lZCB0byB0aGF0IHRhcmdldC5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzLCBvciBhXG4gIHNpbmdsZSB0YXJnZXQgaW4gc3F1YXJlIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGVcbiAgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldFxuICBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGVcbiAgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4gICogSWYgdGhlIHRhcmdldCBsaXN0IGNvbnRhaW5zIG9uZSB0YXJnZXQgcHJlZml4ZWQgd2l0aCBhblxuICAgIGFzdGVyaXNrLCBjYWxsZWQgYSAic3RhcnJlZCIgdGFyZ2V0OiBUaGUgb2JqZWN0IG11c3QgYmUgYW5cbiAgICBpdGVyYWJsZSB3aXRoIGF0IGxlYXN0IGFzIG1hbnkgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlXG4gICAgdGFyZ2V0IGxpc3QsIG1pbnVzIG9uZS4gIFRoZSBmaXJzdCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlXG4gICAgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlIHRhcmdldHMgYmVmb3JlIHRoZSBzdGFycmVkXG4gICAgdGFyZ2V0LiAgVGhlIGZpbmFsIGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSBhcmUgYXNzaWduZWQgdG8gdGhlXG4gICAgdGFyZ2V0cyBhZnRlciB0aGUgc3RhcnJlZCB0YXJnZXQuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZyBpdGVtc1xuICAgIGluIHRoZSBpdGVyYWJsZSBpcyB0aGVuIGFzc2lnbmVkIHRvIHRoZSBzdGFycmVkIHRhcmdldCAodGhlIGxpc3RcbiAgICBjYW4gYmUgZW1wdHkpLlxuXG4gICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mXG4gICAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZVxuICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbkFzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgc2luZ2xlIHRhcmdldCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzXG5mb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gaWRlbnRpZmllciAobmFtZSk6XG5cbiAgKiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBvY2N1ciBpbiBhICJnbG9iYWwiIG9yICJub25sb2NhbCIgc3RhdGVtZW50XG4gICAgaW4gdGhlIGN1cnJlbnQgY29kZSBibG9jazogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGVcbiAgICBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZS5cblxuICAqIE90aGVyd2lzZTogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUgZ2xvYmFsXG4gICAgbmFtZXNwYWNlIG9yIHRoZSBvdXRlciBuYW1lc3BhY2UgZGV0ZXJtaW5lZCBieSAibm9ubG9jYWwiLFxuICAgIHJlc3BlY3RpdmVseS5cblxuICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlXG4gIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoXG4gIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzIGRlc3RydWN0b3IgKGlmIGl0XG4gIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2U6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW5cbiAgdGhlIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYW4gb2JqZWN0IHdpdGhcbiAgYXNzaWduYWJsZSBhdHRyaWJ1dGVzOyBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgIlR5cGVFcnJvciIgaXNcbiAgcmFpc2VkLiAgVGhhdCBvYmplY3QgaXMgdGhlbiBhc2tlZCB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0b1xuICB0aGUgZ2l2ZW4gYXR0cmlidXRlOyBpZiBpdCBjYW5ub3QgcGVyZm9ybSB0aGUgYXNzaWdubWVudCwgaXQgcmFpc2VzXG4gIGFuIGV4Y2VwdGlvbiAodXN1YWxseSBidXQgbm90IG5lY2Vzc2FyaWx5ICJBdHRyaWJ1dGVFcnJvciIpLlxuXG4gIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2VcbiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgZXhwcmVzc2lvbixcbiAgImEueCIgY2FuIGFjY2VzcyBlaXRoZXIgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG9yIChpZiBubyBpbnN0YW5jZVxuICBhdHRyaWJ1dGUgZXhpc3RzKSBhIGNsYXNzIGF0dHJpYnV0ZS4gIFRoZSBMSFMgdGFyZ2V0ICJhLngiIGlzIGFsd2F5c1xuICBzZXQgYXMgYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuICBUaHVzLCB0aGVcbiAgdHdvIG9jY3VycmVuY2VzIG9mICJhLngiIGRvIG5vdCBuZWNlc3NhcmlseSByZWZlciB0byB0aGUgc2FtZVxuICBhdHRyaWJ1dGU6IGlmIHRoZSBSSFMgZXhwcmVzc2lvbiByZWZlcnMgdG8gYSBjbGFzcyBhdHRyaWJ1dGUsIHRoZVxuICBMSFMgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBhdHRyaWJ1dGUgYXMgdGhlIHRhcmdldCBvZiB0aGVcbiAgYXNzaWdubWVudDpcblxuICAgICBjbGFzcyBDbHM6XG4gICAgICAgICB4ID0gMyAgICAgICAgICAgICAjIGNsYXNzIHZhcmlhYmxlXG4gICAgIGluc3QgPSBDbHMoKVxuICAgICBpbnN0LnggPSBpbnN0LnggKyAxICAgIyB3cml0ZXMgaW5zdC54IGFzIDQgbGVhdmluZyBDbHMueCBhcyAzXG5cbiAgVGhpcyBkZXNjcmlwdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byBkZXNjcmlwdG9yXG4gIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgcHJvcGVydGllcyBjcmVhdGVkIHdpdGggInByb3BlcnR5KCkiLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzdWJzY3JpcHRpb246IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlXG4gIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSBzZXF1ZW5jZVxuICBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSBvciBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSkuXG4gIE5leHQsIHRoZSBzdWJzY3JpcHQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgeWllbGQgYW4gaW50ZWdlci4gIElmIGl0IGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3NcbiAgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmVcbiAgaW50ZWdlciBsZXNzIHRoYW4gdGhlIHNlcXVlbmNlXCdzIGxlbmd0aCwgYW5kIHRoZSBzZXF1ZW5jZSBpcyBhc2tlZFxuICB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0byBpdHMgaXRlbSB3aXRoIHRoYXQgaW5kZXguICBJZiB0aGVcbiAgaW5kZXggaXMgb3V0IG9mIHJhbmdlLCAiSW5kZXhFcnJvciIgaXMgcmFpc2VkIChhc3NpZ25tZW50IHRvIGFcbiAgc3Vic2NyaXB0ZWQgc2VxdWVuY2UgY2Fubm90IGFkZCBuZXcgaXRlbXMgdG8gYSBsaXN0KS5cblxuICBJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksIHRoZVxuICBzdWJzY3JpcHQgbXVzdCBoYXZlIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIG1hcHBpbmdcJ3Mga2V5IHR5cGUsXG4gIGFuZCB0aGUgbWFwcGluZyBpcyB0aGVuIGFza2VkIHRvIGNyZWF0ZSBhIGtleS9kYXR1bSBwYWlyIHdoaWNoIG1hcHNcbiAgdGhlIHN1YnNjcmlwdCB0byB0aGUgYXNzaWduZWQgb2JqZWN0LiAgVGhpcyBjYW4gZWl0aGVyIHJlcGxhY2UgYW5cbiAgZXhpc3Rpbmcga2V5L3ZhbHVlIHBhaXIgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsIG9yIGluc2VydCBhIG5ld1xuICBrZXkvdmFsdWUgcGFpciAoaWYgbm8ga2V5IHdpdGggdGhlIHNhbWUgdmFsdWUgZXhpc3RlZCkuXG5cbiAgRm9yIHVzZXItZGVmaW5lZCBvYmplY3RzLCB0aGUgIl9fc2V0aXRlbV9fKCkiIG1ldGhvZCBpcyBjYWxsZWQgd2l0aFxuICBhcHByb3ByaWF0ZSBhcmd1bWVudHMuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhIHNsaWNpbmc6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlXG4gIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdFxuICAoc3VjaCBhcyBhIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvYmplY3RcbiAgb2YgdGhlIHNhbWUgdHlwZS4gIE5leHQsIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZXhwcmVzc2lvbnMgYXJlXG4gIGV2YWx1YXRlZCwgaW5zb2ZhciB0aGV5IGFyZSBwcmVzZW50OyBkZWZhdWx0cyBhcmUgemVybyBhbmQgdGhlXG4gIHNlcXVlbmNlXCdzIGxlbmd0aC4gIFRoZSBib3VuZHMgc2hvdWxkIGV2YWx1YXRlIHRvIGludGVnZXJzLiBJZlxuICBlaXRoZXIgYm91bmQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGVcbiAgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgc2VxdWVuY2VcJ3NcbiAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvIHJlcGxhY2VcbiAgdGhlIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSBsZW5ndGggb2ZcbiAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSxcbiAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSB0YXJnZXRcbiAgc2VxdWVuY2UgYWxsb3dzIGl0LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGVcbnN5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsIGFuZFxuaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIGNhdXNpbmdcbmxlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuXG5cbkFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzIGJldHdlZW5cbnRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgXCdzaW11bHRhbmVvdXNcJyAoZm9yXG5leGFtcGxlICJhLCBiID0gYiwgYSIgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qIHRoZVxuY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgb2NjdXIgbGVmdC10by1yaWdodCwgc29tZXRpbWVzXG5yZXN1bHRpbmcgaW4gY29uZnVzaW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gcHJpbnRzXG4iWzAsIDJdIjpcblxuICAgeCA9IFswLCAxXVxuICAgaSA9IDBcbiAgIGksIHhbaV0gPSAxLCAyICAgICAgICAgIyBpIGlzIHVwZGF0ZWQsIHRoZW4geFtpXSBpcyB1cGRhdGVkXG4gICBwcmludCh4KVxuXG5TZWUgYWxzbzogKipQRVAgMzEzMioqIC0gRXh0ZW5kZWQgSXRlcmFibGUgVW5wYWNraW5nXG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAiKnRhcmdldCIgZmVhdHVyZS5cblxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlIHJld3JpdHRlbiBhc1xuInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluIHRoZVxuYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuIHBvc3NpYmxlLFxudGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCByYXRoZXIgdGhhblxuY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkIG9iamVjdFxuaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSBsZWZ0LVxuaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciBleGFtcGxlLCAiYVtpXVxuKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kIHBlcmZvcm1zXG50aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLlxuXG5XaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyBpbiBhXG5zaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG5zdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LFxud2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgYmluYXJ5XG5vcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxcbmJpbmFyeSBvcGVyYXRpb25zLlxuXG5Gb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lICpjYXZlYXQgYWJvdXRcbmNsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzKiBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLlxuJywKLSAnYXRvbS1pZGVudGlmaWVycyc6IHUnXG5JZGVudGlmaWVycyAoTmFtZXMpXG4qKioqKioqKioqKioqKioqKioqXG5cbkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb25cbipJZGVudGlmaWVycyBhbmQga2V5d29yZHMqIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gKk5hbWluZ1xuYW5kIGJpbmRpbmcqIGZvciBkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy5cblxuV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlIGF0b20geWllbGRzXG50aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0XG5yYWlzZXMgYSAiTmFtZUVycm9yIiBleGNlcHRpb24uXG5cbioqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0IHRleHR1YWxseSBvY2N1cnMgaW5cbmEgY2xhc3MgZGVmaW5pdGlvbiBiZWdpbnMgd2l0aCB0d28gb3IgbW9yZSB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYW5kXG5kb2VzIG5vdCBlbmQgaW4gdHdvIG9yIG1vcmUgdW5kZXJzY29yZXMsIGl0IGlzIGNvbnNpZGVyZWQgYSAqcHJpdmF0ZVxubmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSBsb25nZXIgZm9ybVxuYmVmb3JlIGNvZGUgaXMgZ2VuZXJhdGVkIGZvciB0aGVtLiAgVGhlIHRyYW5zZm9ybWF0aW9uIGluc2VydHMgdGhlXG5jbGFzcyBuYW1lLCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCBhbmQgYSBzaW5nbGUgdW5kZXJzY29yZVxuaW5zZXJ0ZWQsIGluIGZyb250IG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSBpZGVudGlmaWVyICJfX3NwYW0iXG5vY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCAiSGFtIiB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvICJfSGFtX19zcGFtIi5cblRoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsIGNvbnRleHQgaW4gd2hpY2hcbnRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpcyBleHRyZW1lbHkgbG9uZ1xuKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0cnVuY2F0aW9uIG1heVxuaGFwcGVuLiBJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCBub1xudHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCi0gJ2F0b20tbGl0ZXJhbHMnOiB1IlxuTGl0ZXJhbHNcbioqKioqKioqXG5cblB5dGhvbiBzdXBwb3J0cyBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIGFuZCB2YXJpb3VzIG51bWVyaWNcbmxpdGVyYWxzOlxuXG4gICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgYnl0ZXNsaXRlcmFsXG4gICAgICAgICAgICAgICB8IGludGVnZXIgfCBmbG9hdG51bWJlciB8IGltYWdudW1iZXJcblxuRXZhbHVhdGlvbiBvZiBhIGxpdGVyYWwgeWllbGRzIGFuIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSAoc3RyaW5nLFxuYnl0ZXMsIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggdGhlIGdpdmVuXG52YWx1ZS4gIFRoZSB2YWx1ZSBtYXkgYmUgYXBwcm94aW1hdGVkIGluIHRoZSBjYXNlIG9mIGZsb2F0aW5nIHBvaW50XG5hbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uICpMaXRlcmFscyogZm9yIGRldGFpbHMuXG5cbkFsbCBsaXRlcmFscyBjb3JyZXNwb25kIHRvIGltbXV0YWJsZSBkYXRhIHR5cGVzLCBhbmQgaGVuY2UgdGhlXG5vYmplY3QncyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gIE11bHRpcGxlXG5ldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlIHNhbWVcbm9jY3VycmVuY2UgaW4gdGhlIHByb2dyYW0gdGV4dCBvciBhIGRpZmZlcmVudCBvY2N1cnJlbmNlKSBtYXkgb2J0YWluXG50aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUuXG4iLAotICdhdHRyaWJ1dGUtYWNjZXNzJzogdSdcbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAieC5uYW1lIikgZm9yXG5jbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIikuICAibmFtZSIgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLiBUaGlzXG4gICBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnlcbiAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzIGRvbmUgYm90aCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmVcbiAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgYXRcbiAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCBjb250cm9sIGJ5IG5vdFxuICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IChidXRcbiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICJfX2dldGF0dHJfXygpIixcbiAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAiX19nZXRhdHRyaWJ1dGVfXygpIiBlaXRoZXJcbiAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgbWV0aG9kXG4gICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpblxuICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3NcbiAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3JcbiAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG5cbiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbFxuICAgICBtZXRob2RzIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgbGFuZ3VhZ2Ugc3ludGF4XG4gICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlICpTcGVjaWFsIG1ldGhvZCBsb29rdXAqLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuXG5cbm9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsIG9iai5uYW1lIiBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxub2JqZWN0Ll9fZGlyX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQSBzZXF1ZW5jZSBtdXN0IGJlXG4gICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgdG8gYSBsaXN0IGFuZFxuICAgc29ydHMgaXQuXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgIl9fZGljdF9fIi5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yICJOb25lIiB3aGVuXG4gICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGRcbiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIlxuICAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5UaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgbW9kdWxlIGFzXG5zcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyB0aGlzXG5hcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgY2xhc3NcbmF0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSBvZiB0aGVcbmdpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSBmaXJzdFxucG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzIGF0dHJpYnV0ZSBmb3JcbnVuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuPT09PT09PT09PT09PT09PT09PT1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmRcbiJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LCBpdFxuaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiYS54IiBoYXMgYVxubG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bXCd4XCddIiwgdGhlblxuInR5cGUoYSkuX19kaWN0X19bXCd4XCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG4idHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuXG5Ib3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgdGhlXG5kZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmRcbmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZVxucHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlIGRlZmluZWQgYW5kXG5ob3cgdGhleSB3ZXJlIGNhbGxlZC5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCAiYS54Ii4gSG93XG50aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOlxuICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAic3VwZXIoQixcbiAgIG9iaikubSgpIiBzZWFyY2hlcyAib2JqLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgdGhlIGJhc2UgY2xhc3MgIkEiXG4gICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgIkIiIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGVcbiAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXykiLlxuXG5Gb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzXG5vbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbmFueSBjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICJfX2RlbGV0ZV9fKCkiLiAgSWYgaXRcbmRvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsIHJldHVyblxudGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0XCdzXG5pbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiBhbmQvb3JcbiJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyBuZWl0aGVyLCBpdCBpc1xuYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lIGJvdGhcbiJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZVxuIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX3NldF9fKCkiIGFuZCAiX19nZXRfXygpIlxuZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluXG5jb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICJjbGFzc21ldGhvZCgpIikgYXJlXG5pbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuPT09PT09PT09XG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGVcbnN0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2VcbnZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2Vcbm51bWJlcnMgb2YgaW5zdGFuY2VzLlxuXG5UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIGNsYXNzXG5kZWZpbml0aW9uLiBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZiBpbnN0YW5jZVxudmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvIGhvbGQgYVxudmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXMgbm90XG5jcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5vYmplY3QuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICpfX3Nsb3RzX18qXG4gICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlXG4gICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmQgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaFxuICAgaW5zdGFuY2UuXG5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKlxuICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyBhICpfX3Nsb3RzX18qXG4gIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuXG4qIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ld1xuICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvXG4gIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAiQXR0cmlidXRlRXJyb3IiLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXNcbiAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0c1xuICBpbnN0YW5jZXMuIElmIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZFxuICAiXCdfX3dlYWtyZWZfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZVxuICBpbnN0YW5jZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlXG4gIChleGNlcHQgYnkgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS5cbiAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAiYnl0ZXMiIGFuZCAidHVwbGUiLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3NcbiAgbWF5IGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuJywKLSAnYXR0cmlidXRlLXJlZmVyZW5jZXMnOiB1J1xuQXR0cmlidXRlIHJlZmVyZW5jZXNcbioqKioqKioqKioqKioqKioqKioqXG5cbkFuIGF0dHJpYnV0ZSByZWZlcmVuY2UgaXMgYSBwcmltYXJ5IGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCBhIG5hbWU6XG5cbiAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllclxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvZiBhIHR5cGUgdGhhdCBzdXBwb3J0c1xuYXR0cmlidXRlIHJlZmVyZW5jZXMsIHdoaWNoIG1vc3Qgb2JqZWN0cyBkby4gIFRoaXMgb2JqZWN0IGlzIHRoZW5cbmFza2VkIHRvIHByb2R1Y2UgdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzIHRoZSBpZGVudGlmaWVyLiAgVGhpc1xucHJvZHVjdGlvbiBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZSAiX19nZXRhdHRyX18oKSIgbWV0aG9kLlxuSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGV4Y2VwdGlvbiAiQXR0cmlidXRlRXJyb3IiIGlzXG5yYWlzZWQuICBPdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgb2JqZWN0IHByb2R1Y2VkIGlzXG5kZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucyBvZiB0aGUgc2FtZSBhdHRyaWJ1dGVcbnJlZmVyZW5jZSBtYXkgeWllbGQgZGlmZmVyZW50IG9iamVjdHMuXG4nLAotICdhdWdhc3NpZ24nOiB1J1xuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4gICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSByZXdyaXR0ZW4gYXNcbiJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGVcbmF1Z21lbnRlZCB2ZXJzaW9uLCAieCIgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlbiBwb3NzaWJsZSxcbnRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgcmF0aGVyIHRoYW5cbmNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCBvYmplY3RcbmlzIG1vZGlmaWVkIGluc3RlYWQuXG5cblVubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgbGVmdC1cbmhhbmQgc2lkZSAqYmVmb3JlKiBldmFsdWF0aW5nIHRoZSByaWdodC1oYW5kIHNpZGUuICBGb3IgZXhhbXBsZSwgImFbaV1cbis9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCBwZXJmb3Jtc1xudGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCi0gJ2JpbmFyeSc6IHUnXG5CaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGhhdmUgdGhlIGNvbnZlbnRpb25hbCBwcmlvcml0eVxubGV2ZWxzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhbHNvIGFwcGx5IHRvIGNlcnRhaW4gbm9uLVxubnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d29cbmxldmVscywgb25lIGZvciBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvcnMgYW5kIG9uZSBmb3IgYWRkaXRpdmVcbm9wZXJhdG9yczpcblxuICAgbV9leHByIDo6PSB1X2V4cHIgfCBtX2V4cHIgIioiIHVfZXhwciB8IG1fZXhwciAiQCIgbV9leHByIHxcbiAgICAgICAgICAgICAgbV9leHByICIvLyIgdV9leHByfCBtX2V4cHIgIi8iIHVfZXhwciB8XG4gICAgICAgICAgICAgIG1fZXhwciAiJSIgdV9leHByXG4gICBhX2V4cHIgOjo9IG1fZXhwciB8IGFfZXhwciAiKyIgbV9leHByIHwgYV9leHByICItIiBtX2V4cHJcblxuVGhlICIqIiAobXVsdGlwbGljYXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcHJvZHVjdCBvZiBpdHMgYXJndW1lbnRzLlxuVGhlIGFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMsIG9yIG9uZSBhcmd1bWVudCBtdXN0IGJlIGFuXG5pbnRlZ2VyIGFuZCB0aGUgb3RoZXIgbXVzdCBiZSBhIHNlcXVlbmNlLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZVxubnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUgYW5kIHRoZW4gbXVsdGlwbGllZCB0b2dldGhlci5cbkluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpcyBwZXJmb3JtZWQ7IGEgbmVnYXRpdmVcbnJlcGV0aXRpb24gZmFjdG9yIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZS5cblxuVGhlICJAIiAoYXQpIG9wZXJhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIG1hdHJpeFxubXVsdGlwbGljYXRpb24uICBObyBidWlsdGluIFB5dGhvbiB0eXBlcyBpbXBsZW1lbnQgdGhpcyBvcGVyYXRvci5cblxuTmV3IGluIHZlcnNpb24gMy41LlxuXG5UaGUgIi8iIChkaXZpc2lvbikgYW5kICIvLyIgKGZsb29yIGRpdmlzaW9uKSBvcGVyYXRvcnMgeWllbGQgdGhlXG5xdW90aWVudCBvZiB0aGVpciBhcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gRGl2aXNpb24gb2YgaW50ZWdlcnMgeWllbGRzIGEgZmxvYXQsIHdoaWxlXG5mbG9vciBkaXZpc2lvbiBvZiBpbnRlZ2VycyByZXN1bHRzIGluIGFuIGludGVnZXI7IHRoZSByZXN1bHQgaXMgdGhhdFxub2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uIHdpdGggdGhlIFwnZmxvb3JcJyBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZVxucmVzdWx0LiAgRGl2aXNpb24gYnkgemVybyByYWlzZXMgdGhlICJaZXJvRGl2aXNpb25FcnJvciIgZXhjZXB0aW9uLlxuXG5UaGUgIiUiIChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGRpdmlzaW9uIG9mXG50aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgQSB6ZXJvIHJpZ2h0IGFyZ3VtZW50IHJhaXNlcyB0aGVcbiJaZXJvRGl2aXNpb25FcnJvciIgZXhjZXB0aW9uLiAgVGhlIGFyZ3VtZW50cyBtYXkgYmUgZmxvYXRpbmcgcG9pbnRcbm51bWJlcnMsIGUuZy4sICIzLjE0JTAuNyIgZXF1YWxzICIwLjM0IiAoc2luY2UgIjMuMTQiIGVxdWFscyAiNCowLjcgK1xuMC4zNCIuKSAgVGhlIG1vZHVsbyBvcGVyYXRvciBhbHdheXMgeWllbGRzIGEgcmVzdWx0IHdpdGggdGhlIHNhbWUgc2lnblxuYXMgaXRzIHNlY29uZCBvcGVyYW5kIChvciB6ZXJvKTsgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSByZXN1bHQgaXNcbnN0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kIFsxXS5cblxuVGhlIGZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlIGZvbGxvd2luZ1xuaWRlbnRpdHk6ICJ4ID09ICh4Ly95KSp5ICsgKHgleSkiLiAgRmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBhcmUgYWxzb1xuY29ubmVjdGVkIHdpdGggdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJkaXZtb2QoKSI6ICJkaXZtb2QoeCwgeSkgPT1cbih4Ly95LCB4JXkpIi4gWzJdLlxuXG5JbiBhZGRpdGlvbiB0byBwZXJmb3JtaW5nIHRoZSBtb2R1bG8gb3BlcmF0aW9uIG9uIG51bWJlcnMsIHRoZSAiJSJcbm9wZXJhdG9yIGlzIGFsc28gb3ZlcmxvYWRlZCBieSBzdHJpbmcgb2JqZWN0cyB0byBwZXJmb3JtIG9sZC1zdHlsZVxuc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuICBUaGUgc3ludGF4IGZvclxuc3RyaW5nIGZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsXG5zZWN0aW9uICpwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcqLlxuXG5UaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IsIHRoZSBtb2R1bG8gb3BlcmF0b3IsIGFuZCB0aGUgImRpdm1vZCgpIlxuZnVuY3Rpb24gYXJlIG5vdCBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMuICBJbnN0ZWFkLCBjb252ZXJ0IHRvIGFcbmZsb2F0aW5nIHBvaW50IG51bWJlciB1c2luZyB0aGUgImFicygpIiBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS5cblxuVGhlICIrIiAoYWRkaXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgc3VtIG9mIGl0cyBhcmd1bWVudHMuICBUaGVcbmFyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMgb3IgYm90aCBiZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWVcbnR5cGUuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZVxuYW5kIHRoZW4gYWRkZWQgdG9nZXRoZXIuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHNlcXVlbmNlcyBhcmVcbmNvbmNhdGVuYXRlZC5cblxuVGhlICItIiAoc3VidHJhY3Rpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgZGlmZmVyZW5jZSBvZiBpdHMgYXJndW1lbnRzLlxuVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS5cbicsCi0gJ2JpdHdpc2UnOiB1J1xuQmluYXJ5IGJpdHdpc2Ugb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5FYWNoIG9mIHRoZSB0aHJlZSBiaXR3aXNlIG9wZXJhdGlvbnMgaGFzIGEgZGlmZmVyZW50IHByaW9yaXR5IGxldmVsOlxuXG4gICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByXG4gICB4b3JfZXhwciA6Oj0gYW5kX2V4cHIgfCB4b3JfZXhwciAiXiIgYW5kX2V4cHJcbiAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByXG5cblRoZSAiJiIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIEFORCBvZiBpdHMgYXJndW1lbnRzLCB3aGljaCBtdXN0XG5iZSBpbnRlZ2Vycy5cblxuVGhlICJeIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0c1xuYXJndW1lbnRzLCB3aGljaCBtdXN0IGJlIGludGVnZXJzLlxuXG5UaGUgInwiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgYXJndW1lbnRzLFxud2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cbicsCi0gJ2JsdGluLWNvZGUtb2JqZWN0cyc6IHUnXG5Db2RlIE9iamVjdHNcbioqKioqKioqKioqKlxuXG5Db2RlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIHJlcHJlc2VudCAicHNldWRvLVxuY29tcGlsZWQiIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUgc3VjaCBhcyBhIGZ1bmN0aW9uIGJvZHkuIFRoZXkgZGlmZmVyXG5mcm9tIGZ1bmN0aW9uIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvblwndCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZWlyXG5nbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSByZXR1cm5lZCBieSB0aGUgYnVpbHQtXG5pbiAiY29tcGlsZSgpIiBmdW5jdGlvbiBhbmQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGZ1bmN0aW9uIG9iamVjdHNcbnRocm91Z2ggdGhlaXIgIl9fY29kZV9fIiBhdHRyaWJ1dGUuIFNlZSBhbHNvIHRoZSAiY29kZSIgbW9kdWxlLlxuXG5BIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyBpdCAoaW5zdGVhZCBvZiBhXG5zb3VyY2Ugc3RyaW5nKSB0byB0aGUgImV4ZWMoKSIgb3IgImV2YWwoKSIgIGJ1aWx0LWluIGZ1bmN0aW9ucy5cblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKLSAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JzogdSdcblRoZSBFbGxpcHNpcyBPYmplY3RcbioqKioqKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgY29tbW9ubHkgdXNlZCBieSBzbGljaW5nIChzZWUgKlNsaWNpbmdzKikuICBJdCBzdXBwb3J0c1xubm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgZWxsaXBzaXMgb2JqZWN0LCBuYW1lZFxuIkVsbGlwc2lzIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKEVsbGlwc2lzKSgpIiBwcm9kdWNlcyB0aGVcbiJFbGxpcHNpcyIgc2luZ2xldG9uLlxuXG5JdCBpcyB3cml0dGVuIGFzICJFbGxpcHNpcyIgb3IgIi4uLiIuXG4nLAotICdibHRpbi1udWxsLW9iamVjdCc6IHUnXG5UaGUgTnVsbCBPYmplY3RcbioqKioqKioqKioqKioqKlxuXG5UaGlzIG9iamVjdCBpcyByZXR1cm5lZCBieSBmdW5jdGlvbnMgdGhhdCBkb25cJ3QgZXhwbGljaXRseSByZXR1cm4gYVxudmFsdWUuICBJdCBzdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBudWxsXG5vYmplY3QsIG5hbWVkICJOb25lIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKE5vbmUpKCkiIHByb2R1Y2VzIHRoZVxuc2FtZSBzaW5nbGV0b24uXG5cbkl0IGlzIHdyaXR0ZW4gYXMgIk5vbmUiLlxuJywKLSAnYmx0aW4tdHlwZS1vYmplY3RzJzogdSdcblR5cGUgT2JqZWN0c1xuKioqKioqKioqKioqXG5cblR5cGUgb2JqZWN0cyByZXByZXNlbnQgdGhlIHZhcmlvdXMgb2JqZWN0IHR5cGVzLiAgQW4gb2JqZWN0XCdzIHR5cGUgaXNcbmFjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAidHlwZSgpIi4gIFRoZXJlIGFyZSBubyBzcGVjaWFsXG5vcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSAidHlwZXMiIGRlZmluZXMgbmFtZXMgZm9yXG5hbGwgc3RhbmRhcmQgYnVpbHQtaW4gdHlwZXMuXG5cblR5cGVzIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxjbGFzcyBcJ2ludFwnPiIuXG4nLAotICdib29sZWFucyc6IHUnXG5Cb29sZWFuIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKlxuXG4gICBvcl90ZXN0ICA6Oj0gYW5kX3Rlc3QgfCBvcl90ZXN0ICJvciIgYW5kX3Rlc3RcbiAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4gICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0XG5cbkluIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyBhcmVcbnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgZmFsc2U6ICJGYWxzZSIsICJOb25lIiwgbnVtZXJpYyB6ZXJvIG9mIGFsbCB0eXBlcywgYW5kIGVtcHR5XG5zdHJpbmdzIGFuZCBjb250YWluZXJzIChpbmNsdWRpbmcgc3RyaW5ncywgdHVwbGVzLCBsaXN0cyxcbmRpY3Rpb25hcmllcywgc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgdHJ1ZS4gIFVzZXItZGVmaW5lZCBvYmplY3RzIGNhbiBjdXN0b21pemUgdGhlaXIgdHJ1dGggdmFsdWUgYnlcbnByb3ZpZGluZyBhICJfX2Jvb2xfXygpIiBtZXRob2QuXG5cblRoZSBvcGVyYXRvciAibm90IiB5aWVsZHMgIlRydWUiIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSwgIkZhbHNlIlxub3RoZXJ3aXNlLlxuXG5UaGUgZXhwcmVzc2lvbiAieCBhbmQgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIGZhbHNlLCBpdHNcbnZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWVcbmlzIHJldHVybmVkLlxuXG5UaGUgZXhwcmVzc2lvbiAieCBvciB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzIHZhbHVlXG5pcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzXG5yZXR1cm5lZC5cblxuKE5vdGUgdGhhdCBuZWl0aGVyICJhbmQiIG5vciAib3IiIHJlc3RyaWN0IHRoZSB2YWx1ZSBhbmQgdHlwZSB0aGV5XG5yZXR1cm4gdG8gIkZhbHNlIiBhbmQgIlRydWUiLCBidXQgcmF0aGVyIHJldHVybiB0aGUgbGFzdCBldmFsdWF0ZWRcbmFyZ3VtZW50LiAgVGhpcyBpcyBzb21ldGltZXMgdXNlZnVsLCBlLmcuLCBpZiAicyIgaXMgYSBzdHJpbmcgdGhhdFxuc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb25cbiJzIG9yIFwnZm9vXCciIHlpZWxkcyB0aGUgZGVzaXJlZCB2YWx1ZS4gIEJlY2F1c2UgIm5vdCIgaGFzIHRvIGNyZWF0ZSBhXG5uZXcgdmFsdWUsIGl0IHJldHVybnMgYSBib29sZWFuIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgaXRzXG5hcmd1bWVudCAoZm9yIGV4YW1wbGUsICJub3QgXCdmb29cJyIgcHJvZHVjZXMgIkZhbHNlIiByYXRoZXIgdGhhbiAiXCdcJyIuKVxuJywKLSAnYnJlYWsnOiB1J1xuVGhlICJicmVhayIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgYnJlYWtfc3RtdCA6Oj0gImJyZWFrIlxuXG4iYnJlYWsiIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgImZvciIgb3IgIndoaWxlIlxubG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIHdpdGhpbiB0aGF0XG5sb29wLlxuXG5JdCB0ZXJtaW5hdGVzIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLCBza2lwcGluZyB0aGUgb3B0aW9uYWwgImVsc2UiXG5jbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS5cblxuSWYgYSAiZm9yIiBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgImJyZWFrIiwgdGhlIGxvb3AgY29udHJvbCB0YXJnZXRcbmtlZXBzIGl0cyBjdXJyZW50IHZhbHVlLlxuXG5XaGVuICJicmVhayIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAiZmluYWxseSJcbmNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyB0aGVcbmxvb3AuXG4nLAotICdjYWxsYWJsZS10eXBlcyc6IHUnXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbiAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuJywKLSAnY2FsbHMnOiB1J1xuQ2FsbHNcbioqKioqXG5cbkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgcG9zc2libHlcbmVtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjpcblxuICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdIHwgY29tcHJlaGVuc2lvbl0gIikiXG4gICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiBzdGFycmVkX2FuZF9rZXl3b3Jkc11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiBrZXl3b3Jkc19hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICB8IHN0YXJyZWRfYW5kX2tleXdvcmRzIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXVxuICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3Jkc19hcmd1bWVudHNcbiAgIHBvc2l0aW9uYWxfYXJndW1lbnRzIDo6PSBbIioiXSBleHByZXNzaW9uICgiLCIgWyIqIl0gZXhwcmVzc2lvbikqXG4gICBzdGFycmVkX2FuZF9rZXl3b3JkcyA6Oj0gKCIqIiBleHByZXNzaW9uIHwga2V5d29yZF9pdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgIioiIGV4cHJlc3Npb24gfCAiLCIga2V5d29yZF9pdGVtKSpcbiAgIGtleXdvcmRzX2FyZ3VtZW50cyAgIDo6PSAoa2V5d29yZF9pdGVtIHwgIioqIiBleHByZXNzaW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbikqXG4gICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvblxuXG5BbiBvcHRpb25hbCB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmRcbmtleXdvcmQgYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy5cblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG5mdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzc1xub2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBhbGwgb2JqZWN0cyBoYXZpbmcgYVxuIl9fY2FsbF9fKCkiIG1ldGhvZCBhcmUgY2FsbGFibGUpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZVxuZXZhbHVhdGVkIGJlZm9yZSB0aGUgY2FsbCBpcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvblxuKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuXG5cbklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpc1xuY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxua2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWxcbnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXNcbmFscmVhZHkgZmlsbGVkLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIE90aGVyd2lzZSwgdGhlXG52YWx1ZSBvZiB0aGUgYXJndW1lbnQgaXMgcGxhY2VkIGluIHRoZSBzbG90LCBmaWxsaW5nIGl0IChldmVuIGlmIHRoZVxuZXhwcmVzc2lvbiBpcyAiTm9uZSIsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlXG5iZWVuIHByb2Nlc3NlZCwgdGhlIHNsb3RzIHRoYXQgYXJlIHN0aWxsIHVuZmlsbGVkIGFyZSBmaWxsZWQgd2l0aCB0aGVcbmNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKERlZmF1bHRcbnZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYVxubXV0YWJsZSBvYmplY3Qgc3VjaCBhcyBhIGxpc3Qgb3IgZGljdGlvbmFyeSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUgd2lsbFxuYmUgc2hhcmVkIGJ5IGFsbCBjYWxscyB0aGF0IGRvblwndCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHZhbHVlIGZvciB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSBhbnlcbnVuZmlsbGVkIHNsb3RzIGZvciB3aGljaCBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCwgYSAiVHlwZUVycm9yIlxuZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkIHNsb3RzIGlzIHVzZWQgYXNcbnRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlblxuaWYgdGhleSBhcmUgXCduYW1lZFwnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2VcbmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSAiUHlBcmdfUGFyc2VUdXBsZSgpIiB0byBwYXJzZVxudGhlaXIgYXJndW1lbnRzLlxuXG5JZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRoZXJlIGFyZSBmb3JtYWwgcGFyYW1ldGVyXG5zbG90cywgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG51c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4ob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuXG5JZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxubmFtZSwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG51c2luZyB0aGUgc3ludGF4ICIqKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWxcbnBhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmRcbmFyZ3VtZW50cyAodXNpbmcgdGhlIGtleXdvcmRzIGFzIGtleXMgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZXMgYXNcbmNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgbm9cbmV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy5cblxuSWYgdGhlIHN5bnRheCAiKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsICJleHByZXNzaW9uIlxubXVzdCBldmFsdWF0ZSB0byBhbiAqaXRlcmFibGUqLiAgRWxlbWVudHMgZnJvbSB0aGVzZSBpdGVyYWJsZXMgYXJlXG50cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzLiAgRm9yIHRoZSBjYWxsXG4iZih4MSwgeDIsICp5LCB4MywgeDQpIiwgaWYgKnkqIGV2YWx1YXRlcyB0byBhIHNlcXVlbmNlICp5MSosIC4uLixcbip5TSosIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGwgd2l0aCBNKzQgcG9zaXRpb25hbCBhcmd1bWVudHMgKngxKixcbip4MiosICp5MSosIC4uLiwgKnlNKiwgKngzKiwgKng0Ki5cblxuQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgYWx0aG91Z2ggdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4IG1heVxuYXBwZWFyICphZnRlciogZXhwbGljaXQga2V5d29yZCBhcmd1bWVudHMsIGl0IGlzIHByb2Nlc3NlZCAqYmVmb3JlKlxudGhlIGtleXdvcmQgYXJndW1lbnRzIChhbmQgYW55ICIqKmV4cHJlc3Npb24iIGFyZ3VtZW50cyAtLSBzZWUgYmVsb3cpLlxuU286XG5cbiAgID4+PiBkZWYgZihhLCBiKTpcbiAgIC4uLiAgICAgcHJpbnQoYSwgYilcbiAgIC4uLlxuICAgPj4+IGYoYj0xLCAqKDIsKSlcbiAgIDIgMVxuICAgPj4+IGYoYT0xLCAqKDIsKSlcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCBcJ2FcJ1xuICAgPj4+IGYoMSwgKigyLCkpXG4gICAxIDJcblxuSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4XG50byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXMgbm90XG5hcmlzZS5cblxuSWYgdGhlIHN5bnRheCAiKipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLFxuImV4cHJlc3Npb24iIG11c3QgZXZhbHVhdGUgdG8gYSAqbWFwcGluZyosIHRoZSBjb250ZW50cyBvZiB3aGljaCBhcmVcbnRyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIElmIGEga2V5d29yZCBpcyBhbHJlYWR5XG5wcmVzZW50IChhcyBhbiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LCBvciBmcm9tIGFub3RoZXIgdW5wYWNraW5nKSxcbmEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cblxuRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiXG5jYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbm5hbWVzLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy41OiBGdW5jdGlvbiBjYWxscyBhY2NlcHQgYW55IG51bWJlciBvZiAiKiIgYW5kXG4iKioiIHVucGFja2luZ3MsIHBvc2l0aW9uYWwgYXJndW1lbnRzIG1heSBmb2xsb3cgaXRlcmFibGUgdW5wYWNraW5nc1xuKCIqIiksIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBtYXkgZm9sbG93IGRpY3Rpb25hcnkgdW5wYWNraW5ncyAoIioqIikuXG5PcmlnaW5hbGx5IHByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuXG5BIGNhbGwgYWx3YXlzIHJldHVybnMgc29tZSB2YWx1ZSwgcG9zc2libHkgIk5vbmUiLCB1bmxlc3MgaXQgcmFpc2VzIGFuXG5leGNlcHRpb24uICBIb3cgdGhpcyB2YWx1ZSBpcyBjb21wdXRlZCBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZVxuY2FsbGFibGUgb2JqZWN0LlxuXG5JZiBpdCBpcy0tLVxuXG5hIHVzZXItZGVmaW5lZCBmdW5jdGlvbjpcbiAgIFRoZSBjb2RlIGJsb2NrIGZvciB0aGUgZnVuY3Rpb24gaXMgZXhlY3V0ZWQsIHBhc3NpbmcgaXQgdGhlXG4gICBhcmd1bWVudCBsaXN0LiAgVGhlIGZpcnN0IHRoaW5nIHRoZSBjb2RlIGJsb2NrIHdpbGwgZG8gaXMgYmluZCB0aGVcbiAgIGZvcm1hbCBwYXJhbWV0ZXJzIHRvIHRoZSBhcmd1bWVudHM7IHRoaXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb25cbiAgICpGdW5jdGlvbiBkZWZpbml0aW9ucyouICBXaGVuIHRoZSBjb2RlIGJsb2NrIGV4ZWN1dGVzIGEgInJldHVybiJcbiAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cblxuYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XG4gICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlICpCdWlsdC1pbiBGdW5jdGlvbnMqIGZvclxuICAgdGhlIGRlc2NyaXB0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuXG5cbmEgY2xhc3Mgb2JqZWN0OlxuICAgQSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBpcyByZXR1cm5lZC5cblxuYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6XG4gICBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aXRoIGFuIGFyZ3VtZW50XG4gICBsaXN0IHRoYXQgaXMgb25lIGxvbmdlciB0aGFuIHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjYWxsOiB0aGVcbiAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuXG5hIGNsYXNzIGluc3RhbmNlOlxuICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgIl9fY2FsbF9fKCkiIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuIHRoZVxuICAgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLlxuJywKLSAnY2xhc3MnOiB1J1xuQ2xhc3MgZGVmaW5pdGlvbnNcbioqKioqKioqKioqKioqKioqXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0XG51c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSAqQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24qXG5mb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhXG5jbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlXG5saXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuXG4gICBjbGFzcyBGb286XG4gICAgICAgcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbyhvYmplY3QpOlxuICAgICAgIHBhc3NcblxuVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbipOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG5vcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHNcbmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSBBXG5jbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZVxuY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LlxuVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG5uYW1lc3BhY2UuXG5cbkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgKm1ldGFjbGFzc2VzKi5cblxuQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLFxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBjbGFzcyBGb286IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb286IHBhc3NcbiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcblxuVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvclxuZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggaXMgdGhlblxuYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXNcbmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbmluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gIiJzZWxmLm5hbWUiIixcbmFuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lXG53aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0c1xuZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0b1xudW5leHBlY3RlZCByZXN1bHRzLiAgKkRlc2NyaXB0b3JzKiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbiAgQ2xhc3MgRGVjb3JhdG9yc1xuJywKLSAnY29tcGFyaXNvbnMnOiB1J1xuQ29tcGFyaXNvbnNcbioqKioqKioqKioqXG5cblVubGlrZSBDLCBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIGluIFB5dGhvbiBoYXZlIHRoZSBzYW1lIHByaW9yaXR5LFxud2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciBiaXR3aXNlXG5vcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlICJhIDwgYiA8IGMiIGhhdmUgdGhlXG5pbnRlcnByZXRhdGlvbiB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBtYXRoZW1hdGljczpcblxuICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIiE9IlxuICAgICAgICAgICAgICAgICAgICAgfCAiaXMiIFsibm90Il0gfCBbIm5vdCJdICJpbiJcblxuQ29tcGFyaXNvbnMgeWllbGQgYm9vbGVhbiB2YWx1ZXM6ICJUcnVlIiBvciAiRmFsc2UiLlxuXG5Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgInggPCB5IDw9IHoiIGlzXG5lcXVpdmFsZW50IHRvICJ4IDwgeSBhbmQgeSA8PSB6IiwgZXhjZXB0IHRoYXQgInkiIGlzIGV2YWx1YXRlZCBvbmx5XG5vbmNlIChidXQgaW4gYm90aCBjYXNlcyAieiIgaXMgbm90IGV2YWx1YXRlZCBhdCBhbGwgd2hlbiAieCA8IHkiIGlzXG5mb3VuZCB0byBiZSBmYWxzZSkuXG5cbkZvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgKm9wMSosXG4qb3AyKiwgLi4uLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gImEgb3AxIGIgb3AyIGMgLi4uIHlcbm9wTiB6IiBpcyBlcXVpdmFsZW50IHRvICJhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4geiIsIGV4Y2VwdFxudGhhdCBlYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGF0IG1vc3Qgb25jZS5cblxuTm90ZSB0aGF0ICJhIG9wMSBiIG9wMiBjIiBkb2VzblwndCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uIGJldHdlZW5cbiphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCAieCA8IHkgPiB6IiBpcyBwZXJmZWN0bHkgbGVnYWwgKHRob3VnaFxucGVyaGFwcyBub3QgcHJldHR5KS5cblxuXG5WYWx1ZSBjb21wYXJpc29uc1xuPT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdG9ycyAiPCIsICI+IiwgIj09IiwgIj49IiwgIjw9IiwgYW5kICIhPSIgY29tcGFyZSB0aGUgdmFsdWVzXG5vZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgdHlwZS5cblxuQ2hhcHRlciAqT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlcyogc3RhdGVzIHRoYXQgb2JqZWN0cyBoYXZlIGEgdmFsdWVcbihpbiBhZGRpdGlvbiB0byB0eXBlIGFuZCBpZGVudGl0eSkuICBUaGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzIGFcbnJhdGhlciBhYnN0cmFjdCBub3Rpb24gaW4gUHl0aG9uOiBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgbm8gY2Fub25pY2FsXG5hY2Nlc3MgbWV0aG9kIGZvciBhbiBvYmplY3RcJ3MgdmFsdWUuICBBbHNvLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudFxudGhhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBpbiBhIHBhcnRpY3VsYXIgd2F5LFxuZS5nLiBjb21wcmlzZWQgb2YgYWxsIGl0cyBkYXRhIGF0dHJpYnV0ZXMuIENvbXBhcmlzb24gb3BlcmF0b3JzXG5pbXBsZW1lbnQgYSBwYXJ0aWN1bGFyIG5vdGlvbiBvZiB3aGF0IHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMuICBPbmVcbmNhbiB0aGluayBvZiB0aGVtIGFzIGRlZmluaW5nIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaW5kaXJlY3RseSwgYnlcbm1lYW5zIG9mIHRoZWlyIGNvbXBhcmlzb24gaW1wbGVtZW50YXRpb24uXG5cbkJlY2F1c2UgYWxsIHR5cGVzIGFyZSAoZGlyZWN0IG9yIGluZGlyZWN0KSBzdWJ0eXBlcyBvZiAib2JqZWN0IiwgdGhleVxuaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yIGZyb20gIm9iamVjdCIuICBUeXBlcyBjYW5cbmN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIGJ5IGltcGxlbWVudGluZyAqcmljaCBjb21wYXJpc29uXG5tZXRob2RzKiBsaWtlICJfX2x0X18oKSIsIGRlc2NyaWJlZCBpbiAqQmFzaWMgY3VzdG9taXphdGlvbiouXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBlcXVhbGl0eSBjb21wYXJpc29uICgiPT0iIGFuZCAiIT0iKSBpcyBiYXNlZFxub24gdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3RzLiAgSGVuY2UsIGVxdWFsaXR5IGNvbXBhcmlzb24gb2Zcbmluc3RhbmNlcyB3aXRoIHRoZSBzYW1lIGlkZW50aXR5IHJlc3VsdHMgaW4gZXF1YWxpdHksIGFuZCBlcXVhbGl0eVxuY29tcGFyaXNvbiBvZiBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgaWRlbnRpdGllcyByZXN1bHRzIGluXG5pbmVxdWFsaXR5LiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlIGRlc2lyZSB0aGF0XG5hbGwgb2JqZWN0cyBzaG91bGQgYmUgcmVmbGV4aXZlIChpLmUuICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSIpLlxuXG5BIGRlZmF1bHQgb3JkZXIgY29tcGFyaXNvbiAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSBpcyBub3QgcHJvdmlkZWQ7XG5hbiBhdHRlbXB0IHJhaXNlcyAiVHlwZUVycm9yIi4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yXG5pcyB0aGUgbGFjayBvZiBhIHNpbWlsYXIgaW52YXJpYW50IGFzIGZvciBlcXVhbGl0eS5cblxuVGhlIGJlaGF2aW9yIG9mIHRoZSBkZWZhdWx0IGVxdWFsaXR5IGNvbXBhcmlzb24sIHRoYXQgaW5zdGFuY2VzIHdpdGhcbmRpZmZlcmVudCBpZGVudGl0aWVzIGFyZSBhbHdheXMgdW5lcXVhbCwgbWF5IGJlIGluIGNvbnRyYXN0IHRvIHdoYXRcbnR5cGVzIHdpbGwgbmVlZCB0aGF0IGhhdmUgYSBzZW5zaWJsZSBkZWZpbml0aW9uIG9mIG9iamVjdCB2YWx1ZSBhbmRcbnZhbHVlLWJhc2VkIGVxdWFsaXR5LiAgU3VjaCB0eXBlcyB3aWxsIG5lZWQgdG8gY3VzdG9taXplIHRoZWlyXG5jb21wYXJpc29uIGJlaGF2aW9yLCBhbmQgaW4gZmFjdCwgYSBudW1iZXIgb2YgYnVpbHQtaW4gdHlwZXMgaGF2ZSBkb25lXG50aGF0LlxuXG5UaGUgZm9sbG93aW5nIGxpc3QgZGVzY3JpYmVzIHRoZSBjb21wYXJpc29uIGJlaGF2aW9yIG9mIHRoZSBtb3N0XG5pbXBvcnRhbnQgYnVpbHQtaW4gdHlwZXMuXG5cbiogTnVtYmVycyBvZiBidWlsdC1pbiBudW1lcmljIHR5cGVzICgqTnVtZXJpYyBUeXBlcyAtLS0gaW50LCBmbG9hdCxcbiAgY29tcGxleCopIGFuZCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSB0eXBlcyAiZnJhY3Rpb25zLkZyYWN0aW9uIiBhbmRcbiAgImRlY2ltYWwuRGVjaW1hbCIgY2FuIGJlIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLFxuICB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0IGNvbXBsZXggbnVtYmVycyBkbyBub3Qgc3VwcG9ydCBvcmRlclxuICBjb21wYXJpc29uLiAgV2l0aGluIHRoZSBsaW1pdHMgb2YgdGhlIHR5cGVzIGludm9sdmVkLCB0aGV5IGNvbXBhcmVcbiAgbWF0aGVtYXRpY2FsbHkgKGFsZ29yaXRobWljYWxseSkgY29ycmVjdCB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLlxuXG4gIFRoZSBub3QtYS1udW1iZXIgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICJEZWNpbWFsKFwnTmFOXCcpIiBhcmVcbiAgc3BlY2lhbC4gIFRoZXkgYXJlIGlkZW50aWNhbCB0byB0aGVtc2VsdmVzICgieCBpcyB4IiBpcyB0cnVlKSBidXRcbiAgYXJlIG5vdCBlcXVhbCB0byB0aGVtc2VsdmVzICgieCA9PSB4IiBpcyBmYWxzZSkuICBBZGRpdGlvbmFsbHksXG4gIGNvbXBhcmluZyBhbnkgbnVtYmVyIHRvIGEgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICJGYWxzZSIuXG4gIEZvciBleGFtcGxlLCBib3RoICIzIDwgZmxvYXQoXCdOYU5cJykiIGFuZCAiZmxvYXQoXCdOYU5cJykgPCAzIiB3aWxsXG4gIHJldHVybiAiRmFsc2UiLlxuXG4qIEJpbmFyeSBzZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAiYnl0ZXMiIG9yICJieXRlYXJyYXkiKSBjYW4gYmVcbiAgY29tcGFyZWQgd2l0aGluIGFuZCBhY3Jvc3MgdGhlaXIgdHlwZXMuICBUaGV5IGNvbXBhcmVcbiAgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZWlyIGVsZW1lbnRzLlxuXG4qIFN0cmluZ3MgKGluc3RhbmNlcyBvZiAic3RyIikgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGVcbiAgbnVtZXJpY2FsIFVuaWNvZGUgY29kZSBwb2ludHMgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICJvcmQoKSIpIG9mIHRoZWlyIGNoYXJhY3RlcnMuIFszXVxuXG4gIFN0cmluZ3MgYW5kIGJpbmFyeSBzZXF1ZW5jZXMgY2Fubm90IGJlIGRpcmVjdGx5IGNvbXBhcmVkLlxuXG4qIFNlcXVlbmNlcyAoaW5zdGFuY2VzIG9mICJ0dXBsZSIsICJsaXN0Iiwgb3IgInJhbmdlIikgY2FuIGJlXG4gIGNvbXBhcmVkIG9ubHkgd2l0aGluIGVhY2ggb2YgdGhlaXIgdHlwZXMsIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXRcbiAgcmFuZ2VzIGRvIG5vdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24uICBFcXVhbGl0eSBjb21wYXJpc29uIGFjcm9zc1xuICB0aGVzZSB0eXBlcyByZXN1bHRzIGluIHVuZXF1YWxpdHksIGFuZCBvcmRlcmluZyBjb21wYXJpc29uIGFjcm9zc1xuICB0aGVzZSB0eXBlcyByYWlzZXMgIlR5cGVFcnJvciIuXG5cbiAgU2VxdWVuY2VzIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLCB3aGVyZWJ5IHJlZmxleGl2aXR5IG9mIHRoZSBlbGVtZW50cyBpc1xuICBlbmZvcmNlZC5cblxuICBJbiBlbmZvcmNpbmcgcmVmbGV4aXZpdHkgb2YgZWxlbWVudHMsIHRoZSBjb21wYXJpc29uIG9mIGNvbGxlY3Rpb25zXG4gIGFzc3VtZXMgdGhhdCBmb3IgYSBjb2xsZWN0aW9uIGVsZW1lbnQgIngiLCAieCA9PSB4IiBpcyBhbHdheXMgdHJ1ZS5cbiAgQmFzZWQgb24gdGhhdCBhc3N1bXB0aW9uLCBlbGVtZW50IGlkZW50aXR5IGlzIGNvbXBhcmVkIGZpcnN0LCBhbmRcbiAgZWxlbWVudCBjb21wYXJpc29uIGlzIHBlcmZvcm1lZCBvbmx5IGZvciBkaXN0aW5jdCBlbGVtZW50cy4gIFRoaXNcbiAgYXBwcm9hY2ggeWllbGRzIHRoZSBzYW1lIHJlc3VsdCBhcyBhIHN0cmljdCBlbGVtZW50IGNvbXBhcmlzb25cbiAgd291bGQsIGlmIHRoZSBjb21wYXJlZCBlbGVtZW50cyBhcmUgcmVmbGV4aXZlLiAgRm9yIG5vbi1yZWZsZXhpdmVcbiAgZWxlbWVudHMsIHRoZSByZXN1bHQgaXMgZGlmZmVyZW50IHRoYW4gZm9yIHN0cmljdCBlbGVtZW50XG4gIGNvbXBhcmlzb24sIGFuZCBtYXkgYmUgc3VycHJpc2luZzogIFRoZSBub24tcmVmbGV4aXZlIG5vdC1hLW51bWJlclxuICB2YWx1ZXMgZm9yIGV4YW1wbGUgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgY29tcGFyaXNvbiBiZWhhdmlvciB3aGVuXG4gIHVzZWQgaW4gYSBsaXN0OlxuXG4gICAgID4+PiBuYW4gPSBmbG9hdChcJ05hTlwnKVxuICAgICA+Pj4gbmFuIGlzIG5hblxuICAgICBUcnVlXG4gICAgID4+PiBuYW4gPT0gbmFuXG4gICAgIEZhbHNlICAgICAgICAgICAgICAgICA8LS0gdGhlIGRlZmluZWQgbm9uLXJlZmxleGl2ZSBiZWhhdmlvciBvZiBOYU5cbiAgICAgPj4+IFtuYW5dID09IFtuYW5dXG4gICAgIFRydWUgICAgICAgICAgICAgICAgICA8LS0gbGlzdCBlbmZvcmNlcyByZWZsZXhpdml0eSBhbmQgdGVzdHMgaWRlbnRpdHkgZmlyc3RcblxuICBMZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBiZXR3ZWVuIGJ1aWx0LWluIGNvbGxlY3Rpb25zIHdvcmtzIGFzXG4gIGZvbGxvd3M6XG5cbiAgKiBGb3IgdHdvIGNvbGxlY3Rpb25zIHRvIGNvbXBhcmUgZXF1YWwsIHRoZXkgbXVzdCBiZSBvZiB0aGUgc2FtZVxuICAgIHR5cGUsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgZWFjaCBwYWlyIG9mIGNvcnJlc3BvbmRpbmdcbiAgICBlbGVtZW50cyBtdXN0IGNvbXBhcmUgZXF1YWwgKGZvciBleGFtcGxlLCAiWzEsMl0gPT0gKDEsMikiIGlzXG4gICAgZmFsc2UgYmVjYXVzZSB0aGUgdHlwZSBpcyBub3QgdGhlIHNhbWUpLlxuXG4gICogQ29sbGVjdGlvbnMgdGhhdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24gYXJlIG9yZGVyZWQgdGhlIHNhbWVcbiAgICBhcyB0aGVpciBmaXJzdCB1bmVxdWFsIGVsZW1lbnRzIChmb3IgZXhhbXBsZSwgIlsxLDIseF0gPD0gWzEsMix5XSJcbiAgICBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgInggPD0geSIpLiAgSWYgYSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lc1xuICAgIG5vdCBleGlzdCwgdGhlIHNob3J0ZXIgY29sbGVjdGlvbiBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSxcbiAgICAiWzEsMl0gPCBbMSwyLDNdIiBpcyB0cnVlKS5cblxuKiBNYXBwaW5ncyAoaW5zdGFuY2VzIG9mICJkaWN0IikgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGV5XG4gIGhhdmUgZXF1YWwgKihrZXksIHZhbHVlKSogcGFpcnMuIEVxdWFsaXR5IGNvbXBhcmlzb24gb2YgdGhlIGtleXMgYW5kXG4gIGVsZW1lbnRzIGVuZm9yY2VzIHJlZmxleGl2aXR5LlxuXG4gIE9yZGVyIGNvbXBhcmlzb25zICgiPCIsICI+IiwgIjw9IiwgYW5kICI+PSIpIHJhaXNlICJUeXBlRXJyb3IiLlxuXG4qIFNldHMgKGluc3RhbmNlcyBvZiAic2V0IiBvciAiZnJvemVuc2V0IikgY2FuIGJlIGNvbXBhcmVkIHdpdGhpblxuICBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLlxuXG4gIFRoZXkgZGVmaW5lIG9yZGVyIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIG1lYW4gc3Vic2V0IGFuZCBzdXBlcnNldFxuICB0ZXN0cy4gIFRob3NlIHJlbGF0aW9ucyBkbyBub3QgZGVmaW5lIHRvdGFsIG9yZGVyaW5ncyAoZm9yIGV4YW1wbGUsXG4gIHRoZSB0d28gc2V0cyAiezEsMn0iIGFuZCAiezIsM30iIGFyZSBub3QgZXF1YWwsIG5vciBzdWJzZXRzIG9mIG9uZVxuICBhbm90aGVyLCBub3Igc3VwZXJzZXRzIG9mIG9uZSBhbm90aGVyKS4gIEFjY29yZGluZ2x5LCBzZXRzIGFyZSBub3RcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVwZW5kIG9uIHRvdGFsIG9yZGVyaW5nXG4gIChmb3IgZXhhbXBsZSwgIm1pbigpIiwgIm1heCgpIiwgYW5kICJzb3J0ZWQoKSIgcHJvZHVjZSB1bmRlZmluZWRcbiAgcmVzdWx0cyBnaXZlbiBhIGxpc3Qgb2Ygc2V0cyBhcyBpbnB1dHMpLlxuXG4gIENvbXBhcmlzb24gb2Ygc2V0cyBlbmZvcmNlcyByZWZsZXhpdml0eSBvZiBpdHMgZWxlbWVudHMuXG5cbiogTW9zdCBvdGhlciBidWlsdC1pbiB0eXBlcyBoYXZlIG5vIGNvbXBhcmlzb24gbWV0aG9kcyBpbXBsZW1lbnRlZCxcbiAgc28gdGhleSBpbmhlcml0IHRoZSBkZWZhdWx0IGNvbXBhcmlzb24gYmVoYXZpb3IuXG5cblVzZXItZGVmaW5lZCBjbGFzc2VzIHRoYXQgY3VzdG9taXplIHRoZWlyIGNvbXBhcmlzb24gYmVoYXZpb3Igc2hvdWxkXG5mb2xsb3cgc29tZSBjb25zaXN0ZW5jeSBydWxlcywgaWYgcG9zc2libGU6XG5cbiogRXF1YWxpdHkgY29tcGFyaXNvbiBzaG91bGQgYmUgcmVmbGV4aXZlLiBJbiBvdGhlciB3b3JkcywgaWRlbnRpY2FsXG4gIG9iamVjdHMgc2hvdWxkIGNvbXBhcmUgZXF1YWw6XG5cbiAgICAgInggaXMgeSIgaW1wbGllcyAieCA9PSB5IlxuXG4qIENvbXBhcmlzb24gc2hvdWxkIGJlIHN5bW1ldHJpYy4gSW4gb3RoZXIgd29yZHMsIHRoZSBmb2xsb3dpbmdcbiAgZXhwcmVzc2lvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcmVzdWx0OlxuXG4gICAgICJ4ID09IHkiIGFuZCAieSA9PSB4IlxuXG4gICAgICJ4ICE9IHkiIGFuZCAieSAhPSB4IlxuXG4gICAgICJ4IDwgeSIgYW5kICJ5ID4geCJcblxuICAgICAieCA8PSB5IiBhbmQgInkgPj0geCJcblxuKiBDb21wYXJpc29uIHNob3VsZCBiZSB0cmFuc2l0aXZlLiBUaGUgZm9sbG93aW5nIChub24tZXhoYXVzdGl2ZSlcbiAgZXhhbXBsZXMgaWxsdXN0cmF0ZSB0aGF0OlxuXG4gICAgICJ4ID4geSBhbmQgeSA+IHoiIGltcGxpZXMgInggPiB6IlxuXG4gICAgICJ4IDwgeSBhbmQgeSA8PSB6IiBpbXBsaWVzICJ4IDwgeiJcblxuKiBJbnZlcnNlIGNvbXBhcmlzb24gc2hvdWxkIHJlc3VsdCBpbiB0aGUgYm9vbGVhbiBuZWdhdGlvbi4gSW4gb3RoZXJcbiAgd29yZHMsIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcmVzdWx0OlxuXG4gICAgICJ4ID09IHkiIGFuZCAibm90IHggIT0geSJcblxuICAgICAieCA8IHkiIGFuZCAibm90IHggPj0geSIgKGZvciB0b3RhbCBvcmRlcmluZylcblxuICAgICAieCA+IHkiIGFuZCAibm90IHggPD0geSIgKGZvciB0b3RhbCBvcmRlcmluZylcblxuICBUaGUgbGFzdCB0d28gZXhwcmVzc2lvbnMgYXBwbHkgdG8gdG90YWxseSBvcmRlcmVkIGNvbGxlY3Rpb25zIChlLmcuXG4gIHRvIHNlcXVlbmNlcywgYnV0IG5vdCB0byBzZXRzIG9yIG1hcHBpbmdzKS4gU2VlIGFsc28gdGhlXG4gICJ0b3RhbF9vcmRlcmluZygpIiBkZWNvcmF0b3IuXG5cblB5dGhvbiBkb2VzIG5vdCBlbmZvcmNlIHRoZXNlIGNvbnNpc3RlbmN5IHJ1bGVzLiBJbiBmYWN0LCB0aGVcbm5vdC1hLW51bWJlciB2YWx1ZXMgYXJlIGFuIGV4YW1wbGUgZm9yIG5vdCBmb2xsb3dpbmcgdGhlc2UgcnVsZXMuXG5cblxuTWVtYmVyc2hpcCB0ZXN0IG9wZXJhdGlvbnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgImluIiBhbmQgIm5vdCBpbiIgdGVzdCBmb3IgbWVtYmVyc2hpcC4gICJ4IGluIHMiXG5ldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbm5vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbmFuZCBzZXQgdHlwZXMgc3VwcG9ydCB0aGlzIGFzIHdlbGwgYXMgZGljdGlvbmFyeSwgZm9yIHdoaWNoICJpbiIgdGVzdHNcbndoZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbmxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxueSkiLlxuXG5Gb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGlzXG5hIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAtMSIuICBFbXB0eVxuc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbnNvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbmluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG5pcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkXG5kdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlICJJbmRleEVycm9yIiBleGNlcHRpb24uICAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuImluIi5cblxuXG5JZGVudGl0eSBjb21wYXJpc29uc1xuPT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4IGlzIHkiIGlzXG50cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICAieCBpcyBub3QgeSJcbnlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdXG4nLAotICdjb21wb3VuZCc6IHUnXG5Db21wb3VuZCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqXG5cbkNvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5IGFmZmVjdFxub3IgY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIHRob3NlIG90aGVyIHN0YXRlbWVudHMgaW4gc29tZSB3YXkuICBJblxuZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiBzaW1wbGVcbmluY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSBsaW5lLlxuXG5UaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgY29udHJvbFxuZmxvdyBjb25zdHJ1Y3RzLiAgInRyeSIgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cFxuY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgIndpdGgiIHN0YXRlbWVudCBhbGxvd3MgdGhlXG5leGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrIG9mXG5jb2RlLiAgRnVuY3Rpb24gYW5kIGNsYXNzIGRlZmluaXRpb25zIGFyZSBhbHNvIHN5bnRhY3RpY2FsbHkgY29tcG91bmRcbnN0YXRlbWVudHMuXG5cbkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIFwnY2xhdXNlcy5cJyAgQSBjbGF1c2VcbmNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhIFwnc3VpdGUuXCcgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhXG5wYXJ0aWN1bGFyIGNvbXBvdW5kIHN0YXRlbWVudCBhcmUgYWxsIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsLlxuRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCBhbmQgZW5kc1xud2l0aCBhIGNvbG9uLiAgQSBzdWl0ZSBpcyBhIGdyb3VwIG9mIHN0YXRlbWVudHMgY29udHJvbGxlZCBieSBhXG5jbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZVxuc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgaGVhZGVyXCdzXG5jb2xvbiwgb3IgaXQgY2FuIGJlIG9uZSBvciBtb3JlIGluZGVudGVkIHN0YXRlbWVudHMgb24gc3Vic2VxdWVudFxubGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZFxuc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG5cJ3QgYmVcbmNsZWFyIHRvIHdoaWNoICJpZiIgY2xhdXNlIGEgZm9sbG93aW5nICJlbHNlIiBjbGF1c2Ugd291bGQgYmVsb25nOlxuXG4gICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50KHgpXG5cbkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzXG5jb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZVxuInByaW50KCkiIGNhbGxzIGFyZSBleGVjdXRlZDpcblxuICAgaWYgeCA8IHkgPCB6OiBwcmludCh4KTsgcHJpbnQoeSk7IHByaW50KHopXG5cblN1bW1hcml6aW5nOlxuXG4gICBjb21wb3VuZF9zdG10IDo6PSBpZl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZm9yX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgdHJ5X3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZ1bmNkZWZcbiAgICAgICAgICAgICAgICAgICAgIHwgY2xhc3NkZWZcbiAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfd2l0aF9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Zvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Z1bmNkZWZcbiAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgc3RhdGVtZW50KyBERURFTlRcbiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG5cbk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSAiTkVXTElORSIgcG9zc2libHkgZm9sbG93ZWQgYnkgYVxuIkRFREVOVCIuICBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMgYmVnaW5cbndpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nICJlbHNlIlwnIHByb2JsZW0gaXMgc29sdmVkIGluIFB5dGhvbiBieVxucmVxdWlyaW5nIG5lc3RlZCAiaWYiIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuXG5UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlc1xuZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuXG5cblRoZSAiaWYiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09XG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cblxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuXG5cblRoZSAiZm9yIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT1cblxuVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZVxuKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG4iZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiAgRWFjaFxuaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgcnVsZXNcbmZvciBhc3NpZ25tZW50cyAoc2VlICpBc3NpZ25tZW50IHN0YXRlbWVudHMqKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG5leGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uKSxcbnRoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXNcbndpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG5pdGVtLlxuXG5UaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0IGxpc3QuXG5UaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmdcbnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcblxuICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuICAgICAgIHByaW50KGkpXG4gICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuXG5OYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG5idXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG5pdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgaVxuOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbiAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbiAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyBtZWFuc1xuICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gdGhlXG4gIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggb2ZcbiAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmIHRoZVxuICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbiAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4gIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4gIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuXG4gICAgIGZvciB4IGluIGFbOl06XG4gICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcblxuXG5UaGUgInRyeSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAidHJ5IiBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsiYXMiIGlkZW50aWZpZXJdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cblRoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW4gbm9cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCBmb3IgYW5cbmV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0IGNsYXVzZXNcbmluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gZXhwcmVzc2lvbi1cbmxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0IGV4cHJlc3Npb25cbmlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzIGNvbXBhdGlibGVcbndpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlIGV4Y2VwdGlvblxub2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCByYWlzZWRcbnRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmXG5wcmVzZW50LCBhbmQgdGhlIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG5jbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXNcbnJlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LlxuKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sXG5hbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxub3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbldoZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG5hdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIGZvb1xuXG53YXMgdHJhbnNsYXRlZCB0b1xuXG4gICBleGNlcHQgRSBhcyBOOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgZm9vXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgZGVsIE5cblxuVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbmJlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG51bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbiJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiB0aGVcbmV4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbnByb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxucmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG5mcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG5ub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG5cbklmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICJ0cnkiXG5jbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgYW5cbmV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG5leGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgSWZcbnRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAiZmluYWxseSJcbmNsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuaXMgZGlzY2FyZGVkOlxuXG4gICA+Pj4gZGVmIGYoKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgMS8wXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gNDJcbiAgIC4uLlxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuXG5XaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4idHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgaXNcbmFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgaW5cbnRoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbnN0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlIHRoZVxubGFzdCBvbmUgZXhlY3V0ZWQ6XG5cbiAgID4+PiBkZWYgZm9vKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ3RyeVwnXG4gICAuLi4gICAgIGZpbmFsbHk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdmaW5hbGx5XCdcbiAgIC4uLlxuICAgPj4+IGZvbygpXG4gICBcJ2ZpbmFsbHlcJ1xuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uICJ0cnkiLi4uImV4Y2VwdCIuLi4iZmluYWxseSJcbnVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSAid2l0aCIgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICJ3aXRoX2l0ZW0iKVxuICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cblxuMi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4gICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyBiZVxuICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCB0aHJlZVxuICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyByZXJhaXNlZC5cbiAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4gICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIlxuICAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuXG4gICB3aXRoIEEoKSBhcyBhLCBCKCkgYXMgYjpcbiAgICAgICBzdWl0ZVxuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIHdpdGggQSgpIGFzIGE6XG4gICAgICAgd2l0aCBCKCkgYXMgYjpcbiAgICAgICAgICAgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286ICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG5cblxuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZnVuY2RlZiAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4gICBkZWNvcmF0b3JzICAgICA6Oj0gZGVjb3JhdG9yK1xuICAgZGVjb3JhdG9yICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiIFthcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgIHwgIioiIFtwYXJhbWV0ZXJdICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiAiKioiIHBhcmFtZXRlcl1cbiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgZGVmIGZ1bmMoKTogcGFzc1xuICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG5cbldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICphcmd1bWVudCogbWF5XG5iZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3MgZGVmYXVsdCB2YWx1ZSBpc1xuc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG5wYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXNcbmlzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiB0aGVcbmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzXG5ldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgInByZS1cbmNvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50XG50byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGFcbmxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieVxuYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLlxuVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgdG8gdXNlXG4iTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZVxuZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuIiIqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueVxuZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGVcbmZvcm0gIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlXG5rZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG5cblBhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiBmb2xsb3dpbmdcbnRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuIHRob3NlXG5vZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSBoYXZlXG4icmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSBwYXJhbWV0ZXJcbmxpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCBhcmVcbmV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgbWF5XG5iZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuXG5UaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc1wnIG5hbWVzIGluIHRoZSAiX19hbm5vdGF0aW9uc19fIlxuYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhXG5leHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247XG5hIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvclxuYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGFcbmV4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXRcbmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIiZGVmIiJcbnN0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWRcbmluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuXG4gICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cblxuXG5DbGFzcyBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT1cblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2FyZ3VtZW50X2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlIGxpc3RcbnVzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlICpDdXN0b21pemluZyBjbGFzcyBjcmVhdGlvbipcbmZvciBtb3JlIGFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkIGV2YWx1YXRlIHRvIGFcbmNsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gaW5oZXJpdGFuY2Vcbmxpc3QgaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG5cbiAgIGNsYXNzIEZvbzpcbiAgICAgICBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vKG9iamVjdCk6XG4gICAgICAgcGFzc1xuXG5UaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgKHNlZVxuKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWwgbmFtZXNwYWNlIGFuZCB0aGVcbm9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG5mdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlcyBleGVjdXRpb24sIGl0c1xuZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzRdIEFcbmNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSBiYXNlXG5jbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnkuXG5UaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWxcbm5hbWVzcGFjZS5cblxuQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyAqbWV0YWNsYXNzZXMqLlxuXG5DbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyBmdW5jdGlvbnMsXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGNsYXNzIEZvbzogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbzogcGFzc1xuICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuXG5UaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yXG5mdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCBpcyB0aGVuXG5ib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgYXR0cmlidXRlc1xuY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZFxuaW5zdGFuY2UgYXR0cmlidXRlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvbiAiInNlbGYubmFtZSIiLFxuYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lIG5hbWVcbndoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzIGRlZmF1bHRzXG5mb3IgaW5zdGFuY2UgYXR0cmlidXRlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhbiBsZWFkIHRvXG51bmV4cGVjdGVkIHJlc3VsdHMuICAqRGVzY3JpcHRvcnMqIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuICBDbGFzcyBEZWNvcmF0b3JzXG5cblxuQ29yb3V0aW5lc1xuPT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAzLjUuXG5cblxuQ29yb3V0aW5lIGZ1bmN0aW9uIGRlZmluaXRpb25cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgIGFzeW5jX2Z1bmNkZWYgOjo9IFtkZWNvcmF0b3JzXSAiYXN5bmMiICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcblxuRXhlY3V0aW9uIG9mIFB5dGhvbiBjb3JvdXRpbmVzIGNhbiBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQgYXQgbWFueVxucG9pbnRzIChzZWUgKmNvcm91dGluZSopLiAgSW4gdGhlIGJvZHkgb2YgYSBjb3JvdXRpbmUsIGFueSAiYXdhaXQiIGFuZFxuImFzeW5jIiBpZGVudGlmaWVycyBiZWNvbWUgcmVzZXJ2ZWQga2V5d29yZHM7ICJhd2FpdCIgZXhwcmVzc2lvbnMsXG4iYXN5bmMgZm9yIiBhbmQgImFzeW5jIHdpdGgiIGNhbiBvbmx5IGJlIHVzZWQgaW4gY29yb3V0aW5lIGJvZGllcy5cblxuRnVuY3Rpb25zIGRlZmluZWQgd2l0aCAiYXN5bmMgZGVmIiBzeW50YXggYXJlIGFsd2F5cyBjb3JvdXRpbmVcbmZ1bmN0aW9ucywgZXZlbiBpZiB0aGV5IGRvIG5vdCBjb250YWluICJhd2FpdCIgb3IgImFzeW5jIiBrZXl3b3Jkcy5cblxuSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAieWllbGQiIGV4cHJlc3Npb25zIGluICJhc3luYyBkZWYiXG5jb3JvdXRpbmVzLlxuXG5BbiBleGFtcGxlIG9mIGEgY29yb3V0aW5lIGZ1bmN0aW9uOlxuXG4gICBhc3luYyBkZWYgZnVuYyhwYXJhbTEsIHBhcmFtMik6XG4gICAgICAgZG9fc3R1ZmYoKVxuICAgICAgIGF3YWl0IHNvbWVfY29yb3V0aW5lKClcblxuXG5UaGUgImFzeW5jIGZvciIgc3RhdGVtZW50XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgIGFzeW5jX2Zvcl9zdG10IDo6PSAiYXN5bmMiIGZvcl9zdG10XG5cbkFuICphc3luY2hyb25vdXMgaXRlcmFibGUqIGlzIGFibGUgdG8gY2FsbCBhc3luY2hyb25vdXMgY29kZSBpbiBpdHNcbippdGVyKiBpbXBsZW1lbnRhdGlvbiwgYW5kICphc3luY2hyb25vdXMgaXRlcmF0b3IqIGNhbiBjYWxsXG5hc3luY2hyb25vdXMgY29kZSBpbiBpdHMgKm5leHQqIG1ldGhvZC5cblxuVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudCBhbGxvd3MgY29udmVuaWVudCBpdGVyYXRpb24gb3ZlclxuYXN5bmNocm9ub3VzIGl0ZXJhdG9ycy5cblxuVGhlIGZvbGxvd2luZyBjb2RlOlxuXG4gICBhc3luYyBmb3IgVEFSR0VUIGluIElURVI6XG4gICAgICAgQkxPQ0tcbiAgIGVsc2U6XG4gICAgICAgQkxPQ0syXG5cbklzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOlxuXG4gICBpdGVyID0gKElURVIpXG4gICBpdGVyID0gdHlwZShpdGVyKS5fX2FpdGVyX18oaXRlcilcbiAgIHJ1bm5pbmcgPSBUcnVlXG4gICB3aGlsZSBydW5uaW5nOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgVEFSR0VUID0gYXdhaXQgdHlwZShpdGVyKS5fX2FuZXh0X18oaXRlcilcbiAgICAgICBleGNlcHQgU3RvcEFzeW5jSXRlcmF0aW9uOlxuICAgICAgICAgICBydW5uaW5nID0gRmFsc2VcbiAgICAgICBlbHNlOlxuICAgICAgICAgICBCTE9DS1xuICAgZWxzZTpcbiAgICAgICBCTE9DSzJcblxuU2VlIGFsc28gIl9fYWl0ZXJfXygpIiBhbmQgIl9fYW5leHRfXygpIiBmb3IgZGV0YWlscy5cblxuSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhblxuImFzeW5jIGRlZiIgZnVuY3Rpb24uXG5cblxuVGhlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnRcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgIGFzeW5jX3dpdGhfc3RtdCA6Oj0gImFzeW5jIiB3aXRoX3N0bXRcblxuQW4gKmFzeW5jaHJvbm91cyBjb250ZXh0IG1hbmFnZXIqIGlzIGEgKmNvbnRleHQgbWFuYWdlciogdGhhdCBpcyBhYmxlXG50byBzdXNwZW5kIGV4ZWN1dGlvbiBpbiBpdHMgKmVudGVyKiBhbmQgKmV4aXQqIG1ldGhvZHMuXG5cblRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgYXN5bmMgd2l0aCBFWFBSIGFzIFZBUjpcbiAgICAgICBCTE9DS1xuXG5JcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcblxuICAgbWdyID0gKEVYUFIpXG4gICBhZXhpdCA9IHR5cGUobWdyKS5fX2FleGl0X19cbiAgIGFlbnRlciA9IHR5cGUobWdyKS5fX2FlbnRlcl9fKG1ncilcbiAgIGV4YyA9IFRydWVcblxuICAgVkFSID0gYXdhaXQgYWVudGVyXG4gICB0cnk6XG4gICAgICAgQkxPQ0tcbiAgIGV4Y2VwdDpcbiAgICAgICBpZiBub3QgYXdhaXQgYWV4aXQobWdyLCAqc3lzLmV4Y19pbmZvKCkpOlxuICAgICAgICAgICByYWlzZVxuICAgZWxzZTpcbiAgICAgICBhd2FpdCBhZXhpdChtZ3IsIE5vbmUsIE5vbmUsIE5vbmUpXG5cblNlZSBhbHNvICJfX2FlbnRlcl9fKCkiIGFuZCAiX19hZXhpdF9fKCkiIGZvciBkZXRhaWxzLlxuXG5JdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiBhblxuImFzeW5jIGRlZiIgZnVuY3Rpb24uXG5cblNlZSBhbHNvOiAqKlBFUCA0OTIqKiAtIENvcm91dGluZXMgd2l0aCBhc3luYyBhbmQgYXdhaXQgc3ludGF4XG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBpbnZvY2F0aW9uIHN0YWNrIHVubGVzc1xuICAgIHRoZXJlIGlzIGEgImZpbmFsbHkiIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXJcbiAgICBleGNlcHRpb24uIFRoYXQgbmV3IGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9sZCBvbmUgdG8gYmUgbG9zdC5cblxuWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZlxuICAgIGFuIGV4Y2VwdGlvbiBvciB0aGUgZXhlY3V0aW9uIG9mIGEgInJldHVybiIsICJjb250aW51ZSIsIG9yXG4gICAgImJyZWFrIiBzdGF0ZW1lbnQuXG5cblszXSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZVxuICAgIGZ1bmN0aW9uIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgIl9fZG9jX18iXG4gICAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uXCdzICpkb2NzdHJpbmcqLlxuXG5bNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3NcbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyAiX19kb2NfXyIgaXRlbSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzXCdzICpkb2NzdHJpbmcqLlxuJywKLSAnY29udGV4dC1tYW5hZ2Vycyc6IHUnXG5XaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0IG1hbmFnZXJcbmhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lIGNvbnRleHRcbmZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmUgbm9ybWFsbHlcbmludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uICpUaGUgd2l0aFxuc3RhdGVtZW50KiksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyIG1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICJ3aXRoIlxuICAgc3RhdGVtZW50IHdpbGwgYmluZCB0aGlzIG1ldGhvZFwncyByZXR1cm4gdmFsdWUgdG8gdGhlIHRhcmdldChzKVxuICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlICJOb25lIi5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSBwYXNzZWQtaW5cbiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyXCdzIHJlc3BvbnNpYmlsaXR5LlxuXG5TZWUgYWxzbzogKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cbicsCi0gJ2NvbnRpbnVlJzogdSdcblRoZSAiY29udGludWUiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGNvbnRpbnVlX3N0bXQgOjo9ICJjb250aW51ZSJcblxuImNvbnRpbnVlIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSJcbmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiBvciAiZmluYWxseSJcbmNsYXVzZSB3aXRoaW4gdGhhdCBsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUgb2YgdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBsb29wLlxuXG5XaGVuICJjb250aW51ZSIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYVxuImZpbmFsbHkiIGNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAotICdjb252ZXJzaW9ucyc6IHUnXG5Bcml0aG1ldGljIGNvbnZlcnNpb25zXG4qKioqKioqKioqKioqKioqKioqKioqXG5cbldoZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlIHBocmFzZVxuInRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIiB0aGlzIG1lYW5zXG50aGF0IHRoZSBvcGVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVpbHQtaW4gdHlwZXMgd29ya3MgYXMgZm9sbG93czpcblxuKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0b1xuICBjb21wbGV4O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCB0aGVcbiAgb3RoZXIgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50O1xuXG4qIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS5cblxuU29tZSBhZGRpdGlvbmFsIHJ1bGVzIGFwcGx5IGZvciBjZXJ0YWluIG9wZXJhdG9ycyAoZS5nLiwgYSBzdHJpbmcgYXMgYVxubGVmdCBhcmd1bWVudCB0byB0aGUgXCclXCcgb3BlcmF0b3IpLiAgRXh0ZW5zaW9ucyBtdXN0IGRlZmluZSB0aGVpciBvd25cbmNvbnZlcnNpb24gYmVoYXZpb3IuXG4nLAotICdjdXN0b21pemF0aW9uJzogdSdcbkJhc2ljIGN1c3RvbWl6YXRpb25cbioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICJfX25ld19fKCkiIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseSBhblxuICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuXG4gICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5XG4gICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbiAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICJfX25ld19fKCkiLlxuXG4gICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGVcbiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXRcbiAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gb3JkZXIgdG9cbiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cblxub2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuXG4gICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICJfX25ld19fKCkiKSwgYnV0XG4gICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlXG4gICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuXG4gICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgbWV0aG9kLCBpZlxuICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mIHRoZVxuICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuXG4gICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiBjb25zdHJ1Y3RpbmdcbiAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byBjdXN0b21pc2VcbiAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyBkb2luZyBzb1xuICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiIG1ldGhvZCwgdGhlXG4gICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdFxuICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZS5cbiAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciB0aGVcbiAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnlcbiAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCBhIGxhdGVyXG4gICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0XG4gICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSB0aGUgZm9ybWVyXG4gICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXIgaXNcbiAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWUgY29tbW9uXG4gICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuIG9iamVjdCBmcm9tXG4gICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIG9iamVjdHMgKGUuZy4sXG4gICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoIHBhcmVudCBhbmRcbiAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSBvZlxuICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhIHJlZmVyZW5jZVxuICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiB1bmhhbmRsZWRcbiAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvIHRoZVxuICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSB0aGlyZCBjYW5cbiAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkIHVwIHdoZW4gdGhlXG4gICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KS4gUmVmZXJcbiAgICAgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZ2MiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICBhYm91dCB0aGlzIHRvcGljLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaFxuICAgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nXG4gICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkIHRvXG4gICAgICJzeXMuc3RkZXJyIiBpbnN0ZWFkLiBBbHNvLCB3aGVuICJfX2RlbF9fKCkiIGlzIGludm9rZWQgaW5cbiAgICAgcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmcgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlXG4gICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgIl9fZGVsX18oKSJcbiAgICAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nXG4gICAgIHRvcm4gZG93biAoZS5nLiB0aGUgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gIEZvciB0aGlzXG4gICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkXG4gICAgIHRvIG1haW50YWluIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LFxuICAgICBQeXRob24gZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSAicmVwcigpIiBidWlsdC1pbiBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzXG4gICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvXG4gICByZWNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGVcbiAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybVxuICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gVGhlIHJldHVyblxuICAgdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyAiX19yZXByX18oKSIgYnV0XG4gICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZm9ybWF0KCkiIGFuZFxuICAgInByaW50KCkiIHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgb3IgbmljZWx5IHByaW50YWJsZSBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICpzdHJpbmcqXG4gICBvYmplY3QuXG5cbiAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgdGhlcmUgaXMgbm9cbiAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGFcbiAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuXG4gICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICJvYmplY3QiXG4gICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuXG5vYmplY3QuX19ieXRlc19fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuXG5vYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcblxuICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uIChhbmQgYnkgZXh0ZW5zaW9uLCB0aGVcbiAgICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBvZiBjbGFzcyAic3RyIikgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhXG4gICBzdHJpbmcgdGhhdCBjb250YWlucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnNcbiAgIGRlc2lyZWQuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0b1xuICAgdGhlIHR5cGUgaW1wbGVtZW50aW5nICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsXG4gICBlaXRoZXIgZGVsZWdhdGUgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYVxuICAgc2ltaWxhciBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG5cbiAgIFNlZSAqRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlXG4gICBzdGFuZGFyZCBmb3JtYXR0aW5nIHN5bnRheC5cblxuICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiIGl0c2VsZlxuICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAieC5fX2xlX18oeSkiLFxuICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAieD55IiBjYWxsc1xuICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuXG4gICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICJOb3RJbXBsZW1lbnRlZCJcbiAgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIHBhaXIgb2ZcbiAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCBmb3IgYVxuICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gYW55IHZhbHVlLFxuICAgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhIEJvb2xlYW4gY29udGV4dCAoZS5nLixcbiAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICJib29sKCkiXG4gICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgQnkgZGVmYXVsdCwgIl9fbmVfXygpIiBkZWxlZ2F0ZXMgdG8gIl9fZXFfXygpIiBhbmQgaW52ZXJ0cyB0aGVcbiAgIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4gIFRoZXJlIGFyZSBubyBvdGhlciBpbXBsaWVkXG4gICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yIGV4YW1wbGUsIHRoZVxuICAgdHJ1dGggb2YgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gYXV0b21hdGljYWxseVxuICAgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3Qgb3BlcmF0aW9uLCBzZWVcbiAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG5cbiAgIFNlZSB0aGUgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyByZWZsZWN0aW9uLFxuICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiBJZiB0aGVcbiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYVxuICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgdHlwZSwgdGhlXG4gICByZWZsZWN0ZWQgbWV0aG9kIG9mIHRoZSByaWdodCBvcGVyYW5kIGhhcyBwcmlvcml0eSwgb3RoZXJ3aXNlIHRoZVxuICAgbGVmdCBvcGVyYW5kXCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nIGlzIG5vdFxuICAgY29uc2lkZXJlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgb24gbWVtYmVyc1xuICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAiZGljdCIuXG4gICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgcmVxdWlyZWQgcHJvcGVydHlcbiAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZTsgaXQgaXNcbiAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaFxuICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgcGFydCBpblxuICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gb2JqZWN0XCdzXG4gICAgIGN1c3RvbSAiX19oYXNoX18oKSIgbWV0aG9kIHRvIHRoZSBzaXplIG9mIGEgIlB5X3NzaXplX3QiLiAgVGhpc1xuICAgICBpcyB0eXBpY2FsbHkgOCBieXRlcyBvbiA2NC1iaXQgYnVpbGRzIGFuZCA0IGJ5dGVzIG9uIDMyLWJpdFxuICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0IGludGVyb3BlcmF0ZSBvbiBidWlsZHNcbiAgICAgb2YgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gYWxsXG4gICAgIHN1cHBvcnRlZCBidWlsZHMuICBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzIHdpdGggInB5dGhvbiAtY1xuICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgc2hvdWxkIG5vdFxuICAgZGVmaW5lIGEgIl9faGFzaF9fKCkiIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0IGRlZmluZXMgIl9fZXFfXygpIlxuICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGl0ZW1zIGluXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kXG4gICBpbXBsZW1lbnRzIGFuICJfX2VxX18oKSIgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudFxuICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgY29sbGVjdGlvbnNcbiAgIHJlcXVpcmVzIHRoYXQgYSBrZXlcJ3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiBtZXRob2RzIGJ5XG4gICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHZhbHVlIHN1Y2hcbiAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09IGhhc2goeSkiLlxuXG4gICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAiX19oYXNoX18oKSJcbiAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gIFdoZW4gdGhlXG4gICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzXG4gICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvXG4gICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSBpbnRlcnByZXRlclxuICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4gICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvIHN1cHByZXNzXG4gICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSBjbGFzc1xuICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiIHRoYXRcbiAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiIGNhbGwuXG5cbiAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgYW5kXG4gICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSByYW5kb20gdmFsdWUuXG4gICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsIFB5dGhvblxuICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZlxuICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbC1cbiAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZVxuICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSBjb21wbGV4aXR5LlxuICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiBvcmRlciBvZlxuICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgZ3VhcmFudGVlc1xuICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuIDMyLWJpdCBhbmRcbiAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC5cblxub2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdFxuICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicsCi0gJ2RlYnVnZ2VyJzogdSdcbiJwZGIiIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qKlNvdXJjZSBjb2RlOioqIExpYi9wZGIucHlcblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgbW9kdWxlICJwZGIiIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yXG5QeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kXG5zaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcyxcbnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGVcbmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmdcbmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cblxuVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0gaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgY2xhc3NcbiJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5IHJlYWRpbmdcbnRoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzICJiZGIiIGFuZCAiY21kIi5cblxuVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyAiKFBkYikiLiBUeXBpY2FsIHVzYWdlIHRvIHJ1biBhIHByb2dyYW0gdW5kZXJcbmNvbnRyb2wgb2YgdGhlIGRlYnVnZ2VyIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IHBkYi5ydW4oXCdteW1vZHVsZS50ZXN0KClcJylcbiAgID4gPHN0cmluZz4oMCk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgTmFtZUVycm9yOiBcJ3NwYW1cJ1xuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYilcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSBpc1xuYXZhaWxhYmxlIGZvciBjb21tYW5kcyBhbmQgY29tbWFuZCBhcmd1bWVudHMsIGUuZy4gdGhlIGN1cnJlbnQgZ2xvYmFsXG5hbmQgbG9jYWwgbmFtZXMgYXJlIG9mZmVyZWQgYXMgYXJndW1lbnRzIG9mIHRoZSAicCIgY29tbWFuZC5cblxuInBkYi5weSIgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciBzY3JpcHRzLiAgRm9yXG5leGFtcGxlOlxuXG4gICBweXRob24zIC1tIHBkYiBteXNjcmlwdC5weVxuXG5XaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgcG9zdC1tb3J0ZW1cbmRlYnVnZ2luZyBpZiB0aGUgcHJvZ3JhbSBiZWluZyBkZWJ1Z2dlZCBleGl0cyBhYm5vcm1hbGx5LiAgQWZ0ZXIgcG9zdC1cbm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGxcbnJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiXCdzIHN0YXRlIChzdWNoXG5hcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGVcbmRlYnVnZ2VyIHVwb24gcHJvZ3JhbVwncyBleGl0LlxuXG5OZXcgaW4gdmVyc2lvbiAzLjI6ICJwZGIucHkiIG5vdyBhY2NlcHRzIGEgIi1jIiBvcHRpb24gdGhhdCBleGVjdXRlc1xuY29tbWFuZHMgYXMgaWYgZ2l2ZW4gaW4gYSAiLnBkYnJjIiBmaWxlLCBzZWUgKkRlYnVnZ2VyIENvbW1hbmRzKi5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpc1xudG8gaW5zZXJ0XG5cbiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuXG5hdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuIHRoZW5cbnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nXG53aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIiBjb21tYW5kLlxuXG5UaGUgdHlwaWNhbCB1c2FnZSB0byBpbnNwZWN0IGEgY3Jhc2hlZCBwcm9ncmFtIGlzOlxuXG4gICA+Pj4gaW1wb3J0IHBkYlxuICAgPj4+IGltcG9ydCBteW1vZHVsZVxuICAgPj4+IG15bW9kdWxlLnRlc3QoKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/XG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3RcbiAgICAgICB0ZXN0MigpXG4gICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDMsIGluIHRlc3QyXG4gICAgICAgcHJpbnQoc3BhbSlcbiAgIE5hbWVFcnJvcjogc3BhbVxuICAgPj4+IHBkYi5wbSgpXG4gICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4gICAtPiBwcmludChzcGFtKVxuICAgKFBkYilcblxuVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXJcbmluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcblxucGRiLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KSB1bmRlclxuICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXNcbiAgIGV4ZWN1dGVkOyB5b3UgY2FuIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSAiY29udGludWUiLCBvciB5b3UgY2FuXG4gICBzdGVwIHRocm91Z2ggdGhlIHN0YXRlbWVudCB1c2luZyAic3RlcCIgb3IgIm5leHQiIChhbGwgdGhlc2VcbiAgIGNvbW1hbmRzIGFyZSBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscypcbiAgIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnlcbiAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAoU2VlIHRoZVxuICAgZXhwbGFuYXRpb24gb2YgdGhlIGJ1aWx0LWluICJleGVjKCkiIG9yICJldmFsKCkiIGZ1bmN0aW9ucy4pXG5cbnBkYi5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpXG4gICB1bmRlciBkZWJ1Z2dlciBjb250cm9sLiAgV2hlbiAicnVuZXZhbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zIHRoZVxuICAgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvXG4gICAicnVuKCkiLlxuXG5wZGIucnVuY2FsbChmdW5jdGlvbiwgKmFyZ3MsICoqa3dkcylcblxuICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpXG4gICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuICJydW5jYWxsKCkiIHJldHVybnMsIGl0IHJldHVybnNcbiAgIHdoYXRldmVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybmVkLiAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzXG4gICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLlxuXG5wZGIuc2V0X3RyYWNlKClcblxuICAgRW50ZXIgdGhlIGRlYnVnZ2VyIGF0IHRoZSBjYWxsaW5nIHN0YWNrIGZyYW1lLiAgVGhpcyBpcyB1c2VmdWwgdG9cbiAgIGhhcmQtY29kZSBhIGJyZWFrcG9pbnQgYXQgYSBnaXZlbiBwb2ludCBpbiBhIHByb2dyYW0sIGV2ZW4gaWYgdGhlXG4gICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb25cbiAgIGZhaWxzKS5cblxucGRiLnBvc3RfbW9ydGVtKHRyYWNlYmFjaz1Ob25lKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIGdpdmVuICp0cmFjZWJhY2sqIG9iamVjdC4gIElmIG5vXG4gICAqdHJhY2ViYWNrKiBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgb25lIG9mIHRoZSBleGNlcHRpb24gdGhhdCBpc1xuICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgaWYgdGhlXG4gICBkZWZhdWx0IGlzIHRvIGJlIHVzZWQpLlxuXG5wZGIucG0oKVxuXG4gICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpblxuICAgInN5cy5sYXN0X3RyYWNlYmFjayIuXG5cblRoZSAicnVuKiIgZnVuY3Rpb25zIGFuZCAic2V0X3RyYWNlKCkiIGFyZSBhbGlhc2VzIGZvciBpbnN0YW50aWF0aW5nXG50aGUgIlBkYiIgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiAgSWYgeW91IHdhbnRcbnRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzIHlvdXJzZWxmOlxuXG5jbGFzcyBjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PVwndGFiXCcsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBza2lwPU5vbmUsIG5vc2lnaW50PUZhbHNlKVxuXG4gICAiUGRiIiBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG5cbiAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGVcbiAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLlxuXG4gICBUaGUgKnNraXAqIGFyZ3VtZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBnbG9iLXN0eWxlXG4gICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzIHRoYXRcbiAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiBbMV1cblxuICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggaXMgc2VudFxuICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzICJDdHJsLUMiIG9uIHRoZSBjb25zb2xlKSB3aGVuIHlvdSBnaXZlIGFcbiAgICJjb250aW51ZSIgY29tbWFuZC4gVGhpcyBhbGxvd3MgeW91IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyXG4gICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybC1DIi4gIElmIHlvdSB3YW50IFBkYiBub3QgdG8gdG91Y2ggdGhlXG4gICBTSUdJTlQgaGFuZGxlciwgc2V0ICpub3NpZ2ludCogdG90IHRydWUuXG5cbiAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjpcblxuICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVtcJ2RqYW5nby4qXCddKS5zZXRfdHJhY2UoKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjE6IFRoZSAqc2tpcCogYXJndW1lbnQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICpub3NpZ2ludCogYXJndW1lbnQuICBQcmV2aW91c2x5LCBhIFNJR0lOVFxuICAgaGFuZGxlciB3YXMgbmV2ZXIgc2V0IGJ5IFBkYi5cblxuICAgcnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbiAgIHJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbiAgIHJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4gICBzZXRfdHJhY2UoKVxuXG4gICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuXG5cbkRlYnVnZ2VyIENvbW1hbmRzXG49PT09PT09PT09PT09PT09PVxuXG5UaGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGVidWdnZXIgYXJlIGxpc3RlZCBiZWxvdy4gIE1vc3RcbmNvbW1hbmRzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBvbmUgb3IgdHdvIGxldHRlcnMgYXMgaW5kaWNhdGVkOyBlLmcuXG4iaChlbHApIiBtZWFucyB0aGF0IGVpdGhlciAiaCIgb3IgImhlbHAiIGNhbiBiZSB1c2VkIHRvIGVudGVyIHRoZSBoZWxwXG5jb21tYW5kIChidXQgbm90ICJoZSIgb3IgImhlbCIsIG5vciAiSCIgb3IgIkhlbHAiIG9yICJIRUxQIikuXG5Bcmd1bWVudHMgdG8gY29tbWFuZHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSAoc3BhY2VzIG9yXG50YWJzKS4gIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzICgiW10iKSBpblxudGhlIGNvbW1hbmQgc3ludGF4OyB0aGUgc3F1YXJlIGJyYWNrZXRzIG11c3Qgbm90IGJlIHR5cGVkLlxuQWx0ZXJuYXRpdmVzIGluIHRoZSBjb21tYW5kIHN5bnRheCBhcmUgc2VwYXJhdGVkIGJ5IGEgdmVydGljYWwgYmFyXG4oInwiKS5cblxuRW50ZXJpbmcgYSBibGFuayBsaW5lIHJlcGVhdHMgdGhlIGxhc3QgY29tbWFuZCBlbnRlcmVkLiAgRXhjZXB0aW9uOiBpZlxudGhlIGxhc3QgY29tbWFuZCB3YXMgYSAibGlzdCIgY29tbWFuZCwgdGhlIG5leHQgMTEgbGluZXMgYXJlIGxpc3RlZC5cblxuQ29tbWFuZHMgdGhhdCB0aGUgZGVidWdnZXIgZG9lc25cJ3QgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlIFB5dGhvblxuc3RhdGVtZW50cyBhbmQgYXJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ncmFtIGJlaW5nXG5kZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gZXhjbGFtYXRpb25cbnBvaW50ICgiISIpLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtIGJlaW5nXG5kZWJ1Z2dlZDsgaXQgaXMgZXZlbiBwb3NzaWJsZSB0byBjaGFuZ2UgYSB2YXJpYWJsZSBvciBjYWxsIGEgZnVuY3Rpb24uXG5XaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gc3VjaCBhIHN0YXRlbWVudCwgdGhlIGV4Y2VwdGlvbiBuYW1lIGlzXG5wcmludGVkIGJ1dCB0aGUgZGVidWdnZXJcJ3Mgc3RhdGUgaXMgbm90IGNoYW5nZWQuXG5cblRoZSBkZWJ1Z2dlciBzdXBwb3J0cyAqYWxpYXNlcyouICBBbGlhc2VzIGNhbiBoYXZlIHBhcmFtZXRlcnMgd2hpY2hcbmFsbG93cyBvbmUgYSBjZXJ0YWluIGxldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlclxuZXhhbWluYXRpb24uXG5cbk11bHRpcGxlIGNvbW1hbmRzIG1heSBiZSBlbnRlcmVkIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieSAiOzsiLlxuKEEgc2luZ2xlICI7IiBpcyBub3QgdXNlZCBhcyBpdCBpcyB0aGUgc2VwYXJhdG9yIGZvciBtdWx0aXBsZSBjb21tYW5kc1xuaW4gYSBsaW5lIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBQeXRob24gcGFyc2VyLikgIE5vIGludGVsbGlnZW5jZSBpc1xuYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlIGlucHV0IGlzIHNwbGl0IGF0IHRoZSBmaXJzdFxuIjs7IiBwYWlyLCBldmVuIGlmIGl0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSBxdW90ZWQgc3RyaW5nLlxuXG5JZiBhIGZpbGUgIi5wZGJyYyIgZXhpc3RzIGluIHRoZSB1c2VyXCdzIGhvbWUgZGlyZWN0b3J5IG9yIGluIHRoZVxuY3VycmVudCBkaXJlY3RvcnksIGl0IGlzIHJlYWQgaW4gYW5kIGV4ZWN1dGVkIGFzIGlmIGl0IGhhZCBiZWVuIHR5cGVkXG5hdCB0aGUgZGVidWdnZXIgcHJvbXB0LiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBhbGlhc2VzLiAgSWZcbmJvdGggZmlsZXMgZXhpc3QsIHRoZSBvbmUgaW4gdGhlIGhvbWUgZGlyZWN0b3J5IGlzIHJlYWQgZmlyc3QgYW5kXG5hbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjI6ICIucGRicmMiIGNhbiBub3cgY29udGFpbiBjb21tYW5kcyB0aGF0XG5jb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCB0aGVzZVxuY29tbWFuZHMgaGFkIG5vIGVmZmVjdC5cblxuaChlbHApIFtjb21tYW5kXVxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuICBXaXRoIGFcbiAgICpjb21tYW5kKiBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQuICAiaGVscCBwZGIiXG4gICBkaXNwbGF5cyB0aGUgZnVsbCBkb2N1bWVudGF0aW9uICh0aGUgZG9jc3RyaW5nIG9mIHRoZSAicGRiIlxuICAgbW9kdWxlKS4gIFNpbmNlIHRoZSAqY29tbWFuZCogYXJndW1lbnQgbXVzdCBiZSBhbiBpZGVudGlmaWVyLCAiaGVscFxuICAgZXhlYyIgbXVzdCBiZSBlbnRlcmVkIHRvIGdldCBoZWxwIG9uIHRoZSAiISIgY29tbWFuZC5cblxudyhoZXJlKVxuXG4gICBQcmludCBhIHN0YWNrIHRyYWNlLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBmcmFtZSBhdCB0aGUgYm90dG9tLiAgQW5cbiAgIGFycm93IGluZGljYXRlcyB0aGUgY3VycmVudCBmcmFtZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgY29udGV4dCBvZlxuICAgbW9zdCBjb21tYW5kcy5cblxuZChvd24pIFtjb3VudF1cblxuICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIGRvd24gaW4gdGhlXG4gICBzdGFjayB0cmFjZSAodG8gYSBuZXdlciBmcmFtZSkuXG5cbnUocCkgW2NvdW50XVxuXG4gICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgdXAgaW4gdGhlIHN0YWNrXG4gICB0cmFjZSAodG8gYW4gb2xkZXIgZnJhbWUpLlxuXG5iKHJlYWspIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cblxuICAgV2l0aCBhICpsaW5lbm8qIGFyZ3VtZW50LCBzZXQgYSBicmVhayB0aGVyZSBpbiB0aGUgY3VycmVudCBmaWxlLlxuICAgV2l0aCBhICpmdW5jdGlvbiogYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCBleGVjdXRhYmxlXG4gICBzdGF0ZW1lbnQgd2l0aGluIHRoYXQgZnVuY3Rpb24uICBUaGUgbGluZSBudW1iZXIgbWF5IGJlIHByZWZpeGVkXG4gICB3aXRoIGEgZmlsZW5hbWUgYW5kIGEgY29sb24sIHRvIHNwZWNpZnkgYSBicmVha3BvaW50IGluIGFub3RoZXJcbiAgIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0IGhhc25cJ3QgYmVlbiBsb2FkZWQgeWV0KS4gIFRoZSBmaWxlIGlzXG4gICBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLiAgTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyBhc3NpZ25lZCBhXG4gICBudW1iZXIgdG8gd2hpY2ggYWxsIHRoZSBvdGhlciBicmVha3BvaW50IGNvbW1hbmRzIHJlZmVyLlxuXG4gICBJZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhbiBleHByZXNzaW9uIHdoaWNoIG11c3RcbiAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuXG5cbiAgIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcywgaW5jbHVkaW5nIGZvciBlYWNoIGJyZWFrcG9pbnQsXG4gICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQsIHRoZSBjdXJyZW50XG4gICBpZ25vcmUgY291bnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaWYgYW55LlxuXG50YnJlYWsgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuXG4gICBUZW1wb3JhcnkgYnJlYWtwb2ludCwgd2hpY2ggaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgaXNcbiAgIGZpcnN0IGhpdC4gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yICJicmVhayIuXG5cbmNsKGVhcikgW2ZpbGVuYW1lOmxpbmVubyB8IGJwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBXaXRoIGEgKmZpbGVuYW1lOmxpbmVubyogYXJndW1lbnQsIGNsZWFyIGFsbCB0aGUgYnJlYWtwb2ludHMgYXRcbiAgIHRoaXMgbGluZS4gV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXJcbiAgIHRob3NlIGJyZWFrcG9pbnRzLiBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQgZmlyc3RcbiAgIGFzayBjb25maXJtYXRpb24pLlxuXG5kaXNhYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgRGlzYWJsZSB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZlxuICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgY2F1c2VcbiAgIHRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLCBidXQgdW5saWtlIGNsZWFyaW5nIGEgYnJlYWtwb2ludCwgaXRcbiAgIHJlbWFpbnMgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMgYW5kIGNhbiBiZSAocmUtKWVuYWJsZWQuXG5cbmVuYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIEVuYWJsZSB0aGUgYnJlYWtwb2ludHMgc3BlY2lmaWVkLlxuXG5pZ25vcmUgYnBudW1iZXIgW2NvdW50XVxuXG4gICBTZXQgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgSWYgY291bnQgaXNcbiAgIG9taXR0ZWQsIHRoZSBpZ25vcmUgY291bnQgaXMgc2V0IHRvIDAuICBBIGJyZWFrcG9pbnQgYmVjb21lcyBhY3RpdmVcbiAgIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywgdGhlIGNvdW50IGlzXG4gICBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCBhbmQgdGhlIGJyZWFrcG9pbnRcbiAgIGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLlxuXG5jb25kaXRpb24gYnBudW1iZXIgW2NvbmRpdGlvbl1cblxuICAgU2V0IGEgbmV3ICpjb25kaXRpb24qIGZvciB0aGUgYnJlYWtwb2ludCwgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0XG4gICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLiAgSWYgKmNvbmRpdGlvbipcbiAgIGlzIGFic2VudCwgYW55IGV4aXN0aW5nIGNvbmRpdGlvbiBpcyByZW1vdmVkOyBpLmUuLCB0aGUgYnJlYWtwb2ludFxuICAgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLlxuXG5jb21tYW5kcyBbYnBudW1iZXJdXG5cbiAgIFNwZWNpZnkgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciBicmVha3BvaW50IG51bWJlciAqYnBudW1iZXIqLiAgVGhlXG4gICBjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmVcbiAgIGNvbnRhaW5pbmcganVzdCAiZW5kIiB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLiBBbiBleGFtcGxlOlxuXG4gICAgICAoUGRiKSBjb21tYW5kcyAxXG4gICAgICAoY29tKSBwIHNvbWVfdmFyaWFibGVcbiAgICAgIChjb20pIGVuZFxuICAgICAgKFBkYilcblxuICAgVG8gcmVtb3ZlIGFsbCBjb21tYW5kcyBmcm9tIGEgYnJlYWtwb2ludCwgdHlwZSBjb21tYW5kcyBhbmQgZm9sbG93XG4gICBpdCBpbW1lZGlhdGVseSB3aXRoICJlbmQiOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLlxuXG4gICBXaXRoIG5vICpicG51bWJlciogYXJndW1lbnQsIGNvbW1hbmRzIHJlZmVycyB0byB0aGUgbGFzdCBicmVha3BvaW50XG4gICBzZXQuXG5cbiAgIFlvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwIGFnYWluLlxuICAgU2ltcGx5IHVzZSB0aGUgY29udGludWUgY29tbWFuZCwgb3Igc3RlcCwgb3IgYW55IG90aGVyIGNvbW1hbmQgdGhhdFxuICAgcmVzdW1lcyBleGVjdXRpb24uXG5cbiAgIFNwZWNpZnlpbmcgYW55IGNvbW1hbmQgcmVzdW1pbmcgZXhlY3V0aW9uIChjdXJyZW50bHkgY29udGludWUsXG4gICBzdGVwLCBuZXh0LCByZXR1cm4sIGp1bXAsIHF1aXQgYW5kIHRoZWlyIGFiYnJldmlhdGlvbnMpIHRlcm1pbmF0ZXNcbiAgIHRoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnlcbiAgIGVuZCkuIFRoaXMgaXMgYmVjYXVzZSBhbnkgdGltZSB5b3UgcmVzdW1lIGV4ZWN1dGlvbiAoZXZlbiB3aXRoIGFcbiAgIHNpbXBsZSBuZXh0IG9yIHN0ZXApLCB5b3UgbWF5IGVuY291bnRlciBhbm90aGVyIGJyZWFrcG9pbnQtLXdoaWNoXG4gICBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvIGFtYmlndWl0aWVzIGFib3V0IHdoaWNoXG4gICBsaXN0IHRvIGV4ZWN1dGUuXG5cbiAgIElmIHlvdSB1c2UgdGhlIFwnc2lsZW50XCcgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUgdXN1YWxcbiAgIG1lc3NhZ2UgYWJvdXQgc3RvcHBpbmcgYXQgYSBicmVha3BvaW50IGlzIG5vdCBwcmludGVkLiAgVGhpcyBtYXkgYmVcbiAgIGRlc2lyYWJsZSBmb3IgYnJlYWtwb2ludHMgdGhhdCBhcmUgdG8gcHJpbnQgYSBzcGVjaWZpYyBtZXNzYWdlIGFuZFxuICAgdGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCB5b3VcbiAgIHNlZSBubyBzaWduIHRoYXQgdGhlIGJyZWFrcG9pbnQgd2FzIHJlYWNoZWQuXG5cbnModGVwKVxuXG4gICBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIG9jY2FzaW9uXG4gICAoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3Igb24gdGhlIG5leHQgbGluZSBpbiB0aGVcbiAgIGN1cnJlbnQgZnVuY3Rpb24pLlxuXG5uKGV4dClcblxuICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24gaXNcbiAgIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4gIChUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJuZXh0IiBhbmQgInN0ZXAiXG4gICBpcyB0aGF0ICJzdGVwIiBzdG9wcyBpbnNpZGUgYSBjYWxsZWQgZnVuY3Rpb24sIHdoaWxlICJuZXh0IlxuICAgZXhlY3V0ZXMgY2FsbGVkIGZ1bmN0aW9ucyBhdCAobmVhcmx5KSBmdWxsIHNwZWVkLCBvbmx5IHN0b3BwaW5nIGF0XG4gICB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLilcblxudW50KGlsKSBbbGluZW5vXVxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGxpbmUgd2l0aCBhIG51bWJlclxuICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcyByZWFjaGVkLlxuXG4gICBXaXRoIGEgbGluZSBudW1iZXIsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCBhIGxpbmUgd2l0aCBhIG51bWJlclxuICAgZ3JlYXRlciBvciBlcXVhbCB0byB0aGF0IGlzIHJlYWNoZWQuICBJbiBib3RoIGNhc2VzLCBhbHNvIHN0b3Agd2hlblxuICAgdGhlIGN1cnJlbnQgZnJhbWUgcmV0dXJucy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogQWxsb3cgZ2l2aW5nIGFuIGV4cGxpY2l0IGxpbmUgbnVtYmVyLlxuXG5yKGV0dXJuKVxuXG4gICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucy5cblxuYyhvbnQoaW51ZSkpXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLlxuXG5qKHVtcCkgbGluZW5vXG5cbiAgIFNldCB0aGUgbmV4dCBsaW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4gIE9ubHkgYXZhaWxhYmxlIGluIHRoZVxuICAgYm90dG9tLW1vc3QgZnJhbWUuICBUaGlzIGxldHMgeW91IGp1bXAgYmFjayBhbmQgZXhlY3V0ZSBjb2RlIGFnYWluLFxuICAgb3IganVtcCBmb3J3YXJkIHRvIHNraXAgY29kZSB0aGF0IHlvdSBkb25cJ3Qgd2FudCB0byBydW4uXG5cbiAgIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IG5vdCBhbGwganVtcHMgYXJlIGFsbG93ZWQgLS0gZm9yIGluc3RhbmNlXG4gICBpdCBpcyBub3QgcG9zc2libGUgdG8ganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSAiZm9yIiBsb29wIG9yIG91dFxuICAgb2YgYSAiZmluYWxseSIgY2xhdXNlLlxuXG5sKGlzdCkgW2ZpcnN0WywgbGFzdF1dXG5cbiAgIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuICBXaXRob3V0IGFyZ3VtZW50cywgbGlzdCAxMVxuICAgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGludWUgdGhlIHByZXZpb3VzIGxpc3RpbmcuXG4gICBXaXRoICIuIiBhcyBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgdGhlIGN1cnJlbnQgbGluZS4gIFdpdGhcbiAgIG9uZSBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgYXQgdGhhdCBsaW5lLiAgV2l0aCB0d29cbiAgIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7IGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbGVzc1xuICAgdGhhbiB0aGUgZmlyc3QsIGl0IGlzIGludGVycHJldGVkIGFzIGEgY291bnQuXG5cbiAgIFRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW5kaWNhdGVkIGJ5ICItPiIuICBJZiBhblxuICAgZXhjZXB0aW9uIGlzIGJlaW5nIGRlYnVnZ2VkLCB0aGUgbGluZSB3aGVyZSB0aGUgZXhjZXB0aW9uIHdhc1xuICAgb3JpZ2luYWxseSByYWlzZWQgb3IgcHJvcGFnYXRlZCBpcyBpbmRpY2F0ZWQgYnkgIj4+IiwgaWYgaXQgZGlmZmVyc1xuICAgZnJvbSB0aGUgY3VycmVudCBsaW5lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAiPj4iIG1hcmtlci5cblxubGwgfCBsb25nbGlzdFxuXG4gICBMaXN0IGFsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb3IgZnJhbWUuXG4gICBJbnRlcmVzdGluZyBsaW5lcyBhcmUgbWFya2VkIGFzIGZvciAibGlzdCIuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuYShyZ3MpXG5cbiAgIFByaW50IHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLlxuXG5wIGV4cHJlc3Npb25cblxuICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiBpbiB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBwcmludCBpdHNcbiAgIHZhbHVlLlxuXG4gICBOb3RlOiAicHJpbnQoKSIgY2FuIGFsc28gYmUgdXNlZCwgYnV0IGlzIG5vdCBhIGRlYnVnZ2VyIGNvbW1hbmRcbiAgICAgLS0tIHRoaXMgZXhlY3V0ZXMgdGhlIFB5dGhvbiAicHJpbnQoKSIgZnVuY3Rpb24uXG5cbnBwIGV4cHJlc3Npb25cblxuICAgTGlrZSB0aGUgInAiIGNvbW1hbmQsIGV4Y2VwdCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgcHJldHR5LVxuICAgcHJpbnRlZCB1c2luZyB0aGUgInBwcmludCIgbW9kdWxlLlxuXG53aGF0aXMgZXhwcmVzc2lvblxuXG4gICBQcmludCB0aGUgdHlwZSBvZiB0aGUgKmV4cHJlc3Npb24qLlxuXG5zb3VyY2UgZXhwcmVzc2lvblxuXG4gICBUcnkgdG8gZ2V0IHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBkaXNwbGF5IGl0LlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmRpc3BsYXkgW2V4cHJlc3Npb25dXG5cbiAgIERpc3BsYXkgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlmIGl0IGNoYW5nZWQsIGVhY2ggdGltZVxuICAgZXhlY3V0aW9uIHN0b3BzIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuXG4gICBXaXRob3V0IGV4cHJlc3Npb24sIGxpc3QgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50XG4gICBmcmFtZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG51bmRpc3BsYXkgW2V4cHJlc3Npb25dXG5cbiAgIERvIG5vdCBkaXNwbGF5IHRoZSBleHByZXNzaW9uIGFueSBtb3JlIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuICAgV2l0aG91dCBleHByZXNzaW9uLCBjbGVhciBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlIGN1cnJlbnRcbiAgIGZyYW1lLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmludGVyYWN0XG5cbiAgIFN0YXJ0IGFuIGludGVyYXRpdmUgaW50ZXJwcmV0ZXIgKHVzaW5nIHRoZSAiY29kZSIgbW9kdWxlKSB3aG9zZVxuICAgZ2xvYmFsIG5hbWVzcGFjZSBjb250YWlucyBhbGwgdGhlIChnbG9iYWwgYW5kIGxvY2FsKSBuYW1lcyBmb3VuZCBpblxuICAgdGhlIGN1cnJlbnQgc2NvcGUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuYWxpYXMgW25hbWUgW2NvbW1hbmRdXVxuXG4gICBDcmVhdGUgYW4gYWxpYXMgY2FsbGVkICpuYW1lKiB0aGF0IGV4ZWN1dGVzICpjb21tYW5kKi4gIFRoZSBjb21tYW5kXG4gICBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMgY2FuIGJlXG4gICBpbmRpY2F0ZWQgYnkgIiUxIiwgIiUyIiwgYW5kIHNvIG9uLCB3aGlsZSAiJSoiIGlzIHJlcGxhY2VkIGJ5IGFsbFxuICAgdGhlIHBhcmFtZXRlcnMuIElmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGFsaWFzIGZvclxuICAgKm5hbWUqIGlzIHNob3duLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUgbGlzdGVkLlxuXG4gICBBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlIGxlZ2FsbHlcbiAgIHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSB0aGF0IGludGVybmFsIHBkYiBjb21tYW5kcyAqY2FuKiBiZVxuICAgb3ZlcnJpZGRlbiBieSBhbGlhc2VzLiAgU3VjaCBhIGNvbW1hbmQgaXMgdGhlbiBoaWRkZW4gdW50aWwgdGhlXG4gICBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgZmlyc3RcbiAgIHdvcmQgb2YgdGhlIGNvbW1hbmQgbGluZTsgYWxsIG90aGVyIHdvcmRzIGluIHRoZSBsaW5lIGFyZSBsZWZ0XG4gICBhbG9uZS5cblxuICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gcGxhY2VkXG4gICBpbiB0aGUgIi5wZGJyYyIgZmlsZSk6XG5cbiAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IilcbiAgICAgIGFsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQoIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10pXG4gICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmXG4gICAgICBhbGlhcyBwcyBwaSBzZWxmXG5cbnVuYWxpYXMgbmFtZVxuXG4gICBEZWxldGUgdGhlIHNwZWNpZmllZCBhbGlhcy5cblxuISBzdGF0ZW1lbnRcblxuICAgRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSAqc3RhdGVtZW50KiBpbiB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudFxuICAgc3RhY2sgZnJhbWUuIFRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlIGZpcnN0XG4gICB3b3JkIG9mIHRoZSBzdGF0ZW1lbnQgcmVzZW1ibGVzIGEgZGVidWdnZXIgY29tbWFuZC4gIFRvIHNldCBhXG4gICBnbG9iYWwgdmFyaWFibGUsIHlvdSBjYW4gcHJlZml4IHRoZSBhc3NpZ25tZW50IGNvbW1hbmQgd2l0aCBhXG4gICAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjpcblxuICAgICAgKFBkYikgZ2xvYmFsIGxpc3Rfb3B0aW9uczsgbGlzdF9vcHRpb25zID0gW1wnLWxcJ11cbiAgICAgIChQZGIpXG5cbnJ1biBbYXJncyAuLi5dXG5yZXN0YXJ0IFthcmdzIC4uLl1cblxuICAgUmVzdGFydCB0aGUgZGVidWdnZWQgUHl0aG9uIHByb2dyYW0uICBJZiBhbiBhcmd1bWVudCBpcyBzdXBwbGllZCxcbiAgIGl0IGlzIHNwbGl0IHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXdcbiAgICJzeXMuYXJndiIuIEhpc3RvcnksIGJyZWFrcG9pbnRzLCBhY3Rpb25zIGFuZCBkZWJ1Z2dlciBvcHRpb25zIGFyZVxuICAgcHJlc2VydmVkLiAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLlxuXG5xKHVpdClcblxuICAgUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4gIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzIGFib3J0ZWQuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gV2hldGhlciBhIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gb3JpZ2luYXRlIGluIGEgY2VydGFpbiBtb2R1bGVcbiAgICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSAiX19uYW1lX18iIGluIHRoZSBmcmFtZSBnbG9iYWxzLlxuJywKLSAnZGVsJzogdSdcblRoZSAiZGVsIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKipcblxuICAgZGVsX3N0bXQgOjo9ICJkZWwiIHRhcmdldF9saXN0XG5cbkRlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCBpc1xuZGVmaW5lZC4gUmF0aGVyIHRoYW4gc3BlbGxpbmcgaXQgb3V0IGluIGZ1bGwgZGV0YWlscywgaGVyZSBhcmUgc29tZVxuaGludHMuXG5cbkRlbGV0aW9uIG9mIGEgdGFyZ2V0IGxpc3QgcmVjdXJzaXZlbHkgZGVsZXRlcyBlYWNoIHRhcmdldCwgZnJvbSBsZWZ0XG50byByaWdodC5cblxuRGVsZXRpb24gb2YgYSBuYW1lIHJlbW92ZXMgdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGZyb20gdGhlIGxvY2FsIG9yXG5nbG9iYWwgbmFtZXNwYWNlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmFtZSBvY2N1cnMgaW4gYSAiZ2xvYmFsIlxuc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhXG4iTmFtZUVycm9yIiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuXG5cbkRlbGV0aW9uIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBzdWJzY3JpcHRpb25zIGFuZCBzbGljaW5ncyBpcyBwYXNzZWRcbnRvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWxcbmVxdWl2YWxlbnQgdG8gYXNzaWdubWVudCBvZiBhbiBlbXB0eSBzbGljZSBvZiB0aGUgcmlnaHQgdHlwZSAoYnV0IGV2ZW5cbnRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2xpY2VkIG9iamVjdCkuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IFByZXZpb3VzbHkgaXQgd2FzIGlsbGVnYWwgdG8gZGVsZXRlIGEgbmFtZVxuZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3VycyBhcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWRcbmJsb2NrLlxuJywKLSAnZGljdCc6IHUnXG5EaWN0aW9uYXJ5IGRpc3BsYXlzXG4qKioqKioqKioqKioqKioqKioqXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzOlxuXG4gICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICJ9IlxuICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIHwgIioqIiBvcl9leHByXG4gICBkaWN0X2NvbXByZWhlbnNpb24gOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gY29tcF9mb3JcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuXG5JZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeTpcbmVhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG5jb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbm11bHRpcGxlIHRpbWVzIGluIHRoZSBrZXkvZGF0dW0gbGlzdCwgYW5kIHRoZSBmaW5hbCBkaWN0aW9uYXJ5XCdzIHZhbHVlXG5mb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG5cbkEgZG91YmxlIGFzdGVyaXNrICIqKiIgZGVub3RlcyAqZGljdGlvbmFyeSB1bnBhY2tpbmcqLiBJdHMgb3BlcmFuZFxubXVzdCBiZSBhICptYXBwaW5nKi4gIEVhY2ggbWFwcGluZyBpdGVtIGlzIGFkZGVkIHRvIHRoZSBuZXdcbmRpY3Rpb25hcnkuICBMYXRlciB2YWx1ZXMgcmVwbGFjZSB2YWx1ZXMgYWxyZWFkeSBzZXQgYnkgZWFybGllclxua2V5L2RhdHVtIHBhaXJzIGFuZCBlYXJsaWVyIGRpY3Rpb25hcnkgdW5wYWNraW5ncy5cblxuTmV3IGluIHZlcnNpb24gMy41OiBVbnBhY2tpbmcgaW50byBkaWN0aW9uYXJ5IGRpc3BsYXlzLCBvcmlnaW5hbGx5XG5wcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cblxuQSBkaWN0IGNvbXByZWhlbnNpb24sIGluIGNvbnRyYXN0IHRvIGxpc3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucyxcbm5lZWRzIHR3byBleHByZXNzaW9ucyBzZXBhcmF0ZWQgd2l0aCBhIGNvbG9uIGZvbGxvd2VkIGJ5IHRoZSB1c3VhbFxuImZvciIgYW5kICJpZiIgY2xhdXNlcy4gV2hlbiB0aGUgY29tcHJlaGVuc2lvbiBpcyBydW4sIHRoZSByZXN1bHRpbmdcbmtleSBhbmQgdmFsdWUgZWxlbWVudHMgYXJlIGluc2VydGVkIGluIHRoZSBuZXcgZGljdGlvbmFyeSBpbiB0aGUgb3JkZXJcbnRoZXkgYXJlIHByb2R1Y2VkLlxuXG5SZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpblxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Ki4gIChUbyBzdW1tYXJpemUsIHRoZSBrZXkgdHlwZVxuc2hvdWxkIGJlICpoYXNoYWJsZSosIHdoaWNoIGV4Y2x1ZGVzIGFsbCBtdXRhYmxlIG9iamVjdHMuKSAgQ2xhc2hlc1xuYmV0d2VlbiBkdXBsaWNhdGUga2V5cyBhcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5XG5yaWdodG1vc3QgaW4gdGhlIGRpc3BsYXkpIHN0b3JlZCBmb3IgYSBnaXZlbiBrZXkgdmFsdWUgcHJldmFpbHMuXG4nLAotICdkeW5hbWljLWZlYXR1cmVzJzogdSdcbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGVcbnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcblxuICAgaSA9IDEwXG4gICBkZWYgZigpOlxuICAgICAgIHByaW50KGkpXG4gICBpID0gNDJcbiAgIGYoKVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKLSAnZWxzZSc6IHUnXG5UaGUgImlmIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAotICdleGNlcHRpb25zJzogdSdcbkV4Y2VwdGlvbnNcbioqKioqKioqKipcblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiAuLi4gImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlXG4iZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbiJTeXN0ZW1FeGl0Ii5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzXG5zZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuIGJlXG5yZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG5leGNlcHRpb25hbCBjb25kaXRpb24uXG5cbk5vdGU6IEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5XG4gICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXNcbiAgICBjb21waWxlZC5cbicsCi0gJ2V4ZWNtb2RlbCc6IHUnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cblN0cnVjdHVyZSBvZiBhIHByb2dyYW1cbj09PT09PT09PT09PT09PT09PT09PT1cblxuQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgYSBwaWVjZVxub2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgdW5pdC4gVGhlIGZvbGxvd2luZyBhcmVcbmJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MgZGVmaW5pdGlvbi4gRWFjaFxuY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgZ2l2ZW5cbmFzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWQgYXMgYSBjb21tYW5kIGxpbmVcbmFyZ3VtZW50IHRvIHRoZSBpbnRlcnByZXRlcikgaXMgYSBjb2RlIGJsb2NrLiAgQSBzY3JpcHQgY29tbWFuZCAoYVxuY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSBcJyoqLWMqKlwnXG5vcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBzdHJpbmcgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBidWlsdC1pblxuZnVuY3Rpb25zICJldmFsKCkiIGFuZCAiZXhlYygpIiBpcyBhIGNvZGUgYmxvY2suXG5cbkEgY29kZSBibG9jayBpcyBleGVjdXRlZCBpbiBhbiAqZXhlY3V0aW9uIGZyYW1lKi4gIEEgZnJhbWUgY29udGFpbnNcbnNvbWUgYWRtaW5pc3RyYXRpdmUgaW5mb3JtYXRpb24gKHVzZWQgZm9yIGRlYnVnZ2luZykgYW5kIGRldGVybWluZXNcbndoZXJlIGFuZCBob3cgZXhlY3V0aW9uIGNvbnRpbnVlcyBhZnRlciB0aGUgY29kZSBibG9ja1wncyBleGVjdXRpb24gaGFzXG5jb21wbGV0ZWQuXG5cblxuTmFtaW5nIGFuZCBiaW5kaW5nXG49PT09PT09PT09PT09PT09PT1cblxuXG5CaW5kaW5nIG9mIG5hbWVzXG4tLS0tLS0tLS0tLS0tLS0tXG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucyxcbiJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgb3IgYWZ0ZXJcbiJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiIHN0YXRlbWVudFxub2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbmltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm1cbm1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3JcbnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLlxuXG5FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhXG5jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWxcbmNvZGUgYmxvY2spLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLFxudW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlXG5tb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZVxuY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlXG5ibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuXG5FYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAqYmluZGluZypcbm9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiBydWxlcy5cblxuXG5SZXNvbHV0aW9uIG9mIG5hbWVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuXG5XaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3RcbmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrXG5pcyBjYWxsZWQgdGhlIGJsb2NrXCdzICplbnZpcm9ubWVudCouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gSWZcbnRoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbFxudmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlIHRoZVxubmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4iVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWZcbnRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZC4gIFRoZVxuImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uXG5pbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlIHZhcmlhYmxlXG5jb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciB0b1xucHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90XG5leGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuXG5UaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYVxubW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkXG4iX19tYWluX18iLlxuXG5DbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiBhcmVcbnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW5cbmV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSByZWZlcmVuY2VzXG5mb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uIHRoYXRcbnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZVxubmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IG9mXG50aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0b1xudGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS1cbnRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZVxuaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nXG53aWxsIGZhaWw6XG5cbiAgIGNsYXNzIEE6XG4gICAgICAgYSA9IDQyXG4gICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuXG5cbkJ1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyBnbG9iYWxcbm5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgbGF0dGVyIGNhc2VcbnRoZSBtb2R1bGVcJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlICJfX21haW5fXyJcbm1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluIGFueVxub3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlXG4iYnVpbHRpbnMiIG1vZHVsZSBpdHNlbGYuICAiX19idWlsdGluc19fIiBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG4iX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICJpbXBvcnQiXG50aGUgImJ1aWx0aW5zIiBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcyBhcHByb3ByaWF0ZWx5LlxuXG5cbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGVcbnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcblxuICAgaSA9IDEwXG4gICBkZWYgZigpOlxuICAgICAgIHByaW50KGkpXG4gICBpID0gNDJcbiAgIGYoKVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuXG5cbkV4Y2VwdGlvbnNcbj09PT09PT09PT1cblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSAidHJ5IiAuLi4gImV4Y2VwdCIgc3RhdGVtZW50LiAgVGhlXG4iZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbiJTeXN0ZW1FeGl0Ii5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgY2xhdXNlIGlzXG5zZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2UgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuIGJlXG5yZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlXG5leGNlcHRpb25hbCBjb25kaXRpb24uXG5cbk5vdGU6IEV4Y2VwdGlvbiBtZXNzYWdlcyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5XG4gICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXNcbiAgICBjb21waWxlZC5cbicsCi0gJ2V4cHJsaXN0cyc6IHUnXG5FeHByZXNzaW9uIGxpc3RzXG4qKioqKioqKioqKioqKioqXG5cbiAgIGV4cHJlc3Npb25fbGlzdCAgICA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG4gICBzdGFycmVkX2xpc3QgICAgICAgOjo9IHN0YXJyZWRfaXRlbSAoICIsIiBzdGFycmVkX2l0ZW0gKSogWyIsIl1cbiAgIHN0YXJyZWRfZXhwcmVzc2lvbiA6Oj0gZXhwcmVzc2lvbiB8ICggc3RhcnJlZF9pdGVtICIsIiApKiBbc3RhcnJlZF9pdGVtXVxuICAgc3RhcnJlZF9pdGVtICAgICAgIDo6PSBleHByZXNzaW9uIHwgIioiIG9yX2V4cHJcblxuRXhjZXB0IHdoZW4gcGFydCBvZiBhIGxpc3Qgb3Igc2V0IGRpc3BsYXksIGFuIGV4cHJlc3Npb24gbGlzdFxuY29udGFpbmluZyBhdCBsZWFzdCBvbmUgY29tbWEgeWllbGRzIGEgdHVwbGUuICBUaGUgbGVuZ3RoIG9mIHRoZSB0dXBsZVxuaXMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyBpbiB0aGUgbGlzdC4gIFRoZSBleHByZXNzaW9ucyBhcmVcbmV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG5cbkFuIGFzdGVyaXNrICIqIiBkZW5vdGVzICppdGVyYWJsZSB1bnBhY2tpbmcqLiAgSXRzIG9wZXJhbmQgbXVzdCBiZSBhblxuKml0ZXJhYmxlKi4gIFRoZSBpdGVyYWJsZSBpcyBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgaXRlbXMsIHdoaWNoXG5hcmUgaW5jbHVkZWQgaW4gdGhlIG5ldyB0dXBsZSwgbGlzdCwgb3Igc2V0LCBhdCB0aGUgc2l0ZSBvZiB0aGVcbnVucGFja2luZy5cblxuTmV3IGluIHZlcnNpb24gMy41OiBJdGVyYWJsZSB1bnBhY2tpbmcgaW4gZXhwcmVzc2lvbiBsaXN0cywgb3JpZ2luYWxseVxucHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG5cblRoZSB0cmFpbGluZyBjb21tYSBpcyByZXF1aXJlZCBvbmx5IHRvIGNyZWF0ZSBhIHNpbmdsZSB0dXBsZSAoYS5rLmEuIGFcbipzaW5nbGV0b24qKTsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiAgQSBzaW5nbGUgZXhwcmVzc2lvblxud2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hIGRvZXNuXCd0IGNyZWF0ZSBhIHR1cGxlLCBidXQgcmF0aGVyIHlpZWxkcyB0aGVcbnZhbHVlIG9mIHRoYXQgZXhwcmVzc2lvbi4gKFRvIGNyZWF0ZSBhbiBlbXB0eSB0dXBsZSwgdXNlIGFuIGVtcHR5IHBhaXJcbm9mIHBhcmVudGhlc2VzOiAiKCkiLilcbicsCi0gJ2Zsb2F0aW5nJzogdSdcbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG5GbG9hdGluZyBwb2ludCBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbFxuZGVmaW5pdGlvbnM6XG5cbiAgIGZsb2F0bnVtYmVyICAgOjo9IHBvaW50ZmxvYXQgfCBleHBvbmVudGZsb2F0XG4gICBwb2ludGZsb2F0ICAgIDo6PSBbaW50cGFydF0gZnJhY3Rpb24gfCBpbnRwYXJ0ICIuIlxuICAgZXhwb25lbnRmbG9hdCA6Oj0gKGludHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudFxuICAgaW50cGFydCAgICAgICA6Oj0gZGlnaXQrXG4gICBmcmFjdGlvbiAgICAgIDo6PSAiLiIgZGlnaXQrXG4gICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdCtcblxuTm90ZSB0aGF0IHRoZSBpbnRlZ2VyIGFuZCBleHBvbmVudCBwYXJ0cyBhcmUgYWx3YXlzIGludGVycHJldGVkIHVzaW5nXG5yYWRpeCAxMC4gRm9yIGV4YW1wbGUsICIwNzdlMDEwIiBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUgbnVtYmVyXG5hcyAiNzdlMTAiLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpc1xuaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBTb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzOlxuXG4gICAzLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMFxuXG5Ob3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgIi0xIlxuaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgIi0iIGFuZCB0aGVcbmxpdGVyYWwgIjEiLlxuJywKLSAnZm9yJzogdSdcblRoZSAiZm9yIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKipcblxuVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBzZXF1ZW5jZVxuKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG4iZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLiAgRWFjaFxuaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgcnVsZXNcbmZvciBhc3NpZ25tZW50cyAoc2VlICpBc3NpZ25tZW50IHN0YXRlbWVudHMqKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG5leGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uKSxcbnRoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBjb250aW51ZXNcbndpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG5pdGVtLlxuXG5UaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0IGxpc3QuXG5UaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyBpbmNsdWRpbmdcbnRob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcblxuICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuICAgICAgIHByaW50KGkpXG4gICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuXG5OYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG5idXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG5pdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgaVxuOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbiAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbiAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyBtZWFuc1xuICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gdGhlXG4gIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggb2ZcbiAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmIHRoZVxuICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbiAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4gIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4gIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuXG4gICAgIGZvciB4IGluIGFbOl06XG4gICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcbicsCi0gJ2Zvcm1hdHN0cmluZ3MnOiB1J1xuRm9ybWF0IFN0cmluZyBTeW50YXhcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QgYW5kIHRoZSAiRm9ybWF0dGVyIiBjbGFzcyBzaGFyZSB0aGUgc2FtZVxuc3ludGF4IGZvciBmb3JtYXQgc3RyaW5ncyAoYWx0aG91Z2ggaW4gdGhlIGNhc2Ugb2YgIkZvcm1hdHRlciIsXG5zdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS5cblxuRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlc1xuInt9Ii4gQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyBjb25zaWRlcmVkIGxpdGVyYWxcbnRleHQsIHdoaWNoIGlzIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4gIElmIHlvdSBuZWVkIHRvIGluY2x1ZGVcbmEgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5IGRvdWJsaW5nOlxuInt7IiBhbmQgIn19Ii5cblxuVGhlIGdyYW1tYXIgZm9yIGEgcmVwbGFjZW1lbnQgZmllbGQgaXMgYXMgZm9sbG93czpcblxuICAgICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiBjb252ZXJzaW9uXSBbIjoiIGZvcm1hdF9zcGVjXSAifSJcbiAgICAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgIlsiIGVsZW1lbnRfaW5kZXggIl0iKSpcbiAgICAgIGFyZ19uYW1lICAgICAgICAgIDo6PSBbaWRlbnRpZmllciB8IGludGVnZXJdXG4gICAgICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllclxuICAgICAgZWxlbWVudF9pbmRleCAgICAgOjo9IGludGVnZXIgfCBpbmRleF9zdHJpbmdcbiAgICAgIGluZGV4X3N0cmluZyAgICAgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJdIj4gK1xuICAgICAgY29udmVyc2lvbiAgICAgICAgOjo9ICJyIiB8ICJzIiB8ICJhIlxuICAgICAgZm9ybWF0X3NwZWMgICAgICAgOjo9IDxkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbj5cblxuSW4gbGVzcyBmb3JtYWwgdGVybXMsIHRoZSByZXBsYWNlbWVudCBmaWVsZCBjYW4gc3RhcnQgd2l0aCBhXG4qZmllbGRfbmFtZSogdGhhdCBzcGVjaWZpZXMgdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBmb3JtYXR0ZWRcbmFuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgZmllbGQuIFRoZVxuKmZpZWxkX25hbWUqIGlzIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAgKmNvbnZlcnNpb24qIGZpZWxkLCB3aGljaCBpc1xucHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgIlwnIVwnIiwgYW5kIGEgKmZvcm1hdF9zcGVjKiwgd2hpY2ggaXNcbnByZWNlZGVkIGJ5IGEgY29sb24gIlwnOlwnIi4gIFRoZXNlIHNwZWNpZnkgYSBub24tZGVmYXVsdCBmb3JtYXQgZm9yIHRoZVxucmVwbGFjZW1lbnQgdmFsdWUuXG5cblNlZSBhbHNvIHRoZSAqRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSogc2VjdGlvbi5cblxuVGhlICpmaWVsZF9uYW1lKiBpdHNlbGYgYmVnaW5zIHdpdGggYW4gKmFyZ19uYW1lKiB0aGF0IGlzIGVpdGhlciBhXG5udW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXRcJ3MgYSBudW1iZXIsIGl0IHJlZmVycyB0byBhIHBvc2l0aW9uYWxcbmFyZ3VtZW50LCBhbmQgaWYgaXRcJ3MgYSBrZXl3b3JkLCBpdCByZWZlcnMgdG8gYSBuYW1lZCBrZXl3b3JkXG5hcmd1bWVudC4gIElmIHRoZSBudW1lcmljYWwgYXJnX25hbWVzIGluIGEgZm9ybWF0IHN0cmluZyBhcmUgMCwgMSwgMixcbi4uLiBpbiBzZXF1ZW5jZSwgdGhleSBjYW4gYWxsIGJlIG9taXR0ZWQgKG5vdCBqdXN0IHNvbWUpIGFuZCB0aGVcbm51bWJlcnMgMCwgMSwgMiwgLi4uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0IG9yZGVyLlxuQmVjYXVzZSAqYXJnX25hbWUqIGlzIG5vdCBxdW90ZS1kZWxpbWl0ZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0b1xuc3BlY2lmeSBhcmJpdHJhcnkgZGljdGlvbmFyeSBrZXlzIChlLmcuLCB0aGUgc3RyaW5ncyAiXCcxMFwnIiBvclxuIlwnOi1dXCciKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUgKmFyZ19uYW1lKiBjYW4gYmUgZm9sbG93ZWQgYnkgYW55XG5udW1iZXIgb2YgaW5kZXggb3IgYXR0cmlidXRlIGV4cHJlc3Npb25zLiBBbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtXG4iXCcubmFtZVwnIiBzZWxlY3RzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgdXNpbmcgImdldGF0dHIoKSIsIHdoaWxlIGFuXG5leHByZXNzaW9uIG9mIHRoZSBmb3JtICJcJ1tpbmRleF1cJyIgZG9lcyBhbiBpbmRleCBsb29rdXAgdXNpbmdcbiJfX2dldGl0ZW1fXygpIi5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVycyBjYW4gYmVcbm9taXR0ZWQsIHNvICJcJ3t9IHt9XCciIGlzIGVxdWl2YWxlbnQgdG8gIlwnezB9IHsxfVwnIi5cblxuU29tZSBzaW1wbGUgZm9ybWF0IHN0cmluZyBleGFtcGxlczpcblxuICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgICMgUmVmZXJlbmNlcyBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4gICAiQnJpbmcgbWUgYSB7fSIgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5IHJlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJGcm9tIHt9IHRvIHt9IiAgICAgICAgICAgICAgICAgICAjIFNhbWUgYXMgIkZyb20gezB9IHRvIHsxfSJcbiAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICAjIFJlZmVyZW5jZXMga2V5d29yZCBhcmd1bWVudCBcJ25hbWVcJ1xuICAgIldlaWdodCBpbiB0b25zIHswLndlaWdodH0iICAgICAgICMgXCd3ZWlnaHRcJyBhdHRyaWJ1dGUgb2YgZmlyc3QgcG9zaXRpb25hbCBhcmdcbiAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICAjIEZpcnN0IGVsZW1lbnQgb2Yga2V5d29yZCBhcmd1bWVudCBcJ3BsYXllcnNcJy5cblxuVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSBmb3JtYXR0aW5nLlxuTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlICJfX2Zvcm1hdF9fKCkiXG5tZXRob2Qgb2YgdGhlIHZhbHVlIGl0c2VsZi4gIEhvd2V2ZXIsIGluIHNvbWUgY2FzZXMgaXQgaXMgZGVzaXJhYmxlIHRvXG5mb3JjZSBhIHR5cGUgdG8gYmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLCBvdmVycmlkaW5nIGl0cyBvd25cbmRlZmluaXRpb24gb2YgZm9ybWF0dGluZy4gIEJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgc3RyaW5nIGJlZm9yZVxuY2FsbGluZyAiX19mb3JtYXRfXygpIiwgdGhlIG5vcm1hbCBmb3JtYXR0aW5nIGxvZ2ljIGlzIGJ5cGFzc2VkLlxuXG5UaHJlZSBjb252ZXJzaW9uIGZsYWdzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOiAiXCchc1wnIiB3aGljaCBjYWxsc1xuInN0cigpIiBvbiB0aGUgdmFsdWUsICJcJyFyXCciIHdoaWNoIGNhbGxzICJyZXByKCkiIGFuZCAiXCchYVwnIiB3aGljaFxuY2FsbHMgImFzY2lpKCkiLlxuXG5Tb21lIGV4YW1wbGVzOlxuXG4gICAiSGFyb2xkXCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcbiAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuICAgIk1vcmUgeyFhfSIgICAgICAgICAgICAgICAgICAgICAgIyBDYWxscyBhc2NpaSgpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuXG5UaGUgKmZvcm1hdF9zcGVjKiBmaWVsZCBjb250YWlucyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZSB2YWx1ZVxuc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgYWxpZ25tZW50LFxucGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiBkZWZpbmUgaXRzXG5vd24gImZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSIgb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlICpmb3JtYXRfc3BlYyouXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgc3VwcG9ydCBhIGNvbW1vbiBmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UsIHdoaWNoXG5pcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi5cblxuQSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNhbiBhbHNvIGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkc1xud2l0aGluIGl0LiBUaGVzZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzIG1heSBjb250YWluIGEgZmllbGQgbmFtZSxcbmNvbnZlcnNpb24gZmxhZyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGJ1dCBkZWVwZXIgbmVzdGluZyBpcyBub3RcbmFsbG93ZWQuICBUaGUgcmVwbGFjZW1lbnQgZmllbGRzIHdpdGhpbiB0aGUgZm9ybWF0X3NwZWMgYXJlXG5zdWJzdGl0dXRlZCBiZWZvcmUgdGhlICpmb3JtYXRfc3BlYyogc3RyaW5nIGlzIGludGVycHJldGVkLiBUaGlzXG5hbGxvd3MgdGhlIGZvcm1hdHRpbmcgb2YgYSB2YWx1ZSB0byBiZSBkeW5hbWljYWxseSBzcGVjaWZpZWQuXG5cblNlZSB0aGUgKkZvcm1hdCBleGFtcGxlcyogc2VjdGlvbiBmb3Igc29tZSBleGFtcGxlcy5cblxuXG5Gb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiJGb3JtYXQgc3BlY2lmaWNhdGlvbnMiIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkXG53aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZFxuKHNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqKS4gIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZVxuYnVpbHQtaW4gImZvcm1hdCgpIiBmdW5jdGlvbi4gIEVhY2ggZm9ybWF0dGFibGUgdHlwZSBtYXkgZGVmaW5lIGhvd1xudGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIHRvIGJlIGludGVycHJldGVkLlxuXG5Nb3N0IGJ1aWx0LWluIHR5cGVzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZm9yIGZvcm1hdFxuc3BlY2lmaWNhdGlvbnMsIGFsdGhvdWdoIHNvbWUgb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBhcmUgb25seVxuc3VwcG9ydGVkIGJ5IHRoZSBudW1lcmljIHR5cGVzLlxuXG5BIGdlbmVyYWwgY29udmVudGlvbiBpcyB0aGF0IGFuIGVtcHR5IGZvcm1hdCBzdHJpbmcgKCIiIiIpIHByb2R1Y2VzXG50aGUgc2FtZSByZXN1bHQgYXMgaWYgeW91IGhhZCBjYWxsZWQgInN0cigpIiBvbiB0aGUgdmFsdWUuIEEgbm9uLWVtcHR5XG5mb3JtYXQgc3RyaW5nIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LlxuXG5UaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOlxuXG4gICBmb3JtYXRfc3BlYyA6Oj0gW1tmaWxsXWFsaWduXVtzaWduXVsjXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bdHlwZV1cbiAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj5cbiAgIGFsaWduICAgICAgIDo6PSAiPCIgfCAiPiIgfCAiPSIgfCAiXiJcbiAgIHNpZ24gICAgICAgIDo6PSAiKyIgfCAiLSIgfCAiICJcbiAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyXG4gICBwcmVjaXNpb24gICA6Oj0gaW50ZWdlclxuICAgdHlwZSAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiB8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIlxuXG5JZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSAqZmlsbCpcbmNoYXJhY3RlciB0aGF0IGNhbiBiZSBhbnkgY2hhcmFjdGVyIGFuZCBkZWZhdWx0cyB0byBhIHNwYWNlIGlmXG5vbWl0dGVkLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgbGl0ZXJhbCBjdXJseSBicmFjZSAoIiJ7IiIgb3JcbiIifSIiKSBhcyB0aGUgKmZpbGwqIGNoYXJhY3RlciB3aGVuIHVzaW5nIHRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QuXG5Ib3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBpbnNlcnQgYSBjdXJseSBicmFjZSB3aXRoIGEgbmVzdGVkXG5yZXBsYWNlbWVudCBmaWVsZC4gIFRoaXMgbGltaXRhdGlvbiBkb2VzblwndCBhZmZlY3QgdGhlICJmb3JtYXQoKSJcbmZ1bmN0aW9uLlxuXG5UaGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBhbGlnbm1lbnQgb3B0aW9ucyBpcyBhcyBmb2xsb3dzOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJzxcJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBsZWZ0LWFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBtb3N0IG9iamVjdHMpLiAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnPlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIHJpZ2h0LWFsaWduZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG51bWJlcnMpLiAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCc9XCciICAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgdGhlIHNpZ24gKGlmIGFueSkgICAgfFxuICAgfCAgICAgICAgICAgfCBidXQgYmVmb3JlIHRoZSBkaWdpdHMuICBUaGlzIGlzIHVzZWQgZm9yIHByaW50aW5nIGZpZWxkcyAgIHxcbiAgIHwgICAgICAgICAgIHwgaW4gdGhlIGZvcm0gXCcrMDAwMDAwMTIwXCcuIFRoaXMgYWxpZ25tZW50IG9wdGlvbiBpcyBvbmx5ICAgIHxcbiAgIHwgICAgICAgICAgIHwgdmFsaWQgZm9yIG51bWVyaWMgdHlwZXMuICBJdCBiZWNvbWVzIHRoZSBkZWZhdWx0IHdoZW4gXCcwXCcgIHxcbiAgIHwgICAgICAgICAgIHwgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGZpZWxkIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdeXCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgY2VudGVyZWQgd2l0aGluIHRoZSBhdmFpbGFibGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGUgdGhhdCB1bmxlc3MgYSBtaW5pbXVtIGZpZWxkIHdpZHRoIGlzIGRlZmluZWQsIHRoZSBmaWVsZCB3aWR0aFxud2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZGF0YSB0byBmaWxsIGl0LCBzbyB0aGF0IHRoZVxuYWxpZ25tZW50IG9wdGlvbiBoYXMgbm8gbWVhbmluZyBpbiB0aGlzIGNhc2UuXG5cblRoZSAqc2lnbiogb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIG51bWJlciB0eXBlcywgYW5kIGNhbiBiZSBvbmUgb2ZcbnRoZSBmb2xsb3dpbmc6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnK1wnIiAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgZm9yIGJvdGggcG9zaXRpdmUgYXMgIHxcbiAgIHwgICAgICAgICAgIHwgd2VsbCBhcyBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCctXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBuZWdhdGl2ZSAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXJzICh0aGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yKS4gICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgdXNlZCBvbiBwb3NpdGl2ZSAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXJzLCBhbmQgYSBtaW51cyBzaWduIG9uIG5lZ2F0aXZlIG51bWJlcnMuICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblRoZSAiXCcjXCciIG9wdGlvbiBjYXVzZXMgdGhlICJhbHRlcm5hdGUgZm9ybSIgdG8gYmUgdXNlZCBmb3IgdGhlXG5jb252ZXJzaW9uLiAgVGhlIGFsdGVybmF0ZSBmb3JtIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudFxudHlwZXMuICBUaGlzIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBpbnRlZ2VyLCBmbG9hdCwgY29tcGxleCBhbmRcbkRlY2ltYWwgdHlwZXMuIEZvciBpbnRlZ2Vycywgd2hlbiBiaW5hcnksIG9jdGFsLCBvciBoZXhhZGVjaW1hbCBvdXRwdXRcbmlzIHVzZWQsIHRoaXMgb3B0aW9uIGFkZHMgdGhlIHByZWZpeCByZXNwZWN0aXZlICJcJzBiXCciLCAiXCcwb1wnIiwgb3JcbiJcJzB4XCciIHRvIHRoZSBvdXRwdXQgdmFsdWUuIEZvciBmbG9hdHMsIGNvbXBsZXggYW5kIERlY2ltYWwgdGhlXG5hbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiB0byBhbHdheXMgY29udGFpbiBhXG5kZWNpbWFsLXBvaW50IGNoYXJhY3RlciwgZXZlbiBpZiBubyBkaWdpdHMgZm9sbG93IGl0LiBOb3JtYWxseSwgYVxuZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIgYXBwZWFycyBpbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNvbnZlcnNpb25zXG5vbmx5IGlmIGEgZGlnaXQgZm9sbG93cyBpdC4gSW4gYWRkaXRpb24sIGZvciAiXCdnXCciIGFuZCAiXCdHXCciXG5jb252ZXJzaW9ucywgdHJhaWxpbmcgemVyb3MgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIHJlc3VsdC5cblxuVGhlICJcJyxcJyIgb3B0aW9uIHNpZ25hbHMgdGhlIHVzZSBvZiBhIGNvbW1hIGZvciBhIHRob3VzYW5kcyBzZXBhcmF0b3IuXG5Gb3IgYSBsb2NhbGUgYXdhcmUgc2VwYXJhdG9yLCB1c2UgdGhlICJcJ25cJyIgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZVxuaW5zdGVhZC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogQWRkZWQgdGhlICJcJyxcJyIgb3B0aW9uIChzZWUgYWxzbyAqKlBFUCAzNzgqKikuXG5cbip3aWR0aCogaXMgYSBkZWNpbWFsIGludGVnZXIgZGVmaW5pbmcgdGhlIG1pbmltdW0gZmllbGQgd2lkdGguICBJZiBub3RcbnNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZW50LlxuXG5XaGVuIG5vIGV4cGxpY2l0IGFsaWdubWVudCBpcyBnaXZlbiwgcHJlY2VkaW5nIHRoZSAqd2lkdGgqIGZpZWxkIGJ5IGFcbnplcm8gKCJcJzBcJyIpIGNoYXJhY3RlciBlbmFibGVzIHNpZ24tYXdhcmUgemVyby1wYWRkaW5nIGZvciBudW1lcmljXG50eXBlcy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhICpmaWxsKiBjaGFyYWN0ZXIgb2YgIlwnMFwnIiB3aXRoIGFuXG4qYWxpZ25tZW50KiB0eXBlIG9mICJcJz1cJyIuXG5cblRoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgZGlnaXRzIHNob3VsZFxuYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlXG5mb3JtYXR0ZWQgd2l0aCAiXCdmXCciIGFuZCAiXCdGXCciLCBvciBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50XG5mb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBmb3JtYXR0ZWQgd2l0aCAiXCdnXCciIG9yICJcJ0dcJyIuICBGb3Igbm9uLVxubnVtYmVyIHR5cGVzIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gZmllbGQgc2l6ZSAtIGluIG90aGVyXG53b3JkcywgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQgZnJvbSB0aGUgZmllbGQgY29udGVudC4gVGhlXG4qcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlciB2YWx1ZXMuXG5cbkZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlIHByZXNlbnRlZC5cblxuVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCdzXCciICAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSBmb3Igc3RyaW5ncyBhbmQgICAgfFxuICAgfCAgICAgICAgICAgfCBtYXkgYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICJcJ3NcJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgYXZhaWxhYmxlIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCdiXCciICAgICB8IEJpbmFyeSBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDIuICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnY1wnIiAgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSBjb3JyZXNwb25kaW5nICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgdW5pY29kZSBjaGFyYWN0ZXIgYmVmb3JlIHByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdkXCciICAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTAuICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnb1wnIiAgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDguICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ3hcJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIGxvd2VyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnWFwnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgdXBwZXItICAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCduXCciICAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyAiXCdkXCciLCBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4gICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgICAgfFxuICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICJcJ2RcJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gYmUgZm9ybWF0dGVkXG53aXRoIHRoZSBmbG9hdGluZyBwb2ludCBwcmVzZW50YXRpb24gdHlwZXMgbGlzdGVkIGJlbG93IChleGNlcHQgIlwnblwnIlxuYW5kIE5vbmUpLiBXaGVuIGRvaW5nIHNvLCAiZmxvYXQoKSIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSBpbnRlZ2VyIHRvXG5hIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy5cblxuVGhlIGF2YWlsYWJsZSBwcmVzZW50YXRpb24gdHlwZXMgZm9yIGZsb2F0aW5nIHBvaW50IGFuZCBkZWNpbWFsIHZhbHVlc1xuYXJlOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBUeXBlICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJ2VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFByaW50cyB0aGUgbnVtYmVyIGluIHNjaWVudGlmaWMgICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG5vdGF0aW9uIHVzaW5nIHRoZSBsZXR0ZXIgXCdlXCcgdG8gaW5kaWNhdGUgdGhlIGV4cG9uZW50LiAgICB8XG4gICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAiNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnRVwnIiAgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyAiXCdlXCciIGV4Y2VwdCBpdCB1c2VzIGFuIHVwcGVyICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIFwnRVwnIGFzIHRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnZlwnIiAgICAgfCBGaXhlZCBwb2ludC4gRGlzcGxheXMgdGhlIG51bWJlciBhcyBhIGZpeGVkLXBvaW50IG51bWJlci4gIHxcbiAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICI2Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCdGXCciICAgICB8IEZpeGVkIHBvaW50LiBTYW1lIGFzICJcJ2ZcJyIsIGJ1dCBjb252ZXJ0cyAibmFuIiB0byAiTkFOIiAgICB8XG4gICB8ICAgICAgICAgICB8IGFuZCAiaW5mIiB0byAiSU5GIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnZ1wnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gIEZvciBhIGdpdmVuIHByZWNpc2lvbiAicCA+PSAxIiwgdGhpcyAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcm91bmRzIHRoZSBudW1iZXIgdG8gInAiIHNpZ25pZmljYW50IGRpZ2l0cyBhbmQgdGhlbiAgICAgICB8XG4gICB8ICAgICAgICAgICB8IGZvcm1hdHMgdGhlIHJlc3VsdCBpbiBlaXRoZXIgZml4ZWQtcG9pbnQgZm9ybWF0IG9yIGluICAgICAgfFxuICAgfCAgICAgICAgICAgfCBzY2llbnRpZmljIG5vdGF0aW9uLCBkZXBlbmRpbmcgb24gaXRzIG1hZ25pdHVkZS4gIFRoZSAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcHJlY2lzZSBydWxlcyBhcmUgYXMgZm9sbG93czogc3VwcG9zZSB0aGF0IHRoZSByZXN1bHQgICAgICB8XG4gICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgYW5kIHByZWNpc2lvbiAicC0xIiB8XG4gICB8ICAgICAgICAgICB8IHdvdWxkIGhhdmUgZXhwb25lbnQgImV4cCIuICBUaGVuIGlmICItNCA8PSBleHAgPCBwIiwgdGhlICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZlwnIiBhbmQgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24gInAtMS1leHAiLiAgT3RoZXJ3aXNlLCB0aGUgbnVtYmVyIGlzIGZvcm1hdHRlZCAgIHxcbiAgIHwgICAgICAgICAgIHwgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAiXCdlXCciIGFuZCBwcmVjaXNpb24gInAtMSIuIEluIGJvdGggIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZXMgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSAgICB8XG4gICB8ICAgICAgICAgICB8IHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgYWxzbyByZW1vdmVkIGlmICAgICAgfFxuICAgfCAgICAgICAgICAgfCB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGRpZ2l0cyBmb2xsb3dpbmcgaXQuICBQb3NpdGl2ZSBhbmQgIHxcbiAgIHwgICAgICAgICAgIHwgbmVnYXRpdmUgaW5maW5pdHksIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB6ZXJvLCBhbmQgbmFucywgICB8XG4gICB8ICAgICAgICAgICB8IGFyZSBmb3JtYXR0ZWQgYXMgImluZiIsICItaW5mIiwgIjAiLCAiLTAiIGFuZCAibmFuIiAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCByZXNwZWN0aXZlbHksIHJlZ2FyZGxlc3Mgb2YgdGhlIHByZWNpc2lvbi4gIEEgcHJlY2lzaW9uIG9mIHxcbiAgIHwgICAgICAgICAgIHwgIjAiIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBhIHByZWNpc2lvbiBvZiAiMSIuIFRoZSAgICB8XG4gICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzICI2Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnR1wnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyAiXCdnXCciIGV4Y2VwdCBzd2l0Y2hlcyB0byAiXCdFXCciIGlmICB8XG4gICB8ICAgICAgICAgICB8IHRoZSBudW1iZXIgZ2V0cyB0b28gbGFyZ2UuIFRoZSByZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHkgfFxuICAgfCAgICAgICAgICAgfCBhbmQgTmFOIGFyZSB1cHBlcmNhc2VkLCB0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2dcJyIsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbiAgIHwgICAgICAgICAgIHwgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIG51bWJlciAgICB8XG4gICB8ICAgICAgICAgICB8IHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnJVwnIiAgICAgfCBQZXJjZW50YWdlLiBNdWx0aXBsaWVzIHRoZSBudW1iZXIgYnkgMTAwIGFuZCBkaXNwbGF5cyBpbiAgIHxcbiAgIHwgICAgICAgICAgIHwgZml4ZWQgKCJcJ2ZcJyIpIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSBwZXJjZW50IHNpZ24uICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFNpbWlsYXIgdG8gIlwnZ1wnIiwgZXhjZXB0IHRoYXQgZml4ZWQtcG9pbnQgbm90YXRpb24sIHdoZW4gICB8XG4gICB8ICAgICAgICAgICB8IHVzZWQsIGhhcyBhdCBsZWFzdCBvbmUgZGlnaXQgcGFzdCB0aGUgZGVjaW1hbCBwb2ludC4gVGhlICAgfFxuICAgfCAgICAgICAgICAgfCBkZWZhdWx0IHByZWNpc2lvbiBpcyBhcyBoaWdoIGFzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlICAgIHxcbiAgIHwgICAgICAgICAgIHwgcGFydGljdWxhciB2YWx1ZS4gVGhlIG92ZXJhbGwgZWZmZWN0IGlzIHRvIG1hdGNoIHRoZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG91dHB1dCBvZiAic3RyKCkiIGFzIGFsdGVyZWQgYnkgdGhlIG90aGVyIGZvcm1hdCAgICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBtb2RpZmllcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cblxuRm9ybWF0IGV4YW1wbGVzXG49PT09PT09PT09PT09PT1cblxuVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSAic3RyLmZvcm1hdCgpIiBzeW50YXggYW5kXG5jb21wYXJpc29uIHdpdGggdGhlIG9sZCAiJSItZm9ybWF0dGluZy5cblxuSW4gbW9zdCBvZiB0aGUgY2FzZXMgdGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIHRoZSBvbGQgIiUiLWZvcm1hdHRpbmcsXG53aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgInt9IiBhbmQgd2l0aCAiOiIgdXNlZCBpbnN0ZWFkIG9mICIlIi4gRm9yXG5leGFtcGxlLCAiXCclMDMuMmZcJyIgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gIlwnezowMy4yZn1cJyIuXG5cblRoZSBuZXcgZm9ybWF0IHN5bnRheCBhbHNvIHN1cHBvcnRzIG5ldyBhbmQgZGlmZmVyZW50IG9wdGlvbnMsIHNob3duXG5pbiB0aGUgZm9sbG93IGV4YW1wbGVzLlxuXG5BY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IHBvc2l0aW9uOlxuXG4gICA+Pj4gXCd7MH0sIHsxfSwgezJ9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpXG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwne30sIHt9LCB7fVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKSAgIyAzLjErIG9ubHlcbiAgIFwnYSwgYiwgY1wnXG4gICA+Pj4gXCd7Mn0sIHsxfSwgezB9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpXG4gICBcJ2MsIGIsIGFcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdCgqXCdhYmNcJykgICAgICAjIHVucGFja2luZyBhcmd1bWVudCBzZXF1ZW5jZVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3swfXsxfXswfVwnLmZvcm1hdChcJ2FicmFcJywgXCdjYWRcJykgICAjIGFyZ3VtZW50c1wnIGluZGljZXMgY2FuIGJlIHJlcGVhdGVkXG4gICBcJ2FicmFjYWRhYnJhXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBuYW1lOlxuXG4gICA+Pj4gXCdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX1cJy5mb3JtYXQobGF0aXR1ZGU9XCczNy4yNE5cJywgbG9uZ2l0dWRlPVwnLTExNS44MVdcJylcbiAgIFwnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVdcJ1xuICAgPj4+IGNvb3JkID0ge1wnbGF0aXR1ZGVcJzogXCczNy4yNE5cJywgXCdsb25naXR1ZGVcJzogXCctMTE1LjgxV1wnfVxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KCoqY29vcmQpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50c1wnIGF0dHJpYnV0ZXM6XG5cbiAgID4+PiBjID0gMy01alxuICAgPj4+IChcJ1RoZSBjb21wbGV4IG51bWJlciB7MH0gaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCB7MC5yZWFsfSBcJ1xuICAgLi4uICBcJ2FuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgezAuaW1hZ30uXCcpLmZvcm1hdChjKVxuICAgXCdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgMy4wIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgLTUuMC5cJ1xuICAgPj4+IGNsYXNzIFBvaW50OlxuICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6XG4gICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHlcbiAgIC4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdQb2ludCh7c2VsZi54fSwge3NlbGYueX0pXCcuZm9ybWF0KHNlbGY9c2VsZilcbiAgIC4uLlxuICAgPj4+IHN0cihQb2ludCg0LCAyKSlcbiAgIFwnUG9pbnQoNCwgMilcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzXCcgaXRlbXM6XG5cbiAgID4+PiBjb29yZCA9ICgzLCA1KVxuICAgPj4+IFwnWDogezBbMF19OyAgWTogezBbMV19XCcuZm9ybWF0KGNvb3JkKVxuICAgXCdYOiAzOyAgWTogNVwnXG5cblJlcGxhY2luZyAiJXMiIGFuZCAiJXIiOlxuXG4gICA+Pj4gInJlcHIoKSBzaG93cyBxdW90ZXM6IHshcn07IHN0cigpIGRvZXNuXCd0OiB7IXN9Ii5mb3JtYXQoXCd0ZXN0MVwnLCBcJ3Rlc3QyXCcpXG4gICAicmVwcigpIHNob3dzIHF1b3RlczogXCd0ZXN0MVwnOyBzdHIoKSBkb2VzblwndDogdGVzdDIiXG5cbkFsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6XG5cbiAgID4+PiBcJ3s6PDMwfVwnLmZvcm1hdChcJ2xlZnQgYWxpZ25lZFwnKVxuICAgXCdsZWZ0IGFsaWduZWQgICAgICAgICAgICAgICAgICBcJ1xuICAgPj4+IFwnezo+MzB9XCcuZm9ybWF0KFwncmlnaHQgYWxpZ25lZFwnKVxuICAgXCcgICAgICAgICAgICAgICAgIHJpZ2h0IGFsaWduZWRcJ1xuICAgPj4+IFwnezpeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJylcbiAgIFwnICAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6Kl4zMH1cJy5mb3JtYXQoXCdjZW50ZXJlZFwnKSAgIyB1c2UgXCcqXCcgYXMgYSBmaWxsIGNoYXJcbiAgIFwnKioqKioqKioqKipjZW50ZXJlZCoqKioqKioqKioqXCdcblxuUmVwbGFjaW5nICIlK2YiLCAiJS1mIiwgYW5kICIlIGYiIGFuZCBzcGVjaWZ5aW5nIGEgc2lnbjpcblxuICAgPj4+IFwnezorZn07IHs6K2Z9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGl0IGFsd2F5c1xuICAgXCcrMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG4gICA+Pj4gXCd7OiBmfTsgezogZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgYSBzcGFjZSBmb3IgcG9zaXRpdmUgbnVtYmVyc1xuICAgXCcgMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG4gICA+Pj4gXCd7Oi1mfTsgezotZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgb25seSB0aGUgbWludXMgLS0gc2FtZSBhcyBcJ3s6Zn07IHs6Zn1cJ1xuICAgXCczLjE0MDAwMDsgLTMuMTQwMDAwXCdcblxuUmVwbGFjaW5nICIleCIgYW5kICIlbyIgYW5kIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGRpZmZlcmVudCBiYXNlczpcblxuICAgPj4+ICMgZm9ybWF0IGFsc28gc3VwcG9ydHMgYmluYXJ5IG51bWJlcnNcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiB7MDpifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMFwnXG4gICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OlxuICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDojeH07ICBvY3Q6IHswOiNvfTsgIGJpbjogezA6I2J9Ii5mb3JtYXQoNDIpXG4gICBcJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwXCdcblxuVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjpcblxuICAgPj4+IFwnezosfVwnLmZvcm1hdCgxMjM0NTY3ODkwKVxuICAgXCcxLDIzNCw1NjcsODkwXCdcblxuRXhwcmVzc2luZyBhIHBlcmNlbnRhZ2U6XG5cbiAgID4+PiBwb2ludHMgPSAxOVxuICAgPj4+IHRvdGFsID0gMjJcbiAgID4+PiBcJ0NvcnJlY3QgYW5zd2VyczogezouMiV9XCcuZm9ybWF0KHBvaW50cy90b3RhbClcbiAgIFwnQ29ycmVjdCBhbnN3ZXJzOiA4Ni4zNiVcJ1xuXG5Vc2luZyB0eXBlLXNwZWNpZmljIGZvcm1hdHRpbmc6XG5cbiAgID4+PiBpbXBvcnQgZGF0ZXRpbWVcbiAgID4+PiBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMCwgNywgNCwgMTIsIDE1LCA1OClcbiAgID4+PiBcJ3s6JVktJW0tJWQgJUg6JU06JVN9XCcuZm9ybWF0KGQpXG4gICBcJzIwMTAtMDctMDQgMTI6MTU6NThcJ1xuXG5OZXN0aW5nIGFyZ3VtZW50cyBhbmQgbW9yZSBjb21wbGV4IGV4YW1wbGVzOlxuXG4gICA+Pj4gZm9yIGFsaWduLCB0ZXh0IGluIHppcChcJzxePlwnLCBbXCdsZWZ0XCcsIFwnY2VudGVyXCcsIFwncmlnaHRcJ10pOlxuICAgLi4uICAgICBcJ3swOntmaWxsfXthbGlnbn0xNn1cJy5mb3JtYXQodGV4dCwgZmlsbD1hbGlnbiwgYWxpZ249YWxpZ24pXG4gICAuLi5cbiAgIFwnbGVmdDw8PDw8PDw8PDw8PFwnXG4gICBcJ15eXl5eY2VudGVyXl5eXl5cJ1xuICAgXCc+Pj4+Pj4+Pj4+PnJpZ2h0XCdcbiAgID4+PlxuICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV1cbiAgID4+PiBcJ3s6MDJYfXs6MDJYfXs6MDJYfXs6MDJYfVwnLmZvcm1hdCgqb2N0ZXRzKVxuICAgXCdDMEE4MDAwMVwnXG4gICA+Pj4gaW50KF8sIDE2KVxuICAgMzIzMjIzNTUyMVxuICAgPj4+XG4gICA+Pj4gd2lkdGggPSA1XG4gICA+Pj4gZm9yIG51bSBpbiByYW5nZSg1LDEyKTogI2RvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRVxuICAgLi4uICAgICBmb3IgYmFzZSBpbiBcJ2RYb2JcJzpcbiAgIC4uLiAgICAgICAgIHByaW50KFwnezA6e3dpZHRofXtiYXNlfX1cJy5mb3JtYXQobnVtLCBiYXNlPWJhc2UsIHdpZHRoPXdpZHRoKSwgZW5kPVwnIFwnKVxuICAgLi4uICAgICBwcmludCgpXG4gICAuLi5cbiAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxXG4gICAgICAgNiAgICAgNiAgICAgNiAgIDExMFxuICAgICAgIDcgICAgIDcgICAgIDcgICAxMTFcbiAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwXG4gICAgICAgOSAgICAgOSAgICAxMSAgMTAwMVxuICAgICAgMTAgICAgIEEgICAgMTIgIDEwMTBcbiAgICAgIDExICAgICBCICAgIDEzICAxMDExXG4nLAotICdmdW5jdGlvbic6IHUnXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBmdW5jZGVmICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKiIgW3BhcmFtZXRlcl0gKCIsIiBkZWZwYXJhbWV0ZXIpKiBbIiwiICIqKiIgcGFyYW1ldGVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBwYXJhbWV0ZXIgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG5cbiAgIEBmMShhcmcpXG4gICBAZjJcbiAgIGRlZiBmdW5jKCk6IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbipleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzLiJcbkZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgKmFyZ3VtZW50KiBtYXlcbmJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwncyBkZWZhdWx0IHZhbHVlIGlzXG5zdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbnBhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpc1xuaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuIHRoZVxuZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXNcbmV2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLVxuY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnRcbnRvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggYXMgYVxubGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuIGJ5XG5hcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgbW9kaWZpZWQuXG5UaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyB0byB1c2VcbiJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgdGhlXG5mdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iIippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55XG5leGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZVxuZm9ybSAiIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3XG5kaWN0aW9uYXJ5IHJlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3XG5lbXB0eSBkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmVcbmtleXdvcmQtb25seSBwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiIGZvbGxvd2luZ1xudGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gdGhvc2Vcbm9mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5IGhhdmVcbiJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlIHBhcmFtZXRlclxubGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kIGFyZVxuZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyBtYXlcbmJlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgY29kZS5cblRoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG5mdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG5kaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzXCcgbmFtZXMgaW4gdGhlICJfX2Fubm90YXRpb25zX18iXG5hdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG5leHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGFcbmV4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjtcbmEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yXG5hc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYVxuZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSBpdFxuYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIiJkZWYiIlxuc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG5mdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZFxuaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG5cbiAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuJywKLSAnZ2xvYmFsJzogdSdcblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgZ2xvYmFsX3N0bXQgOjo9ICJnbG9iYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcblxuVGhlICJnbG9iYWwiIHN0YXRlbWVudCBpcyBhIGRlY2xhcmF0aW9uIHdoaWNoIGhvbGRzIGZvciB0aGUgZW50aXJlXG5jdXJyZW50IGNvZGUgYmxvY2suICBJdCBtZWFucyB0aGF0IHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgYXJlIHRvIGJlXG5pbnRlcnByZXRlZCBhcyBnbG9iYWxzLiAgSXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NpZ24gdG8gYSBnbG9iYWxcbnZhcmlhYmxlIHdpdGhvdXQgImdsb2JhbCIsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0b1xuZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC5cblxuTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgY29kZVxuYmxvY2sgdGV4dHVhbGx5IHByZWNlZGluZyB0aGF0ICJnbG9iYWwiIHN0YXRlbWVudC5cblxuTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZm9ybWFsXG5wYXJhbWV0ZXJzIG9yIGluIGEgImZvciIgbG9vcCBjb250cm9sIHRhcmdldCwgImNsYXNzIiBkZWZpbml0aW9uLFxuZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgImltcG9ydCIgc3RhdGVtZW50LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90XG5lbmZvcmNlIHRoZSB0d28gcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZSB0aGlzXG5mcmVlZG9tLCBhcyBmdXR1cmUgaW1wbGVtZW50YXRpb25zIG1heSBlbmZvcmNlIHRoZW0gb3Igc2lsZW50bHkgY2hhbmdlXG50aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogdGhlICJnbG9iYWwiIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBwYXJzZXIuICBJdFxuYXBwbGllcyBvbmx5IHRvIGNvZGUgcGFyc2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlICJnbG9iYWwiXG5zdGF0ZW1lbnQuIEluIHBhcnRpY3VsYXIsIGEgImdsb2JhbCIgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhIHN0cmluZ1xub3IgY29kZSBvYmplY3Qgc3VwcGxpZWQgdG8gdGhlIGJ1aWx0LWluICJleGVjKCkiIGZ1bmN0aW9uIGRvZXMgbm90XG5hZmZlY3QgdGhlIGNvZGUgYmxvY2sgKmNvbnRhaW5pbmcqIHRoZSBmdW5jdGlvbiBjYWxsLCBhbmQgY29kZVxuY29udGFpbmVkIGluIHN1Y2ggYSBzdHJpbmcgaXMgdW5hZmZlY3RlZCBieSAiZ2xvYmFsIiBzdGF0ZW1lbnRzIGluIHRoZVxuY29kZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgImV2YWwoKSJcbmFuZCAiY29tcGlsZSgpIiBmdW5jdGlvbnMuXG4nLAotICdpZC1jbGFzc2VzJzogdSdcblJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWxcbm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmRcbnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcblxuIl8qIlxuICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCBpZGVudGlmaWVyICJfIlxuICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiB0aGVcbiAgIGxhc3QgZXZhbHVhdGlvbjsgaXQgaXMgc3RvcmVkIGluIHRoZSAiYnVpbHRpbnMiIG1vZHVsZS4gIFdoZW4gbm90XG4gICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90IGRlZmluZWQuXG4gICBTZWUgc2VjdGlvbiAqVGhlIGltcG9ydCBzdGF0ZW1lbnQqLlxuXG4gICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4gICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLlxuXG4iX18qX18iXG4gICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyXG4gICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudFxuICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlICpTcGVjaWFsIG1ldGhvZCBuYW1lcyogc2VjdGlvblxuICAgYW5kIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2ZcbiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCBkb2VzIG5vdFxuICAgZm9sbG93IGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2Ugd2l0aG91dFxuICAgd2FybmluZy5cblxuIl9fKiJcbiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZVxuICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhIG1hbmdsZWQgZm9ybVxuICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZFxuICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiAqSWRlbnRpZmllcnMgKE5hbWVzKSouXG4nLAotICdpZGVudGlmaWVycyc6IHUnXG5JZGVudGlmaWVycyBhbmQga2V5d29yZHNcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5JZGVudGlmaWVycyAoYWxzbyByZWZlcnJlZCB0byBhcyAqbmFtZXMqKSBhcmUgZGVzY3JpYmVkIGJ5IHRoZVxuZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnMuXG5cblRoZSBzeW50YXggb2YgaWRlbnRpZmllcnMgaW4gUHl0aG9uIGlzIGJhc2VkIG9uIHRoZSBVbmljb2RlIHN0YW5kYXJkXG5hbm5leCBVQVgtMzEsIHdpdGggZWxhYm9yYXRpb24gYW5kIGNoYW5nZXMgYXMgZGVmaW5lZCBiZWxvdzsgc2VlIGFsc29cbioqUEVQIDMxMzEqKiBmb3IgZnVydGhlciBkZXRhaWxzLlxuXG5XaXRoaW4gdGhlIEFTQ0lJIHJhbmdlIChVKzAwMDEuLlUrMDA3RiksIHRoZSB2YWxpZCBjaGFyYWN0ZXJzIGZvclxuaWRlbnRpZmllcnMgYXJlIHRoZSBzYW1lIGFzIGluIFB5dGhvbiAyLng6IHRoZSB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZVxubGV0dGVycyAiQSIgdGhyb3VnaCAiWiIsIHRoZSB1bmRlcnNjb3JlICJfIiBhbmQsIGV4Y2VwdCBmb3IgdGhlIGZpcnN0XG5jaGFyYWN0ZXIsIHRoZSBkaWdpdHMgIjAiIHRocm91Z2ggIjkiLlxuXG5QeXRob24gMy4wIGludHJvZHVjZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGZyb20gb3V0c2lkZSB0aGUgQVNDSUlcbnJhbmdlIChzZWUgKipQRVAgMzEzMSoqKS4gIEZvciB0aGVzZSBjaGFyYWN0ZXJzLCB0aGUgY2xhc3NpZmljYXRpb25cbnVzZXMgdGhlIHZlcnNpb24gb2YgdGhlIFVuaWNvZGUgQ2hhcmFjdGVyIERhdGFiYXNlIGFzIGluY2x1ZGVkIGluIHRoZVxuInVuaWNvZGVkYXRhIiBtb2R1bGUuXG5cbklkZW50aWZpZXJzIGFyZSB1bmxpbWl0ZWQgaW4gbGVuZ3RoLiAgQ2FzZSBpcyBzaWduaWZpY2FudC5cblxuICAgaWRlbnRpZmllciAgIDo6PSB4aWRfc3RhcnQgeGlkX2NvbnRpbnVlKlxuICAgaWRfc3RhcnQgICAgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gZ2VuZXJhbCBjYXRlZ29yaWVzIEx1LCBMbCwgTHQsIExtLCBMbywgTmwsIHRoZSB1bmRlcnNjb3JlLCBhbmQgY2hhcmFjdGVycyB3aXRoIHRoZSBPdGhlcl9JRF9TdGFydCBwcm9wZXJ0eT5cbiAgIGlkX2NvbnRpbnVlICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0LCBwbHVzIGNoYXJhY3RlcnMgaW4gdGhlIGNhdGVnb3JpZXMgTW4sIE1jLCBOZCwgUGMgYW5kIG90aGVycyB3aXRoIHRoZSBPdGhlcl9JRF9Db250aW51ZSBwcm9wZXJ0eT5cbiAgIHhpZF9zdGFydCAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0IHdob3NlIE5GS0Mgbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfc3RhcnQgeGlkX2NvbnRpbnVlKiI+XG4gICB4aWRfY29udGludWUgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9jb250aW51ZSB3aG9zZSBORktDIG5vcm1hbGl6YXRpb24gaXMgaW4gImlkX2NvbnRpbnVlKiI+XG5cblRoZSBVbmljb2RlIGNhdGVnb3J5IGNvZGVzIG1lbnRpb25lZCBhYm92ZSBzdGFuZCBmb3I6XG5cbiogKkx1KiAtIHVwcGVyY2FzZSBsZXR0ZXJzXG5cbiogKkxsKiAtIGxvd2VyY2FzZSBsZXR0ZXJzXG5cbiogKkx0KiAtIHRpdGxlY2FzZSBsZXR0ZXJzXG5cbiogKkxtKiAtIG1vZGlmaWVyIGxldHRlcnNcblxuKiAqTG8qIC0gb3RoZXIgbGV0dGVyc1xuXG4qICpObCogLSBsZXR0ZXIgbnVtYmVyc1xuXG4qICpNbiogLSBub25zcGFjaW5nIG1hcmtzXG5cbiogKk1jKiAtIHNwYWNpbmcgY29tYmluaW5nIG1hcmtzXG5cbiogKk5kKiAtIGRlY2ltYWwgbnVtYmVyc1xuXG4qICpQYyogLSBjb25uZWN0b3IgcHVuY3R1YXRpb25zXG5cbiogKk90aGVyX0lEX1N0YXJ0KiAtIGV4cGxpY2l0IGxpc3Qgb2YgY2hhcmFjdGVycyBpbiBQcm9wTGlzdC50eHQgdG9cbiAgc3VwcG9ydCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXG4qICpPdGhlcl9JRF9Db250aW51ZSogLSBsaWtld2lzZVxuXG5BbGwgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBub3JtYWwgZm9ybSBORktDIHdoaWxlIHBhcnNpbmc7XG5jb21wYXJpc29uIG9mIGlkZW50aWZpZXJzIGlzIGJhc2VkIG9uIE5GS0MuXG5cbkEgbm9uLW5vcm1hdGl2ZSBIVE1MIGZpbGUgbGlzdGluZyBhbGwgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGZvclxuVW5pY29kZSA0LjEgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmRjbC5ocGkudW5pLVxucG90c2RhbS5kZS9ob21lL2xvZXdpcy90YWJsZS0zMTMxLmh0bWwuXG5cblxuS2V5d29yZHNcbj09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICprZXl3b3Jkcyogb2ZcbnRoZSBsYW5ndWFnZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG9yZGluYXJ5IGlkZW50aWZpZXJzLiAgVGhleSBtdXN0XG5iZSBzcGVsbGVkIGV4YWN0bHkgYXMgd3JpdHRlbiBoZXJlOlxuXG4gICBGYWxzZSAgICAgIGNsYXNzICAgICAgZmluYWxseSAgICBpcyAgICAgICAgIHJldHVyblxuICAgTm9uZSAgICAgICBjb250aW51ZSAgIGZvciAgICAgICAgbGFtYmRhICAgICB0cnlcbiAgIFRydWUgICAgICAgZGVmICAgICAgICBmcm9tICAgICAgIG5vbmxvY2FsICAgd2hpbGVcbiAgIGFuZCAgICAgICAgZGVsICAgICAgICBnbG9iYWwgICAgIG5vdCAgICAgICAgd2l0aFxuICAgYXMgICAgICAgICBlbGlmICAgICAgIGlmICAgICAgICAgb3IgICAgICAgICB5aWVsZFxuICAgYXNzZXJ0ICAgICBlbHNlICAgICAgIGltcG9ydCAgICAgcGFzc1xuICAgYnJlYWsgICAgICBleGNlcHQgICAgIGluICAgICAgICAgcmFpc2VcblxuXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbiJfKiJcbiAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllciAiXyJcbiAgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlXG4gICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICBXaGVuIG5vdFxuICAgaW4gaW50ZXJhY3RpdmUgbW9kZSwgIl8iIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCBkZWZpbmVkLlxuICAgU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgIl8iIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICAiZ2V0dGV4dCIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi5cblxuIl9fKl9fIlxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lcyBub3RcbiAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlIHdpdGhvdXRcbiAgIHdhcm5pbmcuXG5cbiJfXyoiXG4gICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkIHdpdGhpbiB0aGVcbiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm1cbiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmRcbiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gKklkZW50aWZpZXJzIChOYW1lcykqLlxuJywKLSAnaWYnOiB1J1xuVGhlICJpZiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKipcblxuVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKLSAnaW1hZ2luYXJ5JzogdSdcbkltYWdpbmFyeSBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqXG5cbkltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcblxuQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCBvZiAwLjAuXG5Db21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzXG5hbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSBjb21wbGV4XG5udW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gaXQsXG5lLmcuLCAiKDMrNGopIi4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOlxuXG4gICAzLjE0aiAgIDEwLmogICAgMTBqICAgICAuMDAxaiAgIDFlMTAwaiAgMy4xNGUtMTBqXG4nLAotICdpbXBvcnQnOiB1J1xuVGhlICJpbXBvcnQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbiAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbiAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5UaGUgYmFzaWMgaW1wb3J0IHN0YXRlbWVudCAobm8gImZyb20iIGNsYXVzZSkgaXMgZXhlY3V0ZWQgaW4gdHdvXG5zdGVwczpcblxuMS4gZmluZCBhIG1vZHVsZSwgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeVxuXG4yLiBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBzY29wZVxuICAgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG5cbldoZW4gdGhlIHN0YXRlbWVudCBjb250YWlucyBtdWx0aXBsZSBjbGF1c2VzIChzZXBhcmF0ZWQgYnkgY29tbWFzKSB0aGVcbnR3byBzdGVwcyBhcmUgY2FycmllZCBvdXQgc2VwYXJhdGVseSBmb3IgZWFjaCBjbGF1c2UsIGp1c3QgYXMgdGhvdWdoXG50aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZHVhbCBpbXBvcnQgc3RhdGVtZW50cy5cblxuVGhlIGRldGFpbHMgb2YgdGhlIGZpcnN0IHN0ZXAsIGZpbmRpbmcgYW5kIGxvYWRpbmcgbW9kdWxlcyBhcmVcbmRlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgKmltcG9ydCBzeXN0ZW0qLFxud2hpY2ggYWxzbyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgdHlwZXMgb2YgcGFja2FnZXMgYW5kIG1vZHVsZXMgdGhhdFxuY2FuIGJlIGltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0b1xuY3VzdG9taXplIHRoZSBpbXBvcnQgc3lzdGVtLiBOb3RlIHRoYXQgZmFpbHVyZXMgaW4gdGhpcyBzdGVwIG1heVxuaW5kaWNhdGUgZWl0aGVyIHRoYXQgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9jYXRlZCwgKm9yKiB0aGF0IGFuXG5lcnJvciBvY2N1cnJlZCB3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uXG5vZiB0aGUgbW9kdWxlXCdzIGNvZGUuXG5cbklmIHRoZSByZXF1ZXN0ZWQgbW9kdWxlIGlzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGl0IHdpbGwgYmUgbWFkZVxuYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6XG5cbiogSWYgdGhlIG1vZHVsZSBuYW1lIGlzIGZvbGxvd2VkIGJ5ICJhcyIsIHRoZW4gdGhlIG5hbWUgZm9sbG93aW5nXG4gICJhcyIgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS5cblxuKiBJZiBubyBvdGhlciBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgYVxuICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxlXCdzIG5hbWUgaXMgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZVxuICBhcyBhIHJlZmVyZW5jZSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlXG5cbiogSWYgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyAqbm90KiBhIHRvcCBsZXZlbCBtb2R1bGUsIHRoZW4gdGhlXG4gIG5hbWUgb2YgdGhlIHRvcCBsZXZlbCBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZSBpcyBib3VuZCBpblxuICB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSB0b3AgbGV2ZWwgcGFja2FnZS4gVGhlXG4gIGltcG9ydGVkIG1vZHVsZSBtdXN0IGJlIGFjY2Vzc2VkIHVzaW5nIGl0cyBmdWxsIHF1YWxpZmllZCBuYW1lXG4gIHJhdGhlciB0aGFuIGRpcmVjdGx5XG5cblRoZSAiZnJvbSIgZm9ybSB1c2VzIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGV4IHByb2Nlc3M6XG5cbjEuIGZpbmQgdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gdGhlICJmcm9tIiBjbGF1c2UsIGxvYWRpbmcgYW5kXG4gICBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5O1xuXG4yLiBmb3IgZWFjaCBvZiB0aGUgaWRlbnRpZmllcnMgc3BlY2lmaWVkIGluIHRoZSAiaW1wb3J0IiBjbGF1c2VzOlxuXG4gICAxLiBjaGVjayBpZiB0aGUgaW1wb3J0ZWQgbW9kdWxlIGhhcyBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lXG5cbiAgIDIuIGlmIG5vdCwgYXR0ZW1wdCB0byBpbXBvcnQgYSBzdWJtb2R1bGUgd2l0aCB0aGF0IG5hbWUgYW5kIHRoZW5cbiAgICAgIGNoZWNrIHRoZSBpbXBvcnRlZCBtb2R1bGUgYWdhaW4gZm9yIHRoYXQgYXR0cmlidXRlXG5cbiAgIDMuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kLCAiSW1wb3J0RXJyb3IiIGlzIHJhaXNlZC5cblxuICAgNC4gb3RoZXJ3aXNlLCBhIHJlZmVyZW5jZSB0byB0aGF0IHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUgbG9jYWxcbiAgICAgIG5hbWVzcGFjZSwgdXNpbmcgdGhlIG5hbWUgaW4gdGhlICJhcyIgY2xhdXNlIGlmIGl0IGlzIHByZXNlbnQsXG4gICAgICBvdGhlcndpc2UgdXNpbmcgdGhlIGF0dHJpYnV0ZSBuYW1lXG5cbkV4YW1wbGVzOlxuXG4gICBpbXBvcnQgZm9vICAgICAgICAgICAgICAgICAjIGZvbyBpbXBvcnRlZCBhbmQgYm91bmQgbG9jYWxseVxuICAgaW1wb3J0IGZvby5iYXIuYmF6ICAgICAgICAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCwgZm9vIGJvdW5kIGxvY2FsbHlcbiAgIGltcG9ydCBmb28uYmFyLmJheiBhcyBmYmIgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzIGZiYlxuICAgZnJvbSBmb28uYmFyIGltcG9ydCBiYXogICAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCBhbmQgYm91bmQgYXMgYmF6XG4gICBmcm9tIGZvbyBpbXBvcnQgYXR0ciAgICAgICAjIGZvbyBpbXBvcnRlZCBhbmQgZm9vLmF0dHIgYm91bmQgYXMgYXR0clxuXG5JZiB0aGUgbGlzdCBvZiBpZGVudGlmaWVycyBpcyByZXBsYWNlZCBieSBhIHN0YXIgKCJcJypcJyIpLCBhbGwgcHVibGljXG5uYW1lcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgYXJlIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZVxuc2NvcGUgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG5cblRoZSAqcHVibGljIG5hbWVzKiBkZWZpbmVkIGJ5IGEgbW9kdWxlIGFyZSBkZXRlcm1pbmVkIGJ5IGNoZWNraW5nIHRoZVxubW9kdWxlXCdzIG5hbWVzcGFjZSBmb3IgYSB2YXJpYWJsZSBuYW1lZCAiX19hbGxfXyI7IGlmIGRlZmluZWQsIGl0IG11c3RcbmJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aGljaCBhcmUgbmFtZXMgZGVmaW5lZCBvciBpbXBvcnRlZCBieSB0aGF0XG5tb2R1bGUuICBUaGUgbmFtZXMgZ2l2ZW4gaW4gIl9fYWxsX18iIGFyZSBhbGwgY29uc2lkZXJlZCBwdWJsaWMgYW5kXG5hcmUgcmVxdWlyZWQgdG8gZXhpc3QuICBJZiAiX19hbGxfXyIgaXMgbm90IGRlZmluZWQsIHRoZSBzZXQgb2YgcHVibGljXG5uYW1lcyBpbmNsdWRlcyBhbGwgbmFtZXMgZm91bmQgaW4gdGhlIG1vZHVsZVwncyBuYW1lc3BhY2Ugd2hpY2ggZG8gbm90XG5iZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyICgiXCdfXCciKS4gICJfX2FsbF9fIiBzaG91bGQgY29udGFpblxudGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZCBhY2NpZGVudGFsbHkgZXhwb3J0aW5nXG5pdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCB3ZXJlXG5pbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG5cblRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIgLS0tIGlzIG9ubHlcbmFsbG93ZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4gIEF0dGVtcHRpbmcgdG8gdXNlIGl0IGluIGNsYXNzIG9yXG5mdW5jdGlvbiBkZWZpbml0aW9ucyB3aWxsIHJhaXNlIGEgIlN5bnRheEVycm9yIi5cblxuV2hlbiBzcGVjaWZ5aW5nIHdoYXQgbW9kdWxlIHRvIGltcG9ydCB5b3UgZG8gbm90IGhhdmUgdG8gc3BlY2lmeSB0aGVcbmFic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzIGNvbnRhaW5lZFxud2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0IHdpdGhpblxudGhlIHNhbWUgdG9wIHBhY2thZ2Ugd2l0aG91dCBoYXZpbmcgdG8gbWVudGlvbiB0aGUgcGFja2FnZSBuYW1lLiBCeVxudXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgImZyb20iIHlvdVxuY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHlcbndpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50XG5wYWNrYWdlIHdoZXJlIHRoZSBtb2R1bGUgbWFraW5nIHRoZSBpbXBvcnQgZXhpc3RzLiBUd28gZG90cyBtZWFucyB1cFxub25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgZXhlY3V0ZVxuImZyb20gLiBpbXBvcnQgbW9kIiBmcm9tIGEgbW9kdWxlIGluIHRoZSAicGtnIiBwYWNrYWdlIHRoZW4geW91IHdpbGxcbmVuZCB1cCBpbXBvcnRpbmcgInBrZy5tb2QiLiBJZiB5b3UgZXhlY3V0ZSAiZnJvbSAuLnN1YnBrZzIgaW1wb3J0IG1vZCJcbmZyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGVcbnNwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXMgY29udGFpbmVkIHdpdGhpbiAqKlBFUCAzMjgqKi5cblxuImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXRcbmRldGVybWluZSBkeW5hbWljYWxseSB0aGUgbW9kdWxlcyB0byBiZSBsb2FkZWQuXG5cblxuRnV0dXJlIHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09XG5cbkEgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgcGFydGljdWxhclxubW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZVxuYXZhaWxhYmxlIGluIGEgc3BlY2lmaWVkIGZ1dHVyZSByZWxlYXNlIG9mIFB5dGhvbiB3aGVyZSB0aGUgZmVhdHVyZVxuYmVjb21lcyBzdGFuZGFyZC5cblxuVGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlIHZlcnNpb25zXG5vZiBQeXRob24gdGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlLiAgSXRcbmFsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZVxucmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLlxuXG4gICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIlxuICAgZmVhdHVyZSAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuICAgbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgbmVhciB0aGUgdG9wIG9mIHRoZSBtb2R1bGUuICBUaGUgb25seVxubGluZXMgdGhhdCBjYW4gYXBwZWFyIGJlZm9yZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlOlxuXG4qIHRoZSBtb2R1bGUgZG9jc3RyaW5nIChpZiBhbnkpLFxuXG4qIGNvbW1lbnRzLFxuXG4qIGJsYW5rIGxpbmVzLCBhbmRcblxuKiBvdGhlciBmdXR1cmUgc3RhdGVtZW50cy5cblxuVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDMuMCBhcmUgImFic29sdXRlX2ltcG9ydCIsXG4iZGl2aXNpb24iLCAiZ2VuZXJhdG9ycyIsICJ1bmljb2RlX2xpdGVyYWxzIiwgInByaW50X2Z1bmN0aW9uIixcbiJuZXN0ZWRfc2NvcGVzIiBhbmQgIndpdGhfc3RhdGVtZW50Ii4gIFRoZXkgYXJlIGFsbCByZWR1bmRhbnQgYmVjYXVzZVxudGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgcmVjb2duaXplZCBhbmQgdHJlYXRlZCBzcGVjaWFsbHkgYXQgY29tcGlsZVxudGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW5cbmltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgZGlmZmVyZW50IGNvZGUuICBJdCBtYXkgZXZlbiBiZSB0aGUgY2FzZVxudGhhdCBhIG5ldyBmZWF0dXJlIGludHJvZHVjZXMgbmV3IGluY29tcGF0aWJsZSBzeW50YXggKHN1Y2ggYXMgYSBuZXdcbnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGVcbm1vZHVsZSBkaWZmZXJlbnRseS4gIFN1Y2ggZGVjaXNpb25zIGNhbm5vdCBiZSBwdXNoZWQgb2ZmIHVudGlsXG5ydW50aW1lLlxuXG5Gb3IgYW55IGdpdmVuIHJlbGVhc2UsIHRoZSBjb21waWxlciBrbm93cyB3aGljaCBmZWF0dXJlIG5hbWVzIGhhdmVcbmJlZW4gZGVmaW5lZCwgYW5kIHJhaXNlcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZ1dHVyZSBzdGF0ZW1lbnRcbmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuXG5cblRoZSBkaXJlY3QgcnVudGltZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGZvciBhbnkgaW1wb3J0IHN0YXRlbWVudDpcbnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgd2lsbFxuYmUgaW1wb3J0ZWQgaW4gdGhlIHVzdWFsIHdheSBhdCB0aGUgdGltZSB0aGUgZnV0dXJlIHN0YXRlbWVudCBpc1xuZXhlY3V0ZWQuXG5cblRoZSBpbnRlcmVzdGluZyBydW50aW1lIHNlbWFudGljcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGZlYXR1cmVcbmVuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuXG5cbk5vdGUgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHN0YXRlbWVudDpcblxuICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdXG5cblRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXRcJ3MgYW4gb3JkaW5hcnkgaW1wb3J0IHN0YXRlbWVudCB3aXRoXG5ubyBzcGVjaWFsIHNlbWFudGljcyBvciBzeW50YXggcmVzdHJpY3Rpb25zLlxuXG5Db2RlIGNvbXBpbGVkIGJ5IGNhbGxzIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImV4ZWMoKSIgYW5kXG4iY29tcGlsZSgpIiB0aGF0IG9jY3VyIGluIGEgbW9kdWxlICJNIiBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudFxud2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggdGhlXG5mdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4gYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbiJjb21waWxlKCkiIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBmb3IgZGV0YWlscy5cblxuQSBmdXR1cmUgc3RhdGVtZW50IHR5cGVkIGF0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdCB3aWxsXG50YWtlIGVmZmVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVycHJldGVyIHNlc3Npb24uICBJZiBhblxuaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAqLWkqIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWVcbnRvIGV4ZWN1dGUsIGFuZCB0aGUgc2NyaXB0IGluY2x1ZGVzIGEgZnV0dXJlIHN0YXRlbWVudCwgaXQgd2lsbCBiZSBpblxuZWZmZWN0IGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHNjcmlwdCBpc1xuZXhlY3V0ZWQuXG5cblNlZSBhbHNvOiAqKlBFUCAyMzYqKiAtIEJhY2sgdG8gdGhlIF9fZnV0dXJlX19cblxuICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS5cbicsCi0gJ2luJzogdSdcbk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG4nLAotICdpbnRlZ2Vycyc6IHUnXG5JbnRlZ2VyIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqXG5cbkludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGludGVnZXIgICAgICAgIDo6PSBkZWNpbWFsaW50ZWdlciB8IG9jdGludGVnZXIgfCBoZXhpbnRlZ2VyIHwgYmluaW50ZWdlclxuICAgZGVjaW1hbGludGVnZXIgOjo9IG5vbnplcm9kaWdpdCBkaWdpdCogfCAiMCIrXG4gICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiXG4gICBkaWdpdCAgICAgICAgICA6Oj0gIjAiLi4uIjkiXG4gICBvY3RpbnRlZ2VyICAgICA6Oj0gIjAiICgibyIgfCAiTyIpIG9jdGRpZ2l0K1xuICAgaGV4aW50ZWdlciAgICAgOjo9ICIwIiAoIngiIHwgIlgiKSBoZXhkaWdpdCtcbiAgIGJpbmludGVnZXIgICAgIDo6PSAiMCIgKCJiIiB8ICJCIikgYmluZGlnaXQrXG4gICBvY3RkaWdpdCAgICAgICA6Oj0gIjAiLi4uIjciXG4gICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiJcbiAgIGJpbmRpZ2l0ICAgICAgIDo6PSAiMCIgfCAiMSJcblxuVGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgaW50ZWdlciBsaXRlcmFscyBhcGFydCBmcm9tIHdoYXRcbmNhbiBiZSBzdG9yZWQgaW4gYXZhaWxhYmxlIG1lbW9yeS5cblxuTm90ZSB0aGF0IGxlYWRpbmcgemVyb3MgaW4gYSBub24temVybyBkZWNpbWFsIG51bWJlciBhcmUgbm90IGFsbG93ZWQuXG5UaGlzIGlzIGZvciBkaXNhbWJpZ3VhdGlvbiB3aXRoIEMtc3R5bGUgb2N0YWwgbGl0ZXJhbHMsIHdoaWNoIFB5dGhvblxudXNlZCBiZWZvcmUgdmVyc2lvbiAzLjAuXG5cblNvbWUgZXhhbXBsZXMgb2YgaW50ZWdlciBsaXRlcmFsczpcblxuICAgNyAgICAgMjE0NzQ4MzY0NyAgICAgICAgICAgICAgICAgICAgICAgIDBvMTc3ICAgIDBiMTAwMTEwMTExXG4gICAzICAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiAgICAgMG8zNzcgICAgMHhkZWFkYmVlZlxuJywKLSAnbGFtYmRhJzogdSdcbkxhbWJkYXNcbioqKioqKipcblxuICAgbGFtYmRhX2V4cHIgICAgICAgIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uXG4gICBsYW1iZGFfZXhwcl9ub2NvbmQgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25fbm9jb25kXG5cbkxhbWJkYSBleHByZXNzaW9ucyAoc29tZXRpbWVzIGNhbGxlZCBsYW1iZGEgZm9ybXMpIGFyZSB1c2VkIHRvIGNyZWF0ZVxuYW5vbnltb3VzIGZ1bmN0aW9ucy4gVGhlIGV4cHJlc3Npb24gImxhbWJkYSBhcmd1bWVudHM6IGV4cHJlc3Npb24iXG55aWVsZHMgYSBmdW5jdGlvbiBvYmplY3QuICBUaGUgdW5uYW1lZCBvYmplY3QgYmVoYXZlcyBsaWtlIGEgZnVuY3Rpb25cbm9iamVjdCBkZWZpbmVkIHdpdGhcblxuICAgZGVmIDxsYW1iZGE+KGFyZ3VtZW50cyk6XG4gICAgICAgcmV0dXJuIGV4cHJlc3Npb25cblxuU2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgbGlzdHMuXG5Ob3RlIHRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZXhwcmVzc2lvbnMgY2Fubm90IGNvbnRhaW5cbnN0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuXG4nLAotICdsaXN0cyc6IHUnXG5MaXN0IGRpc3BsYXlzXG4qKioqKioqKioqKioqXG5cbkEgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkIGluXG5zcXVhcmUgYnJhY2tldHM6XG5cbiAgIGxpc3RfZGlzcGxheSA6Oj0gIlsiIFtzdGFycmVkX2xpc3QgfCBjb21wcmVoZW5zaW9uXSAiXSJcblxuQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LCB0aGUgY29udGVudHMgYmVpbmcgc3BlY2lmaWVkXG5ieSBlaXRoZXIgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9yIGEgY29tcHJlaGVuc2lvbi4gIFdoZW4gYSBjb21tYS1cbnNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGlzIHN1cHBsaWVkLCBpdHMgZWxlbWVudHMgYXJlIGV2YWx1YXRlZFxuZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW4gdGhhdCBvcmRlci5cbldoZW4gYSBjb21wcmVoZW5zaW9uIGlzIHN1cHBsaWVkLCB0aGUgbGlzdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZVxuZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gdGhlIGNvbXByZWhlbnNpb24uXG4nLAotICduYW1pbmcnOiB1J1xuTmFtaW5nIGFuZCBiaW5kaW5nXG4qKioqKioqKioqKioqKioqKipcblxuXG5CaW5kaW5nIG9mIG5hbWVzXG49PT09PT09PT09PT09PT09XG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucyxcbiJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgb3IgYWZ0ZXJcbiJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiIHN0YXRlbWVudFxub2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbmltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm1cbm1heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3JcbnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLlxuXG5FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhXG5jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWxcbmNvZGUgYmxvY2spLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLFxudW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlXG5tb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlIG1vZHVsZVxuY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlXG5ibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuXG5FYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAqYmluZGluZypcbm9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiBydWxlcy5cblxuXG5SZXNvbHV0aW9uIG9mIG5hbWVzXG49PT09PT09PT09PT09PT09PT09XG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuXG5XaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3RcbmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrXG5pcyBjYWxsZWQgdGhlIGJsb2NrXCdzICplbnZpcm9ubWVudCouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gSWZcbnRoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbFxudmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlIHRoZVxubmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4iVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkIGZpcnN0LiAgSWZcbnRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZC4gIFRoZVxuImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uXG5pbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlIHZhcmlhYmxlXG5jb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciB0b1xucHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgbm90XG5leGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuXG5UaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYVxubW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkXG4iX19tYWluX18iLlxuXG5DbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiBhcmVcbnNwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgYW5cbmV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSByZWZlcmVuY2VzXG5mb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uIHRoYXRcbnVuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFRoZVxubmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IG9mXG50aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0b1xudGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS1cbnRoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5IGFyZVxuaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nXG53aWxsIGZhaWw6XG5cbiAgIGNsYXNzIEE6XG4gICAgICAgYSA9IDQyXG4gICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuXG5cbkJ1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyBnbG9iYWxcbm5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgbGF0dGVyIGNhc2VcbnRoZSBtb2R1bGVcJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlICJfX21haW5fXyJcbm1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluIGFueVxub3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlXG4iYnVpbHRpbnMiIG1vZHVsZSBpdHNlbGYuICAiX19idWlsdGluc19fIiBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG4iX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICJpbXBvcnQiXG50aGUgImJ1aWx0aW5zIiBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcyBhcHByb3ByaWF0ZWx5LlxuXG5cbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbk5hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0IGNvbXBpbGVcbnRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcblxuICAgaSA9IDEwXG4gICBkZWYgZigpOlxuICAgICAgIHByaW50KGkpXG4gICBpID0gNDJcbiAgIGYoKVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5UaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGxcbmVudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsXG5hbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWRcbmluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gIFsxXVxuVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbm92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSBpc1xuc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKLSAnbm9ubG9jYWwnOiB1J1xuVGhlICJub25sb2NhbCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgbm9ubG9jYWxfc3RtdCA6Oj0gIm5vbmxvY2FsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqXG5cblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgdGhlIGxpc3RlZCBpZGVudGlmaWVycyB0byByZWZlciB0b1xucHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGV4Y2x1ZGluZ1xuZ2xvYmFscy4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYmluZGluZyBpc1xudG8gc2VhcmNoIHRoZSBsb2NhbCBuYW1lc3BhY2UgZmlyc3QuICBUaGUgc3RhdGVtZW50IGFsbG93c1xuZW5jYXBzdWxhdGVkIGNvZGUgdG8gcmViaW5kIHZhcmlhYmxlcyBvdXRzaWRlIG9mIHRoZSBsb2NhbCBzY29wZVxuYmVzaWRlcyB0aGUgZ2xvYmFsIChtb2R1bGUpIHNjb3BlLlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCwgdW5saWtlIHRob3NlIGxpc3RlZCBpbiBhXG4iZ2xvYmFsIiBzdGF0ZW1lbnQsIG11c3QgcmVmZXIgdG8gcHJlLWV4aXN0aW5nIGJpbmRpbmdzIGluIGFuXG5lbmNsb3Npbmcgc2NvcGUgKHRoZSBzY29wZSBpbiB3aGljaCBhIG5ldyBiaW5kaW5nIHNob3VsZCBiZSBjcmVhdGVkXG5jYW5ub3QgYmUgZGV0ZXJtaW5lZCB1bmFtYmlndW91c2x5KS5cblxuTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgbXVzdCBub3QgY29sbGlkZSB3aXRoIHByZS1cbmV4aXN0aW5nIGJpbmRpbmdzIGluIHRoZSBsb2NhbCBzY29wZS5cblxuU2VlIGFsc286ICoqUEVQIDMxMDQqKiAtIEFjY2VzcyB0byBOYW1lcyBpbiBPdXRlciBTY29wZXNcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICJub25sb2NhbCIgc3RhdGVtZW50LlxuJywKLSAnbnVtYmVycyc6IHUnXG5OdW1lcmljIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBudW1lcmljIGxpdGVyYWxzOiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnRcbm51bWJlcnMsIGFuZCBpbWFnaW5hcnkgbnVtYmVycy4gIFRoZXJlIGFyZSBubyBjb21wbGV4IGxpdGVyYWxzXG4oY29tcGxleCBudW1iZXJzIGNhbiBiZSBmb3JtZWQgYnkgYWRkaW5nIGEgcmVhbCBudW1iZXIgYW5kIGFuXG5pbWFnaW5hcnkgbnVtYmVyKS5cblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICItMSJcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yIFwnIi0iXCcgYW5kIHRoZVxubGl0ZXJhbCAiMSIuXG4nLAotICdudW1lcmljLXR5cGVzJzogdSdcbkVtdWxhdGluZyBudW1lcmljIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuXG5NZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZVxucGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvclxubm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cblxub2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKS4gIEZvciBpbnN0YW5jZSwgdG9cbiAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzIGNhbGxlZC5cbiAgIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvIHVzaW5nXG4gICAiX19mbG9vcmRpdl9fKCkiIGFuZCAiX19tb2RfXygpIjsgaXQgc2hvdWxkIG5vdCBiZSByZWxhdGVkIHRvXG4gICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0XG4gICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pblxuICAgInBvdygpIiBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuXG5cbiAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZVxuICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuICJOb3RJbXBsZW1lbnRlZCIuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIixcbiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpIHdpdGggcmVmbGVjdGVkIChzd2FwcGVkKVxuICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZG9lc1xuICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mXG4gICBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4IC1cbiAgIHkiLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiAiX19yc3ViX18oKSJcbiAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiByZXR1cm5zXG4gICAqTm90SW1wbGVtZW50ZWQqLlxuXG4gICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICJfX3Jwb3dfXygpIiAodGhlXG4gICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0XG4gICAgIG9wZXJhbmRcJ3MgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZFxuICAgICBmb3IgdGhlIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0XG4gICAgIG9wZXJhbmRcJ3Mgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzXG4gICAgIHRvIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgIioqPSIsXG4gICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYXR0ZW1wdCB0b1xuICAgZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSBzcGVjaWZpY1xuICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgZmFsbHMgYmFjayB0byB0aGVcbiAgIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc1xuICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ID1cbiAgIHguX19pYWRkX18oeSkiIC4gT3RoZXJ3aXNlLCAieC5fX2FkZF9fKHkpIiBhbmQgInkuX19yYWRkX18oeCkiIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiBjZXJ0YWluXG4gICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAoc2VlICpXaHkgZG9lcyBhX3R1cGxlW2ldICs9IFtcJ2l0ZW1cJ10gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlXG4gICBhZGRpdGlvbiB3b3Jrcz8qKSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mIHRoZSBkYXRhXG4gICBtb2RlbC5cblxub2JqZWN0Ll9fbmVnX18oc2VsZilcbm9iamVjdC5fX3Bvc19fKHNlbGYpXG5vYmplY3QuX19hYnNfXyhzZWxmKVxub2JqZWN0Ll9faW52ZXJ0X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zICgiLSIsICIrIixcbiAgICJhYnMoKSIgYW5kICJ+IikuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2Zsb2F0X18oc2VsZilcbm9iamVjdC5fX3JvdW5kX18oc2VsZlssIG5dKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImNvbXBsZXgoKSIsICJpbnQoKSIsXG4gICAiZmxvYXQoKSIgYW5kICJyb3VuZCgpIi4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgYXBwcm9wcmlhdGVcbiAgIHR5cGUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IuaW5kZXgoKSIsIGFuZCB3aGVuZXZlciBQeXRob24gbmVlZHNcbiAgIHRvIGxvc3NsZXNzbHkgY29udmVydCB0aGUgbnVtZXJpYyBvYmplY3QgdG8gYW4gaW50ZWdlciBvYmplY3QgKHN1Y2hcbiAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAib2N0KCkiXG4gICBmdW5jdGlvbnMpLiBQcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtZXJpY1xuICAgb2JqZWN0IGlzIGFuIGludGVnZXIgdHlwZS4gIE11c3QgcmV0dXJuIGFuIGludGVnZXIuXG5cbiAgIE5vdGU6IEluIG9yZGVyIHRvIGhhdmUgYSBjb2hlcmVudCBpbnRlZ2VyIHR5cGUgY2xhc3MsIHdoZW5cbiAgICAgIl9faW5kZXhfXygpIiBpcyBkZWZpbmVkICJfX2ludF9fKCkiIHNob3VsZCBhbHNvIGJlIGRlZmluZWQsIGFuZFxuICAgICBib3RoIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4nLAotICdvYmplY3RzJzogdSdcbk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKk9iamVjdHMqIGFyZSBQeXRob25cJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhIFB5dGhvblxucHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuIChJblxuYSBzZW5zZSwgYW5kIGluIGNvbmZvcm1hbmNlIHRvIFZvbiBOZXVtYW5uXCdzIG1vZGVsIG9mIGEgInN0b3JlZFxucHJvZ3JhbSBjb21wdXRlciwiIGNvZGUgaXMgYWxzbyByZXByZXNlbnRlZCBieSBvYmplY3RzLilcblxuRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN0XCdzXG4qaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rIG9mIGl0XG5hcyB0aGUgb2JqZWN0XCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlIFwnImlzIlwnIG9wZXJhdG9yIGNvbXBhcmVzIHRoZVxuaWRlbnRpdHkgb2YgdHdvIG9iamVjdHM7IHRoZSAiaWQoKSIgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyXG5yZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEZvciBDUHl0aG9uLCAiaWQoeCkiIGlzIHRoZSBtZW1vcnlcbmFkZHJlc3Mgd2hlcmUgIngiIGlzIHN0b3JlZC5cblxuQW4gb2JqZWN0XCdzIHR5cGUgZGV0ZXJtaW5lcyB0aGUgb3BlcmF0aW9ucyB0aGF0IHRoZSBvYmplY3Qgc3VwcG9ydHNcbihlLmcuLCAiZG9lcyBpdCBoYXZlIGEgbGVuZ3RoPyIpIGFuZCBhbHNvIGRlZmluZXMgdGhlIHBvc3NpYmxlIHZhbHVlc1xuZm9yIG9iamVjdHMgb2YgdGhhdCB0eXBlLiAgVGhlICJ0eXBlKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gb2JqZWN0XCdzXG50eXBlICh3aGljaCBpcyBhbiBvYmplY3QgaXRzZWxmKS4gIExpa2UgaXRzIGlkZW50aXR5LCBhbiBvYmplY3RcJ3Ncbip0eXBlKiBpcyBhbHNvIHVuY2hhbmdlYWJsZS4gWzFdXG5cblRoZSAqdmFsdWUqIG9mIHNvbWUgb2JqZWN0cyBjYW4gY2hhbmdlLiAgT2JqZWN0cyB3aG9zZSB2YWx1ZSBjYW5cbmNoYW5nZSBhcmUgc2FpZCB0byBiZSAqbXV0YWJsZSo7IG9iamVjdHMgd2hvc2UgdmFsdWUgaXMgdW5jaGFuZ2VhYmxlXG5vbmNlIHRoZXkgYXJlIGNyZWF0ZWQgYXJlIGNhbGxlZCAqaW1tdXRhYmxlKi4gKFRoZSB2YWx1ZSBvZiBhblxuaW1tdXRhYmxlIGNvbnRhaW5lciBvYmplY3QgdGhhdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhIG11dGFibGVcbm9iamVjdCBjYW4gY2hhbmdlIHdoZW4gdGhlIGxhdHRlclwncyB2YWx1ZSBpcyBjaGFuZ2VkOyBob3dldmVyIHRoZVxuY29udGFpbmVyIGlzIHN0aWxsIGNvbnNpZGVyZWQgaW1tdXRhYmxlLCBiZWNhdXNlIHRoZSBjb2xsZWN0aW9uIG9mXG5vYmplY3RzIGl0IGNvbnRhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkLiAgU28sIGltbXV0YWJpbGl0eSBpcyBub3RcbnN0cmljdGx5IHRoZSBzYW1lIGFzIGhhdmluZyBhbiB1bmNoYW5nZWFibGUgdmFsdWUsIGl0IGlzIG1vcmUgc3VidGxlLilcbkFuIG9iamVjdFwncyBtdXRhYmlsaXR5IGlzIGRldGVybWluZWQgYnkgaXRzIHR5cGU7IGZvciBpbnN0YW5jZSxcbm51bWJlcnMsIHN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3aGlsZSBkaWN0aW9uYXJpZXMgYW5kXG5saXN0cyBhcmUgbXV0YWJsZS5cblxuT2JqZWN0cyBhcmUgbmV2ZXIgZXhwbGljaXRseSBkZXN0cm95ZWQ7IGhvd2V2ZXIsIHdoZW4gdGhleSBiZWNvbWVcbnVucmVhY2hhYmxlIHRoZXkgbWF5IGJlIGdhcmJhZ2UtY29sbGVjdGVkLiAgQW4gaW1wbGVtZW50YXRpb24gaXNcbmFsbG93ZWQgdG8gcG9zdHBvbmUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9yIG9taXQgaXQgYWx0b2dldGhlciAtLS0gaXQgaXNcbmEgbWF0dGVyIG9mIGltcGxlbWVudGF0aW9uIHF1YWxpdHkgaG93IGdhcmJhZ2UgY29sbGVjdGlvbiBpc1xuaW1wbGVtZW50ZWQsIGFzIGxvbmcgYXMgbm8gb2JqZWN0cyBhcmUgY29sbGVjdGVkIHRoYXQgYXJlIHN0aWxsXG5yZWFjaGFibGUuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQ1B5dGhvbiBjdXJyZW50bHkgdXNlcyBhIHJlZmVyZW5jZS1cbmNvdW50aW5nIHNjaGVtZSB3aXRoIChvcHRpb25hbCkgZGVsYXllZCBkZXRlY3Rpb24gb2YgY3ljbGljYWxseSBsaW5rZWRcbmdhcmJhZ2UsIHdoaWNoIGNvbGxlY3RzIG1vc3Qgb2JqZWN0cyBhcyBzb29uIGFzIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbGxlY3QgZ2FyYmFnZSBjb250YWluaW5nXG5jaXJjdWxhciByZWZlcmVuY2VzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAiZ2MiIG1vZHVsZSBmb3JcbmluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBjb2xsZWN0aW9uIG9mIGN5Y2xpYyBnYXJiYWdlLiBPdGhlclxuaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgZGVwZW5kXG5vbiBpbW1lZGlhdGUgZmluYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZSAoc29cbnlvdSBzaG91bGQgYWx3YXlzIGNsb3NlIGZpbGVzIGV4cGxpY2l0bHkpLlxuXG5Ob3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb25cJ3MgdHJhY2luZyBvciBkZWJ1Z2dpbmdcbmZhY2lsaXRpZXMgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGNvbGxlY3RhYmxlLlxuQWxzbyBub3RlIHRoYXQgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBcJyJ0cnkiLi4uImV4Y2VwdCJcJ1xuc3RhdGVtZW50IG1heSBrZWVwIG9iamVjdHMgYWxpdmUuXG5cblNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gImV4dGVybmFsIiByZXNvdXJjZXMgc3VjaCBhcyBvcGVuXG5maWxlcyBvciB3aW5kb3dzLiAgSXQgaXMgdW5kZXJzdG9vZCB0aGF0IHRoZXNlIHJlc291cmNlcyBhcmUgZnJlZWRcbndoZW4gdGhlIG9iamVjdCBpcyBnYXJiYWdlLWNvbGxlY3RlZCwgYnV0IHNpbmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBpc1xubm90IGd1YXJhbnRlZWQgdG8gaGFwcGVuLCBzdWNoIG9iamVjdHMgYWxzbyBwcm92aWRlIGFuIGV4cGxpY2l0IHdheSB0b1xucmVsZWFzZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UsIHVzdWFsbHkgYSAiY2xvc2UoKSIgbWV0aG9kLiBQcm9ncmFtc1xuYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaCBvYmplY3RzLiAgVGhlXG5cJyJ0cnkiLi4uImZpbmFsbHkiXCcgc3RhdGVtZW50IGFuZCB0aGUgXCcid2l0aCJcJyBzdGF0ZW1lbnQgcHJvdmlkZVxuY29udmVuaWVudCB3YXlzIHRvIGRvIHRoaXMuXG5cblNvbWUgb2JqZWN0cyBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0czsgdGhlc2UgYXJlIGNhbGxlZFxuKmNvbnRhaW5lcnMqLiBFeGFtcGxlcyBvZiBjb250YWluZXJzIGFyZSB0dXBsZXMsIGxpc3RzIGFuZFxuZGljdGlvbmFyaWVzLiAgVGhlIHJlZmVyZW5jZXMgYXJlIHBhcnQgb2YgYSBjb250YWluZXJcJ3MgdmFsdWUuICBJblxubW9zdCBjYXNlcywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciwgd2UgaW1wbHkgdGhlXG52YWx1ZXMsIG5vdCB0aGUgaWRlbnRpdGllcyBvZiB0aGUgY29udGFpbmVkIG9iamVjdHM7IGhvd2V2ZXIsIHdoZW4gd2VcbnRhbGsgYWJvdXQgdGhlIG11dGFiaWxpdHkgb2YgYSBjb250YWluZXIsIG9ubHkgdGhlIGlkZW50aXRpZXMgb2YgdGhlXG5pbW1lZGlhdGVseSBjb250YWluZWQgb2JqZWN0cyBhcmUgaW1wbGllZC4gIFNvLCBpZiBhbiBpbW11dGFibGVcbmNvbnRhaW5lciAobGlrZSBhIHR1cGxlKSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhIG11dGFibGUgb2JqZWN0LCBpdHNcbnZhbHVlIGNoYW5nZXMgaWYgdGhhdCBtdXRhYmxlIG9iamVjdCBpcyBjaGFuZ2VkLlxuXG5UeXBlcyBhZmZlY3QgYWxtb3N0IGFsbCBhc3BlY3RzIG9mIG9iamVjdCBiZWhhdmlvci4gIEV2ZW4gdGhlXG5pbXBvcnRhbmNlIG9mIG9iamVjdCBpZGVudGl0eSBpcyBhZmZlY3RlZCBpbiBzb21lIHNlbnNlOiBmb3IgaW1tdXRhYmxlXG50eXBlcywgb3BlcmF0aW9ucyB0aGF0IGNvbXB1dGUgbmV3IHZhbHVlcyBtYXkgYWN0dWFsbHkgcmV0dXJuIGFcbnJlZmVyZW5jZSB0byBhbnkgZXhpc3Rpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUsIHdoaWxlXG5mb3IgbXV0YWJsZSBvYmplY3RzIHRoaXMgaXMgbm90IGFsbG93ZWQuICBFLmcuLCBhZnRlciAiYSA9IDE7IGIgPSAxIixcbiJhIiBhbmQgImIiIG1heSBvciBtYXkgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB3aXRoIHRoZSB2YWx1ZVxub25lLCBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgYWZ0ZXIgImMgPSBbXTsgZCA9IFtdIiwgImMiXG5hbmQgImQiIGFyZSBndWFyYW50ZWVkIHRvIHJlZmVyIHRvIHR3byBkaWZmZXJlbnQsIHVuaXF1ZSwgbmV3bHlcbmNyZWF0ZWQgZW1wdHkgbGlzdHMuIChOb3RlIHRoYXQgImMgPSBkID0gW10iIGFzc2lnbnMgdGhlIHNhbWUgb2JqZWN0XG50byBib3RoICJjIiBhbmQgImQiLilcbicsCi0gJ29wZXJhdG9yLXN1bW1hcnknOiB1J1xuT3BlcmF0b3IgcHJlY2VkZW5jZVxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2UgaW4gUHl0aG9uLCBmcm9tXG5sb3dlc3QgcHJlY2VkZW5jZSAobGVhc3QgYmluZGluZykgdG8gaGlnaGVzdCBwcmVjZWRlbmNlIChtb3N0XG5iaW5kaW5nKS4gIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLiAgVW5sZXNzXG50aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgT3BlcmF0b3JzIGluXG50aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2hcbmdyb3VwcyBmcm9tIHJpZ2h0IHRvIGxlZnQpLlxuXG5Ob3RlIHRoYXQgY29tcGFyaXNvbnMsIG1lbWJlcnNoaXAgdGVzdHMsIGFuZCBpZGVudGl0eSB0ZXN0cywgYWxsIGhhdmVcbnRoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGhhdmUgYSBsZWZ0LXRvLXJpZ2h0IGNoYWluaW5nIGZlYXR1cmUgYXNcbmRlc2NyaWJlZCBpbiB0aGUgKkNvbXBhcmlzb25zKiBzZWN0aW9uLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJsYW1iZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJpZiIgLS0gImVsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJvciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJub3QiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJpbiIsICJub3QgaW4iLCAiaXMiLCAiaXMgbm90IiwgIjwiLCAiPD0iLCAiPiIsIHwgQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgICB8XG58ICI+PSIsICIhPSIsICI9PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGVzdHMgYW5kIGlkZW50aXR5IHRlc3RzICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJ8IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICImIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICI8PCIsICI+PiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hpZnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIrIiwgIi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiAgICAgICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpb24sIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGl2aXNpb24sIHJlbWFpbmRlciBbNV0gICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIreCIsICIteCIsICJ+eCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIqKiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhwb25lbnRpYXRpb24gWzZdICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJhd2FpdCIgIngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQXdhaXQgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJ4W2luZGV4XSIsICJ4W2luZGV4OmluZGV4XSIsICAgICAgICAgICAgICAgICAgIHwgU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8XG58ICJ4KGFyZ3VtZW50cy4uLikiLCAieC5hdHRyaWJ1dGUiICAgICAgICAgICAgICAgIHwgYXR0cmlidXRlIHJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICIoZXhwcmVzc2lvbnMuLi4pIiwgIltleHByZXNzaW9ucy4uLl0iLCAie2tleTogIHwgQmluZGluZyBvciB0dXBsZSBkaXNwbGF5LCBsaXN0ICAgICAgICB8XG58IHZhbHVlLi4ufSIsICJ7ZXhwcmVzc2lvbnMuLi59IiAgICAgICAgICAgICAgICAgIHwgZGlzcGxheSwgZGljdGlvbmFyeSBkaXNwbGF5LCBzZXQgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gV2hpbGUgImFicyh4JXkpIDwgYWJzKHkpIiBpcyB0cnVlIG1hdGhlbWF0aWNhbGx5LCBmb3IgZmxvYXRzXG4gICAgaXQgbWF5IG5vdCBiZSB0cnVlIG51bWVyaWNhbGx5IGR1ZSB0byByb3VuZG9mZi4gIEZvciBleGFtcGxlLCBhbmRcbiAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuIElFRUUgNzU0IGRvdWJsZS1cbiAgICBwcmVjaXNpb24gbnVtYmVyLCBpbiBvcmRlciB0aGF0ICItMWUtMTAwICUgMWUxMDAiIGhhdmUgdGhlIHNhbWVcbiAgICBzaWduIGFzICIxZTEwMCIsIHRoZSBjb21wdXRlZCByZXN1bHQgaXMgIi0xZS0xMDAgKyAxZTEwMCIsIHdoaWNoXG4gICAgaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byAiMWUxMDAiLiAgVGhlIGZ1bmN0aW9uXG4gICAgIm1hdGguZm1vZCgpIiByZXR1cm5zIGEgcmVzdWx0IHdob3NlIHNpZ24gbWF0Y2hlcyB0aGUgc2lnbiBvZiB0aGVcbiAgICBmaXJzdCBhcmd1bWVudCBpbnN0ZWFkLCBhbmQgc28gcmV0dXJucyAiLTFlLTEwMCIgaW4gdGhpcyBjYXNlLlxuICAgIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgYXBwbGljYXRpb24uXG5cblsyXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdFwnc1xuICAgIHBvc3NpYmxlIGZvciAieC8veSIgdG8gYmUgb25lIGxhcmdlciB0aGFuICIoeC14JXkpLy95IiBkdWUgdG9cbiAgICByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LCBpblxuICAgIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgImRpdm1vZCh4LHkpWzBdICogeSArIHggJSB5IiBiZSB2ZXJ5IGNsb3NlXG4gICAgdG8gIngiLlxuXG5bM10gVGhlIFVuaWNvZGUgc3RhbmRhcmQgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuICpjb2RlIHBvaW50cyogKGUuZy5cbiAgICBVKzAwNDEpIGFuZCAqYWJzdHJhY3QgY2hhcmFjdGVycyogKGUuZy4gIkxBVElOIENBUElUQUwgTEVUVEVSIEEiKS5cbiAgICBXaGlsZSBtb3N0IGFic3RyYWN0IGNoYXJhY3RlcnMgaW4gVW5pY29kZSBhcmUgb25seSByZXByZXNlbnRlZFxuICAgIHVzaW5nIG9uZSBjb2RlIHBvaW50LCB0aGVyZSBpcyBhIG51bWJlciBvZiBhYnN0cmFjdCBjaGFyYWN0ZXJzXG4gICAgdGhhdCBjYW4gaW4gYWRkaXRpb24gYmUgcmVwcmVzZW50ZWQgdXNpbmcgYSBzZXF1ZW5jZSBvZiBtb3JlIHRoYW5cbiAgICBvbmUgY29kZSBwb2ludC4gIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTlxuICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBIiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBzaW5nbGVcbiAgICAqcHJlY29tcG9zZWQgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uIFUrMDBDNywgb3IgYXMgYSBzZXF1ZW5jZVxuICAgIG9mIGEgKmJhc2UgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uIFUrMDA0MyAoTEFUSU4gQ0FQSVRBTFxuICAgIExFVFRFUiBDKSwgZm9sbG93ZWQgYnkgYSAqY29tYmluaW5nIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvblxuICAgIFUrMDMyNyAoQ09NQklOSU5HIENFRElMTEEpLlxuXG4gICAgVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIG9uIHN0cmluZ3MgY29tcGFyZSBhdCB0aGUgbGV2ZWwgb2ZcbiAgICBVbmljb2RlIGNvZGUgcG9pbnRzLiBUaGlzIG1heSBiZSBjb3VudGVyLWludHVpdGl2ZSB0byBodW1hbnMuICBGb3JcbiAgICBleGFtcGxlLCAiIlxcdTAwQzciID09ICJcXHUwMDQzXFx1MDMyNyIiIGlzICJGYWxzZSIsIGV2ZW4gdGhvdWdoIGJvdGhcbiAgICBzdHJpbmdzIHJlcHJlc2VudCB0aGUgc2FtZSBhYnN0cmFjdCBjaGFyYWN0ZXIgIkxBVElOIENBUElUQUxcbiAgICBMRVRURVIgQyBXSVRIIENFRElMTEEiLlxuXG4gICAgVG8gY29tcGFyZSBzdHJpbmdzIGF0IHRoZSBsZXZlbCBvZiBhYnN0cmFjdCBjaGFyYWN0ZXJzICh0aGF0IGlzLFxuICAgIGluIGEgd2F5IGludHVpdGl2ZSB0byBodW1hbnMpLCB1c2UgInVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgpIi5cblxuWzRdIER1ZSB0byBhdXRvbWF0aWMgZ2FyYmFnZS1jb2xsZWN0aW9uLCBmcmVlIGxpc3RzLCBhbmQgdGhlXG4gICAgZHluYW1pYyBuYXR1cmUgb2YgZGVzY3JpcHRvcnMsIHlvdSBtYXkgbm90aWNlIHNlZW1pbmdseSB1bnVzdWFsXG4gICAgYmVoYXZpb3VyIGluIGNlcnRhaW4gdXNlcyBvZiB0aGUgImlzIiBvcGVyYXRvciwgbGlrZSB0aG9zZVxuICAgIGludm9sdmluZyBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yIGNvbnN0YW50cy5cbiAgICBDaGVjayB0aGVpciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG5cbls1XSBUaGUgIiUiIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lXG4gICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuXG5bNl0gVGhlIHBvd2VyIG9wZXJhdG9yICIqKiIgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gYW4gYXJpdGhtZXRpY1xuICAgIG9yIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCAiMioqLTEiIGlzICIwLjUiLlxuJywKLSAncGFzcyc6IHUnXG5UaGUgInBhc3MiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuICAgcGFzc19zdG10IDo6PSAicGFzcyJcblxuInBhc3MiIGlzIGEgbnVsbCBvcGVyYXRpb24gLS0tIHdoZW4gaXQgaXMgZXhlY3V0ZWQsIG5vdGhpbmcgaGFwcGVucy5cbkl0IGlzIHVzZWZ1bCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWRcbnN5bnRhY3RpY2FsbHksIGJ1dCBubyBjb2RlIG5lZWRzIHRvIGJlIGV4ZWN1dGVkLCBmb3IgZXhhbXBsZTpcblxuICAgZGVmIGYoYXJnKTogcGFzcyAgICAjIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgKHlldClcblxuICAgY2xhc3MgQzogcGFzcyAgICAgICAjIGEgY2xhc3Mgd2l0aCBubyBtZXRob2RzICh5ZXQpXG4nLAotICdwb3dlcic6IHUnXG5UaGUgcG93ZXIgb3BlcmF0b3JcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0c1xubGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gIFRoZVxuc3ludGF4IGlzOlxuXG4gICBwb3dlciA6Oj0gKCBhd2FpdF9leHByIHwgcHJpbWFyeSApIFsiKioiIHVfZXhwcl1cblxuVGh1cywgaW4gYW4gdW5wYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIHBvd2VyIGFuZCB1bmFyeSBvcGVyYXRvcnMsIHRoZVxub3BlcmF0b3JzIGFyZSBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0ICh0aGlzIGRvZXMgbm90IGNvbnN0cmFpblxudGhlIGV2YWx1YXRpb24gb3JkZXIgZm9yIHRoZSBvcGVyYW5kcyk6ICItMSoqMiIgcmVzdWx0cyBpbiAiLTEiLlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gInBvdygpIlxuZnVuY3Rpb24sIHdoZW4gY2FsbGVkIHdpdGggdHdvIGFyZ3VtZW50czogaXQgeWllbGRzIGl0cyBsZWZ0IGFyZ3VtZW50XG5yYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmVcbmZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCBhbmQgdGhlIHJlc3VsdCBpcyBvZiB0aGF0IHR5cGUuXG5cbkZvciBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZSBzYW1lIHR5cGUgYXMgdGhlIG9wZXJhbmRzIHVubGVzc1xudGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZVxuY29udmVydGVkIHRvIGZsb2F0IGFuZCBhIGZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLFxuIjEwKioyIiByZXR1cm5zICIxMDAiLCBidXQgIjEwKiotMiIgcmV0dXJucyAiMC4wMSIuXG5cblJhaXNpbmcgIjAuMCIgdG8gYSBuZWdhdGl2ZSBwb3dlciByZXN1bHRzIGluIGEgIlplcm9EaXZpc2lvbkVycm9yIi5cblJhaXNpbmcgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmcmFjdGlvbmFsIHBvd2VyIHJlc3VsdHMgaW4gYSAiY29tcGxleCJcbm51bWJlci4gKEluIGVhcmxpZXIgdmVyc2lvbnMgaXQgcmFpc2VkIGEgIlZhbHVlRXJyb3IiLilcbicsCi0gJ3JhaXNlJzogdSdcblRoZSAicmFpc2UiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyJmcm9tIiBleHByZXNzaW9uXV1cblxuSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsICJyYWlzZSIgcmUtcmFpc2VzIHRoZSBsYXN0IGV4Y2VwdGlvblxudGhhdCB3YXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgSWYgbm8gZXhjZXB0aW9uIGlzIGFjdGl2ZSBpblxudGhlIGN1cnJlbnQgc2NvcGUsIGEgIlJ1bnRpbWVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCBpbmRpY2F0aW5nXG50aGF0IHRoaXMgaXMgYW4gZXJyb3IuXG5cbk90aGVyd2lzZSwgInJhaXNlIiBldmFsdWF0ZXMgdGhlIGZpcnN0IGV4cHJlc3Npb24gYXMgdGhlIGV4Y2VwdGlvblxub2JqZWN0LiAgSXQgbXVzdCBiZSBlaXRoZXIgYSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZlxuIkJhc2VFeGNlcHRpb24iLiBJZiBpdCBpcyBhIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHdpbGwgYmVcbm9idGFpbmVkIHdoZW4gbmVlZGVkIGJ5IGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIHdpdGggbm8gYXJndW1lbnRzLlxuXG5UaGUgKnR5cGUqIG9mIHRoZSBleGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZVwncyBjbGFzcywgdGhlXG4qdmFsdWUqIGlzIHRoZSBpbnN0YW5jZSBpdHNlbGYuXG5cbkEgdHJhY2ViYWNrIG9iamVjdCBpcyBub3JtYWxseSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBleGNlcHRpb25cbmlzIHJhaXNlZCBhbmQgYXR0YWNoZWQgdG8gaXQgYXMgdGhlICJfX3RyYWNlYmFja19fIiBhdHRyaWJ1dGUsIHdoaWNoXG5pcyB3cml0YWJsZS4gWW91IGNhbiBjcmVhdGUgYW4gZXhjZXB0aW9uIGFuZCBzZXQgeW91ciBvd24gdHJhY2ViYWNrIGluXG5vbmUgc3RlcCB1c2luZyB0aGUgIndpdGhfdHJhY2ViYWNrKCkiIGV4Y2VwdGlvbiBtZXRob2QgKHdoaWNoIHJldHVybnNcbnRoZSBzYW1lIGV4Y2VwdGlvbiBpbnN0YW5jZSwgd2l0aCBpdHMgdHJhY2ViYWNrIHNldCB0byBpdHMgYXJndW1lbnQpLFxubGlrZSBzbzpcblxuICAgcmFpc2UgRXhjZXB0aW9uKCJmb28gb2NjdXJyZWQiKS53aXRoX3RyYWNlYmFjayh0cmFjZWJhY2tvYmopXG5cblRoZSAiZnJvbSIgY2xhdXNlIGlzIHVzZWQgZm9yIGV4Y2VwdGlvbiBjaGFpbmluZzogaWYgZ2l2ZW4sIHRoZSBzZWNvbmRcbipleHByZXNzaW9uKiBtdXN0IGJlIGFub3RoZXIgZXhjZXB0aW9uIGNsYXNzIG9yIGluc3RhbmNlLCB3aGljaCB3aWxsXG50aGVuIGJlIGF0dGFjaGVkIHRvIHRoZSByYWlzZWQgZXhjZXB0aW9uIGFzIHRoZSAiX19jYXVzZV9fIiBhdHRyaWJ1dGVcbih3aGljaCBpcyB3cml0YWJsZSkuICBJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCwgYm90aFxuZXhjZXB0aW9ucyB3aWxsIGJlIHByaW50ZWQ6XG5cbiAgID4+PiB0cnk6XG4gICAuLi4gICAgIHByaW50KDEgLyAwKVxuICAgLi4uIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOlxuICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIGV4Y1xuICAgLi4uXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+XG4gICBaZXJvRGl2aXNpb25FcnJvcjogaW50IGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXG5cbiAgIFRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb246XG5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZFxuXG5BIHNpbWlsYXIgbWVjaGFuaXNtIHdvcmtzIGltcGxpY2l0bHkgaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbnNpZGVcbmFuIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIGEgImZpbmFsbHkiIGNsYXVzZTogdGhlIHByZXZpb3VzIGV4Y2VwdGlvbiBpc1xudGhlbiBhdHRhY2hlZCBhcyB0aGUgbmV3IGV4Y2VwdGlvblwncyAiX19jb250ZXh0X18iIGF0dHJpYnV0ZTpcblxuICAgPj4+IHRyeTpcbiAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4gICAuLi4gZXhjZXB0OlxuICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKVxuICAgLi4uXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+XG4gICBaZXJvRGl2aXNpb25FcnJvcjogaW50IGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXG5cbiAgIER1cmluZyBoYW5kbGluZyBvZiB0aGUgYWJvdmUgZXhjZXB0aW9uLCBhbm90aGVyIGV4Y2VwdGlvbiBvY2N1cnJlZDpcblxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaGFuZGxpbmcgZXhjZXB0aW9ucyBpcyBpbiBzZWN0aW9uXG4qVGhlIHRyeSBzdGF0ZW1lbnQqLlxuJywKLSAncmV0dXJuJzogdSdcblRoZSAicmV0dXJuIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcmV0dXJuX3N0bXQgOjo9ICJyZXR1cm4iIFtleHByZXNzaW9uX2xpc3RdXG5cbiJyZXR1cm4iIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbixcbm5vdCB3aXRoaW4gYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbi5cblxuSWYgYW4gZXhwcmVzc2lvbiBsaXN0IGlzIHByZXNlbnQsIGl0IGlzIGV2YWx1YXRlZCwgZWxzZSAiTm9uZSIgaXNcbnN1YnN0aXR1dGVkLlxuXG4icmV0dXJuIiBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uIGxpc3QgKG9yXG4iTm9uZSIpIGFzIHJldHVybiB2YWx1ZS5cblxuV2hlbiAicmV0dXJuIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhICJmaW5hbGx5IlxuY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nIHRoZVxuZnVuY3Rpb24uXG5cbkluIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgInJldHVybiIgc3RhdGVtZW50IGluZGljYXRlcyB0aGF0IHRoZVxuZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UgIlN0b3BJdGVyYXRpb24iIHRvIGJlIHJhaXNlZC4gVGhlXG5yZXR1cm5lZCB2YWx1ZSAoaWYgYW55KSBpcyB1c2VkIGFzIGFuIGFyZ3VtZW50IHRvIGNvbnN0cnVjdFxuIlN0b3BJdGVyYXRpb24iIGFuZCBiZWNvbWVzIHRoZSAiU3RvcEl0ZXJhdGlvbi52YWx1ZSIgYXR0cmlidXRlLlxuJywKLSAnc2VxdWVuY2UtdHlwZXMnOiB1J1xuRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLlxuQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSBvciBtYXBwaW5nc1xuKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLiAgVGhlXG5maXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG9cbmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGVcbmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSBrIDwgTiIgd2hlcmVcbipOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggZGVmaW5lIGFcbnJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGUgdGhlXG5tZXRob2RzICJrZXlzKCkiLCAidmFsdWVzKCkiLCAiaXRlbXMoKSIsICJnZXQoKSIsICJjbGVhcigpIixcbiJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAidXBkYXRlKCkiXG5iZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLlxuVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiBhYnN0cmFjdCBiYXNlXG5jbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAiX19nZXRpdGVtX18oKSIsXG4iX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlIHNlcXVlbmNlc1xuc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgImV4dGVuZCgpIixcbiJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgbGlrZSBQeXRob25cbnN0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnRcbmFkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZ1xucmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICJfX3JhZGRfXygpIixcbiJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiIGRlc2NyaWJlZFxuYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4iX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iIG9wZXJhdG9yO1xuZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yIHNlcXVlbmNlcywgaXRcbnNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGhcbm1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvIGFsbG93XG5lZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAiX19pdGVyX18oKSJcbnNob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGVcbnRocm91Z2ggdGhlIHZhbHVlcy5cblxub2JqZWN0Ll9fbGVuX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdFxuICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kXG4gICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkIHJldHVybiBhblxuICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuXG4gICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhpc1xuICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkIGZvclxuICAgY29ycmVjdG5lc3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLlxuICBBIGNhbGwgbGlrZVxuXG4gICAgIGFbMToyXSA9IGJcblxuICBpcyB0cmFuc2xhdGVkIHRvXG5cbiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG5cbiAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiB3aXRoICJOb25lIi5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3Igc2VxdWVuY2UgdHlwZXMsXG4gICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICBOb3RlIHRoYXRcbiAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSBjbGFzcyB3aXNoZXNcbiAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4gSWZcbiAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlIHJhaXNlZDsgaWYgb2ZcbiAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55XG4gICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiBzaG91bGQgYmVcbiAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGVcbiAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iIGZvciBkaWN0XG4gICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSJcbiAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAoIl9fbGVuX18oKSJcbiAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sXG4gICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhblxuICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnlcbiAgICJyZXZlcnNlZCgpIi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlIG1lbWJlcnNoaXAgdGVzdFxuICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZVxuICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSAqdGhpcyBzZWN0aW9uIGluIHRoZVxuICAgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cbicsCi0gJ3NoaWZ0aW5nJzogdSdcblNoaWZ0aW5nIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIHNoaWZ0aW5nIG9wZXJhdGlvbnMgaGF2ZSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBhcml0aG1ldGljXG5vcGVyYXRpb25zOlxuXG4gICBzaGlmdF9leHByIDo6PSBhX2V4cHIgfCBzaGlmdF9leHByICggIjw8IiB8ICI+PiIgKSBhX2V4cHJcblxuVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBpbnRlZ2VycyBhcyBhcmd1bWVudHMuICBUaGV5IHNoaWZ0IHRoZSBmaXJzdFxuYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5IHRoZVxuc2Vjb25kIGFyZ3VtZW50LlxuXG5BIHJpZ2h0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgZmxvb3IgZGl2aXNpb24gYnkgInBvdygyLG4pIi5cbkEgbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggInBvdygyLG4pIi5cblxuTm90ZTogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbiAgcmVxdWlyZWQgdG8gYmUgYXQgbW9zdCAic3lzLm1heHNpemUiLiAgSWYgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpc1xuICBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFuICJPdmVyZmxvd0Vycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKLSAnc2xpY2luZ3MnOiB1J1xuU2xpY2luZ3NcbioqKioqKioqXG5cbkEgc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sIGFcbnN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciBhc1xudGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yICJkZWwiIHN0YXRlbWVudHMuICBUaGUgc3ludGF4IGZvciBhIHNsaWNpbmc6XG5cbiAgIHNsaWNpbmcgICAgICA6Oj0gcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSJcbiAgIHNsaWNlX2xpc3QgICA6Oj0gc2xpY2VfaXRlbSAoIiwiIHNsaWNlX2l0ZW0pKiBbIiwiXVxuICAgc2xpY2VfaXRlbSAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlXG4gICBwcm9wZXJfc2xpY2UgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0gWyAiOiIgW3N0cmlkZV0gXVxuICAgbG93ZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4gICB1cHBlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb25cbiAgIHN0cmlkZSAgICAgICA6Oj0gZXhwcmVzc2lvblxuXG5UaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlXG5hbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55IHN1YnNjcmlwdGlvblxuY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2xpY2luZy4gIFJhdGhlciB0aGFuIGZ1cnRoZXIgY29tcGxpY2F0aW5nIHRoZVxuc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0XG5jb250YWlucyBubyBwcm9wZXIgc2xpY2UpLlxuXG5UaGUgc2VtYW50aWNzIGZvciBhIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBpcyBpbmRleGVkXG4odXNpbmcgdGhlIHNhbWUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZCBhcyBub3JtYWwgc3Vic2NyaXB0aW9uKSB3aXRoIGFcbmtleSB0aGF0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNsaWNlIGxpc3QsIGFzIGZvbGxvd3MuICBJZiB0aGUgc2xpY2Vcbmxpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGVcbmNvbnZlcnNpb24gb2YgdGhlIHNsaWNlIGl0ZW1zOyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBsb25lXG5zbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0gdGhhdCBpcyBhblxuZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhIHByb3BlciBzbGljZSBpcyBhXG5zbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSB3aG9zZVxuInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGVcbmV4cHJlc3Npb25zIGdpdmVuIGFzIGxvd2VyIGJvdW5kLCB1cHBlciBib3VuZCBhbmQgc3RyaWRlLFxucmVzcGVjdGl2ZWx5LCBzdWJzdGl0dXRpbmcgIk5vbmUiIGZvciBtaXNzaW5nIGV4cHJlc3Npb25zLlxuJywKLSAnc3BlY2lhbGF0dHJzJzogdSdcblNwZWNpYWwgQXR0cmlidXRlc1xuKioqKioqKioqKioqKioqKioqXG5cblRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gc2V2ZXJhbFxub2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZFxuYnkgdGhlICJkaXIoKSIgYnVpbHQtaW4gZnVuY3Rpb24uXG5cbm9iamVjdC5fX2RpY3RfX1xuXG4gICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3RcJ3NcbiAgICh3cml0YWJsZSkgYXR0cmlidXRlcy5cblxuaW5zdGFuY2UuX19jbGFzc19fXG5cbiAgIFRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuXG5cbmNsYXNzLl9fYmFzZXNfX1xuXG4gICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LlxuXG5jbGFzcy5fX25hbWVfX1xuXG4gICBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgb3IgdHlwZS5cblxuY2xhc3MuX19xdWFsbmFtZV9fXG5cbiAgIFRoZSAqcXVhbGlmaWVkIG5hbWUqIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjMuXG5cbmNsYXNzLl9fbXJvX19cblxuICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlblxuICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cblxuY2xhc3MubXJvKClcblxuICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplIHRoZVxuICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3NcbiAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiAiX19tcm9fXyIuXG5cbmNsYXNzLl9fc3ViY2xhc3Nlc19fKClcblxuICAgRWFjaCBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbW1lZGlhdGVcbiAgIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgcmVmZXJlbmNlc1xuICAgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG5cbiAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuICAgICAgWzxjbGFzcyBcJ2Jvb2xcJz5dXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzcGVjaWFsIG1ldGhvZHMgbWF5IGJlIGZvdW5kXG4gICAgaW4gdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsICgqQmFzaWMgY3VzdG9taXphdGlvbiopLlxuXG5bMl0gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGxpc3QgIlsxLCAyXSIgaXMgY29uc2lkZXJlZCBlcXVhbCB0b1xuICAgICJbMS4wLCAyLjBdIiwgYW5kIHNpbWlsYXJseSBmb3IgdHVwbGVzLlxuXG5bM10gVGhleSBtdXN0IGhhdmUgc2luY2UgdGhlIHBhcnNlciBjYW5cJ3QgdGVsbCB0aGUgdHlwZSBvZiB0aGVcbiAgICBvcGVyYW5kcy5cblxuWzRdIENhc2VkIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSBwcm9wZXJ0eVxuICAgIGJlaW5nIG9uZSBvZiAiTHUiIChMZXR0ZXIsIHVwcGVyY2FzZSksICJMbCIgKExldHRlciwgbG93ZXJjYXNlKSxcbiAgICBvciAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbls1XSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYVxuICAgIHNpbmdsZXRvbiB0dXBsZSB3aG9zZSBvbmx5IGVsZW1lbnQgaXMgdGhlIHR1cGxlIHRvIGJlIGZvcm1hdHRlZC5cbicsCi0gJ3NwZWNpYWxuYW1lcyc6IHUnXG5TcGVjaWFsIG1ldGhvZCBuYW1lc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IHNwZWNpYWxcbnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieVxuZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uXCdzIGFwcHJvYWNoIHRvXG4qb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3JcbndpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgY2xhc3MgZGVmaW5lc1xuYSBtZXRob2QgbmFtZWQgIl9fZ2V0aXRlbV9fKCkiLCBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsXG50aGVuICJ4W2ldIiBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gInR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSkiLlxuRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb24gcmFpc2UgYW5cbmV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbiJBdHRyaWJ1dGVFcnJvciIgb3IgIlR5cGVFcnJvciIpLlxuXG5XaGVuIGltcGxlbWVudGluZyBhIGNsYXNzIHRoYXQgZW11bGF0ZXMgYW55IGJ1aWx0LWluIHR5cGUsIGl0IGlzXG5pbXBvcnRhbnQgdGhhdCB0aGUgZW11bGF0aW9uIG9ubHkgYmUgaW1wbGVtZW50ZWQgdG8gdGhlIGRlZ3JlZSB0aGF0IGl0XG5tYWtlcyBzZW5zZSBmb3IgdGhlIG9iamVjdCBiZWluZyBtb2RlbGxlZC4gIEZvciBleGFtcGxlLCBzb21lXG5zZXF1ZW5jZXMgbWF5IHdvcmsgd2VsbCB3aXRoIHJldHJpZXZhbCBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzLCBidXRcbmV4dHJhY3RpbmcgYSBzbGljZSBtYXkgbm90IG1ha2Ugc2Vuc2UuICAoT25lIGV4YW1wbGUgb2YgdGhpcyBpcyB0aGVcbiJOb2RlTGlzdCIgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcblxuXG5CYXNpYyBjdXN0b21pemF0aW9uXG49PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlXG4gICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZFxuICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciBleGFtcGxlLCB0aGVcbiAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvIGF1dG9tYXRpY2FsbHlcbiAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlXG4gICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuXG4gICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXJcJ3NcbiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgcmVmbGVjdGlvbixcbiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlXG4gICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGFcbiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kXCdzIHR5cGUsIHRoZVxuICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGVcbiAgIGxlZnQgb3BlcmFuZFwncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3RcbiAgIGNvbnNpZGVyZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3RcbiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSJcbiAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBhcyBpdGVtcyBpblxuICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZFxuICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnRcbiAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlIGNvbGxlY3Rpb25zXG4gICByZXF1aXJlcyB0aGF0IGEga2V5XCdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cblxuICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgbWV0aG9kcyBieVxuICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoXG4gICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSBoYXNoKHkpIi5cblxuICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiXG4gICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICBXaGVuIHRoZVxuICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzc1xuICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0b1xuICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgaW50ZXJwcmV0ZXJcbiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzc1xuICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3NcbiAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiB0aGF0XG4gICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiBjYWxsLlxuXG4gICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzIGFuZFxuICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLlxuICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob25cbiAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2ZcbiAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwtXG4gICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGVcbiAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgY29tcGxleGl0eS5cbiAgICAgU2VlIGh0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3JcbiAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gb3JkZXIgb2ZcbiAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXNcbiAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kXG4gICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cbm9iamVjdC5fX2Jvb2xfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3RcbiAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG5cblxuQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSBtZWFuaW5nIG9mXG5hdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mICJ4Lm5hbWUiKSBmb3JcbmNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgYXR0cmlidXRlIG5hbWUuIFRoaXNcbiAgIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICAiX19nZXRhdHRyX18oKSIgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgZG9uZSBib3RoIGZvclxuICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAiX19nZXRhdHRyX18oKSIgd291bGQgaGF2ZVxuICAgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGUgdGhhdCBhdFxuICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnkgbm90XG4gICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbFxuICAgY29udHJvbCBvdmVyIGF0dHJpYnV0ZSBhY2Nlc3MuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXMgIl9fZ2V0YXR0cl9fKCkiLFxuICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICJfX2dldGF0dHJpYnV0ZV9fKCkiIGVpdGhlclxuICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gVGhpcyBtZXRob2RcbiAgIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluXG4gICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzc1xuICAgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0byBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvclxuICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsXG4gICAgIG1ldGhvZHMgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXhcbiAgICAgb3IgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCouXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICp2YWx1ZSogaXMgdGhlXG4gICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cblxuICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2ZcbiAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgb2JqLm5hbWUiIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5vYmplY3QuX19kaXJfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBIHNlcXVlbmNlIG11c3QgYmVcbiAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhIGxpc3QgYW5kXG4gICBzb3J0cyBpdC5cblxuXG5JbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzc1xuY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW5cbipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lclwncyBjbGFzc1xuZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyBwYXJlbnRzKS4gIEluIHRoZVxuZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzXG50aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3NcJyAiX19kaWN0X18iLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgIk5vbmUiIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAiQXR0cmlidXRlRXJyb3IiXG4gICBleGNlcHRpb24uXG5cbm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyXG4gICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cblxub2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZVxuICAgb3duZXIgY2xhc3MuXG5cblRoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICJpbnNwZWN0IiBtb2R1bGUgYXNcbnNwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkIChzZXR0aW5nIHRoaXNcbmFwcHJvcHJpYXRlbHkgY2FuIGFzc2lzdCBpbiBydW50aW1lIGludHJvc3BlY3Rpb24gb2YgZHluYW1pYyBjbGFzc1xuYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuIGluc3RhbmNlIG9mIHRoZVxuZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgdGhlIGZpcnN0XG5wb3NpdGlvbmFsIGFyZ3VtZW50IChmb3IgZXhhbXBsZSwgQ1B5dGhvbiBzZXRzIHRoaXMgYXR0cmlidXRlIGZvclxudW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIsIGFuZFxuIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsIGl0XG5pcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICJhLngiIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4idHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbiJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICJhLngiLiBIb3dcbnRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcblxuRGlyZWN0IENhbGxcbiAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgZGlyZWN0bHlcbiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuXG5DbGFzcyBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGNhbGw6XG4gICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICJzdXBlcihCLFxuICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgYmFzZSBjbGFzcyAiQSJcbiAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZVxuICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKSIuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGwgcmV0dXJuXG50aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSBvYmplY3RcJ3Ncbmluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICJfX3NldF9fKCkiIGFuZC9vclxuIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzIG5laXRoZXIsIGl0IGlzXG5hIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUgYm90aFxuIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlXG4iX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgYW5kICJfX2dldF9fKCkiXG5kZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW5cbmNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgInN0YXRpY21ldGhvZCgpIiBhbmQgImNsYXNzbWV0aG9kKCkiKSBhcmVcbmltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5cbnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG9cbmFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzLlxuXG5UaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG4tLS0tLS0tLS1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZVxuc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZVxudmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWUgYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZVxubnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgY2xhc3NcbmRlZmluaXRpb24uIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlIG9mIGluc3RhbmNlXG52YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggaW5zdGFuY2UgdG8gaG9sZCBhXG52YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpcyBub3RcbmNyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG5cbm9iamVjdC5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgKl9fc2xvdHNfXypcbiAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGVcbiAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qIGZvciBlYWNoXG4gICBpbnN0YW5jZS5cblxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxufn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5cblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICJBdHRyaWJ1dGVFcnJvciIuIElmXG4gIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkXG4gICJcJ19fZGljdF9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3Nlc1xuICBkZWZpbmluZyAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzXG4gIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkXG4gICJcJ19fd2Vha3JlZl9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nXG4gIGRlc2NyaXB0b3JzICgqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKikgZm9yIGVhY2ggdmFyaWFibGUgbmFtZS4gIEFzXG4gIGEgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3JcbiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzXG4gIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cblxuKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3NcbiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICpfX2RpY3RfXypcbiAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSBjb250YWluIG5hbWVzXG4gIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuXG4qIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgdGhlXG4gIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGVcbiAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLlxuICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlIGZ1dHVyZSwgYVxuICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuXG4qIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tXG4gICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICJieXRlcyIgYW5kICJ0dXBsZSIuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5nc1xuICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cblxuQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkJ5IGRlZmF1bHQsIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nICJ0eXBlKCkiLiBUaGUgY2xhc3MgYm9keSBpc1xuZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCBsb2NhbGx5IHRvIHRoZVxucmVzdWx0IG9mICJ0eXBlKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpIi5cblxuVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWlzZWQgYnkgcGFzc2luZyB0aGVcbiJtZXRhY2xhc3MiIGtleXdvcmQgYXJndW1lbnQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gbGluZSwgb3IgYnlcbmluaGVyaXRpbmcgZnJvbSBhbiBleGlzdGluZyBjbGFzcyB0aGF0IGluY2x1ZGVkIHN1Y2ggYW4gYXJndW1lbnQuIEluXG50aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlIGluc3RhbmNlc1xub2YgIk1ldGEiOlxuXG4gICBjbGFzcyBNZXRhKHR5cGUpOlxuICAgICAgIHBhc3NcblxuICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6XG4gICAgICAgcGFzc1xuXG4gICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOlxuICAgICAgIHBhc3NcblxuQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvblxuYXJlIHBhc3NlZCB0aHJvdWdoIHRvIGFsbCBtZXRhY2xhc3Mgb3BlcmF0aW9ucyBkZXNjcmliZWQgYmVsb3cuXG5cbldoZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzIG9jY3VyOlxuXG4qIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZFxuXG4qIHRoZSBjbGFzcyBuYW1lc3BhY2UgaXMgcHJlcGFyZWRcblxuKiB0aGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZFxuXG4qIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZFxuXG5cbkRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3Ncbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBmb3IgYSBjbGFzcyBkZWZpbml0aW9uIGlzIGRldGVybWluZWQgYXNcbmZvbGxvd3M6XG5cbiogaWYgbm8gYmFzZXMgYW5kIG5vIGV4cGxpY2l0IG1ldGFjbGFzcyBhcmUgZ2l2ZW4sIHRoZW4gInR5cGUoKSIgaXNcbiAgdXNlZFxuXG4qIGlmIGFuIGV4cGxpY2l0IG1ldGFjbGFzcyBpcyBnaXZlbiBhbmQgaXQgaXMgKm5vdCogYW4gaW5zdGFuY2Ugb2ZcbiAgInR5cGUoKSIsIHRoZW4gaXQgaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgbWV0YWNsYXNzXG5cbiogaWYgYW4gaW5zdGFuY2Ugb2YgInR5cGUoKSIgaXMgZ2l2ZW4gYXMgdGhlIGV4cGxpY2l0IG1ldGFjbGFzcywgb3JcbiAgYmFzZXMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgdXNlZFxuXG5UaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBzZWxlY3RlZCBmcm9tIHRoZSBleHBsaWNpdGx5IHNwZWNpZmllZFxubWV0YWNsYXNzIChpZiBhbnkpIGFuZCB0aGUgbWV0YWNsYXNzZXMgKGkuZS4gInR5cGUoY2xzKSIpIG9mIGFsbFxuc3BlY2lmaWVkIGJhc2UgY2xhc3Nlcy4gVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgb25lIHdoaWNoIGlzIGFcbnN1YnR5cGUgb2YgKmFsbCogb2YgdGhlc2UgY2FuZGlkYXRlIG1ldGFjbGFzc2VzLiBJZiBub25lIG9mIHRoZVxuY2FuZGlkYXRlIG1ldGFjbGFzc2VzIG1lZXRzIHRoYXQgY3JpdGVyaW9uLCB0aGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uXG53aWxsIGZhaWwgd2l0aCAiVHlwZUVycm9yIi5cblxuXG5QcmVwYXJpbmcgdGhlIGNsYXNzIG5hbWVzcGFjZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuT25jZSB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGhhcyBiZWVuIGlkZW50aWZpZWQsIHRoZW4gdGhlIGNsYXNzXG5uYW1lc3BhY2UgaXMgcHJlcGFyZWQuIElmIHRoZSBtZXRhY2xhc3MgaGFzIGEgIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsXG5pdCBpcyBjYWxsZWQgYXMgIm5hbWVzcGFjZSA9IG1ldGFjbGFzcy5fX3ByZXBhcmVfXyhuYW1lLCBiYXNlcyxcbioqa3dkcykiICh3aGVyZSB0aGUgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgaWYgYW55LCBjb21lIGZyb21cbnRoZSBjbGFzcyBkZWZpbml0aW9uKS5cblxuSWYgdGhlIG1ldGFjbGFzcyBoYXMgbm8gIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsIHRoZW4gdGhlIGNsYXNzXG5uYW1lc3BhY2UgaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgImRpY3QoKSIgaW5zdGFuY2UuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMFxuXG4gICAgIEludHJvZHVjZWQgdGhlICJfX3ByZXBhcmVfXyIgbmFtZXNwYWNlIGhvb2tcblxuXG5FeGVjdXRpbmcgdGhlIGNsYXNzIGJvZHlcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZCAoYXBwcm94aW1hdGVseSkgYXMgImV4ZWMoYm9keSwgZ2xvYmFscygpLFxubmFtZXNwYWNlKSIuIFRoZSBrZXkgZGlmZmVyZW5jZSBmcm9tIGEgbm9ybWFsIGNhbGwgdG8gImV4ZWMoKSIgaXMgdGhhdFxubGV4aWNhbCBzY29waW5nIGFsbG93cyB0aGUgY2xhc3MgYm9keSAoaW5jbHVkaW5nIGFueSBtZXRob2RzKSB0b1xucmVmZXJlbmNlIG5hbWVzIGZyb20gdGhlIGN1cnJlbnQgYW5kIG91dGVyIHNjb3BlcyB3aGVuIHRoZSBjbGFzc1xuZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIGEgZnVuY3Rpb24uXG5cbkhvd2V2ZXIsIGV2ZW4gd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIHRoZSBmdW5jdGlvbixcbm1ldGhvZHMgZGVmaW5lZCBpbnNpZGUgdGhlIGNsYXNzIHN0aWxsIGNhbm5vdCBzZWUgbmFtZXMgZGVmaW5lZCBhdCB0aGVcbmNsYXNzIHNjb3BlLiBDbGFzcyB2YXJpYWJsZXMgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBmaXJzdFxucGFyYW1ldGVyIG9mIGluc3RhbmNlIG9yIGNsYXNzIG1ldGhvZHMsIGFuZCBjYW5ub3QgYmUgYWNjZXNzZWQgYXQgYWxsXG5mcm9tIHN0YXRpYyBtZXRob2RzLlxuXG5cbkNyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3Rcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuT25jZSB0aGUgY2xhc3MgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBleGVjdXRpbmcgdGhlIGNsYXNzXG5ib2R5LCB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyAibWV0YWNsYXNzKG5hbWUsIGJhc2VzLFxubmFtZXNwYWNlLCAqKmt3ZHMpIiAodGhlIGFkZGl0aW9uYWwga2V5d29yZHMgcGFzc2VkIGhlcmUgYXJlIHRoZSBzYW1lXG5hcyB0aG9zZSBwYXNzZWQgdG8gIl9fcHJlcGFyZV9fIikuXG5cblRoaXMgY2xhc3Mgb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHplcm8tXG5hcmd1bWVudCBmb3JtIG9mICJzdXBlcigpIi4gIl9fY2xhc3NfXyIgaXMgYW4gaW1wbGljaXQgY2xvc3VyZVxucmVmZXJlbmNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGlmIGFueSBtZXRob2RzIGluIGEgY2xhc3MgYm9keSByZWZlclxudG8gZWl0aGVyICJfX2NsYXNzX18iIG9yICJzdXBlciIuIFRoaXMgYWxsb3dzIHRoZSB6ZXJvIGFyZ3VtZW50IGZvcm1cbm9mICJzdXBlcigpIiB0byBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgYmFzZWQgb25cbmxleGljYWwgc2NvcGluZywgd2hpbGUgdGhlIGNsYXNzIG9yIGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgdG8gbWFrZSB0aGVcbmN1cnJlbnQgY2FsbCBpcyBpZGVudGlmaWVkIGJhc2VkIG9uIHRoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gdGhlXG5tZXRob2QuXG5cbkFmdGVyIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSBjbGFzc1xuZGVjb3JhdG9ycyBpbmNsdWRlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAoaWYgYW55KSBhbmQgdGhlIHJlc3VsdGluZ1xub2JqZWN0IGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgdGhlIGRlZmluZWQgY2xhc3MuXG5cbldoZW4gYSBuZXcgY2xhc3MgaXMgY3JlYXRlZCBieSAidHlwZS5fX25ld19fIiwgdGhlIG9iamVjdCBwcm92aWRlZCBhc1xudGhlIG5hbWVzcGFjZSBwYXJhbWV0ZXIgaXMgY29waWVkIHRvIGEgc3RhbmRhcmQgUHl0aG9uIGRpY3Rpb25hcnkgYW5kXG50aGUgb3JpZ2luYWwgb2JqZWN0IGlzIGRpc2NhcmRlZC4gVGhlIG5ldyBjb3B5IGJlY29tZXMgdGhlICJfX2RpY3RfXyJcbmF0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0LlxuXG5TZWUgYWxzbzogKipQRVAgMzEzNSoqIC0gTmV3IHN1cGVyXG5cbiAgICAgRGVzY3JpYmVzIHRoZSBpbXBsaWNpdCAiX19jbGFzc19fIiBjbG9zdXJlIHJlZmVyZW5jZVxuXG5cbk1ldGFjbGFzcyBleGFtcGxlXG4tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgdGhhdCBoYXZlXG5iZWVuIGV4cGxvcmVkIGluY2x1ZGUgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCBhdXRvbWF0aWNcbmRlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgZnJhbWV3b3JrcywgYW5kXG5hdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uXG5cbkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIG1ldGFjbGFzcyB0aGF0IHVzZXMgYW5cbiJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIgdG8gcmVtZW1iZXIgdGhlIG9yZGVyIHRoYXQgY2xhc3MgdmFyaWFibGVzXG5hcmUgZGVmaW5lZDpcblxuICAgY2xhc3MgT3JkZXJlZENsYXNzKHR5cGUpOlxuXG4gICAgICAgQGNsYXNzbWV0aG9kXG4gICAgICAgZGVmIF9fcHJlcGFyZV9fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCAqKmt3ZHMpOlxuICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKVxuXG4gICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlLCAqKmt3ZHMpOlxuICAgICAgICAgICByZXN1bHQgPSB0eXBlLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdChuYW1lc3BhY2UpKVxuICAgICAgICAgICByZXN1bHQubWVtYmVycyA9IHR1cGxlKG5hbWVzcGFjZSlcbiAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuXG4gICBjbGFzcyBBKG1ldGFjbGFzcz1PcmRlcmVkQ2xhc3MpOlxuICAgICAgIGRlZiBvbmUoc2VsZik6IHBhc3NcbiAgICAgICBkZWYgdHdvKHNlbGYpOiBwYXNzXG4gICAgICAgZGVmIHRocmVlKHNlbGYpOiBwYXNzXG4gICAgICAgZGVmIGZvdXIoc2VsZik6IHBhc3NcblxuICAgPj4+IEEubWVtYmVyc1xuICAgKFwnX19tb2R1bGVfX1wnLCBcJ29uZVwnLCBcJ3R3b1wnLCBcJ3RocmVlXCcsIFwnZm91clwnKVxuXG5XaGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciAqQSogZ2V0cyBleGVjdXRlZCwgdGhlIHByb2Nlc3MgYmVnaW5zXG53aXRoIGNhbGxpbmcgdGhlIG1ldGFjbGFzc1wncyAiX19wcmVwYXJlX18oKSIgbWV0aG9kIHdoaWNoIHJldHVybnMgYW5cbmVtcHR5ICJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIuICBUaGF0IG1hcHBpbmcgcmVjb3JkcyB0aGUgbWV0aG9kcyBhbmRcbmF0dHJpYnV0ZXMgb2YgKkEqIGFzIHRoZXkgYXJlIGRlZmluZWQgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBjbGFzc1xuc3RhdGVtZW50LiBPbmNlIHRob3NlIGRlZmluaXRpb25zIGFyZSBleGVjdXRlZCwgdGhlIG9yZGVyZWQgZGljdGlvbmFyeVxuaXMgZnVsbHkgcG9wdWxhdGVkIGFuZCB0aGUgbWV0YWNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCBnZXRzXG5pbnZva2VkLiAgVGhhdCBtZXRob2QgYnVpbGRzIHRoZSBuZXcgdHlwZSBhbmQgaXQgc2F2ZXMgdGhlIG9yZGVyZWRcbmRpY3Rpb25hcnkga2V5cyBpbiBhbiBhdHRyaWJ1dGUgY2FsbGVkICJtZW1iZXJzIi5cblxuXG5DdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGVcbiJpc2luc3RhbmNlKCkiIGFuZCAiaXNzdWJjbGFzcygpIiBidWlsdC1pbiBmdW5jdGlvbnMuXG5cbkluIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgImFiYy5BQkNNZXRhIiBpbXBsZW1lbnRzIHRoZXNlIG1ldGhvZHMgaW5cbm9yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGFzXG4idmlydHVhbCBiYXNlIGNsYXNzZXMiIHRvIGFueSBjbGFzcyBvciB0eXBlIChpbmNsdWRpbmcgYnVpbHQtaW5cbnR5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuXG5cbmNsYXNzLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgICJpc2luc3RhbmNlKGluc3RhbmNlLCBjbGFzcykiLlxuXG5jbGFzcy5fX3N1YmNsYXNzY2hlY2tfXyhzZWxmLCBzdWJjbGFzcylcblxuICAgUmV0dXJuIHRydWUgaWYgKnN1YmNsYXNzKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3JcbiAgIGluZGlyZWN0KSBzdWJjbGFzcyBvZiAqY2xhc3MqLiAgSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudFxuICAgImlzc3ViY2xhc3Moc3ViY2xhc3MsIGNsYXNzKSIuXG5cbk5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgKG1ldGFjbGFzcykgb2YgYVxuY2xhc3MuICBUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIGFzIGNsYXNzIG1ldGhvZHMgaW4gdGhlIGFjdHVhbCBjbGFzcy5cblRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZFxub24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgY2xhc3MuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTE5KiogLSBJbnRyb2R1Y2luZyBBYnN0cmFjdCBCYXNlIENsYXNzZXNcblxuICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgImlzaW5zdGFuY2UoKSIgYW5kXG4gICAgICJpc3N1YmNsYXNzKCkiIGJlaGF2aW9yIHRocm91Z2ggIl9faW5zdGFuY2VjaGVja19fKCkiIGFuZFxuICAgICAiX19zdWJjbGFzc2NoZWNrX18oKSIsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5IGluXG4gICAgIHRoZSBjb250ZXh0IG9mIGFkZGluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKHNlZSB0aGUgImFiYyJcbiAgICAgbW9kdWxlKSB0byB0aGUgbGFuZ3VhZ2UuXG5cblxuRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbj09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZFxuICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cblxuXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9IGsgPCBOIiB3aGVyZVxuKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaCBkZWZpbmUgYVxucmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZSB0aGVcbm1ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgImNsZWFyKCkiLFxuInNldGRlZmF1bHQoKSIsICJwb3AoKSIsICJwb3BpdGVtKCkiLCAiY29weSgpIiwgYW5kICJ1cGRhdGUoKSJcbmJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvblwncyBzdGFuZGFyZCBkaWN0aW9uYXJ5IG9iamVjdHMuXG5UaGUgImNvbGxlY3Rpb25zIiBtb2R1bGUgcHJvdmlkZXMgYSAiTXV0YWJsZU1hcHBpbmciIGFic3RyYWN0IGJhc2VcbmNsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0IG9mICJfX2dldGl0ZW1fXygpIixcbiJfX3NldGl0ZW1fXygpIiwgIl9fZGVsaXRlbV9fKCkiLCBhbmQgImtleXMoKSIuIE11dGFibGUgc2VxdWVuY2VzXG5zaG91bGQgcHJvdmlkZSBtZXRob2RzICJhcHBlbmQoKSIsICJjb3VudCgpIiwgImluZGV4KCkiLCAiZXh0ZW5kKCkiLFxuImluc2VydCgpIiwgInBvcCgpIiwgInJlbW92ZSgpIiwgInJldmVyc2UoKSIgYW5kICJzb3J0KCkiLCBsaWtlIFB5dGhvblxuc3RhbmRhcmQgbGlzdCBvYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkIGltcGxlbWVudFxuYWRkaXRpb24gKG1lYW5pbmcgY29uY2F0ZW5hdGlvbikgYW5kIG11bHRpcGxpY2F0aW9uIChtZWFuaW5nXG5yZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUgbWV0aG9kcyAiX19hZGRfXygpIiwgIl9fcmFkZF9fKCkiLFxuIl9faWFkZF9fKCkiLCAiX19tdWxfXygpIiwgIl9fcm11bF9fKCkiIGFuZCAiX19pbXVsX18oKSIgZGVzY3JpYmVkXG5iZWxvdzsgdGhleSBzaG91bGQgbm90IGRlZmluZSBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbiJfX2NvbnRhaW5zX18oKSIgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlICJpbiIgb3BlcmF0b3I7XG5mb3IgbWFwcGluZ3MsICJpbiIgc2hvdWxkIHNlYXJjaCB0aGUgbWFwcGluZ1wncyBrZXlzOyBmb3Igc2VxdWVuY2VzLCBpdFxuc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyIHJlY29tbWVuZGVkIHRoYXQgYm90aFxubWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlICJfX2l0ZXJfXygpIiBtZXRob2QgdG8gYWxsb3dcbmVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGUgY29udGFpbmVyOyBmb3IgbWFwcGluZ3MsICJfX2l0ZXJfXygpIlxuc2hvdWxkIGJlIHRoZSBzYW1lIGFzICJrZXlzKCkiOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZVxudGhyb3VnaCB0aGUgdmFsdWVzLlxuXG5vYmplY3QuX19sZW5fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiLiAgU2hvdWxkIHJldHVyblxuICAgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LCBhbiBpbnRlZ2VyICI+PSIgMC4gIEFsc28sIGFuIG9iamVjdCB0aGF0XG4gICBkb2VzblwndCBkZWZpbmUgYSAiX19ib29sX18oKSIgbWV0aG9kIGFuZCB3aG9zZSAiX19sZW5fXygpIiBtZXRob2RcbiAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiBjb250ZXh0LlxuXG5vYmplY3QuX19sZW5ndGhfaGludF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmxlbmd0aF9oaW50KCkiLiBTaG91bGQgcmV0dXJuIGFuXG4gICBlc3RpbWF0ZWQgbGVuZ3RoIGZvciB0aGUgb2JqZWN0ICh3aGljaCBtYXkgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW5cbiAgIHRoZSBhY3R1YWwgbGVuZ3RoKS4gVGhlIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgIj49IiAwLiBUaGlzXG4gICBtZXRob2QgaXMgcHVyZWx5IGFuIG9wdGltaXphdGlvbiBhbmQgaXMgbmV2ZXIgcmVxdWlyZWQgZm9yXG4gICBjb3JyZWN0bmVzcy5cblxuICAgTmV3IGluIHZlcnNpb24gMy40LlxuXG5Ob3RlOiBTbGljaW5nIGlzIGRvbmUgZXhjbHVzaXZlbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRocmVlIG1ldGhvZHMuXG4gIEEgY2FsbCBsaWtlXG5cbiAgICAgYVsxOjJdID0gYlxuXG4gIGlzIHRyYW5zbGF0ZWQgdG9cblxuICAgICBhW3NsaWNlKDEsIDIsIE5vbmUpXSA9IGJcblxuICBhbmQgc28gZm9ydGguICBNaXNzaW5nIHNsaWNlIGl0ZW1zIGFyZSBhbHdheXMgZmlsbGVkIGluIHdpdGggIk5vbmUiLlxuXG5vYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgInNlbGZba2V5XSIuIEZvciBzZXF1ZW5jZSB0eXBlcyxcbiAgIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2VycyBhbmQgc2xpY2Ugb2JqZWN0cy4gIE5vdGUgdGhhdFxuICAgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlIGNsYXNzIHdpc2hlc1xuICAgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLiBJZlxuICAgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLCAiVHlwZUVycm9yIiBtYXkgYmUgcmFpc2VkOyBpZiBvZlxuICAgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnlcbiAgIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgdmFsdWVzKSwgIkluZGV4RXJyb3IiIHNob3VsZCBiZVxuICAgcmFpc2VkLiBGb3IgbWFwcGluZyB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZVxuICAgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLlxuXG4gICBOb3RlOiAiZm9yIiBsb29wcyBleHBlY3QgdGhhdCBhbiAiSW5kZXhFcnJvciIgd2lsbCBiZSByYWlzZWQgZm9yXG4gICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlXG4gICAgIHNlcXVlbmNlLlxuXG5vYmplY3QuX19taXNzaW5nX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgYnkgImRpY3QiLiJfX2dldGl0ZW1fXygpIiB0byBpbXBsZW1lbnQgInNlbGZba2V5XSIgZm9yIGRpY3RcbiAgIHN1YmNsYXNzZXMgd2hlbiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxuXG5vYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvclxuICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5c1xuICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZVxuICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3JcbiAgIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlIGFzIGZvclxuICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzXG4gICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlXG4gICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2l0ZXJfXyhzZWxmKVxuXG4gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlXG4gICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGRcbiAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLlxuXG4gICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlXG4gICByZXF1aXJlZCB0byByZXR1cm4gdGhlbXNlbHZlcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGl0ZXJhdG9yXG4gICBvYmplY3RzLCBzZWUgKkl0ZXJhdG9yIFR5cGVzKi5cblxub2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuXG4gICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gaW1wbGVtZW50XG4gICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXRcbiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci5cblxuICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICJyZXZlcnNlZCgpIlxuICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICgiX19sZW5fXygpIlxuICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2xcbiAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiBwcm92aWRlIGFuXG4gICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieVxuICAgInJldmVyc2VkKCkiLlxuXG5UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSBub3JtYWxseVxuaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lclxub2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50XG5pbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWVcbiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXNcbiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yXG4gICB0aGUga2V5LWl0ZW0gcGFpcnMuXG5cbiAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgbWVtYmVyc2hpcCB0ZXN0XG4gICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkIHNlcXVlbmNlXG4gICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlICp0aGlzIHNlY3Rpb24gaW4gdGhlXG4gICBsYW5ndWFnZSByZWZlcmVuY2UqLlxuXG5cbkVtdWxhdGluZyBudW1lcmljIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuXG5NZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZVxucGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvclxubm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cblxub2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKS4gIEZvciBpbnN0YW5jZSwgdG9cbiAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzIGNhbGxlZC5cbiAgIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvIHVzaW5nXG4gICAiX19mbG9vcmRpdl9fKCkiIGFuZCAiX19tb2RfXygpIjsgaXQgc2hvdWxkIG5vdCBiZSByZWxhdGVkIHRvXG4gICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0XG4gICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pblxuICAgInBvdygpIiBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuXG5cbiAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZVxuICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuICJOb3RJbXBsZW1lbnRlZCIuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgImRpdm1vZCgpIixcbiAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpIHdpdGggcmVmbGVjdGVkIChzd2FwcGVkKVxuICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0IG9wZXJhbmQgZG9lc1xuICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgYXJlIG9mXG4gICBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4IC1cbiAgIHkiLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiAiX19yc3ViX18oKSJcbiAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiByZXR1cm5zXG4gICAqTm90SW1wbGVtZW50ZWQqLlxuXG4gICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICJfX3Jwb3dfXygpIiAodGhlXG4gICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0XG4gICAgIG9wZXJhbmRcJ3MgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZFxuICAgICBmb3IgdGhlIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0XG4gICAgIG9wZXJhbmRcJ3Mgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzXG4gICAgIHRvIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgIioqPSIsXG4gICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgYXR0ZW1wdCB0b1xuICAgZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kIHJldHVybiB0aGUgcmVzdWx0XG4gICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSBzcGVjaWZpY1xuICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgZmFsbHMgYmFjayB0byB0aGVcbiAgIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzc1xuICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ID1cbiAgIHguX19pYWRkX18oeSkiIC4gT3RoZXJ3aXNlLCAieC5fX2FkZF9fKHkpIiBhbmQgInkuX19yYWRkX18oeCkiIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiBjZXJ0YWluXG4gICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgZXJyb3JzXG4gICAoc2VlICpXaHkgZG9lcyBhX3R1cGxlW2ldICs9IFtcJ2l0ZW1cJ10gcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlXG4gICBhZGRpdGlvbiB3b3Jrcz8qKSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mIHRoZSBkYXRhXG4gICBtb2RlbC5cblxub2JqZWN0Ll9fbmVnX18oc2VsZilcbm9iamVjdC5fX3Bvc19fKHNlbGYpXG5vYmplY3QuX19hYnNfXyhzZWxmKVxub2JqZWN0Ll9faW52ZXJ0X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zICgiLSIsICIrIixcbiAgICJhYnMoKSIgYW5kICJ+IikuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2Zsb2F0X18oc2VsZilcbm9iamVjdC5fX3JvdW5kX18oc2VsZlssIG5dKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImNvbXBsZXgoKSIsICJpbnQoKSIsXG4gICAiZmxvYXQoKSIgYW5kICJyb3VuZCgpIi4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZiB0aGUgYXBwcm9wcmlhdGVcbiAgIHR5cGUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IuaW5kZXgoKSIsIGFuZCB3aGVuZXZlciBQeXRob24gbmVlZHNcbiAgIHRvIGxvc3NsZXNzbHkgY29udmVydCB0aGUgbnVtZXJpYyBvYmplY3QgdG8gYW4gaW50ZWdlciBvYmplY3QgKHN1Y2hcbiAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAib2N0KCkiXG4gICBmdW5jdGlvbnMpLiBQcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtZXJpY1xuICAgb2JqZWN0IGlzIGFuIGludGVnZXIgdHlwZS4gIE11c3QgcmV0dXJuIGFuIGludGVnZXIuXG5cbiAgIE5vdGU6IEluIG9yZGVyIHRvIGhhdmUgYSBjb2hlcmVudCBpbnRlZ2VyIHR5cGUgY2xhc3MsIHdoZW5cbiAgICAgIl9faW5kZXhfXygpIiBpcyBkZWZpbmVkICJfX2ludF9fKCkiIHNob3VsZCBhbHNvIGJlIGRlZmluZWQsIGFuZFxuICAgICBib3RoIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG5cblxuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSAid2l0aCIgc3RhdGVtZW50LiBUaGUgY29udGV4dCBtYW5hZ2VyXG5oYW5kbGVzIHRoZSBlbnRyeSBpbnRvLCBhbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgcnVudGltZSBjb250ZXh0XG5mb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5XG5pbnZva2VkIHVzaW5nIHRoZSAid2l0aCIgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbiAqVGhlIHdpdGhcbnN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciBtZXRob2RzLlxuXG5UeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXNcbmtpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgY2xvc2luZyBvcGVuZWRcbmZpbGVzLCBldGMuXG5cbkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSAqQ29udGV4dCBNYW5hZ2VyIFR5cGVzKi5cblxub2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuXG4gICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAid2l0aCJcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSAiTm9uZSIuXG5cbiAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZVxuICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZFxuICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkXG4gICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cblxuICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286ICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwXG49PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIGN1c3RvbSBjbGFzc2VzLCBpbXBsaWNpdCBpbnZvY2F0aW9ucyBvZiBzcGVjaWFsIG1ldGhvZHMgYXJlIG9ubHlcbmd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkgaWYgZGVmaW5lZCBvbiBhbiBvYmplY3RcJ3MgdHlwZSwgbm90IGluXG50aGUgb2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgcmVhc29uIHdoeVxudGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb246XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gbGVuKGMpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlIFwnQ1wnIGhhcyBubyBsZW4oKVxuXG5UaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbFxubWV0aG9kcyBzdWNoIGFzICJfX2hhc2hfXygpIiBhbmQgIl9fcmVwcl9fKCkiIHRoYXQgYXJlIGltcGxlbWVudGVkIGJ5XG5hbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCBvZiB0aGVzZVxubWV0aG9kcyB1c2VkIHRoZSBjb252ZW50aW9uYWwgbG9va3VwIHByb2Nlc3MsIHRoZXkgd291bGQgZmFpbCB3aGVuXG5pbnZva2VkIG9uIHRoZSB0eXBlIG9iamVjdCBpdHNlbGY6XG5cbiAgID4+PiAxIC5fX2hhc2hfXygpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciBcJ19faGFzaF9fXCcgb2YgXCdpbnRcJyBvYmplY3QgbmVlZHMgYW4gYXJndW1lbnRcblxuSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSBjbGFzcyBpbiB0aGlzXG53YXkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFwnbWV0YWNsYXNzIGNvbmZ1c2lvblwnLCBhbmQgaXMgYXZvaWRlZFxuYnkgYnlwYXNzaW5nIHRoZSBpbnN0YW5jZSB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzOlxuXG4gICA+Pj4gdHlwZSgxKS5fX2hhc2hfXygxKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gdHlwZShpbnQpLl9faGFzaF9fKGludCkgPT0gaGFzaChpbnQpXG4gICBUcnVlXG5cbkluIGFkZGl0aW9uIHRvIGJ5cGFzc2luZyBhbnkgaW5zdGFuY2UgYXR0cmlidXRlcyBpbiB0aGUgaW50ZXJlc3Qgb2ZcbmNvcnJlY3RuZXNzLCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgZ2VuZXJhbGx5IGFsc28gYnlwYXNzZXNcbnRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzIG1ldGFjbGFzczpcblxuICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50KCJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuICAgLi4uICAgICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6XG4gICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50KCJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4gICAuLi4gICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fKCkgICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSBpbnN0YW5jZVxuICAgQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbiAgIDEwXG4gICA+Pj4gdHlwZShjKS5fX2xlbl9fKGMpICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSB0eXBlXG4gICBNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbiAgIDEwXG4gICA+Pj4gbGVuKGMpICAgICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXQgbG9va3VwXG4gICAxMFxuXG5CeXBhc3NpbmcgdGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb24gcHJvdmlkZXNcbnNpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGUgaW50ZXJwcmV0ZXIsIGF0XG50aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBzcGVjaWFsIG1ldGhvZHMgKHRoZVxuc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0IGl0c2VsZiBpbiBvcmRlciB0byBiZVxuY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cbicsCi0gJ3N0cmluZy1tZXRob2RzJzogdSdcblN0cmluZyBNZXRob2RzXG4qKioqKioqKioqKioqKlxuXG5TdHJpbmdzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMsIGFsb25nIHdpdGhcbnRoZSBhZGRpdGlvbmFsIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LlxuXG5TdHJpbmdzIGFsc28gc3VwcG9ydCB0d28gc3R5bGVzIG9mIHN0cmluZyBmb3JtYXR0aW5nLCBvbmUgcHJvdmlkaW5nIGFcbmxhcmdlIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9taXphdGlvbiAoc2VlICJzdHIuZm9ybWF0KCkiLFxuKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBhbmQgKkN1c3RvbSBTdHJpbmcgRm9ybWF0dGluZyopIGFuZCB0aGUgb3RoZXJcbmJhc2VkIG9uIEMgInByaW50ZiIgc3R5bGUgZm9ybWF0dGluZyB0aGF0IGhhbmRsZXMgYSBuYXJyb3dlciByYW5nZSBvZlxudHlwZXMgYW5kIGlzIHNsaWdodGx5IGhhcmRlciB0byB1c2UgY29ycmVjdGx5LCBidXQgaXMgb2Z0ZW4gZmFzdGVyIGZvclxudGhlIGNhc2VzIGl0IGNhbiBoYW5kbGUgKCpwcmludGYtc3R5bGUgU3RyaW5nIEZvcm1hdHRpbmcqKS5cblxuVGhlICpUZXh0IFByb2Nlc3NpbmcgU2VydmljZXMqIHNlY3Rpb24gb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgY292ZXJzXG5hIG51bWJlciBvZiBvdGhlciBtb2R1bGVzIHRoYXQgcHJvdmlkZSB2YXJpb3VzIHRleHQgcmVsYXRlZCB1dGlsaXRpZXNcbihpbmNsdWRpbmcgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQgaW4gdGhlICJyZSIgbW9kdWxlKS5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuc3RyLmNhc2Vmb2xkKClcblxuICAgUmV0dXJuIGEgY2FzZWZvbGRlZCBjb3B5IG9mIHRoZSBzdHJpbmcuIENhc2Vmb2xkZWQgc3RyaW5ncyBtYXkgYmVcbiAgIHVzZWQgZm9yIGNhc2VsZXNzIG1hdGNoaW5nLlxuXG4gICBDYXNlZm9sZGluZyBpcyBzaW1pbGFyIHRvIGxvd2VyY2FzaW5nIGJ1dCBtb3JlIGFnZ3Jlc3NpdmUgYmVjYXVzZVxuICAgaXQgaXMgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCBjYXNlIGRpc3RpbmN0aW9ucyBpbiBhIHN0cmluZy4gRm9yXG4gICBleGFtcGxlLCB0aGUgR2VybWFuIGxvd2VyY2FzZSBsZXR0ZXIgIlwnXHhkZlwnIiBpcyBlcXVpdmFsZW50IHRvICIic3MiIi5cbiAgIFNpbmNlIGl0IGlzIGFscmVhZHkgbG93ZXJjYXNlLCAibG93ZXIoKSIgd291bGQgZG8gbm90aGluZyB0byAiXCdceGRmXCciO1xuICAgImNhc2Vmb2xkKCkiIGNvbnZlcnRzIGl0IHRvICIic3MiIi5cblxuICAgVGhlIGNhc2Vmb2xkaW5nIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZVxuICAgVW5pY29kZSBTdGFuZGFyZC5cblxuICAgTmV3IGluIHZlcnNpb24gMy4zLlxuXG5zdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgaXMgZG9uZVxuICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFuIEFTQ0lJIHNwYWNlKS4gVGhlXG4gICBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICJsZW4ocykiLlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmVuY29kZShlbmNvZGluZz0idXRmLTgiLCBlcnJvcnM9InN0cmljdCIpXG5cbiAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBhIGJ5dGVzIG9iamVjdC4gRGVmYXVsdFxuICAgZW5jb2RpbmcgaXMgIlwndXRmLThcJyIuICplcnJvcnMqIG1heSBiZSBnaXZlbiB0byBzZXQgYSBkaWZmZXJlbnRcbiAgIGVycm9yIGhhbmRsaW5nIHNjaGVtZS4gVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzICJcJ3N0cmljdFwnIixcbiAgIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYSAiVW5pY29kZUVycm9yIi4gT3RoZXIgcG9zc2libGVcbiAgIHZhbHVlcyBhcmUgIlwnaWdub3JlXCciLCAiXCdyZXBsYWNlXCciLCAiXCd4bWxjaGFycmVmcmVwbGFjZVwnIixcbiAgICJcJ2JhY2tzbGFzaHJlcGxhY2VcJyIgYW5kIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgdmlhXG4gICAiY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCkiLCBzZWUgc2VjdGlvbiAqRXJyb3IgSGFuZGxlcnMqLiBGb3IgYSBsaXN0XG4gICBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZSBzZWN0aW9uICpTdGFuZGFyZCBFbmNvZGluZ3MqLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KixcbiAgIG90aGVyd2lzZSByZXR1cm4gIkZhbHNlIi4gICpzdWZmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3VmZml4ZXNcbiAgIHRvIGxvb2sgZm9yLiAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IGJlZ2lubmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cbnN0ci5leHBhbmR0YWJzKHRhYnNpemU9OClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWRcbiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlXG4gICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqIGNoYXJhY3RlcnNcbiAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgYW5kIHNvIG9uKS5cbiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZVxuICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIHRhYiAoIlxcdCIpLCBvbmUgb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCBpbiB0aGUgcmVzdWx0XG4gICB1bnRpbCB0aGUgY3VycmVudCBjb2x1bW4gaXMgZXF1YWwgdG8gdGhlIG5leHQgdGFiIHBvc2l0aW9uLiAoVGhlXG4gICB0YWIgY2hhcmFjdGVyIGl0c2VsZiBpcyBub3QgY29waWVkLikgIElmIHRoZSBjaGFyYWN0ZXIgaXMgYSBuZXdsaW5lXG4gICAoIlxcbiIpIG9yIHJldHVybiAoIlxcciIpLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50IGNvbHVtbiBpc1xuICAgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZCBhbmQgdGhlXG4gICBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgdGhlXG4gICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoKVxuICAgXCcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNFwnXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoNClcbiAgIFwnMDEgIDAxMiAwMTIzICAgIDAxMjM0XCdcblxuc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kIHdpdGhpbiB0aGUgc2xpY2UgInNbc3RhcnQ6ZW5kXSIuICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KlxuICAgYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4gIFJldHVybiAiLTEiIGlmXG4gICAqc3ViKiBpcyBub3QgZm91bmQuXG5cbiAgIE5vdGU6IFRoZSAiZmluZCgpIiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93XG4gICAgIHRoZSBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCxcbiAgICAgdXNlIHRoZSAiaW4iIG9wZXJhdG9yOlxuXG4gICAgICAgID4+PiBcJ1B5XCcgaW4gXCdQeXRob25cJ1xuICAgICAgICBUcnVlXG5cbnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKVxuXG4gICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzXG4gICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHNcbiAgIGRlbGltaXRlZCBieSBicmFjZXMgInt9Ii4gIEVhY2ggcmVwbGFjZW1lbnQgZmllbGQgY29udGFpbnMgZWl0aGVyXG4gICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lIG9mIGFcbiAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGVhY2hcbiAgIHJlcGxhY2VtZW50IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGVcbiAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG5cbiAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4gICBcJ1RoZSBzdW0gb2YgMSArIDIgaXMgM1wnXG5cbiAgIFNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB2YXJpb3VzXG4gICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCBzdHJpbmdzLlxuXG5zdHIuZm9ybWF0X21hcChtYXBwaW5nKVxuXG4gICBTaW1pbGFyIHRvICJzdHIuZm9ybWF0KCoqbWFwcGluZykiLCBleGNlcHQgdGhhdCAibWFwcGluZyIgaXMgdXNlZFxuICAgZGlyZWN0bHkgYW5kIG5vdCBjb3BpZWQgdG8gYSAiZGljdCIuICBUaGlzIGlzIHVzZWZ1bCBpZiBmb3IgZXhhbXBsZVxuICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczpcblxuICAgPj4+IGNsYXNzIERlZmF1bHQoZGljdCk6XG4gICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIGtleVxuICAgLi4uXG4gICA+Pj4gXCd7bmFtZX0gd2FzIGJvcm4gaW4ge2NvdW50cnl9XCcuZm9ybWF0X21hcChEZWZhdWx0KG5hbWU9XCdHdWlkb1wnKSlcbiAgIFwnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeVwnXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxuc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIExpa2UgImZpbmQoKSIsIGJ1dCByYWlzZSAiVmFsdWVFcnJvciIgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSBjaGFyYWN0ZXIgImMiXG4gICBpcyBhbHBoYW51bWVyaWMgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJucyAiVHJ1ZSI6XG4gICAiYy5pc2FscGhhKCkiLCAiYy5pc2RlY2ltYWwoKSIsICJjLmlzZGlnaXQoKSIsIG9yICJjLmlzbnVtZXJpYygpIi5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQWxwaGFiZXRpY1xuICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuICAgZGF0YWJhc2UgYXMgIkxldHRlciIsIGkuZS4sIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSBwcm9wZXJ0eVxuICAgYmVpbmcgb25lIG9mICJMbSIsICJMdCIsICJMdSIsICJMbCIsIG9yICJMbyIuICBOb3RlIHRoYXQgdGhpcyBpc1xuICAgZGlmZmVyZW50IGZyb20gdGhlICJBbHBoYWJldGljIiBwcm9wZXJ0eSBkZWZpbmVkIGluIHRoZSBVbmljb2RlXG4gICBTdGFuZGFyZC5cblxuc3RyLmlzZGVjaW1hbCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRlY2ltYWwgY2hhcmFjdGVyc1xuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gRGVjaW1hbFxuICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgZnJvbSBnZW5lcmFsIGNhdGVnb3J5ICJOZCIuIFRoaXMgY2F0ZWdvcnlcbiAgIGluY2x1ZGVzIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICBmb3JtIGRlY2ltYWwtcmFkaXggbnVtYmVycywgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLlxuXG5zdHIuaXNkaWdpdCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyBhbmQgdGhlcmUgaXNcbiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIERpZ2l0cyBpbmNsdWRlIGRlY2ltYWxcbiAgIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCBhcyB0aGVcbiAgIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgYSBjaGFyYWN0ZXJcbiAgIHRoYXQgaGFzIHRoZSBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQgb3JcbiAgIE51bWVyaWNfVHlwZT1EZWNpbWFsLlxuXG5zdHIuaXNpZGVudGlmaWVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgc2VjdGlvbiAqSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzKi5cblxuICAgVXNlICJrZXl3b3JkLmlza2V5d29yZCgpIiB0byB0ZXN0IGZvciByZXNlcnZlZCBpZGVudGlmaWVycyBzdWNoIGFzXG4gICAiZGVmIiBhbmQgImNsYXNzIi5cblxuc3RyLmlzbG93ZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgbG93ZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuaXNudW1lcmljKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgbnVtZXJpYyBjaGFyYWN0ZXJzLFxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gTnVtZXJpY1xuICAgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGhhdmVcbiAgIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksIGUuZy4gVSsyMTU1LCBWVUxHQVIgRlJBQ1RJT05cbiAgIE9ORSBGSUZUSC4gIEZvcm1hbGx5LCBudW1lcmljIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggdGhlXG4gICBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQsIE51bWVyaWNfVHlwZT1EZWNpbWFsIG9yXG4gICBOdW1lcmljX1R5cGU9TnVtZXJpYy5cblxuc3RyLmlzcHJpbnRhYmxlKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgcHJpbnRhYmxlIG9yIHRoZVxuICAgc3RyaW5nIGlzIGVtcHR5LCBmYWxzZSBvdGhlcndpc2UuICBOb25wcmludGFibGUgY2hhcmFjdGVycyBhcmVcbiAgIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UgYXNcbiAgICJPdGhlciIgb3IgIlNlcGFyYXRvciIsIGV4Y2VwdGluZyB0aGUgQVNDSUkgc3BhY2UgKDB4MjApIHdoaWNoIGlzXG4gICBjb25zaWRlcmVkIHByaW50YWJsZS4gIChOb3RlIHRoYXQgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4gdGhpc1xuICAgY29udGV4dCBhcmUgdGhvc2Ugd2hpY2ggc2hvdWxkIG5vdCBiZSBlc2NhcGVkIHdoZW4gInJlcHIoKSIgaXNcbiAgIGludm9rZWQgb24gYSBzdHJpbmcuICBJdCBoYXMgbm8gYmVhcmluZyBvbiB0aGUgaGFuZGxpbmcgb2Ygc3RyaW5nc1xuICAgd3JpdHRlbiB0byAic3lzLnN0ZG91dCIgb3IgInN5cy5zdGRlcnIiLilcblxuc3RyLmlzc3BhY2UoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZ1xuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIFdoaXRlc3BhY2VcbiAgIGNoYXJhY3RlcnMgIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyXG4gICBkYXRhYmFzZSBhcyAiT3RoZXIiIG9yICJTZXBhcmF0b3IiIGFuZCB0aG9zZSB3aXRoIGJpZGlyZWN0aW9uYWxcbiAgIHByb3BlcnR5IGJlaW5nIG9uZSBvZiAiV1MiLCAiQiIsIG9yICJTIi5cblxuc3RyLmlzdGl0bGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0XG4gICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxuICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlxuICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG5zdHIuam9pbihpdGVyYWJsZSlcblxuICAgUmV0dXJuIGEgc3RyaW5nIHdoaWNoIGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBzdHJpbmdzIGluIHRoZVxuICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgQSAiVHlwZUVycm9yIiB3aWxsIGJlIHJhaXNlZCBpZiB0aGVyZSBhcmVcbiAgIGFueSBub24tc3RyaW5nIHZhbHVlcyBpbiAqaXRlcmFibGUqLCBpbmNsdWRpbmcgImJ5dGVzIiBvYmplY3RzLlxuICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIGlzIHRoZSBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLlxuXG5zdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byAibGVuKHMpIi5cblxuc3RyLmxvd2VyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cblxuICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG5zdHIubHN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlXG4gICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICAgICBcJ3NwYWNpb3VzICAgXCdcbiAgICAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgICAgXCdleGFtcGxlLmNvbVwnXG5cbnN0YXRpYyBzdHIubWFrZXRyYW5zKHhbLCB5Wywgel1dKVxuXG4gICBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIHRyYW5zbGF0aW9uIHRhYmxlIHVzYWJsZSBmb3JcbiAgICJzdHIudHJhbnNsYXRlKCkiLlxuXG4gICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgbWFwcGluZ1xuICAgVW5pY29kZSBvcmRpbmFscyAoaW50ZWdlcnMpIG9yIGNoYXJhY3RlcnMgKHN0cmluZ3Mgb2YgbGVuZ3RoIDEpIHRvXG4gICBVbmljb2RlIG9yZGluYWxzLCBzdHJpbmdzIChvZiBhcmJpdHJhcnkgbGVuZ3Rocykgb3IgTm9uZS5cbiAgIENoYXJhY3RlciBrZXlzIHdpbGwgdGhlbiBiZSBjb252ZXJ0ZWQgdG8gb3JkaW5hbHMuXG5cbiAgIElmIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzLCB0aGV5IG11c3QgYmUgc3RyaW5ncyBvZiBlcXVhbCBsZW5ndGgsXG4gICBhbmQgaW4gdGhlIHJlc3VsdGluZyBkaWN0aW9uYXJ5LCBlYWNoIGNoYXJhY3RlciBpbiB4IHdpbGwgYmUgbWFwcGVkXG4gICB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHkuICBJZiB0aGVyZSBpcyBhIHRoaXJkXG4gICBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hvc2UgY2hhcmFjdGVycyB3aWxsIGJlIG1hcHBlZCB0b1xuICAgTm9uZSBpbiB0aGUgcmVzdWx0LlxuXG5zdHIucGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnlcbiAgIHR3byBlbXB0eSBzdHJpbmdzLlxuXG5zdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqb2xkKlxuICAgcmVwbGFjZWQgYnkgKm5ldyouICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgKmNvdW50KiBpcyBnaXZlbiwgb25seVxuICAgdGhlIGZpcnN0ICpjb3VudCogb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLlxuXG5zdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gInNbc3RhcnQ6ZW5kXSIuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiAiLTEiIG9uIGZhaWx1cmUuXG5cbnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSAicmZpbmQoKSIgYnV0IHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byAibGVuKHMpIi5cblxuc3RyLnJwYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5XG4gICB0aGUgc3RyaW5nIGl0c2VsZi5cblxuc3RyLnJzcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgIk5vbmUiLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgZm9yIHNwbGl0dGluZ1xuICAgZnJvbSB0aGUgcmlnaHQsICJyc3BsaXQoKSIgYmVoYXZlcyBsaWtlICJzcGxpdCgpIiB3aGljaCBpc1xuICAgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuc3RyLnJzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG9cbiAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSBzdWZmaXg7IHJhdGhlcixcbiAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcucnN0cmlwKClcbiAgICAgIFwnICAgc3BhY2lvdXNcJ1xuICAgICAgPj4+IFwnbWlzc2lzc2lwcGlcJy5yc3RyaXAoXCdpcHpcJylcbiAgICAgIFwnbWlzc2lzc1wnXG5cbnN0ci5zcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCAibWF4c3BsaXQrMSJcbiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciAiLTEiLCB0aGVuIHRoZXJlIGlzXG4gICBubyBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNwbGl0cyAoYWxsIHBvc3NpYmxlIHNwbGl0cyBhcmUgbWFkZSkuXG5cbiAgIElmICpzZXAqIGlzIGdpdmVuLCBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzIGFyZSBub3QgZ3JvdXBlZCB0b2dldGhlclxuICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbiAgICJcJzEsLDJcJy5zcGxpdChcJyxcJykiIHJldHVybnMgIltcJzFcJywgXCdcJywgXCcyXCddIikuICBUaGUgKnNlcCogYXJndW1lbnRcbiAgIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgIlwnMTw+Mjw+M1wnLnNwbGl0KFwnPD5cJykiIHJldHVybnMgIltcJzFcJywgXCcyXCcsIFwnM1wnXSIpLiBTcGxpdHRpbmcgYW5cbiAgIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zICJbXCdcJ10iLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnMSwyLDNcJy5zcGxpdChcJyxcJylcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuICAgICAgPj4+IFwnMSwyLDNcJy5zcGxpdChcJyxcJywgbWF4c3BsaXQ9MSlcbiAgICAgIFtcJzFcJywgXCcyLDNcJ11cbiAgICAgID4+PiBcJzEsMiwsMyxcJy5zcGxpdChcJyxcJylcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnXCcsIFwnM1wnLCBcJ1wnXVxuXG4gICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiwgYSBkaWZmZXJlbnQgc3BsaXR0aW5nXG4gICBhbGdvcml0aG0gaXMgYXBwbGllZDogcnVucyBvZiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGFyZSByZWdhcmRlZFxuICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gZW1wdHkgc3RyaW5nc1xuICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yIHRyYWlsaW5nXG4gICB3aGl0ZXNwYWNlLiAgQ29uc2VxdWVudGx5LCBzcGxpdHRpbmcgYW4gZW1wdHkgc3RyaW5nIG9yIGEgc3RyaW5nXG4gICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgIk5vbmUiIHNlcGFyYXRvciByZXR1cm5zICJbXSIuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCcxIDIgM1wnLnNwbGl0KClcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuICAgICAgPj4+IFwnMSAyIDNcJy5zcGxpdChtYXhzcGxpdD0xKVxuICAgICAgW1wnMVwnLCBcJzIgM1wnXVxuICAgICAgPj4+IFwnICAgMSAgIDIgICAzICAgXCcuc3BsaXQoKVxuICAgICAgW1wnMVwnLCBcJzJcJywgXCczXCddXG5cbnN0ci5zcGxpdGxpbmVzKFtrZWVwZW5kc10pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0IGxpbmVcbiAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbiAgIFRoaXMgbWV0aG9kIHNwbGl0cyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgYm91bmRhcmllcy4gIEluXG4gICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsIG5ld2xpbmVzKi5cblxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgUmVwcmVzZW50YXRpb24gICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXFxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lIEZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxyXFxuIiAgICAgICAgICAgICAgICAgIHwgQ2FycmlhZ2UgUmV0dXJuICsgTGluZSBGZWVkICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdiIgb3IgIlxceDBiIiAgICAgICAgICB8IExpbmUgVGFidWxhdGlvbiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXGYiIG9yICJcXHgwYyIgICAgICAgICAgfCBGb3JtIEZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWMiICAgICAgICAgICAgICAgICAgfCBGaWxlIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCBTZXBhcmF0b3IgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgU2VwYXJhdG9yICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx4ODUiICAgICAgICAgICAgICAgICAgfCBOZXh0IExpbmUgKEMxIENvbnRyb2wgQ29kZSkgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lIFNlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggU2VwYXJhdG9yICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXFx2IiBhbmQgIlxcZiIgYWRkZWQgdG8gbGlzdCBvZiBsaW5lXG4gICBib3VuZGFyaWVzLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKClcbiAgICAgIFtcJ2FiIGNcJywgXCdcJywgXCdkZSBmZ1wnLCBcJ2tsXCddXG4gICAgICA+Pj4gXCdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcblwnLnNwbGl0bGluZXMoa2VlcGVuZHM9VHJ1ZSlcbiAgICAgIFtcJ2FiIGNcXG5cJywgXCdcXG5cJywgXCdkZSBmZ1xcclwnLCBcJ2tsXFxyXFxuXCddXG5cbiAgIFVubGlrZSAic3BsaXQoKSIgd2hlbiBhIGRlbGltaXRlciBzdHJpbmcgKnNlcCogaXMgZ2l2ZW4sIHRoaXNcbiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsXG4gICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lOlxuXG4gICAgICA+Pj4gIiIuc3BsaXRsaW5lcygpXG4gICAgICBbXVxuICAgICAgPj4+ICJPbmUgbGluZVxcbiIuc3BsaXRsaW5lcygpXG4gICAgICBbXCdPbmUgbGluZVwnXVxuXG4gICBGb3IgY29tcGFyaXNvbiwgInNwbGl0KFwnXFxuXCcpIiBnaXZlczpcblxuICAgICAgPj4+IFwnXCcuc3BsaXQoXCdcXG5cJylcbiAgICAgIFtcJ1wnXVxuICAgICAgPj4+IFwnVHdvIGxpbmVzXFxuXCcuc3BsaXQoXCdcXG5cJylcbiAgICAgIFtcJ1R3byBsaW5lc1wnLCBcJ1wnXVxuXG5zdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gIlRydWUiIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZSByZXR1cm5cbiAgICJGYWxzZSIuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gbG9vayBmb3IuXG4gICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuICAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgc3RyaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cbnN0ci5zdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmdcbiAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlbW92ZWQuIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKlxuICAgYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycyogYXJndW1lbnQgaXNcbiAgIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZVxuICAgc3RyaXBwZWQ6XG5cbiAgICAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcuc3RyaXAoKVxuICAgICAgXCdzcGFjaW91c1wnXG4gICAgICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5zdHJpcChcJ2Ntb3d6LlwnKVxuICAgICAgXCdleGFtcGxlXCdcblxuICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50IHZhbHVlcyBhcmVcbiAgIHN0cmlwcGVkIGZyb20gdGhlIHN0cmluZy4gQ2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBsZWFkaW5nXG4gICBlbmQgdW50aWwgcmVhY2hpbmcgYSBzdHJpbmcgY2hhcmFjdGVyIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiB0aGVcbiAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgcGxhY2Ugb24gdGhlXG4gICB0cmFpbGluZyBlbmQuIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gY29tbWVudF9zdHJpbmcgPSBcJyMuLi4uLi4uIFNlY3Rpb24gMy4yLjEgSXNzdWUgIzMyIC4uLi4uLi5cJ1xuICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nLnN0cmlwKFwnLiMhIFwnKVxuICAgICAgXCdTZWN0aW9uIDMuMi4xIElzc3VlICMzMlwnXG5cbnN0ci5zd2FwY2FzZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0b1xuICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLiBOb3RlIHRoYXQgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUgdGhhdFxuICAgInMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpID09IHMiLlxuXG5zdHIudGl0bGUoKVxuXG4gICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuXG4gICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJ0hlbGxvIHdvcmxkXCcudGl0bGUoKVxuICAgICAgXCdIZWxsbyBXb3JsZFwnXG5cbiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGFcbiAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiB3b3JrcyBpblxuICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kXG4gICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZFxuICAgcmVzdWx0OlxuXG4gICAgICA+Pj4gInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKVxuICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcblxuICAgQSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgcmVndWxhclxuICAgZXhwcmVzc2lvbnM6XG5cbiAgICAgID4+PiBpbXBvcnQgcmVcbiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKFwnW0EtWmEtel0rKT8iLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuICAgICAgLi4uXG4gICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbiAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuXG5zdHIudHJhbnNsYXRlKHRhYmxlKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgaW4gd2hpY2ggZWFjaCBjaGFyYWN0ZXIgaGFzIGJlZW4gbWFwcGVkXG4gICB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGJlIGFuIG9iamVjdFxuICAgdGhhdCBpbXBsZW1lbnRzIGluZGV4aW5nIHZpYSAiX19nZXRpdGVtX18oKSIsIHR5cGljYWxseSBhICptYXBwaW5nKlxuICAgb3IgKnNlcXVlbmNlKi4gIFdoZW4gaW5kZXhlZCBieSBhIFVuaWNvZGUgb3JkaW5hbCAoYW4gaW50ZWdlciksIHRoZVxuICAgdGFibGUgb2JqZWN0IGNhbiBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzogcmV0dXJuIGEgVW5pY29kZSBvcmRpbmFsXG4gICBvciBhIHN0cmluZywgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgY2hhcmFjdGVycztcbiAgIHJldHVybiAiTm9uZSIsIHRvIGRlbGV0ZSB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHJldHVybiBzdHJpbmc7IG9yXG4gICByYWlzZSBhICJMb29rdXBFcnJvciIgZXhjZXB0aW9uLCB0byBtYXAgdGhlIGNoYXJhY3RlciB0byBpdHNlbGYuXG5cbiAgIFlvdSBjYW4gdXNlICJzdHIubWFrZXRyYW5zKCkiIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uIG1hcCBmcm9tXG4gICBjaGFyYWN0ZXItdG8tY2hhcmFjdGVyIG1hcHBpbmdzIGluIGRpZmZlcmVudCBmb3JtYXRzLlxuXG4gICBTZWUgYWxzbyB0aGUgImNvZGVjcyIgbW9kdWxlIGZvciBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggdG8gY3VzdG9tXG4gICBjaGFyYWN0ZXIgbWFwcGluZ3MuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgInN0ci51cHBlcigpLmlzdXBwZXIoKSIgbWlnaHQgYmVcbiAgICJGYWxzZSIgaWYgInMiIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgb2YgdGhlXG4gICBVbmljb2RlIFN0YW5kYXJkLlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICJcJzBcJyIgZGlnaXRzIHRvXG4gICBtYWtlIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBBIGxlYWRpbmcgc2lnbiBwcmVmaXhcbiAgICgiXCcrXCciLyJcJy1cJyIpIGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nIHRoZSBwYWRkaW5nICphZnRlciogdGhlIHNpZ25cbiAgIGNoYXJhY3RlciByYXRoZXIgdGhhbiBiZWZvcmUuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWZcbiAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+ICI0MiIuemZpbGwoNSlcbiAgICAgIFwnMDAwNDJcJ1xuICAgICAgPj4+ICItNDIiLnpmaWxsKDUpXG4gICAgICBcJy0wMDQyXCdcbicsCi0gJ3N0cmluZ3MnOiB1J1xuU3RyaW5nIGFuZCBCeXRlcyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5TdHJpbmcgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIHN0cmluZ2xpdGVyYWwgICA6Oj0gW3N0cmluZ3ByZWZpeF0oc2hvcnRzdHJpbmcgfCBsb25nc3RyaW5nKVxuICAgc3RyaW5ncHJlZml4ICAgIDo6PSAiciIgfCAidSIgfCAiUiIgfCAiVSJcbiAgIHNob3J0c3RyaW5nICAgICA6Oj0gIlwnIiBzaG9ydHN0cmluZ2l0ZW0qICJcJyIgfCBcJyJcJyBzaG9ydHN0cmluZ2l0ZW0qIFwnIlwnXG4gICBsb25nc3RyaW5nICAgICAgOjo9ICJcJ1wnXCciIGxvbmdzdHJpbmdpdGVtKiAiXCdcJ1wnIiB8IFwnIiIiXCcgbG9uZ3N0cmluZ2l0ZW0qIFwnIiIiXCdcbiAgIHNob3J0c3RyaW5naXRlbSA6Oj0gc2hvcnRzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4gICBsb25nc3RyaW5naXRlbSAgOjo9IGxvbmdzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4gICBzaG9ydHN0cmluZ2NoYXIgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciBuZXdsaW5lIG9yIHRoZSBxdW90ZT5cbiAgIGxvbmdzdHJpbmdjaGFyICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuICAgc3RyaW5nZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgc291cmNlIGNoYXJhY3Rlcj5cblxuICAgYnl0ZXNsaXRlcmFsICAgOjo9IGJ5dGVzcHJlZml4KHNob3J0Ynl0ZXMgfCBsb25nYnl0ZXMpXG4gICBieXRlc3ByZWZpeCAgICA6Oj0gImIiIHwgIkIiIHwgImJyIiB8ICJCciIgfCAiYlIiIHwgIkJSIiB8ICJyYiIgfCAickIiIHwgIlJiIiB8ICJSQiJcbiAgIHNob3J0Ynl0ZXMgICAgIDo6PSAiXCciIHNob3J0Ynl0ZXNpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRieXRlc2l0ZW0qIFwnIlwnXG4gICBsb25nYnl0ZXMgICAgICA6Oj0gIlwnXCdcJyIgbG9uZ2J5dGVzaXRlbSogIlwnXCdcJyIgfCBcJyIiIlwnIGxvbmdieXRlc2l0ZW0qIFwnIiIiXCdcbiAgIHNob3J0Ynl0ZXNpdGVtIDo6PSBzaG9ydGJ5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4gICBsb25nYnl0ZXNpdGVtICA6Oj0gbG9uZ2J5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4gICBzaG9ydGJ5dGVzY2hhciA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+XG4gICBsb25nYnl0ZXNjaGFyICA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBieXRlc2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj5cblxuT25lIHN5bnRhY3RpYyByZXN0cmljdGlvbiBub3QgaW5kaWNhdGVkIGJ5IHRoZXNlIHByb2R1Y3Rpb25zIGlzIHRoYXRcbndoaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgInN0cmluZ3ByZWZpeCIgb3IgImJ5dGVzcHJlZml4IlxuYW5kIHRoZSByZXN0IG9mIHRoZSBsaXRlcmFsLiBUaGUgc291cmNlIGNoYXJhY3RlciBzZXQgaXMgZGVmaW5lZCBieVxudGhlIGVuY29kaW5nIGRlY2xhcmF0aW9uOyBpdCBpcyBVVEYtOCBpZiBubyBlbmNvZGluZyBkZWNsYXJhdGlvbiBpc1xuZ2l2ZW4gaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiAqRW5jb2RpbmcgZGVjbGFyYXRpb25zKi5cblxuSW4gcGxhaW4gRW5nbGlzaDogQm90aCB0eXBlcyBvZiBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gbWF0Y2hpbmdcbnNpbmdsZSBxdW90ZXMgKCJcJyIpIG9yIGRvdWJsZSBxdW90ZXMgKCIiIikuICBUaGV5IGNhbiBhbHNvIGJlIGVuY2xvc2VkXG5pbiBtYXRjaGluZyBncm91cHMgb2YgdGhyZWUgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKHRoZXNlIGFyZVxuZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSBiYWNrc2xhc2hcbigiXFwiKSBjaGFyYWN0ZXIgaXMgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG90aGVyd2lzZSBoYXZlIGFcbnNwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGVcbmNoYXJhY3Rlci5cblxuQnl0ZXMgbGl0ZXJhbHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoICJcJ2JcJyIgb3IgIlwnQlwnIjsgdGhleSBwcm9kdWNlXG5hbiBpbnN0YW5jZSBvZiB0aGUgImJ5dGVzIiB0eXBlIGluc3RlYWQgb2YgdGhlICJzdHIiIHR5cGUuICBUaGV5IG1heVxub25seSBjb250YWluIEFTQ0lJIGNoYXJhY3RlcnM7IGJ5dGVzIHdpdGggYSBudW1lcmljIHZhbHVlIG9mIDEyOCBvclxuZ3JlYXRlciBtdXN0IGJlIGV4cHJlc3NlZCB3aXRoIGVzY2FwZXMuXG5cbkFzIG9mIFB5dGhvbiAzLjMgaXQgaXMgcG9zc2libGUgYWdhaW4gdG8gcHJlZml4IHN0cmluZyBsaXRlcmFscyB3aXRoIGFcbiJ1IiBwcmVmaXggdG8gc2ltcGxpZnkgbWFpbnRlbmFuY2Ugb2YgZHVhbCAyLnggYW5kIDMueCBjb2RlYmFzZXMuXG5cbkJvdGggc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGFcbmxldHRlciAiXCdyXCciIG9yICJcJ1JcJyI7IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkICpyYXcgc3RyaW5ncyogYW5kIHRyZWF0XG5iYWNrc2xhc2hlcyBhcyBsaXRlcmFsIGNoYXJhY3RlcnMuICBBcyBhIHJlc3VsdCwgaW4gc3RyaW5nIGxpdGVyYWxzLFxuIlwnXFxVXCciIGFuZCAiXCdcXHVcJyIgZXNjYXBlcyBpbiByYXcgc3RyaW5ncyBhcmUgbm90IHRyZWF0ZWQgc3BlY2lhbGx5LlxuR2l2ZW4gdGhhdCBQeXRob24gMi54XCdzIHJhdyB1bmljb2RlIGxpdGVyYWxzIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGFuXG5QeXRob24gMy54XCdzIHRoZSAiXCd1clwnIiBzeW50YXggaXMgbm90IHN1cHBvcnRlZC5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgIlwncmJcJyIgcHJlZml4IG9mIHJhdyBieXRlcyBsaXRlcmFscyBoYXMgYmVlblxuYWRkZWQgYXMgYSBzeW5vbnltIG9mICJcJ2JyXCciLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIHRoZSB1bmljb2RlIGxlZ2FjeSBsaXRlcmFsXG4oInVcJ3ZhbHVlXCciKSB3YXMgcmVpbnRyb2R1Y2VkIHRvIHNpbXBsaWZ5IHRoZSBtYWludGVuYW5jZSBvZiBkdWFsXG5QeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLiBTZWUgKipQRVAgNDE0KiogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbkluIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbHMsIHVuZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGVzIGFyZSBhbGxvd2VkXG4oYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3dcbnRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gdGhlXG5saXRlcmFsLCBpLmUuIGVpdGhlciAiXCciIG9yICIiIi4pXG5cblVubGVzcyBhbiAiXCdyXCciIG9yICJcJ1JcJyIgcHJlZml4IGlzIHByZXNlbnQsIGVzY2FwZSBzZXF1ZW5jZXMgaW4gc3RyaW5nXG5hbmQgYnl0ZXMgbGl0ZXJhbHMgYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byBydWxlcyBzaW1pbGFyIHRvIHRob3NlXG51c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCAiXFxuZXdsaW5lIiAgICAgICAgfCBCYWNrc2xhc2ggYW5kIG5ld2xpbmUgaWdub3JlZCAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcXFwiICAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoIlxcIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcXCciICAgICAgICAgICAgICB8IFNpbmdsZSBxdW90ZSAoIlwnIikgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcIiIgICAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlICgiIiIpICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXGEiICAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxiIiAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcZiIgICAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXG4iICAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxyIiAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcdCIgICAgICAgICAgICAgIHwgQVNDSUkgSG9yaXpvbnRhbCBUYWIgKFRBQikgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHYiICAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxvb28iICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMSwzKSAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxceGhoIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgKDIsMykgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG5cbkVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgIlxcTntuYW1lfSIgICAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgKDQpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHV4eHh4IiAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIDE2LWJpdCBoZXggdmFsdWUgICB8ICg1KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxVeHh4eHh4eHgiICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAzMi1iaXQgaGV4IHZhbHVlICAgfCAoNikgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCAqeHh4eHh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuXG5cbjIuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cblxuMy4gSW4gYSBieXRlcyBsaXRlcmFsLCBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgZXNjYXBlcyBkZW5vdGUgdGhlXG4gICBieXRlIHdpdGggdGhlIGdpdmVuIHZhbHVlLiBJbiBhIHN0cmluZyBsaXRlcmFsLCB0aGVzZSBlc2NhcGVzXG4gICBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblxuNC4gQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgbmFtZSBhbGlhc2VzIFsxXSBoYXMgYmVlblxuICAgYWRkZWQuXG5cbjUuIEV4YWN0bHkgZm91ciBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cblxuNi4gQW55IFVuaWNvZGUgY2hhcmFjdGVyIGNhbiBiZSBlbmNvZGVkIHRoaXMgd2F5LiAgRXhhY3RseSBlaWdodFxuICAgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cblVubGlrZSBTdGFuZGFyZCBDLCBhbGwgdW5yZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGxlZnQgaW4gdGhlXG5zdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSByZXN1bHQqLiAgKFRoaXNcbmJlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzIG1pc3R5cGVkLFxudGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgbW9yZSBlYXNpbHkgcmVjb2duaXplZCBhcyBicm9rZW4uKSAgSXQgaXMgYWxzb1xuaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gc3RyaW5nXG5saXRlcmFscyBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciBieXRlc1xubGl0ZXJhbHMuXG5cbkV2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGVcbmJhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCAiciJcXCIiIiBpcyBhIHZhbGlkXG5zdHJpbmcgbGl0ZXJhbCBjb25zaXN0aW5nIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBkb3VibGVcbnF1b3RlOyAiciJcXCIiIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIChldmVuIGEgcmF3IHN0cmluZyBjYW5ub3RcbmVuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3IGxpdGVyYWxcbmNhbm5vdCBlbmQgaW4gYSBzaW5nbGUgYmFja3NsYXNoKiAoc2luY2UgdGhlIGJhY2tzbGFzaCB3b3VsZCBlc2NhcGVcbnRoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlIGJhY2tzbGFzaFxuZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzIGFzIHBhcnRcbm9mIHRoZSBsaXRlcmFsLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLlxuJywKLSAnc3Vic2NyaXB0aW9ucyc6IHUnXG5TdWJzY3JpcHRpb25zXG4qKioqKioqKioqKioqXG5cbkEgc3Vic2NyaXB0aW9uIHNlbGVjdHMgYW4gaXRlbSBvZiBhIHNlcXVlbmNlIChzdHJpbmcsIHR1cGxlIG9yIGxpc3QpXG5vciBtYXBwaW5nIChkaWN0aW9uYXJ5KSBvYmplY3Q6XG5cbiAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCB0aGF0IHN1cHBvcnRzIHN1YnNjcmlwdGlvblxuKGxpc3RzIG9yIGRpY3Rpb25hcmllcyBmb3IgZXhhbXBsZSkuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gc3VwcG9ydFxuc3Vic2NyaXB0aW9uIGJ5IGRlZmluaW5nIGEgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxuRm9yIGJ1aWx0LWluIG9iamVjdHMsIHRoZXJlIGFyZSB0d28gdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IHN1cHBvcnRcbnN1YnNjcmlwdGlvbjpcblxuSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgZXZhbHVhdGUgdG8gYW5cbm9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcsIGFuZCB0aGVcbnN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXRcbmtleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyBleGFjdGx5IG9uZVxuaXRlbS4pXG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0IGV2YWx1YXRlIHRvXG5hbiBpbnRlZ2VyIG9yIGEgc2xpY2UgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24pLlxuXG5UaGUgZm9ybWFsIHN5bnRheCBtYWtlcyBubyBzcGVjaWFsIHByb3Zpc2lvbiBmb3IgbmVnYXRpdmUgaW5kaWNlcyBpblxuc2VxdWVuY2VzOyBob3dldmVyLCBidWlsdC1pbiBzZXF1ZW5jZXMgYWxsIHByb3ZpZGUgYSAiX19nZXRpdGVtX18oKSJcbm1ldGhvZCB0aGF0IGludGVycHJldHMgbmVnYXRpdmUgaW5kaWNlcyBieSBhZGRpbmcgdGhlIGxlbmd0aCBvZiB0aGVcbnNlcXVlbmNlIHRvIHRoZSBpbmRleCAoc28gdGhhdCAieFstMV0iIHNlbGVjdHMgdGhlIGxhc3QgaXRlbSBvZiAieCIpLlxuVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgbm9ubmVnYXRpdmUgaW50ZWdlciBsZXNzIHRoYW4gdGhlIG51bWJlclxub2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSBpdGVtIHdob3NlXG5pbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLiBTaW5jZSB0aGUgc3VwcG9ydCBmb3Jcbm5lZ2F0aXZlIGluZGljZXMgYW5kIHNsaWNpbmcgb2NjdXJzIGluIHRoZSBvYmplY3RcJ3MgIl9fZ2V0aXRlbV9fKCkiXG5tZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBhZGRcbnRoYXQgc3VwcG9ydC5cblxuQSBzdHJpbmdcJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhXG50eXBlIGJ1dCBhIHN0cmluZyBvZiBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuXG4nLAotICd0cnV0aCc6IHUnXG5UcnV0aCBWYWx1ZSBUZXN0aW5nXG4qKioqKioqKioqKioqKioqKioqXG5cbkFueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gImlmIiBvclxuIndoaWxlIiBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LiBUaGVcbmZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG5cbiogIk5vbmUiXG5cbiogIkZhbHNlIlxuXG4qIHplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsICIwIiwgIjAuMCIsICIwaiIuXG5cbiogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgIlwnXCciLCAiKCkiLCAiW10iLlxuXG4qIGFueSBlbXB0eSBtYXBwaW5nLCBmb3IgZXhhbXBsZSwgInt9Ii5cblxuKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbiAgIl9fYm9vbF9fKCkiIG9yICJfX2xlbl9fKCkiIG1ldGhvZCwgd2hlbiB0aGF0IG1ldGhvZCByZXR1cm5zIHRoZVxuICBpbnRlZ2VyIHplcm8gb3IgImJvb2wiIHZhbHVlICJGYWxzZSIuIFsxXVxuXG5BbGwgb3RoZXIgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRydWUgLS0tIHNvIG9iamVjdHMgb2YgbWFueSB0eXBlcyBhcmVcbmFsd2F5cyB0cnVlLlxuXG5PcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgYWx3YXlzXG5yZXR1cm4gIjAiIG9yICJGYWxzZSIgZm9yIGZhbHNlIGFuZCAiMSIgb3IgIlRydWUiIGZvciB0cnVlLCB1bmxlc3Ncbm90aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zICJvciJcbmFuZCAiYW5kIiBhbHdheXMgcmV0dXJuIG9uZSBvZiB0aGVpciBvcGVyYW5kcy4pXG4nLAotICd0cnknOiB1J1xuVGhlICJ0cnkiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5UaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vXG5leGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuXG5leGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCBjbGF1c2VzXG5pbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuIGV4cHJlc3Npb24tXG5sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbmV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG5pcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG53aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb25cbm9iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgcmFpc2VkXG50aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZlxucHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzXG5yZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC5cbihUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLFxuYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbm91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICBmb29cblxud2FzIHRyYW5zbGF0ZWQgdG9cblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIGZvb1xuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIGRlbCBOXG5cblRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG5iZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbmN5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxudW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgdmlhXG4ic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlXG5leGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG5wcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbnJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxubm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuXG5JZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAidHJ5IlxuY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuXG5leGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmXG50aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICJmaW5hbGx5IlxuY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbmlzIGRpc2NhcmRlZDpcblxuICAgPj4+IGRlZiBmKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIDEvMFxuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4gICAuLi5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cblxuV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzXG5hbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsIGluXG50aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cblRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbiJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSB0aGVcbmxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuJywKLSAndHlwZXMnOiB1J1xuVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gIEV4dGVuc2lvblxubW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcblB5dGhvbiBtYXkgYWRkIHR5cGVzIHRvIHRoZSB0eXBlIGhpZXJhcmNoeSAoZS5nLiwgcmF0aW9uYWwgbnVtYmVycyxcbmVmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLCBhbHRob3VnaCBzdWNoIGFkZGl0aW9uc1xud2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC5cblxuU29tZSBvZiB0aGUgdHlwZSBkZXNjcmlwdGlvbnMgYmVsb3cgY29udGFpbiBhIHBhcmFncmFwaCBsaXN0aW5nXG5cJ3NwZWNpYWwgYXR0cmlidXRlcy5cJyAgVGhlc2UgYXJlIGF0dHJpYnV0ZXMgdGhhdCBwcm92aWRlIGFjY2VzcyB0byB0aGVcbmltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyIGRlZmluaXRpb25cbm1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cblxuTm9uZVxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lICJOb25lIi4gSXRcbiAgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucywgZS5nLixcbiAgIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuXG4gICBhbnl0aGluZy4gSXRzIHRydXRoIHZhbHVlIGlzIGZhbHNlLlxuXG5Ob3RJbXBsZW1lbnRlZFxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4gICAiTm90SW1wbGVtZW50ZWQiLiBOdW1lcmljIG1ldGhvZHMgYW5kIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzXG4gICBzaG91bGQgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yXG4gICB0aGUgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlXG4gICByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlXG4gICBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuICAgU2VlICpJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyogZm9yIG1vcmUgZGV0YWlscy5cblxuRWxsaXBzaXNcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCAiLi4uIiBvciB0aGVcbiAgIGJ1aWx0LWluIG5hbWUgIkVsbGlwc2lzIi4gIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG4ibnVtYmVycy5OdW1iZXIiXG4gICBUaGVzZSBhcmUgY3JlYXRlZCBieSBudW1lcmljIGxpdGVyYWxzIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzIGJ5XG4gICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICBOdW1lcmljXG4gICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuICAgbnVtYmVycywgYnV0IHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIG9mIG51bWVyaWNhbCByZXByZXNlbnRhdGlvblxuICAgaW4gY29tcHV0ZXJzLlxuXG4gICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmRcbiAgIGNvbXBsZXggbnVtYmVyczpcblxuICAgIm51bWJlcnMuSW50ZWdyYWwiXG4gICAgICBUaGVzZSByZXByZXNlbnQgZWxlbWVudHMgZnJvbSB0aGUgbWF0aGVtYXRpY2FsIHNldCBvZiBpbnRlZ2Vyc1xuICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG5cbiAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6XG5cbiAgICAgIEludGVnZXJzICgiaW50IilcblxuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4gICAgICAgICBhdmFpbGFibGUgKHZpcnR1YWwpIG1lbW9yeSBvbmx5LiAgRm9yIHRoZSBwdXJwb3NlIG9mIHNoaWZ0XG4gICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCBhbmRcbiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyXCdzXG4gICAgICAgICBjb21wbGVtZW50IHdoaWNoIGdpdmVzIHRoZSBpbGx1c2lvbiBvZiBhbiBpbmZpbml0ZSBzdHJpbmcgb2ZcbiAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG5cbiAgICAgIEJvb2xlYW5zICgiYm9vbCIpXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbiAgICAgICAgIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSB0aGVcbiAgICAgICAgIG9ubHkgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGVcbiAgICAgICAgIGludGVnZXIgdHlwZSwgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCBhbmRcbiAgICAgICAgIDEsIHJlc3BlY3RpdmVseSwgaW4gYWxtb3N0IGFsbCBjb250ZXh0cywgdGhlIGV4Y2VwdGlvbiBiZWluZ1xuICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgIiJGYWxzZSIiIG9yXG4gICAgICAgICAiIlRydWUiIiBhcmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlIHRoZVxuICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2Vycy5cblxuICAgIm51bWJlcnMuUmVhbCIgKCJmbG9hdCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50XG4gICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4gICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbiAgICAgIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4gUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLVxuICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciBhbmRcbiAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGFyZVxuICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlIGlzXG4gICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmdcbiAgICAgIHBvaW50IG51bWJlcnMuXG5cbiAgICJudW1iZXJzLkNvbXBsZXgiICgiY29tcGxleCIpXG4gICAgICBUaGVzZSByZXByZXNlbnQgY29tcGxleCBudW1iZXJzIGFzIGEgcGFpciBvZiBtYWNoaW5lLWxldmVsXG4gICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzIGFwcGx5XG4gICAgICBhcyBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhXG4gICAgICBjb21wbGV4IG51bWJlciAieiIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbiAgICAgIGF0dHJpYnV0ZXMgInoucmVhbCIgYW5kICJ6LmltYWciLlxuXG5TZXF1ZW5jZXNcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgb3JkZXJlZCBzZXRzIGluZGV4ZWQgYnkgbm9uLW5lZ2F0aXZlXG4gICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXNcbiAgIG9mIGEgc2VxdWVuY2UuIFdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzICpuKiwgdGhlIGluZGV4IHNldFxuICAgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mIHNlcXVlbmNlICphKiBpc1xuICAgc2VsZWN0ZWQgYnkgImFbaV0iLlxuXG4gICBTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6ICJhW2k6al0iIHNlbGVjdHMgYWxsIGl0ZW1zIHdpdGhcbiAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqICI8PSIgKmsqICI8IiAqaiouICBXaGVuIHVzZWQgYXMgYW5cbiAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzXG4gICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuXG4gICBTb21lIHNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgImV4dGVuZGVkIHNsaWNpbmciIHdpdGggYSB0aGlyZCAic3RlcCJcbiAgIHBhcmFtZXRlcjogImFbaTpqOmtdIiBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCogd2hlcmVcbiAgICJ4ID0gaSArIG4qayIsICpuKiAiPj0iICIwIiBhbmQgKmkqICI8PSIgKngqICI8IiAqaiouXG5cbiAgIFNlcXVlbmNlcyBhcmUgZGlzdGluZ3Vpc2hlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbXV0YWJpbGl0eTpcblxuICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpc1xuICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cyxcbiAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyBob3dldmVyLFxuICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZVxuICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuXG4gICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuXG4gICAgICBTdHJpbmdzXG4gICAgICAgICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlIGNvZGVcbiAgICAgICAgIHBvaW50cy4gQWxsIHRoZSBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UgIlUrMDAwMCAtIFUrMTBGRkZGIlxuICAgICAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEgc3RyaW5nLiAgUHl0aG9uIGRvZXNuXCd0IGhhdmUgYSAiY2hhciJcbiAgICAgICAgIHR5cGU7IGluc3RlYWQsIGV2ZXJ5IGNvZGUgcG9pbnQgaW4gdGhlIHN0cmluZyBpcyByZXByZXNlbnRlZFxuICAgICAgICAgYXMgYSBzdHJpbmcgb2JqZWN0IHdpdGggbGVuZ3RoICIxIi4gIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgICAgICAgIm9yZCgpIiBjb252ZXJ0cyBhIGNvZGUgcG9pbnQgZnJvbSBpdHMgc3RyaW5nIGZvcm0gdG8gYW5cbiAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIjsgImNocigpIiBjb252ZXJ0cyBhblxuICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxlbmd0aFxuICAgICAgICAgIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgYVxuICAgICAgICAgInN0ciIgdG8gImJ5dGVzIiB1c2luZyB0aGUgZ2l2ZW4gdGV4dCBlbmNvZGluZywgYW5kXG4gICAgICAgICAiYnl0ZXMuZGVjb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIG9wcG9zaXRlLlxuXG4gICAgICBUdXBsZXNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZlxuICAgICAgICAgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2ZcbiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBcJ3NpbmdsZXRvblwnKSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnlcbiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZVxuICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLlxuXG4gICAgICBCeXRlc1xuICAgICAgICAgQSBieXRlcyBvYmplY3QgaXMgYW4gaW1tdXRhYmxlIGFycmF5LiAgVGhlIGl0ZW1zIGFyZSA4LWJpdFxuICAgICAgICAgYnl0ZXMsIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzIGluIHRoZSByYW5nZSAwIDw9IHggPCAyNTYuXG4gICAgICAgICBCeXRlcyBsaXRlcmFscyAobGlrZSAiYlwnYWJjXCciKSBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uXG4gICAgICAgICAiYnl0ZXMoKSIgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGJ5dGVzIG9iamVjdHMuICBBbHNvLFxuICAgICAgICAgYnl0ZXMgb2JqZWN0cyBjYW4gYmUgZGVjb2RlZCB0byBzdHJpbmdzIHZpYSB0aGUgImRlY29kZSgpIlxuICAgICAgICAgbWV0aG9kLlxuXG4gICBNdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZVxuICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mXG4gICAgICBhc3NpZ25tZW50IGFuZCAiZGVsIiAoZGVsZXRlKSBzdGF0ZW1lbnRzLlxuXG4gICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcblxuICAgICAgTGlzdHNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzIGFyZVxuICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpblxuICAgICAgICAgc3F1YXJlIGJyYWNrZXRzLiAoTm90ZSB0aGF0IHRoZXJlIGFyZSBubyBzcGVjaWFsIGNhc2VzIG5lZWRlZFxuICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcblxuICAgICAgQnl0ZSBBcnJheXNcbiAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgYnlcbiAgICAgICAgIHRoZSBidWlsdC1pbiAiYnl0ZWFycmF5KCkiIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgcHJvdmlkZVxuICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuICAgICAgICAgb2JqZWN0cy5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgImFycmF5IiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2YgYVxuICAgICAgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS5cblxuU2V0IHR5cGVzXG4gICBUaGVzZSByZXByZXNlbnQgdW5vcmRlcmVkLCBmaW5pdGUgc2V0cyBvZiB1bmlxdWUsIGltbXV0YWJsZVxuICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiBIb3dldmVyLFxuICAgdGhleSBjYW4gYmUgaXRlcmF0ZWQgb3ZlciwgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiXG4gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSBmYXN0XG4gICBtZW1iZXJzaGlwIHRlc3RpbmcsIHJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmRcbiAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4gICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG5cbiAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbiAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvclxuICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kXG4gICAiMS4wIiksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cblxuICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcblxuICAgU2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic2V0KCkiIGNvbnN0cnVjdG9yIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyBieSBzZXZlcmFsXG4gICAgICBtZXRob2RzLCBzdWNoIGFzICJhZGQoKSIuXG5cbiAgIEZyb3plbiBzZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4gICAgICBidWlsdC1pbiAiZnJvemVuc2V0KCkiIGNvbnN0cnVjdG9yLiAgQXMgYSBmcm96ZW5zZXQgaXMgaW1tdXRhYmxlXG4gICAgICBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZiBhbm90aGVyXG4gICAgICBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG5cbk1hcHBpbmdzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSBpbmRleFxuICAgc2V0cy4gVGhlIHN1YnNjcmlwdCBub3RhdGlvbiAiYVtrXSIgc2VsZWN0cyB0aGUgaXRlbSBpbmRleGVkIGJ5ICJrIlxuICAgZnJvbSB0aGUgbWFwcGluZyAiYSI7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIGFzIHRoZVxuICAgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBtYXBwaW5nLlxuXG4gICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcblxuICAgRGljdGlvbmFyaWVzXG4gICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuICAgICAgYXJiaXRyYXJ5IHZhbHVlcy4gIFRoZSBvbmx5IHR5cGVzIG9mIHZhbHVlcyBub3QgYWNjZXB0YWJsZSBhc1xuICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4gICAgICBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mXG4gICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXlcJ3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4gICAgICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljXG4gICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICIxLjAiKVxuICAgICAgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuICAgICAgZGljdGlvbmFyeSBlbnRyeS5cblxuICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSAiey4uLn0iXG4gICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gKkRpY3Rpb25hcnkgZGlzcGxheXMqKS5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGVzICJkYm0ubmRibSIgYW5kICJkYm0uZ251IiBwcm92aWRlXG4gICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyJcbiAgICAgIG1vZHVsZS5cblxuQ2FsbGFibGUgdHlwZXNcbiAgIFRoZXNlIGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW9uIChzZWVcbiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6XG5cbiAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb25cbiAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyopLiAgSXQgc2hvdWxkIGJlXG4gICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICBhcyB0aGUgZnVuY3Rpb25cJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuXG4gICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6XG5cbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbiAgICAgIHwgIl9fZG9jX18iICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlOyBub3QgaW5oZXJpdGVkIGJ5ICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJjbGFzc2VzICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fbmFtZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBuYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fcXVhbG5hbWVfXyIgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAqcXVhbGlmaWVkIG5hbWUqIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTmV3IGluIHZlcnNpb24gMy4zLiAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX21vZHVsZV9fIiAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4sIG9yICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19kZWZhdWx0c19fIiAgICAgICAgICAgIHwgQSB0dXBsZSBjb250YWluaW5nIGRlZmF1bHQgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3IgIk5vbmUiIGlmIG5vIGFyZ3VtZW50cyBoYXZlICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19jb2RlX18iICAgICAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19nbG9iYWxzX18iICAgICAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlIGRpY3Rpb25hcnkgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uXCdzICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZGljdF9fIiAgICAgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fY2xvc3VyZV9fIiAgICAgICAgICAgICB8ICJOb25lIiBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb250YWluIGJpbmRpbmdzIGZvciB0aGUgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb25cJ3MgZnJlZSB2YXJpYWJsZXMuICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19hbm5vdGF0aW9uc19fIiAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9mIHBhcmFtZXRlcnMuICBUaGUga2V5cyBvZiB0aGUgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kICJcJ3JldHVyblwnIiBmb3IgdGhlIHJldHVybiAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5ub3RhdGlvbiwgaWYgcHJvdmlkZWQuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2t3ZGVmYXVsdHNfXyIgICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3IgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMuICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG5cbiAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiB0aGVcbiAgICAgIGFzc2lnbmVkIHZhbHVlLlxuXG4gICAgICBGdW5jdGlvbiBvYmplY3RzIGFsc28gc3VwcG9ydCBnZXR0aW5nIGFuZCBzZXR0aW5nIGFyYml0cmFyeVxuICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggbWV0YWRhdGFcbiAgICAgIHRvIGZ1bmN0aW9ucy4gIFJlZ3VsYXIgYXR0cmlidXRlIGRvdC1ub3RhdGlvbiBpcyB1c2VkIHRvIGdldCBhbmRcbiAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb25seVxuICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiBGdW5jdGlvblxuICAgICAgYXR0cmlidXRlcyBvbiBidWlsdC1pbiBmdW5jdGlvbnMgbWF5IGJlIHN1cHBvcnRlZCBpbiB0aGVcbiAgICAgIGZ1dHVyZS4qXG5cbiAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgYSBmdW5jdGlvblwncyBkZWZpbml0aW9uIGNhbiBiZVxuICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIGludGVybmFsXG4gICAgICB0eXBlcyBiZWxvdy5cblxuICAgSW5zdGFuY2UgbWV0aG9kc1xuICAgICAgQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlIGFuZFxuICAgICAgYW55IGNhbGxhYmxlIG9iamVjdCAobm9ybWFsbHkgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24pLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiX19zZWxmX18iIGlzIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgb2JqZWN0LCAiX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7ICJfX2RvY19fIiBpcyB0aGVcbiAgICAgIG1ldGhvZFwncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICJfX2Z1bmNfXy5fX2RvY19fIik7ICJfX25hbWVfXyJcbiAgICAgIGlzIHRoZSBtZXRob2QgbmFtZSAoc2FtZSBhcyAiX19mdW5jX18uX19uYW1lX18iKTsgIl9fbW9kdWxlX18iXG4gICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBtZXRob2Qgd2FzIGRlZmluZWQgaW4sIG9yICJOb25lIlxuICAgICAgaWYgdW5hdmFpbGFibGUuXG5cbiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5XG4gICAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3MgKHBlcmhhcHMgdmlhIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MpLCBpZlxuICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgY2xhc3NcbiAgICAgIG1ldGhvZCBvYmplY3QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSB1c2VyLVxuICAgICAgZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcyxcbiAgICAgIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UsIGFuZCB0aGUgbWV0aG9kIG9iamVjdFxuICAgICAgaXMgc2FpZCB0byBiZSBib3VuZC4gIFRoZSBuZXcgbWV0aG9kXCdzICJfX2Z1bmNfXyIgYXR0cmlidXRlIGlzXG4gICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nXG4gICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyIGlzXG4gICAgICB0aGUgc2FtZSBhcyBmb3IgYSBmdW5jdGlvbiBvYmplY3QsIGV4Y2VwdCB0aGF0IHRoZSAiX19mdW5jX18iXG4gICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3RcbiAgICAgIGJ1dCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSBjbGFzc1xuICAgICAgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyAiX19zZWxmX18iIGF0dHJpYnV0ZVxuICAgICAgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGVcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nXG4gICAgICBmdW5jdGlvbiAoIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgICAoIl9fc2VsZl9fIikgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3IgaW5zdGFuY2UsIHdoZW5cbiAgICAgICJDIiBpcyBhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3IgYSBmdW5jdGlvbiAiZigpIixcbiAgICAgIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgIGNhbGxpbmcgIkMuZih4LCAxKSIuXG5cbiAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBkZXJpdmVkIGZyb20gYSBjbGFzcyBtZXRob2RcbiAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCBhY3R1YWxseVxuICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAiQy5mKDEpIlxuICAgICAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nICJmKEMsMSkiIHdoZXJlICJmIiBpcyB0aGUgdW5kZXJseWluZ1xuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gaW5zdGFuY2VcbiAgICAgIG1ldGhvZCBvYmplY3QgaGFwcGVucyBlYWNoIHRpbWUgdGhlIGF0dHJpYnV0ZSBpcyByZXRyaWV2ZWQgZnJvbVxuICAgICAgdGhlIGluc3RhbmNlLiAgSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bCBvcHRpbWl6YXRpb24gaXMgdG9cbiAgICAgIGFzc2lnbiB0aGUgYXR0cmlidXRlIHRvIGEgbG9jYWwgdmFyaWFibGUgYW5kIGNhbGwgdGhhdCBsb2NhbFxuICAgICAgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgZm9yXG4gICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb25zOyBvdGhlciBjYWxsYWJsZSBvYmplY3RzIChhbmQgYWxsIG5vbi1cbiAgICAgIGNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0IGlzXG4gICAgICBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyB3aGljaCBhcmVcbiAgICAgIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZFxuICAgICAgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbiBhdHRyaWJ1dGVcbiAgICAgIG9mIHRoZSBjbGFzcy5cblxuICAgR2VuZXJhdG9yIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZVxuICAgICAgc2VjdGlvbiAqVGhlIHlpZWxkIHN0YXRlbWVudCopIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgZnVuY3Rpb24qLlxuICAgICAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0XG4gICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmdcbiAgICAgIHRoZSBpdGVyYXRvclwncyAiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlXG4gICAgICBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICJ5aWVsZCJcbiAgICAgIHN0YXRlbWVudC4gIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgInJldHVybiIgc3RhdGVtZW50IG9yXG4gICAgICBmYWxscyBvZmYgdGhlIGVuZCwgYSAiU3RvcEl0ZXJhdGlvbiIgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlXG4gICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvIGJlXG4gICAgICByZXR1cm5lZC5cblxuICAgQ29yb3V0aW5lIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpc1xuICAgICAgY2FsbGVkIGEgKmNvcm91dGluZSBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLFxuICAgICAgcmV0dXJucyBhICpjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCJcbiAgICAgIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzICJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgc3RhdGVtZW50cy5cbiAgICAgIFNlZSBhbHNvIHRoZSAqQ29yb3V0aW5lIE9iamVjdHMqIHNlY3Rpb24uXG5cbiAgIEJ1aWx0LWluIGZ1bmN0aW9uc1xuICAgICAgQSBidWlsdC1pbiBmdW5jdGlvbiBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIEMgZnVuY3Rpb24uXG4gICAgICBFeGFtcGxlcyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlICJsZW4oKSIgYW5kICJtYXRoLnNpbigpIlxuICAgICAgKCJtYXRoIiBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgb2ZcbiAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgcmVhZC1cbiAgICAgIG9ubHkgYXR0cmlidXRlczogIl9fZG9jX18iIGlzIHRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uXG4gICAgICBzdHJpbmcsIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZTsgIl9fbmFtZV9fIiBpcyB0aGUgZnVuY3Rpb25cJ3NcbiAgICAgIG5hbWU7ICJfX3NlbGZfXyIgaXMgc2V0IHRvICJOb25lIiAoYnV0IHNlZSB0aGUgbmV4dCBpdGVtKTtcbiAgICAgICJfX21vZHVsZV9fIiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZFxuICAgICAgaW4gb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLlxuXG4gICBCdWlsdC1pbiBtZXRob2RzXG4gICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzXG4gICAgICB0aW1lIGNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhblxuICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4gICAgICAiYWxpc3QuYXBwZW5kKCkiLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXNcbiAgICAgIGNhc2UsIHRoZSBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGUgIl9fc2VsZl9fIiBpcyBzZXQgdG8gdGhlXG4gICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLlxuXG4gICBDbGFzc2VzXG4gICAgICBDbGFzc2VzIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzIGZhY3Rvcmllc1xuICAgICAgZm9yIG5ldyBpbnN0YW5jZXMgb2YgdGhlbXNlbHZlcywgYnV0IHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlIGZvclxuICAgICAgY2xhc3MgdHlwZXMgdGhhdCBvdmVycmlkZSAiX19uZXdfXygpIi4gIFRoZSBhcmd1bWVudHMgb2YgdGhlXG4gICAgICBjYWxsIGFyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0b1xuICAgICAgIl9faW5pdF9fKCkiIHRvIGluaXRpYWxpemUgdGhlIG5ldyBpbnN0YW5jZS5cblxuICAgQ2xhc3MgSW5zdGFuY2VzXG4gICAgICBJbnN0YW5jZXMgb2YgYXJiaXRyYXJ5IGNsYXNzZXMgY2FuIGJlIG1hZGUgY2FsbGFibGUgYnkgZGVmaW5pbmdcbiAgICAgIGEgIl9fY2FsbF9fKCkiIG1ldGhvZCBpbiB0aGVpciBjbGFzcy5cblxuTW9kdWxlc1xuICAgTW9kdWxlcyBhcmUgYSBiYXNpYyBvcmdhbml6YXRpb25hbCB1bml0IG9mIFB5dGhvbiBjb2RlLCBhbmQgYXJlXG4gICBjcmVhdGVkIGJ5IHRoZSAqaW1wb3J0IHN5c3RlbSogYXMgaW52b2tlZCBlaXRoZXIgYnkgdGhlICJpbXBvcnQiXG4gICBzdGF0ZW1lbnQgKHNlZSAiaW1wb3J0IiksIG9yIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXNcbiAgICJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBhbmQgYnVpbHQtaW4gIl9faW1wb3J0X18oKSIuICBBIG1vZHVsZVxuICAgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzIGlzXG4gICB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZSAiX19nbG9iYWxzX18iIGF0dHJpYnV0ZSBvZlxuICAgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSkuICBBdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmVcbiAgIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJtLngiIGlzIGVxdWl2YWxlbnRcbiAgIHRvICJtLl9fZGljdF9fWyJ4Il0iLiBBIG1vZHVsZSBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZVxuICAgb2JqZWN0IHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbW9kdWxlIChzaW5jZSBpdCBpc25cJ3QgbmVlZGVkIG9uY2VcbiAgIHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lKS5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZSBkaWN0aW9uYXJ5LFxuICAgZS5nLiwgIm0ueCA9IDEiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSA9IDEiLlxuXG4gICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGU6ICJfX2RpY3RfXyIgaXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2VcbiAgIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuXG5cbiAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQmVjYXVzZSBvZiB0aGUgd2F5IENQeXRob25cbiAgIGNsZWFycyBtb2R1bGUgZGljdGlvbmFyaWVzLCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgd2lsbCBiZSBjbGVhcmVkXG4gICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgaGFzXG4gICBsaXZlIHJlZmVyZW5jZXMuICBUbyBhdm9pZCB0aGlzLCBjb3B5IHRoZSBkaWN0aW9uYXJ5IG9yIGtlZXAgdGhlXG4gICBtb2R1bGUgYXJvdW5kIHdoaWxlIHVzaW5nIGl0cyBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgbW9kdWxlXCdzIG5hbWU7XG4gICAiX19kb2NfXyIgaXMgdGhlIG1vZHVsZVwncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgIk5vbmUiIGlmXG4gICB1bmF2YWlsYWJsZTsgIl9fZmlsZV9fIiBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGVcbiAgIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdCB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGUgIl9fZmlsZV9fIlxuICAgYXR0cmlidXRlIG1heSBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMgQ1xuICAgbW9kdWxlcyB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCBpbnRvIHRoZSBpbnRlcnByZXRlcjsgZm9yXG4gICBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCBpc1xuICAgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBmaWxlLlxuXG5DdXN0b20gY2xhc3Nlc1xuICAgQ3VzdG9tIGNsYXNzIHR5cGVzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9ucyAoc2VlXG4gICBzZWN0aW9uICpDbGFzcyBkZWZpbml0aW9ucyopLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWRcbiAgIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QuIENsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSB0cmFuc2xhdGVkXG4gICB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIkMueCIgaXMgdHJhbnNsYXRlZCB0b1xuICAgIkMuX19kaWN0X19bIngiXSIgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvd1xuICAgZm9yIG90aGVyIG1lYW5zIG9mIGxvY2F0aW5nIGF0dHJpYnV0ZXMpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpc1xuICAgbm90IGZvdW5kIHRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2VcbiAgIGNsYXNzZXMuIFRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kXG4gICByZXNvbHV0aW9uIG9yZGVyIHdoaWNoIGJlaGF2ZXMgY29ycmVjdGx5IGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mXG4gICBcJ2RpYW1vbmRcJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZVxuICAgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uIGFuY2VzdG9yLiBBZGRpdGlvbmFsXG4gICBkZXRhaWxzIG9uIHRoZSBDMyBNUk8gdXNlZCBieSBQeXRob24gY2FuIGJlIGZvdW5kIGluIHRoZVxuICAgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuMyByZWxlYXNlIGF0XG4gICBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vLlxuXG4gICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzICJDIiwgc2F5KSB3b3VsZCB5aWVsZCBhXG4gICBjbGFzcyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGluc3RhbmNlIG1ldGhvZFxuICAgb2JqZWN0IHdob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlcyBpcyAiQyIuICBXaGVuIGl0IHdvdWxkIHlpZWxkIGFcbiAgIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBvYmplY3Qgd3JhcHBlZCBieVxuICAgdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKlxuICAgZm9yIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcyBtYXlcbiAgIGRpZmZlciBmcm9tIHRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgIl9fZGljdF9fIi5cblxuICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3NcJ3MgZGljdGlvbmFyeSwgbmV2ZXJcbiAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cblxuICAgQSBjbGFzcyBvYmplY3QgY2FuIGJlIGNhbGxlZCAoc2VlIGFib3ZlKSB0byB5aWVsZCBhIGNsYXNzIGluc3RhbmNlXG4gICAoc2VlIGJlbG93KS5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19uYW1lX18iIGlzIHRoZSBjbGFzcyBuYW1lOyAiX19tb2R1bGVfXyIgaXNcbiAgIHRoZSBtb2R1bGUgbmFtZSBpbiB3aGljaCB0aGUgY2xhc3Mgd2FzIGRlZmluZWQ7ICJfX2RpY3RfXyIgaXMgdGhlXG4gICBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgIl9fYmFzZXNfXyIgaXMgYSB0dXBsZVxuICAgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluIHRoZVxuICAgb3JkZXIgb2YgdGhlaXIgb2NjdXJyZW5jZSBpbiB0aGUgYmFzZSBjbGFzcyBsaXN0OyAiX19kb2NfXyIgaXMgdGhlXG4gICBjbGFzc1wncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgTm9uZSBpZiB1bmRlZmluZWQuXG5cbkNsYXNzIGluc3RhbmNlc1xuICAgQSBjbGFzcyBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgYSBjbGFzcyBvYmplY3QgKHNlZSBhYm92ZSkuXG4gICBBIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgd2hpY2hcbiAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuXG4gICBXaGVuIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MgaGFzXG4gICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzc1xuICAgYXR0cmlidXRlcy4gIElmIGEgY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kIHRoYXQgaXMgYSB1c2VyLWRlZmluZWRcbiAgIGZ1bmN0aW9uIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0XG4gICB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UuICBTdGF0aWMgbWV0aG9kIGFuZFxuICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGFsc28gdHJhbnNmb3JtZWQ7IHNlZSBhYm92ZSB1bmRlclxuICAgIkNsYXNzZXMiLiAgU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyogZm9yIGFub3RoZXIgd2F5XG4gICBpbiB3aGljaCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgcmV0cmlldmVkIHZpYSBpdHMgaW5zdGFuY2VzIG1heVxuICAgZGlmZmVyIGZyb20gdGhlIG9iamVjdHMgYWN0dWFsbHkgc3RvcmVkIGluIHRoZSBjbGFzc1wncyAiX19kaWN0X18iLlxuICAgSWYgbm8gY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kLCBhbmQgdGhlIG9iamVjdFwncyBjbGFzcyBoYXMgYVxuICAgIl9fZ2V0YXR0cl9fKCkiIG1ldGhvZCwgdGhhdCBpcyBjYWxsZWQgdG8gc2F0aXNmeSB0aGUgbG9va3VwLlxuXG4gICBBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNlXCdzXG4gICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzXCdzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGFcbiAgICJfX3NldGF0dHJfXygpIiBvciAiX19kZWxhdHRyX18oKSIgbWV0aG9kLCB0aGlzIGlzIGNhbGxlZCBpbnN0ZWFkXG4gICBvZiB1cGRhdGluZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgbWFwcGluZ3NcbiAgIGlmIHRoZXkgaGF2ZSBtZXRob2RzIHdpdGggY2VydGFpbiBzcGVjaWFsIG5hbWVzLiAgU2VlIHNlY3Rpb25cbiAgICpTcGVjaWFsIG1ldGhvZCBuYW1lcyouXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fZGljdF9fIiBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7XG4gICAiX19jbGFzc19fIiBpcyB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MuXG5cbkkvTyBvYmplY3RzIChhbHNvIGtub3duIGFzIGZpbGUgb2JqZWN0cylcbiAgIEEgKmZpbGUgb2JqZWN0KiByZXByZXNlbnRzIGFuIG9wZW4gZmlsZS4gIFZhcmlvdXMgc2hvcnRjdXRzIGFyZVxuICAgYXZhaWxhYmxlIHRvIGNyZWF0ZSBmaWxlIG9iamVjdHM6IHRoZSAib3BlbigpIiBidWlsdC1pbiBmdW5jdGlvbixcbiAgIGFuZCBhbHNvICJvcy5wb3BlbigpIiwgIm9zLmZkb3BlbigpIiwgYW5kIHRoZSAibWFrZWZpbGUoKSIgbWV0aG9kXG4gICBvZiBzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHNcbiAgIHByb3ZpZGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzKS5cblxuICAgVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZVxuICAgaW5pdGlhbGl6ZWQgdG8gZmlsZSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVycHJldGVyXCdzXG4gICBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zOyB0aGV5IGFyZSBhbGwgb3BlbiBpbiB0ZXh0XG4gICBtb2RlIGFuZCB0aGVyZWZvcmUgZm9sbG93IHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGVcbiAgICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy5cblxuSW50ZXJuYWwgdHlwZXNcbiAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gdGhlXG4gICB1c2VyLiBUaGVpciBkZWZpbml0aW9ucyBtYXkgY2hhbmdlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoZVxuICAgaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLlxuXG4gICBDb2RlIG9iamVjdHNcbiAgICAgIENvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUsXG4gICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGFcbiAgICAgIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4gZXhwbGljaXRcbiAgICAgIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb25cJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCB3YXNcbiAgICAgIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUgb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlXG4gICAgICBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBmdW5jdGlvbiBvYmplY3QsIG5vdFxuICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkIGF0XG4gICAgICBydW4tdGltZSkuICBVbmxpa2UgZnVuY3Rpb24gb2JqZWN0cywgY29kZSBvYmplY3RzIGFyZSBpbW11dGFibGVcbiAgICAgIGFuZCBjb250YWluIG5vIHJlZmVyZW5jZXMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvIG11dGFibGVcbiAgICAgIG9iamVjdHMuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJjb19uYW1lIiBnaXZlcyB0aGUgZnVuY3Rpb24gbmFtZTtcbiAgICAgICJjb19hcmdjb3VudCIgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAoaW5jbHVkaW5nXG4gICAgICBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7ICJjb19ubG9jYWxzIiBpcyB0aGUgbnVtYmVyIG9mXG4gICAgICBsb2NhbCB2YXJpYWJsZXMgdXNlZCBieSB0aGUgZnVuY3Rpb24gKGluY2x1ZGluZyBhcmd1bWVudHMpO1xuICAgICAgImNvX3Zhcm5hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBsb2NhbFxuICAgICAgdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7ICJjb19jZWxsdmFycyIgaXMgYVxuICAgICAgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlXG4gICAgICByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7ICJjb19mcmVldmFycyIgaXMgYSB0dXBsZVxuICAgICAgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgZnJlZSB2YXJpYWJsZXM7ICJjb19jb2RlIiBpcyBhIHN0cmluZ1xuICAgICAgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnM7ICJjb19jb25zdHMiXG4gICAgICBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGxpdGVyYWxzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuICAgICAgImNvX25hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuICAgICAgImNvX2ZpbGVuYW1lIiBpcyB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgY29tcGlsZWQ7XG4gICAgICAiY29fZmlyc3RsaW5lbm8iIGlzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBvZiB0aGUgZnVuY3Rpb247XG4gICAgICAiY29fbG5vdGFiIiBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4gICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGVcbiAgICAgIGludGVycHJldGVyKTsgImNvX3N0YWNrc2l6ZSIgaXMgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemVcbiAgICAgIChpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKTsgImNvX2ZsYWdzIiBpcyBhbiBpbnRlZ2VyIGVuY29kaW5nIGFcbiAgICAgIG51bWJlciBvZiBmbGFncyBmb3IgdGhlIGludGVycHJldGVyLlxuXG4gICAgICBUaGUgZm9sbG93aW5nIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBmb3IgImNvX2ZsYWdzIjogYml0ICIweDA0IlxuICAgICAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKmFyZ3VtZW50cyIgc3ludGF4IHRvIGFjY2VwdCBhblxuICAgICAgYXJiaXRyYXJ5IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgaWZcbiAgICAgIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKiprZXl3b3JkcyIgc3ludGF4IHRvIGFjY2VwdCBhcmJpdHJhcnlcbiAgICAgIGtleXdvcmQgYXJndW1lbnRzOyBiaXQgIjB4MjAiIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gaXMgYVxuICAgICAgZ2VuZXJhdG9yLlxuXG4gICAgICBGdXR1cmUgZmVhdHVyZSBkZWNsYXJhdGlvbnMgKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIilcbiAgICAgIGFsc28gdXNlIGJpdHMgaW4gImNvX2ZsYWdzIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgY29kZSBvYmplY3RcbiAgICAgIHdhcyBjb21waWxlZCB3aXRoIGEgcGFydGljdWxhciBmZWF0dXJlIGVuYWJsZWQ6IGJpdCAiMHgyMDAwIiBpc1xuICAgICAgc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmUgZGl2aXNpb24gZW5hYmxlZDtcbiAgICAgIGJpdHMgIjB4MTAiIGFuZCAiMHgxMDAwIiB3ZXJlIHVzZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZlxuICAgICAgUHl0aG9uLlxuXG4gICAgICBPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuXG5cbiAgICAgIElmIGEgY29kZSBvYmplY3QgcmVwcmVzZW50cyBhIGZ1bmN0aW9uLCB0aGUgZmlyc3QgaXRlbSBpblxuICAgICAgImNvX2NvbnN0cyIgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbiAgICAgICJOb25lIiBpZiB1bmRlZmluZWQuXG5cbiAgIEZyYW1lIG9iamVjdHNcbiAgICAgIEZyYW1lIG9iamVjdHMgcmVwcmVzZW50IGV4ZWN1dGlvbiBmcmFtZXMuICBUaGV5IG1heSBvY2N1ciBpblxuICAgICAgdHJhY2ViYWNrIG9iamVjdHMgKHNlZSBiZWxvdykuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJmX2JhY2siIGlzIHRvIHRoZSBwcmV2aW91cyBzdGFja1xuICAgICAgZnJhbWUgKHRvd2FyZHMgdGhlIGNhbGxlciksIG9yICJOb25lIiBpZiB0aGlzIGlzIHRoZSBib3R0b21cbiAgICAgIHN0YWNrIGZyYW1lOyAiZl9jb2RlIiBpcyB0aGUgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gdGhpc1xuICAgICAgZnJhbWU7ICJmX2xvY2FscyIgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwIGxvY2FsXG4gICAgICB2YXJpYWJsZXM7ICJmX2dsb2JhbHMiIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4gICAgICAiZl9idWlsdGlucyIgaXMgdXNlZCBmb3IgYnVpbHQtaW4gKGludHJpbnNpYykgbmFtZXM7ICJmX2xhc3RpIlxuICAgICAgZ2l2ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGVcbiAgICAgIGJ5dGVjb2RlIHN0cmluZyBvZiB0aGUgY29kZSBvYmplY3QpLlxuXG4gICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6ICJmX3RyYWNlIiwgaWYgbm90ICJOb25lIiwgaXMgYVxuICAgICAgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBjb2RlIGxpbmUgKHRoaXMgaXNcbiAgICAgIHVzZWQgYnkgdGhlIGRlYnVnZ2VyKTsgImZfbGluZW5vIiBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBvZlxuICAgICAgdGhlIGZyYW1lIC0tLSB3cml0aW5nIHRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiBqdW1wc1xuICAgICAgdG8gdGhlIGdpdmVuIGxpbmUgKG9ubHkgZm9yIHRoZSBib3R0b20tbW9zdCBmcmFtZSkuICBBIGRlYnVnZ2VyXG4gICAgICBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSB3cml0aW5nXG4gICAgICB0byBmX2xpbmVuby5cblxuICAgICAgRnJhbWUgb2JqZWN0cyBzdXBwb3J0IG9uZSBtZXRob2Q6XG5cbiAgICAgIGZyYW1lLmNsZWFyKClcblxuICAgICAgICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkIGJ5XG4gICAgICAgICB0aGUgZnJhbWUuICBBbHNvLCBpZiB0aGUgZnJhbWUgYmVsb25nZWQgdG8gYSBnZW5lcmF0b3IsIHRoZVxuICAgICAgICAgZ2VuZXJhdG9yIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlIGN5Y2xlc1xuICAgICAgICAgaW52b2x2aW5nIGZyYW1lIG9iamVjdHMgKGZvciBleGFtcGxlIHdoZW4gY2F0Y2hpbmcgYW5cbiAgICAgICAgIGV4Y2VwdGlvbiBhbmQgc3RvcmluZyBpdHMgdHJhY2ViYWNrIGZvciBsYXRlciB1c2UpLlxuXG4gICAgICAgICAiUnVudGltZUVycm9yIiBpcyByYWlzZWQgaWYgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuXG5cbiAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuICAgVHJhY2ViYWNrIG9iamVjdHNcbiAgICAgIFRyYWNlYmFjayBvYmplY3RzIHJlcHJlc2VudCBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gIEFcbiAgICAgIHRyYWNlYmFjayBvYmplY3QgaXMgY3JlYXRlZCB3aGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIHRoZVxuICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssIGF0XG4gICAgICBlYWNoIHVud291bmQgbGV2ZWwgYSB0cmFjZWJhY2sgb2JqZWN0IGlzIGluc2VydGVkIGluIGZyb250IG9mXG4gICAgICB0aGUgY3VycmVudCB0cmFjZWJhY2suICBXaGVuIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGVudGVyZWQsXG4gICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgc2VjdGlvblxuICAgICAgKlRoZSB0cnkgc3RhdGVtZW50Ki4pIEl0IGlzIGFjY2Vzc2libGUgYXMgdGhlIHRoaXJkIGl0ZW0gb2YgdGhlXG4gICAgICB0dXBsZSByZXR1cm5lZCBieSAic3lzLmV4Y19pbmZvKCkiLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zIG5vXG4gICAgICBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiAobmljZWx5IGZvcm1hdHRlZClcbiAgICAgIHRvIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW07IGlmIHRoZSBpbnRlcnByZXRlciBpcyBpbnRlcmFjdGl2ZSxcbiAgICAgIGl0IGlzIGFsc28gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgInN5cy5sYXN0X3RyYWNlYmFjayIuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiB0aGVcbiAgICAgIHN0YWNrIHRyYWNlICh0b3dhcmRzIHRoZSBmcmFtZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkKSwgb3JcbiAgICAgICJOb25lIiBpZiB0aGVyZSBpcyBubyBuZXh0IGxldmVsOyAidGJfZnJhbWUiIHBvaW50cyB0byB0aGVcbiAgICAgIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDsgInRiX2xpbmVubyIgZ2l2ZXMgdGhlIGxpbmVcbiAgICAgIG51bWJlciB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkOyAidGJfbGFzdGkiIGluZGljYXRlcyB0aGVcbiAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24uICBUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gaW5cbiAgICAgIHRoZSB0cmFjZWJhY2sgbWF5IGRpZmZlciBmcm9tIHRoZSBsaW5lIG51bWJlciBvZiBpdHMgZnJhbWVcbiAgICAgIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgInRyeSIgc3RhdGVtZW50IHdpdGggbm9cbiAgICAgIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLlxuXG4gICBTbGljZSBvYmplY3RzXG4gICAgICBTbGljZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzbGljZXMgZm9yICJfX2dldGl0ZW1fXygpIlxuICAgICAgbWV0aG9kcy4gIFRoZXkgYXJlIGFsc28gY3JlYXRlZCBieSB0aGUgYnVpbHQtaW4gInNsaWNlKCkiXG4gICAgICBmdW5jdGlvbi5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInN0YXJ0IiBpcyB0aGUgbG93ZXIgYm91bmQ7ICJzdG9wIlxuICAgICAgaXMgdGhlIHVwcGVyIGJvdW5kOyAic3RlcCIgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMgIk5vbmUiIGlmXG4gICAgICBvbWl0dGVkLiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS5cblxuICAgICAgU2xpY2Ugb2JqZWN0cyBzdXBwb3J0IG9uZSBtZXRob2Q6XG5cbiAgICAgIHNsaWNlLmluZGljZXMoc2VsZiwgbGVuZ3RoKVxuXG4gICAgICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZFxuICAgICAgICAgY29tcHV0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNsaWNlIHRoYXQgdGhlIHNsaWNlIG9iamVjdFxuICAgICAgICAgd291bGQgZGVzY3JpYmUgaWYgYXBwbGllZCB0byBhIHNlcXVlbmNlIG9mICpsZW5ndGgqIGl0ZW1zLlxuICAgICAgICAgSXQgcmV0dXJucyBhIHR1cGxlIG9mIHRocmVlIGludGVnZXJzOyByZXNwZWN0aXZlbHkgdGhlc2UgYXJlXG4gICAgICAgICB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlXG4gICAgICAgICBsZW5ndGggb2YgdGhlIHNsaWNlLiBNaXNzaW5nIG9yIG91dC1vZi1ib3VuZHMgaW5kaWNlcyBhcmVcbiAgICAgICAgIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuXG4gICBTdGF0aWMgbWV0aG9kIG9iamVjdHNcbiAgICAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBwcm92aWRlIGEgd2F5IG9mIGRlZmVhdGluZyB0aGVcbiAgICAgIHRyYW5zZm9ybWF0aW9uIG9mIGZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgZGVzY3JpYmVkXG4gICAgICBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFueSBvdGhlclxuICAgICAgb2JqZWN0LCB1c3VhbGx5IGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QuIFdoZW4gYSBzdGF0aWNcbiAgICAgIG1ldGhvZCBvYmplY3QgaXMgcmV0cmlldmVkIGZyb20gYSBjbGFzcyBvciBhIGNsYXNzIGluc3RhbmNlLCB0aGVcbiAgICAgIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsIHdoaWNoIGlzIG5vdFxuICAgICAgc3ViamVjdCB0byBhbnkgZnVydGhlciB0cmFuc2Zvcm1hdGlvbi4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZVxuICAgICAgbm90IHRoZW1zZWx2ZXMgY2FsbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3RzIHRoZXkgd3JhcCB1c3VhbGx5XG4gICAgICBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgICJzdGF0aWNtZXRob2QoKSIgY29uc3RydWN0b3IuXG5cbiAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4gICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyXG4gICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0IG9iamVjdFxuICAgICAgaXMgcmV0cmlldmVkIGZyb20gY2xhc3NlcyBhbmQgY2xhc3MgaW5zdGFuY2VzLiBUaGUgYmVoYXZpb3VyIG9mXG4gICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbiAgICAgIHVuZGVyICJVc2VyLWRlZmluZWQgbWV0aG9kcyIuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkXG4gICAgICBieSB0aGUgYnVpbHQtaW4gImNsYXNzbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuJywKLSAndHlwZXNmdW5jdGlvbnMnOiB1J1xuRnVuY3Rpb25zXG4qKioqKioqKipcblxuRnVuY3Rpb24gb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZSBvbmx5XG5vcGVyYXRpb24gb24gYSBmdW5jdGlvbiBvYmplY3QgaXMgdG8gY2FsbCBpdDogImZ1bmMoYXJndW1lbnQtbGlzdCkiLlxuXG5UaGVyZSBhcmUgcmVhbGx5IHR3byBmbGF2b3JzIG9mIGZ1bmN0aW9uIG9iamVjdHM6IGJ1aWx0LWluIGZ1bmN0aW9uc1xuYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuICBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgb3BlcmF0aW9uICh0byBjYWxsXG50aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgdGhlXG5kaWZmZXJlbnQgb2JqZWN0IHR5cGVzLlxuXG5TZWUgKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCi0gJ3R5cGVzbWFwcGluZyc6IHUnXG5NYXBwaW5nIFR5cGVzIC0tLSAiZGljdCJcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgb2JqZWN0cy5cbk1hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgc3RhbmRhcmRcbm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0LVxuaW4gImxpc3QiLCAic2V0IiwgYW5kICJ0dXBsZSIgY2xhc3NlcywgYW5kIHRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZS4pXG5cbkEgZGljdGlvbmFyeVwncyBrZXlzIGFyZSAqYWxtb3N0KiBhcmJpdHJhcnkgdmFsdWVzLiAgVmFsdWVzIHRoYXQgYXJlXG5ub3QgKmhhc2hhYmxlKiwgdGhhdCBpcywgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMsIGRpY3Rpb25hcmllcyBvclxub3RoZXIgbXV0YWJsZSB0eXBlcyAodGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0XG5pZGVudGl0eSkgbWF5IG5vdCBiZSB1c2VkIGFzIGtleXMuICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleVxudGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsXG4oc3VjaCBhcyAiMSIgYW5kICIxLjAiKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvIGluZGV4XG50aGUgc2FtZSBkaWN0aW9uYXJ5IGVudHJ5LiAgKE5vdGUgaG93ZXZlciwgdGhhdCBzaW5jZSBjb21wdXRlcnMgc3RvcmVcbmZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXMgYXBwcm94aW1hdGlvbnMgaXQgaXMgdXN1YWxseSB1bndpc2UgdG8gdXNlXG50aGVtIGFzIGRpY3Rpb25hcnkga2V5cy4pXG5cbkRpY3Rpb25hcmllcyBjYW4gYmUgY3JlYXRlZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgImtleTpcbnZhbHVlIiBwYWlycyB3aXRoaW4gYnJhY2VzLCBmb3IgZXhhbXBsZTogIntcJ2phY2tcJzogNDA5OCwgXCdzam9lcmRcJzpcbjQxMjd9IiBvciAiezQwOTg6IFwnamFja1wnLCA0MTI3OiBcJ3Nqb2VyZFwnfSIsIG9yIGJ5IHRoZSAiZGljdCJcbmNvbnN0cnVjdG9yLlxuXG5jbGFzcyBjbGFzcyBkaWN0KCoqa3dhcmcpXG5jbGFzcyBjbGFzcyBkaWN0KG1hcHBpbmcsICoqa3dhcmcpXG5jbGFzcyBjbGFzcyBkaWN0KGl0ZXJhYmxlLCAqKmt3YXJnKVxuXG4gICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50IGFuZCBhIHBvc3NpYmx5IGVtcHR5IHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy5cblxuICAgSWYgbm8gcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiwgYW4gZW1wdHkgZGljdGlvbmFyeSBpcyBjcmVhdGVkLlxuICAgSWYgYSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpdCBpcyBhIG1hcHBpbmcgb2JqZWN0LCBhXG4gICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgdGhlIG1hcHBpbmdcbiAgIG9iamVjdC4gIE90aGVyd2lzZSwgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgbXVzdCBiZSBhbiAqaXRlcmFibGUqXG4gICBvYmplY3QuICBFYWNoIGl0ZW0gaW4gdGhlIGl0ZXJhYmxlIG11c3QgaXRzZWxmIGJlIGFuIGl0ZXJhYmxlIHdpdGhcbiAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSBiZWNvbWVzIGEga2V5XG4gICBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUgc2Vjb25kIG9iamVjdCB0aGUgY29ycmVzcG9uZGluZ1xuICAgdmFsdWUuICBJZiBhIGtleSBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHRoZSBsYXN0IHZhbHVlIGZvciB0aGF0IGtleVxuICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuXG5cbiAgIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGVpclxuICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50LiAgSWYgYSBrZXkgYmVpbmcgYWRkZWQgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgZnJvbVxuICAgdGhlIGtleXdvcmQgYXJndW1lbnQgcmVwbGFjZXMgdGhlIHZhbHVlIGZyb20gdGhlIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50LlxuXG4gICBUbyBpbGx1c3RyYXRlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFsbCByZXR1cm4gYSBkaWN0aW9uYXJ5IGVxdWFsXG4gICB0byAieyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30iOlxuXG4gICAgICA+Pj4gYSA9IGRpY3Qob25lPTEsIHR3bz0yLCB0aHJlZT0zKVxuICAgICAgPj4+IGIgPSB7XCdvbmVcJzogMSwgXCd0d29cJzogMiwgXCd0aHJlZVwnOiAzfVxuICAgICAgPj4+IGMgPSBkaWN0KHppcChbXCdvbmVcJywgXCd0d29cJywgXCd0aHJlZVwnXSwgWzEsIDIsIDNdKSlcbiAgICAgID4+PiBkID0gZGljdChbKFwndHdvXCcsIDIpLCAoXCdvbmVcJywgMSksIChcJ3RocmVlXCcsIDMpXSlcbiAgICAgID4+PiBlID0gZGljdCh7XCd0aHJlZVwnOiAzLCBcJ29uZVwnOiAxLCBcJ3R3b1wnOiAyfSlcbiAgICAgID4+PiBhID09IGIgPT0gYyA9PSBkID09IGVcbiAgICAgIFRydWVcblxuICAgUHJvdmlkaW5nIGtleXdvcmQgYXJndW1lbnRzIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlIG9ubHkgd29ya3MgZm9yXG4gICBrZXlzIHRoYXQgYXJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycy4gIE90aGVyd2lzZSwgYW55IHZhbGlkIGtleXNcbiAgIGNhbiBiZSB1c2VkLlxuXG4gICBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbnMgdGhhdCBkaWN0aW9uYXJpZXMgc3VwcG9ydCAoYW5kIHRoZXJlZm9yZSxcbiAgIGN1c3RvbSBtYXBwaW5nIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRvbyk6XG5cbiAgIGxlbihkKVxuXG4gICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqZCouXG5cbiAgIGRba2V5XVxuXG4gICAgICBSZXR1cm4gdGhlIGl0ZW0gb2YgKmQqIHdpdGgga2V5ICprZXkqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZlxuICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuXG5cbiAgICAgIElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kICJfX21pc3NpbmdfXygpIiBhbmQgKmtleSpcbiAgICAgIGlzIG5vdCBwcmVzZW50LCB0aGUgImRba2V5XSIgb3BlcmF0aW9uIGNhbGxzIHRoYXQgbWV0aG9kIHdpdGhcbiAgICAgIHRoZSBrZXkgKmtleSogYXMgYXJndW1lbnQuICBUaGUgImRba2V5XSIgb3BlcmF0aW9uIHRoZW4gcmV0dXJuc1xuICAgICAgb3IgcmFpc2VzIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGVcbiAgICAgICJfX21pc3NpbmdfXyhrZXkpIiBjYWxsLiBObyBvdGhlciBvcGVyYXRpb25zIG9yIG1ldGhvZHMgaW52b2tlXG4gICAgICAiX19taXNzaW5nX18oKSIuIElmICJfX21pc3NpbmdfXygpIiBpcyBub3QgZGVmaW5lZCwgIktleUVycm9yIlxuICAgICAgaXMgcmFpc2VkLiAiX19taXNzaW5nX18oKSIgbXVzdCBiZSBhIG1ldGhvZDsgaXQgY2Fubm90IGJlIGFuXG4gICAgICBpbnN0YW5jZSB2YXJpYWJsZTpcblxuICAgICAgICAgPj4+IGNsYXNzIENvdW50ZXIoZGljdCk6XG4gICAgICAgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuICAgICAgICAgLi4uICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgID4+PiBjID0gQ291bnRlcigpXG4gICAgICAgICA+Pj4gY1tcJ3JlZFwnXVxuICAgICAgICAgMFxuICAgICAgICAgPj4+IGNbXCdyZWRcJ10gKz0gMVxuICAgICAgICAgPj4+IGNbXCdyZWRcJ11cbiAgICAgICAgIDFcblxuICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2ZcbiAgICAgICJjb2xsZWN0aW9ucy5Db3VudGVyIi4gIEEgZGlmZmVyZW50ICJfX21pc3NpbmdfXyIgbWV0aG9kIGlzIHVzZWRcbiAgICAgIGJ5ICJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIuXG5cbiAgIGRba2V5XSA9IHZhbHVlXG5cbiAgICAgIFNldCAiZFtrZXldIiB0byAqdmFsdWUqLlxuXG4gICBkZWwgZFtrZXldXG5cbiAgICAgIFJlbW92ZSAiZFtrZXldIiBmcm9tICpkKi4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWYgKmtleSogaXMgbm90XG4gICAgICBpbiB0aGUgbWFwLlxuXG4gICBrZXkgaW4gZFxuXG4gICAgICBSZXR1cm4gIlRydWUiIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgIkZhbHNlIi5cblxuICAga2V5IG5vdCBpbiBkXG5cbiAgICAgIEVxdWl2YWxlbnQgdG8gIm5vdCBrZXkgaW4gZCIuXG5cbiAgIGl0ZXIoZClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkuICBUaGlzIGlzIGFcbiAgICAgIHNob3J0Y3V0IGZvciAiaXRlcihkLmtleXMoKSkiLlxuXG4gICBjbGVhcigpXG5cbiAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgZGljdGlvbmFyeS5cblxuICAgY29weSgpXG5cbiAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGljdGlvbmFyeS5cblxuICAgY2xhc3NtZXRob2QgZnJvbWtleXMoc2VxWywgdmFsdWVdKVxuXG4gICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSAqc2VxKiBhbmQgdmFsdWVzIHNldCB0b1xuICAgICAgKnZhbHVlKi5cblxuICAgICAgImZyb21rZXlzKCkiIGlzIGEgY2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyBkaWN0aW9uYXJ5LlxuICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byAiTm9uZSIuXG5cbiAgIGdldChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgKmtleSogaWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIGVsc2VcbiAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gIk5vbmUiLCBzb1xuICAgICAgdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSAiS2V5RXJyb3IiLlxuXG4gICBpdGVtcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGl0ZW1zICgiKGtleSwgdmFsdWUpIlxuICAgICAgcGFpcnMpLiBTZWUgdGhlICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIGtleXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBrZXlzLiAgU2VlIHRoZVxuICAgICAgKmRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzKi5cblxuICAgcG9wKGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLFxuICAgICAgZWxzZSByZXR1cm4gKmRlZmF1bHQqLiAgSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiBhbmQgKmtleSogaXNcbiAgICAgIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgYSAiS2V5RXJyb3IiIGlzIHJhaXNlZC5cblxuICAgcG9waXRlbSgpXG5cbiAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSAiKGtleSwgdmFsdWUpIiBwYWlyIGZyb20gdGhlXG4gICAgICBkaWN0aW9uYXJ5LlxuXG4gICAgICAicG9waXRlbSgpIiBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYVxuICAgICAgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyBlbXB0eSwgY2FsbGluZyAicG9waXRlbSgpIiByYWlzZXMgYSAiS2V5RXJyb3IiLlxuXG4gICBzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0cyB2YWx1ZS4gIElmIG5vdCwgaW5zZXJ0XG4gICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgKmRlZmF1bHQqXG4gICAgICBkZWZhdWx0cyB0byAiTm9uZSIuXG5cbiAgIHVwZGF0ZShbb3RoZXJdKVxuXG4gICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gKm90aGVyKixcbiAgICAgIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMuICBSZXR1cm4gIk5vbmUiLlxuXG4gICAgICAidXBkYXRlKCkiIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgZGljdGlvbmFyeSBvYmplY3Qgb3IgYW5cbiAgICAgIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yIG90aGVyIGl0ZXJhYmxlcyBvZlxuICAgICAgbGVuZ3RoIHR3bykuICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOiAiZC51cGRhdGUocmVkPTEsXG4gICAgICBibHVlPTIpIi5cblxuICAgdmFsdWVzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgdmFsdWVzLiAgU2VlIHRoZVxuICAgICAgKmRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzKi5cblxuICAgRGljdGlvbmFyaWVzIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSBzYW1lICIoa2V5LFxuICAgdmFsdWUpIiBwYWlycy4gT3JkZXIgY29tcGFyaXNvbnMgKFwnPFwnLCBcJzw9XCcsIFwnPj1cJywgXCc+XCcpIHJhaXNlXG4gICAiVHlwZUVycm9yIi5cblxuU2VlIGFsc286ICJ0eXBlcy5NYXBwaW5nUHJveHlUeXBlIiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSByZWFkLW9ubHlcbiAgdmlldyBvZiBhICJkaWN0Ii5cblxuXG5EaWN0aW9uYXJ5IHZpZXcgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgImRpY3Qua2V5cygpIiwgImRpY3QudmFsdWVzKCkiIGFuZFxuImRpY3QuaXRlbXMoKSIgYXJlICp2aWV3IG9iamVjdHMqLiAgVGhleSBwcm92aWRlIGEgZHluYW1pYyB2aWV3IG9uIHRoZVxuZGljdGlvbmFyeVwncyBlbnRyaWVzLCB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIGRpY3Rpb25hcnkgY2hhbmdlcyxcbnRoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuXG5cbkRpY3Rpb25hcnkgdmlld3MgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgdG8geWllbGQgdGhlaXIgcmVzcGVjdGl2ZSBkYXRhLFxuYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czpcblxubGVuKGRpY3R2aWV3KVxuXG4gICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5LlxuXG5pdGVyKGRpY3R2aWV3KVxuXG4gICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cywgdmFsdWVzIG9yIGl0ZW1zIChyZXByZXNlbnRlZCBhc1xuICAgdHVwbGVzIG9mICIoa2V5LCB2YWx1ZSkiKSBpbiB0aGUgZGljdGlvbmFyeS5cblxuICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIGFuIGFyYml0cmFyeSBvcmRlciB3aGljaCBpc1xuICAgbm9uLXJhbmRvbSwgdmFyaWVzIGFjcm9zcyBQeXRob24gaW1wbGVtZW50YXRpb25zLCBhbmQgZGVwZW5kcyBvblxuICAgdGhlIGRpY3Rpb25hcnlcJ3MgaGlzdG9yeSBvZiBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuIElmIGtleXMsXG4gICB2YWx1ZXMgYW5kIGl0ZW1zIHZpZXdzIGFyZSBpdGVyYXRlZCBvdmVyIHdpdGggbm8gaW50ZXJ2ZW5pbmdcbiAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBvcmRlciBvZiBpdGVtcyB3aWxsIGRpcmVjdGx5XG4gICBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mICIodmFsdWUsIGtleSkiIHBhaXJzIHVzaW5nXG4gICAiemlwKCkiOiAicGFpcnMgPSB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpIi4gIEFub3RoZXIgd2F5IHRvXG4gICBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyAicGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW4gZC5pdGVtcygpXSIuXG5cbiAgIEl0ZXJhdGluZyB2aWV3cyB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeVxuICAgbWF5IHJhaXNlIGEgIlJ1bnRpbWVFcnJvciIgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMuXG5cbnggaW4gZGljdHZpZXdcblxuICAgUmV0dXJuICJUcnVlIiBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeVwncyBrZXlzLCB2YWx1ZXNcbiAgIG9yIGl0ZW1zIChpbiB0aGUgbGF0dGVyIGNhc2UsICp4KiBzaG91bGQgYmUgYSAiKGtleSwgdmFsdWUpIlxuICAgdHVwbGUpLlxuXG5LZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kIGhhc2hhYmxlLlxuSWYgYWxsIHZhbHVlcyBhcmUgaGFzaGFibGUsIHNvIHRoYXQgIihrZXksIHZhbHVlKSIgcGFpcnMgYXJlIHVuaXF1ZVxuYW5kIGhhc2hhYmxlLCB0aGVuIHRoZSBpdGVtcyB2aWV3IGlzIGFsc28gc2V0LWxpa2UuICAoVmFsdWVzIHZpZXdzIGFyZVxubm90IHRyZWF0ZWQgYXMgc2V0LWxpa2Ugc2luY2UgdGhlIGVudHJpZXMgYXJlIGdlbmVyYWxseSBub3QgdW5pcXVlLilcbkZvciBzZXQtbGlrZSB2aWV3cywgYWxsIG9mIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIHRoZSBhYnN0cmFjdFxuYmFzZSBjbGFzcyAiY29sbGVjdGlvbnMuYWJjLlNldCIgYXJlIGF2YWlsYWJsZSAoZm9yIGV4YW1wbGUsICI9PSIsXG4iPCIsIG9yICJeIikuXG5cbkFuIGV4YW1wbGUgb2YgZGljdGlvbmFyeSB2aWV3IHVzYWdlOlxuXG4gICA+Pj4gZGlzaGVzID0ge1wnZWdnc1wnOiAyLCBcJ3NhdXNhZ2VcJzogMSwgXCdiYWNvblwnOiAxLCBcJ3NwYW1cJzogNTAwfVxuICAgPj4+IGtleXMgPSBkaXNoZXMua2V5cygpXG4gICA+Pj4gdmFsdWVzID0gZGlzaGVzLnZhbHVlcygpXG5cbiAgID4+PiAjIGl0ZXJhdGlvblxuICAgPj4+IG4gPSAwXG4gICA+Pj4gZm9yIHZhbCBpbiB2YWx1ZXM6XG4gICAuLi4gICAgIG4gKz0gdmFsXG4gICA+Pj4gcHJpbnQobilcbiAgIDUwNFxuXG4gICA+Pj4gIyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIHNhbWUgb3JkZXJcbiAgID4+PiBsaXN0KGtleXMpXG4gICBbXCdlZ2dzXCcsIFwnYmFjb25cJywgXCdzYXVzYWdlXCcsIFwnc3BhbVwnXVxuICAgPj4+IGxpc3QodmFsdWVzKVxuICAgWzIsIDEsIDEsIDUwMF1cblxuICAgPj4+ICMgdmlldyBvYmplY3RzIGFyZSBkeW5hbWljIGFuZCByZWZsZWN0IGRpY3QgY2hhbmdlc1xuICAgPj4+IGRlbCBkaXNoZXNbXCdlZ2dzXCddXG4gICA+Pj4gZGVsIGRpc2hlc1tcJ3NhdXNhZ2VcJ11cbiAgID4+PiBsaXN0KGtleXMpXG4gICBbXCdzcGFtXCcsIFwnYmFjb25cJ11cblxuICAgPj4+ICMgc2V0IG9wZXJhdGlvbnNcbiAgID4+PiBrZXlzICYge1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2FsYWRcJ31cbiAgIHtcJ2JhY29uXCd9XG4gICA+Pj4ga2V5cyBeIHtcJ3NhdXNhZ2VcJywgXCdqdWljZVwnfVxuICAge1wnanVpY2VcJywgXCdzYXVzYWdlXCcsIFwnYmFjb25cJywgXCdzcGFtXCd9XG4nLAotICd0eXBlc21ldGhvZHMnOiB1J1xuTWV0aG9kc1xuKioqKioqKlxuXG5NZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbm90YXRpb24uXG5UaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgImFwcGVuZCgpIiBvbiBsaXN0cylcbmFuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2RzLiAgQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkIHdpdGggdGhlXG50eXBlcyB0aGF0IHN1cHBvcnQgdGhlbS5cblxuSWYgeW91IGFjY2VzcyBhIG1ldGhvZCAoYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgY2xhc3MgbmFtZXNwYWNlKVxudGhyb3VnaCBhbiBpbnN0YW5jZSwgeW91IGdldCBhIHNwZWNpYWwgb2JqZWN0OiBhICpib3VuZCBtZXRob2QqIChhbHNvXG5jYWxsZWQgKmluc3RhbmNlIG1ldGhvZCopIG9iamVjdC4gV2hlbiBjYWxsZWQsIGl0IHdpbGwgYWRkIHRoZSAic2VsZiJcbmFyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LiAgQm91bmQgbWV0aG9kcyBoYXZlIHR3byBzcGVjaWFsIHJlYWQtXG5vbmx5IGF0dHJpYnV0ZXM6ICJtLl9fc2VsZl9fIiBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Rcbm9wZXJhdGVzLCBhbmQgIm0uX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZC5cbkNhbGxpbmcgIm0oYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIgaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvXG5jYWxsaW5nICJtLl9fZnVuY19fKG0uX19zZWxmX18sIGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiLlxuXG5MaWtlIGZ1bmN0aW9uIG9iamVjdHMsIGJvdW5kIG1ldGhvZCBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZyBhcmJpdHJhcnlcbmF0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIG9uXG50aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKCJtZXRoLl9fZnVuY19fIiksIHNldHRpbmcgbWV0aG9kXG5hdHRyaWJ1dGVzIG9uIGJvdW5kIG1ldGhvZHMgaXMgZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gc2V0IGFuXG5hdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhbiAiQXR0cmlidXRlRXJyb3IiIGJlaW5nIHJhaXNlZC4gIEluXG5vcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLCB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCBvbiB0aGVcbnVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OlxuXG4gICA+Pj4gY2xhc3MgQzpcbiAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKTpcbiAgIC4uLiAgICAgICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLm1ldGhvZC53aG9hbWkgPSBcJ215IG5hbWUgaXMgbWV0aG9kXCcgICMgY2FuXCd0IHNldCBvbiB0aGUgbWV0aG9kXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBBdHRyaWJ1dGVFcnJvcjogXCdtZXRob2RcJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSBcJ3dob2FtaVwnXG4gICA+Pj4gYy5tZXRob2QuX19mdW5jX18ud2hvYW1pID0gXCdteSBuYW1lIGlzIG1ldGhvZFwnXG4gICA+Pj4gYy5tZXRob2Qud2hvYW1pXG4gICBcJ215IG5hbWUgaXMgbWV0aG9kXCdcblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKLSAndHlwZXNtb2R1bGVzJzogdSdcbk1vZHVsZXNcbioqKioqKipcblxuVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczogIm0ubmFtZSIsXG53aGVyZSAqbSogaXMgYSBtb2R1bGUgYW5kICpuYW1lKiBhY2Nlc3NlcyBhIG5hbWUgZGVmaW5lZCBpbiAqbSpcJ3NcbnN5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGUgdGhhdCB0aGVcbiJpbXBvcnQiIHN0YXRlbWVudCBpcyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBhbiBvcGVyYXRpb24gb24gYSBtb2R1bGVcbm9iamVjdDsgImltcG9ydCBmb28iIGRvZXMgbm90IHJlcXVpcmUgYSBtb2R1bGUgb2JqZWN0IG5hbWVkICpmb28qIHRvXG5leGlzdCwgcmF0aGVyIGl0IHJlcXVpcmVzIGFuIChleHRlcm5hbCkgKmRlZmluaXRpb24qIGZvciBhIG1vZHVsZVxubmFtZWQgKmZvbyogc29tZXdoZXJlLilcblxuQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgIl9fZGljdF9fIi4gVGhpcyBpcyB0aGVcbmRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlXCdzIHN5bWJvbCB0YWJsZS4gTW9kaWZ5aW5nIHRoaXNcbmRpY3Rpb25hcnkgd2lsbCBhY3R1YWxseSBjaGFuZ2UgdGhlIG1vZHVsZVwncyBzeW1ib2wgdGFibGUsIGJ1dCBkaXJlY3RcbmFzc2lnbm1lbnQgdG8gdGhlICJfX2RpY3RfXyIgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91IGNhbiB3cml0ZVxuIm0uX19kaWN0X19bXCdhXCddID0gMSIsIHdoaWNoIGRlZmluZXMgIm0uYSIgdG8gYmUgIjEiLCBidXQgeW91IGNhblwndFxud3JpdGUgIm0uX19kaWN0X18gPSB7fSIpLiAgTW9kaWZ5aW5nICJfX2RpY3RfXyIgZGlyZWN0bHkgaXMgbm90XG5yZWNvbW1lbmRlZC5cblxuTW9kdWxlcyBidWlsdCBpbnRvIHRoZSBpbnRlcnByZXRlciBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICI8bW9kdWxlXG5cJ3N5c1wnIChidWlsdC1pbik+Ii4gIElmIGxvYWRlZCBmcm9tIGEgZmlsZSwgdGhleSBhcmUgd3JpdHRlbiBhc1xuIjxtb2R1bGUgXCdvc1wnIGZyb20gXCcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljXCc+Ii5cbicsCi0gJ3R5cGVzc2VxJzogdSdcblNlcXVlbmNlIFR5cGVzIC0tLSAibGlzdCIsICJ0dXBsZSIsICJyYW5nZSJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIHRocmVlIGJhc2ljIHNlcXVlbmNlIHR5cGVzOiBsaXN0cywgdHVwbGVzLCBhbmQgcmFuZ2Vcbm9iamVjdHMuIEFkZGl0aW9uYWwgc2VxdWVuY2UgdHlwZXMgdGFpbG9yZWQgZm9yIHByb2Nlc3Npbmcgb2YgKmJpbmFyeVxuZGF0YSogYW5kICp0ZXh0IHN0cmluZ3MqIGFyZSBkZXNjcmliZWQgaW4gZGVkaWNhdGVkIHNlY3Rpb25zLlxuXG5cbkNvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCBzZXF1ZW5jZVxudHlwZXMsIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDXG5pcyBwcm92aWRlZCB0byBtYWtlIGl0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnNcbm9uIGN1c3RvbSBzZXF1ZW5jZSB0eXBlcy5cblxuVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5LlxuSW4gdGhlIHRhYmxlLCAqcyogYW5kICp0KiBhcmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUsICpuKiwgKmkqLFxuKmoqIGFuZCAqayogYXJlIGludGVnZXJzIGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueVxudHlwZSBhbmQgdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqLlxuXG5UaGUgImluIiBhbmQgIm5vdCBpbiIgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXRpZXMgYXMgdGhlXG5jb21wYXJpc29uIG9wZXJhdGlvbnMuIFRoZSAiKyIgKGNvbmNhdGVuYXRpb24pIGFuZCAiKiIgKHJlcGV0aXRpb24pXG5vcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY1xub3BlcmF0aW9ucy5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xufCAieCBpbiBzIiAgICAgICAgICAgICAgICAgICB8ICJUcnVlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJGYWxzZSIgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAieCBub3QgaW4gcyIgICAgICAgICAgICAgICB8ICJGYWxzZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJUcnVlIiAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicyArIHQiICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb25jYXRlbmF0aW9uIG9mICpzKiBhbmQgKnQqIHwgKDYpKDcpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMgKiBuIiBvciAibiAqIHMiICAgICAgICAgfCBlcXVpdmFsZW50IHRvIGFkZGluZyAqcyogdG8gICAgICB8ICgyKSg3KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0c2VsZiAqbiogdGltZXMgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaV0iICAgICAgICAgICAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICB8ICgzKSAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgfCAoMykoNCkgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2l0aCBzdGVwICprKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibGVuKHMpIiAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgIm1pbihzKSIgICAgICAgICAgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJtYXgocykiICAgICAgICAgICAgICAgICAgIHwgbGFyZ2VzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicy5pbmRleCh4WywgaVssIGpdXSkiICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHwgKDgpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAoYXQgb3IgYWZ0ZXIgaW5kZXggICAgfCAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqaSogYW5kIGJlZm9yZSBpbmRleCAqaiopICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzLmNvdW50KHgpIiAgICAgICAgICAgICAgIHwgdG90YWwgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICAgfCAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG5cblNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluIHBhcnRpY3VsYXIsXG50dXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSBieSBjb21wYXJpbmdcbmNvcnJlc3BvbmRpbmcgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBldmVyeVxuZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbnR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKEZvciBmdWxsIGRldGFpbHMgc2VlICpDb21wYXJpc29ucyogaW5cbnRoZSBsYW5ndWFnZSByZWZlcmVuY2UuKVxuXG5Ob3RlczpcblxuMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3Igc2ltcGxlXG4gICBjb250YWlubWVudCB0ZXN0aW5nIGluIHRoZSBnZW5lcmFsIGNhc2UsIHNvbWUgc3BlY2lhbGlzZWQgc2VxdWVuY2VzXG4gICAoc3VjaCBhcyAic3RyIiwgImJ5dGVzIiBhbmQgImJ5dGVhcnJheSIpIGFsc28gdXNlIHRoZW0gZm9yXG4gICBzdWJzZXF1ZW5jZSB0ZXN0aW5nOlxuXG4gICAgICA+Pj4gImdnIiBpbiAiZWdncyJcbiAgICAgIFRydWVcblxuMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gIjAiIGFyZSB0cmVhdGVkIGFzICIwIiAod2hpY2ggeWllbGRzIGFuXG4gICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIHRoYXQgaXRlbXMgaW4gdGhlXG4gICBzZXF1ZW5jZSAqcyogYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGUgdGltZXMuXG4gICBUaGlzIG9mdGVuIGhhdW50cyBuZXcgUHl0aG9uIHByb2dyYW1tZXJzOyBjb25zaWRlcjpcblxuICAgICAgPj4+IGxpc3RzID0gW1tdXSAqIDNcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1tdLCBbXSwgW11dXG4gICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbM10sIFszXSwgWzNdXVxuXG4gICBXaGF0IGhhcyBoYXBwZW5lZCBpcyB0aGF0ICJbW11dIiBpcyBhIG9uZS1lbGVtZW50IGxpc3QgY29udGFpbmluZ1xuICAgYW4gZW1wdHkgbGlzdCwgc28gYWxsIHRocmVlIGVsZW1lbnRzIG9mICJbW11dICogMyIgYXJlIHJlZmVyZW5jZXNcbiAgIHRvIHRoaXMgc2luZ2xlIGVtcHR5IGxpc3QuICBNb2RpZnlpbmcgYW55IG9mIHRoZSBlbGVtZW50cyBvZlxuICAgImxpc3RzIiBtb2RpZmllcyB0aGlzIHNpbmdsZSBsaXN0LiBZb3UgY2FuIGNyZWF0ZSBhIGxpc3Qgb2ZcbiAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheTpcblxuICAgICAgPj4+IGxpc3RzID0gW1tdIGZvciBpIGluIHJhbmdlKDMpXVxuICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuICAgICAgPj4+IGxpc3RzWzFdLmFwcGVuZCg1KVxuICAgICAgPj4+IGxpc3RzWzJdLmFwcGVuZCg3KVxuICAgICAgPj4+IGxpc3RzXG4gICAgICBbWzNdLCBbNV0sIFs3XV1cblxuICAgRnVydGhlciBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEZBUSBlbnRyeSAqSG93IGRvIEkgY3JlYXRlXG4gICBhIG11bHRpZGltZW5zaW9uYWwgbGlzdD8qLlxuXG4zLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZlxuICAgdGhlIHN0cmluZzogImxlbihzKSArIGkiIG9yICJsZW4ocykgKyBqIiBpcyBzdWJzdGl0dXRlZC4gIEJ1dCBub3RlXG4gICB0aGF0ICItMCIgaXMgc3RpbGwgIjAiLlxuXG40LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyBkZWZpbmVkIGFzIHRoZSBzZXF1ZW5jZSBvZlxuICAgaXRlbXMgd2l0aCBpbmRleCAqayogc3VjaCB0aGF0ICJpIDw9IGsgPCBqIi4gIElmICppKiBvciAqaiogaXNcbiAgIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlICJsZW4ocykiLiAgSWYgKmkqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLFxuICAgdXNlICIwIi4gIElmICpqKiBpcyBvbWl0dGVkIG9yICJOb25lIiwgdXNlICJsZW4ocykiLiAgSWYgKmkqIGlzXG4gICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKmoqLCB0aGUgc2xpY2UgaXMgZW1wdHkuXG5cbjUuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIHdpdGggc3RlcCAqayogaXMgZGVmaW5lZCBhcyB0aGVcbiAgIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggICJ4ID0gaSArIG4qayIgc3VjaCB0aGF0ICIwIDw9IG4gPFxuICAgKGotaSkvayIuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlICJpIiwgImkrayIsICJpKzIqayIsXG4gICAiaSszKmsiIGFuZCBzbyBvbiwgc3RvcHBpbmcgd2hlbiAqaiogaXMgcmVhY2hlZCAoYnV0IG5ldmVyXG4gICBpbmNsdWRpbmcgKmoqKS4gIElmICppKiBvciAqaiogaXMgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2VcbiAgICJsZW4ocykiLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciAiTm9uZSIsIHRoZXkgYmVjb21lICJlbmQiXG4gICB2YWx1ZXMgKHdoaWNoIGVuZCBkZXBlbmRzIG9uIHRoZSBzaWduIG9mICprKikuICBOb3RlLCAqayogY2Fubm90IGJlXG4gICB6ZXJvLiBJZiAqayogaXMgIk5vbmUiLCBpdCBpcyB0cmVhdGVkIGxpa2UgIjEiLlxuXG42LiBDb25jYXRlbmF0aW5nIGltbXV0YWJsZSBzZXF1ZW5jZXMgYWx3YXlzIHJlc3VsdHMgaW4gYSBuZXdcbiAgIG9iamVjdC4gVGhpcyBtZWFucyB0aGF0IGJ1aWxkaW5nIHVwIGEgc2VxdWVuY2UgYnkgcmVwZWF0ZWRcbiAgIGNvbmNhdGVuYXRpb24gd2lsbCBoYXZlIGEgcXVhZHJhdGljIHJ1bnRpbWUgY29zdCBpbiB0aGUgdG90YWxcbiAgIHNlcXVlbmNlIGxlbmd0aC4gVG8gZ2V0IGEgbGluZWFyIHJ1bnRpbWUgY29zdCwgeW91IG11c3Qgc3dpdGNoIHRvXG4gICBvbmUgb2YgdGhlIGFsdGVybmF0aXZlcyBiZWxvdzpcblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJzdHIiIG9iamVjdHMsIHlvdSBjYW4gYnVpbGQgYSBsaXN0IGFuZCB1c2VcbiAgICAgInN0ci5qb2luKCkiIGF0IHRoZSBlbmQgb3IgZWxzZSB3cml0ZSB0byBhbiAiaW8uU3RyaW5nSU8iXG4gICAgIGluc3RhbmNlIGFuZCByZXRyaWV2ZSBpdHMgdmFsdWUgd2hlbiBjb21wbGV0ZVxuXG4gICAqIGlmIGNvbmNhdGVuYXRpbmcgImJ5dGVzIiBvYmplY3RzLCB5b3UgY2FuIHNpbWlsYXJseSB1c2VcbiAgICAgImJ5dGVzLmpvaW4oKSIgb3IgImlvLkJ5dGVzSU8iLCBvciB5b3UgY2FuIGRvIGluLXBsYWNlXG4gICAgIGNvbmNhdGVuYXRpb24gd2l0aCBhICJieXRlYXJyYXkiIG9iamVjdC4gICJieXRlYXJyYXkiIG9iamVjdHMgYXJlXG4gICAgIG11dGFibGUgYW5kIGhhdmUgYW4gZWZmaWNpZW50IG92ZXJhbGxvY2F0aW9uIG1lY2hhbmlzbVxuXG4gICAqIGlmIGNvbmNhdGVuYXRpbmcgInR1cGxlIiBvYmplY3RzLCBleHRlbmQgYSAibGlzdCIgaW5zdGVhZFxuXG4gICAqIGZvciBvdGhlciB0eXBlcywgaW52ZXN0aWdhdGUgdGhlIHJlbGV2YW50IGNsYXNzIGRvY3VtZW50YXRpb25cblxuNy4gU29tZSBzZXF1ZW5jZSB0eXBlcyAoc3VjaCBhcyAicmFuZ2UiKSBvbmx5IHN1cHBvcnQgaXRlbVxuICAgc2VxdWVuY2VzIHRoYXQgZm9sbG93IHNwZWNpZmljIHBhdHRlcm5zLCBhbmQgaGVuY2UgZG9uXCd0IHN1cHBvcnRcbiAgIHNlcXVlbmNlIGNvbmNhdGVuYXRpb24gb3IgcmVwZXRpdGlvbi5cblxuOC4gImluZGV4IiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouIFdoZW5cbiAgIHN1cHBvcnRlZCwgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBpbmRleCBtZXRob2QgYWxsb3dcbiAgIGVmZmljaWVudCBzZWFyY2hpbmcgb2Ygc3Vic2VjdGlvbnMgb2YgdGhlIHNlcXVlbmNlLiBQYXNzaW5nIHRoZVxuICAgZXh0cmEgYXJndW1lbnRzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byB1c2luZyAic1tpOmpdLmluZGV4KHgpIixcbiAgIG9ubHkgd2l0aG91dCBjb3B5aW5nIGFueSBkYXRhIGFuZCB3aXRoIHRoZSByZXR1cm5lZCBpbmRleCBiZWluZ1xuICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZXF1ZW5jZSByYXRoZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlXG4gICBzbGljZS5cblxuXG5JbW11dGFibGUgU2VxdWVuY2UgVHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb25seSBvcGVyYXRpb24gdGhhdCBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXMgZ2VuZXJhbGx5IGltcGxlbWVudFxudGhhdCBpcyBub3QgYWxzbyBpbXBsZW1lbnRlZCBieSBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGlzIHN1cHBvcnQgZm9yXG50aGUgImhhc2goKSIgYnVpbHQtaW4uXG5cblRoaXMgc3VwcG9ydCBhbGxvd3MgaW1tdXRhYmxlIHNlcXVlbmNlcywgc3VjaCBhcyAidHVwbGUiIGluc3RhbmNlcywgdG9cbmJlIHVzZWQgYXMgImRpY3QiIGtleXMgYW5kIHN0b3JlZCBpbiAic2V0IiBhbmQgImZyb3plbnNldCIgaW5zdGFuY2VzLlxuXG5BdHRlbXB0aW5nIHRvIGhhc2ggYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgdW5oYXNoYWJsZVxudmFsdWVzIHdpbGwgcmVzdWx0IGluICJUeXBlRXJyb3IiLlxuXG5cbk11dGFibGUgU2VxdWVuY2UgVHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlXG50eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gbWFrZVxuaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gc2VxdWVuY2VcbnR5cGVzLlxuXG5JbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogaXMgYW55XG5pdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55IHR5cGUgYW5kXG52YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAiYnl0ZWFycmF5IiBvbmx5XG5hY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAyNTUiKS5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCAic1tpXSA9IHgiICAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgInNbaTpqXSA9IFtdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAic1tpOmo6a10gPSB0IiAgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgInNbaTpqOmtdIiBhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgZW5kIG9mIHRoZSAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlIChzYW1lIGFzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSBbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNsZWFyKCkiICAgICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gInMiIChzYW1lIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCBzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgInMiICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmV4dGVuZCh0KSIgb3IgInMgKz0gdCIgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9IHQiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogdGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleCBnaXZlbiBieSAqaSogKHNhbWUgYXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSBbeF0iKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgKmkqIGFuZCAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFsc28gcmVtb3ZlcyBpdCBmcm9tICpzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZW1vdmUoeCkiICAgICAgICAgICAgICAgICAgfCByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gZnJvbSAqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoZXJlICJzW2ldID09IHgiICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5yZXZlcnNlKCkiICAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqIGluICAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIHJlcGxhY2luZy5cblxuMi4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byAiLTEiLCBzbyB0aGF0IGJ5IGRlZmF1bHRcbiAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi5cblxuNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yXG4gICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgdXNlcnNcbiAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgcmV2ZXJzZWRcbiAgIHNlcXVlbmNlLlxuXG41LiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIGFyZSBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGVcbiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uXCd0IHN1cHBvcnQgc2xpY2luZ1xuICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjM6ICJjbGVhcigpIiBhbmQgImNvcHkoKSIgbWV0aG9kcy5cblxuNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4gICAiX19pbmRleF9fKCkiLiAgWmVybyBhbmQgbmVnYXRpdmUgdmFsdWVzIG9mICpuKiBjbGVhciB0aGUgc2VxdWVuY2UuXG4gICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgbXVsdGlwbGVcbiAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgKkNvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zKi5cblxuXG5MaXN0c1xuPT09PT1cblxuTGlzdHMgYXJlIG11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyBvZlxuaG9tb2dlbmVvdXMgaXRlbXMgKHdoZXJlIHRoZSBwcmVjaXNlIGRlZ3JlZSBvZiBzaW1pbGFyaXR5IHdpbGwgdmFyeSBieVxuYXBwbGljYXRpb24pLlxuXG5jbGFzcyBjbGFzcyBsaXN0KFtpdGVyYWJsZV0pXG5cbiAgIExpc3RzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBzZXZlcmFsIHdheXM6XG5cbiAgICogVXNpbmcgYSBwYWlyIG9mIHNxdWFyZSBicmFja2V0cyB0byBkZW5vdGUgdGhlIGVtcHR5IGxpc3Q6ICJbXSJcblxuICAgKiBVc2luZyBzcXVhcmUgYnJhY2tldHMsIHNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJbYV0iLFxuICAgICAiW2EsIGIsIGNdIlxuXG4gICAqIFVzaW5nIGEgbGlzdCBjb21wcmVoZW5zaW9uOiAiW3ggZm9yIHggaW4gaXRlcmFibGVdIlxuXG4gICAqIFVzaW5nIHRoZSB0eXBlIGNvbnN0cnVjdG9yOiAibGlzdCgpIiBvciAibGlzdChpdGVyYWJsZSkiXG5cbiAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSBsaXN0IHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gdGhlXG4gICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSpcJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgYVxuICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvclxuICAgb2JqZWN0LiAgSWYgKml0ZXJhYmxlKiBpcyBhbHJlYWR5IGEgbGlzdCwgYSBjb3B5IGlzIG1hZGUgYW5kXG4gICByZXR1cm5lZCwgc2ltaWxhciB0byAiaXRlcmFibGVbOl0iLiBGb3IgZXhhbXBsZSwgImxpc3QoXCdhYmNcJykiXG4gICByZXR1cm5zICJbXCdhXCcsIFwnYlwnLCBcJ2NcJ10iIGFuZCAibGlzdCggKDEsIDIsIDMpICkiIHJldHVybnMgIlsxLCAyLFxuICAgM10iLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHlcbiAgIGxpc3QsICJbXSIuXG5cbiAgIE1hbnkgb3RoZXIgb3BlcmF0aW9ucyBhbHNvIHByb2R1Y2UgbGlzdHMsIGluY2x1ZGluZyB0aGUgInNvcnRlZCgpIlxuICAgYnVpbHQtaW4uXG5cbiAgIExpc3RzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIGFuZCAqbXV0YWJsZSogc2VxdWVuY2VcbiAgIG9wZXJhdGlvbnMuIExpc3RzIGFsc28gcHJvdmlkZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kOlxuXG4gICBzb3J0KCosIGtleT1Ob25lLCByZXZlcnNlPU5vbmUpXG5cbiAgICAgIFRoaXMgbWV0aG9kIHNvcnRzIHRoZSBsaXN0IGluIHBsYWNlLCB1c2luZyBvbmx5ICI8IiBjb21wYXJpc29uc1xuICAgICAgYmV0d2VlbiBpdGVtcy4gRXhjZXB0aW9ucyBhcmUgbm90IHN1cHByZXNzZWQgLSBpZiBhbnkgY29tcGFyaXNvblxuICAgICAgb3BlcmF0aW9ucyBmYWlsLCB0aGUgZW50aXJlIHNvcnQgb3BlcmF0aW9uIHdpbGwgZmFpbCAoYW5kIHRoZVxuICAgICAgbGlzdCB3aWxsIGxpa2VseSBiZSBsZWZ0IGluIGEgcGFydGlhbGx5IG1vZGlmaWVkIHN0YXRlKS5cblxuICAgICAgInNvcnQoKSIgYWNjZXB0cyB0d28gYXJndW1lbnRzIHRoYXQgY2FuIG9ubHkgYmUgcGFzc2VkIGJ5XG4gICAgICBrZXl3b3JkICgqa2V5d29yZC1vbmx5IGFyZ3VtZW50cyopOlxuXG4gICAgICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvXG4gICAgICBleHRyYWN0IGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudCAoZm9yIGV4YW1wbGUsXG4gICAgICAia2V5PXN0ci5sb3dlciIpLiBUaGUga2V5IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBpdGVtIGluIHRoZSBsaXN0XG4gICAgICBpcyBjYWxjdWxhdGVkIG9uY2UgYW5kIHRoZW4gdXNlZCBmb3IgdGhlIGVudGlyZSBzb3J0aW5nIHByb2Nlc3MuXG4gICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAiTm9uZSIgbWVhbnMgdGhhdCBsaXN0IGl0ZW1zIGFyZSBzb3J0ZWRcbiAgICAgIGRpcmVjdGx5IHdpdGhvdXQgY2FsY3VsYXRpbmcgYSBzZXBhcmF0ZSBrZXkgdmFsdWUuXG5cbiAgICAgIFRoZSAiZnVuY3Rvb2xzLmNtcF90b19rZXkoKSIgdXRpbGl0eSBpcyBhdmFpbGFibGUgdG8gY29udmVydCBhXG4gICAgICAyLnggc3R5bGUgKmNtcCogZnVuY3Rpb24gdG8gYSAqa2V5KiBmdW5jdGlvbi5cblxuICAgICAgKnJldmVyc2UqIGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byAiVHJ1ZSIsIHRoZW4gdGhlIGxpc3RcbiAgICAgIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYXMgaWYgZWFjaCBjb21wYXJpc29uIHdlcmUgcmV2ZXJzZWQuXG5cbiAgICAgIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3IgZWNvbm9teSBvZiBzcGFjZVxuICAgICAgd2hlbiBzb3J0aW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgdXNlcnMgdGhhdCBpdCBvcGVyYXRlc1xuICAgICAgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc29ydGVkIHNlcXVlbmNlICh1c2VcbiAgICAgICJzb3J0ZWQoKSIgdG8gZXhwbGljaXRseSByZXF1ZXN0IGEgbmV3IHNvcnRlZCBsaXN0IGluc3RhbmNlKS5cblxuICAgICAgVGhlICJzb3J0KCkiIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCBpc1xuICAgICAgc3RhYmxlIGlmIGl0IGd1YXJhbnRlZXMgbm90IHRvIGNoYW5nZSB0aGUgcmVsYXRpdmUgb3JkZXIgb2ZcbiAgICAgIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsIGZvciBzb3J0aW5nIGluXG4gICAgICBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsIHRoZW4gYnkgc2FsYXJ5XG4gICAgICBncmFkZSkuXG5cbiAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCxcbiAgICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXNcbiAgICAgIHVuZGVmaW5lZC4gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiBtYWtlcyB0aGUgbGlzdCBhcHBlYXJcbiAgICAgIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgIlZhbHVlRXJyb3IiIGlmIGl0IGNhbiBkZXRlY3RcbiAgICAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuXG5cblR1cGxlc1xuPT09PT09XG5cblR1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2ZcbmhldGVyb2dlbmVvdXMgZGF0YSAoc3VjaCBhcyB0aGUgMi10dXBsZXMgcHJvZHVjZWQgYnkgdGhlICJlbnVtZXJhdGUoKSJcbmJ1aWx0LWluKS4gVHVwbGVzIGFyZSBhbHNvIHVzZWQgZm9yIGNhc2VzIHdoZXJlIGFuIGltbXV0YWJsZSBzZXF1ZW5jZVxub2YgaG9tb2dlbmVvdXMgZGF0YSBpcyBuZWVkZWQgKHN1Y2ggYXMgYWxsb3dpbmcgc3RvcmFnZSBpbiBhICJzZXQiIG9yXG4iZGljdCIgaW5zdGFuY2UpLlxuXG5jbGFzcyBjbGFzcyB0dXBsZShbaXRlcmFibGVdKVxuXG4gICBUdXBsZXMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHdheXM6XG5cbiAgICogVXNpbmcgYSBwYWlyIG9mIHBhcmVudGhlc2VzIHRvIGRlbm90ZSB0aGUgZW1wdHkgdHVwbGU6ICIoKSJcblxuICAgKiBVc2luZyBhIHRyYWlsaW5nIGNvbW1hIGZvciBhIHNpbmdsZXRvbiB0dXBsZTogImEsIiBvciAiKGEsKSJcblxuICAgKiBTZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiAiYSwgYiwgYyIgb3IgIihhLCBiLCBjKSJcblxuICAgKiBVc2luZyB0aGUgInR1cGxlKCkiIGJ1aWx0LWluOiAidHVwbGUoKSIgb3IgInR1cGxlKGl0ZXJhYmxlKSJcblxuICAgVGhlIGNvbnN0cnVjdG9yIGJ1aWxkcyBhIHR1cGxlIHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gdGhlXG4gICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSpcJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgYVxuICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiBpdGVyYXRvclxuICAgb2JqZWN0LiAgSWYgKml0ZXJhYmxlKiBpcyBhbHJlYWR5IGEgdHVwbGUsIGl0IGlzIHJldHVybmVkXG4gICB1bmNoYW5nZWQuIEZvciBleGFtcGxlLCAidHVwbGUoXCdhYmNcJykiIHJldHVybnMgIihcJ2FcJywgXCdiXCcsIFwnY1wnKSJcbiAgIGFuZCAidHVwbGUoIFsxLCAyLCAzXSApIiByZXR1cm5zICIoMSwgMiwgMykiLiBJZiBubyBhcmd1bWVudCBpc1xuICAgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IHR1cGxlLCAiKCkiLlxuXG4gICBOb3RlIHRoYXQgaXQgaXMgYWN0dWFsbHkgdGhlIGNvbW1hIHdoaWNoIG1ha2VzIGEgdHVwbGUsIG5vdCB0aGVcbiAgIHBhcmVudGhlc2VzLiBUaGUgcGFyZW50aGVzZXMgYXJlIG9wdGlvbmFsLCBleGNlcHQgaW4gdGhlIGVtcHR5XG4gICB0dXBsZSBjYXNlLCBvciB3aGVuIHRoZXkgYXJlIG5lZWRlZCB0byBhdm9pZCBzeW50YWN0aWMgYW1iaWd1aXR5LlxuICAgRm9yIGV4YW1wbGUsICJmKGEsIGIsIGMpIiBpcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCB0aHJlZSBhcmd1bWVudHMsXG4gICB3aGlsZSAiZigoYSwgYiwgYykpIiBpcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIDMtdHVwbGUgYXMgdGhlIHNvbGVcbiAgIGFyZ3VtZW50LlxuXG4gICBUdXBsZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgKmNvbW1vbiogc2VxdWVuY2Ugb3BlcmF0aW9ucy5cblxuRm9yIGhldGVyb2dlbmVvdXMgY29sbGVjdGlvbnMgb2YgZGF0YSB3aGVyZSBhY2Nlc3MgYnkgbmFtZSBpcyBjbGVhcmVyXG50aGFuIGFjY2VzcyBieSBpbmRleCwgImNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoKSIgbWF5IGJlIGEgbW9yZVxuYXBwcm9wcmlhdGUgY2hvaWNlIHRoYW4gYSBzaW1wbGUgdHVwbGUgb2JqZWN0LlxuXG5cblJhbmdlc1xuPT09PT09XG5cblRoZSAicmFuZ2UiIHR5cGUgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugb2YgbnVtYmVycyBhbmQgaXNcbmNvbW1vbmx5IHVzZWQgZm9yIGxvb3BpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMgaW4gImZvciIgbG9vcHMuXG5cbmNsYXNzIGNsYXNzIHJhbmdlKHN0b3ApXG5jbGFzcyBjbGFzcyByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKVxuXG4gICBUaGUgYXJndW1lbnRzIHRvIHRoZSByYW5nZSBjb25zdHJ1Y3RvciBtdXN0IGJlIGludGVnZXJzIChlaXRoZXJcbiAgIGJ1aWx0LWluICJpbnQiIG9yIGFueSBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoZSAiX19pbmRleF9fIlxuICAgc3BlY2lhbCBtZXRob2QpLiAgSWYgdGhlICpzdGVwKiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0b1xuICAgIjEiLiBJZiB0aGUgKnN0YXJ0KiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAiMCIuIElmXG4gICAqc3RlcCogaXMgemVybywgIlZhbHVlRXJyb3IiIGlzIHJhaXNlZC5cblxuICAgRm9yIGEgcG9zaXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgYSByYW5nZSAiciIgYXJlIGRldGVybWluZWRcbiAgIGJ5IHRoZSBmb3JtdWxhICJyW2ldID0gc3RhcnQgKyBzdGVwKmkiIHdoZXJlICJpID49IDAiIGFuZCAicltpXSA8XG4gICBzdG9wIi5cblxuICAgRm9yIGEgbmVnYXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgdGhlIHJhbmdlIGFyZSBzdGlsbFxuICAgZGV0ZXJtaW5lZCBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiwgYnV0IHRoZVxuICAgY29uc3RyYWludHMgYXJlICJpID49IDAiIGFuZCAicltpXSA+IHN0b3AiLlxuXG4gICBBIHJhbmdlIG9iamVjdCB3aWxsIGJlIGVtcHR5IGlmICJyWzBdIiBkb2VzIG5vdCBtZWV0IHRoZSB2YWx1ZVxuICAgY29uc3RyYWludC4gUmFuZ2VzIGRvIHN1cHBvcnQgbmVnYXRpdmUgaW5kaWNlcywgYnV0IHRoZXNlIGFyZVxuICAgaW50ZXJwcmV0ZWQgYXMgaW5kZXhpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBkZXRlcm1pbmVkIGJ5XG4gICB0aGUgcG9zaXRpdmUgaW5kaWNlcy5cblxuICAgUmFuZ2VzIGNvbnRhaW5pbmcgYWJzb2x1dGUgdmFsdWVzIGxhcmdlciB0aGFuICJzeXMubWF4c2l6ZSIgYXJlXG4gICBwZXJtaXR0ZWQgYnV0IHNvbWUgZmVhdHVyZXMgKHN1Y2ggYXMgImxlbigpIikgbWF5IHJhaXNlXG4gICAiT3ZlcmZsb3dFcnJvciIuXG5cbiAgIFJhbmdlIGV4YW1wbGVzOlxuXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxMCkpXG4gICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDExKSlcbiAgICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIDMwLCA1KSlcbiAgICAgIFswLCA1LCAxMCwgMTUsIDIwLCAyNV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIDEwLCAzKSlcbiAgICAgIFswLCAzLCA2LCA5XVxuICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgLTEwLCAtMSkpXG4gICAgICBbMCwgLTEsIC0yLCAtMywgLTQsIC01LCAtNiwgLTcsIC04LCAtOV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDApKVxuICAgICAgW11cbiAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDApKVxuICAgICAgW11cblxuICAgUmFuZ2VzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMgZXhjZXB0XG4gICBjb25jYXRlbmF0aW9uIGFuZCByZXBldGl0aW9uIChkdWUgdG8gdGhlIGZhY3QgdGhhdCByYW5nZSBvYmplY3RzXG4gICBjYW4gb25seSByZXByZXNlbnQgc2VxdWVuY2VzIHRoYXQgZm9sbG93IGEgc3RyaWN0IHBhdHRlcm4gYW5kXG4gICByZXBldGl0aW9uIGFuZCBjb25jYXRlbmF0aW9uIHdpbGwgdXN1YWxseSB2aW9sYXRlIHRoYXQgcGF0dGVybikuXG5cbiAgIHN0YXJ0XG5cbiAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0YXJ0KiBwYXJhbWV0ZXIgKG9yICIwIiBpZiB0aGUgcGFyYW1ldGVyIHdhc1xuICAgICAgbm90IHN1cHBsaWVkKVxuXG4gICBzdG9wXG5cbiAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0b3AqIHBhcmFtZXRlclxuXG4gICBzdGVwXG5cbiAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0ZXAqIHBhcmFtZXRlciAob3IgIjEiIGlmIHRoZSBwYXJhbWV0ZXIgd2FzXG4gICAgICBub3Qgc3VwcGxpZWQpXG5cblRoZSBhZHZhbnRhZ2Ugb2YgdGhlICJyYW5nZSIgdHlwZSBvdmVyIGEgcmVndWxhciAibGlzdCIgb3IgInR1cGxlIiBpc1xudGhhdCBhICJyYW5nZSIgb2JqZWN0IHdpbGwgYWx3YXlzIHRha2UgdGhlIHNhbWUgKHNtYWxsKSBhbW91bnQgb2Zcbm1lbW9yeSwgbm8gbWF0dGVyIHRoZSBzaXplIG9mIHRoZSByYW5nZSBpdCByZXByZXNlbnRzIChhcyBpdCBvbmx5XG5zdG9yZXMgdGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIHZhbHVlcywgY2FsY3VsYXRpbmcgaW5kaXZpZHVhbFxuaXRlbXMgYW5kIHN1YnJhbmdlcyBhcyBuZWVkZWQpLlxuXG5SYW5nZSBvYmplY3RzIGltcGxlbWVudCB0aGUgImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDLCBhbmRcbnByb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBjb250YWlubWVudCB0ZXN0cywgZWxlbWVudCBpbmRleCBsb29rdXAsXG5zbGljaW5nIGFuZCBzdXBwb3J0IGZvciBuZWdhdGl2ZSBpbmRpY2VzIChzZWUgKlNlcXVlbmNlIFR5cGVzIC0tLVxubGlzdCwgdHVwbGUsIHJhbmdlKik6XG5cbj4+PiByID0gcmFuZ2UoMCwgMjAsIDIpXG4+Pj4gclxucmFuZ2UoMCwgMjAsIDIpXG4+Pj4gMTEgaW4gclxuRmFsc2Vcbj4+PiAxMCBpbiByXG5UcnVlXG4+Pj4gci5pbmRleCgxMClcbjVcbj4+PiByWzVdXG4xMFxuPj4+IHJbOjVdXG5yYW5nZSgwLCAxMCwgMilcbj4+PiByWy0xXVxuMThcblxuVGVzdGluZyByYW5nZSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoICI9PSIgYW5kICIhPSIgY29tcGFyZXMgdGhlbSBhc1xuc2VxdWVuY2VzLiAgVGhhdCBpcywgdHdvIHJhbmdlIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleVxucmVwcmVzZW50IHRoZSBzYW1lIHNlcXVlbmNlIG9mIHZhbHVlcy4gIChOb3RlIHRoYXQgdHdvIHJhbmdlIG9iamVjdHNcbnRoYXQgY29tcGFyZSBlcXVhbCBtaWdodCBoYXZlIGRpZmZlcmVudCAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIlxuYXR0cmlidXRlcywgZm9yIGV4YW1wbGUgInJhbmdlKDApID09IHJhbmdlKDIsIDEsIDMpIiBvciAicmFuZ2UoMCwgMyxcbjIpID09IHJhbmdlKDAsIDQsIDIpIi4pXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEltcGxlbWVudCB0aGUgU2VxdWVuY2UgQUJDLiBTdXBwb3J0IHNsaWNpbmdcbmFuZCBuZWdhdGl2ZSBpbmRpY2VzLiBUZXN0ICJpbnQiIG9iamVjdHMgZm9yIG1lbWJlcnNoaXAgaW4gY29uc3RhbnRcbnRpbWUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgaXRlbXMuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IERlZmluZSBcJz09XCcgYW5kIFwnIT1cJyB0byBjb21wYXJlIHJhbmdlIG9iamVjdHNcbmJhc2VkIG9uIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhleSBkZWZpbmUgKGluc3RlYWQgb2YgY29tcGFyaW5nXG5iYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkpLlxuXG5OZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiBhdHRyaWJ1dGVzLlxuJywKLSAndHlwZXNzZXEtbXV0YWJsZSc6IHUnXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMuIFRoZSAiY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSIgQUJDIGlzIHByb3ZpZGVkIHRvIG1ha2Vcbml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlXG50eXBlcy5cblxuSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueVxuaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSB0eXBlIGFuZFxudmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgb25seVxuYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICJzIiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0IHBhcnQgdGhlIHNhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzIGNvbnRlbnRzICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qIHRpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqIChzYW1lIGFzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSB4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG5cbjIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG4zLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG5cbjQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzXG4gICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkXG4gICBzZXF1ZW5jZS5cblxuNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4gICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvblwndCBzdXBwb3J0IHNsaWNpbmdcbiAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcblxuICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG5cbjYuIFRoZSB2YWx1ZSAqbiogaXMgYW4gaW50ZWdlciwgb3IgYW4gb2JqZWN0IGltcGxlbWVudGluZ1xuICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLlxuICAgSXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlXG4gICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyICpDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucyouXG4nLAotICd1bmFyeSc6IHUnXG5VbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6XG5cbiAgIHVfZXhwciA6Oj0gcG93ZXIgfCAiLSIgdV9leHByIHwgIisiIHVfZXhwciB8ICJ+IiB1X2V4cHJcblxuVGhlIHVuYXJ5ICItIiAobWludXMpIG9wZXJhdG9yIHlpZWxkcyB0aGUgbmVnYXRpb24gb2YgaXRzIG51bWVyaWNcbmFyZ3VtZW50LlxuXG5UaGUgdW5hcnkgIisiIChwbHVzKSBvcGVyYXRvciB5aWVsZHMgaXRzIG51bWVyaWMgYXJndW1lbnQgdW5jaGFuZ2VkLlxuXG5UaGUgdW5hcnkgIn4iIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzXG5pbnRlZ2VyIGFyZ3VtZW50LiAgVGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mICJ4IiBpcyBkZWZpbmVkIGFzXG4iLSh4KzEpIi4gIEl0IG9ubHkgYXBwbGllcyB0byBpbnRlZ3JhbCBudW1iZXJzLlxuXG5JbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwgYVxuIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCi0gJ3doaWxlJzogdSdcblRoZSAid2hpbGUiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuZXhwcmVzc2lvbiBpcyB0cnVlOlxuXG4gICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlXG5maXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZVxuaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkXG5hbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cblxuQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgc3RhdGVtZW50XG5leGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzIGJhY2tcbnRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAotICd3aXRoJzogdSdcblRoZSAid2l0aCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbm1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gKldpdGggU3RhdGVtZW50XG5Db250ZXh0IE1hbmFnZXJzKikuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG51c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbmZvbGxvd3M6XG5cbjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG5cbjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSJcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgYmVcbiAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWVcbiAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZVxuICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgcmVyYWlzZWQuXG4gICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbiAgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHNcbiAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG5cbldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG5tdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuJywKLSAneWllbGQnOiB1J1xuVGhlICJ5aWVsZCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgeWllbGRfc3RtdCA6Oj0geWllbGRfZXhwcmVzc2lvblxuXG5BICJ5aWVsZCIgc3RhdGVtZW50IGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgKnlpZWxkXG5leHByZXNzaW9uKi4gVGhlIHlpZWxkIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBvbWl0IHRoZSBwYXJlbnRoZXNlc1xudGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgcmVxdWlyZWQgaW4gdGhlIGVxdWl2YWxlbnQgeWllbGQgZXhwcmVzc2lvblxuc3RhdGVtZW50LiBGb3IgZXhhbXBsZSwgdGhlIHlpZWxkIHN0YXRlbWVudHNcblxuICAgeWllbGQgPGV4cHI+XG4gICB5aWVsZCBmcm9tIDxleHByPlxuXG5hcmUgZXF1aXZhbGVudCB0byB0aGUgeWllbGQgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzXG5cbiAgICh5aWVsZCA8ZXhwcj4pXG4gICAoeWllbGQgZnJvbSA8ZXhwcj4pXG5cbllpZWxkIGV4cHJlc3Npb25zIGFuZCBzdGF0ZW1lbnRzIGFyZSBvbmx5IHVzZWQgd2hlbiBkZWZpbmluZyBhXG4qZ2VuZXJhdG9yKiBmdW5jdGlvbiwgYW5kIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGdlbmVyYXRvclxuZnVuY3Rpb24uICBVc2luZyB5aWVsZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgc3VmZmljaWVudCB0byBjYXVzZVxudGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgbm9ybWFsXG5mdW5jdGlvbi5cblxuRm9yIGZ1bGwgZGV0YWlscyBvZiAieWllbGQiIHNlbWFudGljcywgcmVmZXIgdG8gdGhlICpZaWVsZFxuZXhwcmVzc2lvbnMqIHNlY3Rpb24uXG4nfQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBNb24gSnVuIDEzIDE2OjQ5OjU4IDIwMTYKK3RvcGljcyA9IHsnYXNzZXJ0JzogJ1xuJworICAgICAgICAgICAnVGhlICJhc3NlcnQiIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nICcKKyAgICAgICAgICAgJ2Fzc2VydGlvbnNcbicKKyAgICAgICAgICAgJ2ludG8gYSBwcm9ncmFtOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBpZiBfX2RlYnVnX186XG4nCisgICAgICAgICAgICcgICAgICAgaWYgbm90IGV4cHJlc3Npb246IHJhaXNlIEFzc2VydGlvbkVycm9yXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBleHRlbmRlZCBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMiIsIGlzICcKKyAgICAgICAgICAgJ2VxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaWYgX19kZWJ1Z19fOlxuJworICAgICAgICAgICAnICAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCAiX19kZWJ1Z19fIiBhbmQgIkFzc2VydGlvbkVycm9yIiAnCisgICAgICAgICAgICdyZWZlclxuJworICAgICAgICAgICAndG8gdGhlIGJ1aWx0LWluIHZhcmlhYmxlcyB3aXRoIHRob3NlIG5hbWVzLiAgSW4gdGhlIGN1cnJlbnRcbicKKyAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyXG4nCisgICAgICAgICAgICdub3JtYWwgY2lyY3Vtc3RhbmNlcywgIkZhbHNlIiB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgJworICAgICAgICAgICAnKGNvbW1hbmRcbicKKyAgICAgICAgICAgJ2xpbmUgb3B0aW9uIC1PKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuXG4nCisgICAgICAgICAgICdhc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlIHRpbWUuICAnCisgICAgICAgICAgICdOb3RlXG4nCisgICAgICAgICAgICd0aGF0IGl0IGlzIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgJworICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAndGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdzdGFjayB0cmFjZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSAnCisgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAndmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAorICdhc3NpZ25tZW50JzogJ1xuJworICAgICAgICAgICAgICAgJ0Fzc2lnbm1lbnQgc3RhdGVtZW50c1xuJworICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0Fzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kICcKKyAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgJ21vZGlmeSBhdHRyaWJ1dGVzIG9yIGl0ZW1zIG9mIG11dGFibGUgb2JqZWN0czpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICBhc3NpZ25tZW50X3N0bXQgOjo9ICh0YXJnZXRfbGlzdCAiPSIpKyAoc3RhcnJlZF9leHByZXNzaW9uICcKKyAgICAgICAgICAgICAgICd8IHlpZWxkX2V4cHJlc3Npb24pXG4nCisgICAgICAgICAgICAgICAnICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuJworICAgICAgICAgICAgICAgJyAgIHRhcmdldCAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCAiKCIgW3RhcmdldF9saXN0XSAiKSJcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgIlsiIFt0YXJnZXRfbGlzdF0gIl0iXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXJlZlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgc2xpY2luZ1xuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCAiKiIgdGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKFNlZSBzZWN0aW9uIFByaW1hcmllcyBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgJworICAgICAgICAgICAgICAgJyphdHRyaWJ1dGVyZWYqLFxuJworICAgICAgICAgICAgICAgJypzdWJzY3JpcHRpb24qLCBhbmQgKnNsaWNpbmcqLilcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAnCisgICAgICAgICAgICAgICAnKHJlbWVtYmVyIHRoYXRcbicKKyAgICAgICAgICAgICAgICd0aGlzIGNhbiBiZSBhIHNpbmdsZSBleHByZXNzaW9uIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHRoZSAnCisgICAgICAgICAgICAgICAnbGF0dGVyXG4nCisgICAgICAgICAgICAgICAneWllbGRpbmcgYSB0dXBsZSkgYW5kIGFzc2lnbnMgdGhlIHNpbmdsZSByZXN1bHRpbmcgb2JqZWN0IHRvICcKKyAgICAgICAgICAgICAgICdlYWNoIG9mXG4nCisgICAgICAgICAgICAgICAndGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0Fzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlICcKKyAgICAgICAgICAgICAgICd0YXJnZXRcbicKKyAgICAgICAgICAgICAgICcobGlzdCkuIFdoZW4gYSB0YXJnZXQgaXMgcGFydCBvZiBhIG11dGFibGUgb2JqZWN0IChhbiAnCisgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAncmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG4nCisgICAgICAgICAgICAgICAndWx0aW1hdGVseSBwZXJmb3JtIHRoZSBhc3NpZ25tZW50IGFuZCBkZWNpZGUgYWJvdXQgaXRzICcKKyAgICAgICAgICAgICAgICd2YWxpZGl0eSwgYW5kXG4nCisgICAgICAgICAgICAgICAnbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgJworICAgICAgICAgICAgICAgJ3J1bGVzXG4nCisgICAgICAgICAgICAgICAnb2JzZXJ2ZWQgYnkgdmFyaW91cyB0eXBlcyBhbmQgdGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBnaXZlbiAnCisgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICdkZWZpbml0aW9uIG9mIHRoZSBvYmplY3QgdHlwZXMgKHNlZSBzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlXG4nCisgICAgICAgICAgICAgICAnaGllcmFyY2h5KS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0LCBvcHRpb25hbGx5IGVuY2xvc2VkICcKKyAgICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICAgJ3BhcmVudGhlc2VzIG9yIHNxdWFyZSBicmFja2V0cywgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhcyAnCisgICAgICAgICAgICAgICAnZm9sbG93cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBlbXB0eTogVGhlIG9iamVjdCBtdXN0IGFsc28gYmUgYW4gJworICAgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgICAnICBpdGVyYWJsZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQgaW4gcGFyZW50aGVzZXM6IFRoZSAnCisgICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnICBpcyBhc3NpZ25lZCB0byB0aGF0IHRhcmdldC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRhcmdldHMsIG9yICcKKyAgICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgICAnICBzaW5nbGUgdGFyZ2V0IGluIHNxdWFyZSBicmFja2V0czogVGhlIG9iamVjdCBtdXN0IGJlIGFuICcKKyAgICAgICAgICAgICAgICdpdGVyYWJsZVxuJworICAgICAgICAgICAgICAgJyAgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICd0YXJnZXRcbicKKyAgICAgICAgICAgICAgICcgIGxpc3QsIGFuZCB0aGUgaXRlbXMgYXJlIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogSWYgdGhlIHRhcmdldCBsaXN0IGNvbnRhaW5zIG9uZSB0YXJnZXQgcHJlZml4ZWQgd2l0aCBhblxuJworICAgICAgICAgICAgICAgJyAgICBhc3RlcmlzaywgY2FsbGVkIGEgInN0YXJyZWQiIHRhcmdldDogVGhlIG9iamVjdCBtdXN0IGJlICcKKyAgICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICAgJyAgICBpdGVyYWJsZSB3aXRoIGF0IGxlYXN0IGFzIG1hbnkgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgJworICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgJyAgICB0YXJnZXQgbGlzdCwgbWludXMgb25lLiAgVGhlIGZpcnN0IGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSAnCisgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAnICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSB0YXJnZXRzIGJlZm9yZSB0aGUgJworICAgICAgICAgICAgICAgJ3N0YXJyZWRcbicKKyAgICAgICAgICAgICAgICcgICAgdGFyZ2V0LiAgVGhlIGZpbmFsIGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSBhcmUgYXNzaWduZWQgdG8gJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJyAgICB0YXJnZXRzIGFmdGVyIHRoZSBzdGFycmVkIHRhcmdldC4gIEEgbGlzdCBvZiB0aGUgcmVtYWluaW5nICcKKyAgICAgICAgICAgICAgICdpdGVtc1xuJworICAgICAgICAgICAgICAgJyAgICBpbiB0aGUgaXRlcmFibGUgaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgc3RhcnJlZCB0YXJnZXQgJworICAgICAgICAgICAgICAgJyh0aGUgbGlzdFxuJworICAgICAgICAgICAgICAgJyAgICBjYW4gYmUgZW1wdHkpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKiBFbHNlOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgJworICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAnICAgIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAnaXRlbXMgYXJlXG4nCisgICAgICAgICAgICAgICAnICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAgICAgICd0YXJnZXRzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0Fzc2lnbm1lbnQgb2YgYW4gb2JqZWN0IHRvIGEgc2luZ2xlIHRhcmdldCBpcyByZWN1cnNpdmVseSAnCisgICAgICAgICAgICAgICAnZGVmaW5lZCBhc1xuJworICAgICAgICAgICAgICAgJ2ZvbGxvd3MuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGlkZW50aWZpZXIgKG5hbWUpOlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBvY2N1ciBpbiBhICJnbG9iYWwiIG9yICJub25sb2NhbCIgJworICAgICAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAgICAgJyAgICBpbiB0aGUgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0ICcKKyAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICAgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqIE90aGVyd2lzZTogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCBpbiB0aGUgZ2xvYmFsXG4nCisgICAgICAgICAgICAgICAnICAgIG5hbWVzcGFjZSBvciB0aGUgb3V0ZXIgbmFtZXNwYWNlIGRldGVybWluZWQgYnkgJworICAgICAgICAgICAgICAgJyJub25sb2NhbCIsXG4nCisgICAgICAgICAgICAgICAnICAgIHJlc3BlY3RpdmVseS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIFRoZSBuYW1lIGlzIHJlYm91bmQgaWYgaXQgd2FzIGFscmVhZHkgYm91bmQuICBUaGlzIG1heSBjYXVzZSAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnICByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBvYmplY3QgcHJldmlvdXNseSBib3VuZCB0byB0aGUgbmFtZSAnCisgICAgICAgICAgICAgICAndG8gcmVhY2hcbicKKyAgICAgICAgICAgICAgICcgIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzICcKKyAgICAgICAgICAgICAgICdkZXN0cnVjdG9yIChpZiBpdFxuJworICAgICAgICAgICAgICAgJyAgaGFzIG9uZSkgdG8gYmUgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpblxuJworICAgICAgICAgICAgICAgJyAgdGhlIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYW4gb2JqZWN0IHdpdGhcbicKKyAgICAgICAgICAgICAgICcgIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsICJUeXBlRXJyb3IiICcKKyAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgJyAgcmFpc2VkLiAgVGhhdCBvYmplY3QgaXMgdGhlbiBhc2tlZCB0byBhc3NpZ24gdGhlIGFzc2lnbmVkICcKKyAgICAgICAgICAgICAgICdvYmplY3QgdG9cbicKKyAgICAgICAgICAgICAgICcgIHRoZSBnaXZlbiBhdHRyaWJ1dGU7IGlmIGl0IGNhbm5vdCBwZXJmb3JtIHRoZSBhc3NpZ25tZW50LCBpdCAnCisgICAgICAgICAgICAgICAncmFpc2VzXG4nCisgICAgICAgICAgICAgICAnICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAnCisgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIikuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgJ3JlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgJyAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgJworICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24sXG4nCisgICAgICAgICAgICAgICAnICAiYS54IiBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vICcKKyAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCAiYS54IiAnCisgICAgICAgICAgICAgICAnaXMgYWx3YXlzXG4nCisgICAgICAgICAgICAgICAnICBzZXQgYXMgYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuICAnCisgICAgICAgICAgICAgICAnVGh1cywgdGhlXG4nCisgICAgICAgICAgICAgICAnICB0d28gb2NjdXJyZW5jZXMgb2YgImEueCIgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZSAnCisgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgJworICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSwgdGhlXG4nCisgICAgICAgICAgICAgICAnICBMSFMgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBhdHRyaWJ1dGUgYXMgdGhlIHRhcmdldCBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICcgIGFzc2lnbm1lbnQ6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAgICBjbGFzcyBDbHM6XG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuJworICAgICAgICAgICAgICAgJyAgICAgaW5zdCA9IENscygpXG4nCisgICAgICAgICAgICAgICAnICAgICBpbnN0LnggPSBpbnN0LnggKyAxICAgIyB3cml0ZXMgaW5zdC54IGFzIDQgbGVhdmluZyBDbHMueCAnCisgICAgICAgICAgICAgICAnYXMgM1xuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgVGhpcyBkZXNjcmlwdGlvbiBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byBkZXNjcmlwdG9yXG4nCisgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgaXMgYSBzdWJzY3JpcHRpb246IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJyAgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBlaXRoZXIgYSBtdXRhYmxlICcKKyAgICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgJyAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhICcKKyAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5KS5cbicKKyAgICAgICAgICAgICAgICcgIE5leHQsIHRoZSBzdWJzY3JpcHQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBJZiB0aGUgcHJpbWFyeSBpcyBhIG11dGFibGUgc2VxdWVuY2Ugb2JqZWN0IChzdWNoIGFzIGEgJworICAgICAgICAgICAgICAgJ2xpc3QpLCB0aGVcbicKKyAgICAgICAgICAgICAgICcgIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlICcKKyAgICAgICAgICAgICAgICJzZXF1ZW5jZSdzXG4iCisgICAgICAgICAgICAgICAnICBsZW5ndGggaXMgYWRkZWQgdG8gaXQuICBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSAnCisgICAgICAgICAgICAgICAnbm9ubmVnYXRpdmVcbicKKyAgICAgICAgICAgICAgICIgIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZSdzIGxlbmd0aCwgYW5kIHRoZSBzZXF1ZW5jZSBpcyAiCisgICAgICAgICAgICAgICAnYXNrZWRcbicKKyAgICAgICAgICAgICAgICcgIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGggdGhhdCBpbmRleC4gICcKKyAgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgICcgIGluZGV4IGlzIG91dCBvZiByYW5nZSwgIkluZGV4RXJyb3IiIGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byAnCisgICAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICAgJyAgc3Vic2NyaXB0ZWQgc2VxdWVuY2UgY2Fubm90IGFkZCBuZXcgaXRlbXMgdG8gYSBsaXN0KS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIElmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSBkaWN0aW9uYXJ5KSwgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgIiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nJ3Mga2V5ICIKKyAgICAgICAgICAgICAgICd0eXBlLFxuJworICAgICAgICAgICAgICAgJyAgYW5kIHRoZSBtYXBwaW5nIGlzIHRoZW4gYXNrZWQgdG8gY3JlYXRlIGEga2V5L2RhdHVtIHBhaXIgJworICAgICAgICAgICAgICAgJ3doaWNoIG1hcHNcbicKKyAgICAgICAgICAgICAgICcgIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciAnCisgICAgICAgICAgICAgICAncmVwbGFjZSBhblxuJworICAgICAgICAgICAgICAgJyAgZXhpc3Rpbmcga2V5L3ZhbHVlIHBhaXIgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsIG9yIGluc2VydCBhICcKKyAgICAgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgICAgICcgIGtleS92YWx1ZSBwYWlyIChpZiBubyBrZXkgd2l0aCB0aGUgc2FtZSB2YWx1ZSBleGlzdGVkKS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIEZvciB1c2VyLWRlZmluZWQgb2JqZWN0cywgdGhlICJfX3NldGl0ZW1fXygpIiBtZXRob2QgaXMgJworICAgICAgICAgICAgICAgJ2NhbGxlZCB3aXRoXG4nCisgICAgICAgICAgICAgICAnICBhcHByb3ByaWF0ZSBhcmd1bWVudHMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc2xpY2luZzogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYSBtdXRhYmxlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAgICcgIChzdWNoIGFzIGEgbGlzdCkuICBUaGUgYXNzaWduZWQgb2JqZWN0IHNob3VsZCBiZSBhIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAgICcgIG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kICcKKyAgICAgICAgICAgICAgICdleHByZXNzaW9ucyBhcmVcbicKKyAgICAgICAgICAgICAgICcgIGV2YWx1YXRlZCwgaW5zb2ZhciB0aGV5IGFyZSBwcmVzZW50OyBkZWZhdWx0cyBhcmUgemVybyBhbmQgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgIiAgc2VxdWVuY2UncyBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gIgorICAgICAgICAgICAgICAgJ0lmXG4nCisgICAgICAgICAgICAgICAiICBlaXRoZXIgYm91bmQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZSdzIGxlbmd0aCBpcyBhZGRlZCB0byAiCisgICAgICAgICAgICAgICAnaXQuICBUaGVcbicKKyAgICAgICAgICAgICAgICcgIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICJzZXF1ZW5jZSdzXG4iCisgICAgICAgICAgICAgICAnICBsZW5ndGgsIGluY2x1c2l2ZS4gIEZpbmFsbHksIHRoZSBzZXF1ZW5jZSBvYmplY3QgaXMgYXNrZWQgdG8gJworICAgICAgICAgICAgICAgJ3JlcGxhY2VcbicKKyAgICAgICAgICAgICAgICcgIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgJworICAgICAgICAgICAgICAgJ2xlbmd0aCBvZlxuJworICAgICAgICAgICAgICAgJyAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCAnCisgICAgICAgICAgICAgICAnc2VxdWVuY2UsXG4nCisgICAgICAgICAgICAgICAnICB0aHVzIGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSwgaWYgdGhlICcKKyAgICAgICAgICAgICAgICd0YXJnZXRcbicKKyAgICAgICAgICAgICAgICcgIHNlcXVlbmNlIGFsbG93cyBpdC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgdGhlXG4nCisgICAgICAgICAgICAgICAnc3ludGF4IGZvciB0YXJnZXRzIGlzIHRha2VuIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgJworICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgJ2ludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCAnCisgICAgICAgICAgICAgICAnY2F1c2luZ1xuJworICAgICAgICAgICAgICAgJ2xlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgYXNzaWdubWVudCBpbXBsaWVzIHRoYXQgb3ZlcmxhcHMgJworICAgICAgICAgICAgICAgJ2JldHdlZW5cbicKKyAgICAgICAgICAgICAgICJ0aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlICdzaW11bHRhbmVvdXMnICIKKyAgICAgICAgICAgICAgICcoZm9yXG4nCisgICAgICAgICAgICAgICAnZXhhbXBsZSAiYSwgYiA9IGIsIGEiIHN3YXBzIHR3byB2YXJpYWJsZXMpLCBvdmVybGFwcyAqd2l0aGluKiAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgb2NjdXIgbGVmdC10by1yaWdodCwgJworICAgICAgICAgICAgICAgJ3NvbWV0aW1lc1xuJworICAgICAgICAgICAgICAgJ3Jlc3VsdGluZyBpbiBjb25mdXNpb24uICBGb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbSAnCisgICAgICAgICAgICAgICAncHJpbnRzXG4nCisgICAgICAgICAgICAgICAnIlswLCAyXSI6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAgeCA9IFswLCAxXVxuJworICAgICAgICAgICAgICAgJyAgIGkgPSAwXG4nCisgICAgICAgICAgICAgICAnICAgaSwgeFtpXSA9IDEsIDIgICAgICAgICAjIGkgaXMgdXBkYXRlZCwgdGhlbiB4W2ldIGlzICcKKyAgICAgICAgICAgICAgICd1cGRhdGVkXG4nCisgICAgICAgICAgICAgICAnICAgcHJpbnQoeClcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICoqUEVQIDMxMzIqKiAtIEV4dGVuZGVkIEl0ZXJhYmxlIFVucGFja2luZ1xuJworICAgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAiKnRhcmdldCIgZmVhdHVyZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0F1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgJworICAgICAgICAgICAgICAgJ3N0YXRlbWVudCwgb2YgYVxuJworICAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAnCisgICAgICAgICAgICAgICAnKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4nCisgICAgICAgICAgICAgICAnICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8ICcKKyAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4nCisgICAgICAgICAgICAgICAnICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICcKKyAgICAgICAgICAgICAgICciLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKFNlZSBzZWN0aW9uIFByaW1hcmllcyBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCAnCisgICAgICAgICAgICAgICAndGhyZWVcbicKKyAgICAgICAgICAgICAgICdzeW1ib2xzLilcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSAnCisgICAgICAgICAgICAgICAnbm9ybWFsXG4nCisgICAgICAgICAgICAgICAnYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgICAnbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgJworICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnRcbicKKyAgICAgICAgICAgICAgICdvbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCAnCisgICAgICAgICAgICAgICAndGFyZ2V0LlxuJworICAgICAgICAgICAgICAgJ1RoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlICcKKyAgICAgICAgICAgICAgICdyZXdyaXR0ZW4gYXNcbicKKyAgICAgICAgICAgICAgICcieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsICcKKyAgICAgICAgICAgICAgICdlZmZlY3QuIEluIHRoZVxuJworICAgICAgICAgICAgICAgJ2F1Z21lbnRlZCB2ZXJzaW9uLCAieCIgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlbiAnCisgICAgICAgICAgICAgICAncG9zc2libGUsXG4nCisgICAgICAgICAgICAgICAndGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCAnCisgICAgICAgICAgICAgICAncmF0aGVyIHRoYW5cbicKKyAgICAgICAgICAgICAgICdjcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSAnCisgICAgICAgICAgICAgICAnb2xkIG9iamVjdFxuJworICAgICAgICAgICAgICAgJ2lzIG1vZGlmaWVkIGluc3RlYWQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICAnbGVmdC1cbicKKyAgICAgICAgICAgICAgICdoYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yICcKKyAgICAgICAgICAgICAgICdleGFtcGxlLCAiYVtpXVxuJworICAgICAgICAgICAgICAgJys9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCAnCisgICAgICAgICAgICAgICAncGVyZm9ybXNcbicKKyAgICAgICAgICAgICAgICd0aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gJworICAgICAgICAgICAgICAgJyJhW2ldIi5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdXaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyAnCisgICAgICAgICAgICAgICAnaW4gYVxuJworICAgICAgICAgICAgICAgJ3NpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbicKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gJworICAgICAgICAgICAgICAgJ1NpbWlsYXJseSxcbicKKyAgICAgICAgICAgICAgICd3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSAnCisgICAgICAgICAgICAgICAnYmluYXJ5XG4nCisgICAgICAgICAgICAgICAnb3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgJworICAgICAgICAgICAgICAgJ25vcm1hbFxuJworICAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0ZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgY2F2ZWF0ICcKKyAgICAgICAgICAgICAgICdhYm91dFxuJworICAgICAgICAgICAgICAgJ2NsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgJworICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnRzLlxuJywKKyAnYXRvbS1pZGVudGlmaWVycyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyAoTmFtZXMpXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0FuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlICcKKyAgICAgICAgICAgICAgICAgICAgICdzZWN0aW9uIElkZW50aWZpZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnYW5kIGtleXdvcmRzIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gTmFtaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICdhbmQgYmluZGluZyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdXaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2F0b20geWllbGRzXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byAnCisgICAgICAgICAgICAgICAgICAgICAnZXZhbHVhdGUgaXRcbicKKyAgICAgICAgICAgICAgICAgICAgICdyYWlzZXMgYSAiTmFtZUVycm9yIiBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKipQcml2YXRlIG5hbWUgbWFuZ2xpbmc6KiogV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgJworICAgICAgICAgICAgICAgICAgICAgJ3RleHR1YWxseSBvY2N1cnMgaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICdhIGNsYXNzIGRlZmluaXRpb24gYmVnaW5zIHdpdGggdHdvIG9yIG1vcmUgdW5kZXJzY29yZSAnCisgICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICdkb2VzIG5vdCBlbmQgaW4gdHdvIG9yIG1vcmUgdW5kZXJzY29yZXMsIGl0IGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdjb25zaWRlcmVkIGEgKnByaXZhdGVcbicKKyAgICAgICAgICAgICAgICAgICAgICduYW1lKiBvZiB0aGF0IGNsYXNzLiBQcml2YXRlIG5hbWVzIGFyZSB0cmFuc2Zvcm1lZCB0byBhICcKKyAgICAgICAgICAgICAgICAgICAgICdsb25nZXIgZm9ybVxuJworICAgICAgICAgICAgICAgICAgICAgJ2JlZm9yZSBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdGhlbS4gIFRoZSB0cmFuc2Zvcm1hdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zZXJ0cyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzcyBuYW1lLCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZXMgcmVtb3ZlZCBhbmQgYSAnCisgICAgICAgICAgICAgICAgICAgICAnc2luZ2xlIHVuZGVyc2NvcmVcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdpZGVudGlmaWVyICJfX3NwYW0iXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgIkhhbSIgd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byAnCisgICAgICAgICAgICAgICAgICAgICAnIl9IYW1fX3NwYW0iLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZXh0IGluIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIGlkZW50aWZpZXIgaXMgdXNlZC4gIElmIHRoZSB0cmFuc2Zvcm1lZCBuYW1lIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdleHRyZW1lbHkgbG9uZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyhsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyksIGltcGxlbWVudGF0aW9uIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAgICAgJ3RydW5jYXRpb24gbWF5XG4nCisgICAgICAgICAgICAgICAgICAgICAnaGFwcGVuLiBJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLCAnCisgICAgICAgICAgICAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuJywKKyAnYXRvbS1saXRlcmFscyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICdMaXRlcmFsc1xuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnUHl0aG9uIHN1cHBvcnRzIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgYW5kIHZhcmlvdXMgJworICAgICAgICAgICAgICAgICAgJ251bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICdsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgYnl0ZXNsaXRlcmFsXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgfCBpbnRlZ2VyIHwgZmxvYXRudW1iZXIgfCBpbWFnbnVtYmVyXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRXZhbHVhdGlvbiBvZiBhIGxpdGVyYWwgeWllbGRzIGFuIG9iamVjdCBvZiB0aGUgZ2l2ZW4gdHlwZSAnCisgICAgICAgICAgICAgICAgICAnKHN0cmluZyxcbicKKyAgICAgICAgICAgICAgICAgICdieXRlcywgaW50ZWdlciwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjb21wbGV4IG51bWJlcikgd2l0aCAnCisgICAgICAgICAgICAgICAgICAndGhlIGdpdmVuXG4nCisgICAgICAgICAgICAgICAgICAndmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiAnCisgICAgICAgICAgICAgICAgICAnZmxvYXRpbmcgcG9pbnRcbicKKyAgICAgICAgICAgICAgICAgICdhbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uIExpdGVyYWxzIGZvciAnCisgICAgICAgICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICJvYmplY3QncyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gICIKKyAgICAgICAgICAgICAgICAgICdNdWx0aXBsZVxuJworICAgICAgICAgICAgICAgICAgJ2V2YWx1YXRpb25zIG9mIGxpdGVyYWxzIHdpdGggdGhlIHNhbWUgdmFsdWUgKGVpdGhlciB0aGUgJworICAgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAgICdvY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgJworICAgICAgICAgICAgICAgICAgJ21heSBvYnRhaW5cbicKKyAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlLlxuJywKKyAnYXR0cmlidXRlLWFjY2Vzcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdtZWFuaW5nIG9mXG4nCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnIngubmFtZSIpIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzIGluc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgICAgJ25vciBpcyBpdCBmb3VuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIG5hbWUuIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgJworICAgICAgICAgICAgICAgICAgICAgJ29yIHJhaXNlIGFuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ25vcm1hbCBtZWNoYW5pc20sXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYmV0d2VlbiAiX19nZXRhdHRyX18oKSIgYW5kICJfX3NldGF0dHJfXygpIi4pIFRoaXMgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2RvbmUgYm90aCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICcKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIgd291bGQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICAnCisgICAgICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0IGF0XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250cm9sIGJ5IG5vdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgKGJ1dFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ2FjdHVhbGx5IGdldCB0b3RhbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICdhY2Nlc3NlcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzICcKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRhdHRyaWJ1dGVfXygpIiBlaXRoZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiAnCisgICAgICAgICAgICAgICAgICAgICAnVGhpcyBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSAnCisgICAgICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi4gSW4gb3JkZXIgdG8gYXZvaWQgJworICAgICAgICAgICAgICAgICAgICAgJ2luZmluaXRlIHJlY3Vyc2lvbiBpblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgYmFzZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0ICcKKyAgICAgICAgICAgICAgICAgICAgICduZWVkcywgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZXhhbXBsZSwgIm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nICcKKyAgICAgICAgICAgICAgICAgICAgICd1cCBzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICBtZXRob2RzIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgJworICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlIHN5bnRheFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgb3IgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgU3BlY2lhbCBtZXRob2QgbG9va3VwLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICAnCisgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBjYWxsZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICcKKyAgICAgICAgICAgICAgICAgICAgICcqdmFsdWUqIGlzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSwgaXRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCAnCisgICAgICAgICAgICAgICAgICAgICAnZm9yIGV4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0ZWFkIG9mXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCAnCisgICAgICAgICAgICAgICAgICAgICAnb2JqLm5hbWUiIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgJworICAgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIG11c3QgYmVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgdG8gYSAnCisgICAgICAgICAgICAgICAgICAgICAnbGlzdCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBzb3J0cyBpdC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgJworICAgICAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgaW4gYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcqb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgJworICAgICAgICAgICAgICAgICAgICAgIm93bmVyJ3MgY2xhc3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXJlbnRzKS4gIEluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2V4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgICAgJ3dob3NlIG5hbWUgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3MnICIKKyAgICAgICAgICAgICAgICAgICAgICciX19kaWN0X18iLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAnCisgICAgICAgICAgICAgICAgICAgICAnKmluc3RhbmNlKiBpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yICcKKyAgICAgICAgICAgICAgICAgICAgICciTm9uZSIgd2hlblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgJworICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICcKKyAgICAgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiAnCisgICAgICAgICAgICAgICAgICAgICAnb2YgdGhlIG93bmVyXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICcqaW5zdGFuY2UqIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG93bmVyIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBhdHRyaWJ1dGUgIl9fb2JqY2xhc3NfXyIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICciaW5zcGVjdCIgbW9kdWxlIGFzXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAgICAgJyhzZXR0aW5nIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICdkeW5hbWljIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcykuIEZvciBjYWxsYWJsZXMsIGl0IG1heSBpbmRpY2F0ZSB0aGF0IGFuICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdnaXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAndW5ib3VuZCBtZXRob2RzIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIEMpLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0ludm9raW5nIERlc2NyaXB0b3JzXG4nCisgICAgICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICAgICciYmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gJworICAgICAgICAgICAgICAgICAgICAgJ292ZXJyaWRkZW4gYnkgbWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCAnCisgICAgICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciAnCisgICAgICAgICAgICAgICAgICAgICAnYW4gb2JqZWN0LCBpdFxuJworICAgICAgICAgICAgICAgICAgICAgJ2lzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgJworICAgICAgICAgICAgICAgICAgICAgJ3NldCwgb3IgZGVsZXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAidGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgIgorICAgICAgICAgICAgICAgICAgICAgJyJhLngiIGhhcyBhXG4nCisgICAgICAgICAgICAgICAgICAgICAnbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bXCd4XCddIiwgdGhlblxuJworICAgICAgICAgICAgICAgICAgICAgJyJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzZXMgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAgICcidHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0hvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICdvbmUgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2ludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzICcKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdwcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgICAgICd3ZXJlIGRlZmluZWQgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnaG93IHRoZXkgd2VyZSBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSAnCisgICAgICAgICAgICAgICAgICAgICAnYmluZGluZywgImEueCIuIEhvd1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdEaXJlY3QgQ2FsbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgJworICAgICAgICAgICAgICAgICAgICAgJ2RpcmVjdGx5XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbnN0YW5jZSBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICd0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdDbGFzcyBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnY2FsbDpcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnU3VwZXIgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICcic3VwZXIoQixcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzcyAiQSJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgIkIiIGFuZCB0aGVuIGludm9rZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yIHdpdGggdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCAnCisgICAgICAgICAgICAgICAgICAgICAnb2JqLl9fY2xhc3NfXykiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0ZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICAgICAnaW52b2NhdGlvbiBkZXBlbmRzXG4nCisgICAgICAgICAgICAgICAgICAgICAnb24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IgY2FuIGRlZmluZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2FueSBjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIi4gIElmIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSB3aWxsIHJldHVyblxuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gJworICAgICAgICAgICAgICAgICAgICAgInRoZSBvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICAgICciX19zZXRfXygpIiBhbmQvb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgICAgJ25laXRoZXIsIGl0IGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgJworICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZSBib3RoXG4nCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyAnCisgICAgICAgICAgICAgICAgICAgICAnaGF2ZSBqdXN0IHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiAnCisgICAgICAgICAgICAgICAgICAgICAnYW5kICJfX2dldF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuICBJblxuJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUgb3ZlcnJpZGRlbiBieSAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgInN0YXRpY21ldGhvZCgpIiBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJyJjbGFzc21ldGhvZCgpIikgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyBjYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICdyZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJ2FjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSAnCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvci5cbicKKyAgICAgICAgICAgICAgICAgICAgICdBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSAnCisgICAgICAgICAgICAgICAgICAgICAncHJvcGVydHkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnX19zbG90c19fXG4nCisgICAgICAgICAgICAgICAgICAgICAnPT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3ICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gJworICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0aW5nIGxhcmdlXG4nCisgICAgICAgICAgICAgICAgICAgICAnbnVtYmVycyBvZiBpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gJworICAgICAgICAgICAgICAgICAgICAgJ2EgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLiBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnb2YgaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIHRvIGhvbGQgYVxuJworICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fZGljdF9fKiBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Nsb3RzX19cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgJworICAgICAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAncHJldmVudHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciBlYWNoXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJypfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvICcKKyAgICAgICAgICAgICAgICAgICAgICdhICpfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlICcKKyAgICAgICAgICAgICAgICAgICAgICdhc3NpZ25lZCBuZXdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICAgICAgICAgICAgJ0F0dGVtcHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgJworICAgICAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIuIElmXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuICcKKyAgICAgICAgICAgICAgICAgICAgICdhZGRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICJcJ19fZGljdF9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsICcKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZWZpbmluZyAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiAnCisgICAgICAgICAgICAgICAgICAgICAnYWRkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAiXCdfX3dlYWtyZWZfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZWNsYXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgJworICAgICAgICAgICAgICAgICAgICAgJ2NyZWF0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZXNjcmlwdG9ycyAoSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKSBmb3IgZWFjaCAnCisgICAgICAgICAgICAgICAgICAgICAndmFyaWFibGUgbmFtZS4gIEFzIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAgICAndmFsdWVzIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgJworICAgICAgICAgICAgICAgICAgICAgJ2hhdmUgYSAqX19kaWN0X18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5ICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250YWluIG5hbWVzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSAnCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3MsIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdpbmFjY2Vzc2libGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIChleGNlcHQgYnkgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzcykuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBmdXR1cmUsIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgJworICAgICAgICAgICAgICAgICAgICAgJ2Zyb21cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICcKKyAgICAgICAgICAgICAgICAgICAgICciYnl0ZXMiIGFuZCAidHVwbGUiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19zbG90c19fKi4gTWFwcGluZ3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgJworICAgICAgICAgICAgICAgICAgICAgJ21lYW5pbmcgbWF5IGJlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAqX19zbG90c19fKi5cbicsCisgJ2F0dHJpYnV0ZS1yZWZlcmVuY2VzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdBdHRyaWJ1dGUgcmVmZXJlbmNlc1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3BlcmlvZCBhbmQgYSBuYW1lOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgYXR0cmlidXRlcmVmIDo6PSBwcmltYXJ5ICIuIiBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvZiBhIHR5cGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICd0aGF0IHN1cHBvcnRzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSByZWZlcmVuY2VzLCB3aGljaCBtb3N0IG9iamVjdHMgZG8uICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0IGlzIHRoZW5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllci4gIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjdGlvbiBjYW4gYmUgY3VzdG9taXplZCBieSBvdmVycmlkaW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJfX2dldGF0dHJfXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBleGNlcHRpb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhaXNlZC4gIE90aGVyd2lzZSwgdGhlIHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBvYmplY3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWNlZCBpc1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIGF0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2UgbWF5IHlpZWxkIGRpZmZlcmVudCBvYmplY3RzLlxuJywKKyAnYXVnYXNzaWduJzogJ1xuJworICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuJworICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgJworICAgICAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICAgICAnYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAnCisgICAgICAgICAgICAgICcoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbicKKyAgICAgICAgICAgICAgJyAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCAnCisgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4nCisgICAgICAgICAgICAgICcgICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgJworICAgICAgICAgICAgICAnIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4nCisgICAgICAgICAgICAgICcgICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyhTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgJworICAgICAgICAgICAgICAndGhyZWVcbicKKyAgICAgICAgICAgICAgJ3N5bWJvbHMuKVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSAnCisgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSAnCisgICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgICdsaXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiAnCisgICAgICAgICAgICAgICdhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICdvbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCAnCisgICAgICAgICAgICAgICd0YXJnZXQuXG4nCisgICAgICAgICAgICAgICdUaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgJworICAgICAgICAgICAgICAncmV3cml0dGVuIGFzXG4nCisgICAgICAgICAgICAgICcieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gJworICAgICAgICAgICAgICAnSW4gdGhlXG4nCisgICAgICAgICAgICAgICdhdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gJworICAgICAgICAgICAgICAncG9zc2libGUsXG4nCisgICAgICAgICAgICAgICd0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0ICcKKyAgICAgICAgICAgICAgJ3JhdGhlciB0aGFuXG4nCisgICAgICAgICAgICAgICdjcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgJworICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICdpcyBtb2RpZmllZCBpbnN0ZWFkLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdVbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlICcKKyAgICAgICAgICAgICAgJ2xlZnQtXG4nCisgICAgICAgICAgICAgICdoYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yICcKKyAgICAgICAgICAgICAgJ2V4YW1wbGUsICJhW2ldXG4nCisgICAgICAgICAgICAgICcrPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgJworICAgICAgICAgICAgICAncGVyZm9ybXNcbicKKyAgICAgICAgICAgICAgJ3RoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAiYVtpXSIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1dpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzICcKKyAgICAgICAgICAgICAgJ2luIGFcbicKKyAgICAgICAgICAgICAgJ3NpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbicKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiAnCisgICAgICAgICAgICAgICdTaW1pbGFybHksXG4nCisgICAgICAgICAgICAgICd3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSAnCisgICAgICAgICAgICAgICdiaW5hcnlcbicKKyAgICAgICAgICAgICAgJ29wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlICcKKyAgICAgICAgICAgICAgJ25vcm1hbFxuJworICAgICAgICAgICAgICAnYmluYXJ5IG9wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0ZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgY2F2ZWF0ICcKKyAgICAgICAgICAgICAgJ2Fib3V0XG4nCisgICAgICAgICAgICAgICdjbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyBhcHBsaWVzIGFzIGZvciByZWd1bGFyICcKKyAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnRzLlxuJywKKyAnYmluYXJ5JzogJ1xuJworICAgICAgICAgICAnQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHlcbicKKyAgICAgICAgICAgJ2xldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluICcKKyAgICAgICAgICAgJ25vbi1cbicKKyAgICAgICAgICAgJ251bWVyaWMgdHlwZXMuICBBcGFydCBmcm9tIHRoZSBwb3dlciBvcGVyYXRvciwgdGhlcmUgYXJlIG9ubHkgdHdvXG4nCisgICAgICAgICAgICdsZXZlbHMsIG9uZSBmb3IgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzIGFuZCBvbmUgZm9yIGFkZGl0aXZlXG4nCisgICAgICAgICAgICdvcGVyYXRvcnM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIG1fZXhwciA6Oj0gdV9leHByIHwgbV9leHByICIqIiB1X2V4cHIgfCBtX2V4cHIgIkAiIG1fZXhwciB8XG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgIG1fZXhwciAiLy8iIHVfZXhwcnwgbV9leHByICIvIiB1X2V4cHIgfFxuJworICAgICAgICAgICAnICAgICAgICAgICAgICBtX2V4cHIgIiUiIHVfZXhwclxuJworICAgICAgICAgICAnICAgYV9leHByIDo6PSBtX2V4cHIgfCBhX2V4cHIgIisiIG1fZXhwciB8IGFfZXhwciAiLSIgbV9leHByXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiKiIgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzICcKKyAgICAgICAgICAgJ2FyZ3VtZW50cy5cbicKKyAgICAgICAgICAgJ1RoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnQgbXVzdCBiZSAnCisgICAgICAgICAgICdhblxuJworICAgICAgICAgICAnaW50ZWdlciBhbmQgdGhlIG90aGVyIG11c3QgYmUgYSBzZXF1ZW5jZS4gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGVcbicKKyAgICAgICAgICAgJ251bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZCB0aGVuIG11bHRpcGxpZWQgJworICAgICAgICAgICAndG9nZXRoZXIuXG4nCisgICAgICAgICAgICdJbiB0aGUgbGF0dGVyIGNhc2UsIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgcGVyZm9ybWVkOyBhIG5lZ2F0aXZlXG4nCisgICAgICAgICAgICdyZXBldGl0aW9uIGZhY3RvciB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiQCIgKGF0KSBvcGVyYXRvciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXRyaXhcbicKKyAgICAgICAgICAgJ211bHRpcGxpY2F0aW9uLiAgTm8gYnVpbHRpbiBQeXRob24gdHlwZXMgaW1wbGVtZW50IHRoaXMgb3BlcmF0b3IuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuNS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICIvIiAoZGl2aXNpb24pIGFuZCAiLy8iIChmbG9vciBkaXZpc2lvbikgb3BlcmF0b3JzIHlpZWxkIHRoZVxuJworICAgICAgICAgICAncXVvdGllbnQgb2YgdGhlaXIgYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuJworICAgICAgICAgICAnY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuIERpdmlzaW9uIG9mIGludGVnZXJzIHlpZWxkcyBhIGZsb2F0LCAnCisgICAgICAgICAgICd3aGlsZVxuJworICAgICAgICAgICAnZmxvb3IgZGl2aXNpb24gb2YgaW50ZWdlcnMgcmVzdWx0cyBpbiBhbiBpbnRlZ2VyOyB0aGUgcmVzdWx0IGlzICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgIm9mIG1hdGhlbWF0aWNhbCBkaXZpc2lvbiB3aXRoIHRoZSAnZmxvb3InIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlXG4iCisgICAgICAgICAgICdyZXN1bHQuICBEaXZpc2lvbiBieSB6ZXJvIHJhaXNlcyB0aGUgIlplcm9EaXZpc2lvbkVycm9yIiAnCisgICAgICAgICAgICdleGNlcHRpb24uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiJSIgKG1vZHVsbykgb3BlcmF0b3IgeWllbGRzIHRoZSByZW1haW5kZXIgZnJvbSB0aGUgZGl2aXNpb24gJworICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgJ3RoZSBmaXJzdCBhcmd1bWVudCBieSB0aGUgc2Vjb25kLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSAnCisgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAnY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBBIHplcm8gcmlnaHQgYXJndW1lbnQgcmFpc2VzIHRoZVxuJworICAgICAgICAgICAnIlplcm9EaXZpc2lvbkVycm9yIiBleGNlcHRpb24uICBUaGUgYXJndW1lbnRzIG1heSBiZSBmbG9hdGluZyAnCisgICAgICAgICAgICdwb2ludFxuJworICAgICAgICAgICAnbnVtYmVycywgZS5nLiwgIjMuMTQlMC43IiBlcXVhbHMgIjAuMzQiIChzaW5jZSAiMy4xNCIgZXF1YWxzICcKKyAgICAgICAgICAgJyI0KjAuNyArXG4nCisgICAgICAgICAgICcwLjM0Ii4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aCB0aGUgc2FtZSAnCisgICAgICAgICAgICdzaWduXG4nCisgICAgICAgICAgICdhcyBpdHMgc2Vjb25kIG9wZXJhbmQgKG9yIHplcm8pOyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHJlc3VsdCAnCisgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAnc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgJworICAgICAgICAgICAnWzFdLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRvcnMgYXJlIGNvbm5lY3RlZCBieSB0aGUgJworICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICdpZGVudGl0eTogInggPT0gKHgvL3kpKnkgKyAoeCV5KSIuICBGbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIGFyZSAnCisgICAgICAgICAgICdhbHNvXG4nCisgICAgICAgICAgICdjb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImRpdm1vZCgpIjogImRpdm1vZCh4LCB5KSA9PVxuJworICAgICAgICAgICAnKHgvL3ksIHgleSkiLiBbMl0uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0luIGFkZGl0aW9uIHRvIHBlcmZvcm1pbmcgdGhlIG1vZHVsbyBvcGVyYXRpb24gb24gbnVtYmVycywgdGhlICcKKyAgICAgICAgICAgJyIlIlxuJworICAgICAgICAgICAnb3BlcmF0b3IgaXMgYWxzbyBvdmVybG9hZGVkIGJ5IHN0cmluZyBvYmplY3RzIHRvIHBlcmZvcm0gJworICAgICAgICAgICAnb2xkLXN0eWxlXG4nCisgICAgICAgICAgICdzdHJpbmcgZm9ybWF0dGluZyAoYWxzbyBrbm93biBhcyBpbnRlcnBvbGF0aW9uKS4gIFRoZSBzeW50YXggZm9yXG4nCisgICAgICAgICAgICdzdHJpbmcgZm9ybWF0dGluZyBpcyBkZXNjcmliZWQgaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSxcbicKKyAgICAgICAgICAgJ3NlY3Rpb24gcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZmxvb3IgZGl2aXNpb24gb3BlcmF0b3IsIHRoZSBtb2R1bG8gb3BlcmF0b3IsIGFuZCB0aGUgJworICAgICAgICAgICAnImRpdm1vZCgpIlxuJworICAgICAgICAgICAnZnVuY3Rpb24gYXJlIG5vdCBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMuICBJbnN0ZWFkLCBjb252ZXJ0IHRvICcKKyAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgJ2Zsb2F0aW5nIHBvaW50IG51bWJlciB1c2luZyB0aGUgImFicygpIiBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICIrIiAoYWRkaXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgc3VtIG9mIGl0cyBhcmd1bWVudHMuICBUaGVcbicKKyAgICAgICAgICAgJ2FyZ3VtZW50cyBtdXN0IGVpdGhlciBib3RoIGJlIG51bWJlcnMgb3IgYm90aCBiZSBzZXF1ZW5jZXMgb2YgdGhlICcKKyAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgJ3R5cGUuICBJbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gJworICAgICAgICAgICAndHlwZVxuJworICAgICAgICAgICAnYW5kIHRoZW4gYWRkZWQgdG9nZXRoZXIuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHNlcXVlbmNlcyBhcmVcbicKKyAgICAgICAgICAgJ2NvbmNhdGVuYXRlZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICItIiAoc3VidHJhY3Rpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgZGlmZmVyZW5jZSBvZiBpdHMgJworICAgICAgICAgICAnYXJndW1lbnRzLlxuJworICAgICAgICAgICAnVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS5cbicsCisgJ2JpdHdpc2UnOiAnXG4nCisgICAgICAgICAgICAnQmluYXJ5IGJpdHdpc2Ugb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdFYWNoIG9mIHRoZSB0aHJlZSBiaXR3aXNlIG9wZXJhdGlvbnMgaGFzIGEgZGlmZmVyZW50IHByaW9yaXR5ICcKKyAgICAgICAgICAgICdsZXZlbDpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByXG4nCisgICAgICAgICAgICAnICAgeG9yX2V4cHIgOjo9IGFuZF9leHByIHwgeG9yX2V4cHIgIl4iIGFuZF9leHByXG4nCisgICAgICAgICAgICAnICAgb3JfZXhwciAgOjo9IHhvcl9leHByIHwgb3JfZXhwciAifCIgeG9yX2V4cHJcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgIiYiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBBTkQgb2YgaXRzIGFyZ3VtZW50cywgd2hpY2ggJworICAgICAgICAgICAgJ211c3RcbicKKyAgICAgICAgICAgICdiZSBpbnRlZ2Vycy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgIl4iIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBYT1IgKGV4Y2x1c2l2ZSBPUikgb2YgaXRzXG4nCisgICAgICAgICAgICAnYXJndW1lbnRzLCB3aGljaCBtdXN0IGJlIGludGVnZXJzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1RoZSAifCIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIChpbmNsdXNpdmUpIE9SIG9mIGl0cyAnCisgICAgICAgICAgICAnYXJndW1lbnRzLFxuJworICAgICAgICAgICAgJ3doaWNoIG11c3QgYmUgaW50ZWdlcnMuXG4nLAorICdibHRpbi1jb2RlLW9iamVjdHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdDb2RlIE9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdDb2RlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudCAicHNldWRvLVxuJworICAgICAgICAgICAgICAgICAgICAgICAnY29tcGlsZWQiIGV4ZWN1dGFibGUgUHl0aG9uIGNvZGUgc3VjaCBhcyBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2JvZHkuIFRoZXkgZGlmZmVyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIGZ1bmN0aW9uIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvbid0IGNvbnRhaW4gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2UgdG8gdGhlaXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3JldHVybmVkIGJ5IHRoZSBidWlsdC1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2luICJjb21waWxlKCkiIGZ1bmN0aW9uIGFuZCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gJworICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24gb2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAndGhyb3VnaCB0aGVpciAiX19jb2RlX18iIGF0dHJpYnV0ZS4gU2VlIGFsc28gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJyJjb2RlIiBtb2R1bGUuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ0EgY29kZSBvYmplY3QgY2FuIGJlIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCBieSBwYXNzaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2l0IChpbnN0ZWFkIG9mIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NvdXJjZSBzdHJpbmcpIHRvIHRoZSAiZXhlYygpIiBvciAiZXZhbCgpIiAgYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb25zLlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdTZWUgVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5IGZvciBtb3JlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uLlxuJywKKyAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIEVsbGlwc2lzIE9iamVjdFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIG9iamVjdCBpcyBjb21tb25seSB1c2VkIGJ5IHNsaWNpbmcgKHNlZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdTbGljaW5ncykuICBJdCBzdXBwb3J0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxsaXBzaXMgb2JqZWN0LCBuYW1lZFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnIkVsbGlwc2lzIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKEVsbGlwc2lzKSgpIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWNlcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyJFbGxpcHNpcyIgc2luZ2xldG9uLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdJdCBpcyB3cml0dGVuIGFzICJFbGxpcHNpcyIgb3IgIi4uLiIuXG4nLAorICdibHRpbi1udWxsLW9iamVjdCc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAnVGhlIE51bGwgT2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgIgorICAgICAgICAgICAgICAgICAgICAgICdleHBsaWNpdGx5IHJldHVybiBhXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgJworICAgICAgICAgICAgICAgICAgICAgICdleGFjdGx5IG9uZSBudWxsXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCwgbmFtZWQgIk5vbmUiIChhIGJ1aWx0LWluIG5hbWUpLiAgInR5cGUoTm9uZSkoKSIgJworICAgICAgICAgICAgICAgICAgICAgICdwcm9kdWNlcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICAnc2FtZSBzaW5nbGV0b24uXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICdJdCBpcyB3cml0dGVuIGFzICJOb25lIi5cbicsCisgJ2JsdGluLXR5cGUtb2JqZWN0cyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1R5cGUgT2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1R5cGUgb2JqZWN0cyByZXByZXNlbnQgdGhlIHZhcmlvdXMgb2JqZWN0IHR5cGVzLiAgQW4gJworICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0J3MgdHlwZSBpc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAnYWNjZXNzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJ0eXBlKCkiLiAgVGhlcmUgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ25vIHNwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlICJ0eXBlcyIgJworICAgICAgICAgICAgICAgICAgICAgICAnZGVmaW5lcyBuYW1lcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2FsbCBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPGNsYXNzIFwnaW50XCc+Ii5cbicsCisgJ2Jvb2xlYW5zJzogJ1xuJworICAgICAgICAgICAgICdCb29sZWFuIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBvcl90ZXN0ICA6Oj0gYW5kX3Rlc3QgfCBvcl90ZXN0ICJvciIgYW5kX3Rlc3RcbicKKyAgICAgICAgICAgICAnICAgYW5kX3Rlc3QgOjo9IG5vdF90ZXN0IHwgYW5kX3Rlc3QgImFuZCIgbm90X3Rlc3RcbicKKyAgICAgICAgICAgICAnICAgbm90X3Rlc3QgOjo9IGNvbXBhcmlzb24gfCAibm90IiBub3RfdGVzdFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSW4gdGhlIGNvbnRleHQgb2YgQm9vbGVhbiBvcGVyYXRpb25zLCBhbmQgYWxzbyB3aGVuIGV4cHJlc3Npb25zICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ3VzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgJ2ludGVycHJldGVkXG4nCisgICAgICAgICAgICAgJ2FzIGZhbHNlOiAiRmFsc2UiLCAiTm9uZSIsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuJworICAgICAgICAgICAgICdzdHJpbmdzIGFuZCBjb250YWluZXJzIChpbmNsdWRpbmcgc3RyaW5ncywgdHVwbGVzLCBsaXN0cyxcbicKKyAgICAgICAgICAgICAnZGljdGlvbmFyaWVzLCBzZXRzIGFuZCBmcm96ZW5zZXRzKS4gIEFsbCBvdGhlciB2YWx1ZXMgYXJlICcKKyAgICAgICAgICAgICAnaW50ZXJwcmV0ZWRcbicKKyAgICAgICAgICAgICAnYXMgdHJ1ZS4gIFVzZXItZGVmaW5lZCBvYmplY3RzIGNhbiBjdXN0b21pemUgdGhlaXIgdHJ1dGggdmFsdWUgJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICdwcm92aWRpbmcgYSAiX19ib29sX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIG9wZXJhdG9yICJub3QiIHlpZWxkcyAiVHJ1ZSIgaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLCAnCisgICAgICAgICAgICAgJyJGYWxzZSJcbicKKyAgICAgICAgICAgICAnb3RoZXJ3aXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4cHJlc3Npb24gInggYW5kIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAndmFsdWUgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyAnCisgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgJ2lzIHJldHVybmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4cHJlc3Npb24gInggb3IgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIHRydWUsIGl0cyAnCisgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgJ2lzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdyZXR1cm5lZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyhOb3RlIHRoYXQgbmVpdGhlciAiYW5kIiBub3IgIm9yIiByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgJworICAgICAgICAgICAgICd0aGV5XG4nCisgICAgICAgICAgICAgJ3JldHVybiB0byAiRmFsc2UiIGFuZCAiVHJ1ZSIsIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAnZXZhbHVhdGVkXG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50LiAgVGhpcyBpcyBzb21ldGltZXMgdXNlZnVsLCBlLmcuLCBpZiAicyIgaXMgYSBzdHJpbmcgJworICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgJ3Nob3VsZCBiZSByZXBsYWNlZCBieSBhIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMgZW1wdHksIHRoZSAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnInMgb3IgXCdmb29cJyIgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSAibm90IiBoYXMgdG8gJworICAgICAgICAgICAgICdjcmVhdGUgYVxuJworICAgICAgICAgICAgICduZXcgdmFsdWUsIGl0IHJldHVybnMgYSBib29sZWFuIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAnYXJndW1lbnQgKGZvciBleGFtcGxlLCAibm90IFwnZm9vXCciIHByb2R1Y2VzICJGYWxzZSIgcmF0aGVyICcKKyAgICAgICAgICAgICAndGhhbiAiXCdcJyIuKVxuJywKKyAnYnJlYWsnOiAnXG4nCisgICAgICAgICAgJ1RoZSAiYnJlYWsiIHN0YXRlbWVudFxuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGJyZWFrX3N0bXQgOjo9ICJicmVhayJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyJicmVhayIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiXG4nCisgICAgICAgICAgJ2xvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdFxuJworICAgICAgICAgICdsb29wLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsICcKKyAgICAgICAgICAnImVsc2UiXG4nCisgICAgICAgICAgJ2NsYXVzZSBpZiB0aGUgbG9vcCBoYXMgb25lLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgYSAiZm9yIiBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgImJyZWFrIiwgdGhlIGxvb3AgY29udHJvbCB0YXJnZXRcbicKKyAgICAgICAgICAna2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdXaGVuICJicmVhayIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAnCisgICAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAgICdjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnbG9vcC5cbicsCisgJ2NhbGxhYmxlLXR5cGVzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiAnCisgICAgICAgICAgICAgICAgICAgJ3RoaXMgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cbicsCisgJ2NhbGxzJzogJ1xuJworICAgICAgICAgICdDYWxsc1xuJworICAgICAgICAgICcqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhICpmdW5jdGlvbiopIHdpdGggYSAnCisgICAgICAgICAgJ3Bvc3NpYmx5XG4nCisgICAgICAgICAgJ2VtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGNhbGwgICAgICAgICAgICAgICAgIDo6PSBwcmltYXJ5ICIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXSB8ICcKKyAgICAgICAgICAnY29tcHJlaGVuc2lvbl0gIikiXG4nCisgICAgICAgICAgJyAgIGFyZ3VtZW50X2xpc3QgICAgICAgIDo6PSBwb3NpdGlvbmFsX2FyZ3VtZW50cyBbIiwiICcKKyAgICAgICAgICAnc3RhcnJlZF9hbmRfa2V5d29yZHNdXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgWyIsIiBrZXl3b3Jkc19hcmd1bWVudHNdXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgc3RhcnJlZF9hbmRfa2V5d29yZHMgWyIsIiAnCisgICAgICAgICAgJ2tleXdvcmRzX2FyZ3VtZW50c11cbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3Jkc19hcmd1bWVudHNcbicKKyAgICAgICAgICAnICAgcG9zaXRpb25hbF9hcmd1bWVudHMgOjo9IFsiKiJdIGV4cHJlc3Npb24gKCIsIiBbIioiXSAnCisgICAgICAgICAgJ2V4cHJlc3Npb24pKlxuJworICAgICAgICAgICcgICBzdGFycmVkX2FuZF9rZXl3b3JkcyA6Oj0gKCIqIiBleHByZXNzaW9uIHwga2V5d29yZF9pdGVtKVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiAiKiIgZXhwcmVzc2lvbiB8ICIsIiAnCisgICAgICAgICAgJ2tleXdvcmRfaXRlbSkqXG4nCisgICAgICAgICAgJyAgIGtleXdvcmRzX2FyZ3VtZW50cyAgIDo6PSAoa2V5d29yZF9pdGVtIHwgIioqIiBleHByZXNzaW9uKVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIga2V5d29yZF9pdGVtIHwgIioqIiBleHByZXNzaW9uKSpcbicKKyAgICAgICAgICAnICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FuIG9wdGlvbmFsIHRyYWlsaW5nIGNvbW1hIG1heSBiZSBwcmVzZW50IGFmdGVyIHRoZSBwb3NpdGlvbmFsIGFuZFxuJworICAgICAgICAgICdrZXl3b3JkIGFyZ3VtZW50cyBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzZW1hbnRpY3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWRcbicKKyAgICAgICAgICAnZnVuY3Rpb25zLCBidWlsdC1pbiBmdW5jdGlvbnMsIG1ldGhvZHMgb2YgYnVpbHQtaW4gb2JqZWN0cywgY2xhc3NcbicKKyAgICAgICAgICAnb2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBhbGwgb2JqZWN0cyBoYXZpbmcgYVxuJworICAgICAgICAgICciX19jYWxsX18oKSIgbWV0aG9kIGFyZSBjYWxsYWJsZSkuICBBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlXG4nCisgICAgICAgICAgJ2V2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGwgaXMgYXR0ZW1wdGVkLiAgUGxlYXNlIHJlZmVyIHRvIHNlY3Rpb25cbicKKyAgICAgICAgICAnRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIHRoZSBzeW50YXggb2YgZm9ybWFsICpwYXJhbWV0ZXIqIGxpc3RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0b1xuJworICAgICAgICAgICdwb3NpdGlvbmFsIGFyZ3VtZW50cywgYXMgZm9sbG93cy4gIEZpcnN0LCBhIGxpc3Qgb2YgdW5maWxsZWQgc2xvdHMgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICdjcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsXG4nCisgICAgICAgICAgJ2FyZ3VtZW50cywgdGhleSBhcmUgcGxhY2VkIGluIHRoZSBmaXJzdCBOIHNsb3RzLiAgTmV4dCwgZm9yIGVhY2hcbicKKyAgICAgICAgICAna2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0ICcKKyAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgJ3BhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICdhbHJlYWR5IGZpbGxlZCwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZVxuJworICAgICAgICAgICd2YWx1ZSBvZiB0aGUgYXJndW1lbnQgaXMgcGxhY2VkIGluIHRoZSBzbG90LCBmaWxsaW5nIGl0IChldmVuIGlmICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgIk5vbmUiLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuJworICAgICAgICAgICdiZWVuIHByb2Nlc3NlZCwgdGhlIHNsb3RzIHRoYXQgYXJlIHN0aWxsIHVuZmlsbGVkIGFyZSBmaWxsZWQgd2l0aCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdjb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAnKERlZmF1bHRcbicKKyAgICAgICAgICAndmFsdWVzIGFyZSBjYWxjdWxhdGVkLCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkOyB0aHVzLCBhXG4nCisgICAgICAgICAgJ211dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlICcKKyAgICAgICAgICAnd2lsbFxuJworICAgICAgICAgICJiZSBzaGFyZWQgYnkgYWxsIGNhbGxzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgIgorICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnY29ycmVzcG9uZGluZyBzbG90OyB0aGlzIHNob3VsZCB1c3VhbGx5IGJlIGF2b2lkZWQuKSAgSWYgdGhlcmUgYXJlICcKKyAgICAgICAgICAnYW55XG4nCisgICAgICAgICAgJ3VuZmlsbGVkIHNsb3RzIGZvciB3aGljaCBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCwgYSAnCisgICAgICAgICAgJyJUeXBlRXJyb3IiXG4nCisgICAgICAgICAgJ2V4Y2VwdGlvbiBpcyByYWlzZWQuICBPdGhlcndpc2UsIHRoZSBsaXN0IG9mIGZpbGxlZCBzbG90cyBpcyB1c2VkICcKKyAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAndGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBjYWxsLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuJworICAgICAgICAgICdidWlsdC1pbiBmdW5jdGlvbnMgd2hvc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIG5hbWVzLCAnCisgICAgICAgICAgJ2V2ZW5cbicKKyAgICAgICAgICAiaWYgdGhleSBhcmUgJ25hbWVkJyBmb3IgdGhlIHB1cnBvc2Ugb2YgZG9jdW1lbnRhdGlvbiwgYW5kIHdoaWNoXG4iCisgICAgICAgICAgJ3RoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlICcKKyAgICAgICAgICAnY2FzZVxuJworICAgICAgICAgICdmb3IgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIEMgdGhhdCB1c2UgIlB5QXJnX1BhcnNlVHVwbGUoKSIgdG8gJworICAgICAgICAgICdwYXJzZVxuJworICAgICAgICAgICd0aGVpciBhcmd1bWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiB0aGVyZSBhcmUgbW9yZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0aGFuIHRoZXJlIGFyZSBmb3JtYWwgJworICAgICAgICAgICdwYXJhbWV0ZXJcbicKKyAgICAgICAgICAnc2xvdHMsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsICcKKyAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgJ3VzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgJworICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAncGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgJworICAgICAgICAgICdhcmd1bWVudHNcbicKKyAgICAgICAgICAnKG9yIGFuIGVtcHR5IHR1cGxlIGlmIHRoZXJlIHdlcmUgbm8gZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyXG4nCisgICAgICAgICAgJ25hbWUsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxuJworICAgICAgICAgICd1c2luZyB0aGUgc3ludGF4ICIqKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCAnCisgICAgICAgICAgJ2Zvcm1hbFxuJworICAgICAgICAgICdwYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG4nCisgICAgICAgICAgJ2FyZ3VtZW50cyAodXNpbmcgdGhlIGtleXdvcmRzIGFzIGtleXMgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZXMgYXNcbicKKyAgICAgICAgICAnY29ycmVzcG9uZGluZyB2YWx1ZXMpLCBvciBhIChuZXcpIGVtcHR5IGRpY3Rpb25hcnkgaWYgdGhlcmUgd2VyZSAnCisgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgJ2V4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIHRoZSBzeW50YXggIipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLCAnCisgICAgICAgICAgJyJleHByZXNzaW9uIlxuJworICAgICAgICAgICdtdXN0IGV2YWx1YXRlIHRvIGFuICppdGVyYWJsZSouICBFbGVtZW50cyBmcm9tIHRoZXNlIGl0ZXJhYmxlcyBhcmVcbicKKyAgICAgICAgICAndHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZvciB0aGUgJworICAgICAgICAgICdjYWxsXG4nCisgICAgICAgICAgJyJmKHgxLCB4MiwgKnksIHgzLCB4NCkiLCBpZiAqeSogZXZhbHVhdGVzIHRvIGEgc2VxdWVuY2UgKnkxKiwgLi4uLFxuJworICAgICAgICAgICcqeU0qLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsIHdpdGggTSs0IHBvc2l0aW9uYWwgYXJndW1lbnRzICcKKyAgICAgICAgICAnKngxKixcbicKKyAgICAgICAgICAnKngyKiwgKnkxKiwgLi4uLCAqeU0qLCAqeDMqLCAqeDQqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgYWx0aG91Z2ggdGhlICIqZXhwcmVzc2lvbiIgc3ludGF4ICcKKyAgICAgICAgICAnbWF5XG4nCisgICAgICAgICAgJ2FwcGVhciAqYWZ0ZXIqIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgJworICAgICAgICAgICcqYmVmb3JlKlxuJworICAgICAgICAgICd0aGUga2V5d29yZCBhcmd1bWVudHMgKGFuZCBhbnkgIioqZXhwcmVzc2lvbiIgYXJndW1lbnRzIC0tIHNlZSAnCisgICAgICAgICAgJ2JlbG93KS5cbicKKyAgICAgICAgICAnU286XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICA+Pj4gZGVmIGYoYSwgYik6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoYSwgYilcbicKKyAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgJyAgID4+PiBmKGI9MSwgKigyLCkpXG4nCisgICAgICAgICAgJyAgIDIgMVxuJworICAgICAgICAgICcgICA+Pj4gZihhPTEsICooMiwpKVxuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuJworICAgICAgICAgICIgICBUeXBlRXJyb3I6IGYoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50ICdhJ1xuIgorICAgICAgICAgICcgICA+Pj4gZigxLCAqKDIsKSlcbicKKyAgICAgICAgICAnICAgMSAyXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJdCBpcyB1bnVzdWFsIGZvciBib3RoIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGUgIipleHByZXNzaW9uIiAnCisgICAgICAgICAgJ3N5bnRheFxuJworICAgICAgICAgICd0byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXMgJworICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAnYXJpc2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiB0aGUgc3ludGF4ICIqKmV4cHJlc3Npb24iIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG4nCisgICAgICAgICAgJyJleHByZXNzaW9uIiBtdXN0IGV2YWx1YXRlIHRvIGEgKm1hcHBpbmcqLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAndHJlYXRlZCBhcyBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLiAgSWYgYSBrZXl3b3JkIGlzIGFscmVhZHlcbicKKyAgICAgICAgICAncHJlc2VudCAoYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwgb3IgZnJvbSBhbm90aGVyICcKKyAgICAgICAgICAndW5wYWNraW5nKSxcbicKKyAgICAgICAgICAnYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiXG4nCisgICAgICAgICAgJ2Nhbm5vdCBiZSB1c2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgc2xvdHMgb3IgYXMga2V5d29yZCBhcmd1bWVudFxuJworICAgICAgICAgICduYW1lcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjU6IEZ1bmN0aW9uIGNhbGxzIGFjY2VwdCBhbnkgbnVtYmVyIG9mICIqIiAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICciKioiIHVucGFja2luZ3MsIHBvc2l0aW9uYWwgYXJndW1lbnRzIG1heSBmb2xsb3cgaXRlcmFibGUgJworICAgICAgICAgICd1bnBhY2tpbmdzXG4nCisgICAgICAgICAgJygiKiIpLCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyBkaWN0aW9uYXJ5IHVucGFja2luZ3MgJworICAgICAgICAgICcoIioqIikuXG4nCisgICAgICAgICAgJ09yaWdpbmFsbHkgcHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNhbGwgYWx3YXlzIHJldHVybnMgc29tZSB2YWx1ZSwgcG9zc2libHkgIk5vbmUiLCB1bmxlc3MgaXQgcmFpc2VzICcKKyAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAnZXhjZXB0aW9uLiAgSG93IHRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGVcbicKKyAgICAgICAgICAnY2FsbGFibGUgb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgaXQgaXMtLS1cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOlxuJworICAgICAgICAgICcgICBUaGUgY29kZSBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBwYXNzaW5nIGl0IHRoZVxuJworICAgICAgICAgICcgICBhcmd1bWVudCBsaXN0LiAgVGhlIGZpcnN0IHRoaW5nIHRoZSBjb2RlIGJsb2NrIHdpbGwgZG8gaXMgYmluZCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBmb3JtYWwgcGFyYW1ldGVycyB0byB0aGUgYXJndW1lbnRzOyB0aGlzIGlzIGRlc2NyaWJlZCBpbiAnCisgICAgICAgICAgJ3NlY3Rpb25cbicKKyAgICAgICAgICAnICAgRnVuY3Rpb24gZGVmaW5pdGlvbnMuICBXaGVuIHRoZSBjb2RlIGJsb2NrIGV4ZWN1dGVzIGEgInJldHVybiJcbicKKyAgICAgICAgICAnICAgc3RhdGVtZW50LCB0aGlzIHNwZWNpZmllcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgJ2NhbGwuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1ldGhvZDpcbicKKyAgICAgICAgICAnICAgVGhlIHJlc3VsdCBpcyB1cCB0byB0aGUgaW50ZXJwcmV0ZXI7IHNlZSBCdWlsdC1pbiBGdW5jdGlvbnMgZm9yICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIGRlc2NyaXB0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIGNsYXNzIG9iamVjdDpcbicKKyAgICAgICAgICAnICAgQSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBpcyByZXR1cm5lZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOlxuJworICAgICAgICAgICcgICBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aXRoIGFuICcKKyAgICAgICAgICAnYXJndW1lbnRcbicKKyAgICAgICAgICAnICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlXG4nCisgICAgICAgICAgJyAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBjbGFzcyBpbnN0YW5jZTpcbicKKyAgICAgICAgICAnICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgIl9fY2FsbF9fKCkiIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC5cbicsCisgJ2NsYXNzJzogJ1xuJworICAgICAgICAgICdDbGFzcyBkZWZpbml0aW9uc1xuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgJ3N0YW5kYXJkXG4nCisgICAgICAgICAgJ3R5cGUgaGllcmFyY2h5KTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGNsYXNzZGVmICAgIDo6PSBbZGVjb3JhdG9yc10gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgJworICAgICAgICAgICdzdWl0ZVxuJworICAgICAgICAgICcgICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSJcbicKKyAgICAgICAgICAnICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSAnCisgICAgICAgICAgJ2xpc3RcbicKKyAgICAgICAgICAndXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgQ3VzdG9taXppbmcgY2xhc3MgJworICAgICAgICAgICdjcmVhdGlvblxuJworICAgICAgICAgICdmb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSAnCisgICAgICAgICAgJ3RvIGFcbicKKyAgICAgICAgICAnY2xhc3Mgb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiAnCisgICAgICAgICAgJ2luaGVyaXRhbmNlXG4nCisgICAgICAgICAgJ2xpc3QgaW5oZXJpdCwgYnkgZGVmYXVsdCwgZnJvbSB0aGUgYmFzZSBjbGFzcyAib2JqZWN0IjsgaGVuY2UsXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzcyBGb286XG4nCisgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzcyBGb28ob2JqZWN0KTpcbicKKyAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIlRoZSBjbGFzcydzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbiIKKyAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG4nCisgICAgICAgICAgJ29yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG4nCisgICAgICAgICAgImZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCAiCisgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICdleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gJworICAgICAgICAgICdBXG4nCisgICAgICAgICAgJ2NsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSAnCisgICAgICAgICAgJ2Jhc2VcbicKKyAgICAgICAgICAnY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgJ1RoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxuJworICAgICAgICAgICduYW1lc3BhY2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nIG1ldGFjbGFzc2VzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgJworICAgICAgICAgICdmdW5jdGlvbnMsXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBAZjEoYXJnKVxuJworICAgICAgICAgICcgICBAZjJcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzcyBGb286IHBhc3NcbicKKyAgICAgICAgICAnICAgRm9vID0gZjEoYXJnKShmMihGb28pKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcyBvYmplY3QsIHdoaWNoIGlzICcKKyAgICAgICAgICAndGhlblxuJworICAgICAgICAgICdib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIioqUHJvZ3JhbW1lcidzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gIgorICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlICcKKyAgICAgICAgICAnYXR0cmlidXRlc1xuJworICAgICAgICAgICdjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG4nCisgICAgICAgICAgJ2luc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gJworICAgICAgICAgICciInNlbGYubmFtZSIiLFxuJworICAgICAgICAgICdhbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICduYW1lXG4nCisgICAgICAgICAgJ3doZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzICcKKyAgICAgICAgICAnZGVmYXVsdHNcbicKKyAgICAgICAgICAnZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJ3VuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxuJworICAgICAgICAgICd2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuJworICAgICAgICAgICcgIENsYXNzIERlY29yYXRvcnNcbicsCisgJ2NvbXBhcmlzb25zJzogJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29uc1xuJworICAgICAgICAgICAgICAgICcqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICdwcmlvcml0eSxcbicKKyAgICAgICAgICAgICAgICAnd2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciAnCisgICAgICAgICAgICAgICAgJ2JpdHdpc2VcbicKKyAgICAgICAgICAgICAgICAnb3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuJworICAgICAgICAgICAgICAgICcgICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiIT0iXG4nCisgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogIlRydWUiIG9yICJGYWxzZSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDb21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgInggPCB5IDw9IHoiICcKKyAgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICAnZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyAnCisgICAgICAgICAgICAgICAgJ2V2YWx1YXRlZCBvbmx5XG4nCisgICAgICAgICAgICAgICAgJ29uY2UgKGJ1dCBpbiBib3RoIGNhc2VzICJ6IiBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuICJ4IDwgJworICAgICAgICAgICAgICAgICd5IiBpc1xuJworICAgICAgICAgICAgICAgICdmb3VuZCB0byBiZSBmYWxzZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdGb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICcKKyAgICAgICAgICAgICAgICAnKm9wMSosXG4nCisgICAgICAgICAgICAgICAgJypvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiAiYSBvcDEgYiBvcDIgJworICAgICAgICAgICAgICAgICdjIC4uLiB5XG4nCisgICAgICAgICAgICAgICAgJ29wTiB6IiBpcyBlcXVpdmFsZW50IHRvICJhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4gJworICAgICAgICAgICAgICAgICd6IiwgZXhjZXB0XG4nCisgICAgICAgICAgICAgICAgJ3RoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgImEgb3AxIGIgb3AyIGMiIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mICcKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBiZXR3ZWVuXG4nCisgICAgICAgICAgICAgICAgJyphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCAieCA8IHkgPiB6IiBpcyBwZXJmZWN0bHkgbGVnYWwgJworICAgICAgICAgICAgICAgICcodGhvdWdoXG4nCisgICAgICAgICAgICAgICAgJ3BlcmhhcHMgbm90IHByZXR0eSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVmFsdWUgY29tcGFyaXNvbnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgJworICAgICAgICAgICAgICAgICd0aGUgdmFsdWVzXG4nCisgICAgICAgICAgICAgICAgJ29mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgZG8gbm90IG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgJ3R5cGUuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdDaGFwdGVyIE9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMgc3RhdGVzIHRoYXQgb2JqZWN0cyBoYXZlIGEgJworICAgICAgICAgICAgICAgICd2YWx1ZSAoaW5cbicKKyAgICAgICAgICAgICAgICAnYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhICcKKyAgICAgICAgICAgICAgICAncmF0aGVyXG4nCisgICAgICAgICAgICAgICAgJ2Fic3RyYWN0IG5vdGlvbiBpbiBQeXRob246IEZvciBleGFtcGxlLCB0aGVyZSBpcyBubyBjYW5vbmljYWwgJworICAgICAgICAgICAgICAgICdhY2Nlc3NcbicKKyAgICAgICAgICAgICAgICAibWV0aG9kIGZvciBhbiBvYmplY3QncyB2YWx1ZS4gIEFsc28sIHRoZXJlIGlzIG5vIHJlcXVpcmVtZW50ICIKKyAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAndmFsdWUgb2YgYW4gb2JqZWN0IHNob3VsZCBiZSBjb25zdHJ1Y3RlZCBpbiBhIHBhcnRpY3VsYXIgd2F5LCAnCisgICAgICAgICAgICAgICAgJ2UuZy5cbicKKyAgICAgICAgICAgICAgICAnY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9ycyAnCisgICAgICAgICAgICAgICAgJ2ltcGxlbWVudCBhXG4nCisgICAgICAgICAgICAgICAgJ3BhcnRpY3VsYXIgbm90aW9uIG9mIHdoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcy4gIE9uZSBjYW4gJworICAgICAgICAgICAgICAgICd0aGluayBvZlxuJworICAgICAgICAgICAgICAgICd0aGVtIGFzIGRlZmluaW5nIHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaW5kaXJlY3RseSwgYnkgbWVhbnMgJworICAgICAgICAgICAgICAgICdvZiB0aGVpclxuJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQmVjYXVzZSBhbGwgdHlwZXMgYXJlIChkaXJlY3Qgb3IgaW5kaXJlY3QpIHN1YnR5cGVzIG9mICcKKyAgICAgICAgICAgICAgICAnIm9iamVjdCIsIHRoZXlcbicKKyAgICAgICAgICAgICAgICAnaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yIGZyb20gIm9iamVjdCIuICBUeXBlcyAnCisgICAgICAgICAgICAgICAgJ2NhblxuJworICAgICAgICAgICAgICAgICdjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgJ21ldGhvZHMqIGxpa2UgIl9fbHRfXygpIiwgZGVzY3JpYmVkIGluIEJhc2ljIGN1c3RvbWl6YXRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgJworICAgICAgICAgICAgICAgICdpcyBiYXNlZFxuJworICAgICAgICAgICAgICAgICdvbiB0aGUgaWRlbnRpdHkgb2YgdGhlIG9iamVjdHMuICBIZW5jZSwgZXF1YWxpdHkgY29tcGFyaXNvbiAnCisgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB3aXRoIHRoZSBzYW1lIGlkZW50aXR5IHJlc3VsdHMgaW4gZXF1YWxpdHksIGFuZCAnCisgICAgICAgICAgICAgICAgJ2VxdWFsaXR5XG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpblxuJworICAgICAgICAgICAgICAgICdpbmVxdWFsaXR5LiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdGhlICcKKyAgICAgICAgICAgICAgICAnZGVzaXJlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAnYWxsIG9iamVjdHMgc2hvdWxkIGJlIHJlZmxleGl2ZSAoaS5lLiAieCBpcyB5IiBpbXBsaWVzICJ4ID09ICcKKyAgICAgICAgICAgICAgICAneSIpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAncHJvdmlkZWQ7XG4nCisgICAgICAgICAgICAgICAgJ2FuIGF0dGVtcHQgcmFpc2VzICJUeXBlRXJyb3IiLiAgQSBtb3RpdmF0aW9uIGZvciB0aGlzIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICdiZWhhdmlvclxuJworICAgICAgICAgICAgICAgICdpcyB0aGUgbGFjayBvZiBhIHNpbWlsYXIgaW52YXJpYW50IGFzIGZvciBlcXVhbGl0eS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBlcXVhbGl0eSBjb21wYXJpc29uLCB0aGF0ICcKKyAgICAgICAgICAgICAgICAnaW5zdGFuY2VzIHdpdGhcbicKKyAgICAgICAgICAgICAgICAnZGlmZmVyZW50IGlkZW50aXRpZXMgYXJlIGFsd2F5cyB1bmVxdWFsLCBtYXkgYmUgaW4gY29udHJhc3QgJworICAgICAgICAgICAgICAgICd0byB3aGF0XG4nCisgICAgICAgICAgICAgICAgJ3R5cGVzIHdpbGwgbmVlZCB0aGF0IGhhdmUgYSBzZW5zaWJsZSBkZWZpbml0aW9uIG9mIG9iamVjdCAnCisgICAgICAgICAgICAgICAgJ3ZhbHVlIGFuZFxuJworICAgICAgICAgICAgICAgICd2YWx1ZS1iYXNlZCBlcXVhbGl0eS4gIFN1Y2ggdHlwZXMgd2lsbCBuZWVkIHRvIGN1c3RvbWl6ZSAnCisgICAgICAgICAgICAgICAgJ3RoZWlyXG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gYmVoYXZpb3IsIGFuZCBpbiBmYWN0LCBhIG51bWJlciBvZiBidWlsdC1pbiB0eXBlcyAnCisgICAgICAgICAgICAgICAgJ2hhdmUgZG9uZVxuJworICAgICAgICAgICAgICAgICd0aGF0LlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgJworICAgICAgICAgICAgICAgICdtb3N0XG4nCisgICAgICAgICAgICAgICAgJ2ltcG9ydGFudCBidWlsdC1pbiB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogTnVtYmVycyBvZiBidWlsdC1pbiBudW1lcmljIHR5cGVzIChOdW1lcmljIFR5cGVzIC0tLSBpbnQsICcKKyAgICAgICAgICAgICAgICAnZmxvYXQsXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGxleCkgYW5kIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHR5cGVzICcKKyAgICAgICAgICAgICAgICAnImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgImRlY2ltYWwuRGVjaW1hbCIgY2FuIGJlIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyICcKKyAgICAgICAgICAgICAgICAndHlwZXMsXG4nCisgICAgICAgICAgICAgICAgJyAgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBjb21wbGV4IG51bWJlcnMgZG8gbm90IHN1cHBvcnQgJworICAgICAgICAgICAgICAgICdvcmRlclxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmlzb24uICBXaXRoaW4gdGhlIGxpbWl0cyBvZiB0aGUgdHlwZXMgaW52b2x2ZWQsIHRoZXkgJworICAgICAgICAgICAgICAgICdjb21wYXJlXG4nCisgICAgICAgICAgICAgICAgJyAgbWF0aGVtYXRpY2FsbHkgKGFsZ29yaXRobWljYWxseSkgY29ycmVjdCB3aXRob3V0IGxvc3Mgb2YgJworICAgICAgICAgICAgICAgICdwcmVjaXNpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFRoZSBub3QtYS1udW1iZXIgdmFsdWVzICJmbG9hdChcJ05hTlwnKSIgYW5kICcKKyAgICAgICAgICAgICAgICAnIkRlY2ltYWwoXCdOYU5cJykiIGFyZVxuJworICAgICAgICAgICAgICAgICcgIHNwZWNpYWwuICBUaGV5IGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcyAoInggaXMgeCIgaXMgJworICAgICAgICAgICAgICAgICd0cnVlKSBidXRcbicKKyAgICAgICAgICAgICAgICAnICBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMgKCJ4ID09IHgiIGlzIGZhbHNlKS4gICcKKyAgICAgICAgICAgICAgICAnQWRkaXRpb25hbGx5LFxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmluZyBhbnkgbnVtYmVyIHRvIGEgbm90LWEtbnVtYmVyIHZhbHVlIHdpbGwgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAnIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAnICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8IGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpICcKKyAgICAgICAgICAgICAgICAnPCAzIiB3aWxsXG4nCisgICAgICAgICAgICAgICAgJyAgcmV0dXJuICJGYWxzZSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEJpbmFyeSBzZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAiYnl0ZXMiIG9yICJieXRlYXJyYXkiKSBjYW4gJworICAgICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlXG4nCisgICAgICAgICAgICAgICAgJyAgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgdmFsdWVzIG9mIHRoZWlyICcKKyAgICAgICAgICAgICAgICAnZWxlbWVudHMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIFN0cmluZ3MgKGluc3RhbmNlcyBvZiAic3RyIikgY29tcGFyZSBsZXhpY29ncmFwaGljYWxseSAnCisgICAgICAgICAgICAgICAgJ3VzaW5nIHRoZVxuJworICAgICAgICAgICAgICAgICcgIG51bWVyaWNhbCBVbmljb2RlIGNvZGUgcG9pbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgICAgJyAgIm9yZCgpIikgb2YgdGhlaXIgY2hhcmFjdGVycy4gWzNdXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFN0cmluZ3MgYW5kIGJpbmFyeSBzZXF1ZW5jZXMgY2Fubm90IGJlIGRpcmVjdGx5IGNvbXBhcmVkLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiAnCisgICAgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgICAgJyAgY29tcGFyZWQgb25seSB3aXRoaW4gZWFjaCBvZiB0aGVpciB0eXBlcywgd2l0aCB0aGUgJworICAgICAgICAgICAgICAgICdyZXN0cmljdGlvbiB0aGF0XG4nCisgICAgICAgICAgICAgICAgJyAgcmFuZ2VzIGRvIG5vdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24uICBFcXVhbGl0eSAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gYWNyb3NzXG4nCisgICAgICAgICAgICAgICAgJyAgdGhlc2UgdHlwZXMgcmVzdWx0cyBpbiB1bmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiAnCisgICAgICAgICAgICAgICAgJ2Fjcm9zc1xuJworICAgICAgICAgICAgICAgICcgIHRoZXNlIHR5cGVzIHJhaXNlcyAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgU2VxdWVuY2VzIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuJworICAgICAgICAgICAgICAgICcgIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMsIHdoZXJlYnkgcmVmbGV4aXZpdHkgb2YgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICAnICBlbmZvcmNlZC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgSW4gZW5mb3JjaW5nIHJlZmxleGl2aXR5IG9mIGVsZW1lbnRzLCB0aGUgY29tcGFyaXNvbiBvZiAnCisgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgJyAgYXNzdW1lcyB0aGF0IGZvciBhIGNvbGxlY3Rpb24gZWxlbWVudCAieCIsICJ4ID09IHgiIGlzICcKKyAgICAgICAgICAgICAgICAnYWx3YXlzIHRydWUuXG4nCisgICAgICAgICAgICAgICAgJyAgQmFzZWQgb24gdGhhdCBhc3N1bXB0aW9uLCBlbGVtZW50IGlkZW50aXR5IGlzIGNvbXBhcmVkICcKKyAgICAgICAgICAgICAgICAnZmlyc3QsIGFuZFxuJworICAgICAgICAgICAgICAgICcgIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgb25seSBmb3IgZGlzdGluY3QgJworICAgICAgICAgICAgICAgICdlbGVtZW50cy4gIFRoaXNcbicKKyAgICAgICAgICAgICAgICAnICBhcHByb2FjaCB5aWVsZHMgdGhlIHNhbWUgcmVzdWx0IGFzIGEgc3RyaWN0IGVsZW1lbnQgJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgJyAgd291bGQsIGlmIHRoZSBjb21wYXJlZCBlbGVtZW50cyBhcmUgcmVmbGV4aXZlLiAgRm9yICcKKyAgICAgICAgICAgICAgICAnbm9uLXJlZmxleGl2ZVxuJworICAgICAgICAgICAgICAgICcgIGVsZW1lbnRzLCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIGZvciBzdHJpY3QgZWxlbWVudFxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmlzb24sIGFuZCBtYXkgYmUgc3VycHJpc2luZzogIFRoZSBub24tcmVmbGV4aXZlICcKKyAgICAgICAgICAgICAgICAnbm90LWEtbnVtYmVyXG4nCisgICAgICAgICAgICAgICAgJyAgdmFsdWVzIGZvciBleGFtcGxlIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gJworICAgICAgICAgICAgICAgICdiZWhhdmlvciB3aGVuXG4nCisgICAgICAgICAgICAgICAgJyAgdXNlZCBpbiBhIGxpc3Q6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICIgICAgID4+PiBuYW4gPSBmbG9hdCgnTmFOJylcbiIKKyAgICAgICAgICAgICAgICAnICAgICA+Pj4gbmFuIGlzIG5hblxuJworICAgICAgICAgICAgICAgICcgICAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAnICAgICA+Pj4gbmFuID09IG5hblxuJworICAgICAgICAgICAgICAgICcgICAgIEZhbHNlICAgICAgICAgICAgICAgICA8LS0gdGhlIGRlZmluZWQgbm9uLXJlZmxleGl2ZSAnCisgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIG9mIE5hTlxuJworICAgICAgICAgICAgICAgICcgICAgID4+PiBbbmFuXSA9PSBbbmFuXVxuJworICAgICAgICAgICAgICAgICcgICAgIFRydWUgICAgICAgICAgICAgICAgICA8LS0gbGlzdCBlbmZvcmNlcyByZWZsZXhpdml0eSBhbmQgJworICAgICAgICAgICAgICAgICd0ZXN0cyBpZGVudGl0eSBmaXJzdFxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBMZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBiZXR3ZWVuIGJ1aWx0LWluIGNvbGxlY3Rpb25zICcKKyAgICAgICAgICAgICAgICAnd29ya3MgYXNcbicKKyAgICAgICAgICAgICAgICAnICBmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAqIEZvciB0d28gY29sbGVjdGlvbnMgdG8gY29tcGFyZSBlcXVhbCwgdGhleSBtdXN0IGJlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAnICAgIHR5cGUsIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgZWFjaCBwYWlyIG9mICcKKyAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZ1xuJworICAgICAgICAgICAgICAgICcgICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICcKKyAgICAgICAgICAgICAgICAnKDEsMikiIGlzXG4nCisgICAgICAgICAgICAgICAgJyAgICBmYWxzZSBiZWNhdXNlIHRoZSB0eXBlIGlzIG5vdCB0aGUgc2FtZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICogQ29sbGVjdGlvbnMgdGhhdCBzdXBwb3J0IG9yZGVyIGNvbXBhcmlzb24gYXJlIG9yZGVyZWQgdGhlICcKKyAgICAgICAgICAgICAgICAnc2FtZVxuJworICAgICAgICAgICAgICAgICcgICAgYXMgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9ICcKKyAgICAgICAgICAgICAgICAnWzEsMix5XSJcbicKKyAgICAgICAgICAgICAgICAnICAgIGhhcyB0aGUgc2FtZSB2YWx1ZSBhcyAieCA8PSB5IikuICBJZiBhIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICAgICAgICdlbGVtZW50IGRvZXNcbicKKyAgICAgICAgICAgICAgICAnICAgIG5vdCBleGlzdCwgdGhlIHNob3J0ZXIgY29sbGVjdGlvbiBpcyBvcmRlcmVkIGZpcnN0IChmb3IgJworICAgICAgICAgICAgICAgICdleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICcgICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIE1hcHBpbmdzIChpbnN0YW5jZXMgb2YgImRpY3QiKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmICcKKyAgICAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICAgICcgIGhhdmUgZXF1YWwgKihrZXksIHZhbHVlKSogcGFpcnMuIEVxdWFsaXR5IGNvbXBhcmlzb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAna2V5cyBhbmRcbicKKyAgICAgICAgICAgICAgICAnICBlbGVtZW50cyBlbmZvcmNlcyByZWZsZXhpdml0eS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgT3JkZXIgY29tcGFyaXNvbnMgKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgcmFpc2UgJworICAgICAgICAgICAgICAgICciVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogU2V0cyAoaW5zdGFuY2VzIG9mICJzZXQiIG9yICJmcm96ZW5zZXQiKSBjYW4gYmUgY29tcGFyZWQgJworICAgICAgICAgICAgICAgICd3aXRoaW5cbicKKyAgICAgICAgICAgICAgICAnICBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBUaGV5IGRlZmluZSBvcmRlciBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmQgJworICAgICAgICAgICAgICAgICdzdXBlcnNldFxuJworICAgICAgICAgICAgICAgICcgIHRlc3RzLiAgVGhvc2UgcmVsYXRpb25zIGRvIG5vdCBkZWZpbmUgdG90YWwgb3JkZXJpbmdzIChmb3IgJworICAgICAgICAgICAgICAgICdleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICcgIHRoZSB0d28gc2V0cyAiezEsMn0iIGFuZCAiezIsM30iIGFyZSBub3QgZXF1YWwsIG5vciBzdWJzZXRzICcKKyAgICAgICAgICAgICAgICAnb2Ygb25lXG4nCisgICAgICAgICAgICAgICAgJyAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyAnCisgICAgICAgICAgICAgICAgJ2FyZSBub3RcbicKKyAgICAgICAgICAgICAgICAnICBhcHByb3ByaWF0ZSBhcmd1bWVudHMgZm9yIGZ1bmN0aW9ucyB3aGljaCBkZXBlbmQgb24gdG90YWwgJworICAgICAgICAgICAgICAgICdvcmRlcmluZ1xuJworICAgICAgICAgICAgICAgICcgIChmb3IgZXhhbXBsZSwgIm1pbigpIiwgIm1heCgpIiwgYW5kICJzb3J0ZWQoKSIgcHJvZHVjZSAnCisgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZFxuJworICAgICAgICAgICAgICAgICcgIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgQ29tcGFyaXNvbiBvZiBzZXRzIGVuZm9yY2VzIHJlZmxleGl2aXR5IG9mIGl0cyBlbGVtZW50cy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogTW9zdCBvdGhlciBidWlsdC1pbiB0eXBlcyBoYXZlIG5vIGNvbXBhcmlzb24gbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkLFxuJworICAgICAgICAgICAgICAgICcgIHNvIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVXNlci1kZWZpbmVkIGNsYXNzZXMgdGhhdCBjdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciAnCisgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICdmb2xsb3cgc29tZSBjb25zaXN0ZW5jeSBydWxlcywgaWYgcG9zc2libGU6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsICcKKyAgICAgICAgICAgICAgICAnaWRlbnRpY2FsXG4nCisgICAgICAgICAgICAgICAgJyAgb2JqZWN0cyBzaG91bGQgY29tcGFyZSBlcXVhbDpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggaXMgeSIgaW1wbGllcyAieCA9PSB5IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBDb21wYXJpc29uIHNob3VsZCBiZSBzeW1tZXRyaWMuIEluIG90aGVyIHdvcmRzLCB0aGUgJworICAgICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAgICAnICBleHByZXNzaW9ucyBzaG91bGQgaGF2ZSB0aGUgc2FtZSByZXN1bHQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID09IHkiIGFuZCAieSA9PSB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCAhPSB5IiBhbmQgInkgIT0geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPCB5IiBhbmQgInkgPiB4IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8PSB5IiBhbmQgInkgPj0geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAnCisgICAgICAgICAgICAgICAgJyhub24tZXhoYXVzdGl2ZSlcbicKKyAgICAgICAgICAgICAgICAnICBleGFtcGxlcyBpbGx1c3RyYXRlIHRoYXQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID4geSBhbmQgeSA+IHoiIGltcGxpZXMgInggPiB6IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIEludmVyc2UgY29tcGFyaXNvbiBzaG91bGQgcmVzdWx0IGluIHRoZSBib29sZWFuIG5lZ2F0aW9uLiAnCisgICAgICAgICAgICAgICAgJ0luIG90aGVyXG4nCisgICAgICAgICAgICAgICAgJyAgd29yZHMsIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICdyZXN1bHQ6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID09IHkiIGFuZCAibm90IHggIT0geSJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4ID4geSIgYW5kICJub3QgeCA8PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBUaGUgbGFzdCB0d28gZXhwcmVzc2lvbnMgYXBwbHkgdG8gdG90YWxseSBvcmRlcmVkICcKKyAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnMgKGUuZy5cbicKKyAgICAgICAgICAgICAgICAnICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZVxuJworICAgICAgICAgICAgICAgICcgICJ0b3RhbF9vcmRlcmluZygpIiBkZWNvcmF0b3IuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdQeXRob24gZG9lcyBub3QgZW5mb3JjZSB0aGVzZSBjb25zaXN0ZW5jeSBydWxlcy4gSW4gZmFjdCwgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnbm90LWEtbnVtYmVyIHZhbHVlcyBhcmUgYW4gZXhhbXBsZSBmb3Igbm90IGZvbGxvd2luZyB0aGVzZSAnCisgICAgICAgICAgICAgICAgJ3J1bGVzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ01lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiAnCisgICAgICAgICAgICAgICAgJ3MiXG4nCisgICAgICAgICAgICAgICAgJ2V2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSAnCisgICAgICAgICAgICAgICAgJ290aGVyd2lzZS4gICJ4XG4nCisgICAgICAgICAgICAgICAgJ25vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICAgICdhbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAnCisgICAgICAgICAgICAgICAgJyJpbiIgdGVzdHNcbicKKyAgICAgICAgICAgICAgICAnd2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgJworICAgICAgICAgICAgICAgICdzdWNoIGFzXG4nCisgICAgICAgICAgICAgICAgJ2xpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgb3IgY29sbGVjdGlvbnMuZGVxdWUsIHRoZVxuJworICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlICcKKyAgICAgICAgICAgICAgICAnZm9yIGUgaW5cbicKKyAgICAgICAgICAgICAgICAneSkiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5ICcKKyAgICAgICAgICAgICAgICAnaWYgKngqIGlzXG4nCisgICAgICAgICAgICAgICAgJ2Egc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9ICcKKyAgICAgICAgICAgICAgICAnLTEiLiAgRW1wdHlcbicKKyAgICAgICAgICAgICAgICAnc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyICcKKyAgICAgICAgICAgICAgICAnc3RyaW5nLFxuJworICAgICAgICAgICAgICAgICdzbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0ZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgJworICAgICAgICAgICAgICAgICdtZXRob2QsICJ4XG4nCisgICAgICAgICAgICAgICAgJ2luIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiAnCisgICAgICAgICAgICAgICAgJ2J1dCBkb1xuJworICAgICAgICAgICAgICAgICdkZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggJworICAgICAgICAgICAgICAgICcieCA9PSB6IlxuJworICAgICAgICAgICAgICAgICdpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciAieSIuICBJZiBhbiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICAgICdyYWlzZWRcbicKKyAgICAgICAgICAgICAgICAnZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgJworICAgICAgICAgICAgICAgICdleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAnZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSAnCisgICAgICAgICAgICAgICAgJ25vbi1cbicKKyAgICAgICAgICAgICAgICAnbmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsICcKKyAgICAgICAgICAgICAgICAnbG93ZXJcbicKKyAgICAgICAgICAgICAgICAnaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSAnCisgICAgICAgICAgICAgICAgJ290aGVyXG4nCisgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgJworICAgICAgICAgICAgICAgICdleGNlcHRpb24pLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlICcKKyAgICAgICAgICAgICAgICAndmFsdWUgb2ZcbicKKyAgICAgICAgICAgICAgICAnImluIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGl0eSBjb21wYXJpc29uc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9ycyAiaXMiIGFuZCAiaXMgbm90IiB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6ICJ4ICcKKyAgICAgICAgICAgICAgICAnaXMgeSIgaXNcbicKKyAgICAgICAgICAgICAgICAndHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgJworICAgICAgICAgICAgICAgICdub3QgeSJcbicKKyAgICAgICAgICAgICAgICAneWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbNF1cbicsCisgJ2NvbXBvdW5kJzogJ1xuJworICAgICAgICAgICAgICdDb21wb3VuZCBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NvbXBvdW5kIHN0YXRlbWVudHMgY29udGFpbiAoZ3JvdXBzIG9mKSBvdGhlciBzdGF0ZW1lbnRzOyB0aGV5ICcKKyAgICAgICAgICAgICAnYWZmZWN0XG4nCisgICAgICAgICAgICAgJ29yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgJworICAgICAgICAgICAgICdJblxuJworICAgICAgICAgICAgICdnZW5lcmFsLCBjb21wb3VuZCBzdGF0ZW1lbnRzIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFsdGhvdWdoIGluICcKKyAgICAgICAgICAgICAnc2ltcGxlXG4nCisgICAgICAgICAgICAgJ2luY2FybmF0aW9ucyBhIHdob2xlIGNvbXBvdW5kIHN0YXRlbWVudCBtYXkgYmUgY29udGFpbmVkIGluIG9uZSAnCisgICAgICAgICAgICAgJ2xpbmUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImlmIiwgIndoaWxlIiBhbmQgImZvciIgc3RhdGVtZW50cyBpbXBsZW1lbnQgdHJhZGl0aW9uYWwgJworICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgJ2Zsb3cgY29uc3RydWN0cy4gICJ0cnkiIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yICcKKyAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICdjb2RlIGZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHMsIHdoaWxlIHRoZSAid2l0aCIgc3RhdGVtZW50ICcKKyAgICAgICAgICAgICAnYWxsb3dzIHRoZVxuJworICAgICAgICAgICAgICdleGVjdXRpb24gb2YgaW5pdGlhbGl6YXRpb24gYW5kIGZpbmFsaXphdGlvbiBjb2RlIGFyb3VuZCBhIGJsb2NrICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnY29kZS4gIEZ1bmN0aW9uIGFuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5ICcKKyAgICAgICAgICAgICAnY29tcG91bmRcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkEgY29tcG91bmQgc3RhdGVtZW50IGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlICdjbGF1c2VzLicgIEEgIgorICAgICAgICAgICAgICdjbGF1c2VcbicKKyAgICAgICAgICAgICAiY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgJ3N1aXRlLicgIFRoZSBjbGF1c2UgaGVhZGVycyBvZiBhXG4iCisgICAgICAgICAgICAgJ3BhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gJworICAgICAgICAgICAgICdsZXZlbC5cbicKKyAgICAgICAgICAgICAnRWFjaCBjbGF1c2UgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdW5pcXVlbHkgaWRlbnRpZnlpbmcga2V5d29yZCAnCisgICAgICAgICAgICAgJ2FuZCBlbmRzXG4nCisgICAgICAgICAgICAgJ3dpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuJworICAgICAgICAgICAgICdjbGF1c2UuICBBIHN1aXRlIGNhbiBiZSBvbmUgb3IgbW9yZSBzZW1pY29sb24tc2VwYXJhdGVkIHNpbXBsZVxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGhlYWRlciwgZm9sbG93aW5nIHRoZSAnCisgICAgICAgICAgICAgImhlYWRlcidzXG4iCisgICAgICAgICAgICAgJ2NvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiAnCisgICAgICAgICAgICAgJ3N1YnNlcXVlbnRcbicKKyAgICAgICAgICAgICAnbGluZXMuICBPbmx5IHRoZSBsYXR0ZXIgZm9ybSBvZiBhIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCAnCisgICAgICAgICAgICAgJ2NvbXBvdW5kXG4nCisgICAgICAgICAgICAgInN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRuJ3QgIgorICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICdjbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkICcKKyAgICAgICAgICAgICAnYmVsb25nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCh4KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluICcKKyAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICdjb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpZiB4IDwgeSA8IHo6IHByaW50KHgpOyBwcmludCh5KTsgcHJpbnQoeilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1N1bW1hcml6aW5nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHdoaWxlX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgd2l0aF9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgZnVuY2RlZlxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfd2l0aF9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZm9yX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mdW5jZGVmXG4nCisgICAgICAgICAgICAgJyAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgJworICAgICAgICAgICAgICdzdGF0ZW1lbnQrIERFREVOVFxuJworICAgICAgICAgICAgICcgICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkICcKKyAgICAgICAgICAgICAnYnkgYVxuJworICAgICAgICAgICAgICciREVERU5UIi4gIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5cyAnCisgICAgICAgICAgICAgJ2JlZ2luXG4nCisgICAgICAgICAgICAgJ3dpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuJworICAgICAgICAgICAgICdhbWJpZ3VpdGllcyAodGhlIFwnZGFuZ2xpbmcgImVsc2UiXCcgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAncmVxdWlyaW5nIG5lc3RlZCAiaWYiIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyAnCisgICAgICAgICAgICAgJ3BsYWNlc1xuJworICAgICAgICAgICAgICdlYWNoIGNsYXVzZSBvbiBhIHNlcGFyYXRlIGxpbmUgZm9yIGNsYXJpdHkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9ucyBvbmVcbicKKyAgICAgICAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuICcKKyAgICAgICAgICAgICAnb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICdmb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgJworICAgICAgICAgICAgICdleGVjdXRlZFxuJworICAgICAgICAgICAgICcoYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yICcKKyAgICAgICAgICAgICAnZXZhbHVhdGVkKS5cbicKKyAgICAgICAgICAgICAnSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCAnCisgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgJ3ByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgdHJ1ZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVzIHRoZVxuJworICAgICAgICAgICAgICdmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgJworICAgICAgICAgICAgICd0aW1lXG4nCisgICAgICAgICAgICAgJ2l0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkXG4nCisgICAgICAgICAgICAgJ2FuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgJworICAgICAgICAgICAgICdiYWNrXG4nCisgICAgICAgICAgICAgJ3RvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJmb3IiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAnKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgJworICAgICAgICAgICAgICdzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gJworICAgICAgICAgICAgICdpdGVyYWJsZVxuJworICAgICAgICAgICAgICdvYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuJworICAgICAgICAgICAgICciZXhwcmVzc2lvbl9saXN0Ii4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggJworICAgICAgICAgICAgICdpdGVtXG4nCisgICAgICAgICAgICAgJ3Byb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJ2l0ZXJhdG9yLiAgRWFjaFxuJworICAgICAgICAgICAgICdpdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCAnCisgICAgICAgICAgICAgJ3J1bGVzXG4nCisgICAgICAgICAgICAgJ2ZvciBhc3NpZ25tZW50cyAoc2VlIEFzc2lnbm1lbnQgc3RhdGVtZW50cyksIGFuZCB0aGVuIHRoZSBzdWl0ZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgJworICAgICAgICAgICAgICd3aGVuIHRoZVxuJworICAgICAgICAgICAgICdzZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgJworICAgICAgICAgICAgICdleGNlcHRpb24pLFxuJworICAgICAgICAgICAgICd0aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICAgICd0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kICcKKyAgICAgICAgICAgICAnY29udGludWVzXG4nCisgICAgICAgICAgICAgJ3dpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyAnCisgICAgICAgICAgICAgJ25leHRcbicKKyAgICAgICAgICAgICAnaXRlbS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgJworICAgICAgICAgICAgICdsaXN0LlxuJworICAgICAgICAgICAgICdUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyAnCisgICAgICAgICAgICAgJ2luY2x1ZGluZ1xuJworICAgICAgICAgICAgICd0aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBmb3IgaSBpbiByYW5nZSgxMCk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICcgICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCAnCisgICAgICAgICAgICAgJ3RoZSBuZXh0XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzICcKKyAgICAgICAgICAgICAnZmluaXNoZWQsXG4nCisgICAgICAgICAgICAgJ2J1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkICcKKyAgICAgICAgICAgICAndG8gYXRcbicKKyAgICAgICAgICAgICAnYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAiaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbCdzICIKKyAgICAgICAgICAgICAnImZvciBpXG4nCisgICAgICAgICAgICAgJzo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsICcKKyAgICAgICAgICAgICAnMl0iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gICcKKyAgICAgICAgICAgICAnQW5cbicKKyAgICAgICAgICAgICAnICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgJworICAgICAgICAgICAgICduZXh0LFxuJworICAgICAgICAgICAgICcgIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgJworICAgICAgICAgICAgICdoYXNcbicKKyAgICAgICAgICAgICAnICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzICcKKyAgICAgICAgICAgICAnbWVhbnNcbicKKyAgICAgICAgICAgICAnICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtICcKKyAgICAgICAgICAgICAnZnJvbSB0aGVcbicKKyAgICAgICAgICAgICAnICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlICcKKyAgICAgICAgICAgICAnaW5kZXggb2ZcbicKKyAgICAgICAgICAgICAnICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgJworICAgICAgICAgICAgICdpZiB0aGVcbicKKyAgICAgICAgICAgICAnICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgJ2xvb3AuXG4nCisgICAgICAgICAgICAgJyAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbicKKyAgICAgICAgICAgICAnICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgZm9yIHggaW4gYVs6XTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgJworICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgJ2ZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuJworICAgICAgICAgICAgICcgICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiICcKKyAgICAgICAgICAgICAnc3VpdGUpK1xuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICcgICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiZXhjZXB0IiBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuICcKKyAgICAgICAgICAgICAnV2hlbiBub1xuJworICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlICJ0cnkiIHN1aXRlLCBhIHNlYXJjaCAnCisgICAgICAgICAgICAgJ2ZvciBhblxuJworICAgICAgICAgICAgICdleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZXNcbicKKyAgICAgICAgICAgICAnaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24tXG4nCisgICAgICAgICAgICAgJ2xlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzIGFueVxuJworICAgICAgICAgICAgICdleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgJworICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ2lzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZSAnCisgICAgICAgICAgICAgJ3Jlc3VsdGluZ1xuJworICAgICAgICAgICAgICdvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyAnCisgICAgICAgICAgICAgJ2NvbXBhdGlibGVcbicKKyAgICAgICAgICAgICAnd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnb2JqZWN0IG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGUgJworICAgICAgICAgICAgICdleGNlcHRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uICcKKyAgICAgICAgICAgICAnc3RhY2suXG4nCisgICAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZVxuJworICAgICAgICAgICAgICdyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgJworICAgICAgICAgICAgICdjYW5jZWxlZCBhbmRcbicKKyAgICAgICAgICAgICAnYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSAnCisgICAgICAgICAgICAgJ2FuZCBvblxuJworICAgICAgICAgICAgICd0aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlICJ0cnkiIHN0YXRlbWVudCAnCisgICAgICAgICAgICAgJ3JhaXNlZFxuJworICAgICAgICAgICAgICd0aGUgZXhjZXB0aW9uKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAnYXNzaWduZWQgdG9cbicKKyAgICAgICAgICAgICAndGhlIHRhcmdldCBzcGVjaWZpZWQgYWZ0ZXIgdGhlICJhcyIga2V5d29yZCBpbiB0aGF0IGV4Y2VwdCAnCisgICAgICAgICAgICAgJ2NsYXVzZSwgaWZcbicKKyAgICAgICAgICAgICAicHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG4iCisgICAgICAgICAgICAgJ2NsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyAnCisgICAgICAgICAgICAgJ2Jsb2NrIGlzXG4nCisgICAgICAgICAgICAgJ3JlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgJworICAgICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJyhUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgJworICAgICAgICAgICAgICdleGNlcHRpb24sXG4nCisgICAgICAgICAgICAgJ2FuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgJworICAgICAgICAgICAgICdjbGVhcmVkXG4nCisgICAgICAgICAgICAgJ2F0IHRoZSBlbmQgb2YgdGhlIGV4Y2VwdCBjbGF1c2UuICBUaGlzIGlzIGFzIGlmXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAgICAgICcgICAgICAgZm9vXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd3YXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgICAgICAnICAgICAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBmb29cbicKKyAgICAgICAgICAgICAnICAgICAgIGZpbmFsbHk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgZGVsIE5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gJworICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICdhYmxlIHRvIHJlZmVyIHRvIGl0IGFmdGVyIHRoZSBleGNlcHQgY2xhdXNlLiAgRXhjZXB0aW9ucyBhcmUgJworICAgICAgICAgICAgICdjbGVhcmVkXG4nCisgICAgICAgICAgICAgJ2JlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhICcKKyAgICAgICAgICAgICAncmVmZXJlbmNlXG4nCisgICAgICAgICAgICAgJ2N5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSAnCisgICAgICAgICAgICAgJ2FsaXZlXG4nCisgICAgICAgICAgICAgJ3VudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJCZWZvcmUgYW4gZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuIgorICAgICAgICAgICAgICdleGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgJworICAgICAgICAgICAgICd2aWFcbicKKyAgICAgICAgICAgICAnInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nICcKKyAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0ICcKKyAgICAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICAgICdzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSkgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ3Byb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ3Jlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuICcKKyAgICAgICAgICAgICAncmV0dXJuaW5nXG4nCisgICAgICAgICAgICAgJ2Zyb20gYSBmdW5jdGlvbiB0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyAnCisgICAgICAgICAgICAgJ29mZlxuJworICAgICAgICAgICAgICd0aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ25vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgJworICAgICAgICAgICAgICdUaGUgInRyeSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gICcKKyAgICAgICAgICAgICAnSWYgYW5cbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGVcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkLiAgSWZcbicKKyAgICAgICAgICAgICAndGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICcKKyAgICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlICcKKyAgICAgICAgICAgICAnc2F2ZWRcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICcKKyAgICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iIG9yICJicmVhayIgc3RhdGVtZW50LCB0aGUgc2F2ZWQgJworICAgICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAgICAnaXMgZGlzY2FyZGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgPj4+IGRlZiBmKCk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgICAgICAxLzBcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gNDJcbicKKyAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgJyAgID4+PiBmKClcbicKKyAgICAgICAgICAgICAnICAgNDJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSAnCisgICAgICAgICAgICAgJ2R1cmluZ1xuJworICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlICJmaW5hbGx5IiBjbGF1c2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgJworICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAnYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgJworICAgICAgICAgICAgICdpbGxlZ2FsIGluXG4nCisgICAgICAgICAgICAgJ3RoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuJworICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSAnCisgICAgICAgICAgICAgJ2Z1dHVyZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAnCisgICAgICAgICAgICAgJyJyZXR1cm4iXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyAnCisgICAgICAgICAgICAgJ2JlIHRoZVxuJworICAgICAgICAgICAgICdsYXN0IG9uZSBleGVjdXRlZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBkZWYgZm9vKCk6XG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ3RyeSdcbiIKKyAgICAgICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ2ZpbmFsbHknXG4iCisgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICcgICA+Pj4gZm9vKClcbicKKyAgICAgICAgICAgICAiICAgJ2ZpbmFsbHknXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgICAgICAnRXhjZXB0aW9ucywgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSAicmFpc2UiIHN0YXRlbWVudCB0byAnCisgICAgICAgICAgICAgJ2dlbmVyYXRlXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gVGhlIHJhaXNlIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayAnCisgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAnbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiBXaXRoICcKKyAgICAgICAgICAgICAnU3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ0NvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gJworICAgICAgICAgICAgICcidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ3VzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgJworICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlICcKKyAgICAgICAgICAgICAnIndpdGhfaXRlbSIpXG4nCisgICAgICAgICAgICAgJyAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuJworICAgICAgICAgICAgICcgICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICcKKyAgICAgICAgICAgICAnIl9fZW50ZXJfXygpIlxuJworICAgICAgICAgICAgICcgICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgJworICAgICAgICAgICAgICdhbHdheXMgYmVcbicKKyAgICAgICAgICAgICAnICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yICcKKyAgICAgICAgICAgICAnb2NjdXJyaW5nXG4nCisgICAgICAgICAgICAgJyAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICcgICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnICAgdHJhY2ViYWNrIGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvICJfX2V4aXRfXygpIi4gT3RoZXJ3aXNlLCAnCisgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgJyAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICcgICBmcm9tIHRoZSAiX19leGl0X18oKSIgbWV0aG9kIHdhcyBmYWxzZSwgdGhlIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICAgJ3JlcmFpc2VkLlxuJworICAgICAgICAgICAgICcgICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4nCisgICAgICAgICAgICAgJyAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gJworICAgICAgICAgICAgICdleGNlcHRpb24sIHRoZVxuJworICAgICAgICAgICAgICcgICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiAnCisgICAgICAgICAgICAgJ3Byb2NlZWRzXG4nCisgICAgICAgICAgICAgJyAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyAnCisgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgJ211bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBzdWl0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYTpcbicKKyAgICAgICAgICAgICAnICAgICAgIHdpdGggQigpIGFzIGI6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgJworICAgICAgICAgICAgICdleHByZXNzaW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAnCisgICAgICAgICAgICAgJyJ3aXRoIlxuJworICAgICAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbiBkZWZpbml0aW9uc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0ICcKKyAgICAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICAgICdzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBmdW5jZGVmICAgICAgICAgICAgICAgICA6Oj0gW2RlY29yYXRvcnNdICJkZWYiIGZ1bmNuYW1lICIoIiAnCisgICAgICAgICAgICAgJ1twYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICcgICBkZWNvcmF0b3JzICAgICAgICAgICAgICA6Oj0gZGVjb3JhdG9yK1xuJworICAgICAgICAgICAgICcgICBkZWNvcmF0b3IgICAgICAgICAgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgJworICAgICAgICAgICAgICdbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4nCisgICAgICAgICAgICAgJyAgIGRvdHRlZF9uYW1lICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlcl9saXN0ICAgICAgICAgIDo6PSBkZWZwYXJhbWV0ZXIgKCIsIiBkZWZwYXJhbWV0ZXIpKiAnCisgICAgICAgICAgICAgJ1siLCIgW3BhcmFtZXRlcl9saXN0X3N0YXJhcmdzXV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgIHwgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NcbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3MgOjo9ICIqIiBbcGFyYW1ldGVyXSAoIiwiICcKKyAgICAgICAgICAgICAnZGVmcGFyYW1ldGVyKSogWyIsIiBbIioqIiBwYXJhbWV0ZXIgWyIsIl1dXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiKioiIHBhcmFtZXRlciBbIiwiXVxuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXIgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciBbIjoiIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJyAgIGRlZnBhcmFtZXRlciAgICAgICAgICAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICcgICBmdW5jbmFtZSAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiAnCisgICAgICAgICAgICAgJ2JpbmRzXG4nCisgICAgICAgICAgICAgJ3RoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgJyhhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgJworICAgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAnYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzICcKKyAgICAgICAgICAgICAnZ2V0c1xuJworICAgICAgICAgICAgICdleGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gaXNcbicKKyAgICAgICAgICAgICAnZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAnCisgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICdyZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgJ2FzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gbmFtZVxuJworICAgICAgICAgICAgICdpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkICcKKyAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAnbmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEBmMShhcmcpXG4nCisgICAgICAgICAgICAgJyAgIEBmMlxuJworICAgICAgICAgICAgICcgICBkZWYgZnVuYygpOiBwYXNzXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdpcyBlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBkZWYgZnVuYygpOiBwYXNzXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBvbmUgb3IgbW9yZSAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKiAiPSJcbicKKyAgICAgICAgICAgICAnKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlciAnCisgICAgICAgICAgICAgJ3ZhbHVlcy4iXG4nCisgICAgICAgICAgICAgJ0ZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICAgICcqYXJndW1lbnQqIG1heVxuJworICAgICAgICAgICAgICJiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXIncyBkZWZhdWx0ICIKKyAgICAgICAgICAgICAndmFsdWUgaXNcbicKKyAgICAgICAgICAgICAnc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMgdXAgdW50aWwgdGhlICIiKiIiIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gJworICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgJ2lzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgJworICAgICAgICAgICAgICdncmFtbWFyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzXG4nCisgICAgICAgICAgICAgJ2V2YWx1YXRlZCBvbmNlLCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJyJwcmUtXG4nCisgICAgICAgICAgICAgJ2NvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgJworICAgICAgICAgICAgICdpbXBvcnRhbnRcbicKKyAgICAgICAgICAgICAndG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCAnCisgICAgICAgICAgICAgJ2FzIGFcbicKKyAgICAgICAgICAgICAnbGlzdCBvciBhIGRpY3Rpb25hcnk6IGlmIHRoZSBmdW5jdGlvbiBtb2RpZmllcyB0aGUgb2JqZWN0IChlLmcuICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAnYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0ICcKKyAgICAgICAgICAgICAnbW9kaWZpZWQuXG4nCisgICAgICAgICAgICAgJ1RoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzIGlzICcKKyAgICAgICAgICAgICAndG8gdXNlXG4nCisgICAgICAgICAgICAgJyJOb25lIiBhcyB0aGUgZGVmYXVsdCwgYW5kIGV4cGxpY2l0bHkgdGVzdCBmb3IgaXQgaW4gdGhlIGJvZHkgb2YgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24sIGUuZy46XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4nCisgICAgICAgICAgICAgJyAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4nCisgICAgICAgICAgICAgJyAgICAgICByZXR1cm4gcGVuZ3VpblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAnQ2FsbHMuXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnMgJworICAgICAgICAgICAgICdtZW50aW9uZWQgaW5cbicKKyAgICAgICAgICAgICAndGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb20gJworICAgICAgICAgICAgICdrZXl3b3JkXG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtICIiKmlkZW50aWZpZXIiIiAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ3ByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueSBleGNlc3MgJworICAgICAgICAgICAgICdwb3NpdGlvbmFsXG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYgdGhlIGZvcm1cbicKKyAgICAgICAgICAgICAnIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ldyAnCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnlcbicKKyAgICAgICAgICAgICAncmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXcgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICdkaWN0aW9uYXJ5LiBQYXJhbWV0ZXJzIGFmdGVyICIiKiIiIG9yICIiKmlkZW50aWZpZXIiIiBhcmUgJworICAgICAgICAgICAgICdrZXl3b3JkLW9ubHlcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdQYXJhbWV0ZXJzIG1heSBoYXZlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtICIiOiBleHByZXNzaW9uIiIgJworICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAndGhlIHBhcmFtZXRlciBuYW1lLiAgQW55IHBhcmFtZXRlciBtYXkgaGF2ZSBhbiBhbm5vdGF0aW9uIGV2ZW4gJworICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICdvZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSAnCisgICAgICAgICAgICAgJ2hhdmVcbicKKyAgICAgICAgICAgICAnInJldHVybiIgYW5ub3RhdGlvbiBvZiB0aGUgZm9ybSAiIi0+IGV4cHJlc3Npb24iIiBhZnRlciB0aGUgJworICAgICAgICAgICAgICdwYXJhbWV0ZXJcbicKKyAgICAgICAgICAgICAnbGlzdC4gIFRoZXNlIGFubm90YXRpb25zIGNhbiBiZSBhbnkgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gYW5kICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ2V2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgJworICAgICAgICAgICAgICdtYXlcbicKKyAgICAgICAgICAgICAnYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSAnCisgICAgICAgICAgICAgJ2NvZGUuXG4nCisgICAgICAgICAgICAgJ1RoZSBwcmVzZW5jZSBvZiBhbm5vdGF0aW9ucyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZiBhXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGFcbicKKyAgICAgICAgICAgICAiZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVycycgbmFtZXMgaW4gdGhlICIKKyAgICAgICAgICAgICAnIl9fYW5ub3RhdGlvbnNfXyJcbicKKyAgICAgICAgICAgICAnYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90ICcKKyAgICAgICAgICAgICAnYm91bmRcbicKKyAgICAgICAgICAgICAndG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiBMYW1iZGFzLiAgTm90ZSB0aGF0IHRoZSAnCisgICAgICAgICAgICAgJ2xhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAnZGVmaW5pdGlvbjtcbicKKyAgICAgICAgICAgICAnYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIiJkZWYiIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgJworICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICdhc3NpZ25lZCB0byBhbm90aGVyIG5hbWUganVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhICcKKyAgICAgICAgICAgICAnbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgJworICAgICAgICAgICAgICdpdFxuJworICAgICAgICAgICAgICdhbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIioqUHJvZ3JhbW1lcidzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiCisgICAgICAgICAgICAgJyIiZGVmIiJcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50IGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyAnCisgICAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgICAnaW4gdGhlIG5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAnZnVuY3Rpb25cbicKKyAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gTmFtaW5nIGFuZCBiaW5kaW5nIGZvciAnCisgICAgICAgICAgICAgJ2RldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnNcbicKKyAgICAgICAgICAgICAnICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgJworICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICd0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gJworICAgICAgICAgICAgICciOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgJworICAgICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgICAgJ3VzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIEN1c3RvbWl6aW5nIGNsYXNzICcKKyAgICAgICAgICAgICAnY3JlYXRpb25cbicKKyAgICAgICAgICAgICAnZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgJworICAgICAgICAgICAgICdldmFsdWF0ZSB0byBhXG4nCisgICAgICAgICAgICAgJ2NsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gJworICAgICAgICAgICAgICdpbmhlcml0YW5jZVxuJworICAgICAgICAgICAgICdsaXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vOlxuJworICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vKG9iamVjdCk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJUaGUgY2xhc3MncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAiCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbicKKyAgICAgICAgICAgICAiZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3MncyBzdWl0ZSBmaW5pc2hlcyAiCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiwgaXRzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuICcKKyAgICAgICAgICAgICAnWzRdIEFcbicKKyAgICAgICAgICAgICAnY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlICcKKyAgICAgICAgICAgICAnYmFzZVxuJworICAgICAgICAgICAgICdjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAnZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAnVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsICcKKyAgICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgICAnbmFtZXNwYWNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nICcKKyAgICAgICAgICAgICAnZnVuY3Rpb25zLFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbzogcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgICAgJyAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ2FzIGZvclxuJworICAgICAgICAgICAgICdmdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCAnCisgICAgICAgICAgICAgJ2lzIHRoZW5cbicKKyAgICAgICAgICAgICAnYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uICIKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJ2NsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSAnCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZXNcbicKKyAgICAgICAgICAgICAnY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJ2luc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gJworICAgICAgICAgICAgICciInNlbGYubmFtZSIiLFxuJworICAgICAgICAgICAgICdhbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICAgICduYW1lXG4nCisgICAgICAgICAgICAgJ3doZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuICBDbGFzcyBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGFzICcKKyAgICAgICAgICAgICAnZGVmYXVsdHNcbicKKyAgICAgICAgICAgICAnZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCAnCisgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgJ3VuZXhwZWN0ZWQgcmVzdWx0cy4gIERlc2NyaXB0b3JzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZVxuJworICAgICAgICAgICAgICd2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMyAqKlBFUCAzMTI5KiogLVxuJworICAgICAgICAgICAgICcgIENsYXNzIERlY29yYXRvcnNcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDb3JvdXRpbmVzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuNS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDb3JvdXRpbmUgZnVuY3Rpb24gZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmNfZnVuY2RlZiA6Oj0gW2RlY29yYXRvcnNdICJhc3luYyIgImRlZiIgZnVuY25hbWUgIigiICcKKyAgICAgICAgICAgICAnW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdFeGVjdXRpb24gb2YgUHl0aG9uIGNvcm91dGluZXMgY2FuIGJlIHN1c3BlbmRlZCBhbmQgcmVzdW1lZCBhdCAnCisgICAgICAgICAgICAgJ21hbnlcbicKKyAgICAgICAgICAgICAncG9pbnRzIChzZWUgKmNvcm91dGluZSopLiAgSW4gdGhlIGJvZHkgb2YgYSBjb3JvdXRpbmUsIGFueSAnCisgICAgICAgICAgICAgJyJhd2FpdCIgYW5kXG4nCisgICAgICAgICAgICAgJyJhc3luYyIgaWRlbnRpZmllcnMgYmVjb21lIHJlc2VydmVkIGtleXdvcmRzOyAiYXdhaXQiICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMsXG4nCisgICAgICAgICAgICAgJyJhc3luYyBmb3IiIGFuZCAiYXN5bmMgd2l0aCIgY2FuIG9ubHkgYmUgdXNlZCBpbiBjb3JvdXRpbmUgJworICAgICAgICAgICAgICdib2RpZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbnMgZGVmaW5lZCB3aXRoICJhc3luYyBkZWYiIHN5bnRheCBhcmUgYWx3YXlzIGNvcm91dGluZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIgJworICAgICAgICAgICAgICdrZXl3b3Jkcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiAiYXN5bmMgZGVmIlxuJworICAgICAgICAgICAgICdjb3JvdXRpbmVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jIGRlZiBmdW5jKHBhcmFtMSwgcGFyYW0yKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGRvX3N0dWZmKClcbicKKyAgICAgICAgICAgICAnICAgICAgIGF3YWl0IHNvbWVfY29yb3V0aW5lKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jX2Zvcl9zdG10IDo6PSAiYXN5bmMiIGZvcl9zdG10XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAnKml0ZXIqIGltcGxlbWVudGF0aW9uLCBhbmQgKmFzeW5jaHJvbm91cyBpdGVyYXRvciogY2FuIGNhbGxcbicKKyAgICAgICAgICAgICAnYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImFzeW5jIGZvciIgc3RhdGVtZW50IGFsbG93cyBjb252ZW5pZW50IGl0ZXJhdGlvbiBvdmVyXG4nCisgICAgICAgICAgICAgJ2FzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGNvZGU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luYyBmb3IgVEFSR0VUIGluIElURVI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICcgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0syXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGl0ZXIgPSAoSVRFUilcbicKKyAgICAgICAgICAgICAnICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4nCisgICAgICAgICAgICAgJyAgIHJ1bm5pbmcgPSBUcnVlXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlIHJ1bm5pbmc6XG4nCisgICAgICAgICAgICAgJyAgICAgICB0cnk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgVEFSR0VUID0gYXdhaXQgdHlwZShpdGVyKS5fX2FuZXh0X18oaXRlcilcbicKKyAgICAgICAgICAgICAnICAgICAgIGV4Y2VwdCBTdG9wQXN5bmNJdGVyYXRpb246XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4nCisgICAgICAgICAgICAgJyAgICAgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJyAgIGVsc2U6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DSzJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJhc3luYyBmb3IiIHN0YXRlbWVudCBvdXRzaWRlIG9mICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnImFzeW5jIGRlZiIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJhc3luYyB3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jX3dpdGhfc3RtdCA6Oj0gImFzeW5jIiB3aXRoX3N0bXRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0FuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgJworICAgICAgICAgICAgICdhYmxlXG4nCisgICAgICAgICAgICAgJ3RvIHN1c3BlbmQgZXhlY3V0aW9uIGluIGl0cyAqZW50ZXIqIGFuZCAqZXhpdCogbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29kZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jIHdpdGggRVhQUiBhcyBWQVI6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBtZ3IgPSAoRVhQUilcbicKKyAgICAgICAgICAgICAnICAgYWV4aXQgPSB0eXBlKG1ncikuX19hZXhpdF9fXG4nCisgICAgICAgICAgICAgJyAgIGFlbnRlciA9IHR5cGUobWdyKS5fX2FlbnRlcl9fKG1ncilcbicKKyAgICAgICAgICAgICAnICAgZXhjID0gVHJ1ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVkFSID0gYXdhaXQgYWVudGVyXG4nCisgICAgICAgICAgICAgJyAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdDpcbicKKyAgICAgICAgICAgICAnICAgICAgIGlmIG5vdCBhd2FpdCBhZXhpdChtZ3IsICpzeXMuZXhjX2luZm8oKSk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgcmFpc2VcbicKKyAgICAgICAgICAgICAnICAgZWxzZTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGF3YWl0IGFleGl0KG1nciwgTm9uZSwgTm9uZSwgTm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvICJfX2FlbnRlcl9fKCkiIGFuZCAiX19hZXhpdF9fKCkiIGZvciBkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgb2YgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICciYXN5bmMgZGVmIiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOiAqKlBFUCA0OTIqKiAtIENvcm91dGluZXMgd2l0aCBhc3luYyBhbmQgYXdhaXQgc3ludGF4XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1sxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzXG4nCisgICAgICAgICAgICAgJyAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4nCisgICAgICAgICAgICAgJyAgICBleGNlcHRpb24uIFRoYXQgbmV3IGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9sZCBvbmUgdG8gYmUgJworICAgICAgICAgICAgICdsb3N0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuJworICAgICAgICAgICAgICcgICAgImJyZWFrIiBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbicKKyAgICAgICAgICAgICAnICAgIGZ1bmN0aW9uIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgIl9fZG9jX18iXG4nCisgICAgICAgICAgICAgIiAgICBhdHRyaWJ1dGUgYW5kIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb24ncyAqZG9jc3RyaW5nKi5cbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1s0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSAnCisgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgJyAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyAiX19kb2NfXyIgaXRlbSAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICIgICAgdGhlcmVmb3JlIHRoZSBjbGFzcydzICpkb2NzdHJpbmcqLlxuIiwKKyAnY29udGV4dC1tYW5hZ2Vycyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0EgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dCB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJ2JlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZXh0IG1hbmFnZXJcbicKKyAgICAgICAgICAgICAgICAgICAgICdoYW5kbGVzIHRoZSBlbnRyeSBpbnRvLCBhbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgJworICAgICAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dFxuJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAnbWFuYWdlcnMgYXJlIG5vcm1hbGx5XG4nCisgICAgICAgICAgICAgICAgICAgICAnaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSB3aXRoXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3RhdGVtZW50KSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZWlyIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXN0b3JpbmcgdmFyaW91c1xuJworICAgICAgICAgICAgICAgICAgICAgJ2tpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgJworICAgICAgICAgICAgICAgICAgICAgJ2Nsb3Npbmcgb3BlbmVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnZmlsZXMsIGV0Yy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgQ29udGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAnTWFuYWdlciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19lbnRlcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAgICAgJyJ3aXRoIlxuJworICAgICAgICAgICAgICAgICAgICAgIiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2QncyByZXR1cm4gdmFsdWUgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICd0YXJnZXQocylcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmICcKKyAgICAgICAgICAgICAgICAgICAgICdhbnkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSAnCisgICAgICAgICAgICAgICAgICAgICAnZXhpdGVkLiBJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHdpbGxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBiZSAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ3N1cHByZXNzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCAnCisgICAgICAgICAgICAgICAgICAgICAnaXQgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb2Nlc3NlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXNzZWQtaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICIgICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LlxuIgorICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdQeXRob24gIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICBzdGF0ZW1lbnQuXG4nLAorICdjb250aW51ZSc6ICdcbicKKyAgICAgICAgICAgICAnVGhlICJjb250aW51ZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnImNvbnRpbnVlIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICcKKyAgICAgICAgICAgICAnIndoaWxlIlxuJworICAgICAgICAgICAgICdsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3IgJworICAgICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAgICAnY2xhdXNlIHdpdGhpbiB0aGF0IGxvb3AuICBJdCBjb250aW51ZXMgd2l0aCB0aGUgbmV4dCBjeWNsZSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICduZWFyZXN0IGVuY2xvc2luZyBsb29wLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiAiY29udGludWUiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGFcbicKKyAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgJ3JlYWxseVxuJworICAgICAgICAgICAgICdzdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLlxuJywKKyAnY29udmVyc2lvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgJ0FyaXRobWV0aWMgY29udmVyc2lvbnNcbicKKyAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnV2hlbiBhIGRlc2NyaXB0aW9uIG9mIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IgYmVsb3cgdXNlcyB0aGUgJworICAgICAgICAgICAgICAgICdwaHJhc2VcbicKKyAgICAgICAgICAgICAgICAnInRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUsIiB0aGlzICcKKyAgICAgICAgICAgICAgICAnbWVhbnNcbicKKyAgICAgICAgICAgICAgICAndGhhdCB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzIHdvcmtzIGFzICcKKyAgICAgICAgICAgICAgICAnZm9sbG93czpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyAnCisgICAgICAgICAgICAgICAgJ2NvbnZlcnRlZCB0b1xuJworICAgICAgICAgICAgICAgICcgIGNvbXBsZXg7XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICcgIG90aGVyIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDtcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogb3RoZXJ3aXNlLCBib3RoIG11c3QgYmUgaW50ZWdlcnMgYW5kIG5vIGNvbnZlcnNpb24gaXMgJworICAgICAgICAgICAgICAgICduZWNlc3NhcnkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdTb21lIGFkZGl0aW9uYWwgcnVsZXMgYXBwbHkgZm9yIGNlcnRhaW4gb3BlcmF0b3JzIChlLmcuLCBhICcKKyAgICAgICAgICAgICAgICAnc3RyaW5nIGFzIGFcbicKKyAgICAgICAgICAgICAgICAibGVmdCBhcmd1bWVudCB0byB0aGUgJyUnIG9wZXJhdG9yKS4gIEV4dGVuc2lvbnMgbXVzdCBkZWZpbmUgIgorICAgICAgICAgICAgICAgICd0aGVpciBvd25cbicKKyAgICAgICAgICAgICAgICAnY29udmVyc2lvbiBiZWhhdmlvci5cbicsCisgJ2N1c3RvbWl6YXRpb24nOiAnXG4nCisgICAgICAgICAgICAgICAgICAnQmFzaWMgY3VzdG9taXphdGlvblxuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAnCisgICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIgaXMgYVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgJworICAgICAgICAgICAgICAgICAgJ2FzIHN1Y2gpXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCAnCisgICAgICAgICAgICAgICAgICAnYXMgaXRzXG4nCisgICAgICAgICAgICAgICAgICAnICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgJworICAgICAgICAgICAgICAgICAgJ3Bhc3NlZCB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gICcKKyAgICAgICAgICAgICAgICAgICdUaGUgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICcodXN1YWxseSBhblxuJworICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIG9mICpjbHMqKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdjbGFzcyBieVxuJworICAgICAgICAgICAgICAgICAgJyAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3ICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gJworICAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgJworICAgICAgICAgICAgICAgICAgJ3RoZW4gdGhlIG5ld1xuJworICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiAnCisgICAgICAgICAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgJ2NyZWF0aW9uLiAgSXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluICcKKyAgICAgICAgICAgICAgICAgICdvcmRlciB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAnCisgICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIpLCBidXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlICcKKyAgICAgICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSAnCisgICAgICAgICAgICAgICAgICAnY2xhc3MgaGFzIGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICdtZXRob2QsIGlmXG4nCisgICAgICAgICAgICAgICAgICAnICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyICcKKyAgICAgICAgICAgICAgICAgICdpbml0aWFsaXphdGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICcgICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluICcKKyAgICAgICAgICAgICAgICAgICdjb25zdHJ1Y3RpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gJworICAgICAgICAgICAgICAgICAgJ2N1c3RvbWlzZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgJworICAgICAgICAgICAgICAgICAgJyJfX2luaXRfXygpIjsgZG9pbmcgc29cbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAnaXMgYWxzb1xuJworICAgICAgICAgICAgICAgICAgJyAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCwgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSBjYWxsIGl0XG4nCisgICAgICAgICAgICAgICAgICAnICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBieVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCAnCisgICAgICAgICAgICAgICAgICAnYXQgYSBsYXRlclxuJworICAgICAgICAgICAgICAgICAgJyAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlZCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgJworICAgICAgICAgICAgICAgICAgJ2V4aXN0IHdoZW5cbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tICcKKyAgICAgICAgICAgICAgICAgICd0aGUgZm9ybWVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2xhdHRlciBpc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gICcKKyAgICAgICAgICAgICAgICAgICdTb21lIGNvbW1vblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gJworICAgICAgICAgICAgICAgICAgJ29iamVjdCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cyAoZS5nLixcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdwYXJlbnQgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdzdGFjayBmcmFtZSBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgJworICAgICAgICAgICAgICAgICAgJ3N0b3JlZCBpblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhICcKKyAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuICcKKyAgICAgICAgICAgICAgICAgICd1bmhhbmRsZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCAnCisgICAgICAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICAnCisgICAgICAgICAgICAgICAgICAnVGhlIGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyAnCisgICAgICAgICAgICAgICAgICAndGhlIGN5Y2xlcztcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAndGhpcmQgY2FuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gJworICAgICAgICAgICAgICAgICAgJ0NpcmN1bGFyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCAnCisgICAgICAgICAgICAgICAgICAndXAgd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdCdzIG9uIGJ5ICIKKyAgICAgICAgICAgICAgICAgICdkZWZhdWx0KS4gUmVmZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgJworICAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIHRvcGljLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyICcKKyAgICAgICAgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyICcKKyAgICAgICAgICAgICAgICAgICdkdXJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRoZWlyIGV4ZWN1dGlvbiBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkICcKKyAgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgJworICAgICAgICAgICAgICAgICAgJ2ludm9rZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gJworICAgICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHByb2dyYW0gaXMgZG9uZSksIG90aGVyIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJfX2RlbF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAgJ29mIGJlaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICAnCisgICAgICAgICAgICAgICAgICAnRm9yIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHJlYXNvbiwgIl9fZGVsX18oKSIgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlICcKKyAgICAgICAgICAgICAgICAgICdtaW5pbXVtIG5lZWRlZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggJworICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gMS41LFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggJworICAgICAgICAgICAgICAgICAgJ2Egc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciAnCisgICAgICAgICAgICAgICAgICAnZ2xvYmFscyBhcmVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCAnCisgICAgICAgICAgICAgICAgICAndGhpcyBtYXlcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCAnCisgICAgICAgICAgICAgICAgICAnYXZhaWxhYmxlIGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdGltZSB3aGVuIHRoZSAiX19kZWxfXygpIiBtZXRob2QgaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JlcHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJvZmZpY2lhbCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCAnCisgICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICd1c2VkIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuICcKKyAgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGVudmlyb25tZW50KS4gIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1cbicKKyAgICAgICAgICAgICAgICAgICcgICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiAnCisgICAgICAgICAgICAgICAgICAnVGhlIHJldHVyblxuJworICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAgJyJfX3JlcHJfXygpIiBidXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBub3QgIl9fc3RyX18oKSIsIHRoZW4gIl9fcmVwcl9fKCkiIGlzIGFsc28gdXNlZCB3aGVuIGFuICcKKyAgICAgICAgICAgICAgICAgICciaW5mb3JtYWwiXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgICdyZXF1aXJlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICcKKyAgICAgICAgICAgICAgICAgICciZm9ybWF0KCkiIGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgJworICAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCAnCisgICAgICAgICAgICAgICAgICAndGhlcmUgaXMgbm9cbicKKyAgICAgICAgICAgICAgICAgICcgICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbjogYVxuJworICAgICAgICAgICAgICAgICAgJyAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyJvYmplY3QiXG4nCisgICAgICAgICAgICAgICAgICAnICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ieXRlc19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGF0aW9uIG9mIGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBieSAnCisgICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uLFxuJworICAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRpb24gb2YgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgICcic3RyLmZvcm1hdCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnb2YgYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuIFRoZSAnCisgICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGwgZWl0aGVyICcKKyAgICAgICAgICAgICAgICAgICdkZWxlZ2F0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGEgJworICAgICAgICAgICAgICAgICAgJ3NpbWlsYXJcbicKKyAgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgU2VlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UgZm9yIGEgZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICcKKyAgICAgICAgICAgICAgICAgICcib2JqZWN0IiBpdHNlbGZcbicKKyAgICAgICAgICAgICAgICAgICcgICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgJworICAgICAgICAgICAgICAgICAgJ2lzIGFzXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICcKKyAgICAgICAgICAgICAgICAgICcieC5fX2xlX18oeSkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgJworICAgICAgICAgICAgICAgICAgJyJ4PnkiIGNhbGxzXG4nCisgICAgICAgICAgICAgICAgICAnICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gJworICAgICAgICAgICAgICAgICAgJyJOb3RJbXBsZW1lbnRlZCJcbicKKyAgICAgICAgICAgICAgICAgICcgICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyICcKKyAgICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSAnCisgICAgICAgICAgICAgICAgICAncmV0dXJuZWQgZm9yIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiAnCisgICAgICAgICAgICAgICAgICAnYW55IHZhbHVlLFxuJworICAgICAgICAgICAgICAgICAgJyAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgICdjb250ZXh0IChlLmcuLFxuJworICAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICcKKyAgICAgICAgICAgICAgICAgICciYm9vbCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yICcKKyAgICAgICAgICAgICAgICAgICdmYWxzZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnaW52ZXJ0cyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gJworICAgICAgICAgICAgICAgICAgJ290aGVyIGltcGxpZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yICcKKyAgICAgICAgICAgICAgICAgICdleGFtcGxlLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyAnCisgICAgICAgICAgICAgICAgICAnYXV0b21hdGljYWxseVxuJworICAgICAgICAgICAgICAgICAgJyAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290ICcKKyAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24sIHNlZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICAnbm90ZXMgb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gJworICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgICcodG8gYmUgdXNlZFxuJworICAgICAgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgICdidXQgdGhlIHJpZ2h0XG4nCisgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgJworICAgICAgICAgICAgICAgICAgImVhY2ggb3RoZXInc1xuIgorICAgICAgICAgICAgICAgICAgJyAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgJworICAgICAgICAgICAgICAgICAgJ3JlZmxlY3Rpb24sXG4nCisgICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiAnCisgICAgICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICAgICAiICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmQncyAiCisgICAgICAgICAgICAgICAgICAndHlwZSBpcyBhXG4nCisgICAgICAgICAgICAgICAgICAiICAgZGlyZWN0IG9yIGluZGlyZWN0IHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmQncyB0eXBlLCAiCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksICcKKyAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UgdGhlXG4nCisgICAgICAgICAgICAgICAgICAiICAgbGVmdCBvcGVyYW5kJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgIgorICAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faGFzaF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyAnCisgICAgICAgICAgICAgICAgICAnb24gbWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgJworICAgICAgICAgICAgICAgICAgJyJkaWN0Ii5cbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgJworICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkIHByb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICAnICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZTsgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSAnCisgICAgICAgICAgICAgICAgICAnb3IpIHRoZSBoYXNoXG4nCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgJworICAgICAgICAgICAgICAgICAgJ3BhcnQgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuICcKKyAgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAgJyAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAnCisgICAgICAgICAgICAgICAgICAnIlB5X3NzaXplX3QiLiAgVGhpc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAnCisgICAgICAgICAgICAgICAgICAnMzItYml0XG4nCisgICAgICAgICAgICAgICAgICAnICAgICBidWlsZHMuIElmIGFuIG9iamVjdFwncyAgICJfX2hhc2hfXygpIiBtdXN0ICcKKyAgICAgICAgICAgICAgICAgICdpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiAnCisgICAgICAgICAgICAgICAgICAnYWxsXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICcKKyAgICAgICAgICAgICAgICAgICcicHl0aG9uIC1jXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAiaW1wb3J0IHN5czsgcHJpbnQoc3lzLmhhc2hfaW5mby53aWR0aCkiIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCAnCisgICAgICAgICAgICAgICAgICAnc2hvdWxkIG5vdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICciX19lcV9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgYnV0IG5vdCAiX19oYXNoX18oKSIsIGl0cyBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlICcKKyAgICAgICAgICAgICAgICAgICdhcyBpdGVtcyBpblxuJworICAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCAnCisgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiLCBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgaGFzaGFibGUgJworICAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgICAiICAgcmVxdWlyZXMgdGhhdCBhIGtleSdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgIgorICAgICAgICAgICAgICAgICAgIm9iamVjdCdzIGhhc2hcbiIKKyAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZHMgYnlcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0ICcKKyAgICAgICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlIHN1Y2hcbicKKyAgICAgICAgICAgICAgICAgICcgICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSAnCisgICAgICAgICAgICAgICAgICAnaGFzaCh5KSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgJworICAgICAgICAgICAgICAgICAgJyJfX2hhc2hfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gICcKKyAgICAgICAgICAgICAgICAgICdXaGVuIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSAnCisgICAgICAgICAgICAgICAgICAnYXR0ZW1wdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosICcKKyAgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4nCisgICAgICAgICAgICAgICAgICAnICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgICdzdXBwcmVzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgJworICAgICAgICAgICAgICAgICAgJ2NhbGwuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyAnCisgICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgJworICAgICAgICAgICAgICAgICAgJ3JhbmRvbSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkICcKKyAgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9ucyBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgJworICAgICAgICAgICAgICAgICAgJ2EgZGVuaWFsLVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnZXhwbG9pdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpICcKKyAgICAgICAgICAgICAgICAgICdjb21wbGV4aXR5LlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgU2VlICcKKyAgICAgICAgICAgICAgICAgICdodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnb3JkZXIgb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSAnCisgICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAnCisgICAgICAgICAgICAgICAgICAnMzItYml0IGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSAnCisgICAgICAgICAgICAgICAgICAnZGVmYXVsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ib29sX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCAnCisgICAgICAgICAgICAgICAgICAndGhlIG9iamVjdCBpc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgICAnICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlLlxuJywKKyAnZGVidWdnZXInOiAnXG4nCisgICAgICAgICAgICAgJyJwZGIiIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcqKlNvdXJjZSBjb2RlOioqIExpYi9wZGIucHlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBtb2R1bGUgInBkYiIgZGVmaW5lcyBhbiBpbnRlcmFjdGl2ZSBzb3VyY2UgY29kZSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICdQeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayAnCisgICAgICAgICAgICAgJ2ZyYW1lcyxcbicKKyAgICAgICAgICAgICAnc291cmNlIGNvZGUgbGlzdGluZywgYW5kIGV2YWx1YXRpb24gb2YgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2NvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSAnCisgICAgICAgICAgICAgJ2RlYnVnZ2luZ1xuJworICAgICAgICAgICAgICdhbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZGVidWdnZXIgaXMgZXh0ZW5zaWJsZSAtLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSAnCisgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgJyJQZGIiLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5ICcKKyAgICAgICAgICAgICAncmVhZGluZ1xuJworICAgICAgICAgICAgICd0aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyAiYmRiIiBhbmQgJworICAgICAgICAgICAgICciY21kIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBkZWJ1Z2dlclwncyBwcm9tcHQgaXMgIihQZGIpIi4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSAnCisgICAgICAgICAgICAgJ3Byb2dyYW0gdW5kZXJcbicKKyAgICAgICAgICAgICAnY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IHBkYlxuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4nCisgICAgICAgICAgICAgIiAgID4+PiBwZGIucnVuKCdteW1vZHVsZS50ZXN0KCknKVxuIgorICAgICAgICAgICAgICcgICA+IDxzdHJpbmc+KDApPygpXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpIGNvbnRpbnVlXG4nCisgICAgICAgICAgICAgJyAgID4gPHN0cmluZz4oMSk/KClcbicKKyAgICAgICAgICAgICAnICAgKFBkYikgY29udGludWVcbicKKyAgICAgICAgICAgICAiICAgTmFtZUVycm9yOiAnc3BhbSdcbiIKKyAgICAgICAgICAgICAnICAgPiA8c3RyaW5nPigxKT8oKVxuJworICAgICAgICAgICAgICcgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogVGFiLWNvbXBsZXRpb24gdmlhIHRoZSAicmVhZGxpbmUiIG1vZHVsZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2F2YWlsYWJsZSBmb3IgY29tbWFuZHMgYW5kIGNvbW1hbmQgYXJndW1lbnRzLCBlLmcuIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZ2xvYmFsXG4nCisgICAgICAgICAgICAgJ2FuZCBsb2NhbCBuYW1lcyBhcmUgb2ZmZXJlZCBhcyBhcmd1bWVudHMgb2YgdGhlICJwIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnInBkYi5weSIgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciAnCisgICAgICAgICAgICAgJ3NjcmlwdHMuICBGb3JcbicKKyAgICAgICAgICAgICAnZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHB5dGhvbjMgLW0gcGRiIG15c2NyaXB0LnB5XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGludm9rZWQgYXMgYSBzY3JpcHQsIHBkYiB3aWxsIGF1dG9tYXRpY2FsbHkgZW50ZXIgJworICAgICAgICAgICAgICdwb3N0LW1vcnRlbVxuJworICAgICAgICAgICAgICdkZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gIEFmdGVyICcKKyAgICAgICAgICAgICAncG9zdC1cbicKKyAgICAgICAgICAgICAnbW9ydGVtIGRlYnVnZ2luZyAob3IgYWZ0ZXIgbm9ybWFsIGV4aXQgb2YgdGhlIHByb2dyYW0pLCBwZGIgJworICAgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICAgInJlc3RhcnQgdGhlIHByb2dyYW0uICBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiJ3Mgc3RhdGUgIgorICAgICAgICAgICAgICcoc3VjaFxuJworICAgICAgICAgICAgICdhcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICJkZWJ1Z2dlciB1cG9uIHByb2dyYW0ncyBleGl0LlxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4yOiAicGRiLnB5IiBub3cgYWNjZXB0cyBhICItYyIgb3B0aW9uIHRoYXQgJworICAgICAgICAgICAgICdleGVjdXRlc1xuJworICAgICAgICAgICAgICdjb21tYW5kcyBhcyBpZiBnaXZlbiBpbiBhICIucGRicmMiIGZpbGUsIHNlZSBEZWJ1Z2dlciBDb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nICcKKyAgICAgICAgICAgICAncHJvZ3JhbSBpc1xuJworICAgICAgICAgICAgICd0byBpbnNlcnRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiAnCisgICAgICAgICAgICAgJ3RoZW5cbicKKyAgICAgICAgICAgICAnc3RlcCB0aHJvdWdoIHRoZSBjb2RlIGZvbGxvd2luZyB0aGlzIHN0YXRlbWVudCwgYW5kIGNvbnRpbnVlICcKKyAgICAgICAgICAgICAncnVubmluZ1xuJworICAgICAgICAgICAgICd3aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgImNvbnRpbnVlIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgcGRiXG4nCisgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgbXltb2R1bGVcbicKKyAgICAgICAgICAgICAnICAgPj4+IG15bW9kdWxlLnRlc3QoKVxuJworICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuJworICAgICAgICAgICAgICcgICAgIEZpbGUgIi4vbXltb2R1bGUucHkiLCBsaW5lIDQsIGluIHRlc3RcbicKKyAgICAgICAgICAgICAnICAgICAgIHRlc3QyKClcbicKKyAgICAgICAgICAgICAnICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuJworICAgICAgICAgICAgICcgICAgICAgcHJpbnQoc3BhbSlcbicKKyAgICAgICAgICAgICAnICAgTmFtZUVycm9yOiBzcGFtXG4nCisgICAgICAgICAgICAgJyAgID4+PiBwZGIucG0oKVxuJworICAgICAgICAgICAgICcgICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4nCisgICAgICAgICAgICAgJyAgIC0+IHByaW50KHNwYW0pXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSAnCisgICAgICAgICAgICAgJ2RlYnVnZ2VyXG4nCisgICAgICAgICAgICAgJ2luIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5ydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhlY3V0ZSB0aGUgKnN0YXRlbWVudCogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSBvYmplY3QpICcKKyAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAnICAgZGVidWdnZXIgY29udHJvbC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55ICcKKyAgICAgICAgICAgICAnY29kZSBpc1xuJworICAgICAgICAgICAgICcgICBleGVjdXRlZDsgeW91IGNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgImNvbnRpbnVlIiwgb3IgeW91ICcKKyAgICAgICAgICAgICAnY2FuXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXAgdGhyb3VnaCB0aGUgc3RhdGVtZW50IHVzaW5nICJzdGVwIiBvciAibmV4dCIgKGFsbCB0aGVzZVxuJworICAgICAgICAgICAgICcgICBjb21tYW5kcyBhcmUgZXhwbGFpbmVkIGJlbG93KS4gIFRoZSBvcHRpb25hbCAqZ2xvYmFscyogYW5kICcKKyAgICAgICAgICAgICAnKmxvY2FscypcbicKKyAgICAgICAgICAgICAnICAgYXJndW1lbnRzIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzICcKKyAgICAgICAgICAgICAnZXhlY3V0ZWQ7IGJ5XG4nCisgICAgICAgICAgICAgJyAgIGRlZmF1bHQgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSAiX19tYWluX18iIGlzIHVzZWQuICAnCisgICAgICAgICAgICAgJyhTZWUgdGhlXG4nCisgICAgICAgICAgICAgJyAgIGV4cGxhbmF0aW9uIG9mIHRoZSBidWlsdC1pbiAiZXhlYygpIiBvciAiZXZhbCgpIiBmdW5jdGlvbnMuKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nIG9yIGEgY29kZSAnCisgICAgICAgICAgICAgJ29iamVjdClcbicKKyAgICAgICAgICAgICAnICAgdW5kZXIgZGVidWdnZXIgY29udHJvbC4gIFdoZW4gInJ1bmV2YWwoKSIgcmV0dXJucywgaXQgcmV0dXJucyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICcgICAicnVuKCkiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhICcKKyAgICAgICAgICAgICAnc3RyaW5nKVxuJworICAgICAgICAgICAgICcgICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuICJydW5jYWxsKCkiIHJldHVybnMsIGl0ICcKKyAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICcgICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgJworICAgICAgICAgICAgICdhcHBlYXJzXG4nCisgICAgICAgICAgICAgJyAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIuc2V0X3RyYWNlKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgJworICAgICAgICAgICAgICd1c2VmdWwgdG9cbicKKyAgICAgICAgICAgICAnICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBjb2RlIGlzIG5vdCBvdGhlcndpc2UgYmVpbmcgZGVidWdnZWQgKGUuZy4gd2hlbiBhbiBhc3NlcnRpb25cbicKKyAgICAgICAgICAgICAnICAgZmFpbHMpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnBvc3RfbW9ydGVtKHRyYWNlYmFjaz1Ob25lKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICAnCisgICAgICAgICAgICAgJ0lmIG5vXG4nCisgICAgICAgICAgICAgJyAgICp0cmFjZWJhY2sqIGlzIGdpdmVuLCBpdCB1c2VzIHRoZSBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0ICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgY3VycmVudGx5IGJlaW5nIGhhbmRsZWQgKGFuIGV4Y2VwdGlvbiBtdXN0IGJlIGJlaW5nIGhhbmRsZWQgJworICAgICAgICAgICAgICdpZiB0aGVcbicKKyAgICAgICAgICAgICAnICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5wbSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbnRlciBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcgb2YgdGhlIHRyYWNlYmFjayBmb3VuZCBpblxuJworICAgICAgICAgICAgICcgICAic3lzLmxhc3RfdHJhY2ViYWNrIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAicnVuKiIgZnVuY3Rpb25zIGFuZCAic2V0X3RyYWNlKCkiIGFyZSBhbGlhc2VzIGZvciAnCisgICAgICAgICAgICAgJ2luc3RhbnRpYXRpbmdcbicKKyAgICAgICAgICAgICAndGhlICJQZGIiIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS4gIElmIHlvdSAnCisgICAgICAgICAgICAgJ3dhbnRcbicKKyAgICAgICAgICAgICAndG8gYWNjZXNzIGZ1cnRoZXIgZmVhdHVyZXMsIHlvdSBoYXZlIHRvIGRvIHRoaXMgeW91cnNlbGY6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJjbGFzcyBwZGIuUGRiKGNvbXBsZXRla2V5PSd0YWInLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgIgorICAgICAgICAgICAgICdza2lwPU5vbmUsIG5vc2lnaW50PUZhbHNlKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgIlBkYiIgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkICcKKyAgICAgICAgICAgICAndG8gdGhlXG4nCisgICAgICAgICAgICAgJyAgIHVuZGVybHlpbmcgImNtZC5DbWQiIGNsYXNzOyBzZWUgdGhlIGRlc2NyaXB0aW9uIHRoZXJlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgJworICAgICAgICAgICAgICdnbG9iLXN0eWxlXG4nCisgICAgICAgICAgICAgJyAgIG1vZHVsZSBuYW1lIHBhdHRlcm5zLiAgVGhlIGRlYnVnZ2VyIHdpbGwgbm90IHN0ZXAgaW50byBmcmFtZXMgJworICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgJyAgIG9yaWdpbmF0ZSBpbiBhIG1vZHVsZSB0aGF0IG1hdGNoZXMgb25lIG9mIHRoZXNlIHBhdHRlcm5zLiAnCisgICAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQnkgZGVmYXVsdCwgUGRiIHNldHMgYSBoYW5kbGVyIGZvciB0aGUgU0lHSU5UIHNpZ25hbCAod2hpY2ggJworICAgICAgICAgICAgICdpcyBzZW50XG4nCisgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAiQ3RybC1DIiBvbiB0aGUgY29uc29sZSkgd2hlbiB5b3UgZ2l2ZSAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgImNvbnRpbnVlIiBjb21tYW5kLiBUaGlzIGFsbG93cyB5b3UgdG8gYnJlYWsgaW50byB0aGUgJworICAgICAgICAgICAgICdkZWJ1Z2dlclxuJworICAgICAgICAgICAgICcgICBhZ2FpbiBieSBwcmVzc2luZyAiQ3RybC1DIi4gIElmIHlvdSB3YW50IFBkYiBub3QgdG8gdG91Y2ggJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgU0lHSU5UIGhhbmRsZXIsIHNldCAqbm9zaWdpbnQqIHRvdCB0cnVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhhbXBsZSBjYWxsIHRvIGVuYWJsZSB0cmFjaW5nIHdpdGggKnNraXAqOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnZGphbmdvLionXSkuc2V0X3RyYWNlKClcbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMTogVGhlICpza2lwKiBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICpub3NpZ2ludCogYXJndW1lbnQuICBQcmV2aW91c2x5LCBhICcKKyAgICAgICAgICAgICAnU0lHSU5UXG4nCisgICAgICAgICAgICAgJyAgIGhhbmRsZXIgd2FzIG5ldmVyIHNldCBieSBQZGIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICcgICBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4nCisgICAgICAgICAgICAgJyAgIHJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG4nCisgICAgICAgICAgICAgJyAgIHNldF90cmFjZSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0RlYnVnZ2VyIENvbW1hbmRzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgZGVidWdnZXIgYXJlIGxpc3RlZCBiZWxvdy4gIE1vc3RcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIG9uZSBvciB0d28gbGV0dGVycyBhcyBpbmRpY2F0ZWQ7ICcKKyAgICAgICAgICAgICAnZS5nLlxuJworICAgICAgICAgICAgICciaChlbHApIiBtZWFucyB0aGF0IGVpdGhlciAiaCIgb3IgImhlbHAiIGNhbiBiZSB1c2VkIHRvIGVudGVyICcKKyAgICAgICAgICAgICAndGhlIGhlbHBcbicKKyAgICAgICAgICAgICAnY29tbWFuZCAoYnV0IG5vdCAiaGUiIG9yICJoZWwiLCBub3IgIkgiIG9yICJIZWxwIiBvciAiSEVMUCIpLlxuJworICAgICAgICAgICAgICdBcmd1bWVudHMgdG8gY29tbWFuZHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSAoc3BhY2VzICcKKyAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAndGFicykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAnCisgICAgICAgICAgICAgJygiW10iKSBpblxuJworICAgICAgICAgICAgICd0aGUgY29tbWFuZCBzeW50YXg7IHRoZSBzcXVhcmUgYnJhY2tldHMgbXVzdCBub3QgYmUgdHlwZWQuXG4nCisgICAgICAgICAgICAgJ0FsdGVybmF0aXZlcyBpbiB0aGUgY29tbWFuZCBzeW50YXggYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsICcKKyAgICAgICAgICAgICAnYmFyXG4nCisgICAgICAgICAgICAgJygifCIpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRW50ZXJpbmcgYSBibGFuayBsaW5lIHJlcGVhdHMgdGhlIGxhc3QgY29tbWFuZCBlbnRlcmVkLiAgJworICAgICAgICAgICAgICdFeGNlcHRpb246IGlmXG4nCisgICAgICAgICAgICAgJ3RoZSBsYXN0IGNvbW1hbmQgd2FzIGEgImxpc3QiIGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZSAnCisgICAgICAgICAgICAgJ2xpc3RlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkNvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNuJ3QgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlICIKKyAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZ1xuJworICAgICAgICAgICAgICdkZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gJworICAgICAgICAgICAgICdleGNsYW1hdGlvblxuJworICAgICAgICAgICAgICdwb2ludCAoIiEiKS4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB3YXkgdG8gaW5zcGVjdCB0aGUgcHJvZ3JhbSAnCisgICAgICAgICAgICAgJ2JlaW5nXG4nCisgICAgICAgICAgICAgJ2RlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSBhIHZhcmlhYmxlIG9yIGNhbGwgYSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLlxuJworICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gc3VjaCBhIHN0YXRlbWVudCwgdGhlIGV4Y2VwdGlvbiBuYW1lICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAicHJpbnRlZCBidXQgdGhlIGRlYnVnZ2VyJ3Mgc3RhdGUgaXMgbm90IGNoYW5nZWQuXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZGVidWdnZXIgc3VwcG9ydHMgYWxpYXNlcy4gIEFsaWFzZXMgY2FuIGhhdmUgcGFyYW1ldGVycyAnCisgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgJ2FsbG93cyBvbmUgYSBjZXJ0YWluIGxldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlclxuJworICAgICAgICAgICAgICdleGFtaW5hdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ011bHRpcGxlIGNvbW1hbmRzIG1heSBiZSBlbnRlcmVkIG9uIGEgc2luZ2xlIGxpbmUsIHNlcGFyYXRlZCBieSAnCisgICAgICAgICAgICAgJyI7OyIuXG4nCisgICAgICAgICAgICAgJyhBIHNpbmdsZSAiOyIgaXMgbm90IHVzZWQgYXMgaXQgaXMgdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgJworICAgICAgICAgICAgICdjb21tYW5kc1xuJworICAgICAgICAgICAgICdpbiBhIGxpbmUgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIFB5dGhvbiBwYXJzZXIuKSAgTm8gaW50ZWxsaWdlbmNlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlIGlucHV0IGlzIHNwbGl0IGF0IHRoZSAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJyI7OyIgcGFpciwgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcXVvdGVkIHN0cmluZy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmIGEgZmlsZSAiLnBkYnJjIiBleGlzdHMgaW4gdGhlIHVzZXJcJ3MgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnY3VycmVudCBkaXJlY3RvcnksIGl0IGlzIHJlYWQgaW4gYW5kIGV4ZWN1dGVkIGFzIGlmIGl0IGhhZCBiZWVuICcKKyAgICAgICAgICAgICAndHlwZWRcbicKKyAgICAgICAgICAgICAnYXQgdGhlIGRlYnVnZ2VyIHByb21wdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgJworICAgICAgICAgICAgICdhbGlhc2VzLiAgSWZcbicKKyAgICAgICAgICAgICAnYm90aCBmaWxlcyBleGlzdCwgdGhlIG9uZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgcmVhZCBmaXJzdCAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICdhbGlhc2VzIGRlZmluZWQgdGhlcmUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGxvY2FsIGZpbGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdFxuJworICAgICAgICAgICAgICdjb250aW51ZSBkZWJ1Z2dpbmcsIHN1Y2ggYXMgImNvbnRpbnVlIiBvciAibmV4dCIuICBQcmV2aW91c2x5LCAnCisgICAgICAgICAgICAgJ3RoZXNlXG4nCisgICAgICAgICAgICAgJ2NvbW1hbmRzIGhhZCBubyBlZmZlY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdoKGVscCkgW2NvbW1hbmRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuICBXaXRoICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICAqY29tbWFuZCogYXMgYXJndW1lbnQsIHByaW50IGhlbHAgYWJvdXQgdGhhdCBjb21tYW5kLiAgImhlbHAgJworICAgICAgICAgICAgICdwZGIiXG4nCisgICAgICAgICAgICAgJyAgIGRpc3BsYXlzIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gKHRoZSBkb2NzdHJpbmcgb2YgdGhlICJwZGIiXG4nCisgICAgICAgICAgICAgJyAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgJworICAgICAgICAgICAgICciaGVscFxuJworICAgICAgICAgICAgICcgICBleGVjIiBtdXN0IGJlIGVudGVyZWQgdG8gZ2V0IGhlbHAgb24gdGhlICIhIiBjb21tYW5kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndyhoZXJlKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlICcKKyAgICAgICAgICAgICAnYm90dG9tLiAgQW5cbicKKyAgICAgICAgICAgICAnICAgYXJyb3cgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGZyYW1lLCB3aGljaCBkZXRlcm1pbmVzIHRoZSAnCisgICAgICAgICAgICAgJ2NvbnRleHQgb2ZcbicKKyAgICAgICAgICAgICAnICAgbW9zdCBjb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2Qob3duKSBbY291bnRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgZG93biBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBzdGFjayB0cmFjZSAodG8gYSBuZXdlciBmcmFtZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd1KHApIFtjb3VudF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyB1cCBpbiB0aGUgJworICAgICAgICAgICAgICdzdGFja1xuJworICAgICAgICAgICAgICcgICB0cmFjZSAodG8gYW4gb2xkZXIgZnJhbWUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYihyZWFrKSBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRoIGEgKmxpbmVubyogYXJndW1lbnQsIHNldCBhIGJyZWFrIHRoZXJlIGluIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZmlsZS5cbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhICpmdW5jdGlvbiogYXJndW1lbnQsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCAnCisgICAgICAgICAgICAgJ2V4ZWN1dGFibGVcbicKKyAgICAgICAgICAgICAnICAgc3RhdGVtZW50IHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIG1heSBiZSAnCisgICAgICAgICAgICAgJ3ByZWZpeGVkXG4nCisgICAgICAgICAgICAgJyAgIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwgdG8gc3BlY2lmeSBhIGJyZWFrcG9pbnQgaW4gJworICAgICAgICAgICAgICdhbm90aGVyXG4nCisgICAgICAgICAgICAgIiAgIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0IGhhc24ndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgIgorICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBzZWFyY2hlZCBvbiAic3lzLnBhdGgiLiAgTm90ZSB0aGF0IGVhY2ggYnJlYWtwb2ludCBpcyAnCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIGFcbicKKyAgICAgICAgICAgICAnICAgbnVtYmVyIHRvIHdoaWNoIGFsbCB0aGUgb3RoZXIgYnJlYWtwb2ludCBjb21tYW5kcyByZWZlci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIElmIGEgc2Vjb25kIGFyZ3VtZW50IGlzIHByZXNlbnQsIGl0IGlzIGFuIGV4cHJlc3Npb24gd2hpY2ggJworICAgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MsIGluY2x1ZGluZyBmb3IgZWFjaCAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnQsXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBicmVha3BvaW50IGhhcyBiZWVuIGhpdCwgdGhlICcKKyAgICAgICAgICAgICAnY3VycmVudFxuJworICAgICAgICAgICAgICcgICBpZ25vcmUgY291bnQsIGFuZCB0aGUgYXNzb2NpYXRlZCBjb25kaXRpb24gaWYgYW55LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndGJyZWFrIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgIGZpcnN0IGhpdC4gVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yICJicmVhayIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbChlYXIpIFtmaWxlbmFtZTpsaW5lbm8gfCBicG51bWJlciBbYnBudW1iZXIgLi4uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggYSAqZmlsZW5hbWU6bGluZW5vKiBhcmd1bWVudCwgY2xlYXIgYWxsIHRoZSBicmVha3BvaW50cyAnCisgICAgICAgICAgICAgJ2F0XG4nCisgICAgICAgICAgICAgJyAgIHRoaXMgbGluZS4gV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgJworICAgICAgICAgICAgICdjbGVhclxuJworICAgICAgICAgICAgICcgICB0aG9zZSBicmVha3BvaW50cy4gV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0ICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgYXNrIGNvbmZpcm1hdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdkaXNhYmxlIFticG51bWJlciBbYnBudW1iZXIgLi4uXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIERpc2FibGUgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2ZcbicKKyAgICAgICAgICAgICAnICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QgJworICAgICAgICAgICAgICdjYXVzZVxuJworICAgICAgICAgICAgICcgICB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbiwgYnV0IHVubGlrZSBjbGVhcmluZyBhICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludCwgaXRcbicKKyAgICAgICAgICAgICAnICAgcmVtYWlucyBpbiB0aGUgbGlzdCBvZiBicmVha3BvaW50cyBhbmQgY2FuIGJlIChyZS0pZW5hYmxlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2VuYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbmFibGUgdGhlIGJyZWFrcG9pbnRzIHNwZWNpZmllZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lnbm9yZSBicG51bWJlciBbY291bnRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTZXQgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgSWYgJworICAgICAgICAgICAgICdjb3VudCBpc1xuJworICAgICAgICAgICAgICcgICBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50IGJlY29tZXMgJworICAgICAgICAgICAgICdhY3RpdmVcbicKKyAgICAgICAgICAgICAnICAgd2hlbiB0aGUgaWdub3JlIGNvdW50IGlzIHplcm8uICBXaGVuIG5vbi16ZXJvLCB0aGUgY291bnQgaXNcbicKKyAgICAgICAgICAgICAnICAgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZSAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnRcbicKKyAgICAgICAgICAgICAnICAgaXMgbm90IGRpc2FibGVkIGFuZCBhbnkgYXNzb2NpYXRlZCBjb25kaXRpb24gZXZhbHVhdGVzIHRvICcKKyAgICAgICAgICAgICAndHJ1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NvbmRpdGlvbiBicG51bWJlciBbY29uZGl0aW9uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU2V0IGEgbmV3ICpjb25kaXRpb24qIGZvciB0aGUgYnJlYWtwb2ludCwgYW4gZXhwcmVzc2lvbiB3aGljaCAnCisgICAgICAgICAgICAgJ211c3RcbicKKyAgICAgICAgICAgICAnICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmICcKKyAgICAgICAgICAgICAnKmNvbmRpdGlvbipcbicKKyAgICAgICAgICAgICAnICAgaXMgYWJzZW50LCBhbnkgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnRcbicKKyAgICAgICAgICAgICAnICAgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgW2JwbnVtYmVyXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyICpicG51bWJlciouICAnCisgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICcgICBjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhICcKKyAgICAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICAgICcgICBjb250YWluaW5nIGp1c3QgImVuZCIgdG8gdGVybWluYXRlIHRoZSBjb21tYW5kcy4gQW4gZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIChQZGIpIGNvbW1hbmRzIDFcbicKKyAgICAgICAgICAgICAnICAgICAgKGNvbSkgcCBzb21lX3ZhcmlhYmxlXG4nCisgICAgICAgICAgICAgJyAgICAgIChjb20pIGVuZFxuJworICAgICAgICAgICAgICcgICAgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVG8gcmVtb3ZlIGFsbCBjb21tYW5kcyBmcm9tIGEgYnJlYWtwb2ludCwgdHlwZSBjb21tYW5kcyBhbmQgJworICAgICAgICAgICAgICdmb2xsb3dcbicKKyAgICAgICAgICAgICAnICAgaXQgaW1tZWRpYXRlbHkgd2l0aCAiZW5kIjsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggbm8gKmJwbnVtYmVyKiBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludFxuJworICAgICAgICAgICAgICcgICBzZXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCAnCisgICAgICAgICAgICAgJ2FnYWluLlxuJworICAgICAgICAgICAgICcgICBTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIgJworICAgICAgICAgICAgICdjb21tYW5kIHRoYXRcbicKKyAgICAgICAgICAgICAnICAgcmVzdW1lcyBleGVjdXRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5ICcKKyAgICAgICAgICAgICAnY29udGludWUsXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgJworICAgICAgICAgICAgICd0ZXJtaW5hdGVzXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICcgICBlbmQpLiBUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24gKGV2ZW4gJworICAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICAnICAgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyIGFub3RoZXIgJworICAgICAgICAgICAgICdicmVha3BvaW50LS13aGljaFxuJworICAgICAgICAgICAgICcgICBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvIGFtYmlndWl0aWVzIGFib3V0ICcKKyAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAnICAgbGlzdCB0byBleGVjdXRlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiICAgSWYgeW91IHVzZSB0aGUgJ3NpbGVudCcgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUgIgorICAgICAgICAgICAgICd1c3VhbFxuJworICAgICAgICAgICAgICcgICBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgJworICAgICAgICAgICAgICdtYXkgYmVcbicKKyAgICAgICAgICAgICAnICAgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljICcKKyAgICAgICAgICAgICAnbWVzc2FnZSBhbmRcbicKKyAgICAgICAgICAgICAnICAgdGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCAnCisgICAgICAgICAgICAgJ3lvdVxuJworICAgICAgICAgICAgICcgICBzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncyh0ZXApXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlICcKKyAgICAgICAgICAgICAnb2NjYXNpb25cbicKKyAgICAgICAgICAgICAnICAgKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIG9uIHRoZSBuZXh0IGxpbmUgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgY3VycmVudCBmdW5jdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICduKGV4dClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAnZnVuY3Rpb24gaXNcbicKKyAgICAgICAgICAgICAnICAgcmVhY2hlZCBvciBpdCByZXR1cm5zLiAgKFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gIm5leHQiIGFuZCAnCisgICAgICAgICAgICAgJyJzdGVwIlxuJworICAgICAgICAgICAgICcgICBpcyB0aGF0ICJzdGVwIiBzdG9wcyBpbnNpZGUgYSBjYWxsZWQgZnVuY3Rpb24sIHdoaWxlICJuZXh0IlxuJworICAgICAgICAgICAgICcgICBleGVjdXRlcyBjYWxsZWQgZnVuY3Rpb25zIGF0IChuZWFybHkpIGZ1bGwgc3BlZWQsIG9ubHkgJworICAgICAgICAgICAgICdzdG9wcGluZyBhdFxuJworICAgICAgICAgICAgICcgICB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VudChpbCkgW2xpbmVub11cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgYXJndW1lbnQsIGNvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgJworICAgICAgICAgICAgICdudW1iZXJcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcyByZWFjaGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhIGxpbmUgbnVtYmVyLCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgYSBsaW5lIHdpdGggYSAnCisgICAgICAgICAgICAgJ251bWJlclxuJworICAgICAgICAgICAgICcgICBncmVhdGVyIG9yIGVxdWFsIHRvIHRoYXQgaXMgcmVhY2hlZC4gIEluIGJvdGggY2FzZXMsIGFsc28gJworICAgICAgICAgICAgICdzdG9wIHdoZW5cbicKKyAgICAgICAgICAgICAnICAgdGhlIGN1cnJlbnQgZnJhbWUgcmV0dXJucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFsbG93IGdpdmluZyBhbiBleHBsaWNpdCBsaW5lICcKKyAgICAgICAgICAgICAnbnVtYmVyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncihldHVybilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnYyhvbnQoaW51ZSkpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDb250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyAnCisgICAgICAgICAgICAgJ2VuY291bnRlcmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaih1bXApIGxpbmVub1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiAgT25seSBhdmFpbGFibGUgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgYm90dG9tLW1vc3QgZnJhbWUuICBUaGlzIGxldHMgeW91IGp1bXAgYmFjayBhbmQgZXhlY3V0ZSBjb2RlICcKKyAgICAgICAgICAgICAnYWdhaW4sXG4nCisgICAgICAgICAgICAgIiAgIG9yIGp1bXAgZm9yd2FyZCB0byBza2lwIGNvZGUgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBydW4uXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBub3QgYWxsIGp1bXBzIGFyZSBhbGxvd2VkIC0tIGZvciAnCisgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgJyAgIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBqdW1wIGludG8gdGhlIG1pZGRsZSBvZiBhICJmb3IiIGxvb3Agb3IgJworICAgICAgICAgICAgICdvdXRcbicKKyAgICAgICAgICAgICAnICAgb2YgYSAiZmluYWxseSIgY2xhdXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnbChpc3QpIFtmaXJzdFssIGxhc3RdXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4gIFdpdGhvdXQgYXJndW1lbnRzLCAnCisgICAgICAgICAgICAgJ2xpc3QgMTFcbicKKyAgICAgICAgICAgICAnICAgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUgb3IgY29udGludWUgdGhlIHByZXZpb3VzICcKKyAgICAgICAgICAgICAnbGlzdGluZy5cbicKKyAgICAgICAgICAgICAnICAgV2l0aCAiLiIgYXMgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUuICAnCisgICAgICAgICAgICAgJ1dpdGhcbicKKyAgICAgICAgICAgICAnICAgb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCBhdCB0aGF0IGxpbmUuICBXaXRoIHR3b1xuJworICAgICAgICAgICAgICcgICBhcmd1bWVudHMsIGxpc3QgdGhlIGdpdmVuIHJhbmdlOyBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzICcKKyAgICAgICAgICAgICAnbGVzc1xuJworICAgICAgICAgICAgICcgICB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBjb3VudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSBjdXJyZW50IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgaW5kaWNhdGVkIGJ5ICItPiIuICAnCisgICAgICAgICAgICAgJ0lmIGFuXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbiBpcyBiZWluZyBkZWJ1Z2dlZCwgdGhlIGxpbmUgd2hlcmUgdGhlIGV4Y2VwdGlvbiAnCisgICAgICAgICAgICAgJ3dhc1xuJworICAgICAgICAgICAgICcgICBvcmlnaW5hbGx5IHJhaXNlZCBvciBwcm9wYWdhdGVkIGlzIGluZGljYXRlZCBieSAiPj4iLCBpZiBpdCAnCisgICAgICAgICAgICAgJ2RpZmZlcnNcbicKKyAgICAgICAgICAgICAnICAgZnJvbSB0aGUgY3VycmVudCBsaW5lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgIj4+IiBtYXJrZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdsbCB8IGxvbmdsaXN0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0IGFsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24gb3IgZnJhbWUuXG4nCisgICAgICAgICAgICAgJyAgIEludGVyZXN0aW5nIGxpbmVzIGFyZSBtYXJrZWQgYXMgZm9yICJsaXN0Ii5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2EocmdzKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHJpbnQgJworICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAnICAgdmFsdWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlOiAicHJpbnQoKSIgY2FuIGFsc28gYmUgdXNlZCwgYnV0IGlzIG5vdCBhIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAnY29tbWFuZFxuJworICAgICAgICAgICAgICcgICAgIC0tLSB0aGlzIGV4ZWN1dGVzIHRoZSBQeXRob24gInByaW50KCkiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncHAgZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlrZSB0aGUgInAiIGNvbW1hbmQsIGV4Y2VwdCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgJworICAgICAgICAgICAgICdwcmV0dHktXG4nCisgICAgICAgICAgICAgJyAgIHByaW50ZWQgdXNpbmcgdGhlICJwcHJpbnQiIG1vZHVsZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3doYXRpcyBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBQcmludCB0aGUgdHlwZSBvZiB0aGUgKmV4cHJlc3Npb24qLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnc291cmNlIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRyeSB0byBnZXQgc291cmNlIGNvZGUgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGRpc3BsYXkgaXQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdkaXNwbGF5IFtleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRGlzcGxheSB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaWYgaXQgY2hhbmdlZCwgZWFjaCB0aW1lXG4nCisgICAgICAgICAgICAgJyAgIGV4ZWN1dGlvbiBzdG9wcyBpbiB0aGUgY3VycmVudCBmcmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgbGlzdCBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlICcKKyAgICAgICAgICAgICAnY3VycmVudFxuJworICAgICAgICAgICAgICcgICBmcmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VuZGlzcGxheSBbZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIERvIG5vdCBkaXNwbGF5IHRoZSBleHByZXNzaW9uIGFueSBtb3JlIGluIHRoZSBjdXJyZW50IGZyYW1lLlxuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGV4cHJlc3Npb24sIGNsZWFyIGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIGZyYW1lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaW50ZXJhY3RcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFN0YXJ0IGFuIGludGVyYXRpdmUgaW50ZXJwcmV0ZXIgKHVzaW5nIHRoZSAiY29kZSIgbW9kdWxlKSAnCisgICAgICAgICAgICAgJ3dob3NlXG4nCisgICAgICAgICAgICAgJyAgIGdsb2JhbCBuYW1lc3BhY2UgY29udGFpbnMgYWxsIHRoZSAoZ2xvYmFsIGFuZCBsb2NhbCkgbmFtZXMgJworICAgICAgICAgICAgICdmb3VuZCBpblxuJworICAgICAgICAgICAgICcgICB0aGUgY3VycmVudCBzY29wZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2FsaWFzIFtuYW1lIFtjb21tYW5kXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIENyZWF0ZSBhbiBhbGlhcyBjYWxsZWQgKm5hbWUqIHRoYXQgZXhlY3V0ZXMgKmNvbW1hbmQqLiAgVGhlICcKKyAgICAgICAgICAgICAnY29tbWFuZFxuJworICAgICAgICAgICAgICcgICBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlIHBhcmFtZXRlcnMgY2FuICcKKyAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAnICAgaW5kaWNhdGVkIGJ5ICIlMSIsICIlMiIsIGFuZCBzbyBvbiwgd2hpbGUgIiUqIiBpcyByZXBsYWNlZCBieSAnCisgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICcgICB0aGUgcGFyYW1ldGVycy4gSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgYWxpYXMgJworICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAnICAgKm5hbWUqIGlzIHNob3duLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUgJworICAgICAgICAgICAgICdsaXN0ZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlICcKKyAgICAgICAgICAgICAnbGVnYWxseVxuJworICAgICAgICAgICAgICcgICB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUgdGhhdCBpbnRlcm5hbCBwZGIgY29tbWFuZHMgJworICAgICAgICAgICAgICcqY2FuKiBiZVxuJworICAgICAgICAgICAgICcgICBvdmVycmlkZGVuIGJ5IGFsaWFzZXMuICBTdWNoIGEgY29tbWFuZCBpcyB0aGVuIGhpZGRlbiB1bnRpbCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgJworICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICcgICB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgJworICAgICAgICAgICAgICdsZWZ0XG4nCisgICAgICAgICAgICAgJyAgIGFsb25lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gJworICAgICAgICAgICAgICdwbGFjZWRcbicKKyAgICAgICAgICAgICAnICAgaW4gdGhlICIucGRicmMiIGZpbGUpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgKHVzYWdlICJwaSBjbGFzc0luc3QiKVxuJworICAgICAgICAgICAgICcgICAgICBhbGlhcyBwaSBmb3IgayBpbiAlMS5fX2RpY3RfXy5rZXlzKCk6ICcKKyAgICAgICAgICAgICAncHJpbnQoIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10pXG4nCisgICAgICAgICAgICAgJyAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzIGluIHNlbGZcbicKKyAgICAgICAgICAgICAnICAgICAgYWxpYXMgcHMgcGkgc2VsZlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndW5hbGlhcyBuYW1lXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBEZWxldGUgdGhlIHNwZWNpZmllZCBhbGlhcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyEgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFeGVjdXRlIHRoZSAob25lLWxpbmUpICpzdGF0ZW1lbnQqIGluIHRoZSBjb250ZXh0IG9mIHRoZSAnCisgICAgICAgICAgICAgJ2N1cnJlbnRcbicKKyAgICAgICAgICAgICAnICAgc3RhY2sgZnJhbWUuIFRoZSBleGNsYW1hdGlvbiBwb2ludCBjYW4gYmUgb21pdHRlZCB1bmxlc3MgdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgd29yZCBvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuICBUbyBzZXQgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIGdsb2JhbCB2YXJpYWJsZSwgeW91IGNhbiBwcmVmaXggdGhlIGFzc2lnbm1lbnQgY29tbWFuZCB3aXRoICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICAiZ2xvYmFsIiBzdGF0ZW1lbnQgb24gdGhlIHNhbWUgbGluZSwgZS5nLjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFsnLWwnXVxuIgorICAgICAgICAgICAgICcgICAgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncnVuIFthcmdzIC4uLl1cbicKKyAgICAgICAgICAgICAncmVzdGFydCBbYXJncyAuLi5dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBQeXRob24gcHJvZ3JhbS4gIElmIGFuIGFyZ3VtZW50IGlzICcKKyAgICAgICAgICAgICAnc3VwcGxpZWQsXG4nCisgICAgICAgICAgICAgJyAgIGl0IGlzIHNwbGl0IHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXdcbicKKyAgICAgICAgICAgICAnICAgInN5cy5hcmd2Ii4gSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAnb3B0aW9ucyBhcmVcbicKKyAgICAgICAgICAgICAnICAgcHJlc2VydmVkLiAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncSh1aXQpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLiAgVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgJworICAgICAgICAgICAgICdhYm9ydGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbMV0gV2hldGhlciBhIGZyYW1lIGlzIGNvbnNpZGVyZWQgdG8gb3JpZ2luYXRlIGluIGEgY2VydGFpbiAnCisgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICcgICAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgIl9fbmFtZV9fIiBpbiB0aGUgZnJhbWUgZ2xvYmFscy5cbicsCisgJ2RlbCc6ICdcbicKKyAgICAgICAgJ1RoZSAiZGVsIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZGVsX3N0bXQgOjo9ICJkZWwiIHRhcmdldF9saXN0XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCAnCisgICAgICAgICdpc1xuJworICAgICAgICAnZGVmaW5lZC4gUmF0aGVyIHRoYW4gc3BlbGxpbmcgaXQgb3V0IGluIGZ1bGwgZGV0YWlscywgaGVyZSBhcmUgc29tZVxuJworICAgICAgICAnaGludHMuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGEgdGFyZ2V0IGxpc3QgcmVjdXJzaXZlbHkgZGVsZXRlcyBlYWNoIHRhcmdldCwgZnJvbSBsZWZ0XG4nCisgICAgICAgICd0byByaWdodC5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnRGVsZXRpb24gb2YgYSBuYW1lIHJlbW92ZXMgdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGZyb20gdGhlIGxvY2FsICcKKyAgICAgICAgJ29yXG4nCisgICAgICAgICdnbG9iYWwgbmFtZXNwYWNlLCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmFtZSBvY2N1cnMgaW4gYSAiZ2xvYmFsIlxuJworICAgICAgICAnc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhXG4nCisgICAgICAgICciTmFtZUVycm9yIiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBzdWJzY3JpcHRpb25zIGFuZCBzbGljaW5ncyBpcyAnCisgICAgICAgICdwYXNzZWRcbicKKyAgICAgICAgJ3RvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWxcbicKKyAgICAgICAgJ2VxdWl2YWxlbnQgdG8gYXNzaWdubWVudCBvZiBhbiBlbXB0eSBzbGljZSBvZiB0aGUgcmlnaHQgdHlwZSAoYnV0ICcKKyAgICAgICAgJ2V2ZW5cbicKKyAgICAgICAgJ3RoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2xpY2VkIG9iamVjdCkuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IFByZXZpb3VzbHkgaXQgd2FzIGlsbGVnYWwgdG8gZGVsZXRlIGEgbmFtZVxuJworICAgICAgICAnZnJvbSB0aGUgbG9jYWwgbmFtZXNwYWNlIGlmIGl0IG9jY3VycyBhcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWRcbicKKyAgICAgICAgJ2Jsb2NrLlxuJywKKyAnZGljdCc6ICdcbicKKyAgICAgICAgICdEaWN0aW9uYXJ5IGRpc3BsYXlzXG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuJworICAgICAgICAgJ2VuY2xvc2VkIGluIGN1cmx5IGJyYWNlczpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICcKKyAgICAgICAgICcifSJcbicKKyAgICAgICAgICcgICBrZXlfZGF0dW1fbGlzdCAgICAgOjo9IGtleV9kYXR1bSAoIiwiIGtleV9kYXR1bSkqIFsiLCJdXG4nCisgICAgICAgICAnICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIHwgIioqIiBvcl9leHByXG4nCisgICAgICAgICAnICAgZGljdF9jb21wcmVoZW5zaW9uIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIGNvbXBfZm9yXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0lmIGEgY29tbWEtc2VwYXJhdGVkIHNlcXVlbmNlIG9mIGtleS9kYXR1bSBwYWlycyBpcyBnaXZlbiwgdGhleSBhcmVcbicKKyAgICAgICAgICdldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgJworICAgICAgICAgJ2RpY3Rpb25hcnk6XG4nCisgICAgICAgICAnZWFjaCBrZXkgb2JqZWN0IGlzIHVzZWQgYXMgYSBrZXkgaW50byB0aGUgZGljdGlvbmFyeSB0byBzdG9yZSB0aGVcbicKKyAgICAgICAgICdjb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbicKKyAgICAgICAgICJtdWx0aXBsZSB0aW1lcyBpbiB0aGUga2V5L2RhdHVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeSdzICIKKyAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgJ2ZvciB0aGF0IGtleSB3aWxsIGJlIHRoZSBsYXN0IG9uZSBnaXZlbi5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdBIGRvdWJsZSBhc3RlcmlzayAiKioiIGRlbm90ZXMgKmRpY3Rpb25hcnkgdW5wYWNraW5nKi4gSXRzIG9wZXJhbmRcbicKKyAgICAgICAgICdtdXN0IGJlIGEgKm1hcHBpbmcqLiAgRWFjaCBtYXBwaW5nIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIG5ld1xuJworICAgICAgICAgJ2RpY3Rpb25hcnkuICBMYXRlciB2YWx1ZXMgcmVwbGFjZSB2YWx1ZXMgYWxyZWFkeSBzZXQgYnkgZWFybGllclxuJworICAgICAgICAgJ2tleS9kYXR1bSBwYWlycyBhbmQgZWFybGllciBkaWN0aW9uYXJ5IHVucGFja2luZ3MuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41OiBVbnBhY2tpbmcgaW50byBkaWN0aW9uYXJ5IGRpc3BsYXlzLCBvcmlnaW5hbGx5XG4nCisgICAgICAgICAncHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkaWN0IGNvbXByZWhlbnNpb24sIGluIGNvbnRyYXN0IHRvIGxpc3QgYW5kIHNldCBjb21wcmVoZW5zaW9ucyxcbicKKyAgICAgICAgICduZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbicKKyAgICAgICAgICciZm9yIiBhbmQgImlmIiBjbGF1c2VzLiBXaGVuIHRoZSBjb21wcmVoZW5zaW9uIGlzIHJ1biwgdGhlICcKKyAgICAgICAgICdyZXN1bHRpbmdcbicKKyAgICAgICAgICdrZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlICcKKyAgICAgICAgICdvcmRlclxuJworICAgICAgICAgJ3RoZXkgYXJlIHByb2R1Y2VkLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1Jlc3RyaWN0aW9ucyBvbiB0aGUgdHlwZXMgb2YgdGhlIGtleSB2YWx1ZXMgYXJlIGxpc3RlZCBlYXJsaWVyIGluXG4nCisgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkuICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbicKKyAgICAgICAgICdzaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzXG4nCisgICAgICAgICAnYmV0d2VlbiBkdXBsaWNhdGUga2V5cyBhcmUgbm90IGRldGVjdGVkOyB0aGUgbGFzdCBkYXR1bSAodGV4dHVhbGx5XG4nCisgICAgICAgICAncmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKKyAnZHluYW1pYy1mZWF0dXJlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCAnCisgICAgICAgICAgICAgICAgICAgICAnYXQgY29tcGlsZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpID0gMTBcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBkZWYgZigpOlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGkgPSA0MlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGYoKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAnaWxsZWdhbCB3aGVuIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnaWxsZWdhbCB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJ2RlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSAnCisgICAgICAgICAgICAgICAgICAgICAndGltZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgJworICAgICAgICAgICAgICAgICAgICAgJ3RvIHRoZSBmdWxsXG4nCisgICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlIGxvY2FsXG4nCisgICAgICAgICAgICAgICAgICAgICAnYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgJworICAgICAgICAgICAgICAgICAgICAgJ25vdCByZXNvbHZlZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsICcKKyAgICAgICAgICAgICAgICAgICAgICduYW1lc3BhY2UuICBbMV1cbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSAnCisgICAgICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnZWxzZSc6ICdcbicKKyAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdUaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICcgICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuJworICAgICAgICAgJyAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0l0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyAnCisgICAgICAgICAnb25lXG4nCisgICAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuICcKKyAgICAgICAgICdvcGVyYXRpb25zXG4nCisgICAgICAgICAnZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4nCisgICAgICAgICAnKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuJworICAgICAgICAgJ0lmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbicKKyAgICAgICAgICdwcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCisgJ2V4Y2VwdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9uc1xuJworICAgICAgICAgICAgICAgJyoqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgJworICAgICAgICAgICAgICAgJ2NvbnRyb2xcbicKKyAgICAgICAgICAgICAgICdvZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uYWxcbicKKyAgICAgICAgICAgICAgICdjb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgJworICAgICAgICAgICAgICAgJ2Vycm9yIGlzXG4nCisgICAgICAgICAgICAgICAnZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgJworICAgICAgICAgICAgICAgJ2J5IGFueVxuJworICAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgJworICAgICAgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgICAgICAndGhlIGVycm9yIG9jY3VycmVkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSAnCisgICAgICAgICAgICAgICAncnVuLXRpbWVcbicKKyAgICAgICAgICAgICAgICdlcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbicKKyAgICAgICAgICAgICAgICdleHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAgJ2hhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gICcKKyAgICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAgICciZmluYWxseSIgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSAnCisgICAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICAgJ2NvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICAnd2hldGhlciBhblxuJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1B5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICAnaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0ICcKKyAgICAgICAgICAgICAgICdhbiBvdXRlclxuJworICAgICAgICAgICAgICAgJ2xldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlICcKKyAgICAgICAgICAgICAgICdvZiBjb2RlXG4nCisgICAgICAgICAgICAgICAnZnJvbSB0aGUgdG9wKS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciAnCisgICAgICAgICAgICAgICAndGVybWluYXRlc1xuJworICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiAnCisgICAgICAgICAgICAgICAnbG9vcC4gIEluXG4nCisgICAgICAgICAgICAgICAnZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICdleGNlcHRpb24gaXNcbicKKyAgICAgICAgICAgICAgICciU3lzdGVtRXhpdCIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgImV4Y2VwdCIgJworICAgICAgICAgICAgICAgJ2NsYXVzZSBpc1xuJworICAgICAgICAgICAgICAgJ3NlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0ICcKKyAgICAgICAgICAgICAgICdyZWZlcmVuY2UgdGhlXG4nCisgICAgICAgICAgICAgICAnY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICdjYW4gYmVcbicKKyAgICAgICAgICAgICAgICdyZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gJworICAgICAgICAgICAgICAgJ2Fib3V0IHRoZVxuJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdOb3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgJworICAgICAgICAgICAgICAgJ1RoZWlyXG4nCisgICAgICAgICAgICAgICAnICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0ICcKKyAgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICAnICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuICcKKyAgICAgICAgICAgICAgICd1bmRlclxuJworICAgICAgICAgICAgICAgJyAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1NlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgInRyeSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAgICAgICd0cnlcbicKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQgYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlIHJhaXNlICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICAgJyAgICB0aGVzZSBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSAnCisgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICcgICAgY29tcGlsZWQuXG4nLAorICdleGVjbW9kZWwnOiAnXG4nCisgICAgICAgICAgICAgICdFeGVjdXRpb24gbW9kZWxcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1N0cnVjdHVyZSBvZiBhIHByb2dyYW1cbicKKyAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSBQeXRob24gcHJvZ3JhbSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGNvZGUgYmxvY2tzLiBBICpibG9jayogaXMgJworICAgICAgICAgICAgICAnYSBwaWVjZVxuJworICAgICAgICAgICAgICAnb2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGEgdW5pdC4gVGhlICcKKyAgICAgICAgICAgICAgJ2ZvbGxvd2luZyBhcmVcbicKKyAgICAgICAgICAgICAgJ2Jsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3MgZGVmaW5pdGlvbi4gJworICAgICAgICAgICAgICAnRWFjaFxuJworICAgICAgICAgICAgICAnY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdCBmaWxlIChhIGZpbGUgJworICAgICAgICAgICAgICAnZ2l2ZW5cbicKKyAgICAgICAgICAgICAgJ2FzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWQgYXMgYSBjb21tYW5kICcKKyAgICAgICAgICAgICAgJ2xpbmVcbicKKyAgICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIHRoZSBpbnRlcnByZXRlcikgaXMgYSBjb2RlIGJsb2NrLiAgQSBzY3JpcHQgY29tbWFuZCAnCisgICAgICAgICAgICAgICcoYVxuJworICAgICAgICAgICAgICAnY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICInKiotYyoqJ1xuIgorICAgICAgICAgICAgICAnb3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgJworICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lICcKKyAgICAgICAgICAgICAgJ2NvbnRhaW5zXG4nCisgICAgICAgICAgICAgICdzb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCAnCisgICAgICAgICAgICAgICdkZXRlcm1pbmVzXG4nCisgICAgICAgICAgICAgICJ3aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2sncyAiCisgICAgICAgICAgICAgICdleGVjdXRpb24gaGFzXG4nCisgICAgICAgICAgICAgICdjb21wbGV0ZWQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmFtaW5nIGFuZCBiaW5kaW5nXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdCaW5kaW5nIG9mIG5hbWVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJypOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgJworICAgICAgICAgICAgICAnYmluZGluZ1xuJworICAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvICcKKyAgICAgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAgICAgJyJpbXBvcnQiIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2NsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCAnCisgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgJ2lkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCAiZm9yIiBsb29wIGhlYWRlciwgJworICAgICAgICAgICAgICAnb3IgYWZ0ZXJcbicKKyAgICAgICAgICAgICAgJyJhcyIgaW4gYSAid2l0aCIgc3RhdGVtZW50IG9yICJleGNlcHQiIGNsYXVzZS4gVGhlICJpbXBvcnQiICcKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAgICAnb2YgdGhlIGZvcm0gImZyb20gLi4uIGltcG9ydCAqIiBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgJ2ltcG9ydGVkIG1vZHVsZSwgZXhjZXB0IHRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICAnCisgICAgICAgICAgICAgICdUaGlzIGZvcm1cbicKKyAgICAgICAgICAgICAgJ21heSBvbmx5IGJlIHVzZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgImRlbCIgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCAnCisgICAgICAgICAgICAgICdib3VuZCBmb3JcbicKKyAgICAgICAgICAgICAgJ3RoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlICcKKyAgICAgICAgICAgICAgJ25hbWUpLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgJworICAgICAgICAgICAgICAnZGVmaW5lZCBieSBhXG4nCisgICAgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSAnCisgICAgICAgICAgICAgICd0b3AtbGV2ZWxcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2spLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0ICcKKyAgICAgICAgICAgICAgJ2Jsb2NrLFxuJworICAgICAgICAgICAgICAndW5sZXNzIGRlY2xhcmVkIGFzICJub25sb2NhbCIgb3IgImdsb2JhbCIuICBJZiBhIG5hbWUgaXMgYm91bmQgJworICAgICAgICAgICAgICAnYXQgdGhlXG4nCisgICAgICAgICAgICAgICdtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZSB2YXJpYWJsZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAnY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhIHZhcmlhYmxlIGlzIHVzZWQgaW4gYSAnCisgICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgICdibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWUgdmFyaWFibGUqLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvIHRoZSAnCisgICAgICAgICAgICAgICcqYmluZGluZypcbicKKyAgICAgICAgICAgICAgJ29mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBieSB0aGUgZm9sbG93aW5nIG5hbWUgcmVzb2x1dGlvbiAnCisgICAgICAgICAgICAgICdydWxlcy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdSZXNvbHV0aW9uIG9mIG5hbWVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmICcKKyAgICAgICAgICAgICAgJ2EgbG9jYWxcbicKKyAgICAgICAgICAgICAgJ3ZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICAnCisgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSAnCisgICAgICAgICAgICAgICdibG9ja3NcbicKKyAgICAgICAgICAgICAgJ2NvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrICcKKyAgICAgICAgICAgICAgJ2ludHJvZHVjZXNcbicKKyAgICAgICAgICAgICAgJ2EgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlICcKKyAgICAgICAgICAgICAgJ25lYXJlc3RcbicKKyAgICAgICAgICAgICAgJ2VuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICAgICJpcyBjYWxsZWQgdGhlIGJsb2NrJ3MgKmVudmlyb25tZW50Ki5cbiIKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSAiTmFtZUVycm9yIiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICAncmFpc2VkLiBJZlxuJworICAgICAgICAgICAgICAndGhlIGN1cnJlbnQgc2NvcGUgaXMgYSBmdW5jdGlvbiBzY29wZSwgYW5kIHRoZSBuYW1lIHJlZmVycyB0byBhICcKKyAgICAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICAgICd2YXJpYWJsZSB0aGF0IGhhcyBub3QgeWV0IGJlZW4gYm91bmQgdG8gYSB2YWx1ZSBhdCB0aGUgcG9pbnQgJworICAgICAgICAgICAgICAnd2hlcmUgdGhlXG4nCisgICAgICAgICAgICAgICduYW1lIGlzIHVzZWQsIGFuICJVbmJvdW5kTG9jYWxFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgJyJVbmJvdW5kTG9jYWxFcnJvciIgaXMgYSBzdWJjbGFzcyBvZiAiTmFtZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrLCBhbGxcbicKKyAgICAgICAgICAgICAgJ3VzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAnY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgJworICAgICAgICAgICAgICAnd2l0aGluIGFcbicKKyAgICAgICAgICAgICAgJ2Jsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbicKKyAgICAgICAgICAgICAgJ2RlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyICcKKyAgICAgICAgICAgICAgJ2FueXdoZXJlXG4nCisgICAgICAgICAgICAgICd3aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuICcKKyAgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgJworICAgICAgICAgICAgICAnYmluZGluZ1xuJworICAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgdGhlICJnbG9iYWwiIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mICcKKyAgICAgICAgICAgICAgJ3RoZSBuYW1lXG4nCisgICAgICAgICAgICAgICdzcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICd0b3AtbGV2ZWwgbmFtZXNwYWNlLiAgTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgJworICAgICAgICAgICAgICAnbmFtZXNwYWNlIGJ5XG4nCisgICAgICAgICAgICAgICdzZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgJworICAgICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlICcKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAgICAnb2YgdGhlIG1vZHVsZSAiYnVpbHRpbnMiLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWQgJworICAgICAgICAgICAgICAnZmlyc3QuICBJZlxuJworICAgICAgICAgICAgICAndGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzICcKKyAgICAgICAgICAgICAgJ3NlYXJjaGVkLiAgVGhlXG4nCisgICAgICAgICAgICAgICciZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdUaGUgImdsb2JhbCIgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZyAnCisgICAgICAgICAgICAgICdvcGVyYXRpb25cbicKKyAgICAgICAgICAgICAgJ2luIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhIGZyZWUgJworICAgICAgICAgICAgICAndmFyaWFibGVcbicKKyAgICAgICAgICAgICAgJ2NvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXMgdHJlYXRlZCBhcyBhICcKKyAgICAgICAgICAgICAgJ2dsb2JhbC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyBjb3JyZXNwb25kaW5nIG5hbWVzIHRvIHJlZmVyICcKKyAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICdwcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgZnVuY3Rpb24gJworICAgICAgICAgICAgICAnc2NvcGUuXG4nCisgICAgICAgICAgICAgICciU3ludGF4RXJyb3IiIGlzIHJhaXNlZCBhdCBjb21waWxlIHRpbWUgaWYgdGhlIGdpdmVuIG5hbWUgZG9lcyAnCisgICAgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgICAgJ2V4aXN0IGluIGFueSBlbmNsb3NpbmcgZnVuY3Rpb24gc2NvcGUuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgJworICAgICAgICAgICAgICAndGltZSBhXG4nCisgICAgICAgICAgICAgICdtb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyAnCisgICAgICAgICAgICAgICdjYWxsZWRcbicKKyAgICAgICAgICAgICAgJyJfX21haW5fXyIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0NsYXNzIGRlZmluaXRpb24gYmxvY2tzIGFuZCBhcmd1bWVudHMgdG8gImV4ZWMoKSIgYW5kICJldmFsKCkiICcKKyAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAnc3BlY2lhbCBpbiB0aGUgY29udGV4dCBvZiBuYW1lIHJlc29sdXRpb24uIEEgY2xhc3MgZGVmaW5pdGlvbiAnCisgICAgICAgICAgICAgICdpcyBhblxuJworICAgICAgICAgICAgICAnZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmUgbmFtZXMuIFRoZXNlICcKKyAgICAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAgJ2ZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24gd2l0aCBhbiBleGNlcHRpb24gJworICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAndW5ib3VuZCBsb2NhbCB2YXJpYWJsZXMgYXJlIGxvb2tlZCB1cCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gJworICAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgICduYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgb2ZcbicKKyAgICAgICAgICAgICAgJ3RoZSBjbGFzcy4gVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYSBjbGFzcyBibG9jayBpcyAnCisgICAgICAgICAgICAgICdsaW1pdGVkIHRvXG4nCisgICAgICAgICAgICAgICd0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGUgY29kZSBibG9ja3Mgb2YgJworICAgICAgICAgICAgICAnbWV0aG9kcyAtLVxuJworICAgICAgICAgICAgICAndGhpcyBpbmNsdWRlcyBjb21wcmVoZW5zaW9ucyBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlICcKKyAgICAgICAgICAgICAgJ3RoZXkgYXJlXG4nCisgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICdmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAgJ3dpbGwgZmFpbDpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgY2xhc3MgQTpcbicKKyAgICAgICAgICAgICAgJyAgICAgICBhID0gNDJcbicKKyAgICAgICAgICAgICAgJyAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQnVpbHRpbnMgYW5kIHJlc3RyaWN0ZWQgZXhlY3V0aW9uXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgJworICAgICAgICAgICAgICAnYmxvY2tcbicKKyAgICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgIl9fYnVpbHRpbnNfXyIgaW4gaXRzICcKKyAgICAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAgICAnbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZSAnCisgICAgICAgICAgICAgICdsYXR0ZXIgY2FzZVxuJworICAgICAgICAgICAgICAidGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiCisgICAgICAgICAgICAgICciX19tYWluX18iXG4nCisgICAgICAgICAgICAgICdtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiAnCisgICAgICAgICAgICAgICdpbiBhbnlcbicKKyAgICAgICAgICAgICAgJ290aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAnImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhICcKKyAgICAgICAgICAgICAgJ3VzZXItY3JlYXRlZFxuJworICAgICAgICAgICAgICAnZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuJworICAgICAgICAgICAgICAnIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gICcKKyAgICAgICAgICAgICAgJ1VzZXJzXG4nCisgICAgICAgICAgICAgICd3YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAnCisgICAgICAgICAgICAgICciaW1wb3J0IlxuJworICAgICAgICAgICAgICAndGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbicKKyAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCAnCisgICAgICAgICAgICAgICdjb21waWxlXG4nCisgICAgICAgICAgICAgICd0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGkgPSAxMFxuJworICAgICAgICAgICAgICAnICAgZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgJyAgICAgICBwcmludChpKVxuJworICAgICAgICAgICAgICAnICAgaSA9IDQyXG4nCisgICAgICAgICAgICAgICcgICBmKClcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgJworICAgICAgICAgICAgICAnd2hlbiB1c2VkXG4nCisgICAgICAgICAgICAgICdpbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyAnCisgICAgICAgICAgICAgICdpbGxlZ2FsIHRvXG4nCisgICAgICAgICAgICAgICdkZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSAnCisgICAgICAgICAgICAgICdmdWxsXG4nCisgICAgICAgICAgICAgICdlbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSAnCisgICAgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAgICAnYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90ICcKKyAgICAgICAgICAgICAgJ3Jlc29sdmVkXG4nCisgICAgICAgICAgICAgICdpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCAnCisgICAgICAgICAgICAgICduYW1lc3BhY2UuICBbMV1cbicKKyAgICAgICAgICAgICAgJ1RoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4nCisgICAgICAgICAgICAgICdvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgJworICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgJ3NwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiAnCisgICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgICdvZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuJworICAgICAgICAgICAgICAnY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlICcKKyAgICAgICAgICAgICAgJ2Vycm9yIGlzXG4nCisgICAgICAgICAgICAgICdkZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciAnCisgICAgICAgICAgICAgICdieSBhbnlcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgJworICAgICAgICAgICAgICAnd2hlcmVcbicKKyAgICAgICAgICAgICAgJ3RoZSBlcnJvciBvY2N1cnJlZC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhICcKKyAgICAgICAgICAgICAgJ3J1bi10aW1lXG4nCisgICAgICAgICAgICAgICdlcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbicKKyAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiAnCisgICAgICAgICAgICAgICdFeGNlcHRpb25cbicKKyAgICAgICAgICAgICAgJ2hhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gICcKKyAgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgJworICAgICAgICAgICAgICAnY2xlYW51cFxuJworICAgICAgICAgICAgICAnY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgJ3doZXRoZXIgYW5cbicKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdQeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gJworICAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICdoYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gJworICAgICAgICAgICAgICAnb3V0ZXJcbicKKyAgICAgICAgICAgICAgJ2xldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2ZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiAnCisgICAgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICAgICdmcm9tIHRoZSB0b3ApLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciAnCisgICAgICAgICAgICAgICd0ZXJtaW5hdGVzXG4nCisgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gJworICAgICAgICAgICAgICAnbG9vcC4gIEluXG4nCisgICAgICAgICAgICAgICdlaXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgJworICAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzXG4nCisgICAgICAgICAgICAgICciU3lzdGVtRXhpdCIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiICcKKyAgICAgICAgICAgICAgJ2NsYXVzZSBpc1xuJworICAgICAgICAgICAgICAnc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgJworICAgICAgICAgICAgICAncmVmZXJlbmNlIHRoZVxuJworICAgICAgICAgICAgICAnY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgJ2NhbiBiZVxuJworICAgICAgICAgICAgICAncmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICcKKyAgICAgICAgICAgICAgJ2Fib3V0IHRoZVxuJworICAgICAgICAgICAgICAnZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOb3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgJworICAgICAgICAgICAgICAnVGhlaXJcbicKKyAgICAgICAgICAgICAgJyAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICcgIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gJworICAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAgJyAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICd0cnlcbicKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudCBhbmQgInJhaXNlIiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgcmFpc2UgJworICAgICAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkICcKKyAgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgICcgICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgJworICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgJyAgICBjb21waWxlZC5cbicsCisgJ2V4cHJsaXN0cyc6ICdcbicKKyAgICAgICAgICAgICAgJ0V4cHJlc3Npb24gbGlzdHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgZXhwcmVzc2lvbl9saXN0ICAgIDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl1cbicKKyAgICAgICAgICAgICAgJyAgIHN0YXJyZWRfbGlzdCAgICAgICA6Oj0gc3RhcnJlZF9pdGVtICggIiwiIHN0YXJyZWRfaXRlbSApKiAnCisgICAgICAgICAgICAgICdbIiwiXVxuJworICAgICAgICAgICAgICAnICAgc3RhcnJlZF9leHByZXNzaW9uIDo6PSBleHByZXNzaW9uIHwgKCBzdGFycmVkX2l0ZW0gIiwiICkqICcKKyAgICAgICAgICAgICAgJ1tzdGFycmVkX2l0ZW1dXG4nCisgICAgICAgICAgICAgICcgICBzdGFycmVkX2l0ZW0gICAgICAgOjo9IGV4cHJlc3Npb24gfCAiKiIgb3JfZXhwclxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHQgd2hlbiBwYXJ0IG9mIGEgbGlzdCBvciBzZXQgZGlzcGxheSwgYW4gZXhwcmVzc2lvbiBsaXN0XG4nCisgICAgICAgICAgICAgICdjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZSBsZW5ndGggb2YgJworICAgICAgICAgICAgICAndGhlIHR1cGxlXG4nCisgICAgICAgICAgICAgICdpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlIGV4cHJlc3Npb25zIGFyZVxuJworICAgICAgICAgICAgICAnZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gYXN0ZXJpc2sgIioiIGRlbm90ZXMgKml0ZXJhYmxlIHVucGFja2luZyouICBJdHMgb3BlcmFuZCBtdXN0ICcKKyAgICAgICAgICAgICAgJ2JlIGFuXG4nCisgICAgICAgICAgICAgICcqaXRlcmFibGUqLiAgVGhlIGl0ZXJhYmxlIGlzIGV4cGFuZGVkIGludG8gYSBzZXF1ZW5jZSBvZiBpdGVtcywgJworICAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAgJ2FyZSBpbmNsdWRlZCBpbiB0aGUgbmV3IHR1cGxlLCBsaXN0LCBvciBzZXQsIGF0IHRoZSBzaXRlIG9mICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAndW5wYWNraW5nLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjU6IEl0ZXJhYmxlIHVucGFja2luZyBpbiBleHByZXNzaW9uIGxpc3RzLCAnCisgICAgICAgICAgICAgICdvcmlnaW5hbGx5XG4nCisgICAgICAgICAgICAgICdwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlICcKKyAgICAgICAgICAgICAgJyhhLmsuYS4gYVxuJworICAgICAgICAgICAgICAnKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSAnCisgICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgICJ3aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc24ndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciAiCisgICAgICAgICAgICAgICd5aWVsZHMgdGhlXG4nCisgICAgICAgICAgICAgICd2YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiAnCisgICAgICAgICAgICAgICdlbXB0eSBwYWlyXG4nCisgICAgICAgICAgICAgICdvZiBwYXJlbnRoZXNlczogIigpIi4pXG4nLAorICdmbG9hdGluZyc6ICdcbicKKyAgICAgICAgICAgICAnRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Zsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG4nCisgICAgICAgICAgICAgJ2RlZmluaXRpb25zOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbicKKyAgICAgICAgICAgICAnICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiJcbicKKyAgICAgICAgICAgICAnICAgZXhwb25lbnRmbG9hdCA6Oj0gKGludHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudFxuJworICAgICAgICAgICAgICcgICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0K1xuJworICAgICAgICAgICAgICcgICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdCtcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgYXJlIGFsd2F5cyBpbnRlcnByZXRlZCAnCisgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgJ3JhZGl4IDEwLiBGb3IgZXhhbXBsZSwgIjA3N2UwMTAiIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSAnCisgICAgICAgICAgICAgJ251bWJlclxuJworICAgICAgICAgICAgICdhcyAiNzdlMTAiLiBUaGUgYWxsb3dlZCByYW5nZSBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFscyBpc1xuJworICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICdsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgJworICAgICAgICAgICAgICciLTEiXG4nCisgICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICItIiBhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnbGl0ZXJhbCAiMSIuXG4nLAorICdmb3InOiAnXG4nCisgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50XG4nCisgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgJworICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgJyhzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG4nCisgICAgICAgICdvYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuJworICAgICAgICAnImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbicKKyAgICAgICAgJ3Byb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gICcKKyAgICAgICAgJ0VhY2hcbicKKyAgICAgICAgJ2l0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG4nCisgICAgICAgICdmb3IgYXNzaWdubWVudHMgKHNlZSBBc3NpZ25tZW50IHN0YXRlbWVudHMpLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXNcbicKKyAgICAgICAgJ2V4ZWN1dGVkLiAgV2hlbiB0aGUgaXRlbXMgYXJlIGV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ3NlcXVlbmNlIGlzIGVtcHR5IG9yIGFuIGl0ZXJhdG9yIHJhaXNlcyBhICJTdG9wSXRlcmF0aW9uIiAnCisgICAgICAgICdleGNlcHRpb24pLFxuJworICAgICAgICAndGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSAnCisgICAgICAgICdsb29wXG4nCisgICAgICAgICd0ZXJtaW5hdGVzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdBICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG4nCisgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kICcKKyAgICAgICAgJ2NvbnRpbnVlc1xuJworICAgICAgICAnd2l0aCB0aGUgbmV4dCBpdGVtLCBvciB3aXRoIHRoZSAiZWxzZSIgY2xhdXNlIGlmIHRoZXJlIGlzIG5vIG5leHRcbicKKyAgICAgICAgJ2l0ZW0uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBmb3ItbG9vcCBtYWtlcyBhc3NpZ25tZW50cyB0byB0aGUgdmFyaWFibGVzKHMpIGluIHRoZSB0YXJnZXQgJworICAgICAgICAnbGlzdC5cbicKKyAgICAgICAgJ1RoaXMgb3ZlcndyaXRlcyBhbGwgcHJldmlvdXMgYXNzaWdubWVudHMgdG8gdGhvc2UgdmFyaWFibGVzICcKKyAgICAgICAgJ2luY2x1ZGluZ1xuJworICAgICAgICAndGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBmb3IgaSBpbiByYW5nZSgxMCk6XG4nCisgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgJyAgICAgICBpID0gNSAgICAgICAgICAgICAjIHRoaXMgd2lsbCBub3QgYWZmZWN0IHRoZSBmb3ItbG9vcFxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSBpIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgJworICAgICAgICAnbmV4dFxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICMgaW5kZXggaW4gdGhlIHJhbmdlXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ05hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyBmaW5pc2hlZCxcbicKKyAgICAgICAgJ2J1dCBpZiB0aGUgc2VxdWVuY2UgaXMgZW1wdHksIHRoZXkgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0XG4nCisgICAgICAgICdhbGwgYnkgdGhlIGxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInJhbmdlKCkiIHJldHVybnMgYW5cbicKKyAgICAgICAgJ2l0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgImZvciAnCisgICAgICAgICdpXG4nCisgICAgICAgICc6PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAyXSIuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ05vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4nCisgICAgICAgICcgIGxvb3AgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gIEFuXG4nCisgICAgICAgICcgIGludGVybmFsIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LFxuJworICAgICAgICAnICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhc1xuJworICAgICAgICAnICByZWFjaGVkIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzICcKKyAgICAgICAgJ21lYW5zXG4nCisgICAgICAgICcgIHRoYXQgaWYgdGhlIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJyAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCAnCisgICAgICAgICdvZlxuJworICAgICAgICAnICB0aGUgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgJworICAgICAgICAndGhlXG4nCisgICAgICAgICcgIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuJworICAgICAgICAnICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbicKKyAgICAgICAgJyAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbicKKyAgICAgICAgJyAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgICAgZm9yIHggaW4gYVs6XTpcbicKKyAgICAgICAgJyAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJywKKyAnZm9ybWF0c3RyaW5ncyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICdGb3JtYXQgU3RyaW5nIFN5bnRheFxuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZCBhbmQgdGhlICJGb3JtYXR0ZXIiIGNsYXNzIHNoYXJlICcKKyAgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgJ3N5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mICcKKyAgICAgICAgICAgICAgICAgICciRm9ybWF0dGVyIixcbicKKyAgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4gIFRoZSAnCisgICAgICAgICAgICAgICAgICAnc3ludGF4IGlzXG4nCisgICAgICAgICAgICAgICAgICAncmVsYXRlZCB0byB0aGF0IG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMsIGJ1dCB0aGVyZSAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnZGlmZmVyZW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdjdXJseSBicmFjZXNcbicKKyAgICAgICAgICAgICAgICAgICcie30iLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzICcKKyAgICAgICAgICAgICAgICAgICdjb25zaWRlcmVkIGxpdGVyYWxcbicKKyAgICAgICAgICAgICAgICAgICd0ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCAnCisgICAgICAgICAgICAgICAgICAndG8gaW5jbHVkZVxuJworICAgICAgICAgICAgICAgICAgJ2EgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICdkb3VibGluZzpcbicKKyAgICAgICAgICAgICAgICAgICcie3siIGFuZCAifX0iLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiAnCisgICAgICAgICAgICAgICAgICAnY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgZmllbGRfbmFtZSAgICAgICAgOjo9IGFyZ19uYW1lICgiLiIgYXR0cmlidXRlX25hbWUgfCAnCisgICAgICAgICAgICAgICAgICAnIlsiIGVsZW1lbnRfaW5kZXggIl0iKSpcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZV9uYW1lICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgZWxlbWVudF9pbmRleCAgICAgOjo9IGludGVnZXIgfCBpbmRleF9zdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAnIl0iPiArXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgY29udmVyc2lvbiAgICAgICAgOjo9ICJyIiB8ICJzIiB8ICJhIlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0ICcKKyAgICAgICAgICAgICAgICAgICdzZWN0aW9uPlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggJworICAgICAgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAgICAgICcqZmllbGRfbmFtZSogdGhhdCBzcGVjaWZpZXMgdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyB0byBiZSAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAgICAgICAnYW5kIGluc2VydGVkIGludG8gdGhlIG91dHB1dCBpbnN0ZWFkIG9mIHRoZSByZXBsYWNlbWVudCAnCisgICAgICAgICAgICAgICAgICAnZmllbGQuIFRoZVxuJworICAgICAgICAgICAgICAgICAgJypmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiAnCisgICAgICAgICAgICAgICAgICAnZmllbGQsIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAncHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgIlwnIVwnIiwgYW5kIGEgJworICAgICAgICAgICAgICAgICAgJypmb3JtYXRfc3BlYyosIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAncHJlY2VkZWQgYnkgYSBjb2xvbiAiXCc6XCciLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgZm9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ3JlcGxhY2VtZW50IHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvIHRoZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIHNlY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpmaWVsZF9uYW1lKiBpdHNlbGYgYmVnaW5zIHdpdGggYW4gKmFyZ19uYW1lKiB0aGF0IGlzICcKKyAgICAgICAgICAgICAgICAgICdlaXRoZXIgYVxuJworICAgICAgICAgICAgICAgICAgIm51bWJlciBvciBhIGtleXdvcmQuICBJZiBpdCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSAiCisgICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAgImFyZ3VtZW50LCBhbmQgaWYgaXQncyBhIGtleXdvcmQsIGl0IHJlZmVycyB0byBhIG5hbWVkICIKKyAgICAgICAgICAgICAgICAgICdrZXl3b3JkXG4nCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ2FyZSAwLCAxLCAyLFxuJworICAgICAgICAgICAgICAgICAgJy4uLiBpbiBzZXF1ZW5jZSwgdGhleSBjYW4gYWxsIGJlIG9taXR0ZWQgKG5vdCBqdXN0IHNvbWUpICcKKyAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVycyAwLCAxLCAyLCAuLi4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ29yZGVyLlxuJworICAgICAgICAgICAgICAgICAgJ0JlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgJ3Bvc3NpYmxlIHRvXG4nCisgICAgICAgICAgICAgICAgICAnc3BlY2lmeSBhcmJpdHJhcnkgZGljdGlvbmFyeSBrZXlzIChlLmcuLCB0aGUgc3RyaW5ncyAnCisgICAgICAgICAgICAgICAgICAnIlwnMTBcJyIgb3JcbicKKyAgICAgICAgICAgICAgICAgICciXCc6LV1cJyIpIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZSAqYXJnX25hbWUqIGNhbiBiZSAnCisgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYW55XG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIG9mIGluZGV4IG9yIGF0dHJpYnV0ZSBleHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiAnCisgICAgICAgICAgICAgICAgICAndGhlIGZvcm1cbicKKyAgICAgICAgICAgICAgICAgICciXCcubmFtZVwnIiBzZWxlY3RzIHRoZSBuYW1lZCBhdHRyaWJ1dGUgdXNpbmcgImdldGF0dHIoKSIsICcKKyAgICAgICAgICAgICAgICAgICd3aGlsZSBhblxuJworICAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gb2YgdGhlIGZvcm0gIlwnW2luZGV4XVwnIiBkb2VzIGFuIGluZGV4IGxvb2t1cCAnCisgICAgICAgICAgICAgICAgICAndXNpbmdcbicKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogVGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVycyAnCisgICAgICAgICAgICAgICAgICAnY2FuIGJlXG4nCisgICAgICAgICAgICAgICAgICAnb21pdHRlZCwgc28gIlwne30ge31cJyIgaXMgZXF1aXZhbGVudCB0byAiXCd7MH0gezF9XCciLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NvbWUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgICMgUmVmZXJlbmNlcyBmaXJzdCAnCisgICAgICAgICAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudFxuJworICAgICAgICAgICAgICAgICAgJyAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0bHkgJworICAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzICJGcm9tIHswfSB0byAnCisgICAgICAgICAgICAgICAgICAnezF9IlxuJworICAgICAgICAgICAgICAgICAgJyAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICAjIFJlZmVyZW5jZXMga2V5d29yZCAnCisgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJ25hbWUnXG4iCisgICAgICAgICAgICAgICAgICAnICAgIldlaWdodCBpbiB0b25zIHswLndlaWdodH0iICAgICAgICMgXCd3ZWlnaHRcJyBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAgJ29mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIlVuaXRzIGRlc3Ryb3llZDoge3BsYXllcnNbMF19IiAgICMgRmlyc3QgZWxlbWVudCBvZiAnCisgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudCAncGxheWVycycuXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdOb3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJyJfX2Zvcm1hdF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzIGl0IGlzICcKKyAgICAgICAgICAgICAgICAgICdkZXNpcmFibGUgdG9cbicKKyAgICAgICAgICAgICAgICAgICdmb3JjZSBhIHR5cGUgdG8gYmUgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLCBvdmVycmlkaW5nIGl0cyAnCisgICAgICAgICAgICAgICAgICAnb3duXG4nCisgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWUgdG8gYSAnCisgICAgICAgICAgICAgICAgICAnc3RyaW5nIGJlZm9yZVxuJworICAgICAgICAgICAgICAgICAgJ2NhbGxpbmcgIl9fZm9ybWF0X18oKSIsIHRoZSBub3JtYWwgZm9ybWF0dGluZyBsb2dpYyBpcyAnCisgICAgICAgICAgICAgICAgICAnYnlwYXNzZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhyZWUgY29udmVyc2lvbiBmbGFncyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogIlwnIXNcJyIgJworICAgICAgICAgICAgICAgICAgJ3doaWNoIGNhbGxzXG4nCisgICAgICAgICAgICAgICAgICAnInN0cigpIiBvbiB0aGUgdmFsdWUsICJcJyFyXCciIHdoaWNoIGNhbGxzICJyZXByKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIlwnIWFcJyIgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICdjYWxscyAiYXNjaWkoKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnU29tZSBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiSGFyb2xkXCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJyAgICJNb3JlIHshYX0iICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbHMgYXNjaWkoKSBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZpcnN0XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICpmb3JtYXRfc3BlYyogZmllbGQgY29udGFpbnMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGUgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgJworICAgICAgICAgICAgICAgICAgJ2FsaWdubWVudCxcbicKKyAgICAgICAgICAgICAgICAgICdwYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmUgaXRzXG4nCisgICAgICAgICAgICAgICAgICAnb3duICJmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UiIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnKmZvcm1hdF9zcGVjKi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdNb3N0IGJ1aWx0LWluIHR5cGVzIHN1cHBvcnQgYSBjb21tb24gZm9ybWF0dGluZyAnCisgICAgICAgICAgICAgICAgICAnbWluaS1sYW5ndWFnZSwgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICdpcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkc1xuJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgY29udGFpbiBhICcKKyAgICAgICAgICAgICAgICAgICdmaWVsZCBuYW1lLFxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb24gZmxhZyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb24sIGJ1dCBkZWVwZXIgJworICAgICAgICAgICAgICAgICAgJ25lc3RpbmcgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAnYWxsb3dlZC4gIFRoZSByZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyAnCisgICAgICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICAgICAnc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZSAqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gJworICAgICAgICAgICAgICAgICAgJ1RoaXNcbicKKyAgICAgICAgICAgICAgICAgICdhbGxvd3MgdGhlIGZvcm1hdHRpbmcgb2YgYSB2YWx1ZSB0byBiZSBkeW5hbWljYWxseSAnCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NlZSB0aGUgRm9ybWF0IGV4YW1wbGVzIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZVxuJworICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICciRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzICcKKyAgICAgICAgICAgICAgICAgICdjb250YWluZWRcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50ZWRcbicKKyAgICAgICAgICAgICAgICAgICcoc2VlIEZvcm1hdCBTdHJpbmcgU3ludGF4IGFuZCBGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzKS4gJworICAgICAgICAgICAgICAgICAgJ1RoZXkgY2FuXG4nCisgICAgICAgICAgICAgICAgICAnYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIGJ1aWx0LWluICJmb3JtYXQoKSIgJworICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uLiAgRWFjaFxuJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3cgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICd0byBiZVxuJworICAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ01vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdFxuJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlICcKKyAgICAgICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgICAgICAnc3VwcG9ydGVkIGJ5IHRoZSBudW1lcmljIHR5cGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0EgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoIiIiIikgJworICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VzXG4nCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkICJzdHIoKSIgb24gdGhlIHZhbHVlLiAnCisgICAgICAgICAgICAgICAgICAnQSBub24tZW1wdHlcbicKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgc3RyaW5nIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBnZW5lcmFsIGZvcm0gb2YgYSAqc3RhbmRhcmQgZm9ybWF0IHNwZWNpZmllciogaXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0X3NwZWMgOjo9ICcKKyAgICAgICAgICAgICAgICAgICdbW2ZpbGxdYWxpZ25dW3NpZ25dWyNdWzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXVxuJworICAgICAgICAgICAgICAgICAgJyAgIGZpbGwgICAgICAgIDo6PSA8YW55IGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICAgICAgICcgICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4nCisgICAgICAgICAgICAgICAgICAnICAgc2lnbiAgICAgICAgOjo9ICIrIiB8ICItIiB8ICIgIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyXG4nCisgICAgICAgICAgICAgICAgICAnICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICB0eXBlICAgICAgICA6Oj0gImIiIHwgImMiIHwgImQiIHwgImUiIHwgIkUiIHwgImYiIHwgIkYiICcKKyAgICAgICAgICAgICAgICAgICd8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0lmIGEgdmFsaWQgKmFsaWduKiB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGNhbiBiZSBwcmVjZWRlZCAnCisgICAgICAgICAgICAgICAgICAnYnkgYSAqZmlsbCpcbicKKyAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSAnCisgICAgICAgICAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAgICAgICAgICdvbWl0dGVkLiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgbGl0ZXJhbCBjdXJseSBicmFjZSAnCisgICAgICAgICAgICAgICAgICAnKCIieyIiIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIiJ9IiIpIGFzIHRoZSAqZmlsbCogY2hhcmFjdGVyIGluIGEgZm9ybWF0dGVkIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAnbGl0ZXJhbCBvciB3aGVuXG4nCisgICAgICAgICAgICAgICAgICAndXNpbmcgdGhlICJzdHIuZm9ybWF0KCkiIG1ldGhvZC4gIEhvd2V2ZXIsIGl0IGlzIHBvc3NpYmxlICcKKyAgICAgICAgICAgICAgICAgICd0byBpbnNlcnQgYVxuJworICAgICAgICAgICAgICAgICAgJ2N1cmx5IGJyYWNlIHdpdGggYSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGQuICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICJsaW1pdGF0aW9uIGRvZXNuJ3RcbiIKKyAgICAgICAgICAgICAgICAgICdhZmZlY3QgdGhlICJmb3JtYXQoKSIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgJworICAgICAgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBPcHRpb24gICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnPFwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCAnCisgICAgICAgICAgICAgICAgICAnd2l0aGluIHRoZSBhdmFpbGFibGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cykuICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCc+XCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCAnCisgICAgICAgICAgICAgICAgICAnd2l0aGluIHRoZSBhdmFpbGFibGUgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJz1cJyIgICAgIHwgRm9yY2VzIHRoZSBwYWRkaW5nIHRvIGJlIHBsYWNlZCBhZnRlciAnCisgICAgICAgICAgICAgICAgICAndGhlIHNpZ24gKGlmIGFueSkgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYnV0IGJlZm9yZSB0aGUgZGlnaXRzLiAgVGhpcyBpcyB1c2VkIGZvciAnCisgICAgICAgICAgICAgICAgICAncHJpbnRpbmcgZmllbGRzICAgfFxuJworICAgICAgICAgICAgICAgICAgIiAgIHwgICAgICAgICAgIHwgaW4gdGhlIGZvcm0gJyswMDAwMDAxMjAnLiBUaGlzIGFsaWdubWVudCAiCisgICAgICAgICAgICAgICAgICAnb3B0aW9uIGlzIG9ubHkgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdmFsaWQgZm9yIG51bWVyaWMgdHlwZXMuICBJdCBiZWNvbWVzIHRoZSAnCisgICAgICAgICAgICAgICAgICAiZGVmYXVsdCB3aGVuICcwJyAgfFxuIgorICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICd3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnXlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGNlbnRlcmVkIHdpdGhpbiAnCisgICAgICAgICAgICAgICAgICAndGhlIGF2YWlsYWJsZSAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCB1bmxlc3MgYSBtaW5pbXVtIGZpZWxkIHdpZHRoIGlzIGRlZmluZWQsIHRoZSAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgd2lkdGhcbicKKyAgICAgICAgICAgICAgICAgICd3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBkYXRhIHRvIGZpbGwgaXQsIHNvICcKKyAgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAgJ2FsaWdubWVudCBvcHRpb24gaGFzIG5vIG1lYW5pbmcgaW4gdGhpcyBjYXNlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqc2lnbiogb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIG51bWJlciB0eXBlcywgYW5kIGNhbiAnCisgICAgICAgICAgICAgICAgICAnYmUgb25lIG9mXG4nCisgICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZzpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE9wdGlvbiAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCcrXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAgJ2JvdGggcG9zaXRpdmUgYXMgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJy1cJyIgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkICcKKyAgICAgICAgICAgICAgICAgICdvbmx5IGZvciBuZWdhdGl2ZSAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAnYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgc3BhY2UgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICAndXNlZCBvbiBwb3NpdGl2ZSAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVycy4gICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAiXCcjXCciIG9wdGlvbiBjYXVzZXMgdGhlICJhbHRlcm5hdGUgZm9ybSIgdG8gYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICAnZm9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb24uICBUaGUgYWx0ZXJuYXRlIGZvcm0gaXMgZGVmaW5lZCBkaWZmZXJlbnRseSBmb3IgJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudFxuJworICAgICAgICAgICAgICAgICAgJ3R5cGVzLiAgVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlciwgZmxvYXQsICcKKyAgICAgICAgICAgICAgICAgICdjb21wbGV4IGFuZFxuJworICAgICAgICAgICAgICAgICAgJ0RlY2ltYWwgdHlwZXMuIEZvciBpbnRlZ2Vycywgd2hlbiBiaW5hcnksIG9jdGFsLCBvciAnCisgICAgICAgICAgICAgICAgICAnaGV4YWRlY2ltYWwgb3V0cHV0XG4nCisgICAgICAgICAgICAgICAgICAnaXMgdXNlZCwgdGhpcyBvcHRpb24gYWRkcyB0aGUgcHJlZml4IHJlc3BlY3RpdmUgIlwnMGJcJyIsICcKKyAgICAgICAgICAgICAgICAgICciXCcwb1wnIiwgb3JcbicKKyAgICAgICAgICAgICAgICAgICciXCcweFwnIiB0byB0aGUgb3V0cHV0IHZhbHVlLiBGb3IgZmxvYXRzLCBjb21wbGV4IGFuZCAnCisgICAgICAgICAgICAgICAgICAnRGVjaW1hbCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiB0byAnCisgICAgICAgICAgICAgICAgICAnYWx3YXlzIGNvbnRhaW4gYVxuJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuICcKKyAgICAgICAgICAgICAgICAgICdOb3JtYWxseSwgYVxuJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHJlc3VsdCBvZiB0aGVzZSAnCisgICAgICAgICAgICAgICAgICAnY29udmVyc2lvbnNcbicKKyAgICAgICAgICAgICAgICAgICdvbmx5IGlmIGEgZGlnaXQgZm9sbG93cyBpdC4gSW4gYWRkaXRpb24sIGZvciAiXCdnXCciIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIlwnR1wnIlxuJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25zLCB0cmFpbGluZyB6ZXJvcyBhcmUgbm90IHJlbW92ZWQgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgJ3Jlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgIlwnLFwnIiBvcHRpb24gc2lnbmFscyB0aGUgdXNlIG9mIGEgY29tbWEgZm9yIGEgJworICAgICAgICAgICAgICAgICAgJ3Rob3VzYW5kcyBzZXBhcmF0b3IuXG4nCisgICAgICAgICAgICAgICAgICAnRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSAiXCduXCciIGludGVnZXIgJworICAgICAgICAgICAgICAgICAgJ3ByZXNlbnRhdGlvbiB0eXBlXG4nCisgICAgICAgICAgICAgICAgICAnaW5zdGVhZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBBZGRlZCB0aGUgIlwnLFwnIiBvcHRpb24gKHNlZSBhbHNvICcKKyAgICAgICAgICAgICAgICAgICcqKlBFUCAzNzgqKikuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnd2lkdGguICBJZiBub3RcbicKKyAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgYnkgYVxuJworICAgICAgICAgICAgICAgICAgJ3plcm8gKCJcJzBcJyIpIGNoYXJhY3RlciBlbmFibGVzIHNpZ24tYXdhcmUgemVyby1wYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICdmb3IgbnVtZXJpY1xuJworICAgICAgICAgICAgICAgICAgJ3R5cGVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgKmZpbGwqIGNoYXJhY3RlciBvZiAiXCcwXCciICcKKyAgICAgICAgICAgICAgICAgICd3aXRoIGFuXG4nCisgICAgICAgICAgICAgICAgICAnKmFsaWdubWVudCogdHlwZSBvZiAiXCc9XCciLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgJworICAgICAgICAgICAgICAgICAgJ2RpZ2l0cyBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICdiZSBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgICAgICAnZm9ybWF0dGVkIHdpdGggIlwnZlwnIiBhbmQgIlwnRlwnIiwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgcG9pbnRcbicKKyAgICAgICAgICAgICAgICAgICdmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZSBmb3JtYXR0ZWQgd2l0aCAiXCdnXCciIG9yICcKKyAgICAgICAgICAgICAgICAgICciXCdHXCciLiAgRm9yIG5vbi1cbicKKyAgICAgICAgICAgICAgICAgICdudW1iZXIgdHlwZXMgdGhlIGZpZWxkIGluZGljYXRlcyB0aGUgbWF4aW11bSBmaWVsZCBzaXplIC0gJworICAgICAgICAgICAgICAgICAgJ2luIG90aGVyXG4nCisgICAgICAgICAgICAgICAgICAnd29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkIGZyb20gdGhlIGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICdjb250ZW50LiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICcqcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlciB2YWx1ZXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRmluYWxseSwgdGhlICp0eXBlKiBkZXRlcm1pbmVzIGhvdyB0aGUgZGF0YSBzaG91bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ3ByZXNlbnRlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgYXZhaWxhYmxlIHN0cmluZyBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ3NcJyIgICAgIHwgU3RyaW5nIGZvcm1hdC4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0eXBlICcKKyAgICAgICAgICAgICAgICAgICdmb3Igc3RyaW5ncyBhbmQgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgICdvbWl0dGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgTm9uZSAgICAgIHwgVGhlIHNhbWUgYXMgJworICAgICAgICAgICAgICAgICAgJyJcJ3NcJyIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBUeXBlICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnYlwnIiAgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gJworICAgICAgICAgICAgICAgICAgJ2Jhc2UgMi4gICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdjXCciICAgICB8IENoYXJhY3Rlci4gQ29udmVydHMgdGhlIGludGVnZXIgdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kaW5nICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAncHJpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2RcJyIgICAgIHwgRGVjaW1hbCBJbnRlZ2VyLiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gJworICAgICAgICAgICAgICAgICAgJ2Jhc2UgMTAuICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnb1wnIiAgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICc4LiAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCd4XCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICcxNiwgdXNpbmcgbG93ZXItICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSAnCisgICAgICAgICAgICAgICAgICAnOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ1hcJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgJworICAgICAgICAgICAgICAgICAgJzE2LCB1c2luZyB1cHBlci0gICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlICcKKyAgICAgICAgICAgICAgICAgICc5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZFwnIiwgJworICAgICAgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICcKKyAgICAgICAgICAgICAgICAgICciXCdkXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSBwcmVzZW50YXRpb24gdHlwZXMsIGludGVnZXJzIGNhbiAnCisgICAgICAgICAgICAgICAgICAnYmUgZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAnCisgICAgICAgICAgICAgICAgICAnKGV4Y2VwdCAiXCduXCciXG4nCisgICAgICAgICAgICAgICAgICAnYW5kIE5vbmUpLiBXaGVuIGRvaW5nIHNvLCAiZmxvYXQoKSIgaXMgdXNlZCB0byBjb252ZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW50ZWdlciB0b1xuJworICAgICAgICAgICAgICAgICAgJ2EgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJlZm9yZSBmb3JtYXR0aW5nLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgdmFsdWVzXG4nCisgICAgICAgICAgICAgICAgICAnYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFByaW50cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdzY2llbnRpZmljICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgIiAgIHwgICAgICAgICAgIHwgbm90YXRpb24gdXNpbmcgdGhlIGxldHRlciAnZScgdG8gaW5kaWNhdGUgIgorICAgICAgICAgICAgICAgICAgJ3RoZSBleHBvbmVudC4gICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnRVwnIiAgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gU2FtZSBhcyAiXCdlXCciICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgaXQgdXNlcyBhbiB1cHBlciAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IGNhc2UgJ0UnIGFzIHRoZSBzZXBhcmF0b3IgIgorICAgICAgICAgICAgICAgICAgJ2NoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIERpc3BsYXlzIHRoZSBudW1iZXIgYXMgYSAnCisgICAgICAgICAgICAgICAgICAnZml4ZWQtcG9pbnQgbnVtYmVyLiAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnRlwnIiAgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyAiXCdmXCciLCBidXQgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRzICJuYW4iIHRvICJOQU4iICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFuZCAiaW5mIiB0byAnCisgICAgICAgICAgICAgICAgICAnIklORiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gJworICAgICAgICAgICAgICAgICAgJyJwID49IDEiLCB0aGlzICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcm91bmRzIHRoZSBudW1iZXIgdG8gInAiIHNpZ25pZmljYW50ICcKKyAgICAgICAgICAgICAgICAgICdkaWdpdHMgYW5kIHRoZW4gICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZm9ybWF0cyB0aGUgcmVzdWx0IGluIGVpdGhlciBmaXhlZC1wb2ludCAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IG9yIGluICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyAnCisgICAgICAgICAgICAgICAgICAnbWFnbml0dWRlLiAgVGhlICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcHJlY2lzZSBydWxlcyBhcmUgYXMgZm9sbG93czogc3VwcG9zZSB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICd0aGUgcmVzdWx0ICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiAnCisgICAgICAgICAgICAgICAgICAnYW5kIHByZWNpc2lvbiAicC0xIiB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3b3VsZCBoYXZlIGV4cG9uZW50ICJleHAiLiAgVGhlbiBpZiAiLTQgPD0gJworICAgICAgICAgICAgICAgICAgJ2V4cCA8IHAiLCB0aGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyJcJ2ZcJyIgYW5kICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHByZWNpc2lvbiAicC0xLWV4cCIuICBPdGhlcndpc2UsIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIGlzIGZvcm1hdHRlZCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiBhbmQgJworICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbiAicC0xIi4gSW4gYm90aCAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgY2FzZXMgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyBhcmUgJworICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQgZnJvbSB0aGUgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc2lnbmlmaWNhbmQsIGFuZCB0aGUgZGVjaW1hbCBwb2ludCBpcyBhbHNvICcKKyAgICAgICAgICAgICAgICAgICdyZW1vdmVkIGlmICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nICcKKyAgICAgICAgICAgICAgICAgICdpdC4gIFBvc2l0aXZlIGFuZCAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbmVnYXRpdmUgaW5maW5pdHksIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnemVybywgYW5kIG5hbnMsICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYXJlIGZvcm1hdHRlZCBhcyAiaW5mIiwgIi1pbmYiLCAiMCIsICItMCIgJworICAgICAgICAgICAgICAgICAgJ2FuZCAibmFuIiAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAncHJlY2lzaW9uLiAgQSBwcmVjaXNpb24gb2YgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgIjAiIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCB0byBhICcKKyAgICAgICAgICAgICAgICAgICdwcmVjaXNpb24gb2YgIjEiLiBUaGUgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZGVmYXVsdCBwcmVjaXNpb24gaXMgJworICAgICAgICAgICAgICAgICAgJyI2Ii4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnR1wnIiAgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyAiXCdnXCciIGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAnc3dpdGNoZXMgdG8gIlwnRVwnIiBpZiAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgdGhlIG51bWJlciBnZXRzIHRvbyBsYXJnZS4gVGhlICcKKyAgICAgICAgICAgICAgICAgICdyZXByZXNlbnRhdGlvbnMgb2YgaW5maW5pdHkgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgJworICAgICAgICAgICAgICAgICAgJ3Rvby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZ1wnIiwgJworICAgICAgICAgICAgICAgICAgJ2V4Y2VwdCB0aGF0IGl0IHVzZXMgdGhlIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJyVcJyIgICAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCAnCisgICAgICAgICAgICAgICAgICAnYW5kIGRpc3BsYXlzIGluICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgZml4ZWQgKCJcJ2ZcJyIpIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSAnCisgICAgICAgICAgICAgICAgICAncGVyY2VudCBzaWduLiAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBOb25lICAgICAgfCBTaW1pbGFyIHRvICJcJ2dcJyIsIGV4Y2VwdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdmaXhlZC1wb2ludCBub3RhdGlvbiwgd2hlbiAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHVzZWQsIGhhcyBhdCBsZWFzdCBvbmUgZGlnaXQgcGFzdCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwgcG9pbnQuIFRoZSAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzIGFzIGhpZ2ggYXMgbmVlZGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICdyZXByZXNlbnQgdGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHBhcnRpY3VsYXIgdmFsdWUuIFRoZSBvdmVyYWxsIGVmZmVjdCBpcyB0byAnCisgICAgICAgICAgICAgICAgICAnbWF0Y2ggdGhlICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG91dHB1dCBvZiAic3RyKCkiIGFzIGFsdGVyZWQgYnkgdGhlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXQgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdtb2RpZmllcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IGV4YW1wbGVzXG4nCisgICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGV4YW1wbGVzIG9mIHRoZSAic3RyLmZvcm1hdCgpIiBzeW50YXggJworICAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gd2l0aCB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0luIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkICcKKyAgICAgICAgICAgICAgICAgICciJSItZm9ybWF0dGluZyxcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoIHRoZSBhZGRpdGlvbiBvZiB0aGUgInt9IiBhbmQgd2l0aCAiOiIgdXNlZCBpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICAgICAgICciJSIuIEZvclxuJworICAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsICJcJyUwMy4yZlwnIiBjYW4gYmUgdHJhbnNsYXRlZCB0byAiXCd7OjAzLjJmfVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCAnCisgICAgICAgICAgICAgICAgICAnb3B0aW9ucywgc2hvd25cbicKKyAgICAgICAgICAgICAgICAgICdpbiB0aGUgZm9sbG93IGV4YW1wbGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0FjY2Vzc2luZyBhcmd1bWVudHMgYnkgcG9zaXRpb246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7MH0sIHsxfSwgezJ9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYSwgYiwgYydcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3t9LCB7fSwge30nLmZvcm1hdCgnYScsICdiJywgJ2MnKSAgIyAzLjErIG9ubHlcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYSwgYiwgYydcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgnYScsICdiJywgJ2MnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdjLCBiLCBhJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezJ9LCB7MX0sIHswfScuZm9ybWF0KConYWJjJykgICAgICAjIHVucGFja2luZyAiCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQgc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICIgICAnYywgYiwgYSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3swfXsxfXswfScuZm9ybWF0KCdhYnJhJywgJ2NhZCcpICAgIyBhcmd1bWVudHMnICIKKyAgICAgICAgICAgICAgICAgICdpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuJworICAgICAgICAgICAgICAgICAgIiAgICdhYnJhY2FkYWJyYSdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IG5hbWU6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwgIgorICAgICAgICAgICAgICAgICAgIntsb25naXR1ZGV9Jy5mb3JtYXQobGF0aXR1ZGU9JzM3LjI0TicsICIKKyAgICAgICAgICAgICAgICAgICJsb25naXR1ZGU9Jy0xMTUuODFXJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+IGNvb3JkID0geydsYXRpdHVkZSc6ICczNy4yNE4nLCAnbG9uZ2l0dWRlJzogIgorICAgICAgICAgICAgICAgICAgIictMTE1LjgxVyd9XG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb29yZGluYXRlczoge2xhdGl0dWRlfSwgIgorICAgICAgICAgICAgICAgICAgIntsb25naXR1ZGV9Jy5mb3JtYXQoKipjb29yZClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVcnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIGFyZ3VtZW50cycgYXR0cmlidXRlczpcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IDMtNWpcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gKCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsICIKKyAgICAgICAgICAgICAgICAgICJwYXJ0IHswLnJlYWx9ICdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LicpLmZvcm1hdChjKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgIgorICAgICAgICAgICAgICAgICAgIjMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBQb2ludDpcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KTpcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHlcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAnUG9pbnQoe3NlbGYueH0sICIKKyAgICAgICAgICAgICAgICAgICJ7c2VsZi55fSknLmZvcm1hdChzZWxmPXNlbGYpXG4iCisgICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IHN0cihQb2ludCg0LCAyKSlcbicKKyAgICAgICAgICAgICAgICAgICIgICAnUG9pbnQoNCwgMiknXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQWNjZXNzaW5nIGFyZ3VtZW50cycgaXRlbXM6XG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGNvb3JkID0gKDMsIDUpXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdYOiB7MFswXX07ICBZOiB7MFsxXX0nLmZvcm1hdChjb29yZClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnWDogMzsgIFk6IDUnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnUmVwbGFjaW5nICIlcyIgYW5kICIlciI6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogJworICAgICAgICAgICAgICAgICAgJ3shc30iLmZvcm1hdChcJ3Rlc3QxXCcsIFwndGVzdDJcJylcbicKKyAgICAgICAgICAgICAgICAgICcgICAicmVwcigpIHNob3dzIHF1b3RlczogXCd0ZXN0MVwnOyBzdHIoKSBkb2VzblwndDogdGVzdDIiXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWxpZ25pbmcgdGhlIHRleHQgYW5kIHNwZWNpZnlpbmcgYSB3aWR0aDpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6PDMwfScuZm9ybWF0KCdsZWZ0IGFsaWduZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICdsZWZ0IGFsaWduZWQgICAgICAgICAgICAgICAgICAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oj4zMH0nLmZvcm1hdCgncmlnaHQgYWxpZ25lZCcpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJyAgICAgICAgICAgICAgICAgcmlnaHQgYWxpZ25lZCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6XjMwfScuZm9ybWF0KCdjZW50ZXJlZCcpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgICdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6Kl4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKSAgIyB1c2UgJyonIGFzIGEgZmlsbCAiCisgICAgICAgICAgICAgICAgICAnY2hhclxuJworICAgICAgICAgICAgICAgICAgIiAgICcqKioqKioqKioqKmNlbnRlcmVkKioqKioqKioqKionXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnUmVwbGFjaW5nICIlK2YiLCAiJS1mIiwgYW5kICIlIGYiIGFuZCBzcGVjaWZ5aW5nIGEgc2lnbjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6K2Z9OyB7OitmfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGl0ICIKKyAgICAgICAgICAgICAgICAgICdhbHdheXNcbicKKyAgICAgICAgICAgICAgICAgICIgICAnKzMuMTQwMDAwOyAtMy4xNDAwMDAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OiBmfTsgezogZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBhIHNwYWNlICIKKyAgICAgICAgICAgICAgICAgICdmb3IgcG9zaXRpdmUgbnVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgIiAgICcgMy4xNDAwMDA7IC0zLjE0MDAwMCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6LWZ9OyB7Oi1mfScuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlICIKKyAgICAgICAgICAgICAgICAgICJtaW51cyAtLSBzYW1lIGFzICd7OmZ9OyB7OmZ9J1xuIgorICAgICAgICAgICAgICAgICAgIiAgICczLjE0MDAwMDsgLTMuMTQwMDAwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJXgiIGFuZCAiJW8iIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byAnCisgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50IGJhc2VzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDp4fTsgIG9jdDogezA6b307ICBiaW46ICcKKyAgICAgICAgICAgICAgICAgICd7MDpifSIuZm9ybWF0KDQyKVxuJworICAgICAgICAgICAgICAgICAgIiAgICdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMCdcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46ICcKKyAgICAgICAgICAgICAgICAgICd7MDojYn0iLmZvcm1hdCg0MilcbicKKyAgICAgICAgICAgICAgICAgICIgICAnaW50OiA0MjsgIGhleDogMHgyYTsgIG9jdDogMG81MjsgIGJpbjogMGIxMDEwMTAnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6LH0nLmZvcm1hdCgxMjM0NTY3ODkwKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcxLDIzNCw1NjcsODkwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0V4cHJlc3NpbmcgYSBwZXJjZW50YWdlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBwb2ludHMgPSAxOVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiB0b3RhbCA9IDIyXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfScuZm9ybWF0KHBvaW50cy90b3RhbClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQ29ycmVjdCBhbnN3ZXJzOiA4Ni4zNiUnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBpbXBvcnQgZGF0ZXRpbWVcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDcsIDQsIDEyLCAxNSwgNTgpXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OiVZLSVtLSVkICVIOiVNOiVTfScuZm9ybWF0KGQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJzIwMTAtMDctMDQgMTI6MTU6NTgnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gZm9yIGFsaWduLCB0ZXh0IGluIHppcCgnPF4+JywgWydsZWZ0JywgJ2NlbnRlcicsICIKKyAgICAgICAgICAgICAgICAgICIncmlnaHQnXSk6XG4iCisgICAgICAgICAgICAgICAgICAiICAgLi4uICAgICAnezA6e2ZpbGx9e2FsaWdufTE2fScuZm9ybWF0KHRleHQsIGZpbGw9YWxpZ24sICIKKyAgICAgICAgICAgICAgICAgICdhbGlnbj1hbGlnbilcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICIgICAnbGVmdDw8PDw8PDw8PDw8PCdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnXl5eXl5jZW50ZXJeXl5eXidcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnPj4+Pj4+Pj4+Pj5yaWdodCdcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj5cbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gb2N0ZXRzID0gWzE5MiwgMTY4LCAwLCAxXVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezowMlh9ezowMlh9ezowMlh9ezowMlh9Jy5mb3JtYXQoKm9jdGV0cylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnQzBBODAwMDEnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGludChfLCAxNilcbicKKyAgICAgICAgICAgICAgICAgICcgICAzMjMyMjM1NTIxXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+XG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IHdpZHRoID0gNVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBmb3IgbnVtIGluIHJhbmdlKDUsMTIpOiAjZG9jdGVzdDogJworICAgICAgICAgICAgICAgICAgJytOT1JNQUxJWkVfV0hJVEVTUEFDRVxuJworICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gJ2RYb2InOlxuIgorICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgICAgIHByaW50KCd7MDp7d2lkdGh9e2Jhc2V9fScuZm9ybWF0KG51bSwgIgorICAgICAgICAgICAgICAgICAgImJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLCBlbmQ9JyAnKVxuIgorICAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoKVxuJworICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA1ICAgICA1ICAgICA1ICAgMTAxXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDYgICAgIDYgICAgIDYgICAxMTBcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgNyAgICAgNyAgICAgNyAgIDExMVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA4ICAgICA4ICAgIDEwICAxMDAwXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDkgICAgIDkgICAgMTEgIDEwMDFcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAxMCAgICAgQSAgICAxMiAgMTAxMFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIDExICAgICBCICAgIDEzICAxMDExXG4nLAorICdmdW5jdGlvbic6ICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb24gZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAnCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZnVuY2RlZiAgICAgICAgICAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgJworICAgICAgICAgICAgICdbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9ycyAgICAgICAgICAgICAgOjo9IGRlY29yYXRvcitcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9yICAgICAgICAgICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiICcKKyAgICAgICAgICAgICAnW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuJworICAgICAgICAgICAgICcgICBkb3R0ZWRfbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdCAgICAgICAgICA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogJworICAgICAgICAgICAgICdbIiwiIFtwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc11dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzIDo6PSAiKiIgW3BhcmFtZXRlcl0gKCIsIiAnCisgICAgICAgICAgICAgJ2RlZnBhcmFtZXRlcikqIFsiLCIgWyIqKiIgcGFyYW1ldGVyIFsiLCJdXV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXIgWyIsIl1cbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICcgICBkZWZwYXJhbWV0ZXIgICAgICAgICAgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZnVuY25hbWUgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gJworICAgICAgICAgICAgICdiaW5kc1xuJworICAgICAgICAgICAgICd0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICcoYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuJworICAgICAgICAgICAgICdmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsICcKKyAgICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICAgJ2FzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyAnCisgICAgICAgICAgICAgJ2dldHNcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGlzXG4nCisgICAgICAgICAgICAgJ2RlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAncmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICdhcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIG5hbWVcbicKKyAgICAgICAgICAgICAnaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCAnCisgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgJ25lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBAZjEoYXJnKVxuJworICAgICAgICAgICAgICcgICBAZjJcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICcgICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4nCisgICAgICAgICAgICAgJypleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgJworICAgICAgICAgICAgICd2YWx1ZXMuIlxuJworICAgICAgICAgICAgICdGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAgICAnKmFyZ3VtZW50KiBtYXlcbicKKyAgICAgICAgICAgICAiYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyJ3MgZGVmYXVsdCAiCisgICAgICAgICAgICAgJ3ZhbHVlIGlzXG4nCisgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tICcKKyAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICdpcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAnZ3JhbW1hci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyoqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpc1xuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgJworICAgICAgICAgICAgICcicHJlLVxuJworICAgICAgICAgICAgICdjb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5ICcKKyAgICAgICAgICAgICAnaW1wb3J0YW50XG4nCisgICAgICAgICAgICAgJ3RvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggJworICAgICAgICAgICAgICdhcyBhXG4nCisgICAgICAgICAgICAgJ2xpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJ2FwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCAnCisgICAgICAgICAgICAgJ21vZGlmaWVkLlxuJworICAgICAgICAgICAgICdUaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyAnCisgICAgICAgICAgICAgJ3RvIHVzZVxuJworICAgICAgICAgICAgICciTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLCBlLmcuOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuJworICAgICAgICAgICAgICcgICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHBlbmd1aW4gPSBbXVxuJworICAgICAgICAgICAgICcgICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuJworICAgICAgICAgICAgICcgICAgICAgcmV0dXJuIHBlbmd1aW5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgJ0NhbGxzLlxuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzICcKKyAgICAgICAgICAgICAnbWVudGlvbmVkIGluXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tICcKKyAgICAgICAgICAgICAna2V5d29yZFxuJworICAgICAgICAgICAgICdhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybSAiIippZGVudGlmaWVyIiIgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnkgZXhjZXNzICcKKyAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZSBmb3JtXG4nCisgICAgICAgICAgICAgJyIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcgJworICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgJ3JlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAnZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlICcKKyAgICAgICAgICAgICAna2V5d29yZC1vbmx5XG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiICcKKyAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuICcKKyAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAnb2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgJworICAgICAgICAgICAgICdoYXZlXG4nCisgICAgICAgICAgICAgJyJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlICcKKyAgICAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgICAgJ2xpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zICcKKyAgICAgICAgICAgICAnbWF5XG4nCisgICAgICAgICAgICAgJ2JlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgJworICAgICAgICAgICAgICdjb2RlLlxuJworICAgICAgICAgICAgICdUaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuJworICAgICAgICAgICAgICdmdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG4nCisgICAgICAgICAgICAgImRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnMnIG5hbWVzIGluIHRoZSAiCisgICAgICAgICAgICAgJyJfX2Fubm90YXRpb25zX18iXG4nCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCAnCisgICAgICAgICAgICAgJ2JvdW5kXG4nCisgICAgICAgICAgICAgJ3RvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gTGFtYmRhcy4gIE5vdGUgdGhhdCB0aGUgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ2RlZmluaXRpb247XG4nCisgICAgICAgICAgICAgJ2EgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kICcKKyAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAnYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSAnCisgICAgICAgICAgICAgJ2xhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlICcKKyAgICAgICAgICAgICAnaXRcbicKKyAgICAgICAgICAgICAnYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIgorICAgICAgICAgICAgICciImRlZiIiXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuJworICAgICAgICAgICAgICdmdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgJworICAgICAgICAgICAgICd1c2VkXG4nCisgICAgICAgICAgICAgJ2luIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IgJworICAgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuJywKKyAnZ2xvYmFsJzogJ1xuJworICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImdsb2JhbCIgc3RhdGVtZW50IGlzIGEgZGVjbGFyYXRpb24gd2hpY2ggaG9sZHMgZm9yIHRoZSAnCisgICAgICAgICAgICdlbnRpcmVcbicKKyAgICAgICAgICAgJ2N1cnJlbnQgY29kZSBibG9jay4gIEl0IG1lYW5zIHRoYXQgdGhlIGxpc3RlZCBpZGVudGlmaWVycyBhcmUgdG8gJworICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgJ2ludGVycHJldGVkIGFzIGdsb2JhbHMuICBJdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIGFzc2lnbiB0byBhICcKKyAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAndmFyaWFibGUgd2l0aG91dCAiZ2xvYmFsIiwgYWx0aG91Z2ggZnJlZSB2YXJpYWJsZXMgbWF5IHJlZmVyIHRvXG4nCisgICAgICAgICAgICdnbG9iYWxzIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQgZ2xvYmFsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBpbiB0aGUgc2FtZSAnCisgICAgICAgICAgICdjb2RlXG4nCisgICAgICAgICAgICdibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgImdsb2JhbCIgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyAnCisgICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAgJ3BhcmFtZXRlcnMgb3IgaW4gYSAiZm9yIiBsb29wIGNvbnRyb2wgdGFyZ2V0LCAiY2xhc3MiIGRlZmluaXRpb24sXG4nCisgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9uLCBvciAiaW1wb3J0IiBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyAnCisgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgJ2VuZm9yY2UgdGhlIHR3byByZXN0cmljdGlvbnMsIGJ1dCBwcm9ncmFtcyBzaG91bGQgbm90IGFidXNlIHRoaXNcbicKKyAgICAgICAgICAgJ2ZyZWVkb20sIGFzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGVuZm9yY2UgdGhlbSBvciBzaWxlbnRseSAnCisgICAgICAgICAgICdjaGFuZ2VcbicKKyAgICAgICAgICAgJ3RoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiB0aGUgImdsb2JhbCIgaXMgYSBkaXJlY3RpdmUgdG8gdGhlICcKKyAgICAgICAgICAgJ3BhcnNlci4gIEl0XG4nCisgICAgICAgICAgICdhcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgImdsb2JhbCJcbicKKyAgICAgICAgICAgJ3N0YXRlbWVudC4gSW4gcGFydGljdWxhciwgYSAiZ2xvYmFsIiBzdGF0ZW1lbnQgY29udGFpbmVkIGluIGEgJworICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICdvciBjb2RlIG9iamVjdCBzdXBwbGllZCB0byB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgZnVuY3Rpb24gZG9lcyAnCisgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgJ2FmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlIGZ1bmN0aW9uIGNhbGwsIGFuZCBjb2RlXG4nCisgICAgICAgICAgICdjb250YWluZWQgaW4gc3VjaCBhIHN0cmluZyBpcyB1bmFmZmVjdGVkIGJ5ICJnbG9iYWwiIHN0YXRlbWVudHMgaW4gJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdjb2RlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uIGNhbGwuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSAnCisgICAgICAgICAgICciZXZhbCgpIlxuJworICAgICAgICAgICAnYW5kICJjb21waWxlKCkiIGZ1bmN0aW9ucy5cbicsCisgJ2lkLWNsYXNzZXMnOiAnXG4nCisgICAgICAgICAgICAgICAnUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuJworICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdDZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgJworICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICdtZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mICcKKyAgICAgICAgICAgICAgICdsZWFkaW5nIGFuZFxuJworICAgICAgICAgICAgICAgJ3RyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICciXyoiXG4nCisgICAgICAgICAgICAgICAnICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCAnCisgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiXyJcbicKKyAgICAgICAgICAgICAgICcgICBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0ICcKKyAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICAnCisgICAgICAgICAgICAgICAnV2hlbiBub3RcbicKKyAgICAgICAgICAgICAgICcgICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICdkZWZpbmVkLlxuJworICAgICAgICAgICAgICAgJyAgIFNlZSBzZWN0aW9uIFRoZSBpbXBvcnQgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbicKKyAgICAgICAgICAgICAgICcgICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4nCisgICAgICAgICAgICAgICAnICAgICAiZ2V0dGV4dCIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgJworICAgICAgICAgICAgICAgJ2NvbnZlbnRpb24uXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl9fKl9fIlxuJworICAgICAgICAgICAgICAgJyAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAnICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gICcKKyAgICAgICAgICAgICAgICdDdXJyZW50XG4nCisgICAgICAgICAgICAgICAnICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICdzZWN0aW9uIGFuZFxuJworICAgICAgICAgICAgICAgJyAgIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgJworICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAnICAgUHl0aG9uLiAgKkFueSogdXNlIG9mICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0ICcKKyAgICAgICAgICAgICAgICdkb2VzIG5vdFxuJworICAgICAgICAgICAgICAgJyAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlICcKKyAgICAgICAgICAgICAgICd3aXRob3V0XG4nCisgICAgICAgICAgICAgICAnICAgd2FybmluZy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICciX18qIlxuJworICAgICAgICAgICAgICAgJyAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgJworICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgJworICAgICAgICAgICAgICAgJ21hbmdsZWQgZm9ybVxuJworICAgICAgICAgICAgICAgJyAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgJworICAgICAgICAgICAgICAgJ2Jhc2UgYW5kXG4nCisgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLlxuJywKKyAnaWRlbnRpZmllcnMnOiAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xuJworICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzICpuYW1lcyopIGFyZSBkZXNjcmliZWQgYnkgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgc3ludGF4IG9mIGlkZW50aWZpZXJzIGluIFB5dGhvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgJ3N0YW5kYXJkXG4nCisgICAgICAgICAgICAgICAgJ2FubmV4IFVBWC0zMSwgd2l0aCBlbGFib3JhdGlvbiBhbmQgY2hhbmdlcyBhcyBkZWZpbmVkIGJlbG93OyAnCisgICAgICAgICAgICAgICAgJ3NlZSBhbHNvXG4nCisgICAgICAgICAgICAgICAgJyoqUEVQIDMxMzEqKiBmb3IgZnVydGhlciBkZXRhaWxzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnV2l0aGluIHRoZSBBU0NJSSByYW5nZSAoVSswMDAxLi5VKzAwN0YpLCB0aGUgdmFsaWQgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICdpZGVudGlmaWVycyBhcmUgdGhlIHNhbWUgYXMgaW4gUHl0aG9uIDIueDogdGhlIHVwcGVyY2FzZSBhbmQgJworICAgICAgICAgICAgICAgICdsb3dlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAnbGV0dGVycyAiQSIgdGhyb3VnaCAiWiIsIHRoZSB1bmRlcnNjb3JlICJfIiBhbmQsIGV4Y2VwdCBmb3IgJworICAgICAgICAgICAgICAgICd0aGUgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVyLCB0aGUgZGlnaXRzICIwIiB0aHJvdWdoICI5Ii5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1B5dGhvbiAzLjAgaW50cm9kdWNlcyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgZnJvbSBvdXRzaWRlIHRoZSAnCisgICAgICAgICAgICAgICAgJ0FTQ0lJXG4nCisgICAgICAgICAgICAgICAgJ3JhbmdlIChzZWUgKipQRVAgMzEzMSoqKS4gIEZvciB0aGVzZSBjaGFyYWN0ZXJzLCB0aGUgJworICAgICAgICAgICAgICAgICdjbGFzc2lmaWNhdGlvblxuJworICAgICAgICAgICAgICAgICd1c2VzIHRoZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBhcyAnCisgICAgICAgICAgICAgICAgJ2luY2x1ZGVkIGluIHRoZVxuJworICAgICAgICAgICAgICAgICcidW5pY29kZWRhdGEiIG1vZHVsZS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0lkZW50aWZpZXJzIGFyZSB1bmxpbWl0ZWQgaW4gbGVuZ3RoLiAgQ2FzZSBpcyBzaWduaWZpY2FudC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIGlkZW50aWZpZXIgICA6Oj0geGlkX3N0YXJ0IHhpZF9jb250aW51ZSpcbicKKyAgICAgICAgICAgICAgICAnICAgaWRfc3RhcnQgICAgIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gZ2VuZXJhbCBjYXRlZ29yaWVzIEx1LCAnCisgICAgICAgICAgICAgICAgJ0xsLCBMdCwgTG0sIExvLCBObCwgdGhlIHVuZGVyc2NvcmUsIGFuZCBjaGFyYWN0ZXJzIHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAnT3RoZXJfSURfU3RhcnQgcHJvcGVydHk+XG4nCisgICAgICAgICAgICAgICAgJyAgIGlkX2NvbnRpbnVlICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0LCBwbHVzICcKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBpbiB0aGUgY2F0ZWdvcmllcyBNbiwgTWMsIE5kLCBQYyBhbmQgb3RoZXJzIHdpdGggJworICAgICAgICAgICAgICAgICd0aGUgT3RoZXJfSURfQ29udGludWUgcHJvcGVydHk+XG4nCisgICAgICAgICAgICAgICAgJyAgIHhpZF9zdGFydCAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX3N0YXJ0IHdob3NlIE5GS0MgJworICAgICAgICAgICAgICAgICdub3JtYWxpemF0aW9uIGlzIGluICJpZF9zdGFydCB4aWRfY29udGludWUqIj5cbicKKyAgICAgICAgICAgICAgICAnICAgeGlkX2NvbnRpbnVlIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfY29udGludWUgd2hvc2UgTkZLQyAnCisgICAgICAgICAgICAgICAgJ25vcm1hbGl6YXRpb24gaXMgaW4gImlkX2NvbnRpbnVlKiI+XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgVW5pY29kZSBjYXRlZ29yeSBjb2RlcyBtZW50aW9uZWQgYWJvdmUgc3RhbmQgZm9yOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTHUqIC0gdXBwZXJjYXNlIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxsKiAtIGxvd2VyY2FzZSBsZXR0ZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpMdCogLSB0aXRsZWNhc2UgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTG0qIC0gbW9kaWZpZXIgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTG8qIC0gb3RoZXIgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTmwqIC0gbGV0dGVyIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk1uKiAtIG5vbnNwYWNpbmcgbWFya3NcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk1jKiAtIHNwYWNpbmcgY29tYmluaW5nIG1hcmtzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpOZCogLSBkZWNpbWFsIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKlBjKiAtIGNvbm5lY3RvciBwdW5jdHVhdGlvbnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk90aGVyX0lEX1N0YXJ0KiAtIGV4cGxpY2l0IGxpc3Qgb2YgY2hhcmFjdGVycyBpbiAnCisgICAgICAgICAgICAgICAgJ1Byb3BMaXN0LnR4dCB0b1xuJworICAgICAgICAgICAgICAgICcgIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk90aGVyX0lEX0NvbnRpbnVlKiAtIGxpa2V3aXNlXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdBbGwgaWRlbnRpZmllcnMgYXJlIGNvbnZlcnRlZCBpbnRvIHRoZSBub3JtYWwgZm9ybSBORktDIHdoaWxlICcKKyAgICAgICAgICAgICAgICAncGFyc2luZztcbicKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBvZiBpZGVudGlmaWVycyBpcyBiYXNlZCBvbiBORktDLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQSBub24tbm9ybWF0aXZlIEhUTUwgZmlsZSBsaXN0aW5nIGFsbCB2YWxpZCBpZGVudGlmaWVyICcKKyAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBmb3JcbicKKyAgICAgICAgICAgICAgICAnVW5pY29kZSA0LjEgY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vd3d3LmRjbC5ocGkudW5pLVxuJworICAgICAgICAgICAgICAgICdwb3RzZGFtLmRlL2hvbWUvbG9ld2lzL3RhYmxlLTMxMzEuaHRtbC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdLZXl3b3Jkc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBpZGVudGlmaWVycyBhcmUgdXNlZCBhcyByZXNlcnZlZCB3b3Jkcywgb3IgJworICAgICAgICAgICAgICAgICcqa2V5d29yZHMqIG9mXG4nCisgICAgICAgICAgICAgICAgJ3RoZSBsYW5ndWFnZSwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIG9yZGluYXJ5IGlkZW50aWZpZXJzLiAgJworICAgICAgICAgICAgICAgICdUaGV5IG11c3RcbicKKyAgICAgICAgICAgICAgICAnYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIEZhbHNlICAgICAgY2xhc3MgICAgICBmaW5hbGx5ICAgIGlzICAgICAgICAgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgJyAgIE5vbmUgICAgICAgY29udGludWUgICBmb3IgICAgICAgIGxhbWJkYSAgICAgdHJ5XG4nCisgICAgICAgICAgICAgICAgJyAgIFRydWUgICAgICAgZGVmICAgICAgICBmcm9tICAgICAgIG5vbmxvY2FsICAgd2hpbGVcbicKKyAgICAgICAgICAgICAgICAnICAgYW5kICAgICAgICBkZWwgICAgICAgIGdsb2JhbCAgICAgbm90ICAgICAgICB3aXRoXG4nCisgICAgICAgICAgICAgICAgJyAgIGFzICAgICAgICAgZWxpZiAgICAgICBpZiAgICAgICAgIG9yICAgICAgICAgeWllbGRcbicKKyAgICAgICAgICAgICAgICAnICAgYXNzZXJ0ICAgICBlbHNlICAgICAgIGltcG9ydCAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICcgICBicmVhayAgICAgIGV4Y2VwdCAgICAgaW4gICAgICAgICByYWlzZVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1Jlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlICcKKyAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICdtZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mICcKKyAgICAgICAgICAgICAgICAnbGVhZGluZyBhbmRcbicKKyAgICAgICAgICAgICAgICAndHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnIl8qIlxuJworICAgICAgICAgICAgICAgICcgICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4gIFRoZSBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiXyJcbicKKyAgICAgICAgICAgICAgICAnICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCAnCisgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICcgICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICAnCisgICAgICAgICAgICAgICAgJ1doZW4gbm90XG4nCisgICAgICAgICAgICAgICAgJyAgIGluIGludGVyYWN0aXZlIG1vZGUsICJfIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpcyBub3QgJworICAgICAgICAgICAgICAgICdkZWZpbmVkLlxuJworICAgICAgICAgICAgICAgICcgICBTZWUgc2VjdGlvbiBUaGUgaW1wb3J0IHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbicKKyAgICAgICAgICAgICAgICAnICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJyAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzICcKKyAgICAgICAgICAgICAgICAnY29udmVudGlvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfXypfXyJcbicKKyAgICAgICAgICAgICAgICAnICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAgJyAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICAnCisgICAgICAgICAgICAgICAgJ0N1cnJlbnRcbicKKyAgICAgICAgICAgICAgICAnICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlIFNwZWNpYWwgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICAnc2VjdGlvbiBhbmRcbicKKyAgICAgICAgICAgICAgICAnICAgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyAnCisgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgJyAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCAnCisgICAgICAgICAgICAgICAgJ2RvZXMgbm90XG4nCisgICAgICAgICAgICAgICAgJyAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlICcKKyAgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgICcgICB3YXJuaW5nLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnIl9fKiJcbicKKyAgICAgICAgICAgICAgICAnICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCAnCisgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAnICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhICcKKyAgICAgICAgICAgICAgICAnbWFuZ2xlZCBmb3JtXG4nCisgICAgICAgICAgICAgICAgJyAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgJworICAgICAgICAgICAgICAgICdiYXNlIGFuZFxuJworICAgICAgICAgICAgICAgICcgICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uIElkZW50aWZpZXJzIChOYW1lcykuXG4nLAorICdpZic6ICdcbicKKyAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAnXG4nCisgICAgICAgJyAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAnICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgJ1xuJworICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICdvbmVcbicKKyAgICAgICAnYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiBCb29sZWFuIG9wZXJhdGlvbnNcbicKKyAgICAgICAnZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4nCisgICAgICAgJyhhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbicKKyAgICAgICAnSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxuJworICAgICAgICdwcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCisgJ2ltYWdpbmFyeSc6ICdcbicKKyAgICAgICAgICAgICAgJ0ltYWdpbmFyeSBsaXRlcmFsc1xuJworICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0ltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCAnCisgICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCAnCisgICAgICAgICAgICAgICdvZiAwLjAuXG4nCisgICAgICAgICAgICAgICdDb21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCAnCisgICAgICAgICAgICAgICdudW1iZXJzXG4nCisgICAgICAgICAgICAgICdhbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSAnCisgICAgICAgICAgICAgICdjb21wbGV4XG4nCisgICAgICAgICAgICAgICdudW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gJworICAgICAgICAgICAgICAnaXQsXG4nCisgICAgICAgICAgICAgICdlLmcuLCAiKDMrNGopIi4gIFNvbWUgZXhhbXBsZXMgb2YgaW1hZ2luYXJ5IGxpdGVyYWxzOlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICAzLjE0aiAgIDEwLmogICAgMTBqICAgICAuMDAxaiAgIDFlMTAwaiAgMy4xNGUtMTBqXG4nLAorICdpbXBvcnQnOiAnXG4nCisgICAgICAgICAgICdUaGUgImltcG9ydCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydF9zdG10ICAgICA6Oj0gImltcG9ydCIgbW9kdWxlIFsiYXMiIG5hbWVdICggIiwiIG1vZHVsZSAnCisgICAgICAgICAgICdbImFzIiBuYW1lXSApKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyICcKKyAgICAgICAgICAgJ1siYXMiIG5hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgJworICAgICAgICAgICAnaWRlbnRpZmllciBbImFzIiBuYW1lXVxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgbW9kdWxlICJpbXBvcnQiICIqIlxuJworICAgICAgICAgICAnICAgbW9kdWxlICAgICAgICAgIDo6PSAoaWRlbnRpZmllciAiLiIpKiBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICcgICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iK1xuJworICAgICAgICAgICAnICAgbmFtZSAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBiYXNpYyBpbXBvcnQgc3RhdGVtZW50IChubyAiZnJvbSIgY2xhdXNlKSBpcyBleGVjdXRlZCBpbiB0d29cbicKKyAgICAgICAgICAgJ3N0ZXBzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcxLiBmaW5kIGEgbW9kdWxlLCBsb2FkaW5nIGFuZCBpbml0aWFsaXppbmcgaXQgaWYgbmVjZXNzYXJ5XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJzIuIGRlZmluZSBhIG5hbWUgb3IgbmFtZXMgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIHNjb3BlXG4nCisgICAgICAgICAgICcgICB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiB0aGUgc3RhdGVtZW50IGNvbnRhaW5zIG11bHRpcGxlIGNsYXVzZXMgKHNlcGFyYXRlZCBieSBjb21tYXMpICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAndHdvIHN0ZXBzIGFyZSBjYXJyaWVkIG91dCBzZXBhcmF0ZWx5IGZvciBlYWNoIGNsYXVzZSwganVzdCBhcyAnCisgICAgICAgICAgICd0aG91Z2hcbicKKyAgICAgICAgICAgJ3RoZSBjbGF1c2VzIGhhZCBiZWVuIHNlcGFyYXRlZCBvdXQgaW50byBpbmRpdmlkdWFsIGltcG9ydCAnCisgICAgICAgICAgICdzdGF0ZW1lbnRzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZGV0YWlscyBvZiB0aGUgZmlyc3Qgc3RlcCwgZmluZGluZyBhbmQgbG9hZGluZyBtb2R1bGVzIGFyZVxuJworICAgICAgICAgICAnZGVzY3JpYmVkIGluIGdyZWF0ZXIgZGV0YWlsIGluIHRoZSBzZWN0aW9uIG9uIHRoZSBpbXBvcnQgc3lzdGVtLCAnCisgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAnYWxzbyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgdHlwZXMgb2YgcGFja2FnZXMgYW5kIG1vZHVsZXMgdGhhdCBjYW4gJworICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgJ2ltcG9ydGVkLCBhcyB3ZWxsIGFzIGFsbCB0aGUgaG9va3MgdGhhdCBjYW4gYmUgdXNlZCB0byBjdXN0b21pemUgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdpbXBvcnQgc3lzdGVtLiBOb3RlIHRoYXQgZmFpbHVyZXMgaW4gdGhpcyBzdGVwIG1heSBpbmRpY2F0ZSAnCisgICAgICAgICAgICdlaXRoZXJcbicKKyAgICAgICAgICAgJ3RoYXQgdGhlIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9jYXRlZCwgKm9yKiB0aGF0IGFuIGVycm9yIG9jY3VycmVkXG4nCisgICAgICAgICAgICd3aGlsZSBpbml0aWFsaXppbmcgdGhlIG1vZHVsZSwgd2hpY2ggaW5jbHVkZXMgZXhlY3V0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAibW9kdWxlJ3MgY29kZS5cbiIKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgdGhlIHJlcXVlc3RlZCBtb2R1bGUgaXMgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSwgaXQgd2lsbCBiZSAnCisgICAgICAgICAgICdtYWRlXG4nCisgICAgICAgICAgICdhdmFpbGFibGUgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBpbiBvbmUgb2YgdGhyZWUgd2F5czpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiB0aGUgbW9kdWxlIG5hbWUgaXMgZm9sbG93ZWQgYnkgImFzIiwgdGhlbiB0aGUgbmFtZSBmb2xsb3dpbmdcbicKKyAgICAgICAgICAgJyAgImFzIiBpcyBib3VuZCBkaXJlY3RseSB0byB0aGUgaW1wb3J0ZWQgbW9kdWxlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIElmIG5vIG90aGVyIG5hbWUgaXMgc3BlY2lmaWVkLCBhbmQgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICIgIHRvcCBsZXZlbCBtb2R1bGUsIHRoZSBtb2R1bGUncyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCAiCisgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgJyAgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGltcG9ydGVkIG1vZHVsZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnICBuYW1lIG9mIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgaXMgYm91bmQgJworICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgJyAgdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIHBhY2thZ2UuICcKKyAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAnICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZVxuJworICAgICAgICAgICAnICByYXRoZXIgdGhhbiBkaXJlY3RseVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcxLiBmaW5kIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAiZnJvbSIgY2xhdXNlLCBsb2FkaW5nIGFuZFxuJworICAgICAgICAgICAnICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTtcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMi4gZm9yIGVhY2ggb2YgdGhlIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiB0aGUgImltcG9ydCIgY2xhdXNlczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMS4gY2hlY2sgaWYgdGhlIGltcG9ydGVkIG1vZHVsZSBoYXMgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCAnCisgICAgICAgICAgICd0aGVuXG4nCisgICAgICAgICAgICcgICAgICBjaGVjayB0aGUgaW1wb3J0ZWQgbW9kdWxlIGFnYWluIGZvciB0aGF0IGF0dHJpYnV0ZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIDQuIG90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhhdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsXG4nCisgICAgICAgICAgICcgICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyAnCisgICAgICAgICAgICdwcmVzZW50LFxuJworICAgICAgICAgICAnICAgICAgb3RoZXJ3aXNlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdFeGFtcGxlczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaW1wb3J0IGZvbyAgICAgICAgICAgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGJvdW5kIGxvY2FsbHlcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCAnCisgICAgICAgICAgICdsb2NhbGx5XG4nCisgICAgICAgICAgICcgICBpbXBvcnQgZm9vLmJhci5iYXogYXMgZmJiICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyAnCisgICAgICAgICAgICdmYmJcbicKKyAgICAgICAgICAgJyAgIGZyb20gZm9vLmJhciBpbXBvcnQgYmF6ICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzICcKKyAgICAgICAgICAgJ2JhelxuJworICAgICAgICAgICAnICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzICcKKyAgICAgICAgICAgJ2F0dHJcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgcmVwbGFjZWQgYnkgYSBzdGFyICgiXCcqXCciKSwgYWxsICcKKyAgICAgICAgICAgJ3B1YmxpY1xuJworICAgICAgICAgICAnbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIGFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3Njb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgIl9fYWxsX18iOyBpZiBkZWZpbmVkLCBpdCAnCisgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICdiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgJworICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAnbW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluICJfX2FsbF9fIiBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljICcKKyAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAnYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgIl9fYWxsX18iIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mICcKKyAgICAgICAgICAgJ3B1YmxpY1xuJworICAgICAgICAgICAibmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGUncyBuYW1lc3BhY2Ugd2hpY2ggZG8gIgorICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdiZWdpbiB3aXRoIGFuIHVuZGVyc2NvcmUgY2hhcmFjdGVyICgiXCdfXCciKS4gICJfX2FsbF9fIiBzaG91bGQgJworICAgICAgICAgICAnY29udGFpblxuJworICAgICAgICAgICAndGhlIGVudGlyZSBwdWJsaWMgQVBJLiBJdCBpcyBpbnRlbmRlZCB0byBhdm9pZCBhY2NpZGVudGFsbHkgJworICAgICAgICAgICAnZXhwb3J0aW5nXG4nCisgICAgICAgICAgICdpdGVtcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgQVBJIChzdWNoIGFzIGxpYnJhcnkgbW9kdWxlcyB3aGljaCAnCisgICAgICAgICAgICd3ZXJlXG4nCisgICAgICAgICAgICdpbXBvcnRlZCBhbmQgdXNlZCB3aXRoaW4gdGhlIG1vZHVsZSkuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIgLS0tIGlzICcKKyAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgJ2FsbG93ZWQgYXQgdGhlIG1vZHVsZSBsZXZlbC4gIEF0dGVtcHRpbmcgdG8gdXNlIGl0IGluIGNsYXNzIG9yXG4nCisgICAgICAgICAgICdmdW5jdGlvbiBkZWZpbml0aW9ucyB3aWxsIHJhaXNlIGEgIlN5bnRheEVycm9yIi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiBzcGVjaWZ5aW5nIHdoYXQgbW9kdWxlIHRvIGltcG9ydCB5b3UgZG8gbm90IGhhdmUgdG8gc3BlY2lmeSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2Fic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzICcKKyAgICAgICAgICAgJ2NvbnRhaW5lZFxuJworICAgICAgICAgICAnd2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0ICcKKyAgICAgICAgICAgJ3dpdGhpblxuJworICAgICAgICAgICAndGhlIHNhbWUgdG9wIHBhY2thZ2Ugd2l0aG91dCBoYXZpbmcgdG8gbWVudGlvbiB0aGUgcGFja2FnZSBuYW1lLiAnCisgICAgICAgICAgICdCeVxuJworICAgICAgICAgICAndXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgImZyb20iICcKKyAgICAgICAgICAgJ3lvdVxuJworICAgICAgICAgICAnY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHlcbicKKyAgICAgICAgICAgJ3dpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50XG4nCisgICAgICAgICAgICdwYWNrYWdlIHdoZXJlIHRoZSBtb2R1bGUgbWFraW5nIHRoZSBpbXBvcnQgZXhpc3RzLiBUd28gZG90cyBtZWFucyAnCisgICAgICAgICAgICd1cFxuJworICAgICAgICAgICAnb25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgJworICAgICAgICAgICAnZXhlY3V0ZVxuJworICAgICAgICAgICAnImZyb20gLiBpbXBvcnQgbW9kIiBmcm9tIGEgbW9kdWxlIGluIHRoZSAicGtnIiBwYWNrYWdlIHRoZW4geW91ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ2VuZCB1cCBpbXBvcnRpbmcgInBrZy5tb2QiLiBJZiB5b3UgZXhlY3V0ZSAiZnJvbSAuLnN1YnBrZzIgaW1wb3J0ICcKKyAgICAgICAgICAgJ21vZCJcbicKKyAgICAgICAgICAgJ2Zyb20gd2l0aGluICJwa2cuc3VicGtnMSIgeW91IHdpbGwgaW1wb3J0ICJwa2cuc3VicGtnMi5tb2QiLiBUaGVcbicKKyAgICAgICAgICAgJ3NwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXMgY29udGFpbmVkIHdpdGhpbiAqKlBFUCAnCisgICAgICAgICAgICczMjgqKi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgJ2RldGVybWluZSBkeW5hbWljYWxseSB0aGUgbW9kdWxlcyB0byBiZSBsb2FkZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRnV0dXJlIHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0EgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgJworICAgICAgICAgICAncGFydGljdWxhclxuJworICAgICAgICAgICAnbW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZVxuJworICAgICAgICAgICAnYXZhaWxhYmxlIGluIGEgc3BlY2lmaWVkIGZ1dHVyZSByZWxlYXNlIG9mIFB5dGhvbiB3aGVyZSB0aGUgJworICAgICAgICAgICAnZmVhdHVyZVxuJworICAgICAgICAgICAnYmVjb21lcyBzdGFuZGFyZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlICcKKyAgICAgICAgICAgJ3ZlcnNpb25zXG4nCisgICAgICAgICAgICdvZiBQeXRob24gdGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlLiAgJworICAgICAgICAgICAnSXRcbicKKyAgICAgICAgICAgJ2FsbG93cyB1c2Ugb2YgdGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZVxuJworICAgICAgICAgICAncmVsZWFzZSBpbiB3aGljaCB0aGUgZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgJworICAgICAgICAgICAnbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgJworICAgICAgICAgICAnWyJhcyIgbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIlxuJworICAgICAgICAgICAnICAgZmVhdHVyZSAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnICAgbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgbmVhciB0aGUgdG9wIG9mIHRoZSBtb2R1bGUuICBUaGUgJworICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAnbGluZXMgdGhhdCBjYW4gYXBwZWFyIGJlZm9yZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIHRoZSBtb2R1bGUgZG9jc3RyaW5nIChpZiBhbnkpLFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIGNvbW1lbnRzLFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqIGJsYW5rIGxpbmVzLCBhbmRcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBvdGhlciBmdXR1cmUgc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDMuMCBhcmUgImFic29sdXRlX2ltcG9ydCIsXG4nCisgICAgICAgICAgICciZGl2aXNpb24iLCAiZ2VuZXJhdG9ycyIsICJ1bmljb2RlX2xpdGVyYWxzIiwgInByaW50X2Z1bmN0aW9uIixcbicKKyAgICAgICAgICAgJyJuZXN0ZWRfc2NvcGVzIiBhbmQgIndpdGhfc3RhdGVtZW50Ii4gIFRoZXkgYXJlIGFsbCByZWR1bmRhbnQgJworICAgICAgICAgICAnYmVjYXVzZVxuJworICAgICAgICAgICAndGhleSBhcmUgYWx3YXlzIGVuYWJsZWQsIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcyAnCisgICAgICAgICAgICdjb21wYXRpYmlsaXR5LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgcmVjb2duaXplZCBhbmQgdHJlYXRlZCBzcGVjaWFsbHkgYXQgY29tcGlsZVxuJworICAgICAgICAgICAndGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW5cbicKKyAgICAgICAgICAgJ2ltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgZGlmZmVyZW50IGNvZGUuICBJdCBtYXkgZXZlbiBiZSB0aGUgJworICAgICAgICAgICAnY2FzZVxuJworICAgICAgICAgICAndGhhdCBhIG5ldyBmZWF0dXJlIGludHJvZHVjZXMgbmV3IGluY29tcGF0aWJsZSBzeW50YXggKHN1Y2ggYXMgYSAnCisgICAgICAgICAgICduZXdcbicKKyAgICAgICAgICAgJ3Jlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZSBkaWZmZXJlbnRseS4gIFN1Y2ggZGVjaXNpb25zIGNhbm5vdCBiZSBwdXNoZWQgb2ZmIHVudGlsXG4nCisgICAgICAgICAgICdydW50aW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdGb3IgYW55IGdpdmVuIHJlbGVhc2UsIHRoZSBjb21waWxlciBrbm93cyB3aGljaCBmZWF0dXJlIG5hbWVzICcKKyAgICAgICAgICAgJ2hhdmVcbicKKyAgICAgICAgICAgJ2JlZW4gZGVmaW5lZCwgYW5kIHJhaXNlcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZ1dHVyZSAnCisgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJ2NvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBkaXJlY3QgcnVudGltZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGZvciBhbnkgaW1wb3J0ICcKKyAgICAgICAgICAgJ3N0YXRlbWVudDpcbicKKyAgICAgICAgICAgJ3RoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlICJfX2Z1dHVyZV9fIiwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXQgJworICAgICAgICAgICAnd2lsbFxuJworICAgICAgICAgICAnYmUgaW1wb3J0ZWQgaW4gdGhlIHVzdWFsIHdheSBhdCB0aGUgdGltZSB0aGUgZnV0dXJlIHN0YXRlbWVudCBpc1xuJworICAgICAgICAgICAnZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBpbnRlcmVzdGluZyBydW50aW1lIHNlbWFudGljcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGZlYXR1cmVcbicKKyAgICAgICAgICAgJ2VuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ05vdGUgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHN0YXRlbWVudDpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgIlRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXQncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50ICIKKyAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgJ25vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0NvZGUgY29tcGlsZWQgYnkgY2FsbHMgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiZXhlYygpIiBhbmRcbicKKyAgICAgICAgICAgJyJjb21waWxlKCkiIHRoYXQgb2NjdXIgaW4gYSBtb2R1bGUgIk0iIGNvbnRhaW5pbmcgYSBmdXR1cmUgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICd3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ldyBzeW50YXggb3Igc2VtYW50aWNzIGFzc29jaWF0ZWQgd2l0aCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2Z1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAnImNvbXBpbGUoKSIgLS0tIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGZ1bmN0aW9uIGZvciAnCisgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIGZ1dHVyZSBzdGF0ZW1lbnQgdHlwZWQgYXQgYW4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgcHJvbXB0ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ3Rha2UgZWZmZWN0IGZvciB0aGUgcmVzdCBvZiB0aGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbi4gIElmIGFuXG4nCisgICAgICAgICAgICdpbnRlcnByZXRlciBpcyBzdGFydGVkIHdpdGggdGhlICItaSIgb3B0aW9uLCBpcyBwYXNzZWQgYSBzY3JpcHQgJworICAgICAgICAgICAnbmFtZVxuJworICAgICAgICAgICAndG8gZXhlY3V0ZSwgYW5kIHRoZSBzY3JpcHQgaW5jbHVkZXMgYSBmdXR1cmUgc3RhdGVtZW50LCBpdCB3aWxsIGJlICcKKyAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICdlZmZlY3QgaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24gc3RhcnRlZCBhZnRlciB0aGUgc2NyaXB0IGlzXG4nCisgICAgICAgICAgICdleGVjdXRlZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG4nCisgICAgICAgICAgICcgICAgIFRoZSBvcmlnaW5hbCBwcm9wb3NhbCBmb3IgdGhlIF9fZnV0dXJlX18gbWVjaGFuaXNtLlxuJywKKyAnaW4nOiAnXG4nCisgICAgICAgJ01lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG4nCisgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgJ1xuJworICAgICAgICdUaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuJworICAgICAgICdldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgInhcbicKKyAgICAgICAnbm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuJworICAgICAgICdhbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iICcKKyAgICAgICAndGVzdHNcbicKKyAgICAgICAnd2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xuJworICAgICAgICdsaXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbicKKyAgICAgICAnZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSBmb3IgZSBpblxuJworICAgICAgICd5KSIuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdGhlIHN0cmluZyBhbmQgYnl0ZXMgdHlwZXMsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqICcKKyAgICAgICAnaXNcbicKKyAgICAgICAnYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbicKKyAgICAgICAnc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG8gYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZyxcbicKKyAgICAgICAnc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiIG1ldGhvZCwgInhcbicKKyAgICAgICAnaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG4nCisgICAgICAgJ1xuJworICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSAiX19jb250YWluc19fKCkiIGJ1dCBkb1xuJworICAgICAgICdkZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbicKKyAgICAgICAnaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuJworICAgICAgICdkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24uXG4nCisgICAgICAgJ1xuJworICAgICAgICdMYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbicKKyAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxuJworICAgICAgICduZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbicKKyAgICAgICAnaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuJworICAgICAgICdleGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG4nCisgICAgICAgJ1xuJworICAgICAgICdUaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbicKKyAgICAgICAnImluIi5cbicsCisgJ2ludGVnZXJzJzogJ1xuJworICAgICAgICAgICAgICdJbnRlZ2VyIGxpdGVyYWxzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0ludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGludGVnZXIgICAgICAgIDo6PSBkZWNpbWFsaW50ZWdlciB8IG9jdGludGVnZXIgfCBoZXhpbnRlZ2VyIHwgJworICAgICAgICAgICAgICdiaW5pbnRlZ2VyXG4nCisgICAgICAgICAgICAgJyAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuJworICAgICAgICAgICAgICcgICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiXG4nCisgICAgICAgICAgICAgJyAgIGRpZ2l0ICAgICAgICAgIDo6PSAiMCIuLi4iOSJcbicKKyAgICAgICAgICAgICAnICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgaGV4aW50ZWdlciAgICAgOjo9ICIwIiAoIngiIHwgIlgiKSBoZXhkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgYmluaW50ZWdlciAgICAgOjo9ICIwIiAoImIiIHwgIkIiKSBiaW5kaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuJworICAgICAgICAgICAgICcgICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiJcbicKKyAgICAgICAgICAgICAnICAgYmluZGlnaXQgICAgICAgOjo9ICIwIiB8ICIxIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlcmUgaXMgbm8gbGltaXQgZm9yIHRoZSBsZW5ndGggb2YgaW50ZWdlciBsaXRlcmFscyBhcGFydCBmcm9tICcKKyAgICAgICAgICAgICAnd2hhdFxuJworICAgICAgICAgICAgICdjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgbGVhZGluZyB6ZXJvcyBpbiBhIG5vbi16ZXJvIGRlY2ltYWwgbnVtYmVyIGFyZSBub3QgJworICAgICAgICAgICAgICdhbGxvd2VkLlxuJworICAgICAgICAgICAgICdUaGlzIGlzIGZvciBkaXNhbWJpZ3VhdGlvbiB3aXRoIEMtc3R5bGUgb2N0YWwgbGl0ZXJhbHMsIHdoaWNoICcKKyAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgJ3VzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU29tZSBleGFtcGxlcyBvZiBpbnRlZ2VyIGxpdGVyYWxzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgNyAgICAgMjE0NzQ4MzY0NyAgICAgICAgICAgICAgICAgICAgICAgIDBvMTc3ICAgIDBiMTAwMTEwMTExXG4nCisgICAgICAgICAgICAgJyAgIDMgICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2ICAgICAwbzM3NyAgICAweGRlYWRiZWVmXG4nLAorICdsYW1iZGEnOiAnXG4nCisgICAgICAgICAgICdMYW1iZGFzXG4nCisgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGxhbWJkYV9leHByICAgICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuJworICAgICAgICAgICAnICAgbGFtYmRhX2V4cHJfbm9jb25kIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiAnCisgICAgICAgICAgICdleHByZXNzaW9uX25vY29uZFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdMYW1iZGEgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgbGFtYmRhIGZvcm1zKSBhcmUgdXNlZCB0byAnCisgICAgICAgICAgICdjcmVhdGVcbicKKyAgICAgICAgICAgJ2Fub255bW91cyBmdW5jdGlvbnMuIFRoZSBleHByZXNzaW9uICJsYW1iZGEgYXJndW1lbnRzOiAnCisgICAgICAgICAgICdleHByZXNzaW9uIlxuJworICAgICAgICAgICAneWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhICcKKyAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICdvYmplY3QgZGVmaW5lZCB3aXRoXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGRlZiA8bGFtYmRhPihhcmd1bWVudHMpOlxuJworICAgICAgICAgICAnICAgICAgIHJldHVybiBleHByZXNzaW9uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1NlZSBzZWN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciAnCisgICAgICAgICAgICdsaXN0cy5cbicKKyAgICAgICAgICAgJ05vdGUgdGhhdCBmdW5jdGlvbnMgY3JlYXRlZCB3aXRoIGxhbWJkYSBleHByZXNzaW9ucyBjYW5ub3QgJworICAgICAgICAgICAnY29udGFpblxuJworICAgICAgICAgICAnc3RhdGVtZW50cyBvciBhbm5vdGF0aW9ucy5cbicsCisgJ2xpc3RzJzogJ1xuJworICAgICAgICAgICdMaXN0IGRpc3BsYXlzXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkICcKKyAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAnc3F1YXJlIGJyYWNrZXRzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgbGlzdF9kaXNwbGF5IDo6PSAiWyIgW3N0YXJyZWRfbGlzdCB8IGNvbXByZWhlbnNpb25dICJdIlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LCB0aGUgY29udGVudHMgYmVpbmcgJworICAgICAgICAgICdzcGVjaWZpZWRcbicKKyAgICAgICAgICAnYnkgZWl0aGVyIGEgbGlzdCBvZiBleHByZXNzaW9ucyBvciBhIGNvbXByZWhlbnNpb24uICBXaGVuIGEgY29tbWEtXG4nCisgICAgICAgICAgJ3NlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGlzIHN1cHBsaWVkLCBpdHMgZWxlbWVudHMgYXJlICcKKyAgICAgICAgICAnZXZhbHVhdGVkXG4nCisgICAgICAgICAgJ2Zyb20gbGVmdCB0byByaWdodCBhbmQgcGxhY2VkIGludG8gdGhlIGxpc3Qgb2JqZWN0IGluIHRoYXQgb3JkZXIuXG4nCisgICAgICAgICAgJ1doZW4gYSBjb21wcmVoZW5zaW9uIGlzIHN1cHBsaWVkLCB0aGUgbGlzdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZVxuJworICAgICAgICAgICdlbGVtZW50cyByZXN1bHRpbmcgZnJvbSB0aGUgY29tcHJlaGVuc2lvbi5cbicsCisgJ25hbWluZyc6ICdcbicKKyAgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZ1xuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQmluZGluZyBvZiBuYW1lc1xuJworICAgICAgICAgICAnPT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbicKKyAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byAnCisgICAgICAgICAgICdmdW5jdGlvbnMsXG4nCisgICAgICAgICAgICciaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgJworICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICdpZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yICcKKyAgICAgICAgICAgJ2FmdGVyXG4nCisgICAgICAgICAgICciYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiAnCisgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJ29mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG4nCisgICAgICAgICAgICdpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyAnCisgICAgICAgICAgICdmb3JtXG4nCisgICAgICAgICAgICdtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0EgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgJworICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICd0aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSAnCisgICAgICAgICAgICduYW1lKS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgJworICAgICAgICAgICAnYnkgYVxuJworICAgICAgICAgICAnY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgJworICAgICAgICAgICAndG9wLWxldmVsXG4nCisgICAgICAgICAgICdjb2RlIGJsb2NrKS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCAnCisgICAgICAgICAgICdibG9jayxcbicKKyAgICAgICAgICAgJ3VubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0ICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAgJ2NvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgJworICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAnYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgJworICAgICAgICAgICAnKmJpbmRpbmcqXG4nCisgICAgICAgICAgICdvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnUmVzb2x1dGlvbiBvZiBuYW1lc1xuJworICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhICcKKyAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICd2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdkZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgJworICAgICAgICAgICAnYmxvY2tzXG4nCisgICAgICAgICAgICdjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayAnCisgICAgICAgICAgICdpbnRyb2R1Y2VzXG4nCisgICAgICAgICAgICdhIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSAnCisgICAgICAgICAgICduZWFyZXN0XG4nCisgICAgICAgICAgICdlbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSAnCisgICAgICAgICAgICdibG9ja1xuJworICAgICAgICAgICAiaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouXG4iCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgJ3JhaXNlZC4gSWZcbicKKyAgICAgICAgICAgJ3RoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSAnCisgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAndmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50IHdoZXJlICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnbmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICciVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgJworICAgICAgICAgICAnYWxsXG4nCisgICAgICAgICAgICd1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2N1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICdibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG4nCisgICAgICAgICAgICdkZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxuJworICAgICAgICAgICAnd2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuJworICAgICAgICAgICAnZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lICcKKyAgICAgICAgICAgJ2JpbmRpbmdcbicKKyAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgJworICAgICAgICAgICAnbmFtZVxuJworICAgICAgICAgICAnc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAndG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsICcKKyAgICAgICAgICAgJ25hbWVzcGFjZSBieVxuJworICAgICAgICAgICAnc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuJworICAgICAgICAgICAnY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSAnCisgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgJ29mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkICcKKyAgICAgICAgICAgJ2ZpcnN0LiAgSWZcbicKKyAgICAgICAgICAgJ3RoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyBzZWFyY2hlZC4gICcKKyAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAnImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgJworICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICdpbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlICcKKyAgICAgICAgICAgJ3ZhcmlhYmxlXG4nCisgICAgICAgICAgICdjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSAnCisgICAgICAgICAgICdnbG9iYWwuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciB0b1xuJworICAgICAgICAgICAncHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uICcKKyAgICAgICAgICAgJ3Njb3BlLlxuJworICAgICAgICAgICAnIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgJworICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdleGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAnbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgJworICAgICAgICAgICAnY2FsbGVkXG4nCisgICAgICAgICAgICciX19tYWluX18iLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdDbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiAnCisgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgJ3NwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gaXMgJworICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgJ2V4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSAnCisgICAgICAgICAgICdyZWZlcmVuY2VzXG4nCisgICAgICAgICAgICdmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgJ3VuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICcKKyAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAnbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5ICcKKyAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICd0aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgbGltaXRlZCAnCisgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAndGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgJworICAgICAgICAgICAnLS1cbicKKyAgICAgICAgICAgJ3RoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSB0aGV5ICcKKyAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAnaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgJworICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICd3aWxsIGZhaWw6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGNsYXNzIEE6XG4nCisgICAgICAgICAgICcgICAgICAgYSA9IDQyXG4nCisgICAgICAgICAgICcgICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0J1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuJworICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlICcKKyAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICdpcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyAnCisgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgJ25hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgbGF0dGVyICcKKyAgICAgICAgICAgJ2Nhc2VcbicKKyAgICAgICAgICAgInRoZSBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIgorICAgICAgICAgICAnIl9fbWFpbl9fIlxuJworICAgICAgICAgICAnbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gaW4gJworICAgICAgICAgICAnYW55XG4nCisgICAgICAgICAgICdvdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJyJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSAnCisgICAgICAgICAgICd1c2VyLWNyZWF0ZWRcbicKKyAgICAgICAgICAgJ2RpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbicKKyAgICAgICAgICAgJyJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xuJworICAgICAgICAgICAnd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgJworICAgICAgICAgICAnImltcG9ydCJcbicKKyAgICAgICAgICAgJ3RoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgJworICAgICAgICAgICAnY29tcGlsZVxuJworICAgICAgICAgICAndGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBpID0gMTBcbicKKyAgICAgICAgICAgJyAgIGRlZiBmKCk6XG4nCisgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgJyAgIGkgPSA0MlxuJworICAgICAgICAgICAnICAgZigpXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gJworICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAnaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCAnCisgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAnZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgJworICAgICAgICAgICAnZnVsbFxuJworICAgICAgICAgICAnZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgJworICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgJ2FuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCAnCisgICAgICAgICAgICdyZXNvbHZlZFxuJworICAgICAgICAgICAnaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAgJworICAgICAgICAgICAnWzFdXG4nCisgICAgICAgICAgICdUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xuJworICAgICAgICAgICAnb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlICcKKyAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICdzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG4nLAorICdub25sb2NhbCc6ICdcbicKKyAgICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgbm9ubG9jYWxfc3RtdCA6Oj0gIm5vbmxvY2FsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgdG8gcmVmZXIgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICdwcmV2aW91c2x5IGJvdW5kIHZhcmlhYmxlcyBpbiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgJworICAgICAgICAgICAgICdleGNsdWRpbmdcbicKKyAgICAgICAgICAgICAnZ2xvYmFscy4gVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgJworICAgICAgICAgICAgICdiaW5kaW5nIGlzXG4nCisgICAgICAgICAgICAgJ3RvIHNlYXJjaCB0aGUgbG9jYWwgbmFtZXNwYWNlIGZpcnN0LiAgVGhlIHN0YXRlbWVudCBhbGxvd3NcbicKKyAgICAgICAgICAgICAnZW5jYXBzdWxhdGVkIGNvZGUgdG8gcmViaW5kIHZhcmlhYmxlcyBvdXRzaWRlIG9mIHRoZSBsb2NhbCAnCisgICAgICAgICAgICAgJ3Njb3BlXG4nCisgICAgICAgICAgICAgJ2Jlc2lkZXMgdGhlIGdsb2JhbCAobW9kdWxlKSBzY29wZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50LCB1bmxpa2UgdGhvc2UgbGlzdGVkIGluICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICciZ2xvYmFsIiBzdGF0ZW1lbnQsIG11c3QgcmVmZXIgdG8gcHJlLWV4aXN0aW5nIGJpbmRpbmdzIGluIGFuXG4nCisgICAgICAgICAgICAgJ2VuY2xvc2luZyBzY29wZSAodGhlIHNjb3BlIGluIHdoaWNoIGEgbmV3IGJpbmRpbmcgc2hvdWxkIGJlICcKKyAgICAgICAgICAgICAnY3JlYXRlZFxuJworICAgICAgICAgICAgICdjYW5ub3QgYmUgZGV0ZXJtaW5lZCB1bmFtYmlndW91c2x5KS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50IG11c3Qgbm90IGNvbGxpZGUgd2l0aCAnCisgICAgICAgICAgICAgJ3ByZS1cbicKKyAgICAgICAgICAgICAnZXhpc3RpbmcgYmluZGluZ3MgaW4gdGhlIGxvY2FsIHNjb3BlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICoqUEVQIDMxMDQqKiAtIEFjY2VzcyB0byBOYW1lcyBpbiBPdXRlciBTY29wZXNcbicKKyAgICAgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhlICJub25sb2NhbCIgc3RhdGVtZW50LlxuJywKKyAnbnVtYmVycyc6ICdcbicKKyAgICAgICAgICAgICdOdW1lcmljIGxpdGVyYWxzXG4nCisgICAgICAgICAgICAnKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1RoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBudW1lcmljIGxpdGVyYWxzOiBpbnRlZ2VycywgZmxvYXRpbmcgJworICAgICAgICAgICAgJ3BvaW50XG4nCisgICAgICAgICAgICAnbnVtYmVycywgYW5kIGltYWdpbmFyeSBudW1iZXJzLiAgVGhlcmUgYXJlIG5vIGNvbXBsZXggbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICcoY29tcGxleCBudW1iZXJzIGNhbiBiZSBmb3JtZWQgYnkgYWRkaW5nIGEgcmVhbCBudW1iZXIgYW5kIGFuXG4nCisgICAgICAgICAgICAnaW1hZ2luYXJ5IG51bWJlcikuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICcKKyAgICAgICAgICAgICciLTEiXG4nCisgICAgICAgICAgICAnaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgXCciLSJcJyAnCisgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgJ2xpdGVyYWwgIjEiLlxuJywKKyAnbnVtZXJpYy10eXBlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgICdNZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkICcKKyAgICAgICAgICAgICAgICAgICdieSB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdwYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlICcKKyAgICAgICAgICAgICAgICAgICdvcGVyYXRpb25zIGZvclxuJworICAgICAgICAgICAgICAgICAgJ25vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgJworICAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlLCB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2Ugb2YgYVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIHRoYXQgaGFzIGFuICJfX2FkZF9fKCkiIG1ldGhvZCwgInguX19hZGRfXyh5KSIgaXMgJworICAgICAgICAgICAgICAgICAgJ2NhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byAnCisgICAgICAgICAgICAgICAgICAndXNpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19mbG9vcmRpdl9fKCkiIGFuZCAiX19tb2RfXygpIjsgaXQgc2hvdWxkIG5vdCBiZSAnCisgICAgICAgICAgICAgICAgICAncmVsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgICJfX3RydWVkaXZfXygpIi4gIE5vdGUgdGhhdCAiX19wb3dfXygpIiBzaG91bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ2RlZmluZWQgdG8gYWNjZXB0XG4nCisgICAgICAgICAgICAgICAgICAnICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgICAgICAgICAnICAgInBvdygpIiBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgJworICAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAnCisgICAgICAgICAgICAgICAgICAnImRpdm1vZCgpIixcbicKKyAgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAnCisgICAgICAgICAgICAgICAgICAnKHN3YXBwZWQpXG4nCisgICAgICAgICAgICAgICAgICAnICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0ICcKKyAgICAgICAgICAgICAgICAgICdvcGVyYW5kIGRvZXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kIHRoZSBvcGVyYW5kcyAnCisgICAgICAgICAgICAgICAgICAnYXJlIG9mXG4nCisgICAgICAgICAgICAgICAgICAnICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gInggLVxuJworICAgICAgICAgICAgICAgICAgJyAgIHkiLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiAnCisgICAgICAgICAgICAgICAgICAnIl9fcnN1Yl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kLCAieS5fX3JzdWJfXyh4KSIgaXMgY2FsbGVkIGlmICJ4Ll9fc3ViX18oeSkiICcKKyAgICAgICAgICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgICAgICAgICAnICAgKk5vdEltcGxlbWVudGVkKi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICcKKyAgICAgICAgICAgICAgICAgICciX19ycG93X18oKSIgKHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAnbGVmdFxuJworICAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlICIKKyAgICAgICAgICAgICAgICAgICdyZWZsZWN0ZWQgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBmb3IgdGhlIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlICcKKyAgICAgICAgICAgICAgICAgICd0aGUgbGVmdFxuJworICAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3MgIgorICAgICAgICAgICAgICAgICAgJ3N1YmNsYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIHRvIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy5cbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkICcKKyAgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAnCisgICAgICAgICAgICAgICAgICAnIioqPSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICdhdHRlbXB0IHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kIHJldHVybiAnCisgICAgICAgICAgICAgICAgICAndGhlIHJlc3VsdFxuJworICAgICAgICAgICAgICAgICAgJyAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhICcKKyAgICAgICAgICAgICAgICAgICdzcGVjaWZpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzICcKKyAgICAgICAgICAgICAgICAgICdiYWNrIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgJworICAgICAgICAgICAgICAgICAgJ2EgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gJworICAgICAgICAgICAgICAgICAgJyJ4ID1cbicKKyAgICAgICAgICAgICAgICAgICcgICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICcieS5fX3JhZGRfXyh4KSIgYXJlXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiAnCisgICAgICAgICAgICAgICAgICAnY2VydGFpblxuJworICAgICAgICAgICAgICAgICAgJyAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gJworICAgICAgICAgICAgICAgICAgJ3VuZXhwZWN0ZWQgZXJyb3JzXG4nCisgICAgICAgICAgICAgICAgICAiICAgKHNlZSBXaHkgZG9lcyBhX3R1cGxlW2ldICs9IFsnaXRlbSddIHJhaXNlIGFuIGV4Y2VwdGlvbiAiCisgICAgICAgICAgICAgICAgICAnd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBhZGRpdGlvbiB3b3Jrcz8pLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgJworICAgICAgICAgICAgICAgICAgJ3RoZSBkYXRhXG4nCisgICAgICAgICAgICAgICAgICAnICAgbW9kZWwuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmVnX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3NfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Fic19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW52ZXJ0X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICAgICAgJygiLSIsICIrIixcbicKKyAgICAgICAgICAgICAgICAgICcgICAiYWJzKCkiIGFuZCAifiIpLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JvdW5kX18oc2VsZlssIG5dKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgJworICAgICAgICAgICAgICAgICAgJyJpbnQoKSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHR5cGUuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgJworICAgICAgICAgICAgICAgICAgJ1B5dGhvbiBuZWVkc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHRvIGxvc3NsZXNzbHkgY29udmVydCB0aGUgbnVtZXJpYyBvYmplY3QgdG8gYW4gaW50ZWdlciAnCisgICAgICAgICAgICAgICAgICAnb2JqZWN0IChzdWNoXG4nCisgICAgICAgICAgICAgICAgICAnICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICcib2N0KCkiXG4nCisgICAgICAgICAgICAgICAgICAnICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0IGlzIGFuIGludGVnZXIgdHlwZS4gIE11c3QgcmV0dXJuIGFuIGludGVnZXIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgJworICAgICAgICAgICAgICAgICAgJ3doZW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSAnCisgICAgICAgICAgICAgICAgICAnZGVmaW5lZCwgYW5kXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBib3RoIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgdmFsdWUuXG4nLAorICdvYmplY3RzJzogJ1xuJworICAgICAgICAgICAgJ09iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAiKk9iamVjdHMqIGFyZSBQeXRob24ncyBhYnN0cmFjdGlvbiBmb3IgZGF0YS4gIEFsbCBkYXRhIGluIGEgIgorICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgJ3Byb2dyYW0gaXMgcmVwcmVzZW50ZWQgYnkgb2JqZWN0cyBvciBieSByZWxhdGlvbnMgYmV0d2VlbiAnCisgICAgICAgICAgICAnb2JqZWN0cy4gKEluXG4nCisgICAgICAgICAgICAnYSBzZW5zZSwgYW5kIGluIGNvbmZvcm1hbmNlIHRvIFZvbiBOZXVtYW5uXCdzIG1vZGVsIG9mIGEgInN0b3JlZFxuJworICAgICAgICAgICAgJ3Byb2dyYW0gY29tcHV0ZXIsIiBjb2RlIGlzIGFsc28gcmVwcmVzZW50ZWQgYnkgb2JqZWN0cy4pXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAiRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN0J3NcbiIKKyAgICAgICAgICAgICcqaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rICcKKyAgICAgICAgICAgICdvZiBpdFxuJworICAgICAgICAgICAgJ2FzIHRoZSBvYmplY3RcJ3MgYWRkcmVzcyBpbiBtZW1vcnkuICBUaGUgXCciaXMiXCcgb3BlcmF0b3IgJworICAgICAgICAgICAgJ2NvbXBhcmVzIHRoZVxuJworICAgICAgICAgICAgJ2lkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxuJworICAgICAgICAgICAgJ3JlcHJlc2VudGluZyBpdHMgaWRlbnRpdHkuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgJworICAgICAgICAgICAgJ21lbW9yeVxuJworICAgICAgICAgICAgJ2FkZHJlc3Mgd2hlcmUgIngiIGlzIHN0b3JlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICJBbiBvYmplY3QncyB0eXBlIGRldGVybWluZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0ICIKKyAgICAgICAgICAgICdzdXBwb3J0c1xuJworICAgICAgICAgICAgJyhlLmcuLCAiZG9lcyBpdCBoYXZlIGEgbGVuZ3RoPyIpIGFuZCBhbHNvIGRlZmluZXMgdGhlIHBvc3NpYmxlICcKKyAgICAgICAgICAgICd2YWx1ZXNcbicKKyAgICAgICAgICAgICdmb3Igb2JqZWN0cyBvZiB0aGF0IHR5cGUuICBUaGUgInR5cGUoKSIgZnVuY3Rpb24gcmV0dXJucyBhbiAnCisgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICd0eXBlICh3aGljaCBpcyBhbiBvYmplY3QgaXRzZWxmKS4gIExpa2UgaXRzIGlkZW50aXR5LCBhbiAnCisgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICcqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXVxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1RoZSAqdmFsdWUqIG9mIHNvbWUgb2JqZWN0cyBjYW4gY2hhbmdlLiAgT2JqZWN0cyB3aG9zZSB2YWx1ZSBjYW5cbicKKyAgICAgICAgICAgICdjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzICcKKyAgICAgICAgICAgICd1bmNoYW5nZWFibGVcbicKKyAgICAgICAgICAgICdvbmNlIHRoZXkgYXJlIGNyZWF0ZWQgYXJlIGNhbGxlZCAqaW1tdXRhYmxlKi4gKFRoZSB2YWx1ZSBvZiBhblxuJworICAgICAgICAgICAgJ2ltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSAnCisgICAgICAgICAgICAnbXV0YWJsZVxuJworICAgICAgICAgICAgIm9iamVjdCBjYW4gY2hhbmdlIHdoZW4gdGhlIGxhdHRlcidzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXIgIgorICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ2NvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiAnCisgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICdvYmplY3RzIGl0IGNvbnRhaW5zIGNhbm5vdCBiZSBjaGFuZ2VkLiAgU28sIGltbXV0YWJpbGl0eSBpcyBub3RcbicKKyAgICAgICAgICAgICdzdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlICcKKyAgICAgICAgICAgICdzdWJ0bGUuKVxuJworICAgICAgICAgICAgIkFuIG9iamVjdCdzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLFxuIgorICAgICAgICAgICAgJ251bWJlcnMsIHN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlLCB3aGlsZSBkaWN0aW9uYXJpZXMgJworICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgJ2xpc3RzIGFyZSBtdXRhYmxlLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ09iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgJworICAgICAgICAgICAgJ2JlY29tZVxuJworICAgICAgICAgICAgJ3VucmVhY2hhYmxlIHRoZXkgbWF5IGJlIGdhcmJhZ2UtY29sbGVjdGVkLiAgQW4gaW1wbGVtZW50YXRpb24gaXNcbicKKyAgICAgICAgICAgICdhbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tICcKKyAgICAgICAgICAgICdpdCBpc1xuJworICAgICAgICAgICAgJ2EgbWF0dGVyIG9mIGltcGxlbWVudGF0aW9uIHF1YWxpdHkgaG93IGdhcmJhZ2UgY29sbGVjdGlvbiBpc1xuJworICAgICAgICAgICAgJ2ltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxuJworICAgICAgICAgICAgJ3JlYWNoYWJsZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSAnCisgICAgICAgICAgICAncmVmZXJlbmNlLVxuJworICAgICAgICAgICAgJ2NvdW50aW5nIHNjaGVtZSB3aXRoIChvcHRpb25hbCkgZGVsYXllZCBkZXRlY3Rpb24gb2YgY3ljbGljYWxseSAnCisgICAgICAgICAgICAnbGlua2VkXG4nCisgICAgICAgICAgICAnZ2FyYmFnZSwgd2hpY2ggY29sbGVjdHMgbW9zdCBvYmplY3RzIGFzIHNvb24gYXMgdGhleSBiZWNvbWVcbicKKyAgICAgICAgICAgICd1bnJlYWNoYWJsZSwgYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNvbGxlY3QgZ2FyYmFnZSBjb250YWluaW5nXG4nCisgICAgICAgICAgICAnY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImdjIiBtb2R1bGUgJworICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgJ2luZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBjb2xsZWN0aW9uIG9mIGN5Y2xpYyBnYXJiYWdlLiAnCisgICAgICAgICAgICAnT3RoZXJcbicKKyAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbnMgYWN0IGRpZmZlcmVudGx5IGFuZCBDUHl0aG9uIG1heSBjaGFuZ2UuIERvIG5vdCAnCisgICAgICAgICAgICAnZGVwZW5kXG4nCisgICAgICAgICAgICAnb24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgJworICAgICAgICAgICAgJyhzb1xuJworICAgICAgICAgICAgJ3lvdSBzaG91bGQgYWx3YXlzIGNsb3NlIGZpbGVzIGV4cGxpY2l0bHkpLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIk5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbidzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG4iCisgICAgICAgICAgICAnZmFjaWxpdGllcyBtYXkga2VlcCBvYmplY3RzIGFsaXZlIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgJworICAgICAgICAgICAgJ2NvbGxlY3RhYmxlLlxuJworICAgICAgICAgICAgJ0Fsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCcidHJ5Ii4uLiJleGNlcHQiXCdcbicKKyAgICAgICAgICAgICdzdGF0ZW1lbnQgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdTb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgJworICAgICAgICAgICAgJ29wZW5cbicKKyAgICAgICAgICAgICdmaWxlcyBvciB3aW5kb3dzLiAgSXQgaXMgdW5kZXJzdG9vZCB0aGF0IHRoZXNlIHJlc291cmNlcyBhcmUgJworICAgICAgICAgICAgJ2ZyZWVkXG4nCisgICAgICAgICAgICAnd2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSAnCisgICAgICAgICAgICAnY29sbGVjdGlvbiBpc1xuJworICAgICAgICAgICAgJ25vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCAnCisgICAgICAgICAgICAnd2F5IHRvXG4nCisgICAgICAgICAgICAncmVsZWFzZSB0aGUgZXh0ZXJuYWwgcmVzb3VyY2UsIHVzdWFsbHkgYSAiY2xvc2UoKSIgbWV0aG9kLiAnCisgICAgICAgICAgICAnUHJvZ3JhbXNcbicKKyAgICAgICAgICAgICdhcmUgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gZXhwbGljaXRseSBjbG9zZSBzdWNoIG9iamVjdHMuICBUaGVcbicKKyAgICAgICAgICAgICdcJyJ0cnkiLi4uImZpbmFsbHkiXCcgc3RhdGVtZW50IGFuZCB0aGUgXCcid2l0aCJcJyBzdGF0ZW1lbnQgJworICAgICAgICAgICAgJ3Byb3ZpZGVcbicKKyAgICAgICAgICAgICdjb252ZW5pZW50IHdheXMgdG8gZG8gdGhpcy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdTb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSAnCisgICAgICAgICAgICAnY2FsbGVkXG4nCisgICAgICAgICAgICAnKmNvbnRhaW5lcnMqLiBFeGFtcGxlcyBvZiBjb250YWluZXJzIGFyZSB0dXBsZXMsIGxpc3RzIGFuZFxuJworICAgICAgICAgICAgImRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyJ3MgdmFsdWUuICAiCisgICAgICAgICAgICAnSW5cbicKKyAgICAgICAgICAgICdtb3N0IGNhc2VzLCB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyLCB3ZSBpbXBseSAnCisgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAndmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCAnCisgICAgICAgICAgICAnd2hlbiB3ZVxuJworICAgICAgICAgICAgJ3RhbGsgYWJvdXQgdGhlIG11dGFiaWxpdHkgb2YgYSBjb250YWluZXIsIG9ubHkgdGhlIGlkZW50aXRpZXMgb2YgJworICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ2ltbWVkaWF0ZWx5IGNvbnRhaW5lZCBvYmplY3RzIGFyZSBpbXBsaWVkLiAgU28sIGlmIGFuIGltbXV0YWJsZVxuJworICAgICAgICAgICAgJ2NvbnRhaW5lciAobGlrZSBhIHR1cGxlKSBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhIG11dGFibGUgJworICAgICAgICAgICAgJ29iamVjdCwgaXRzXG4nCisgICAgICAgICAgICAndmFsdWUgY2hhbmdlcyBpZiB0aGF0IG11dGFibGUgb2JqZWN0IGlzIGNoYW5nZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuJworICAgICAgICAgICAgJ2ltcG9ydGFuY2Ugb2Ygb2JqZWN0IGlkZW50aXR5IGlzIGFmZmVjdGVkIGluIHNvbWUgc2Vuc2U6IGZvciAnCisgICAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgICAndHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG4nCisgICAgICAgICAgICAncmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgJworICAgICAgICAgICAgJ3doaWxlXG4nCisgICAgICAgICAgICAnZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgImEgPSAxOyBiID0gJworICAgICAgICAgICAgJzEiLFxuJworICAgICAgICAgICAgJyJhIiBhbmQgImIiIG1heSBvciBtYXkgbm90IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCB3aXRoIHRoZSAnCisgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICdvbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCBhZnRlciAiYyA9IFtdOyBkID0gW10iLCAnCisgICAgICAgICAgICAnImMiXG4nCisgICAgICAgICAgICAnYW5kICJkIiBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5XG4nCisgICAgICAgICAgICAnY3JlYXRlZCBlbXB0eSBsaXN0cy4gKE5vdGUgdGhhdCAiYyA9IGQgPSBbXSIgYXNzaWducyB0aGUgc2FtZSAnCisgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAndG8gYm90aCAiYyIgYW5kICJkIi4pXG4nLAorICdvcGVyYXRvci1zdW1tYXJ5JzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ09wZXJhdG9yIHByZWNlZGVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdpbiBQeXRob24sIGZyb21cbicKKyAgICAgICAgICAgICAgICAgICAgICdsb3dlc3QgcHJlY2VkZW5jZSAobGVhc3QgYmluZGluZykgdG8gaGlnaGVzdCBwcmVjZWRlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICcobW9zdFxuJworICAgICAgICAgICAgICAgICAgICAgJ2JpbmRpbmcpLiAgT3BlcmF0b3JzIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICdwcmVjZWRlbmNlLiAgVW5sZXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gICcKKyAgICAgICAgICAgICAgICAgICAgICdPcGVyYXRvcnMgaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciAnCisgICAgICAgICAgICAgICAgICAgICAnZXhwb25lbnRpYXRpb24sIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAgICAnZ3JvdXBzIGZyb20gcmlnaHQgdG8gbGVmdCkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0IGNvbXBhcmlzb25zLCBtZW1iZXJzaGlwIHRlc3RzLCBhbmQgaWRlbnRpdHkgJworICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzLCBhbGwgaGF2ZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGhhdmUgYSBsZWZ0LXRvLXJpZ2h0IGNoYWluaW5nICcKKyAgICAgICAgICAgICAgICAgICAgICdmZWF0dXJlIGFzXG4nCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpYmVkIGluIHRoZSBDb21wYXJpc29ucyBzZWN0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8IE9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0Rlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJsYW1iZGEiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0xhbWJkYSBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJpZiIgLS0gImVsc2UiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0NvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJvciIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0Jvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJhbmQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0Jvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJub3QiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0Jvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJpbiIsICJub3QgaW4iLCAiaXMiLCAiaXMgbm90IiwgIjwiLCAiPD0iLCAiPiIsIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0NvbXBhcmlzb25zLCBpbmNsdWRpbmcgbWVtYmVyc2hpcCAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIj49IiwgIiE9IiwgIj09IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAndGVzdHMgYW5kIGlkZW50aXR5IHRlc3RzICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQml0d2lzZSBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIl4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIiYiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIjw8IiwgIj4+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnU2hpZnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIisiLCAiLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnTXVsdGlwbGljYXRpb24sIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdkaXZpc2lvbiwgcmVtYWluZGVyIFs1XSAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiK3giLCAiLXgiLCAifngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdQb3NpdGl2ZSwgbmVnYXRpdmUsIGJpdHdpc2UgTk9UICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiKioiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdFeHBvbmVudGlhdGlvbiBbNl0gICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiYXdhaXQiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdBd2FpdCBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAieFtpbmRleF0iLCAieFtpbmRleDppbmRleF0iLCAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdTdWJzY3JpcHRpb24sIHNsaWNpbmcsIGNhbGwsICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJ4KGFyZ3VtZW50cy4uLikiLCAieC5hdHRyaWJ1dGUiICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIoZXhwcmVzc2lvbnMuLi4pIiwgIltleHByZXNzaW9ucy4uLl0iLCAie2tleTogIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgbGlzdCAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgdmFsdWUuLi59IiwgIntleHByZXNzaW9ucy4uLn0iICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSwgZGljdGlvbmFyeSBkaXNwbGF5LCBzZXQgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdkaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzFdIFdoaWxlICJhYnMoeCV5KSA8IGFicyh5KSIgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciBmbG9hdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaXQgbWF5IG5vdCBiZSB0cnVlIG51bWVyaWNhbGx5IGR1ZSB0byByb3VuZG9mZi4gIEZvciAnCisgICAgICAgICAgICAgICAgICAgICAnZXhhbXBsZSwgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGFzc3VtaW5nIGEgcGxhdGZvcm0gb24gd2hpY2ggYSBQeXRob24gZmxvYXQgaXMgYW4gJworICAgICAgICAgICAgICAgICAgICAgJ0lFRUUgNzU0IGRvdWJsZS1cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCAiLTFlLTEwMCAlIDFlMTAwIiAnCisgICAgICAgICAgICAgICAgICAgICAnaGF2ZSB0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBzaWduIGFzICIxZTEwMCIsIHRoZSBjb21wdXRlZCByZXN1bHQgaXMgIi0xZS0xMDAgKyAnCisgICAgICAgICAgICAgICAgICAgICAnMWUxMDAiLCB3aGljaFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpcyBudW1lcmljYWxseSBleGFjdGx5IGVxdWFsIHRvICIxZTEwMCIuICBUaGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICJtYXRoLmZtb2QoKSIgcmV0dXJucyBhIHJlc3VsdCB3aG9zZSBzaWduIG1hdGNoZXMgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzaWduIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBmaXJzdCBhcmd1bWVudCBpbnN0ZWFkLCBhbmQgc28gcmV0dXJucyAiLTFlLTEwMCIgaW4gJworICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgY2FzZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgV2hpY2ggYXBwcm9hY2ggaXMgbW9yZSBhcHByb3ByaWF0ZSBkZXBlbmRzIG9uIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzJdIElmIHggaXMgdmVyeSBjbG9zZSB0byBhbiBleGFjdCBpbnRlZ2VyIG11bHRpcGxlIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICJ5LCBpdCdzXG4iCisgICAgICAgICAgICAgICAgICAgICAnICAgIHBvc3NpYmxlIGZvciAieC8veSIgdG8gYmUgb25lIGxhcmdlciB0aGFuICcKKyAgICAgICAgICAgICAgICAgICAgICciKHgteCV5KS8veSIgZHVlIHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHJvdW5kaW5nLiAgSW4gc3VjaCBjYXNlcywgUHl0aG9uIHJldHVybnMgdGhlIGxhdHRlciAnCisgICAgICAgICAgICAgICAgICAgICAncmVzdWx0LCBpblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0ICJkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeSIgJworICAgICAgICAgICAgICAgICAgICAgJ2JlIHZlcnkgY2xvc2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgdG8gIngiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1szXSBUaGUgVW5pY29kZSBzdGFuZGFyZCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gKmNvZGUgJworICAgICAgICAgICAgICAgICAgICAgJ3BvaW50cyogKGUuZy5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVSswMDQxKSBhbmQgKmFic3RyYWN0IGNoYXJhY3RlcnMqIChlLmcuICJMQVRJTiAnCisgICAgICAgICAgICAgICAgICAgICAnQ0FQSVRBTCBMRVRURVIgQSIpLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBXaGlsZSBtb3N0IGFic3RyYWN0IGNoYXJhY3RlcnMgaW4gVW5pY29kZSBhcmUgb25seSAnCisgICAgICAgICAgICAgICAgICAgICAncmVwcmVzZW50ZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgdXNpbmcgb25lIGNvZGUgcG9pbnQsIHRoZXJlIGlzIGEgbnVtYmVyIG9mIGFic3RyYWN0ICcKKyAgICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHRoYXQgY2FuIGluIGFkZGl0aW9uIGJlIHJlcHJlc2VudGVkIHVzaW5nIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ29mIG1vcmUgdGhhblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBvbmUgY29kZSBwb2ludC4gIEZvciBleGFtcGxlLCB0aGUgYWJzdHJhY3QgY2hhcmFjdGVyICcKKyAgICAgICAgICAgICAgICAgICAgICciTEFUSU5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEiIGNhbiBiZSByZXByZXNlbnRlZCBhcyAnCisgICAgICAgICAgICAgICAgICAgICAnYSBzaW5nbGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgKnByZWNvbXBvc2VkIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwQzcsIG9yICcKKyAgICAgICAgICAgICAgICAgICAgICdhcyBhIHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIG9mIGEgKmJhc2UgY2hhcmFjdGVyKiBhdCBjb2RlIHBvc2l0aW9uIFUrMDA0MyAoTEFUSU4gJworICAgICAgICAgICAgICAgICAgICAgJ0NBUElUQUxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgTEVUVEVSIEMpLCBmb2xsb3dlZCBieSBhICpjb21iaW5pbmcgY2hhcmFjdGVyKiBhdCAnCisgICAgICAgICAgICAgICAgICAgICAnY29kZSBwb3NpdGlvblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBVKzAzMjcgKENPTUJJTklORyBDRURJTExBKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIG9uIHN0cmluZ3MgY29tcGFyZSBhdCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2xldmVsIG9mXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFVuaWNvZGUgY29kZSBwb2ludHMuIFRoaXMgbWF5IGJlIGNvdW50ZXItaW50dWl0aXZlICcKKyAgICAgICAgICAgICAgICAgICAgICd0byBodW1hbnMuICBGb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgZXhhbXBsZSwgIiJcXHUwMEM3IiA9PSAiXFx1MDA0M1xcdTAzMjciIiBpcyAiRmFsc2UiLCAnCisgICAgICAgICAgICAgICAgICAgICAnZXZlbiB0aG91Z2ggYm90aFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBzdHJpbmdzIHJlcHJlc2VudCB0aGUgc2FtZSBhYnN0cmFjdCBjaGFyYWN0ZXIgIkxBVElOICcKKyAgICAgICAgICAgICAgICAgICAgICdDQVBJVEFMXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIExFVFRFUiBDIFdJVEggQ0VESUxMQSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFRvIGNvbXBhcmUgc3RyaW5ncyBhdCB0aGUgbGV2ZWwgb2YgYWJzdHJhY3QgJworICAgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgKHRoYXQgaXMsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGluIGEgd2F5IGludHVpdGl2ZSB0byBodW1hbnMpLCB1c2UgJworICAgICAgICAgICAgICAgICAgICAgJyJ1bmljb2RlZGF0YS5ub3JtYWxpemUoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzRdIER1ZSB0byBhdXRvbWF0aWMgZ2FyYmFnZS1jb2xsZWN0aW9uLCBmcmVlIGxpc3RzLCBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBkeW5hbWljIG5hdHVyZSBvZiBkZXNjcmlwdG9ycywgeW91IG1heSBub3RpY2UgJworICAgICAgICAgICAgICAgICAgICAgJ3NlZW1pbmdseSB1bnVzdWFsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGJlaGF2aW91ciBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlICJpcyIgb3BlcmF0b3IsIGxpa2UgJworICAgICAgICAgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGludm9sdmluZyBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yICcKKyAgICAgICAgICAgICAgICAgICAgICdjb25zdGFudHMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIENoZWNrIHRoZWlyIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbNV0gVGhlICIlIiBvcGVyYXRvciBpcyBhbHNvIHVzZWQgZm9yIHN0cmluZyBmb3JtYXR0aW5nOyAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1s2XSBUaGUgcG93ZXIgb3BlcmF0b3IgIioqIiBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBvciBiaXR3aXNlIHVuYXJ5IG9wZXJhdG9yIG9uIGl0cyByaWdodCwgdGhhdCBpcywgJworICAgICAgICAgICAgICAgICAgICAgJyIyKiotMSIgaXMgIjAuNSIuXG4nLAorICdwYXNzJzogJ1xuJworICAgICAgICAgJ1RoZSAicGFzcyIgc3RhdGVtZW50XG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBwYXNzX3N0bXQgOjo9ICJwYXNzIlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyJwYXNzIiBpcyBhIG51bGwgb3BlcmF0aW9uIC0tLSB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nICcKKyAgICAgICAgICdoYXBwZW5zLlxuJworICAgICAgICAgJ0l0IGlzIHVzZWZ1bCBhcyBhIHBsYWNlaG9sZGVyIHdoZW4gYSBzdGF0ZW1lbnQgaXMgcmVxdWlyZWRcbicKKyAgICAgICAgICdzeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgZGVmIGYoYXJnKTogcGFzcyAgICAjIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdGhpbmcgKHlldClcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBjbGFzcyBDOiBwYXNzICAgICAgICMgYSBjbGFzcyB3aXRoIG5vIG1ldGhvZHMgKHlldClcbicsCisgJ3Bvd2VyJzogJ1xuJworICAgICAgICAgICdUaGUgcG93ZXIgb3BlcmF0b3JcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0c1xuJworICAgICAgICAgICdsZWZ0OyBpdCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiB1bmFyeSBvcGVyYXRvcnMgb24gaXRzIHJpZ2h0LiAgJworICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAnc3ludGF4IGlzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgcG93ZXIgOjo9ICggYXdhaXRfZXhwciB8IHByaW1hcnkgKSBbIioqIiB1X2V4cHJdXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaHVzLCBpbiBhbiB1bnBhcmVudGhlc2l6ZWQgc2VxdWVuY2Ugb2YgcG93ZXIgYW5kIHVuYXJ5IG9wZXJhdG9ycywgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnb3BlcmF0b3JzIGFyZSBldmFsdWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0ICh0aGlzIGRvZXMgbm90ICcKKyAgICAgICAgICAnY29uc3RyYWluXG4nCisgICAgICAgICAgJ3RoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiAiLTEqKjIiIHJlc3VsdHMgaW4gIi0xIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSBwb3dlciBvcGVyYXRvciBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBidWlsdC1pbiAicG93KCkiXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCAnCisgICAgICAgICAgJ2FyZ3VtZW50XG4nCisgICAgICAgICAgJ3JhaXNlZCB0byB0aGUgcG93ZXIgb2YgaXRzIHJpZ2h0IGFyZ3VtZW50LiAgVGhlIG51bWVyaWMgYXJndW1lbnRzICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ2ZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCBhbmQgdGhlIHJlc3VsdCBpcyBvZiB0aGF0IHR5cGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdGb3IgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyAnCisgICAgICAgICAgJ3VubGVzc1xuJworICAgICAgICAgICd0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5lZ2F0aXZlOyBpbiB0aGF0IGNhc2UsIGFsbCBhcmd1bWVudHMgYXJlXG4nCisgICAgICAgICAgJ2NvbnZlcnRlZCB0byBmbG9hdCBhbmQgYSBmbG9hdCByZXN1bHQgaXMgZGVsaXZlcmVkLiBGb3IgZXhhbXBsZSxcbicKKyAgICAgICAgICAnIjEwKioyIiByZXR1cm5zICIxMDAiLCBidXQgIjEwKiotMiIgcmV0dXJucyAiMC4wMSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdSYWlzaW5nICIwLjAiIHRvIGEgbmVnYXRpdmUgcG93ZXIgcmVzdWx0cyBpbiBhICcKKyAgICAgICAgICAnIlplcm9EaXZpc2lvbkVycm9yIi5cbicKKyAgICAgICAgICAnUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXIgcmVzdWx0cyBpbiBhICcKKyAgICAgICAgICAnImNvbXBsZXgiXG4nCisgICAgICAgICAgJ251bWJlci4gKEluIGVhcmxpZXIgdmVyc2lvbnMgaXQgcmFpc2VkIGEgIlZhbHVlRXJyb3IiLilcbicsCisgJ3JhaXNlJzogJ1xuJworICAgICAgICAgICdUaGUgInJhaXNlIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICByYWlzZV9zdG10IDo6PSAicmFpc2UiIFtleHByZXNzaW9uIFsiZnJvbSIgZXhwcmVzc2lvbl1dXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBubyBleHByZXNzaW9ucyBhcmUgcHJlc2VudCwgInJhaXNlIiByZS1yYWlzZXMgdGhlIGxhc3QgJworICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAndGhhdCB3YXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IHNjb3BlLiAgSWYgbm8gZXhjZXB0aW9uIGlzIGFjdGl2ZSAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJ3RoZSBjdXJyZW50IHNjb3BlLCBhICJSdW50aW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5kaWNhdGluZ1xuJworICAgICAgICAgICd0aGF0IHRoaXMgaXMgYW4gZXJyb3IuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdPdGhlcndpc2UsICJyYWlzZSIgZXZhbHVhdGVzIHRoZSBmaXJzdCBleHByZXNzaW9uIGFzIHRoZSBleGNlcHRpb25cbicKKyAgICAgICAgICAnb2JqZWN0LiAgSXQgbXVzdCBiZSBlaXRoZXIgYSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZlxuJworICAgICAgICAgICciQmFzZUV4Y2VwdGlvbiIuIElmIGl0IGlzIGEgY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2Ugd2lsbCBiZVxuJworICAgICAgICAgICdvYnRhaW5lZCB3aGVuIG5lZWRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyB3aXRoIG5vIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIlRoZSAqdHlwZSogb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGUgZXhjZXB0aW9uIGluc3RhbmNlJ3MgY2xhc3MsIHRoZVxuIgorICAgICAgICAgICcqdmFsdWUqIGlzIHRoZSBpbnN0YW5jZSBpdHNlbGYuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIHRyYWNlYmFjayBvYmplY3QgaXMgbm9ybWFsbHkgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gJworICAgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgICAnaXMgcmFpc2VkIGFuZCBhdHRhY2hlZCB0byBpdCBhcyB0aGUgIl9fdHJhY2ViYWNrX18iIGF0dHJpYnV0ZSwgJworICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICdpcyB3cml0YWJsZS4gWW91IGNhbiBjcmVhdGUgYW4gZXhjZXB0aW9uIGFuZCBzZXQgeW91ciBvd24gdHJhY2ViYWNrICcKKyAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAnb25lIHN0ZXAgdXNpbmcgdGhlICJ3aXRoX3RyYWNlYmFjaygpIiBleGNlcHRpb24gbWV0aG9kICh3aGljaCAnCisgICAgICAgICAgJ3JldHVybnNcbicKKyAgICAgICAgICAndGhlIHNhbWUgZXhjZXB0aW9uIGluc3RhbmNlLCB3aXRoIGl0cyB0cmFjZWJhY2sgc2V0IHRvIGl0cyAnCisgICAgICAgICAgJ2FyZ3VtZW50KSxcbicKKyAgICAgICAgICAnbGlrZSBzbzpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHJhaXNlIEV4Y2VwdGlvbigiZm9vIG9jY3VycmVkIikud2l0aF90cmFjZWJhY2sodHJhY2ViYWNrb2JqKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlICJmcm9tIiBjbGF1c2UgaXMgdXNlZCBmb3IgZXhjZXB0aW9uIGNoYWluaW5nOiBpZiBnaXZlbiwgdGhlICcKKyAgICAgICAgICAnc2Vjb25kXG4nCisgICAgICAgICAgJypleHByZXNzaW9uKiBtdXN0IGJlIGFub3RoZXIgZXhjZXB0aW9uIGNsYXNzIG9yIGluc3RhbmNlLCB3aGljaCAnCisgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAndGhlbiBiZSBhdHRhY2hlZCB0byB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBhcyB0aGUgIl9fY2F1c2VfXyIgJworICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAnKHdoaWNoIGlzIHdyaXRhYmxlKS4gIElmIHRoZSByYWlzZWQgZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkLCBib3RoXG4nCisgICAgICAgICAgJ2V4Y2VwdGlvbnMgd2lsbCBiZSBwcmludGVkOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgPj4+IHRyeTpcbicKKyAgICAgICAgICAnICAgLi4uICAgICBwcmludCgxIC8gMClcbicKKyAgICAgICAgICAnICAgLi4uIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOlxuJworICAgICAgICAgICcgICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpIGZyb20gZXhjXG4nCisgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVGhlIGFib3ZlIGV4Y2VwdGlvbiB3YXMgdGhlIGRpcmVjdCBjYXVzZSBvZiB0aGUgZm9sbG93aW5nICcKKyAgICAgICAgICAnZXhjZXB0aW9uOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgJyAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZFxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBzaW1pbGFyIG1lY2hhbmlzbSB3b3JrcyBpbXBsaWNpdGx5IGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgJworICAgICAgICAgICdpbnNpZGVcbicKKyAgICAgICAgICAnYW4gZXhjZXB0aW9uIGhhbmRsZXIgb3IgYSAiZmluYWxseSIgY2xhdXNlOiB0aGUgcHJldmlvdXMgZXhjZXB0aW9uICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAndGhlbiBhdHRhY2hlZCBhcyB0aGUgbmV3IGV4Y2VwdGlvblwncyAiX19jb250ZXh0X18iIGF0dHJpYnV0ZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgID4+PiB0cnk6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4nCisgICAgICAgICAgJyAgIC4uLiBleGNlcHQ6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIilcbicKKyAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuJworICAgICAgICAgICcgICBaZXJvRGl2aXNpb25FcnJvcjogaW50IGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBEdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgYW5vdGhlciBleGNlcHRpb24gJworICAgICAgICAgICdvY2N1cnJlZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuJworICAgICAgICAgICcgICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuJworICAgICAgICAgICdFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaGFuZGxpbmcgZXhjZXB0aW9ucyBpcyBpbiAnCisgICAgICAgICAgJ3NlY3Rpb25cbicKKyAgICAgICAgICAnVGhlIHRyeSBzdGF0ZW1lbnQuXG4nLAorICdyZXR1cm4nOiAnXG4nCisgICAgICAgICAgICdUaGUgInJldHVybiIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIHJldHVybl9zdG10IDo6PSAicmV0dXJuIiBbZXhwcmVzc2lvbl9saXN0XVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcicmV0dXJuIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAgJ2RlZmluaXRpb24sXG4nCisgICAgICAgICAgICdub3Qgd2l0aGluIGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24uXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgIk5vbmUiIGlzXG4nCisgICAgICAgICAgICdzdWJzdGl0dXRlZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnInJldHVybiIgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgZXhwcmVzc2lvbiBsaXN0ICcKKyAgICAgICAgICAgJyhvclxuJworICAgICAgICAgICAnIk5vbmUiKSBhcyByZXR1cm4gdmFsdWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gInJldHVybiIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAnCisgICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAgJ2NsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2Z1bmN0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJbiBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlICJyZXR1cm4iIHN0YXRlbWVudCBpbmRpY2F0ZXMgdGhhdCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ2dlbmVyYXRvciBpcyBkb25lIGFuZCB3aWxsIGNhdXNlICJTdG9wSXRlcmF0aW9uIiB0byBiZSByYWlzZWQuICcKKyAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAncmV0dXJuZWQgdmFsdWUgKGlmIGFueSkgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCB0byBjb25zdHJ1Y3RcbicKKyAgICAgICAgICAgJyJTdG9wSXRlcmF0aW9uIiBhbmQgYmVjb21lcyB0aGUgIlN0b3BJdGVyYXRpb24udmFsdWUiIGF0dHJpYnV0ZS5cbicsCisgJ3NlcXVlbmNlLXR5cGVzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgJworICAgICAgICAgICAgICAgICAgICdjb250YWluZXIgb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgICAnQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSAnCisgICAgICAgICAgICAgICAgICAgJ29yIG1hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgJyhsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgJworICAgICAgICAgICAgICAgICAgICd3ZWxsLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2ZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgJ29yIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJ2VtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICdhbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gJworICAgICAgICAgICAgICAgICAgICdrIDwgTiIgd2hlcmVcbicKKyAgICAgICAgICAgICAgICAgICAnKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaCAnCisgICAgICAgICAgICAgICAgICAgJ2RlZmluZSBhXG4nCisgICAgICAgICAgICAgICAgICAgJ3JhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnbWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAnCisgICAgICAgICAgICAgICAgICAgJyJjbGVhcigpIixcbicKKyAgICAgICAgICAgICAgICAgICAnInNldGRlZmF1bHQoKSIsICJwb3AoKSIsICJwb3BpdGVtKCkiLCAiY29weSgpIiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICAnInVwZGF0ZSgpIlxuJworICAgICAgICAgICAgICAgICAgICJiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob24ncyBzdGFuZGFyZCBkaWN0aW9uYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgICAnVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiAnCisgICAgICAgICAgICAgICAgICAgJ2Fic3RyYWN0IGJhc2VcbicKKyAgICAgICAgICAgICAgICAgICAnY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJfX3NldGl0ZW1fXygpIiwgIl9fZGVsaXRlbV9fKCkiLCBhbmQgImtleXMoKSIuIE11dGFibGUgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgJworICAgICAgICAgICAgICAgICAgICciZXh0ZW5kKCkiLFxuJworICAgICAgICAgICAgICAgICAgICciaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsICcKKyAgICAgICAgICAgICAgICAgICAnbGlrZSBQeXRob25cbicKKyAgICAgICAgICAgICAgICAgICAnc3RhbmRhcmQgbGlzdCBvYmplY3RzLiAgRmluYWxseSwgc2VxdWVuY2UgdHlwZXMgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAgJ2FkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJyhtZWFuaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJ3JlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAnCisgICAgICAgICAgICAgICAgICAgJyJfX3JhZGRfXygpIixcbicKKyAgICAgICAgICAgICAgICAgICAnIl9faWFkZF9fKCkiLCAiX19tdWxfXygpIiwgIl9fcm11bF9fKCkiIGFuZCAiX19pbXVsX18oKSIgJworICAgICAgICAgICAgICAgICAgICdkZXNjcmliZWRcbicKKyAgICAgICAgICAgICAgICAgICAnYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gICcKKyAgICAgICAgICAgICAgICAgICAnSXQgaXNcbicKKyAgICAgICAgICAgICAgICAgICAncmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50ICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyJfX2NvbnRhaW5zX18oKSIgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlICJpbiIgJworICAgICAgICAgICAgICAgICAgICdvcGVyYXRvcjtcbicKKyAgICAgICAgICAgICAgICAgICAnZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2VzLCBpdFxuJworICAgICAgICAgICAgICAgICAgICdzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgJworICAgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZCB0aGF0IGJvdGhcbicKKyAgICAgICAgICAgICAgICAgICAnbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlICJfX2l0ZXJfXygpIiBtZXRob2QgJworICAgICAgICAgICAgICAgICAgICd0byBhbGxvd1xuJworICAgICAgICAgICAgICAgICAgICdlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAnCisgICAgICAgICAgICAgICAgICAgJyJfX2l0ZXJfXygpIlxuJworICAgICAgICAgICAgICAgICAgICdzaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ2l0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgICAndGhyb3VnaCB0aGUgdmFsdWVzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICAnCisgICAgICAgICAgICAgICAgICAgJ1Nob3VsZCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGxlbmd0aCBvZiB0aGUgb2JqZWN0LCBhbiBpbnRlZ2VyICI+PSIgMC4gIEFsc28sIGFuICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgJworICAgICAgICAgICAgICAgICAgICciX19sZW5fXygpIiBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgICAnY29udGV4dC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmxlbmd0aF9oaW50KCkiLiBTaG91bGQgJworICAgICAgICAgICAgICAgICAgICdyZXR1cm4gYW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgJworICAgICAgICAgICAgICAgICAgICdvciBsZXNzIHRoYW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iICcKKyAgICAgICAgICAgICAgICAgICAnMC4gVGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgcHVyZWx5IGFuIG9wdGltaXphdGlvbiBhbmQgaXMgbmV2ZXIgcmVxdWlyZWQgJworICAgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29ycmVjdG5lc3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdOb3RlOiBTbGljaW5nIGlzIGRvbmUgZXhjbHVzaXZlbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRocmVlICcKKyAgICAgICAgICAgICAgICAgICAnbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgICAnICBBIGNhbGwgbGlrZVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICBhWzE6Ml0gPSBiXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgIGlzIHRyYW5zbGF0ZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gJworICAgICAgICAgICAgICAgICAgICd3aXRoICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgInNlbGZba2V5XSIuIEZvciAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHR5cGVzLFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cy4gIE5vdGUgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdjbGFzcyB3aXNoZXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIiBtZXRob2QuIElmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgICAncmFpc2VkOyBpZiBvZlxuJworICAgICAgICAgICAgICAgICAgICcgICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICcoYWZ0ZXIgYW55XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgdmFsdWVzKSwgJworICAgICAgICAgICAgICAgICAgICciSW5kZXhFcnJvciIgc2hvdWxkIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiZm9yIiBsb29wcyBleHBlY3QgdGhhdCBhbiAiSW5kZXhFcnJvciIgd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICAgJ3JhaXNlZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kICcKKyAgICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19taXNzaW5nX18oc2VsZiwga2V5KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICcKKyAgICAgICAgICAgICAgICAgICAnInNlbGZba2V5XSIgZm9yIGRpY3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgJworICAgICAgICAgICAgICAgICAgICdub3RlIGFzIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciAnCisgICAgICAgICAgICAgICAgICAgJ2lmIG5ldyBrZXlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgJworICAgICAgICAgICAgICAgICAgICdyZXBsYWNlZC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgJworICAgICAgICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyAnCisgICAgICAgICAgICAgICAgICAgJ2lmIGVsZW1lbnRzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyAnCisgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l0ZXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAnYSBjb250YWluZXIuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgJworICAgICAgICAgICAgICAgICAgICdjYW4gaXRlcmF0ZVxuJworICAgICAgICAgICAgICAgICAgICcgICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCAnCisgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZFxuJworICAgICAgICAgICAgICAgICAgICcgICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgJworICAgICAgICAgICAgICAgICAgICd0aGV5IGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICByZXF1aXJlZCB0byByZXR1cm4gdGhlbXNlbHZlcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uICcKKyAgICAgICAgICAgICAgICAgICAnaXRlcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0cywgc2VlIEl0ZXJhdG9yIFR5cGVzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvICcKKyAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gJworICAgICAgICAgICAgICAgICAgICdyZXZlcnNlIG9yZGVyLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnInJldmVyc2VkKCkiXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAnCisgICAgICAgICAgICAgICAgICAgJygiX19sZW5fXygpIlxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHByb3RvY29sXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGUgYW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgJworICAgICAgICAgICAgICAgICAgICdwcm92aWRlZCBieVxuJworICAgICAgICAgICAgICAgICAgICcgICAicmV2ZXJzZWQoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSAnCisgICAgICAgICAgICAgICAgICAgJ25vcm1hbGx5XG4nCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lclxuJworICAgICAgICAgICAgICAgICAgICdvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgJworICAgICAgICAgICAgICAgICAgICdtb3JlIGVmZmljaWVudFxuJworICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgJworICAgICAgICAgICAgICAgICAgICdhIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIHRydWVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgJworICAgICAgICAgICAgICAgICAgICdvYmplY3RzLCB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ21lbWJlcnNoaXAgdGVzdFxuJworICAgICAgICAgICAgICAgICAgICcgICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSB0aGlzICcKKyAgICAgICAgICAgICAgICAgICAnc2VjdGlvbiBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLlxuJywKKyAnc2hpZnRpbmcnOiAnXG4nCisgICAgICAgICAgICAgJ1NoaWZ0aW5nIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHNoaWZ0aW5nIG9wZXJhdGlvbnMgaGF2ZSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgJ29wZXJhdGlvbnM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzaGlmdF9leHByIDo6PSBhX2V4cHIgfCBzaGlmdF9leHByICggIjw8IiB8ICI+PiIgKSBhX2V4cHJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXNlIG9wZXJhdG9ycyBhY2NlcHQgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhleSBzaGlmdCB0aGUgJworICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICdhcmd1bWVudCB0byB0aGUgbGVmdCBvciByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gYnkgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnc2Vjb25kIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSByaWdodCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIGZsb29yIGRpdmlzaW9uIGJ5ICcKKyAgICAgICAgICAgICAnInBvdygyLG4pIi5cbicKKyAgICAgICAgICAgICAnQSBsZWZ0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgbXVsdGlwbGljYXRpb24gd2l0aCAnCisgICAgICAgICAgICAgJyJwb3coMixuKSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlOiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpc1xuJworICAgICAgICAgICAgICcgIHJlcXVpcmVkIHRvIGJlIGF0IG1vc3QgInN5cy5tYXhzaXplIi4gIElmIHRoZSByaWdodC1oYW5kICcKKyAgICAgICAgICAgICAnb3BlcmFuZCBpc1xuJworICAgICAgICAgICAgICcgIGxhcmdlciB0aGFuICJzeXMubWF4c2l6ZSIgYW4gIk92ZXJmbG93RXJyb3IiIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICAgJ3JhaXNlZC5cbicsCisgJ3NsaWNpbmdzJzogJ1xuJworICAgICAgICAgICAgICdTbGljaW5nc1xuJworICAgICAgICAgICAgICcqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBzbGljaW5nIHNlbGVjdHMgYSByYW5nZSBvZiBpdGVtcyBpbiBhIHNlcXVlbmNlIG9iamVjdCAoZS5nLiwgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJ3N0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciAnCisgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgJ3RhcmdldHMgaW4gYXNzaWdubWVudCBvciAiZGVsIiBzdGF0ZW1lbnRzLiAgVGhlIHN5bnRheCBmb3IgYSAnCisgICAgICAgICAgICAgJ3NsaWNpbmc6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzbGljaW5nICAgICAgOjo9IHByaW1hcnkgIlsiIHNsaWNlX2xpc3QgIl0iXG4nCisgICAgICAgICAgICAgJyAgIHNsaWNlX2xpc3QgICA6Oj0gc2xpY2VfaXRlbSAoIiwiIHNsaWNlX2l0ZW0pKiBbIiwiXVxuJworICAgICAgICAgICAgICcgICBzbGljZV9pdGVtICAgOjo9IGV4cHJlc3Npb24gfCBwcm9wZXJfc2xpY2VcbicKKyAgICAgICAgICAgICAnICAgcHJvcGVyX3NsaWNlIDo6PSBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdIFsgIjoiICcKKyAgICAgICAgICAgICAnW3N0cmlkZV0gXVxuJworICAgICAgICAgICAgICcgICBsb3dlcl9ib3VuZCAgOjo9IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnICAgdXBwZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJyAgIHN0cmlkZSAgICAgICA6Oj0gZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlcmUgaXMgYW1iaWd1aXR5IGluIHRoZSBmb3JtYWwgc3ludGF4IGhlcmU6IGFueXRoaW5nIHRoYXQgJworICAgICAgICAgICAgICdsb29rcyBsaWtlXG4nCisgICAgICAgICAgICAgJ2FuIGV4cHJlc3Npb24gbGlzdCBhbHNvIGxvb2tzIGxpa2UgYSBzbGljZSBsaXN0LCBzbyBhbnkgJworICAgICAgICAgICAgICdzdWJzY3JpcHRpb25cbicKKyAgICAgICAgICAgICAnY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2xpY2luZy4gIFJhdGhlciB0aGFuIGZ1cnRoZXIgJworICAgICAgICAgICAgICdjb21wbGljYXRpbmcgdGhlXG4nCisgICAgICAgICAgICAgJ3N5bnRheCwgdGhpcyBpcyBkaXNhbWJpZ3VhdGVkIGJ5IGRlZmluaW5nIHRoYXQgaW4gdGhpcyBjYXNlIHRoZVxuJworICAgICAgICAgICAgICdpbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZVxuJworICAgICAgICAgICAgICdpbnRlcnByZXRhdGlvbiBhcyBhIHNsaWNpbmcgKHRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIHNsaWNlIGxpc3RcbicKKyAgICAgICAgICAgICAnY29udGFpbnMgbm8gcHJvcGVyIHNsaWNlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBzZW1hbnRpY3MgZm9yIGEgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5IGlzICcKKyAgICAgICAgICAgICAnaW5kZXhlZFxuJworICAgICAgICAgICAgICcodXNpbmcgdGhlIHNhbWUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZCBhcyBub3JtYWwgc3Vic2NyaXB0aW9uKSAnCisgICAgICAgICAgICAgJ3dpdGggYVxuJworICAgICAgICAgICAgICdrZXkgdGhhdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlICcKKyAgICAgICAgICAgICAnc2xpY2VcbicKKyAgICAgICAgICAgICAnbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgY29tbWEsIHRoZSBrZXkgaXMgYSB0dXBsZSBjb250YWluaW5nICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2NvbnZlcnNpb24gb2YgdGhlIHNsaWNlIGl0ZW1zOyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgJ2xvbmVcbicKKyAgICAgICAgICAgICAnc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzIHRoYXQgZXhwcmVzc2lvbi4gIFRoZSBjb252ZXJzaW9uIG9mIGEgcHJvcGVyIHNsaWNlICcKKyAgICAgICAgICAgICAnaXMgYVxuJworICAgICAgICAgICAgICdzbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSkgd2hvc2UgJworICAgICAgICAgICAgICcic3RhcnQiLFxuJworICAgICAgICAgICAgICcic3RvcCIgYW5kICJzdGVwIiBhdHRyaWJ1dGVzIGFyZSB0aGUgdmFsdWVzIG9mIHRoZSBleHByZXNzaW9ucyAnCisgICAgICAgICAgICAgJ2dpdmVuXG4nCisgICAgICAgICAgICAgJ2FzIGxvd2VyIGJvdW5kLCB1cHBlciBib3VuZCBhbmQgc3RyaWRlLCByZXNwZWN0aXZlbHksICcKKyAgICAgICAgICAgICAnc3Vic3RpdHV0aW5nXG4nCisgICAgICAgICAgICAgJyJOb25lIiBmb3IgbWlzc2luZyBleHByZXNzaW9ucy5cbicsCisgJ3NwZWNpYWxhdHRycyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ1NwZWNpYWwgQXR0cmlidXRlc1xuJworICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgJworICAgICAgICAgICAgICAgICAndG8gc2V2ZXJhbFxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlICcKKyAgICAgICAgICAgICAgICAgJ25vdCByZXBvcnRlZFxuJworICAgICAgICAgICAgICAgICAnYnkgdGhlICJkaXIoKSIgYnVpbHQtaW4gZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RpY3RfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiAnCisgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAnICAgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZS5fX2NsYXNzX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlIGNsYXNzIHRvIHdoaWNoIGEgY2xhc3MgaW5zdGFuY2UgYmVsb25ncy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MuX19iYXNlc19fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fbmFtZV9fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX3F1YWxuYW1lX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlICpxdWFsaWZpZWQgbmFtZSogb2YgdGhlIGNsYXNzIG9yIHR5cGUuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MuX19tcm9fX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIGF0dHJpYnV0ZSBpcyBhIHR1cGxlIG9mIGNsYXNzZXMgdGhhdCBhcmUgY29uc2lkZXJlZCAnCisgICAgICAgICAgICAgICAgICd3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICBsb29raW5nIGZvciBiYXNlIGNsYXNzZXMgZHVyaW5nIG1ldGhvZCByZXNvbHV0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5tcm8oKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIG1ldGFjbGFzcyB0byBjdXN0b21pemUgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciBmb3IgaXRzIGluc3RhbmNlcy4gIEl0IGlzIGNhbGxlZCAnCisgICAgICAgICAgICAgICAgICdhdCBjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFudGlhdGlvbiwgYW5kIGl0cyByZXN1bHQgaXMgc3RvcmVkIGluICJfX21yb19fIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MuX19zdWJjbGFzc2VzX18oKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBFYWNoIGNsYXNzIGtlZXBzIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzICcKKyAgICAgICAgICAgICAgICAgJ2ltbWVkaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgc3ViY2xhc3Nlcy4gIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIGFsbCB0aG9zZSAnCisgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VzXG4nCisgICAgICAgICAgICAgICAgICcgICBzdGlsbCBhbGl2ZS4gRXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgPj4+IGludC5fX3N1YmNsYXNzZXNfXygpXG4nCisgICAgICAgICAgICAgICAgICIgICAgICBbPGNsYXNzICdib29sJz5dXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdbMV0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzcGVjaWFsIG1ldGhvZHMgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgJ2ZvdW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgaW4gdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsIChCYXNpYyBjdXN0b21pemF0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnWzJdIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBsaXN0ICJbMSwgMl0iIGlzIGNvbnNpZGVyZWQgZXF1YWwgJworICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgJyAgICAiWzEuMCwgMi4wXSIsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiWzNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuJ3QgdGVsbCB0aGUgdHlwZSBvZiAiCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICBvcGVyYW5kcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnWzRdIENhc2VkIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSAnCisgICAgICAgICAgICAgICAgICdwcm9wZXJ0eVxuJworICAgICAgICAgICAgICAgICAnICAgIGJlaW5nIG9uZSBvZiAiTHUiIChMZXR0ZXIsIHVwcGVyY2FzZSksICJMbCIgKExldHRlciwgJworICAgICAgICAgICAgICAgICAnbG93ZXJjYXNlKSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICBvciAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1s1XSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYVxuJworICAgICAgICAgICAgICAgICAnICAgIHNpbmdsZXRvbiB0dXBsZSB3aG9zZSBvbmx5IGVsZW1lbnQgaXMgdGhlIHR1cGxlIHRvIGJlICcKKyAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZC5cbicsCisgJ3NwZWNpYWxuYW1lcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ1NwZWNpYWwgbWV0aG9kIG5hbWVzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBIGNsYXNzIGNhbiBpbXBsZW1lbnQgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgJworICAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAnc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgJ3NsaWNpbmcpIGJ5XG4nCisgICAgICAgICAgICAgICAgICJkZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob24ncyAiCisgICAgICAgICAgICAgICAgICdhcHByb2FjaCB0b1xuJworICAgICAgICAgICAgICAgICAnKm9wZXJhdG9yIG92ZXJsb2FkaW5nKiwgYWxsb3dpbmcgY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duICcKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yXG4nCisgICAgICAgICAgICAgICAgICd3aXRoIHJlc3BlY3QgdG8gbGFuZ3VhZ2Ugb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRlZmluZXNcbicKKyAgICAgICAgICAgICAgICAgJ2EgbWV0aG9kIG5hbWVkICJfX2dldGl0ZW1fXygpIiwgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiAnCisgICAgICAgICAgICAgICAgICd0aGlzIGNsYXNzLFxuJworICAgICAgICAgICAgICAgICAndGhlbiAieFtpXSIgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvICJ0eXBlKHgpLl9fZ2V0aXRlbV9fKHgsICcKKyAgICAgICAgICAgICAgICAgJ2kpIi5cbicKKyAgICAgICAgICAgICAgICAgJ0V4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlIGFuXG4nCisgICAgICAgICAgICAgICAgICdleGNlcHRpb24gd2hlbiBubyBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZGVmaW5lZCAodHlwaWNhbGx5XG4nCisgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiIG9yICJUeXBlRXJyb3IiKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCAnCisgICAgICAgICAgICAgICAgICdpdCBpc1xuJworICAgICAgICAgICAgICAgICAnaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICdkZWdyZWUgdGhhdCBpdFxuJworICAgICAgICAgICAgICAgICAnbWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgJworICAgICAgICAgICAgICAgICAnc29tZVxuJworICAgICAgICAgICAgICAgICAnc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCAnCisgICAgICAgICAgICAgICAgICdlbGVtZW50cywgYnV0XG4nCisgICAgICAgICAgICAgICAgICdleHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgJworICAgICAgICAgICAgICAgICAnaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICciTm9kZUxpc3QiIGludGVyZmFjZSBpbiB0aGUgVzNDXCdzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQmFzaWMgY3VzdG9taXphdGlvblxuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgJworICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIgaXMgYVxuJworICAgICAgICAgICAgICAgICAnICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCAnCisgICAgICAgICAgICAgICAgICdhcyBzdWNoKVxuJworICAgICAgICAgICAgICAgICAnICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCAnCisgICAgICAgICAgICAgICAgICdhcyBpdHNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCAnCisgICAgICAgICAgICAgICAgICd0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgJworICAgICAgICAgICAgICAgICAnVGhlIHJldHVyblxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJyh1c3VhbGx5IGFuXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSBvZiAqY2xzKikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3MgYnlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuJworICAgICAgICAgICAgICAgICAnICAgInN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoICcKKyAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgICAgICcgICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgIl9fbmV3X18oKSIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgJworICAgICAgICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gJworICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiAnCisgICAgICAgICAgICAgICAgICd0aGUgbmV3XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mICcKKyAgICAgICAgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICAgICAgICAnICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnY3JlYXRpb24uICBJdFxuJworICAgICAgICAgICAgICAgICAnICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiAnCisgICAgICAgICAgICAgICAgICdvcmRlciB0b1xuJworICAgICAgICAgICAgICAgICAnICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgJworICAgICAgICAgICAgICAgICAnIl9fbmV3X18oKSIpLCBidXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgJworICAgICAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBoYXMgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzICJfX2luaXRfXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QsIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgJworICAgICAgICAgICAgICAgICAnaW5pdGlhbGl6YXRpb24gb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICJCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluICcKKyAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvICcKKyAgICAgICAgICAgICAgICAgJ2N1c3RvbWlzZVxuJworICAgICAgICAgICAgICAgICAnICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAiX19pbml0X18oKSI7ICcKKyAgICAgICAgICAgICAgICAgJ2RvaW5nIHNvXG4nCisgICAgICAgICAgICAgICAgICcgICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzICcKKyAgICAgICAgICAgICAgICAgJ2lzIGFsc29cbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlcml2ZWQgY2xhc3NcJ3MgIl9fZGVsX18oKSIgbWV0aG9kLCBpZiBhbnksIG11c3QgJworICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSBjYWxsIGl0XG4nCisgICAgICAgICAgICAgICAgICcgICB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgIl9fZGVsX18oKSIgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBieVxuJworICAgICAgICAgICAgICAgICAnICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0ICcKKyAgICAgICAgICAgICAgICAgJ2EgbGF0ZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICdndWFyYW50ZWVkIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsICcKKyAgICAgICAgICAgICAgICAgJ2V4aXN0IHdoZW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBmb3JtZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2xhdHRlciBpc1xuJworICAgICAgICAgICAgICAgICAnICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IlwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgJworICAgICAgICAgICAgICAgICAnU29tZSBjb21tb25cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0IGZyb21cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0cyAoZS5nLixcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggJworICAgICAgICAgICAgICAgICAncGFyZW50IGFuZFxuJworICAgICAgICAgICAgICAgICAnICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrICcKKyAgICAgICAgICAgICAgICAgJ2ZyYW1lIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrICcKKyAgICAgICAgICAgICAgICAgJ3N0b3JlZCBpblxuJworICAgICAgICAgICAgICAgICAnICAgICAic3lzLmV4Y19pbmZvKClbMl0iIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yIGEgJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuICcKKyAgICAgICAgICAgICAgICAgJ3VuaGFuZGxlZFxuJworICAgICAgICAgICAgICAgICAnICAgICBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5sYXN0X3RyYWNlYmFjayIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSAnCisgICAgICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICAgICAnICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyAnCisgICAgICAgICAgICAgICAgICd0aGUgY3ljbGVzO1xuJworICAgICAgICAgICAgICAgICAnICAgICB0aGUgc2Vjb25kIGNhbiBiZSByZXNvbHZlZCBieSBmcmVlaW5nIHRoZSByZWZlcmVuY2UgdG8gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRyYWNlYmFjayBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZnVsLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3RoaXJkIGNhblxuJworICAgICAgICAgICAgICAgICAnICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gJworICAgICAgICAgICAgICAgICAnQ2lyY3VsYXJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgYW5kIGNsZWFuZWQgJworICAgICAgICAgICAgICAgICAndXAgd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIGVuYWJsZWQgKGl0J3Mgb24gYnkgIgorICAgICAgICAgICAgICAgICAnZGVmYXVsdCkuIFJlZmVyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgJworICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYWJvdXQgdGhpcyB0b3BpYy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyICcKKyAgICAgICAgICAgICAgICAgJ2R1cmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCAnCisgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAnICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkICcKKyAgICAgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gJworICAgICAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJfX2RlbF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyAnCisgICAgICAgICAgICAgICAgICdvZiBiZWluZ1xuJworICAgICAgICAgICAgICAgICAnICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICAnCisgICAgICAgICAgICAgICAgICdGb3IgdGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSAnCisgICAgICAgICAgICAgICAgICdtaW5pbXVtIG5lZWRlZFxuJworICAgICAgICAgICAgICAgICAnICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uICcKKyAgICAgICAgICAgICAgICAgJzEuNSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSAnCisgICAgICAgICAgICAgICAgICdzaW5nbGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgJworICAgICAgICAgICAgICAgICAnZ2xvYmFscyBhcmVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsICcKKyAgICAgICAgICAgICAgICAgJ3RoaXMgbWF5XG4nCisgICAgICAgICAgICAgICAgICcgICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCAnCisgICAgICAgICAgICAgICAgICdhdmFpbGFibGUgYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgJworICAgICAgICAgICAgICAgICAnIm9mZmljaWFsIlxuJworICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgJworICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgJworICAgICAgICAgICAgICAgICAndXNlZCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuICcKKyAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Zvcm1cbicKKyAgICAgICAgICAgICAgICAgJyAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSAnCisgICAgICAgICAgICAgICAgICdyZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgJworICAgICAgICAgICAgICAgICAnIl9fcmVwcl9fKCkiIGJ1dFxuJworICAgICAgICAgICAgICAgICAnICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAnCisgICAgICAgICAgICAgICAgICciaW5mb3JtYWwiXG4nCisgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgJworICAgICAgICAgICAgICAgICAncmVxdWlyZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50ICcKKyAgICAgICAgICAgICAgICAgJ3RoYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc3RyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgJworICAgICAgICAgICAgICAgICAnImZvcm1hdCgpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgJworICAgICAgICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCAnCisgICAgICAgICAgICAgICAgICd0aGVyZSBpcyBub1xuJworICAgICAgICAgICAgICAgICAnICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gJworICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbjogYVxuJworICAgICAgICAgICAgICAgICAnICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgJworICAgICAgICAgICAgICAgICAnIm9iamVjdCJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2J5dGVzX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgJworICAgICAgICAgICAgICAgICAncmVwcmVzZW50YXRpb24gb2YgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24sIGFuZCBieSAnCisgICAgICAgICAgICAgICAgICdleHRlbnNpb24sXG4nCisgICAgICAgICAgICAgICAgICcgICBldmFsdWF0aW9uIG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICcic3RyLmZvcm1hdCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICcKKyAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHRoYXQgJworICAgICAgICAgICAgICAgICAnY29udGFpbnMgYVxuJworICAgICAgICAgICAgICAgICAnICAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBkZXNpcmVkLiBUaGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb25cbicKKyAgICAgICAgICAgICAgICAgJyAgIG9mIHRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIHVwIHRvIHRoZSB0eXBlICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGwgZWl0aGVyICcKKyAgICAgICAgICAgICAgICAgJ2RlbGVnYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhICcKKyAgICAgICAgICAgICAgICAgJ3NpbWlsYXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdHRpbmcgb3B0aW9uIHN5bnRheC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgU2VlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UgZm9yIGEgZGVzY3JpcHRpb24gJworICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBzdGFuZGFyZCBmb3JtYXR0aW5nIHN5bnRheC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNDogVGhlIF9fZm9ybWF0X18gbWV0aG9kIG9mICJvYmplY3QiICcKKyAgICAgICAgICAgICAgICAgJ2l0c2VsZlxuJworICAgICAgICAgICAgICAgICAnICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMuIFRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgJworICAgICAgICAgICAgICAgICAnaXMgYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAnCisgICAgICAgICAgICAgICAgICcieC5fX2xlX18oeSkiLFxuJworICAgICAgICAgICAgICAgICAnICAgIng9PXkiIGNhbGxzICJ4Ll9fZXFfXyh5KSIsICJ4IT15IiBjYWxscyAieC5fX25lX18oeSkiLCAnCisgICAgICAgICAgICAgICAgICcieD55IiBjYWxsc1xuJworICAgICAgICAgICAgICAgICAnICAgInguX19ndF9fKHkpIiwgYW5kICJ4Pj15IiBjYWxscyAieC5fX2dlX18oeSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICcKKyAgICAgICAgICAgICAgICAgJyJOb3RJbXBsZW1lbnRlZCJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIHBhaXIgJworICAgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgIkZhbHNlIiBhbmQgIlRydWUiIGFyZSByZXR1cm5lZCAnCisgICAgICAgICAgICAgICAgICdmb3IgYVxuJworICAgICAgICAgICAgICAgICAnICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gJworICAgICAgICAgICAgICAgICAnYW55IHZhbHVlLFxuJworICAgICAgICAgICAgICAgICAnICAgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhIEJvb2xlYW4gJworICAgICAgICAgICAgICAgICAnY29udGV4dCAoZS5nLixcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjb25kaXRpb24gb2YgYW4gImlmIiBzdGF0ZW1lbnQpLCBQeXRob24gd2lsbCBjYWxsICcKKyAgICAgICAgICAgICAgICAgJyJib29sKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciAnCisgICAgICAgICAgICAgICAgICdmYWxzZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQnkgZGVmYXVsdCwgIl9fbmVfXygpIiBkZWxlZ2F0ZXMgdG8gIl9fZXFfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAnaW52ZXJ0cyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlc3VsdCB1bmxlc3MgaXQgaXMgIk5vdEltcGxlbWVudGVkIi4gIFRoZXJlIGFyZSBubyBvdGhlciAnCisgICAgICAgICAgICAgICAgICdpbXBsaWVkXG4nCisgICAgICAgICAgICAgICAgICcgICByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycywgZm9yICcKKyAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgdHJ1dGggb2YgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gJworICAgICAgICAgICAgICAgICAnYXV0b21hdGljYWxseVxuJworICAgICAgICAgICAgICAgICAnICAgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3QgJworICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uLCBzZWVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFNlZSB0aGUgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgJworICAgICAgICAgICAgICAgICAnbm90ZXMgb25cbicKKyAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSAnCisgICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICcodG8gYmUgdXNlZFxuJworICAgICAgICAgICAgICAgICAnICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0ICcKKyAgICAgICAgICAgICAgICAgJ3RoZSByaWdodFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgIl9fbHRfXygpIiBhbmQgIl9fZ3RfXygpIiBhcmUgJworICAgICAgICAgICAgICAgICAiZWFjaCBvdGhlcidzXG4iCisgICAgICAgICAgICAgICAgICcgICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVyXCdzICcKKyAgICAgICAgICAgICAgICAgJ3JlZmxlY3Rpb24sXG4nCisgICAgICAgICAgICAgICAgICcgICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uICcKKyAgICAgICAgICAgICAgICAgJ0lmIHRoZVxuJworICAgICAgICAgICAgICAgICAiICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmQncyB0eXBlICIKKyAgICAgICAgICAgICAgICAgJ2lzIGFcbicKKyAgICAgICAgICAgICAgICAgIiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kJ3MgdHlwZSwgIgorICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICByZWZsZWN0ZWQgbWV0aG9kIG9mIHRoZSByaWdodCBvcGVyYW5kIGhhcyBwcmlvcml0eSwgJworICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlIHRoZVxuJworICAgICAgICAgICAgICAgICAiICAgbGVmdCBvcGVyYW5kJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgIgorICAgICAgICAgICAgICAgICAnaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19oYXNoX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyAnCisgICAgICAgICAgICAgICAgICdvbiBtZW1iZXJzXG4nCisgICAgICAgICAgICAgICAgICcgICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJkaWN0Ii5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seSByZXF1aXJlZCAnCisgICAgICAgICAgICAgICAgICdwcm9wZXJ0eVxuJworICAgICAgICAgICAgICAgICAnICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoICcKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlOyBpdCBpc1xuJworICAgICAgICAgICAgICAgICAnICAgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZyBleGNsdXNpdmUgb3IpICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBoYXNoXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdCBhbHNvIHBsYXkgYSAnCisgICAgICAgICAgICAgICAgICdwYXJ0IGluXG4nCisgICAgICAgICAgICAgICAgICcgICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiAnCisgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAnICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICcKKyAgICAgICAgICAgICAgICAgJyJQeV9zc2l6ZV90Ii4gIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAnCisgICAgICAgICAgICAgICAgICczMi1iaXRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCAnCisgICAgICAgICAgICAgICAgICdpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uICcKKyAgICAgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICAgICAnICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICcKKyAgICAgICAgICAgICAgICAgJyJweXRob24gLWNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgJyJfX2VxX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBhcyAnCisgICAgICAgICAgICAgICAgICdpdGVtcyBpblxuJworICAgICAgICAgICAgICAgICAnICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzICcKKyAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlICcKKyAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgICIgICByZXF1aXJlcyB0aGF0IGEga2V5J3MgaGFzaCB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSAiCisgICAgICAgICAgICAgICAgICJvYmplY3QncyBoYXNoXG4iCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgYnlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgJworICAgICAgICAgICAgICAgICAnd2l0aFxuJworICAgICAgICAgICAgICAgICAnICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgJworICAgICAgICAgICAgICAgICAndmFsdWUgc3VjaFxuJworICAgICAgICAgICAgICAgICAnICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gJworICAgICAgICAgICAgICAgICAnaGFzaCh5KSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBhbmQgZG9lcyBub3QgZGVmaW5lICcKKyAgICAgICAgICAgICAgICAgJyJfX2hhc2hfXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgJworICAgICAgICAgICAgICAgICAnV2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgIlR5cGVFcnJvciIgd2hlbiBhIHByb2dyYW0gJworICAgICAgICAgICAgICAgICAnYXR0ZW1wdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5ICcKKyAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosICcKKyAgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zLkhhc2hhYmxlKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyXG4nCisgICAgICAgICAgICAgICAgICcgICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID1cbicKKyAgICAgICAgICAgICAgICAgJyAgIDxQYXJlbnRDbGFzcz4uX19oYXNoX18iLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAnc3VwcHJlc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgJworICAgICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICdpZGVudGlmaWVkIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgJworICAgICAgICAgICAgICAgICAnY2FsbC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyAnCisgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlICcKKyAgICAgICAgICAgICAgICAgJ3JhbmRvbSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkICcKKyAgICAgICAgICAgICAgICAgJ2ludm9jYXRpb25zIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICAgIFB5dGhvbi5UaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgJworICAgICAgICAgICAgICAgICAnZGVuaWFsLVxuJworICAgICAgICAgICAgICAgICAnICAgICBvZi1zZXJ2aWNlIGNhdXNlZCBieSBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgJ2V4cGxvaXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpICcKKyAgICAgICAgICAgICAgICAgJ2NvbXBsZXhpdHkuXG4nCisgICAgICAgICAgICAgICAgICcgICAgIFNlZSBodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgJworICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSAnCisgICAgICAgICAgICAgICAgICdndWFyYW50ZWVzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdCB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gJworICAgICAgICAgICAgICAgICAnMzItYml0IGFuZFxuJworICAgICAgICAgICAgICAgICAnICAgICA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbyAiUFlUSE9OSEFTSFNFRUQiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSAnCisgICAgICAgICAgICAgICAgICdkZWZhdWx0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ib29sX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICAgICAgICcgICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyAnCisgICAgICAgICAgICAgICAgICdtZXRob2QgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAnb2JqZWN0IGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICdkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgICcgICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIsIGFsbCBpdHMgaW5zdGFuY2VzICcKKyAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0N1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgJworICAgICAgICAgICAgICAgICAnbWVhbmluZyBvZlxuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICcieC5uYW1lIikgZm9yXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyAnCisgICAgICAgICAgICAgICAgICdpdCBmb3VuZFxuJworICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIikuICAibmFtZSIgaXMgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICduYW1lLiBUaGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgJworICAgICAgICAgICAgICAgICAncmFpc2UgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgJworICAgICAgICAgICAgICAgICAnbWVjaGFuaXNtLFxuJworICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCAnCisgICAgICAgICAgICAgICAgICdhc3ltbWV0cnlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzICcKKyAgICAgICAgICAgICAgICAgJ2RvbmUgYm90aCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgIl9fZ2V0YXR0cl9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ3dvdWxkIGhhdmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlICcKKyAgICAgICAgICAgICAgICAgJ3RoYXQgYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCBjb250cm9sICcKKyAgICAgICAgICAgICAgICAgJ2J5IG5vdFxuJworICAgICAgICAgICAgICAgICAnICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5ICcKKyAgICAgICAgICAgICAgICAgJyhidXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSAnCisgICAgICAgICAgICAgICAgICdnZXQgdG90YWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgJworICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgJyJfX2dldGF0dHJfXygpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAiX19nZXRhdHRyaWJ1dGVfXygpIiAnCisgICAgICAgICAgICAgICAgICdlaXRoZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgJworICAgICAgICAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAnICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlICcKKyAgICAgICAgICAgICAgICAgJ3JlY3Vyc2lvbiBpblxuJworICAgICAgICAgICAgICAgICAnICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0ICcKKyAgICAgICAgICAgICAgICAgJ25lZWRzLCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgJworICAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAnICAgICBtZXRob2RzIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgJworICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2Ugc3ludGF4XG4nCisgICAgICAgICAgICAgICAgICcgICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlIFNwZWNpYWwgbWV0aG9kIGxvb2t1cC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzICcKKyAgICAgICAgICAgICAgICAgJ2lzIGNhbGxlZFxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgJworICAgICAgICAgICAgICAgICAnKnZhbHVlKiBpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSwgaXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciAnCisgICAgICAgICAgICAgICAgICdleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAnICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCAnCisgICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCAnCisgICAgICAgICAgICAgICAgICdvYmoubmFtZSIgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Rpcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAnbXVzdCBiZVxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgJworICAgICAgICAgICAgICAgICAnbGlzdCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNvcnRzIGl0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgJworICAgICAgICAgICAgICAgICAnYXBwZWFycyBpbiBhblxuJworICAgICAgICAgICAgICAgICAiKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyJ3MgIgorICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgJworICAgICAgICAgICAgICAgICAncGFyZW50cykuICBJbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2V4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnd2hvc2UgbmFtZSBpc1xuJworICAgICAgICAgICAgICAgICAndGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgIl9fZGljdF9fIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICcKKyAgICAgICAgICAgICAgICAgJyppbnN0YW5jZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yICcKKyAgICAgICAgICAgICAgICAgJyJOb25lIiB3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gJworICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIlxuJworICAgICAgICAgICAgICAgICAnICAgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBvd25lclxuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG93bmVyIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgJworICAgICAgICAgICAgICAgICAnbW9kdWxlIGFzXG4nCisgICAgICAgICAgICAgICAgICdzcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyAnCisgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2dpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSAnCisgICAgICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBmb3JcbicKKyAgICAgICAgICAgICAgICAgJ3VuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbnZva2luZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAnCisgICAgICAgICAgICAgICAgICciYmluZGluZ1xuJworICAgICAgICAgICAgICAgICAnYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgJ2luIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0LCBpdFxuJworICAgICAgICAgICAgICAgICAnaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciAnCisgICAgICAgICAgICAgICAgICdkZWxldGVcbicKKyAgICAgICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICIKKyAgICAgICAgICAgICAgICAgJyJhLngiIGhhcyBhXG4nCisgICAgICAgICAgICAgICAgICdsb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCAiYS5fX2RpY3RfX1tcJ3hcJ10iLCB0aGVuXG4nCisgICAgICAgICAgICAgICAgICcidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzZXMgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyJ0eXBlKGEpIiBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIGFuZFxuJworICAgICAgICAgICAgICAgICAnaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICdwcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJ2hvdyB0aGV5IHdlcmUgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsICcKKyAgICAgICAgICAgICAgICAgJyJhLngiLiBIb3dcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uICJhIjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGlyZWN0IENhbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgJworICAgICAgICAgICAgICAgICAnZGlyZWN0bHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luc3RhbmNlIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyB0cmFuc2Zvcm1lZCAnCisgICAgICAgICAgICAgICAgICdpbnRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbDogInR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDbGFzcyBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBiaW5kaW5nIHRvIGEgY2xhc3MsICJBLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NhbGw6XG4nCisgICAgICAgICAgICAgICAgICcgICAiQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1N1cGVyIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJhIiBpcyBhbiBpbnN0YW5jZSBvZiAic3VwZXIiLCB0aGVuIHRoZSBiaW5kaW5nICcKKyAgICAgICAgICAgICAgICAgJyJzdXBlcihCLFxuJworICAgICAgICAgICAgICAgICAnICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgYmFzZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyAiQSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGltbWVkaWF0ZWx5IHByZWNlZGluZyAiQiIgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY2FsbDogIkEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciAnCisgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9uIGRlcGVuZHNcbicKKyAgICAgICAgICAgICAgICAgJ29uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAnY2FuIGRlZmluZVxuJworICAgICAgICAgICAgICAgICAnYW55IGNvbWJpbmF0aW9uIG9mICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuJworICAgICAgICAgICAgICAgICAnZG9lcyBub3QgZGVmaW5lICJfX2dldF9fKCkiLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgJ3dpbGwgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICd0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICJvYmplY3Qnc1xuIgorICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgJworICAgICAgICAgICAgICAgICAnYW5kL29yXG4nCisgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgJworICAgICAgICAgICAgICAgICAnbmVpdGhlciwgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2Egbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSAnCisgICAgICAgICAgICAgICAgICdib3RoXG4nCisgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUgJworICAgICAgICAgICAgICAgICAnanVzdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSJcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuICBJblxuJworICAgICAgICAgICAgICAgICAnY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICciY2xhc3NtZXRob2QoKSIpIGFyZVxuJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzICcKKyAgICAgICAgICAgICAgICAgJ2NhblxuJworICAgICAgICAgICAgICAgICAncmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB0b1xuJworICAgICAgICAgICAgICAgICAnYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3NhbWUgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhICcKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICdBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSAnCisgICAgICAgICAgICAgICAgICdwcm9wZXJ0eS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdfX3Nsb3RzX19cbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICdzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3ICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuICcKKyAgICAgICAgICAgICAgICAgJ2NyZWF0aW5nIGxhcmdlXG4nCisgICAgICAgICAgICAgICAgICdudW1iZXJzIG9mIGluc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byAnCisgICAgICAgICAgICAgICAgICdob2xkIGFcbicKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qICcKKyAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAnY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsICcKKyAgICAgICAgICAgICAgICAgJ29yIHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yICcKKyAgICAgICAgICAgICAgICAgJ2VhY2hcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICd+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+flxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSAnCisgICAgICAgICAgICAgICAgICdhc3NpZ25lZCBuZXdcbicKKyAgICAgICAgICAgICAgICAgJyAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICAnCisgICAgICAgICAgICAgICAgICdBdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAnICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgJworICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIi4gSWZcbicKKyAgICAgICAgICAgICAgICAgJyAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbicKKyAgICAgICAgICAgICAgICAgJyAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCAnCisgICAgICAgICAgICAgICAgICdjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICcgIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbicKKyAgICAgICAgICAgICAgICAgJyAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICcgIGRlY2xhcmF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgJworICAgICAgICAgICAgICAgICAnY3JlYXRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVzY3JpcHRvcnMgKEltcGxlbWVudGluZyBEZXNjcmlwdG9ycykgZm9yIGVhY2ggdmFyaWFibGUgJworICAgICAgICAgICAgICAgICAnbmFtZS4gIEFzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICcKKyAgICAgICAgICAgICAgICAgJypfX2RpY3RfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSAnCisgICAgICAgICAgICAgICAgICdjb250YWluIG5hbWVzXG4nCisgICAgICAgICAgICAgICAgICcgIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyAnCisgICAgICAgICAgICAgICAgICdpbmFjY2Vzc2libGVcbicKKyAgICAgICAgICAgICAgICAgJyAgKGV4Y2VwdCBieSByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MpLlxuJworICAgICAgICAgICAgICAgICAnICBUaGlzIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Z1dHVyZSwgYVxuJworICAgICAgICAgICAgICAgICAnICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCAnCisgICAgICAgICAgICAgICAgICdmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgImludCIsICJieXRlcyIgJworICAgICAgICAgICAgICAgICAnYW5kICJ0dXBsZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiAnCisgICAgICAgICAgICAgICAgICdNYXBwaW5nc1xuJworICAgICAgICAgICAgICAgICAnICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgJworICAgICAgICAgICAgICAgICAnbWF5IGJlXG4nCisgICAgICAgICAgICAgICAgICcgIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAgJyAgKl9fc2xvdHNfXyouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQsIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nICJ0eXBlKCkiLiBUaGUgJworICAgICAgICAgICAgICAgICAnY2xhc3MgYm9keSBpc1xuJworICAgICAgICAgICAgICAgICAnZXhlY3V0ZWQgaW4gYSBuZXcgbmFtZXNwYWNlIGFuZCB0aGUgY2xhc3MgbmFtZSBpcyBib3VuZCAnCisgICAgICAgICAgICAgICAgICdsb2NhbGx5IHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAncmVzdWx0IG9mICJ0eXBlKG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGNsYXNzIGNyZWF0aW9uIHByb2Nlc3MgY2FuIGJlIGN1c3RvbWlzZWQgYnkgcGFzc2luZyB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJtZXRhY2xhc3MiIGtleXdvcmQgYXJndW1lbnQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gbGluZSwgJworICAgICAgICAgICAgICAgICAnb3IgYnlcbicKKyAgICAgICAgICAgICAgICAgJ2luaGVyaXRpbmcgZnJvbSBhbiBleGlzdGluZyBjbGFzcyB0aGF0IGluY2x1ZGVkIHN1Y2ggYW4gJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQuIEluXG4nCisgICAgICAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGJvdGggIk15Q2xhc3MiIGFuZCAiTXlTdWJjbGFzcyIgYXJlICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlc1xuJworICAgICAgICAgICAgICAgICAnb2YgIk1ldGEiOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBNZXRhKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTXlDbGFzcyhtZXRhY2xhc3M9TWV0YSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBNeVN1YmNsYXNzKE15Q2xhc3MpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICAgICAnYXJlIHBhc3NlZCB0aHJvdWdoIHRvIGFsbCBtZXRhY2xhc3Mgb3BlcmF0aW9ucyBkZXNjcmliZWQgJworICAgICAgICAgICAgICAgICAnYmVsb3cuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gYSBjbGFzcyBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLCB0aGUgZm9sbG93aW5nIHN0ZXBzICcKKyAgICAgICAgICAgICAgICAgJ29jY3VyOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBjbGFzcyBuYW1lc3BhY2UgaXMgcHJlcGFyZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBmb3IgYSBjbGFzcyBkZWZpbml0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAgJ2RldGVybWluZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogaWYgbm8gYmFzZXMgYW5kIG5vIGV4cGxpY2l0IG1ldGFjbGFzcyBhcmUgZ2l2ZW4sIHRoZW4gJworICAgICAgICAgICAgICAgICAnInR5cGUoKSIgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgdXNlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIGFuIGV4cGxpY2l0IG1ldGFjbGFzcyBpcyBnaXZlbiBhbmQgaXQgaXMgKm5vdCogYW4gJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2Ugb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgInR5cGUoKSIsIHRoZW4gaXQgaXMgdXNlZCBkaXJlY3RseSBhcyB0aGUgbWV0YWNsYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogaWYgYW4gaW5zdGFuY2Ugb2YgInR5cGUoKSIgaXMgZ2l2ZW4gYXMgdGhlIGV4cGxpY2l0ICcKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzcywgb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgYmFzZXMgYXJlIGRlZmluZWQsIHRoZW4gdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgJworICAgICAgICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBpcyBzZWxlY3RlZCBmcm9tIHRoZSBleHBsaWNpdGx5ICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZFxuJworICAgICAgICAgICAgICAgICAnbWV0YWNsYXNzIChpZiBhbnkpIGFuZCB0aGUgbWV0YWNsYXNzZXMgKGkuZS4gInR5cGUoY2xzKSIpIG9mICcKKyAgICAgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkIGJhc2UgY2xhc3Nlcy4gVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgb25lICcKKyAgICAgICAgICAgICAgICAgJ3doaWNoIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJ3N1YnR5cGUgb2YgKmFsbCogb2YgdGhlc2UgY2FuZGlkYXRlIG1ldGFjbGFzc2VzLiBJZiBub25lIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnY2FuZGlkYXRlIG1ldGFjbGFzc2VzIG1lZXRzIHRoYXQgY3JpdGVyaW9uLCB0aGVuIHRoZSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uXG4nCisgICAgICAgICAgICAgICAgICd3aWxsIGZhaWwgd2l0aCAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdQcmVwYXJpbmcgdGhlIGNsYXNzIG5hbWVzcGFjZVxuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnT25jZSB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGhhcyBiZWVuIGlkZW50aWZpZWQsIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UgaXMgcHJlcGFyZWQuIElmIHRoZSBtZXRhY2xhc3MgaGFzIGEgIl9fcHJlcGFyZV9fIiAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsXG4nCisgICAgICAgICAgICAgICAgICdpdCBpcyBjYWxsZWQgYXMgIm5hbWVzcGFjZSA9IG1ldGFjbGFzcy5fX3ByZXBhcmVfXyhuYW1lLCAnCisgICAgICAgICAgICAgICAgICdiYXNlcyxcbicKKyAgICAgICAgICAgICAgICAgJyoqa3dkcykiICh3aGVyZSB0aGUgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cywgaWYgYW55LCAnCisgICAgICAgICAgICAgICAgICdjb21lIGZyb21cbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzcyBkZWZpbml0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSWYgdGhlIG1ldGFjbGFzcyBoYXMgbm8gIl9fcHJlcGFyZV9fIiBhdHRyaWJ1dGUsIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UgaXMgaW5pdGlhbGlzZWQgYXMgYW4gZW1wdHkgImRpY3QoKSIgaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzMDAwXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEludHJvZHVjZWQgdGhlICJfX3ByZXBhcmVfXyIgbmFtZXNwYWNlIGhvb2tcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFeGVjdXRpbmcgdGhlIGNsYXNzIGJvZHlcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgY2xhc3MgYm9keSBpcyBleGVjdXRlZCAoYXBwcm94aW1hdGVseSkgYXMgImV4ZWMoYm9keSwgJworICAgICAgICAgICAgICAgICAnZ2xvYmFscygpLFxuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlKSIuIFRoZSBrZXkgZGlmZmVyZW5jZSBmcm9tIGEgbm9ybWFsIGNhbGwgdG8gJworICAgICAgICAgICAgICAgICAnImV4ZWMoKSIgaXMgdGhhdFxuJworICAgICAgICAgICAgICAgICAnbGV4aWNhbCBzY29waW5nIGFsbG93cyB0aGUgY2xhc3MgYm9keSAoaW5jbHVkaW5nIGFueSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzKSB0b1xuJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIG5hbWVzIGZyb20gdGhlIGN1cnJlbnQgYW5kIG91dGVyIHNjb3BlcyB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIGEgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hvd2V2ZXIsIGV2ZW4gd2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvY2N1cnMgaW5zaWRlIHRoZSAnCisgICAgICAgICAgICAgICAgICdmdW5jdGlvbixcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgZGVmaW5lZCBpbnNpZGUgdGhlIGNsYXNzIHN0aWxsIGNhbm5vdCBzZWUgbmFtZXMgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCBhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIHNjb3BlLiBDbGFzcyB2YXJpYWJsZXMgbXVzdCBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICAgICAncGFyYW1ldGVyIG9mIGluc3RhbmNlIG9yIGNsYXNzIG1ldGhvZHMsIGFuZCBjYW5ub3QgYmUgJworICAgICAgICAgICAgICAgICAnYWNjZXNzZWQgYXQgYWxsXG4nCisgICAgICAgICAgICAgICAgICdmcm9tIHN0YXRpYyBtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0NyZWF0aW5nIHRoZSBjbGFzcyBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnT25jZSB0aGUgY2xhc3MgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBleGVjdXRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdib2R5LCB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICcibWV0YWNsYXNzKG5hbWUsIGJhc2VzLFxuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlLCAqKmt3ZHMpIiAodGhlIGFkZGl0aW9uYWwga2V5d29yZHMgcGFzc2VkIGhlcmUgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICdhcyB0aG9zZSBwYXNzZWQgdG8gIl9fcHJlcGFyZV9fIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoaXMgY2xhc3Mgb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3plcm8tXG4nCisgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmb3JtIG9mICJzdXBlcigpIi4gIl9fY2xhc3NfXyIgaXMgYW4gaW1wbGljaXQgJworICAgICAgICAgICAgICAgICAnY2xvc3VyZVxuJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyIGlmIGFueSBtZXRob2RzIGluIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnYm9keSByZWZlclxuJworICAgICAgICAgICAgICAgICAndG8gZWl0aGVyICJfX2NsYXNzX18iIG9yICJzdXBlciIuIFRoaXMgYWxsb3dzIHRoZSB6ZXJvICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGZvcm1cbicKKyAgICAgICAgICAgICAgICAgJ29mICJzdXBlcigpIiB0byBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGNsYXNzIGJlaW5nIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAnYmFzZWQgb25cbicKKyAgICAgICAgICAgICAgICAgJ2xleGljYWwgc2NvcGluZywgd2hpbGUgdGhlIGNsYXNzIG9yIGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgJworICAgICAgICAgICAgICAgICAndG8gbWFrZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2N1cnJlbnQgY2FsbCBpcyBpZGVudGlmaWVkIGJhc2VkIG9uIHRoZSBmaXJzdCBhcmd1bWVudCAnCisgICAgICAgICAgICAgICAgICdwYXNzZWQgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICdtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FmdGVyIHRoZSBjbGFzcyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgaXMgcGFzc2VkIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnZGVjb3JhdG9ycyBpbmNsdWRlZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAoaWYgYW55KSBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Jlc3VsdGluZ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0IGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgdGhlIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAnY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gYSBuZXcgY2xhc3MgaXMgY3JlYXRlZCBieSAidHlwZS5fX25ld19fIiwgdGhlIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlZCBhc1xuJworICAgICAgICAgICAgICAgICAndGhlIG5hbWVzcGFjZSBwYXJhbWV0ZXIgaXMgY29waWVkIHRvIGEgc3RhbmRhcmQgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgYW5kXG4nCisgICAgICAgICAgICAgICAgICd0aGUgb3JpZ2luYWwgb2JqZWN0IGlzIGRpc2NhcmRlZC4gVGhlIG5ldyBjb3B5IGJlY29tZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJfX2RpY3RfXyJcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvZiB0aGUgY2xhc3Mgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzMTM1KiogLSBOZXcgc3VwZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRGVzY3JpYmVzIHRoZSBpbXBsaWNpdCAiX19jbGFzc19fIiBjbG9zdXJlIHJlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ01ldGFjbGFzcyBleGFtcGxlXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgJworICAgICAgICAgICAgICAgICAndGhhdCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICdiZWVuIGV4cGxvcmVkIGluY2x1ZGUgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCAnCisgICAgICAgICAgICAgICAgICdhdXRvbWF0aWNcbicKKyAgICAgICAgICAgICAgICAgJ2RlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgJworICAgICAgICAgICAgICAgICAnZnJhbWV3b3JrcywgYW5kXG4nCisgICAgICAgICAgICAgICAgICdhdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIG1ldGFjbGFzcyB0aGF0IHVzZXMgYW5cbicKKyAgICAgICAgICAgICAgICAgJyJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIgdG8gcmVtZW1iZXIgdGhlIG9yZGVyIHRoYXQgY2xhc3MgJworICAgICAgICAgICAgICAgICAndmFyaWFibGVzXG4nCisgICAgICAgICAgICAgICAgICdhcmUgZGVmaW5lZDpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgT3JkZXJlZENsYXNzKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgQGNsYXNzbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIF9fcHJlcGFyZV9fKG1ldGFjbHMsIG5hbWUsIGJhc2VzLCAqKmt3ZHMpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbnMuT3JkZXJlZERpY3QoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgbmFtZXNwYWNlLCAqKmt3ZHMpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXN1bHQgPSB0eXBlLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgJworICAgICAgICAgICAgICAgICAnZGljdChuYW1lc3BhY2UpKVxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgICByZXN1bHQubWVtYmVycyA9IHR1cGxlKG5hbWVzcGFjZSlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmV0dXJuIHJlc3VsdFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyBBKG1ldGFjbGFzcz1PcmRlcmVkQ2xhc3MpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBvbmUoc2VsZik6IHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBkZWYgdHdvKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIHRocmVlKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIGZvdXIoc2VsZik6IHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IEEubWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAiICAgKCdfX21vZHVsZV9fJywgJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yICpBKiBnZXRzIGV4ZWN1dGVkLCB0aGUgcHJvY2VzcyAnCisgICAgICAgICAgICAgICAgICdiZWdpbnNcbicKKyAgICAgICAgICAgICAgICAgJ3dpdGggY2FsbGluZyB0aGUgbWV0YWNsYXNzXCdzICJfX3ByZXBhcmVfXygpIiBtZXRob2Qgd2hpY2ggJworICAgICAgICAgICAgICAgICAncmV0dXJucyBhblxuJworICAgICAgICAgICAgICAgICAnZW1wdHkgImNvbGxlY3Rpb25zLk9yZGVyZWREaWN0Ii4gIFRoYXQgbWFwcGluZyByZWNvcmRzIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGFuZFxuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcyBvZiAqQSogYXMgdGhleSBhcmUgZGVmaW5lZCB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdzdGF0ZW1lbnQuIE9uY2UgdGhvc2UgZGVmaW5pdGlvbnMgYXJlIGV4ZWN1dGVkLCB0aGUgb3JkZXJlZCAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICdpcyBmdWxseSBwb3B1bGF0ZWQgYW5kIHRoZSBtZXRhY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kICcKKyAgICAgICAgICAgICAgICAgJ2dldHNcbicKKyAgICAgICAgICAgICAgICAgJ2ludm9rZWQuICBUaGF0IG1ldGhvZCBidWlsZHMgdGhlIG5ldyB0eXBlIGFuZCBpdCBzYXZlcyB0aGUgJworICAgICAgICAgICAgICAgICAnb3JkZXJlZFxuJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSBrZXlzIGluIGFuIGF0dHJpYnV0ZSBjYWxsZWQgIm1lbWJlcnMiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0N1c3RvbWl6aW5nIGluc3RhbmNlIGFuZCBzdWJjbGFzcyBjaGVja3NcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAnImlzaW5zdGFuY2UoKSIgYW5kICJpc3N1YmNsYXNzKCkiIGJ1aWx0LWluIGZ1bmN0aW9ucy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW4gcGFydGljdWxhciwgdGhlIG1ldGFjbGFzcyAiYWJjLkFCQ01ldGEiIGltcGxlbWVudHMgdGhlc2UgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBpblxuJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgJworICAgICAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAgICAgJyJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyAnCisgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAndHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0ICcKKyAgICAgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgICAgICcgICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAnICAgImlzaW5zdGFuY2UoaW5zdGFuY2UsIGNsYXNzKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCAnCisgICAgICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAiaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgYXJlIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICcobWV0YWNsYXNzKSBvZiBhXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy4gIFRoZXkgY2Fubm90IGJlIGRlZmluZWQgYXMgY2xhc3MgbWV0aG9kcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnYWN0dWFsIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAnVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdhcmUgY2FsbGVkXG4nCisgICAgICAgICAgICAgICAgICdvbiBpbnN0YW5jZXMsIG9ubHkgaW4gdGhpcyBjYXNlIHRoZSBpbnN0YW5jZSBpcyBpdHNlbGYgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyAnCisgICAgICAgICAgICAgICAgICciaXNpbnN0YW5jZSgpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgImlzc3ViY2xhc3MoKSIgYmVoYXZpb3IgdGhyb3VnaCAiX19pbnN0YW5jZWNoZWNrX18oKSIgJworICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX3N1YmNsYXNzY2hlY2tfXygpIiwgd2l0aCBtb3RpdmF0aW9uIGZvciB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uYWxpdHkgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSAnCisgICAgICAgICAgICAgICAgICciYWJjIlxuJworICAgICAgICAgICAgICAgICAnICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmICcKKyAgICAgICAgICAgICAgICAgJ3RoaXMgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLikiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ0NvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgJworICAgICAgICAgICAgICAgICAnb3IgbWFwcGluZ3NcbicKKyAgICAgICAgICAgICAgICAgJyhsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgJworICAgICAgICAgICAgICAgICAnd2VsbC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAnZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICdlbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICdhbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayAnCisgICAgICAgICAgICAgICAgICc8IE4iIHdoZXJlXG4nCisgICAgICAgICAgICAgICAgICcqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZSBhXG4nCisgICAgICAgICAgICAgICAgICdyYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlIHRoZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAnCisgICAgICAgICAgICAgICAgICciY2xlYXIoKSIsXG4nCisgICAgICAgICAgICAgICAgICcic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgJworICAgICAgICAgICAgICAgICAnInVwZGF0ZSgpIlxuJworICAgICAgICAgICAgICAgICAiYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSAiCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiAnCisgICAgICAgICAgICAgICAgICdhYnN0cmFjdCBiYXNlXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAnCisgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICciX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICAgICAnc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgJworICAgICAgICAgICAgICAgICAnImV4dGVuZCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgJworICAgICAgICAgICAgICAgICAnbGlrZSBQeXRob25cbicKKyAgICAgICAgICAgICAgICAgJ3N0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJ2FkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAnCisgICAgICAgICAgICAgICAgICcobWVhbmluZ1xuJworICAgICAgICAgICAgICAgICAncmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICcKKyAgICAgICAgICAgICAgICAgJyJfX3JhZGRfXygpIixcbicKKyAgICAgICAgICAgICAgICAgJyJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2Rlc2NyaWJlZFxuJworICAgICAgICAgICAgICAgICAnYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0ICcKKyAgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4nCisgICAgICAgICAgICAgICAgICciX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdG9yO1xuJworICAgICAgICAgICAgICAgICAnZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcywgaXRcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCAnCisgICAgICAgICAgICAgICAgICd0aGF0IGJvdGhcbicKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvICcKKyAgICAgICAgICAgICAgICAgJ2FsbG93XG4nCisgICAgICAgICAgICAgICAgICdlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAnCisgICAgICAgICAgICAgICAgICciX19pdGVyX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlIHZhbHVlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gICcKKyAgICAgICAgICAgICAgICAgJ1Nob3VsZCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgJworICAgICAgICAgICAgICAgICAnIl9fbGVuX18oKSIgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gJworICAgICAgICAgICAgICAgICAnY29udGV4dC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkICcKKyAgICAgICAgICAgICAgICAgJ3JldHVybiBhblxuJworICAgICAgICAgICAgICAgICAnICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgJworICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gJworICAgICAgICAgICAgICAgICAnVGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgY29ycmVjdG5lc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnICBBIGNhbGwgbGlrZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFbMToyXSA9IGJcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiAnCisgICAgICAgICAgICAgICAgICd3aXRoICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgJworICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgdHlwZXMsXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICAnCisgICAgICAgICAgICAgICAgICdOb3RlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyB3aXNoZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZC4gSWZcbicKKyAgICAgICAgICAgICAgICAgJyAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZDsgaWYgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICcoYWZ0ZXIgYW55XG4nCisgICAgICAgICAgICAgICAgICcgICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiAnCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAncmFpc2VkIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iICcKKyAgICAgICAgICAgICAgICAgJ2ZvciBkaWN0XG4nCisgICAgICAgICAgICAgICAgICcgICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSAnCisgICAgICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgJworICAgICAgICAgICAgICAgICAnbmV3IGtleXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgJworICAgICAgICAgICAgICAgICAncmVwbGFjZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSAnCisgICAgICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiAnCisgICAgICAgICAgICAgICAgICdlbGVtZW50c1xuJworICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZVxuJworICAgICAgICAgICAgICAgICAnICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pdGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgJworICAgICAgICAgICAgICAgICAnY29udGFpbmVyLlxuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gJworICAgICAgICAgICAgICAgICAnaXRlcmF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgJworICAgICAgICAgICAgICAgICAnc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5ICcKKyAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnCisgICAgICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0cywgc2VlIEl0ZXJhdG9yIFR5cGVzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciAnCisgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgJworICAgICAgICAgICAgICAgICAnInJldmVyc2VkKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgJworICAgICAgICAgICAgICAgICAnKCJfX2xlbl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICdwcm90b2NvbFxuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgJworICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lICcKKyAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICAicmV2ZXJzZWQoKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlICcKKyAgICAgICAgICAgICAgICAgJ25vcm1hbGx5XG4nCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgJworICAgICAgICAgICAgICAgICAnY29udGFpbmVyXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSAnCisgICAgICAgICAgICAgICAgICdlZmZpY2llbnRcbicKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICdyZXR1cm4gdHJ1ZVxuJworICAgICAgICAgICAgICAgICAnICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cywgdGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZSBrZXktaXRlbSBwYWlycy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZW1iZXJzaGlwIHRlc3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgJworICAgICAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgdGhpcyBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0VtdWxhdGluZyBudW1lcmljIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkICcKKyAgICAgICAgICAgICAgICAgJ2J5IHRoZVxuJworICAgICAgICAgICAgICAgICAncGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRpb25zIGZvclxuJworICAgICAgICAgICAgICAgICAnbm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKS4gIEZvciBpbnN0YW5jZSwgJworICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uICJ4ICsgeSIsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzICcKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSAiX19kaXZtb2RfXygpIiBtZXRob2Qgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IHRvICcKKyAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19mbG9vcmRpdl9fKCkiIGFuZCAiX19tb2RfXygpIjsgaXQgc2hvdWxkIG5vdCBiZSAnCisgICAgICAgICAgICAgICAgICdyZWxhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlIGRlZmluZWQgJworICAgICAgICAgICAgICAgICAndG8gYWNjZXB0XG4nCisgICAgICAgICAgICAgICAgICcgICBhbiBvcHRpb25hbCB0aGlyZCBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAnICAgInBvdygpIiBmdW5jdGlvbiBpcyB0byBiZSBzdXBwb3J0ZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuICJOb3RJbXBsZW1lbnRlZCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgJworICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgJworICAgICAgICAgICAgICAgICAnImRpdm1vZCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpIHdpdGggcmVmbGVjdGVkICcKKyAgICAgICAgICAgICAgICAgJyhzd2FwcGVkKVxuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0ICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhbmQgZG9lc1xuJworICAgICAgICAgICAgICAgICAnICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICAgICAgICAnYXJlIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IC1cbicKKyAgICAgICAgICAgICAgICAgJyAgIHkiLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiAnCisgICAgICAgICAgICAgICAgICciX19yc3ViX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiAnCisgICAgICAgICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgICAgICAgICcgICAqTm90SW1wbGVtZW50ZWQqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgdGVybmFyeSAicG93KCkiIHdpbGwgbm90IHRyeSBjYWxsaW5nICcKKyAgICAgICAgICAgICAgICAgJyJfX3Jwb3dfXygpIiAodGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmQncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgJ2xlZnRcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCAiCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICd0aGUgbGVmdFxuJworICAgICAgICAgICAgICAgICAiICAgICBvcGVyYW5kJ3Mgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyAiCisgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICIgICAgIHRvIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy5cbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgJworICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudHMgKCIrPSIsICItPSIsICIqPSIsICJAPSIsICIvPSIsICIvLz0iLCAiJT0iLCAnCisgICAgICAgICAgICAgICAgICciKio9IixcbicKKyAgICAgICAgICAgICAgICAgJyAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdhdHRlbXB0IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmQgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ3RoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgJyAgICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsICpzZWxmKikuICBJZiBhICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmljXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyAnCisgICAgICAgICAgICAgICAgICdiYWNrIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIGlmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICB3aXRoIGFuICJfX2lhZGRfXygpIiBtZXRob2QsICJ4ICs9IHkiIGlzIGVxdWl2YWxlbnQgdG8gInggJworICAgICAgICAgICAgICAgICAnPVxuJworICAgICAgICAgICAgICAgICAnICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAnCisgICAgICAgICAgICAgICAgICcieS5fX3JhZGRfXyh4KSIgYXJlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mICJ4ICsgeSIuIEluICcKKyAgICAgICAgICAgICAgICAgJ2NlcnRhaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHNpdHVhdGlvbnMsIGF1Z21lbnRlZCBhc3NpZ25tZW50IGNhbiByZXN1bHQgaW4gdW5leHBlY3RlZCAnCisgICAgICAgICAgICAgICAgICdlcnJvcnNcbicKKyAgICAgICAgICAgICAgICAgIiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbJ2l0ZW0nXSByYWlzZSBhbiBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAnd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFkZGl0aW9uIHdvcmtzPyksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiAnCisgICAgICAgICAgICAgICAgICd0aGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAnICAgbW9kZWwuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lZ19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3NfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYWJzX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludmVydF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAnCisgICAgICAgICAgICAgICAgICciKyIsXG4nCisgICAgICAgICAgICAgICAgICcgICAiYWJzKCkiIGFuZCAifiIpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb21wbGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9hdF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAnCisgICAgICAgICAgICAgICAgICciaW50KCkiLFxuJworICAgICAgICAgICAgICAgICAnICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICcgICB0eXBlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbmRleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgJworICAgICAgICAgICAgICAgICAnUHl0aG9uIG5lZWRzXG4nCisgICAgICAgICAgICAgICAgICcgICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgJworICAgICAgICAgICAgICAgICAnb2JqZWN0IChzdWNoXG4nCisgICAgICAgICAgICAgICAgICcgICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgJworICAgICAgICAgICAgICAgICAnIm9jdCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ251bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCAnCisgICAgICAgICAgICAgICAgICd3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSAnCisgICAgICAgICAgICAgICAgICdkZWZpbmVkLCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1dpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgdG9cbicKKyAgICAgICAgICAgICAgICAgJ2JlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgbWFuYWdlclxuJworICAgICAgICAgICAgICAgICAnaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkICcKKyAgICAgICAgICAgICAgICAgJ3J1bnRpbWUgY29udGV4dFxuJworICAgICAgICAgICAgICAgICAnZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAnaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nIHRoZWlyICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1R5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICdyZXN0b3JpbmcgdmFyaW91c1xuJworICAgICAgICAgICAgICAgICAna2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCAnCisgICAgICAgICAgICAgICAgICdjbG9zaW5nIG9wZW5lZFxuJworICAgICAgICAgICAgICAgICAnZmlsZXMsIGV0Yy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgJworICAgICAgICAgICAgICAgICAnTWFuYWdlciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAnCisgICAgICAgICAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgIiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2QncyByZXR1cm4gdmFsdWUgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgJ3RhcmdldChzKVxuJworICAgICAgICAgICAgICAgICAnICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAncGFyYW1ldGVyc1xuJworICAgICAgICAgICAgICAgICAnICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSAnCisgICAgICAgICAgICAgICAgICdleGl0ZWQuIElmIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgJworICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHdpbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGJlICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gJworICAgICAgICAgICAgICAgICAnc3VwcHJlc3MgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgJworICAgICAgICAgICAgICAgICAnc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICdwcm9jZXNzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSAnCisgICAgICAgICAgICAgICAgICdwYXNzZWQtaW5cbicKKyAgICAgICAgICAgICAgICAgIiAgIGV4Y2VwdGlvbjsgdGhpcyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvbiAid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NwZWNpYWwgbWV0aG9kIGxvb2t1cFxuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBjdXN0b20gY2xhc3NlcywgaW1wbGljaXQgaW52b2NhdGlvbnMgb2Ygc3BlY2lhbCBtZXRob2RzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBvbmx5XG4nCisgICAgICAgICAgICAgICAgICJndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN0J3MgdHlwZSwgIgorICAgICAgICAgICAgICAgICAnbm90IGluXG4nCisgICAgICAgICAgICAgICAgICJ0aGUgb2JqZWN0J3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSAiCisgICAgICAgICAgICAgICAgICdyZWFzb24gd2h5XG4nCisgICAgICAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIEM6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSBDKClcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjLl9fbGVuX18gPSBsYW1iZGE6IDVcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsZW4oYylcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIFR5cGVFcnJvcjogb2JqZWN0IG9mIHR5cGUgJ0MnIGhhcyBubyBsZW4oKVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2YgJworICAgICAgICAgICAgICAgICAnc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBzdWNoIGFzICJfX2hhc2hfXygpIiBhbmQgIl9fcmVwcl9fKCkiIHRoYXQgYXJlICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGJ5XG4nCisgICAgICAgICAgICAgICAgICdhbGwgb2JqZWN0cywgaW5jbHVkaW5nIHR5cGUgb2JqZWN0cy4gSWYgdGhlIGltcGxpY2l0IGxvb2t1cCAnCisgICAgICAgICAgICAgICAgICdvZiB0aGVzZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyB1c2VkIHRoZSBjb252ZW50aW9uYWwgbG9va3VwIHByb2Nlc3MsIHRoZXkgd291bGQgJworICAgICAgICAgICAgICAgICAnZmFpbCB3aGVuXG4nCisgICAgICAgICAgICAgICAgICdpbnZva2VkIG9uIHRoZSB0eXBlIG9iamVjdCBpdHNlbGY6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAxIC5fX2hhc2hfXygpID09IGhhc2goMSlcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBpbnQuX19oYXNoX18oKSA9PSBoYXNoKGludClcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIFR5cGVFcnJvcjogZGVzY3JpcHRvciAnX19oYXNoX18nIG9mICdpbnQnIG9iamVjdCBuZWVkcyBhbiAiCisgICAgICAgICAgICAgICAgICdhcmd1bWVudFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGluIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgIndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgJ21ldGFjbGFzcyBjb25mdXNpb24nLCBhbmQgIgorICAgICAgICAgICAgICAgICAnaXMgYXZvaWRlZFxuJworICAgICAgICAgICAgICAgICAnYnkgYnlwYXNzaW5nIHRoZSBpbnN0YW5jZSB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZSgxKS5fX2hhc2hfXygxKSA9PSBoYXNoKDEpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZShpbnQpLl9faGFzaF9fKGludCkgPT0gaGFzaChpbnQpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luIGFkZGl0aW9uIHRvIGJ5cGFzc2luZyBhbnkgaW5zdGFuY2UgYXR0cmlidXRlcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJlc3Qgb2ZcbicKKyAgICAgICAgICAgICAgICAgJ2NvcnJlY3RuZXNzLCBpbXBsaWNpdCBzcGVjaWFsIG1ldGhvZCBsb29rdXAgZ2VuZXJhbGx5IGFsc28gJworICAgICAgICAgICAgICAgICAnYnlwYXNzZXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzICcKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzczpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHByaW50KCJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHByaW50KCJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCIpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjID0gQygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5fX2xlbl9fKCkgICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAnICAgQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdHlwZShjKS5fX2xlbl9fKGMpICAgICAgICAgICMgRXhwbGljaXQgbG9va3VwIHZpYSAnCisgICAgICAgICAgICAgICAgICd0eXBlXG4nCisgICAgICAgICAgICAgICAgICcgICBNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIDEwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGVuKGMpICAgICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXQgbG9va3VwXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeXBhc3NpbmcgdGhlICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb24gJworICAgICAgICAgICAgICAgICAncHJvdmlkZXNcbicKKyAgICAgICAgICAgICAgICAgJ3NpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGUgJworICAgICAgICAgICAgICAgICAnaW50ZXJwcmV0ZXIsIGF0XG4nCisgICAgICAgICAgICAgICAgICd0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZiBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgKHRoZVxuJworICAgICAgICAgICAgICAgICAnc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0IGl0c2VsZiBpbiAnCisgICAgICAgICAgICAgICAgICdvcmRlciB0byBiZVxuJworICAgICAgICAgICAgICAgICAnY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cbicsCisgJ3N0cmluZy1tZXRob2RzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICdTdHJpbmcgTWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5ncyBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tb24gc2VxdWVuY2Ugb3BlcmF0aW9ucywgJworICAgICAgICAgICAgICAgICAgICdhbG9uZyB3aXRoXG4nCisgICAgICAgICAgICAgICAgICAgJ3RoZSBhZGRpdGlvbmFsIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5ncyBhbHNvIHN1cHBvcnQgdHdvIHN0eWxlcyBvZiBzdHJpbmcgZm9ybWF0dGluZywgb25lICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkaW5nIGFcbicKKyAgICAgICAgICAgICAgICAgICAnbGFyZ2UgZGVncmVlIG9mIGZsZXhpYmlsaXR5IGFuZCBjdXN0b21pemF0aW9uIChzZWUgJworICAgICAgICAgICAgICAgICAgICcic3RyLmZvcm1hdCgpIixcbicKKyAgICAgICAgICAgICAgICAgICAnRm9ybWF0IFN0cmluZyBTeW50YXggYW5kIEN1c3RvbSBTdHJpbmcgRm9ybWF0dGluZykgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ290aGVyIGJhc2VkXG4nCisgICAgICAgICAgICAgICAgICAgJ29uIEMgInByaW50ZiIgc3R5bGUgZm9ybWF0dGluZyB0aGF0IGhhbmRsZXMgYSBuYXJyb3dlciAnCisgICAgICAgICAgICAgICAgICAgJ3JhbmdlIG9mIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAgJ2FuZCBpcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuICcKKyAgICAgICAgICAgICAgICAgICAnZmFzdGVyIGZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnY2FzZXMgaXQgY2FuIGhhbmRsZSAocHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSBUZXh0IFByb2Nlc3NpbmcgU2VydmljZXMgc2VjdGlvbiBvZiB0aGUgc3RhbmRhcmQgJworICAgICAgICAgICAgICAgICAgICdsaWJyYXJ5IGNvdmVycyBhXG4nCisgICAgICAgICAgICAgICAgICAgJ251bWJlciBvZiBvdGhlciBtb2R1bGVzIHRoYXQgcHJvdmlkZSB2YXJpb3VzIHRleHQgcmVsYXRlZCAnCisgICAgICAgICAgICAgICAgICAgJ3V0aWxpdGllc1xuJworICAgICAgICAgICAgICAgICAgICcoaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiICcKKyAgICAgICAgICAgICAgICAgICAnbW9kdWxlKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jYXBpdGFsaXplKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdjYXBpdGFsaXplZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jYXNlZm9sZCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjYXNlZm9sZGVkIGNvcHkgb2YgdGhlIHN0cmluZy4gQ2FzZWZvbGRlZCAnCisgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MgbWF5IGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVzZWQgZm9yIGNhc2VsZXNzIG1hdGNoaW5nLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSAnCisgICAgICAgICAgICAgICAgICAgJ2FnZ3Jlc3NpdmUgYmVjYXVzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBpdCBpcyBpbnRlbmRlZCB0byByZW1vdmUgYWxsIGNhc2UgZGlzdGluY3Rpb25zIGluIGEgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmcuIEZvclxuJworICAgICAgICAgICAgICAgICAgICcgICBleGFtcGxlLCB0aGUgR2VybWFuIGxvd2VyY2FzZSBsZXR0ZXIgIlwnw59cJyIgaXMgJworICAgICAgICAgICAgICAgICAgICdlcXVpdmFsZW50IHRvICIic3MiIi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2luY2UgaXQgaXMgYWxyZWFkeSBsb3dlcmNhc2UsICJsb3dlcigpIiB3b3VsZCBkbyAnCisgICAgICAgICAgICAgICAgICAgJ25vdGhpbmcgdG8gIlwnw59cJyI7XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgY2FzZWZvbGRpbmcgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIDMuMTMgJworICAgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgJworICAgICAgICAgICAgICAgICAgICdpcyBkb25lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSAnCisgICAgICAgICAgICAgICAgICAgJ3NwYWNlKS4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciAnCisgICAgICAgICAgICAgICAgICAgJ2VxdWFsIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgKnN1YipcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgJworICAgICAgICAgICAgICAgICAgICcqc3RhcnQqIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZW5jb2RlKGVuY29kaW5nPSJ1dGYtOCIsIGVycm9ycz0ic3RyaWN0IilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZyBhcyBhIGJ5dGVzICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0LiBEZWZhdWx0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVuY29kaW5nIGlzICJcJ3V0Zi04XCciLiAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgJworICAgICAgICAgICAgICAgICAgICdkaWZmZXJlbnRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXMgJworICAgICAgICAgICAgICAgICAgICciXCdzdHJpY3RcJyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYSAiVW5pY29kZUVycm9yIi4gJworICAgICAgICAgICAgICAgICAgICdPdGhlciBwb3NzaWJsZVxuJworICAgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYXJlICJcJ2lnbm9yZVwnIiwgIlwncmVwbGFjZVwnIiwgJworICAgICAgICAgICAgICAgICAgICciXCd4bWxjaGFycmVmcmVwbGFjZVwnIixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIlwnYmFja3NsYXNocmVwbGFjZVwnIiBhbmQgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCAnCisgICAgICAgICAgICAgICAgICAgJ3ZpYVxuJworICAgICAgICAgICAgICAgICAgICcgICAiY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCkiLCBzZWUgc2VjdGlvbiBFcnJvciBIYW5kbGVycy4gJworICAgICAgICAgICAgICAgICAgICdGb3IgYSBsaXN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9mIHBvc3NpYmxlIGVuY29kaW5ncywgc2VlIHNlY3Rpb24gU3RhbmRhcmQgRW5jb2RpbmdzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgJworICAgICAgICAgICAgICAgICAgICdhZGRlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICcKKyAgICAgICAgICAgICAgICAgICAnKnN1ZmZpeCosXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG90aGVyd2lzZSByZXR1cm4gIkZhbHNlIi4gICpzdWZmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgJworICAgICAgICAgICAgICAgICAgICdvZiBzdWZmaXhlc1xuJworICAgICAgICAgICAgICAgICAgICcgICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgJworICAgICAgICAgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmV4cGFuZHRhYnModGFic2l6ZT04KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSByZXBsYWNlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgJworICAgICAgICAgICAgICAgICAgICdhbmQgc28gb24pLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciBpcyBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRhYiAoIlxcdCIpLCBvbmUgb3IgbW9yZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBpbnNlcnRlZCAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLiAoVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGEgbmV3bGluZVxuJworICAgICAgICAgICAgICAgICAgICcgICAoIlxcbiIpIG9yIHJldHVybiAoIlxcciIpLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50ICcKKyAgICAgICAgICAgICAgICAgICAnY29sdW1uIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNCcuZXhwYW5kdGFicygpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNCdcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNCcuZXhwYW5kdGFicyg0KVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnMDEgIDAxMiAwMTIzICAgIDAxMjM0J1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnKnN1YiogaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQgd2l0aGluIHRoZSBzbGljZSAic1tzdGFydDplbmRdIi4gIE9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICpzdGFydCpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4gIFJldHVybiAnCisgICAgICAgICAgICAgICAgICAgJyItMSIgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKnN1YiogaXMgbm90IGZvdW5kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogVGhlICJmaW5kKCkiIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIHlvdSAnCisgICAgICAgICAgICAgICAgICAgJ25lZWQgdG8ga25vd1xuJworICAgICAgICAgICAgICAgICAgICcgICAgIHRoZSBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgb3Igbm90LFxuJworICAgICAgICAgICAgICAgICAgICcgICAgIHVzZSB0aGUgImluIiBvcGVyYXRvcjpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICAgPj4+ICdQeScgaW4gJ1B5dGhvbidcbiIKKyAgICAgICAgICAgICAgICAgICAnICAgICAgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uICcKKyAgICAgICAgICAgICAgICAgICAnd2hpY2ggdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciAnCisgICAgICAgICAgICAgICAgICAgJ3JlcGxhY2VtZW50IGZpZWxkc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkZWxpbWl0ZWQgYnkgYnJhY2VzICJ7fSIuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkICcKKyAgICAgICAgICAgICAgICAgICAnY29udGFpbnMgZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgJworICAgICAgICAgICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGtleXdvcmQgYXJndW1lbnQuICBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlICcKKyAgICAgICAgICAgICAgICAgICAnZWFjaFxuJworICAgICAgICAgICAgICAgICAgICcgICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgID4+PiAiVGhlIHN1bSBvZiAxICsgMiBpcyB7MH0iLmZvcm1hdCgxKzIpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICdUaGUgc3VtIG9mIDEgKyAyIGlzIDMnXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBTZWUgRm9ybWF0IFN0cmluZyBTeW50YXggZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAndmFyaW91c1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbnMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGluIGZvcm1hdCAnCisgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZm9ybWF0X21hcChtYXBwaW5nKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2ltaWxhciB0byAic3RyLmZvcm1hdCgqKm1hcHBpbmcpIiwgZXhjZXB0IHRoYXQgJworICAgICAgICAgICAgICAgICAgICcibWFwcGluZyIgaXMgdXNlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBkaXJlY3RseSBhbmQgbm90IGNvcGllZCB0byBhICJkaWN0Ii4gIFRoaXMgaXMgdXNlZnVsIGlmICcKKyAgICAgICAgICAgICAgICAgICAnZm9yIGV4YW1wbGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIm1hcHBpbmciIGlzIGEgZGljdCBzdWJjbGFzczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4ga2V5XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3tuYW1lfSB3YXMgYm9ybiBpbiAiCisgICAgICAgICAgICAgICAgICAgIntjb3VudHJ5fScuZm9ybWF0X21hcChEZWZhdWx0KG5hbWU9J0d1aWRvJykpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICdHdWlkbyB3YXMgYm9ybiBpbiBjb3VudHJ5J1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBMaWtlICJmaW5kKCkiLCBidXQgcmFpc2UgIlZhbHVlRXJyb3IiIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgICcgICBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2FsbnVtKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnYWxwaGFudW1lcmljIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBBICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyICJjIlxuJworICAgICAgICAgICAgICAgICAgICcgICBpcyBhbHBoYW51bWVyaWMgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmV0dXJucyAnCisgICAgICAgICAgICAgICAgICAgJyJUcnVlIjpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImMuaXNhbHBoYSgpIiwgImMuaXNkZWNpbWFsKCkiLCAiYy5pc2RpZ2l0KCkiLCBvciAnCisgICAgICAgICAgICAgICAgICAgJyJjLmlzbnVtZXJpYygpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2FscGhhKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnYWxwaGFiZXRpYyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgJworICAgICAgICAgICAgICAgICAgICdBbHBoYWJldGljXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICBkYXRhYmFzZSBhcyAiTGV0dGVyIiwgaS5lLiwgdGhvc2Ugd2l0aCBnZW5lcmFsIGNhdGVnb3J5ICcKKyAgICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYmVpbmcgb25lIG9mICJMbSIsICJMdCIsICJMdSIsICJMbCIsIG9yICJMbyIuICBOb3RlICcKKyAgICAgICAgICAgICAgICAgICAndGhhdCB0aGlzIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCBmcm9tIHRoZSAiQWxwaGFiZXRpYyIgcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFN0YW5kYXJkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzZGVjaW1hbCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkZWNpbWFsICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAnCisgICAgICAgICAgICAgICAgICAgJ0RlY2ltYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBhcmUgdGhvc2UgZnJvbSBnZW5lcmFsIGNhdGVnb3J5ICJOZCIuIFRoaXMgJworICAgICAgICAgICAgICAgICAgICdjYXRlZ29yeVxuJworICAgICAgICAgICAgICAgICAgICcgICBpbmNsdWRlcyBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBjYW4gJworICAgICAgICAgICAgICAgICAgICdiZSB1c2VkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLCBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDICcKKyAgICAgICAgICAgICAgICAgICAnRElHSVQgWkVSTy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2RpZ2l0KClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyAnCisgICAgICAgICAgICAgICAgICAgJ2FuZCB0aGVyZSBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBEaWdpdHMgJworICAgICAgICAgICAgICAgICAgICdpbmNsdWRlIGRlY2ltYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBhbmQgZGlnaXRzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbXBhdGliaWxpdHkgc3VwZXJzY3JpcHQgZGlnaXRzLiAgRm9ybWFsbHksIGEgZGlnaXQgaXMgJworICAgICAgICAgICAgICAgICAgICdhIGNoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGF0IGhhcyB0aGUgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0IG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE51bWVyaWNfVHlwZT1EZWNpbWFsLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzaWRlbnRpZmllcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgaWRlbnRpZmllciAnCisgICAgICAgICAgICAgICAgICAgJ2FjY29yZGluZyB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGFuZ3VhZ2UgZGVmaW5pdGlvbiwgc2VjdGlvbiBJZGVudGlmaWVycyBhbmQga2V5d29yZHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBVc2UgImtleXdvcmQuaXNrZXl3b3JkKCkiIHRvIHRlc3QgZm9yIHJlc2VydmVkICcKKyAgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllcnMgc3VjaCBhc1xuJworICAgICAgICAgICAgICAgICAgICcgICAiZGVmIiBhbmQgImNsYXNzIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2xvd2VyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIGxvd2VyY2FzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2UgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNudW1lcmljKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzLFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAnCisgICAgICAgICAgICAgICAgICAgJ051bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsIGFuZCBhbGwgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3RoYXQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LCBlLmcuIFUrMjE1NSwgVlVMR0FSICcKKyAgICAgICAgICAgICAgICAgICAnRlJBQ1RJT05cbicKKyAgICAgICAgICAgICAgICAgICAnICAgT05FIEZJRlRILiAgRm9ybWFsbHksIG51bWVyaWMgY2hhcmFjdGVycyBhcmUgdGhvc2Ugd2l0aCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBwcm9wZXJ0eSB2YWx1ZSBOdW1lcmljX1R5cGU9RGlnaXQsIE51bWVyaWNfVHlwZT1EZWNpbWFsICcKKyAgICAgICAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTnVtZXJpY19UeXBlPU51bWVyaWMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNwcmludGFibGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgJworICAgICAgICAgICAgICAgICAgICdwcmludGFibGUgb3IgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLiAgTm9ucHJpbnRhYmxlICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBhcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ2RhdGFiYXNlIGFzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJPdGhlciIgb3IgIlNlcGFyYXRvciIsIGV4Y2VwdGluZyB0aGUgQVNDSUkgc3BhY2UgJworICAgICAgICAgICAgICAgICAgICcoMHgyMCkgd2hpY2ggaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCBwcmludGFibGUuICAoTm90ZSB0aGF0IHByaW50YWJsZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnaW4gdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBjb250ZXh0IGFyZSB0aG9zZSB3aGljaCBzaG91bGQgbm90IGJlIGVzY2FwZWQgd2hlbiAnCisgICAgICAgICAgICAgICAgICAgJyJyZXByKCkiIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGludm9rZWQgb24gYSBzdHJpbmcuICBJdCBoYXMgbm8gYmVhcmluZyBvbiB0aGUgaGFuZGxpbmcgJworICAgICAgICAgICAgICAgICAgICdvZiBzdHJpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdyaXR0ZW4gdG8gInN5cy5zdGRvdXQiIG9yICJzeXMuc3RkZXJyIi4pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNzcGFjZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gJworICAgICAgICAgICAgICAgICAgICd0aGUgc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICAnCisgICAgICAgICAgICAgICAgICAgJ1doaXRlc3BhY2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVycyAgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlclxuJworICAgICAgICAgICAgICAgICAgICcgICBkYXRhYmFzZSBhcyAiT3RoZXIiIG9yICJTZXBhcmF0b3IiIGFuZCB0aG9zZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgICAnYmlkaXJlY3Rpb25hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBwcm9wZXJ0eSBiZWluZyBvbmUgb2YgIldTIiwgIkIiLCBvciAiUyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXN0aXRsZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kICcKKyAgICAgICAgICAgICAgICAgICAndGhlcmUgaXMgYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGVhc3Qgb25lIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdtYXkgb25seVxuJworICAgICAgICAgICAgICAgICAgICcgICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5ICcKKyAgICAgICAgICAgICAgICAgICAnY2FzZWQgb25lcy5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc3VwcGVyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIHVwcGVyY2FzZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2UgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuam9pbihpdGVyYWJsZSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAqaXRlcmFibGUqICppdGVyYWJsZSouICBBICJUeXBlRXJyb3IiIHdpbGwgYmUgcmFpc2VkIGlmICcKKyAgICAgICAgICAgICAgICAgICAndGhlcmUgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFueSBub24tc3RyaW5nIHZhbHVlcyBpbiAqaXRlcmFibGUqLCBpbmNsdWRpbmcgImJ5dGVzIiAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nIHByb3ZpZGluZyAnCisgICAgICAgICAgICAgICAgICAgJ3RoaXMgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICcKKyAgICAgICAgICAgICAgICAgICAnKndpZHRoKi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGFuIEFTQ0lJXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuIG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVxdWFsIHRvICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmxvd2VyKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIFs0XVxuJworICAgICAgICAgICAgICAgICAgICcgICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGxvd2VyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnMy4xMyBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sc3RyaXAoW2NoYXJzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGxlYWRpbmcgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIHRvIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgJworICAgICAgICAgICAgICAgICAgICdwcmVmaXg7IHJhdGhlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLmxzdHJpcCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdzcGFjaW91cyAgICdcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICd3d3cuZXhhbXBsZS5jb20nLmxzdHJpcCgnY21vd3ouJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ2V4YW1wbGUuY29tJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RhdGljIHN0ci5tYWtldHJhbnMoeFssIHlbLCB6XV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIHRyYW5zbGF0aW9uIHRhYmxlIHVzYWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAgICcgICAic3RyLnRyYW5zbGF0ZSgpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZXJlIGlzIG9ubHkgb25lIGFyZ3VtZW50LCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBvcmRpbmFscyAoaW50ZWdlcnMpIG9yIGNoYXJhY3RlcnMgKHN0cmluZ3Mgb2YgJworICAgICAgICAgICAgICAgICAgICdsZW5ndGggMSkgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBvcmRpbmFscywgc3RyaW5ncyAob2YgYXJiaXRyYXJ5IGxlbmd0aHMpIG9yICcKKyAgICAgICAgICAgICAgICAgICAnTm9uZS5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhcmFjdGVyIGtleXMgd2lsbCB0aGVuIGJlIGNvbnZlcnRlZCB0byBvcmRpbmFscy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZXJlIGFyZSB0d28gYXJndW1lbnRzLCB0aGV5IG11c3QgYmUgc3RyaW5ncyBvZiAnCisgICAgICAgICAgICAgICAgICAgJ2VxdWFsIGxlbmd0aCxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIGluIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeSwgZWFjaCBjaGFyYWN0ZXIgaW4geCAnCisgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgbWFwcGVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRvIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4geS4gIElmIHRoZXJlICcKKyAgICAgICAgICAgICAgICAgICAnaXMgYSB0aGlyZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hvc2UgY2hhcmFjdGVycyB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgICAnbWFwcGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5vbmUgaW4gdGhlIHJlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5wYXJ0aXRpb24oc2VwKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcGFyYXRvciBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgJworICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieVxuJworICAgICAgICAgICAgICAgICAgICcgICB0d28gZW1wdHkgc3RyaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpvbGQqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgJworICAgICAgICAgICAgICAgICAgICdnaXZlbiwgb25seVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJypzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiAnCisgICAgICAgICAgICAgICAgICAgJyJzW3N0YXJ0OmVuZF0iLlxuJworICAgICAgICAgICAgICAgICAgICcgICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzICcKKyAgICAgICAgICAgICAgICAgICAnaW4gc2xpY2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTGlrZSAicmZpbmQoKSIgYnV0IHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzdWJzdHJpbmcgKnN1YiogaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm90IGZvdW5kLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAnCisgICAgICAgICAgICAgICAgICAgJyp3aWR0aCouXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICdpcyBhbiBBU0NJSVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhbiBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBlcXVhbCB0byAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5ycGFydGl0aW9uKHNlcClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3NlcGFyYXRvciBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgJworICAgICAgICAgICAgICAgICAgICdmb2xsb3dlZCBieVxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgc3RyaW5nIGl0c2VsZi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZywgdXNpbmcgKnNlcCogJworICAgICAgICAgICAgICAgICAgICdhcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyptYXhzcGxpdCogc3BsaXRzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCBvclxuJworICAgICAgICAgICAgICAgICAgICcgICAiTm9uZSIsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAgJ2ZvciBzcGxpdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZnJvbSB0aGUgcmlnaHQsICJyc3BsaXQoKSIgYmVoYXZlcyBsaWtlICJzcGxpdCgpIiB3aGljaCAnCisgICAgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAncmVtb3ZlZC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgdG8gYmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCAnCisgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92aW5nIHdoaXRlc3BhY2UuICBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBub3QgYSAnCisgICAgICAgICAgICAgICAgICAgJ3N1ZmZpeDsgcmF0aGVyLFxuJworICAgICAgICAgICAgICAgICAgICcgICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcucnN0cmlwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJyAgIHNwYWNpb3VzJ1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ21pc3Npc3NpcHBpJy5yc3RyaXAoJ2lweicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdtaXNzaXNzJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAnKm1heHNwbGl0KlxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGxpdHMgYXJlIGRvbmUgKHRodXMsIHRoZSBsaXN0IHdpbGwgaGF2ZSBhdCBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAnIm1heHNwbGl0KzEiXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciAiLTEiLCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZW4gdGhlcmUgaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgJworICAgICAgICAgICAgICAgICAgICdhcmUgbWFkZSkuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90ICcKKyAgICAgICAgICAgICAgICAgICAnZ3JvdXBlZCB0b2dldGhlclxuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICcgICAiXCcxLCwyXCcuc3BsaXQoXCcsXCcpIiByZXR1cm5zICJbXCcxXCcsIFwnXCcsICcKKyAgICAgICAgICAgICAgICAgICAnXCcyXCddIikuICBUaGUgKnNlcCogYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpIiByZXR1cm5zICJbXCcxXCcsIFwnMlwnLCAnCisgICAgICAgICAgICAgICAgICAgJ1wnM1wnXSIpLiBTcGxpdHRpbmcgYW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgZW1wdHkgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgc2VwYXJhdG9yIHJldHVybnMgJworICAgICAgICAgICAgICAgICAgICciW1wnXCddIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsMycuc3BsaXQoJywnKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICczJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsMycuc3BsaXQoJywnLCBtYXhzcGxpdD0xKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMiwzJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxLDIsLDMsJy5zcGxpdCgnLCcpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJycsICczJywgJyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzICJOb25lIiwgYSBkaWZmZXJlbnQgJworICAgICAgICAgICAgICAgICAgICdzcGxpdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSByZWdhcmRlZFxuJworICAgICAgICAgICAgICAgICAgICcgICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyAnCisgICAgICAgICAgICAgICAgICAgJ2VtcHR5IHN0cmluZ3NcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXQgdGhlIHN0YXJ0IG9yIGVuZCBpZiB0aGUgc3RyaW5nIGhhcyBsZWFkaW5nIG9yICcKKyAgICAgICAgICAgICAgICAgICAndHJhaWxpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciAnCisgICAgICAgICAgICAgICAgICAgJ2Egc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSAiTm9uZSIgc2VwYXJhdG9yICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJucyAiW10iLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJzEgMiAzJy5zcGxpdCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJzMnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJzEgMiAzJy5zcGxpdChtYXhzcGxpdD0xKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMiAzJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICAxICAgMiAgIDMgICAnLnNwbGl0KClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzInLCAnMyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgJworICAgICAgICAgICAgICAgICAgICdsaW5lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJvdW5kYXJpZXMuICBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdGluZyBsaXN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2Qgc3BsaXRzIG9uIHRoZSBmb2xsb3dpbmcgbGluZSBib3VuZGFyaWVzLiAgJworICAgICAgICAgICAgICAgICAgICdJblxuJworICAgICAgICAgICAgICAgICAgICcgICBwYXJ0aWN1bGFyLCB0aGUgYm91bmRhcmllcyBhcmUgYSBzdXBlcnNldCBvZiAqdW5pdmVyc2FsICcKKyAgICAgICAgICAgICAgICAgICAnbmV3bGluZXMqLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8IFJlcHJlc2VudGF0aW9uICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICdEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFxuIiAgICAgICAgICAgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHIiICAgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlICcKKyAgICAgICAgICAgICAgICAgICAnUmV0dXJuICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcclxcbiIgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiArIExpbmUgJworICAgICAgICAgICAgICAgICAgICdGZWVkICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcdiIgb3IgIlxceDBiIiAgICAgICAgICB8IExpbmUgJworICAgICAgICAgICAgICAgICAgICdUYWJ1bGF0aW9uICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcZiIgb3IgIlxceDBjIiAgICAgICAgICB8IEZvcm0gJworICAgICAgICAgICAgICAgICAgICdGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDFjIiAgICAgICAgICAgICAgICAgIHwgRmlsZSAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx4MWQiICAgICAgICAgICAgICAgICAgfCBHcm91cCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHgxZSIgICAgICAgICAgICAgICAgICB8IFJlY29yZCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDg1IiAgICAgICAgICAgICAgICAgIHwgTmV4dCBMaW5lIChDMSBDb250cm9sICcKKyAgICAgICAgICAgICAgICAgICAnQ29kZSkgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx1MjAyOCIgICAgICAgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnU2VwYXJhdG9yICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHUyMDI5IiAgICAgICAgICAgICAgICB8IFBhcmFncmFwaCAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiXFx2IiBhbmQgIlxcZiIgYWRkZWQgdG8gbGlzdCAnCisgICAgICAgICAgICAgICAgICAgJ29mIGxpbmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYm91bmRhcmllcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdhYiBjXFxuXFxuZGUgZmdcXHJrbFxcclxcbicuc3BsaXRsaW5lcygpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnYWIgYycsICcnLCAnZGUgZmcnLCAna2wnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ2FiIGNcXG5cXG5kZSAiCisgICAgICAgICAgICAgICAgICAgImZnXFxya2xcXHJcXG4nLnNwbGl0bGluZXMoa2VlcGVuZHM9VHJ1ZSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWydhYiBjXFxuJywgJ1xcbicsICdkZSBmZ1xccicsICdrbFxcclxcbiddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZ2l2ZW4sIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHJldHVybnMgYW4gZW1wdHkgbGlzdCBmb3IgdGhlIGVtcHR5IHN0cmluZywgYW5kICcKKyAgICAgICAgICAgICAgICAgICAnYSB0ZXJtaW5hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICIiLnNwbGl0bGluZXMoKVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICBbXVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gIk9uZSBsaW5lXFxuIi5zcGxpdGxpbmVzKClcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWydPbmUgbGluZSddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgY29tcGFyaXNvbiwgInNwbGl0KFwnXFxuXCcpIiBnaXZlczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnJy5zcGxpdCgnXFxuJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycnXVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ1R3byBsaW5lc1xcbicuc3BsaXQoJ1xcbicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnVHdvIGxpbmVzJywgJyddXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCAnCisgICAgICAgICAgICAgICAgICAgJ290aGVyd2lzZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgIkZhbHNlIi4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byAnCisgICAgICAgICAgICAgICAgICAgJ2xvb2sgZm9yLlxuJworICAgICAgICAgICAgICAgICAgICcgICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAncG9zaXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAncG9zaXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuc3RyaXAoW2NoYXJzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3RyYWlsaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgcmVtb3ZlZC4gVGhlICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgICdzcGVjaWZ5aW5nIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yICJOb25lIiwgJworICAgICAgICAgICAgICAgICAgICd0aGUgKmNoYXJzKlxuJworICAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudCBkZWZhdWx0cyB0byByZW1vdmluZyB3aGl0ZXNwYWNlLiBUaGUgKmNoYXJzKiAnCisgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmlwcGVkOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcgICBzcGFjaW91cyAgICcuc3RyaXAoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnc3BhY2lvdXMnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5zdHJpcCgnY21vd3ouJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ2V4YW1wbGUnXG4iCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgb3V0ZXJtb3N0IGxlYWRpbmcgYW5kIHRyYWlsaW5nICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICd2YWx1ZXMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN0cmlwcGVkIGZyb20gdGhlIHN0cmluZy4gQ2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAndGhlIGxlYWRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2V0IG9mIGNoYXJhY3RlcnMgaW4gKmNoYXJzKi4gQSBzaW1pbGFyIGFjdGlvbiB0YWtlcyAnCisgICAgICAgICAgICAgICAgICAgJ3BsYWNlIG9uIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0cmFpbGluZyBlbmQuIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nID0gJyMuLi4uLi4uIFNlY3Rpb24gMy4yLjEgSXNzdWUgIgorICAgICAgICAgICAgICAgICAgICIjMzIgLi4uLi4uLidcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nLnN0cmlwKCcuIyEgJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ1NlY3Rpb24gMy4yLjEgSXNzdWUgIzMyJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN3YXBjYXNlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnY29udmVydGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4gTm90ZSB0aGF0IGl0IGlzIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ25lY2Vzc2FyaWx5IHRydWUgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICAicy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkgPT0gcyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudGl0bGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgJworICAgICAgICAgICAgICAgICAgICdzdGFydCB3aXRoIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVwcGVyY2FzZSBjaGFyYWN0ZXIgYW5kIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyBhcmUgJworICAgICAgICAgICAgICAgICAgICdsb3dlcmNhc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnSGVsbG8gd29ybGQnLnRpdGxlKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ0hlbGxvIFdvcmxkJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50ICcKKyAgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJ3dvcmtzIGluXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gJworICAgICAgICAgICAgICAgICAgICdjb250cmFjdGlvbnMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ2Rlc2lyZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVzdWx0OlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nICcKKyAgICAgICAgICAgICAgICAgICAncmVndWxhclxuJworICAgICAgICAgICAgICAgICAgICcgICBleHByZXNzaW9uczpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBpbXBvcnQgcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogJworICAgICAgICAgICAgICAgICAgICdtby5ncm91cCgwKVswXS51cHBlcigpICtcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICdtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudHJhbnNsYXRlKHRhYmxlKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyAnCisgICAgICAgICAgICAgICAgICAgJ2JlZW4gbWFwcGVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRocm91Z2ggdGhlIGdpdmVuIHRyYW5zbGF0aW9uIHRhYmxlLiAgVGhlIHRhYmxlIG11c3QgYmUgJworICAgICAgICAgICAgICAgICAgICdhbiBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhhdCBpbXBsZW1lbnRzIGluZGV4aW5nIHZpYSAiX19nZXRpdGVtX18oKSIsIHR5cGljYWxseSAnCisgICAgICAgICAgICAgICAgICAgJ2EgKm1hcHBpbmcqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9yICpzZXF1ZW5jZSouICBXaGVuIGluZGV4ZWQgYnkgYSBVbmljb2RlIG9yZGluYWwgKGFuICcKKyAgICAgICAgICAgICAgICAgICAnaW50ZWdlciksIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWJsZSBvYmplY3QgY2FuIGRvIGFueSBvZiB0aGUgZm9sbG93aW5nOiByZXR1cm4gYSAnCisgICAgICAgICAgICAgICAgICAgJ1VuaWNvZGUgb3JkaW5hbFxuJworICAgICAgICAgICAgICAgICAgICcgICBvciBhIHN0cmluZywgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gb25lIG9yIG1vcmUgb3RoZXIgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzO1xuJworICAgICAgICAgICAgICAgICAgICcgICByZXR1cm4gIk5vbmUiLCB0byBkZWxldGUgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSByZXR1cm4gJworICAgICAgICAgICAgICAgICAgICdzdHJpbmc7IG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJhaXNlIGEgIkxvb2t1cEVycm9yIiBleGNlcHRpb24sIHRvIG1hcCB0aGUgY2hhcmFjdGVyICcKKyAgICAgICAgICAgICAgICAgICAndG8gaXRzZWxmLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgWW91IGNhbiB1c2UgInN0ci5tYWtldHJhbnMoKSIgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gJworICAgICAgICAgICAgICAgICAgICdtYXAgZnJvbVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXItdG8tY2hhcmFjdGVyIG1hcHBpbmdzIGluIGRpZmZlcmVudCBmb3JtYXRzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2VlIGFsc28gdGhlICJjb2RlY3MiIG1vZHVsZSBmb3IgYSBtb3JlIGZsZXhpYmxlICcKKyAgICAgICAgICAgICAgICAgICAnYXBwcm9hY2ggdG8gY3VzdG9tXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlciBtYXBwaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci51cHBlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBbNF1cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udmVydGVkIHRvIHVwcGVyY2FzZS4gIE5vdGUgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJyJzdHIudXBwZXIoKS5pc3VwcGVyKCkiIG1pZ2h0IGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJGYWxzZSIgaWYgInMiIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiICcKKyAgICAgICAgICAgICAgICAgICAnKExldHRlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdXBwZXJjYXNlKSwgYnV0IGUuZy4gIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIHVwcGVyY2FzaW5nIGFsZ29yaXRobSB1c2VkIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnMy4xMyBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5pY29kZSBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci56ZmlsbCh3aWR0aClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIEFTQ0lJICcKKyAgICAgICAgICAgICAgICAgICAnIlwnMFwnIiBkaWdpdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWFrZSBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gQSBsZWFkaW5nIHNpZ24gcHJlZml4XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICgiXCcrXCciLyJcJy1cJyIpIGlzIGhhbmRsZWQgYnkgaW5zZXJ0aW5nIHRoZSBwYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICAnKmFmdGVyKiB0aGUgc2lnblxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYmVmb3JlLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuZWQgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gImxlbihzKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiNDIiLnpmaWxsKDUpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICcwMDA0MidcbiIKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICItNDIiLnpmaWxsKDUpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgICctMDA0MidcbiIsCisgJ3N0cmluZ3MnOiAnXG4nCisgICAgICAgICAgICAnU3RyaW5nIGFuZCBCeXRlcyBsaXRlcmFsc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdTdHJpbmcgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgJ2RlZmluaXRpb25zOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyAgIHN0cmluZ2xpdGVyYWwgICA6Oj0gW3N0cmluZ3ByZWZpeF0oc2hvcnRzdHJpbmcgfCBsb25nc3RyaW5nKVxuJworICAgICAgICAgICAgJyAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgIlIiIHwgIlUiIHwgImYiIHwgIkYiXG4nCisgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICB8ICJmciIgfCAiRnIiIHwgImZSIiB8ICJGUiIgfCAicmYiIHwgInJGIiB8ICcKKyAgICAgICAgICAgICciUmYiIHwgIlJGIlxuJworICAgICAgICAgICAgJyAgIHNob3J0c3RyaW5nICAgICA6Oj0gIlwnIiBzaG9ydHN0cmluZ2l0ZW0qICJcJyIgfCBcJyJcJyAnCisgICAgICAgICAgICAnc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmcgICAgICA6Oj0gIlwnXCdcJyIgbG9uZ3N0cmluZ2l0ZW0qICJcJ1wnXCciIHwgJworICAgICAgICAgICAgJ1wnIiIiXCcgbG9uZ3N0cmluZ2l0ZW0qIFwnIiIiXCdcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZ2NoYXIgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciAnCisgICAgICAgICAgICAnbmV3bGluZSBvciB0aGUgcXVvdGU+XG4nCisgICAgICAgICAgICAnICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4nCisgICAgICAgICAgICAnICAgc3RyaW5nZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgc291cmNlIGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICBieXRlc2xpdGVyYWwgICA6Oj0gYnl0ZXNwcmVmaXgoc2hvcnRieXRlcyB8IGxvbmdieXRlcylcbicKKyAgICAgICAgICAgICcgICBieXRlc3ByZWZpeCAgICA6Oj0gImIiIHwgIkIiIHwgImJyIiB8ICJCciIgfCAiYlIiIHwgIkJSIiB8ICcKKyAgICAgICAgICAgICcicmIiIHwgInJCIiB8ICJSYiIgfCAiUkIiXG4nCisgICAgICAgICAgICAnICAgc2hvcnRieXRlcyAgICAgOjo9ICJcJyIgc2hvcnRieXRlc2l0ZW0qICJcJyIgfCBcJyJcJyAnCisgICAgICAgICAgICAnc2hvcnRieXRlc2l0ZW0qIFwnIlwnXG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzICAgICAgOjo9ICJcJ1wnXCciIGxvbmdieXRlc2l0ZW0qICJcJ1wnXCciIHwgXCciIiJcJyAnCisgICAgICAgICAgICAnbG9uZ2J5dGVzaXRlbSogXCciIiJcJ1xuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXNpdGVtIDo6PSBzaG9ydGJ5dGVzY2hhciB8IGJ5dGVzZXNjYXBlc2VxXG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzaXRlbSAgOjo9IGxvbmdieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXNjaGFyIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIiBvciBuZXdsaW5lICcKKyAgICAgICAgICAgICdvciB0aGUgcXVvdGU+XG4nCisgICAgICAgICAgICAnICAgbG9uZ2J5dGVzY2hhciAgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuJworICAgICAgICAgICAgJyAgIGJ5dGVzZXNjYXBlc2VxIDo6PSAiXFwiIDxhbnkgQVNDSUkgY2hhcmFjdGVyPlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ09uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyAnCisgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgJ3doaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgInN0cmluZ3ByZWZpeCIgb3IgJworICAgICAgICAgICAgJyJieXRlc3ByZWZpeCJcbicKKyAgICAgICAgICAgICdhbmQgdGhlIHJlc3Qgb2YgdGhlIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkICcKKyAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgJ3RoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgVVRGLTggaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gJworICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAnZ2l2ZW4gaW4gdGhlIHNvdXJjZSBmaWxlOyBzZWUgc2VjdGlvbiBFbmNvZGluZyBkZWNsYXJhdGlvbnMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnSW4gcGxhaW4gRW5nbGlzaDogQm90aCB0eXBlcyBvZiBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gJworICAgICAgICAgICAgJ21hdGNoaW5nXG4nCisgICAgICAgICAgICAnc2luZ2xlIHF1b3RlcyAoIlwnIikgb3IgZG91YmxlIHF1b3RlcyAoIiIiKS4gIFRoZXkgY2FuIGFsc28gYmUgJworICAgICAgICAgICAgJ2VuY2xvc2VkXG4nCisgICAgICAgICAgICAnaW4gbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmVcbicKKyAgICAgICAgICAgICdnZW5lcmFsbHkgcmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlICcKKyAgICAgICAgICAgICdiYWNrc2xhc2hcbicKKyAgICAgICAgICAgICcoIlxcIikgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSAnCisgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgJ3NwZWNpYWwgbWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGVcbicKKyAgICAgICAgICAgICdjaGFyYWN0ZXIuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQnl0ZXMgbGl0ZXJhbHMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoICJcJ2JcJyIgb3IgIlwnQlwnIjsgdGhleSAnCisgICAgICAgICAgICAncHJvZHVjZVxuJworICAgICAgICAgICAgJ2FuIGluc3RhbmNlIG9mIHRoZSAiYnl0ZXMiIHR5cGUgaW5zdGVhZCBvZiB0aGUgInN0ciIgdHlwZS4gIFRoZXkgJworICAgICAgICAgICAgJ21heVxuJworICAgICAgICAgICAgJ29ubHkgY29udGFpbiBBU0NJSSBjaGFyYWN0ZXJzOyBieXRlcyB3aXRoIGEgbnVtZXJpYyB2YWx1ZSBvZiAxMjggJworICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAnZ3JlYXRlciBtdXN0IGJlIGV4cHJlc3NlZCB3aXRoIGVzY2FwZXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQXMgb2YgUHl0aG9uIDMuMyBpdCBpcyBwb3NzaWJsZSBhZ2FpbiB0byBwcmVmaXggc3RyaW5nIGxpdGVyYWxzICcKKyAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICcidSIgcHJlZml4IHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIGR1YWwgMi54IGFuZCAzLnggJworICAgICAgICAgICAgJ2NvZGViYXNlcy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdCb3RoIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCBhXG4nCisgICAgICAgICAgICAnbGV0dGVyICJcJ3JcJyIgb3IgIlwnUlwnIjsgc3VjaCBzdHJpbmdzIGFyZSBjYWxsZWQgKnJhdyBzdHJpbmdzKiAnCisgICAgICAgICAgICAnYW5kIHRyZWF0XG4nCisgICAgICAgICAgICAnYmFja3NsYXNoZXMgYXMgbGl0ZXJhbCBjaGFyYWN0ZXJzLiAgQXMgYSByZXN1bHQsIGluIHN0cmluZyAnCisgICAgICAgICAgICAnbGl0ZXJhbHMsXG4nCisgICAgICAgICAgICAnIlwnXFxVXCciIGFuZCAiXCdcXHVcJyIgZXNjYXBlcyBpbiByYXcgc3RyaW5ncyBhcmUgbm90IHRyZWF0ZWQgJworICAgICAgICAgICAgJ3NwZWNpYWxseS5cbicKKyAgICAgICAgICAgICJHaXZlbiB0aGF0IFB5dGhvbiAyLngncyByYXcgdW5pY29kZSBsaXRlcmFscyBiZWhhdmUgZGlmZmVyZW50bHkgIgorICAgICAgICAgICAgJ3RoYW5cbicKKyAgICAgICAgICAgICdQeXRob24gMy54XCdzIHRoZSAiXCd1clwnIiBzeW50YXggaXMgbm90IHN1cHBvcnRlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAiXCdyYlwnIiBwcmVmaXggb2YgcmF3IGJ5dGVzIGxpdGVyYWxzIGhhcyAnCisgICAgICAgICAgICAnYmVlblxuJworICAgICAgICAgICAgJ2FkZGVkIGFzIGEgc3lub255bSBvZiAiXCdiclwnIi5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIHRoZSB1bmljb2RlIGxlZ2FjeSBsaXRlcmFsXG4nCisgICAgICAgICAgICAnKCJ1XCd2YWx1ZVwnIikgd2FzIHJlaW50cm9kdWNlZCB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgJworICAgICAgICAgICAgJ2R1YWxcbicKKyAgICAgICAgICAgICdQeXRob24gMi54IGFuZCAzLnggY29kZWJhc2VzLiBTZWUgKipQRVAgNDE0KiogZm9yIG1vcmUgJworICAgICAgICAgICAgJ2luZm9ybWF0aW9uLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0Egc3RyaW5nIGxpdGVyYWwgd2l0aCAiXCdmXCciIG9yICJcJ0ZcJyIgaW4gaXRzIHByZWZpeCBpcyBhICcKKyAgICAgICAgICAgICcqZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAnc3RyaW5nIGxpdGVyYWwqOyBzZWUgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscy4gIFRoZSAiXCdmXCciIG1heSAnCisgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICdjb21iaW5lZCB3aXRoICJcJ3JcJyIsIGJ1dCBub3Qgd2l0aCAiXCdiXCciIG9yICJcJ3VcJyIsIHRoZXJlZm9yZSAnCisgICAgICAgICAgICAncmF3XG4nCisgICAgICAgICAgICAnZm9ybWF0dGVkIHN0cmluZ3MgYXJlIHBvc3NpYmxlLCBidXQgZm9ybWF0dGVkIGJ5dGVzIGxpdGVyYWxzIGFyZSAnCisgICAgICAgICAgICAnbm90LlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0luIHRyaXBsZS1xdW90ZWQgbGl0ZXJhbHMsIHVuZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGVzIGFyZSAnCisgICAgICAgICAgICAnYWxsb3dlZFxuJworICAgICAgICAgICAgJyhhbmQgYXJlIHJldGFpbmVkKSwgZXhjZXB0IHRoYXQgdGhyZWUgdW5lc2NhcGVkIHF1b3RlcyBpbiBhIHJvd1xuJworICAgICAgICAgICAgJ3Rlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gJworICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ2xpdGVyYWwsIGkuZS4gZWl0aGVyICJcJyIgb3IgIiIiLilcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdVbmxlc3MgYW4gIlwnclwnIiBvciAiXCdSXCciIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzICcKKyAgICAgICAgICAgICdpbiBzdHJpbmdcbicKKyAgICAgICAgICAgICdhbmQgYnl0ZXMgbGl0ZXJhbHMgYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byBydWxlcyBzaW1pbGFyIHRvICcKKyAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgJ3VzZWQgYnkgU3RhbmRhcmQgQy4gIFRoZSByZWNvZ25pemVkIGVzY2FwZSBzZXF1ZW5jZXMgYXJlOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbicKKyAgICAgICAgICAgICd8ICJcXG5ld2xpbmUiICAgICAgICB8IEJhY2tzbGFzaCBhbmQgbmV3bGluZSBpZ25vcmVkICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxcXCIgICAgICAgICAgICAgIHwgQmFja3NsYXNoICgiXFwiKSAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxcJyIgICAgICAgICAgICAgIHwgU2luZ2xlIHF1b3RlICgiXCciKSAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFwiIiAgICAgICAgICAgICAgfCBEb3VibGUgcXVvdGUgKCIiIikgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcYSIgICAgICAgICAgICAgIHwgQVNDSUkgQmVsbCAoQkVMKSAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXGIiICAgICAgICAgICAgICB8IEFTQ0lJIEJhY2tzcGFjZSAoQlMpICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxmIiAgICAgICAgICAgICAgfCBBU0NJSSBGb3JtZmVlZCAoRkYpICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcbiIgICAgICAgICAgICAgIHwgQVNDSUkgTGluZWZlZWQgKExGKSAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHIiICAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFx0IiAgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdiIgICAgICAgICAgICAgIHwgQVNDSUkgVmVydGljYWwgVGFiIChWVCkgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXG9vbyIgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIG9jdGFsIHZhbHVlICpvb28qICB8ICcKKyAgICAgICAgICAgICcoMSwzKSAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFx4aGgiICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBoZXggdmFsdWUgKmhoKiAgICAgfCAnCisgICAgICAgICAgICAnKDIsMykgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0VzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZyBsaXRlcmFscyBhcmU6XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xuJworICAgICAgICAgICAgJ3wgIlxcTntuYW1lfSIgICAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgJworICAgICAgICAgICAgJyg0KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIGRhdGFiYXNlICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdXh4eHgiICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgJworICAgICAgICAgICAgJyg1KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCAqeHh4eCogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcVXh4eHh4eHh4IiAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMzItYml0IGhleCB2YWx1ZSAgIHwgJworICAgICAgICAgICAgJyg2KSAgICAgfFxuJworICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgfCAqeHh4eHh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICcKKyAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzEuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnMi4gVW5saWtlIGluIFN0YW5kYXJkIEMsIGV4YWN0bHkgdHdvIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzMuIEluIGEgYnl0ZXMgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZVxuJworICAgICAgICAgICAgJyAgIGJ5dGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuIEluIGEgc3RyaW5nIGxpdGVyYWwsIHRoZXNlIGVzY2FwZXNcbicKKyAgICAgICAgICAgICcgICBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICc0LiBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciBuYW1lIGFsaWFzZXMgWzFdIGhhcyBiZWVuXG4nCisgICAgICAgICAgICAnICAgYWRkZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnNS4gRXhhY3RseSBmb3VyIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzYuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheS4gIEV4YWN0bHkgZWlnaHRcbicKKyAgICAgICAgICAgICcgICBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdVbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdzdHJpbmcgdW5jaGFuZ2VkLCBpLmUuLCAqdGhlIGJhY2tzbGFzaCBpcyBsZWZ0IGluIHRoZSByZXN1bHQqLiAgJworICAgICAgICAgICAgJyhUaGlzXG4nCisgICAgICAgICAgICAnYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgJworICAgICAgICAgICAgJ21pc3R5cGVkLFxuJworICAgICAgICAgICAgJ3RoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzICcKKyAgICAgICAgICAgICdhbHNvXG4nCisgICAgICAgICAgICAnaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB0aGUgZXNjYXBlIHNlcXVlbmNlcyBvbmx5IHJlY29nbml6ZWQgaW4gJworICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgJ2xpdGVyYWxzIGZhbGwgaW50byB0aGUgY2F0ZWdvcnkgb2YgdW5yZWNvZ25pemVkIGVzY2FwZXMgZm9yICcKKyAgICAgICAgICAgICdieXRlc1xuJworICAgICAgICAgICAgJ2xpdGVyYWxzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0V2ZW4gaW4gYSByYXcgbGl0ZXJhbCwgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsICcKKyAgICAgICAgICAgICdidXQgdGhlXG4nCisgICAgICAgICAgICAnYmFja3NsYXNoIHJlbWFpbnMgaW4gdGhlIHJlc3VsdDsgZm9yIGV4YW1wbGUsICJyIlxcIiIiIGlzIGEgJworICAgICAgICAgICAgJ3ZhbGlkXG4nCisgICAgICAgICAgICAnc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgJworICAgICAgICAgICAgJ2RvdWJsZVxuJworICAgICAgICAgICAgJ3F1b3RlOyAiciJcXCIiIGlzIG5vdCBhIHZhbGlkIHN0cmluZyBsaXRlcmFsIChldmVuIGEgcmF3IHN0cmluZyAnCisgICAgICAgICAgICAnY2Fubm90XG4nCisgICAgICAgICAgICAnZW5kIGluIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMpLiAgU3BlY2lmaWNhbGx5LCAqYSByYXcgJworICAgICAgICAgICAgJ2xpdGVyYWxcbicKKyAgICAgICAgICAgICdjYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGQgJworICAgICAgICAgICAgJ2VzY2FwZVxuJworICAgICAgICAgICAgJ3RoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlICcKKyAgICAgICAgICAgICdiYWNrc2xhc2hcbicKKyAgICAgICAgICAgICdmb2xsb3dlZCBieSBhIG5ld2xpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhvc2UgdHdvIGNoYXJhY3RlcnMgYXMgJworICAgICAgICAgICAgJ3BhcnRcbicKKyAgICAgICAgICAgICdvZiB0aGUgbGl0ZXJhbCwgKm5vdCogYXMgYSBsaW5lIGNvbnRpbnVhdGlvbi5cbicsCisgJ3N1YnNjcmlwdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnU3Vic2NyaXB0aW9uc1xuJworICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSAnCisgICAgICAgICAgICAgICAgICAnb3IgbGlzdClcbicKKyAgICAgICAgICAgICAgICAgICdvciBtYXBwaW5nIChkaWN0aW9uYXJ5KSBvYmplY3Q6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3Vic2NyaXB0aW9uIDo6PSBwcmltYXJ5ICJbIiBleHByZXNzaW9uX2xpc3QgIl0iXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyAnCisgICAgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnKGxpc3RzIG9yIGRpY3Rpb25hcmllcyBmb3IgZXhhbXBsZSkuICBVc2VyLWRlZmluZWQgb2JqZWN0cyAnCisgICAgICAgICAgICAgICAgICAnY2FuIHN1cHBvcnRcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gYnkgZGVmaW5pbmcgYSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0ZvciBidWlsdC1pbiBvYmplY3RzLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9iamVjdHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnc3VwcG9ydFxuJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbjpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcsIHRoZSBleHByZXNzaW9uIGxpc3QgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXZhbHVhdGUgdG8gYW5cbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kcyB0byB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAna2V5LiAgKFRoZSBleHByZXNzaW9uIGxpc3QgaXMgYSB0dXBsZSBleGNlcHQgaWYgaXQgaGFzICcKKyAgICAgICAgICAgICAgICAgICdleGFjdGx5IG9uZVxuJworICAgICAgICAgICAgICAgICAgJ2l0ZW0uKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0lmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0ICcKKyAgICAgICAgICAgICAgICAgICdldmFsdWF0ZSB0b1xuJworICAgICAgICAgICAgICAgICAgJ2FuIGludGVnZXIgb3IgYSBzbGljZSAoYXMgZGlzY3Vzc2VkIGluIHRoZSBmb2xsb3dpbmcgJworICAgICAgICAgICAgICAgICAgJ3NlY3Rpb24pLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBmb3JtYWwgc3ludGF4IG1ha2VzIG5vIHNwZWNpYWwgcHJvdmlzaW9uIGZvciBuZWdhdGl2ZSAnCisgICAgICAgICAgICAgICAgICAnaW5kaWNlcyBpblxuJworICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlczsgaG93ZXZlciwgYnVpbHQtaW4gc2VxdWVuY2VzIGFsbCBwcm92aWRlIGEgJworICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCB0aGF0IGludGVycHJldHMgbmVnYXRpdmUgaW5kaWNlcyBieSBhZGRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgICdsZW5ndGggb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnc2VxdWVuY2UgdG8gdGhlIGluZGV4IChzbyB0aGF0ICJ4Wy0xXSIgc2VsZWN0cyB0aGUgbGFzdCAnCisgICAgICAgICAgICAgICAgICAnaXRlbSBvZiAieCIpLlxuJworICAgICAgICAgICAgICAgICAgJ1RoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuICcKKyAgICAgICAgICAgICAgICAgICd0aGUgbnVtYmVyXG4nCisgICAgICAgICAgICAgICAgICAnb2YgaXRlbXMgaW4gdGhlIHNlcXVlbmNlLCBhbmQgdGhlIHN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaXRlbSB3aG9zZVxuJworICAgICAgICAgICAgICAgICAgJ2luZGV4IGlzIHRoYXQgdmFsdWUgKGNvdW50aW5nIGZyb20gemVybykuIFNpbmNlIHRoZSBzdXBwb3J0ICcKKyAgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBpbmRpY2VzIGFuZCBzbGljaW5nIG9jY3VycyBpbiB0aGUgb2JqZWN0J3MgIgorICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCwgc3ViY2xhc3NlcyBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHdpbGwgbmVlZCB0byAnCisgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSBhZGRcbicKKyAgICAgICAgICAgICAgICAgICd0aGF0IHN1cHBvcnQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiQSBzdHJpbmcncyBpdGVtcyBhcmUgY2hhcmFjdGVycy4gIEEgY2hhcmFjdGVyIGlzIG5vdCBhICIKKyAgICAgICAgICAgICAgICAgICdzZXBhcmF0ZSBkYXRhXG4nCisgICAgICAgICAgICAgICAgICAndHlwZSBidXQgYSBzdHJpbmcgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLlxuJywKKyAndHJ1dGgnOiAnXG4nCisgICAgICAgICAgJ1RydXRoIFZhbHVlIFRlc3RpbmdcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiAiaWYiIG9yXG4nCisgICAgICAgICAgJyJ3aGlsZSIgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gJworICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAnZm9sbG93aW5nIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBmYWxzZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogIk5vbmUiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqICJGYWxzZSJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogemVybyBvZiBhbnkgbnVtZXJpYyB0eXBlLCBmb3IgZXhhbXBsZSwgIjAiLCAiMC4wIiwgIjBqIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgIlwnXCciLCAiKCkiLCAiW10iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsICJ7fSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQgY2xhc3NlcywgaWYgdGhlIGNsYXNzIGRlZmluZXMgYVxuJworICAgICAgICAgICcgICJfX2Jvb2xfXygpIiBvciAiX19sZW5fXygpIiBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJucyB0aGVcbicKKyAgICAgICAgICAnICBpbnRlZ2VyIHplcm8gb3IgImJvb2wiIHZhbHVlICJGYWxzZSIuIFsxXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQWxsIG90aGVyIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB0cnVlIC0tLSBzbyBvYmplY3RzIG9mIG1hbnkgdHlwZXMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnYWx3YXlzIHRydWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdPcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgJworICAgICAgICAgICdhbHdheXNcbicKKyAgICAgICAgICAncmV0dXJuICIwIiBvciAiRmFsc2UiIGZvciBmYWxzZSBhbmQgIjEiIG9yICJUcnVlIiBmb3IgdHJ1ZSwgdW5sZXNzXG4nCisgICAgICAgICAgJ290aGVyd2lzZSBzdGF0ZWQuIChJbXBvcnRhbnQgZXhjZXB0aW9uOiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zICcKKyAgICAgICAgICAnIm9yIlxuJworICAgICAgICAgICdhbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKVxuJywKKyAndHJ5JzogJ1xuJworICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudFxuJworICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuJworICAgICAgICAnZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbicKKyAgICAgICAgJyAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiICcKKyAgICAgICAgJ3N1aXRlKStcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuJworICAgICAgICAnICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuICcKKyAgICAgICAgJ25vXG4nCisgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG4nCisgICAgICAgICdleGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yICcKKyAgICAgICAgJ2FuXG4nCisgICAgICAgICdleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCAnCisgICAgICAgICdjbGF1c2VzXG4nCisgICAgICAgICdpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuICcKKyAgICAgICAgJ2V4cHJlc3Npb24tXG4nCisgICAgICAgICdsZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbicKKyAgICAgICAgJ2V4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG4nCisgICAgICAgICdpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG4nCisgICAgICAgICdvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG4nCisgICAgICAgICd3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSAnCisgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgJ29iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuICcKKyAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAnaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uICcKKyAgICAgICAgJ3N0YWNrLlxuJworICAgICAgICAnWzFdXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG4nCisgICAgICAgICdyYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgJworICAgICAgICAnYW5kXG4nCisgICAgICAgICdhIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxuJworICAgICAgICAndGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgJworICAgICAgICAncmFpc2VkXG4nCisgICAgICAgICd0aGUgZXhjZXB0aW9uKS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbicKKyAgICAgICAgJ3RoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCAnCisgICAgICAgICdpZlxuJworICAgICAgICAicHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0XG4iCisgICAgICAgICdjbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ3JlYWNoZWQsIGV4ZWN1dGlvbiBjb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgJworICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAnKFRoaXMgbWVhbnMgdGhhdCBpZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSAnCisgICAgICAgICdleGNlcHRpb24sXG4nCisgICAgICAgICdhbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZVxuJworICAgICAgICAnb3V0ZXIgaGFuZGxlciB3aWxsIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1doZW4gYW4gZXhjZXB0aW9uIGhhcyBiZWVuIGFzc2lnbmVkIHVzaW5nICJhcyB0YXJnZXQiLCBpdCBpcyBjbGVhcmVkXG4nCisgICAgICAgICdhdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAnICAgICAgIGZvb1xuJworICAgICAgICAnXG4nCisgICAgICAgICd3YXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBleGNlcHQgRSBhcyBOOlxuJworICAgICAgICAnICAgICAgIHRyeTpcbicKKyAgICAgICAgJyAgICAgICAgICAgZm9vXG4nCisgICAgICAgICcgICAgICAgZmluYWxseTpcbicKKyAgICAgICAgJyAgICAgICAgICAgZGVsIE5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhpcyBtZWFucyB0aGUgZXhjZXB0aW9uIG11c3QgYmUgYXNzaWduZWQgdG8gYSBkaWZmZXJlbnQgbmFtZSB0byBiZVxuJworICAgICAgICAnYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlIGNsZWFyZWRcbicKKyAgICAgICAgJ2JlY2F1c2Ugd2l0aCB0aGUgdHJhY2ViYWNrIGF0dGFjaGVkIHRvIHRoZW0sIHRoZXkgZm9ybSBhIHJlZmVyZW5jZVxuJworICAgICAgICAnY3ljbGUgd2l0aCB0aGUgc3RhY2sgZnJhbWUsIGtlZXBpbmcgYWxsIGxvY2FscyBpbiB0aGF0IGZyYW1lIGFsaXZlXG4nCisgICAgICAgICd1bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICJCZWZvcmUgYW4gZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuIgorICAgICAgICAnZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHZpYVxuJworICAgICAgICAnInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgKHNlZVxuJworICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGVcbicKKyAgICAgICAgJ3Byb2dyYW0gd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gICJzeXMuZXhjX2luZm8oKSIgdmFsdWVzIGFyZVxuJworICAgICAgICAncmVzdG9yZWQgdG8gdGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nXG4nCisgICAgICAgICdmcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIG9wdGlvbmFsICJlbHNlIiBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbicKKyAgICAgICAgJ3RoZSBlbmQgb2YgdGhlICJ0cnkiIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlICJlbHNlIiBjbGF1c2UgYXJlXG4nCisgICAgICAgICdub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmICJmaW5hbGx5IiBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlICcKKyAgICAgICAgJyJ0cnkiXG4nCisgICAgICAgICdjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgImV4Y2VwdCIgYW5kICJlbHNlIiBjbGF1c2VzLiAgSWYgJworICAgICAgICAnYW5cbicKKyAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG4nCisgICAgICAgICdleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkLiAgJworICAgICAgICAnSWZcbicKKyAgICAgICAgJ3RoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAnCisgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgJ2NsYXVzZS4gIElmIHRoZSAiZmluYWxseSIgY2xhdXNlIHJhaXNlcyBhbm90aGVyIGV4Y2VwdGlvbiwgdGhlIHNhdmVkXG4nCisgICAgICAgICdleGNlcHRpb24gaXMgc2V0IGFzIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgZXhjZXB0aW9uLiBJZiB0aGUgJworICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICdjbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkIGV4Y2VwdGlvblxuJworICAgICAgICAnaXMgZGlzY2FyZGVkOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICA+Pj4gZGVmIGYoKTpcbicKKyAgICAgICAgJyAgIC4uLiAgICAgdHJ5OlxuJworICAgICAgICAnICAgLi4uICAgICAgICAgMS8wXG4nCisgICAgICAgICcgICAuLi4gICAgIGZpbmFsbHk6XG4nCisgICAgICAgICcgICAuLi4gICAgICAgICByZXR1cm4gNDJcbicKKyAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAnICAgPj4+IGYoKVxuJworICAgICAgICAnICAgNDJcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuJworICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdXaGVuIGEgInJldHVybiIsICJicmVhayIgb3IgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW4gdGhlXG4nCisgICAgICAgICcidHJ5IiBzdWl0ZSBvZiBhICJ0cnkiLi4uImZpbmFsbHkiIHN0YXRlbWVudCwgdGhlICJmaW5hbGx5IiBjbGF1c2UgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ2Fsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGlsbGVnYWwgJworICAgICAgICAnaW5cbicKKyAgICAgICAgJ3RoZSAiZmluYWxseSIgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhIHByb2JsZW0gd2l0aCB0aGUgY3VycmVudFxuJworICAgICAgICAnaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgInJldHVybiJcbicKKyAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZC4gIFNpbmNlIHRoZSAiZmluYWxseSIgY2xhdXNlIGFsd2F5cyBleGVjdXRlcywgYVxuJworICAgICAgICAnInJldHVybiIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSAiZmluYWxseSIgY2xhdXNlIHdpbGwgYWx3YXlzIGJlICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnbGFzdCBvbmUgZXhlY3V0ZWQ6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgID4+PiBkZWYgZm9vKCk6XG4nCisgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAndHJ5J1xuIgorICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAiICAgLi4uICAgICAgICAgcmV0dXJuICdmaW5hbGx5J1xuIgorICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICcgICA+Pj4gZm9vKClcbicKKyAgICAgICAgIiAgICdmaW5hbGx5J1xuIgorICAgICAgICAnXG4nCisgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgJ0V4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG8gJworICAgICAgICAnZ2VuZXJhdGVcbicKKyAgICAgICAgJ2V4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gVGhlIHJhaXNlIHN0YXRlbWVudC5cbicsCisgJ3R5cGVzJzogJ1xuJworICAgICAgICAgICdUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHlcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdCZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgJworICAgICAgICAgICdFeHRlbnNpb25cbicKKyAgICAgICAgICAnbW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbicKKyAgICAgICAgICAnaW1wbGVtZW50YXRpb24pIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB0eXBlcy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZlxuJworICAgICAgICAgICdQeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsICcKKyAgICAgICAgICAnbnVtYmVycyxcbicKKyAgICAgICAgICAnZWZmaWNpZW50bHkgc3RvcmVkIGFycmF5cyBvZiBpbnRlZ2VycywgZXRjLiksIGFsdGhvdWdoIHN1Y2ggJworICAgICAgICAgICdhZGRpdGlvbnNcbicKKyAgICAgICAgICAnd2lsbCBvZnRlbiBiZSBwcm92aWRlZCB2aWEgdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW5zdGVhZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZ1xuJworICAgICAgICAgICInc3BlY2lhbCBhdHRyaWJ1dGVzLicgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gIgorICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnaW1wbGVtZW50YXRpb24gYW5kIGFyZSBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgVGhlaXIgJworICAgICAgICAgICdkZWZpbml0aW9uXG4nCisgICAgICAgICAgJ21heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ05vbmVcbicKKyAgICAgICAgICAnICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoICcKKyAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICcgICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSAiTm9uZSIuICcKKyAgICAgICAgICAnSXRcbicKKyAgICAgICAgICAnICAgaXMgdXNlZCB0byBzaWduaWZ5IHRoZSBhYnNlbmNlIG9mIGEgdmFsdWUgaW4gbWFueSBzaXR1YXRpb25zLCAnCisgICAgICAgICAgJ2UuZy4sXG4nCisgICAgICAgICAgIiAgIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhwbGljaXRseSByZXR1cm5cbiIKKyAgICAgICAgICAnICAgYW55dGhpbmcuIEl0cyB0cnV0aCB2YWx1ZSBpcyBmYWxzZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ05vdEltcGxlbWVudGVkXG4nCisgICAgICAgICAgJyAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWVcbicKKyAgICAgICAgICAnICAgIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kc1xuJworICAgICAgICAgICcgICBzaG91bGQgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgdGhlIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZVxuJworICAgICAgICAgICcgICByZWZsZWN0ZWQgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlXG4nCisgICAgICAgICAgJyAgIG9wZXJhdG9yLikgIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VlIEltcGxlbWVudGluZyB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGZvciBtb3JlIGRldGFpbHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdFbGxpcHNpc1xuJworICAgICAgICAgICcgICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBsaXRlcmFsICIuLi4iIG9yIHRoZVxuJworICAgICAgICAgICcgICBidWlsdC1pbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyJudW1iZXJzLk51bWJlciJcbicKKyAgICAgICAgICAnICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgIGFyaXRobWV0aWMgb3BlcmF0b3JzIGFuZCBhcml0aG1ldGljIGJ1aWx0LWluIGZ1bmN0aW9ucy4gICcKKyAgICAgICAgICAnTnVtZXJpY1xuJworICAgICAgICAgICcgICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuJworICAgICAgICAgICcgICBQeXRob24gbnVtYmVycyBhcmUgb2YgY291cnNlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbWF0aGVtYXRpY2FsXG4nCisgICAgICAgICAgJyAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgJworICAgICAgICAgICdyZXByZXNlbnRhdGlvblxuJworICAgICAgICAgICcgICBpbiBjb21wdXRlcnMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICBjb21wbGV4IG51bWJlcnM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAibnVtYmVycy5JbnRlZ3JhbCJcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgJworICAgICAgICAgICdpbnRlZ2Vyc1xuJworICAgICAgICAgICcgICAgICAocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgaW50ZWdlcnM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBJbnRlZ2VycyAoImludCIpXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiBhbiB1bmxpbWl0ZWQgcmFuZ2UsIHN1YmplY3QgdG9cbicKKyAgICAgICAgICAnICAgICAgICAgYXZhaWxhYmxlICh2aXJ0dWFsKSBtZW1vcnkgb25seS4gIEZvciB0aGUgcHVycG9zZSBvZiAnCisgICAgICAgICAgJ3NoaWZ0XG4nCisgICAgICAgICAgJyAgICAgICAgIGFuZCBtYXNrIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgIiAgICAgICAgIG5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGluIGEgdmFyaWFudCBvZiAyJ3NcbiIKKyAgICAgICAgICAnICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgICAgc2lnbiBiaXRzIGV4dGVuZGluZyB0byB0aGUgbGVmdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJvb2xlYW5zICgiYm9vbCIpXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZXNlIHJlcHJlc2VudCB0aGUgdHJ1dGggdmFsdWVzIEZhbHNlIGFuZCBUcnVlLiAgVGhlIHR3b1xuJworICAgICAgICAgICcgICAgICAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgICAgb25seSBCb29sZWFuIG9iamVjdHMuIFRoZSBCb29sZWFuIHR5cGUgaXMgYSBzdWJ0eXBlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgICAgIGludGVnZXIgdHlwZSwgYW5kIEJvb2xlYW4gdmFsdWVzIGJlaGF2ZSBsaWtlIHRoZSB2YWx1ZXMgMCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICAgICAxLCByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsIHRoZSBleGNlcHRpb24gJworICAgICAgICAgICdiZWluZ1xuJworICAgICAgICAgICcgICAgICAgICB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5ncyAiIkZhbHNlIiIgb3JcbicKKyAgICAgICAgICAnICAgICAgICAgIiJUcnVlIiIgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgcnVsZXMgZm9yIGludGVnZXIgcmVwcmVzZW50YXRpb24gYXJlIGludGVuZGVkIHRvIGdpdmUgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgaW52b2x2aW5nIG5lZ2F0aXZlIGludGVnZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuUmVhbCIgKCJmbG9hdCIpXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBtYWNoaW5lLWxldmVsIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgJworICAgICAgICAgICdwb2ludFxuJworICAgICAgICAgICcgICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4nCisgICAgICAgICAgJyAgICAgIGFyY2hpdGVjdHVyZSAoYW5kIEMgb3IgSmF2YSBpbXBsZW1lbnRhdGlvbikgZm9yIHRoZSBhY2NlcHRlZFxuJworICAgICAgICAgICcgICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0ICcKKyAgICAgICAgICAnc2luZ2xlLVxuJworICAgICAgICAgICcgICAgICBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlIHNhdmluZ3MgaW4gcHJvY2Vzc29yICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGFyZVxuJworICAgICAgICAgICcgICAgICBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28gdGhlcmUgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgJworICAgICAgICAgICdmbG9hdGluZ1xuJworICAgICAgICAgICcgICAgICBwb2ludCBudW1iZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuQ29tcGxleCIgKCJjb21wbGV4IilcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbFxuJworICAgICAgICAgICcgICAgICBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuICBUaGUgc2FtZSBjYXZlYXRzICcKKyAgICAgICAgICAnYXBwbHlcbicKKyAgICAgICAgICAnICAgICAgYXMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgJworICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgJyAgICAgIGNvbXBsZXggbnVtYmVyICJ6IiBjYW4gYmUgcmV0cmlldmVkIHRocm91Z2ggdGhlIHJlYWQtb25seVxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzICJ6LnJlYWwiIGFuZCAiei5pbWFnIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1NlcXVlbmNlc1xuJworICAgICAgICAgICcgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZVxuJworICAgICAgICAgICcgICBudW1iZXJzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIiByZXR1cm5zIHRoZSBudW1iZXIgb2YgJworICAgICAgICAgICdpdGVtc1xuJworICAgICAgICAgICcgICBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZSBpbmRleCAnCisgICAgICAgICAgJ3NldFxuJworICAgICAgICAgICcgICBjb250YWlucyB0aGUgbnVtYmVycyAwLCAxLCAuLi4sICpuKi0xLiAgSXRlbSAqaSogb2Ygc2VxdWVuY2UgKmEqICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgc2VsZWN0ZWQgYnkgImFbaV0iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiAiYVtpOmpdIiBzZWxlY3RzIGFsbCBpdGVtcyB3aXRoXG4nCisgICAgICAgICAgJyAgIGluZGV4ICprKiBzdWNoIHRoYXQgKmkqICI8PSIgKmsqICI8IiAqaiouICBXaGVuIHVzZWQgYXMgYW5cbicKKyAgICAgICAgICAnICAgZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzICcKKyAgICAgICAgICAnaW1wbGllc1xuJworICAgICAgICAgICcgICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0ICJleHRlbmRlZCBzbGljaW5nIiB3aXRoIGEgdGhpcmQgJworICAgICAgICAgICcic3RlcCJcbicKKyAgICAgICAgICAnICAgcGFyYW1ldGVyOiAiYVtpOmo6a10iIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KiAnCisgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgJyAgICJ4ID0gaSArIG4qayIsICpuKiAiPj0iICIwIiBhbmQgKmkqICI8PSIgKngqICI8IiAqaiouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBJbW11dGFibGUgc2VxdWVuY2VzXG4nCisgICAgICAgICAgJyAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBjcmVhdGVkLiAgKElmIHRoZSBvYmplY3QgY29udGFpbnMgcmVmZXJlbmNlcyB0byBvdGhlciAnCisgICAgICAgICAgJ29iamVjdHMsXG4nCisgICAgICAgICAgJyAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyAnCisgICAgICAgICAgJ2hvd2V2ZXIsXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiAnCisgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBvYmplY3QgY2Fubm90IGNoYW5nZS4pXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3RyaW5nc1xuJworICAgICAgICAgICcgICAgICAgICBBIHN0cmluZyBpcyBhIHNlcXVlbmNlIG9mIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBVbmljb2RlICcKKyAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICcgICAgICAgICBwb2ludHMuIEFsbCB0aGUgY29kZSBwb2ludHMgaW4gdGhlIHJhbmdlICJVKzAwMDAgLSAnCisgICAgICAgICAgJ1UrMTBGRkZGIlxuJworICAgICAgICAgICIgICAgICAgICBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gYSBzdHJpbmcuICBQeXRob24gZG9lc24ndCBoYXZlIGEgIgorICAgICAgICAgICciY2hhciJcbicKKyAgICAgICAgICAnICAgICAgICAgdHlwZTsgaW5zdGVhZCwgZXZlcnkgY29kZSBwb2ludCBpbiB0aGUgc3RyaW5nIGlzICcKKyAgICAgICAgICAncmVwcmVzZW50ZWRcbicKKyAgICAgICAgICAnICAgICAgICAgYXMgYSBzdHJpbmcgb2JqZWN0IHdpdGggbGVuZ3RoICIxIi4gIFRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgICAgICJvcmQoKSIgY29udmVydHMgYSBjb2RlIHBvaW50IGZyb20gaXRzIHN0cmluZyBmb3JtIHRvIGFuXG4nCisgICAgICAgICAgJyAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIjsgImNocigpIiBjb252ZXJ0cyBhblxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgJworICAgICAgICAgICdsZW5ndGhcbicKKyAgICAgICAgICAnICAgICAgICAgIjEiIHN0cmluZyBvYmplY3QuICJzdHIuZW5jb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgJworICAgICAgICAgICdhXG4nCisgICAgICAgICAgJyAgICAgICAgICJzdHIiIHRvICJieXRlcyIgdXNpbmcgdGhlIGdpdmVuIHRleHQgZW5jb2RpbmcsIGFuZFxuJworICAgICAgICAgICcgICAgICAgICAiYnl0ZXMuZGVjb2RlKCkiIGNhbiBiZSB1c2VkIHRvIGFjaGlldmUgdGhlIG9wcG9zaXRlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVHVwbGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgICAgIHR3byBvciBtb3JlIGl0ZW1zIGFyZSBmb3JtZWQgYnkgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mXG4nCisgICAgICAgICAgIiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSAnc2luZ2xldG9uJykgY2FuIGJlXG4iCisgICAgICAgICAgJyAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICAgICAgICBpdHNlbGYgZG9lcyBub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmVcbicKKyAgICAgICAgICAnICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gJworICAgICAgICAgICdiZVxuJworICAgICAgICAgICcgICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJ5dGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIEEgYnl0ZXMgb2JqZWN0IGlzIGFuIGltbXV0YWJsZSBhcnJheS4gIFRoZSBpdGVtcyBhcmUgJworICAgICAgICAgICc4LWJpdFxuJworICAgICAgICAgICcgICAgICAgICBieXRlcywgcmVwcmVzZW50ZWQgYnkgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgPD0geCA8IDI1Ni5cbicKKyAgICAgICAgICAnICAgICAgICAgQnl0ZXMgbGl0ZXJhbHMgKGxpa2UgImJcJ2FiY1wnIikgYW5kIHRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgICAgICJieXRlcygpIiBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYnl0ZXMgb2JqZWN0cy4gIEFsc28sXG4nCisgICAgICAgICAgJyAgICAgICAgIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8gc3RyaW5ncyB2aWEgdGhlICcKKyAgICAgICAgICAnImRlY29kZSgpIlxuJworICAgICAgICAgICcgICAgICAgICBtZXRob2QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBNdXRhYmxlIHNlcXVlbmNlc1xuJworICAgICAgICAgICcgICAgICBNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgJworICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAnICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0ICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgYXNzaWdubWVudCBhbmQgImRlbCIgKGRlbGV0ZSkgc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgTGlzdHNcbicKKyAgICAgICAgICAnICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnICAgICAgICAgZm9ybWVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJyAgICAgICAgIHNxdWFyZSBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyAnCisgICAgICAgICAgJ25lZWRlZFxuJworICAgICAgICAgICcgICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgQnl0ZSBBcnJheXNcbicKKyAgICAgICAgICAnICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBidWlsdC1pbiAiYnl0ZWFycmF5KCkiIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuJworICAgICAgICAgICcgICAgICAgICBtdXRhYmxlIChhbmQgaGVuY2UgdW5oYXNoYWJsZSksIGJ5dGUgYXJyYXlzIG90aGVyd2lzZSAnCisgICAgICAgICAgJ3Byb3ZpZGVcbicKKyAgICAgICAgICAnICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuJworICAgICAgICAgICcgICAgICAgICBvYmplY3RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgImFycmF5IiBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgJworICAgICAgICAgICdvZiBhXG4nCisgICAgICAgICAgJyAgICAgIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgYXMgZG9lcyB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTZXQgdHlwZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgb2JqZWN0cy4gQXMgc3VjaCwgdGhleSBjYW5ub3QgYmUgaW5kZXhlZCBieSBhbnkgc3Vic2NyaXB0LiAnCisgICAgICAgICAgJ0hvd2V2ZXIsXG4nCisgICAgICAgICAgJyAgIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIlxuJworICAgICAgICAgICcgICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSAnCisgICAgICAgICAgJ2Zhc3RcbicKKyAgICAgICAgICAnICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4nCisgICAgICAgICAgJyAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4nCisgICAgICAgICAgJyAgIGRpZmZlcmVuY2UsIGFuZCBzeW1tZXRyaWMgZGlmZmVyZW5jZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbicKKyAgICAgICAgICAnICAgZGljdGlvbmFyeSBrZXlzLiBOb3RlIHRoYXQgbnVtZXJpYyB0eXBlcyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kXG4nCisgICAgICAgICAgJyAgICIxLjAiKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIHNldCB0eXBlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNldHNcbicKKyAgICAgICAgICAnICAgICAgVGhlc2UgcmVwcmVzZW50IGEgbXV0YWJsZSBzZXQuIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlICcKKyAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAnICAgICAgInNldCgpIiBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgJworICAgICAgICAgICdzZXZlcmFsXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZHMsIHN1Y2ggYXMgImFkZCgpIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZyb3plbiBzZXRzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBhbiBpbW11dGFibGUgc2V0LiAgVGhleSBhcmUgY3JlYXRlZCBieSB0aGVcbicKKyAgICAgICAgICAnICAgICAgYnVpbHQtaW4gImZyb3plbnNldCgpIiBjb25zdHJ1Y3Rvci4gIEFzIGEgZnJvemVuc2V0IGlzICcKKyAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mICcKKyAgICAgICAgICAnYW5vdGhlclxuJworICAgICAgICAgICcgICAgICBzZXQsIG9yIGFzIGEgZGljdGlvbmFyeSBrZXkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdNYXBwaW5nc1xuJworICAgICAgICAgICcgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IGFyYml0cmFyeSAnCisgICAgICAgICAgJ2luZGV4XG4nCisgICAgICAgICAgJyAgIHNldHMuIFRoZSBzdWJzY3JpcHQgbm90YXRpb24gImFba10iIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieSAnCisgICAgICAgICAgJyJrIlxuJworICAgICAgICAgICcgICBmcm9tIHRoZSBtYXBwaW5nICJhIjsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmQgYXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgdGFyZ2V0IG9mIGFzc2lnbm1lbnRzIG9yICJkZWwiIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgRGljdGlvbmFyaWVzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgbmVhcmx5XG4nCisgICAgICAgICAgJyAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgJworICAgICAgICAgICdhc1xuJworICAgICAgICAgICcgICAgICBrZXlzIGFyZSB2YWx1ZXMgY29udGFpbmluZyBsaXN0cyBvciBkaWN0aW9uYXJpZXMgb3Igb3RoZXJcbicKKyAgICAgICAgICAnICAgICAgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZyB0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICIgICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXkncyBoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC5cbiIKKyAgICAgICAgICAnICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgJworICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgJyAgICAgIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sICIxIiBhbmQgJworICAgICAgICAgICciMS4wIilcbicKKyAgICAgICAgICAnICAgICAgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuJworICAgICAgICAgICcgICAgICBkaWN0aW9uYXJ5IGVudHJ5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSAiey4uLn0iXG4nCisgICAgICAgICAgJyAgICAgIG5vdGF0aW9uIChzZWUgc2VjdGlvbiBEaWN0aW9uYXJ5IGRpc3BsYXlzKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlcyAiZGJtLm5kYm0iIGFuZCAiZGJtLmdudSIgcHJvdmlkZVxuJworICAgICAgICAgICcgICAgICBhZGRpdGlvbmFsIGV4YW1wbGVzIG9mIG1hcHBpbmcgdHlwZXMsIGFzIGRvZXMgdGhlICcKKyAgICAgICAgICAnImNvbGxlY3Rpb25zIlxuJworICAgICAgICAgICcgICAgICBtb2R1bGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDYWxsYWJsZSB0eXBlc1xuJworICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlXG4nCisgICAgICAgICAgJyAgIHNlY3Rpb24gQ2FsbHMpIGNhbiBiZSBhcHBsaWVkOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVXNlci1kZWZpbmVkIGZ1bmN0aW9uc1xuJworICAgICAgICAgICcgICAgICBBIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uIEZ1bmN0aW9uIGRlZmluaXRpb25zKS4gIEl0IHNob3VsZCBiZVxuJworICAgICAgICAgICcgICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mICcKKyAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAiICAgICAgYXMgdGhlIGZ1bmN0aW9uJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuIgorICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCBhdHRyaWJ1dGVzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19kb2NfXyIgICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzICcKKyAgICAgICAgICAnZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3RyaW5nLCBvciAiTm9uZSIgaWYgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZTsgbm90IGluaGVyaXRlZCBieSAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN1YmNsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX25hbWVfXyIgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgJworICAgICAgICAgICduYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fcXVhbG5hbWVfXyIgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAqcXVhbGlmaWVkICcKKyAgICAgICAgICAnbmFtZSogfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBpbiB2ZXJzaW9uIDMuMy4gICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX21vZHVsZV9fIiAgICAgICAgICAgICAgfCBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZGVmYXVsdHNfXyIgICAgICAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnQgdmFsdWVzIGZvciB0aG9zZSAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudHMgdGhhdCBoYXZlIGRlZmF1bHRzLCAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yICJOb25lIiBpZiBubyBhcmd1bWVudHMgaGF2ZSAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fY29kZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uIGJvZHkuICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZ2xvYmFsc19fIiAgICAgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgJworICAgICAgICAgICd8IFJlYWQtb25seSAgIHxcbicKKyAgICAgICAgICAiICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhhdCBob2xkcyB0aGUgZnVuY3Rpb24ncyAgICAgICAiCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBnbG9iYWwgdmFyaWFibGVzIC0tLSB0aGUgZ2xvYmFsICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZGljdF9fIiAgICAgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJiaXRyYXJ5IGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fY2xvc3VyZV9fIiAgICAgICAgICAgICB8ICJOb25lIiBvciBhIHR1cGxlIG9mIGNlbGxzIHRoYXQgJworICAgICAgICAgICd8IFJlYWQtb25seSAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICIgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbidzIGZyZWUgdmFyaWFibGVzLiAgICAgICIKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19hbm5vdGF0aW9uc19fIiAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGtleXMgb2YgdGhlICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpY3QgYXJlIHRoZSBwYXJhbWV0ZXIgbmFtZXMsICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYW5kICJcJ3JldHVyblwnIiBmb3IgdGhlICcKKyAgICAgICAgICAncmV0dXJuICAgfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFubm90YXRpb24sIGlmIHByb3ZpZGVkLiAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2t3ZGVmYXVsdHNfXyIgICAgICAgICAgfCBBIGRpY3QgY29udGFpbmluZyBkZWZhdWx0cyBmb3IgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmQtb25seSBwYXJhbWV0ZXJzLiAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgTW9zdCBvZiB0aGUgYXR0cmlidXRlcyBsYWJlbGxlZCAiV3JpdGFibGUiIGNoZWNrIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGFzc2lnbmVkIHZhbHVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAgYXR0cmlidXRlcywgd2hpY2ggY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBhdHRhY2ggJworICAgICAgICAgICdtZXRhZGF0YVxuJworICAgICAgICAgICcgICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgICAgc2V0IHN1Y2ggYXR0cmlidXRlcy4gKk5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAnCisgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAnICAgICAgc3VwcG9ydHMgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAnCisgICAgICAgICAgJ0Z1bmN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1dHVyZS4qXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb24ncyBkZWZpbml0aW9uIGNhbiBiZVxuIgorICAgICAgICAgICcgICAgICByZXRyaWV2ZWQgZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgJworICAgICAgICAgICdpbnRlcm5hbFxuJworICAgICAgICAgICcgICAgICB0eXBlcyBiZWxvdy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEluc3RhbmNlIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgICAgQW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIGFueSBjYWxsYWJsZSBvYmplY3QgKG5vcm1hbGx5IGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uKS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJfX3NlbGZfXyIgaXMgdGhlIGNsYXNzICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCAiX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBvYmplY3Q7ICJfX2RvY19fIiBpcyB0aGVcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kXCdzIGRvY3VtZW50YXRpb24gKHNhbWUgYXMgIl9fZnVuY19fLl9fZG9jX18iKTsgJworICAgICAgICAgICciX19uYW1lX18iXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBtZXRob2QgbmFtZSAoc2FtZSBhcyAiX19mdW5jX18uX19uYW1lX18iKTsgJworICAgICAgICAgICciX19tb2R1bGVfXyJcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCBvciAnCisgICAgICAgICAgJyJOb25lIlxuJworICAgICAgICAgICcgICAgICBpZiB1bmF2YWlsYWJsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgJworICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBVc2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdHMgbWF5IGJlIGNyZWF0ZWQgd2hlbiBnZXR0aW5nIGFuXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZSBvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICB0aGF0IGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3Qgb3IgYSBjbGFzc1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhICcKKyAgICAgICAgICAndXNlci1cbicKKyAgICAgICAgICAnICAgICAgZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzICcKKyAgICAgICAgICAnaW5zdGFuY2VzLFxuJworICAgICAgICAgICcgICAgICBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpcyBzYWlkIHRvIGJlIGJvdW5kLiAgVGhlIG5ldyBtZXRob2RcJ3MgIl9fZnVuY19fIiBhdHRyaWJ1dGUgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuJworICAgICAgICAgICcgICAgICBhbm90aGVyIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCB0aGUgYmVoYXZpb3VyICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgJworICAgICAgICAgICciX19mdW5jX18iXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIGJ1dCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgJworICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgaXRzICJfX3NlbGZfXyIgJworICAgICAgICAgICdhdHRyaWJ1dGVcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIGl0cyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpcyB0aGVcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZSB1bmRlcmx5aW5nXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uICgiX19mdW5jX18iKSBpcyBjYWxsZWQsIGluc2VydGluZyB0aGUgY2xhc3MgJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAgICAoIl9fc2VsZl9fIikgaW4gZnJvbnQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuICBGb3IgaW5zdGFuY2UsICcKKyAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICcgICAgICAiQyIgaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gJworICAgICAgICAgICciZigpIixcbicKKyAgICAgICAgICAnICAgICAgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiAiQyIsIGNhbGxpbmcgInguZigxKSIgaXMgZXF1aXZhbGVudCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJyAgICAgIGNhbGxpbmcgIkMuZih4LCAxKSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgJworICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCB0aGUgImNsYXNzIGluc3RhbmNlIiBzdG9yZWQgaW4gIl9fc2VsZl9fIiB3aWxsICcKKyAgICAgICAgICAnYWN0dWFsbHlcbicKKyAgICAgICAgICAnICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciAieC5mKDEpIiBvciAnCisgICAgICAgICAgJyJDLmYoMSkiXG4nCisgICAgICAgICAgJyAgICAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAiZihDLDEpIiB3aGVyZSAiZiIgaXMgdGhlICcKKyAgICAgICAgICAndW5kZXJseWluZ1xuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtYXRpb24gZnJvbSBmdW5jdGlvbiBvYmplY3QgdG8gJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkICcKKyAgICAgICAgICAnZnJvbVxuJworICAgICAgICAgICcgICAgICB0aGUgaW5zdGFuY2UuICBJbiBzb21lIGNhc2VzLCBhIGZydWl0ZnVsIG9wdGltaXphdGlvbiBpcyB0b1xuJworICAgICAgICAgICcgICAgICBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWxcbicKKyAgICAgICAgICAnICAgICAgdmFyaWFibGUuIEFsc28gbm90aWNlIHRoYXQgdGhpcyB0cmFuc2Zvcm1hdGlvbiBvbmx5IGhhcHBlbnMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgICAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0cyAoYW5kIGFsbCBub24tXG4nCisgICAgICAgICAgJyAgICAgIGNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dCB0cmFuc2Zvcm1hdGlvbi4gIEl0ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgd2hpY2ggYXJlXG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90IGNvbnZlcnRlZCB0byBib3VuZFxuJworICAgICAgICAgICcgICAgICBtZXRob2RzOyB0aGlzICpvbmx5KiBoYXBwZW5zIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGFuICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyAgICAgIG9mIHRoZSBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEdlbmVyYXRvciBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgInlpZWxkIiBzdGF0ZW1lbnQgKHNlZVxuJworICAgICAgICAgICcgICAgICBzZWN0aW9uIFRoZSB5aWVsZCBzdGF0ZW1lbnQpIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgJworICAgICAgICAgICdmdW5jdGlvbiouXG4nCisgICAgICAgICAgJyAgICAgIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIGFsd2F5cyByZXR1cm5zIGFuIGl0ZXJhdG9yICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgJworICAgICAgICAgICdjYWxsaW5nXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBpdGVyYXRvclwncyAiaXRlcmF0b3IuX19uZXh0X18oKSIgbWV0aG9kIHdpbGwgY2F1c2UgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgdW50aWwgaXQgcHJvdmlkZXMgYSB2YWx1ZSB1c2luZyB0aGUgJworICAgICAgICAgICcieWllbGQiXG4nCisgICAgICAgICAgJyAgICAgIHN0YXRlbWVudC4gIFdoZW4gdGhlIGZ1bmN0aW9uIGV4ZWN1dGVzIGEgInJldHVybiIgc3RhdGVtZW50ICcKKyAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAnICAgICAgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gJworICAgICAgICAgICdiZVxuJworICAgICAgICAgICcgICAgICByZXR1cm5lZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENvcm91dGluZSBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggaXMgZGVmaW5lZCB1c2luZyAiYXN5bmMgZGVmIiBpc1xuJworICAgICAgICAgICcgICAgICBjYWxsZWQgYSAqY29yb3V0aW5lIGZ1bmN0aW9uKi4gIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiAnCisgICAgICAgICAgJ2NhbGxlZCxcbicKKyAgICAgICAgICAnICAgICAgcmV0dXJucyBhICpjb3JvdXRpbmUqIG9iamVjdC4gIEl0IG1heSBjb250YWluICJhd2FpdCJcbicKKyAgICAgICAgICAnICAgICAgZXhwcmVzc2lvbnMsIGFzIHdlbGwgYXMgImFzeW5jIHdpdGgiIGFuZCAiYXN5bmMgZm9yIiAnCisgICAgICAgICAgJ3N0YXRlbWVudHMuXG4nCisgICAgICAgICAgJyAgICAgIFNlZSBhbHNvIHRoZSBDb3JvdXRpbmUgT2JqZWN0cyBzZWN0aW9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQnVpbHQtaW4gZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuJworICAgICAgICAgICcgICAgICBFeGFtcGxlcyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYXJlICJsZW4oKSIgYW5kICJtYXRoLnNpbigpIlxuJworICAgICAgICAgICcgICAgICAoIm1hdGgiIGlzIGEgc3RhbmRhcmQgYnVpbHQtaW4gbW9kdWxlKS4gVGhlIG51bWJlciBhbmQgdHlwZSAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBhcmd1bWVudHMgYXJlIGRldGVybWluZWQgYnkgdGhlIEMgZnVuY3Rpb24uIFNwZWNpYWwgJworICAgICAgICAgICdyZWFkLVxuJworICAgICAgICAgICcgICAgICBvbmx5IGF0dHJpYnV0ZXM6ICJfX2RvY19fIiBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuJworICAgICAgICAgICcgICAgICBzdHJpbmcsIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZTsgIl9fbmFtZV9fIiBpcyB0aGUgJworICAgICAgICAgICJmdW5jdGlvbidzXG4iCisgICAgICAgICAgJyAgICAgIG5hbWU7ICJfX3NlbGZfXyIgaXMgc2V0IHRvICJOb25lIiAoYnV0IHNlZSB0aGUgbmV4dCBpdGVtKTtcbicKKyAgICAgICAgICAnICAgICAgIl9fbW9kdWxlX18iIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIGZ1bmN0aW9uIHdhcyAnCisgICAgICAgICAgJ2RlZmluZWRcbicKKyAgICAgICAgICAnICAgICAgaW4gb3IgIk5vbmUiIGlmIHVuYXZhaWxhYmxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQnVpbHQtaW4gbWV0aG9kc1xuJworICAgICAgICAgICcgICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbicKKyAgICAgICAgICAnICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4nCisgICAgICAgICAgJyAgICAgICJhbGlzdC5hcHBlbmQoKSIsIGFzc3VtaW5nICphbGlzdCogaXMgYSBsaXN0IG9iamVjdC4gSW4gdGhpc1xuJworICAgICAgICAgICcgICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlICJfX3NlbGZfXyIgaXMgc2V0IHRvICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBkZW5vdGVkIGJ5ICphbGlzdCouXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDbGFzc2VzXG4nCisgICAgICAgICAgJyAgICAgIENsYXNzZXMgYXJlIGNhbGxhYmxlLiAgVGhlc2Ugb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgJworICAgICAgICAgICdmYWN0b3JpZXNcbicKKyAgICAgICAgICAnICAgICAgZm9yIG5ldyBpbnN0YW5jZXMgb2YgdGhlbXNlbHZlcywgYnV0IHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgICAgIGNsYXNzIHR5cGVzIHRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZVxuJworICAgICAgICAgICcgICAgICBjYWxsIGFyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0b1xuJworICAgICAgICAgICcgICAgICAiX19pbml0X18oKSIgdG8gaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3MgSW5zdGFuY2VzXG4nCisgICAgICAgICAgJyAgICAgIEluc3RhbmNlcyBvZiBhcmJpdHJhcnkgY2xhc3NlcyBjYW4gYmUgbWFkZSBjYWxsYWJsZSBieSAnCisgICAgICAgICAgJ2RlZmluaW5nXG4nCisgICAgICAgICAgJyAgICAgIGEgIl9fY2FsbF9fKCkiIG1ldGhvZCBpbiB0aGVpciBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ01vZHVsZXNcbicKKyAgICAgICAgICAnICAgTW9kdWxlcyBhcmUgYSBiYXNpYyBvcmdhbml6YXRpb25hbCB1bml0IG9mIFB5dGhvbiBjb2RlLCBhbmQgYXJlXG4nCisgICAgICAgICAgJyAgIGNyZWF0ZWQgYnkgdGhlIGltcG9ydCBzeXN0ZW0gYXMgaW52b2tlZCBlaXRoZXIgYnkgdGhlICJpbXBvcnQiXG4nCisgICAgICAgICAgJyAgIHN0YXRlbWVudCAoc2VlICJpbXBvcnQiKSwgb3IgYnkgY2FsbGluZyBmdW5jdGlvbnMgc3VjaCBhc1xuJworICAgICAgICAgICcgICAiaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgYW5kIGJ1aWx0LWluICJfX2ltcG9ydF9fKCkiLiAgQSAnCisgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICcgICBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QgKHRoaXMgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZSAiX19nbG9iYWxzX18iIGF0dHJpYnV0ZSBvZlxuJworICAgICAgICAgICcgICBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlKS4gIEF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZVxuJworICAgICAgICAgICcgICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyAnCisgICAgICAgICAgJ2VxdWl2YWxlbnRcbicKKyAgICAgICAgICAnICAgdG8gIm0uX19kaWN0X19bIngiXSIuIEEgbW9kdWxlIG9iamVjdCBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlXG4nCisgICAgICAgICAgIiAgIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSAoc2luY2UgaXQgaXNuJ3QgbmVlZGVkICIKKyAgICAgICAgICAnb25jZVxuJworICAgICAgICAgICcgICB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICBBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGUncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiIKKyAgICAgICAgICAnICAgZS5nLiwgIm0ueCA9IDEiIGlzIGVxdWl2YWxlbnQgdG8gIm0uX19kaWN0X19bIngiXSA9IDEiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGVcJ3MgJworICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAnICAgYXMgYSBkaWN0aW9uYXJ5IG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQmVjYXVzZSBvZiB0aGUgd2F5IENQeXRob25cbicKKyAgICAgICAgICAnICAgY2xlYXJzIG1vZHVsZSBkaWN0aW9uYXJpZXMsIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB3aWxsIGJlICcKKyAgICAgICAgICAnY2xlYXJlZFxuJworICAgICAgICAgICcgICB3aGVuIHRoZSBtb2R1bGUgZmFsbHMgb3V0IG9mIHNjb3BlIGV2ZW4gaWYgdGhlIGRpY3Rpb25hcnkgc3RpbGwgJworICAgICAgICAgICdoYXNcbicKKyAgICAgICAgICAnICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIG1vZHVsZSBhcm91bmQgd2hpbGUgdXNpbmcgaXRzIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBQcmVkZWZpbmVkICh3cml0YWJsZSkgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgbW9kdWxlXCdzICcKKyAgICAgICAgICAnbmFtZTtcbicKKyAgICAgICAgICAnICAgIl9fZG9jX18iIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZlxuJworICAgICAgICAgICcgICB1bmF2YWlsYWJsZTsgIl9fZmlsZV9fIiBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlICJfX2ZpbGVfXyJcbicKKyAgICAgICAgICAnICAgYXR0cmlidXRlIG1heSBiZSBtaXNzaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mIG1vZHVsZXMsIHN1Y2ggYXMgJworICAgICAgICAgICdDXG4nCisgICAgICAgICAgJyAgIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvclxuJworICAgICAgICAgICcgICBleHRlbnNpb24gbW9kdWxlcyBsb2FkZWQgZHluYW1pY2FsbHkgZnJvbSBhIHNoYXJlZCBsaWJyYXJ5LCBpdCAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0N1c3RvbSBjbGFzc2VzXG4nCisgICAgICAgICAgJyAgIEN1c3RvbSBjbGFzcyB0eXBlcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnMgJworICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgJyAgIHNlY3Rpb24gQ2xhc3MgZGVmaW5pdGlvbnMpLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZCAnCisgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgJyAgIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAiQy54IiBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgJyAgICJDLl9fZGljdF9fWyJ4Il0iIChhbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggJworICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICcgICBmb3Igb3RoZXIgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgbm90IGZvdW5kIHRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2VcbicKKyAgICAgICAgICAnICAgY2xhc3Nlcy4gVGhpcyBzZWFyY2ggb2YgdGhlIGJhc2UgY2xhc3NlcyB1c2VzIHRoZSBDMyBtZXRob2RcbicKKyAgICAgICAgICAnICAgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseSBldmVuIGluIHRoZSBwcmVzZW5jZSAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgIiAgICdkaWFtb25kJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZVxuIgorICAgICAgICAgICcgICBpbmhlcml0YW5jZSBwYXRocyBsZWFkaW5nIGJhY2sgdG8gYSBjb21tb24gYW5jZXN0b3IuIEFkZGl0aW9uYWxcbicKKyAgICAgICAgICAnICAgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGVcbicKKyAgICAgICAgICAnICAgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuMyByZWxlYXNlIGF0XG4nCisgICAgICAgICAgJyAgIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBXaGVuIGEgY2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZSAoZm9yIGNsYXNzICJDIiwgc2F5KSB3b3VsZCAnCisgICAgICAgICAgJ3lpZWxkIGFcbicKKyAgICAgICAgICAnICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2RcbicKKyAgICAgICAgICAnICAgb2JqZWN0IHdob3NlICJfX3NlbGZfXyIgYXR0cmlidXRlcyBpcyAiQyIuICBXaGVuIGl0IHdvdWxkIHlpZWxkICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICcgICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICB0aGUgc3RhdGljIG1ldGhvZCBvYmplY3QuIFNlZSBzZWN0aW9uIEltcGxlbWVudGluZyBEZXNjcmlwdG9ycyAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICcgICBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5ICcKKyAgICAgICAgICAnZGlmZmVyXG4nCisgICAgICAgICAgJyAgIGZyb20gdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyAiX19kaWN0X18iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3MncyBkaWN0aW9uYXJ5LCAiCisgICAgICAgICAgJ25ldmVyXG4nCisgICAgICAgICAgJyAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyAnCisgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgJyAgIChzZWUgYmVsb3cpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19uYW1lX18iIGlzIHRoZSBjbGFzcyBuYW1lOyAiX19tb2R1bGVfXyIgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyAiX19kaWN0X18iIGlzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY2xhc3NcJ3MgbmFtZXNwYWNlOyAiX19iYXNlc19fIiBpcyBhICcKKyAgICAgICAgICAndHVwbGVcbicKKyAgICAgICAgICAnICAgKHBvc3NpYmx5IGVtcHR5IG9yIGEgc2luZ2xldG9uKSBjb250YWluaW5nIHRoZSBiYXNlIGNsYXNzZXMsIGluICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDsgIl9fZG9jX18iIGlzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgIiAgIGNsYXNzJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLlxuIgorICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2xhc3MgaW5zdGFuY2VzXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgJworICAgICAgICAgICdhYm92ZSkuXG4nCisgICAgICAgICAgJyAgIEEgY2xhc3MgaW5zdGFuY2UgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGFzIGEgZGljdGlvbmFyeSAnCisgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgJyAgIGlzIHRoZSBmaXJzdCBwbGFjZSBpbiB3aGljaCBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgc2VhcmNoZWQuXG4nCisgICAgICAgICAgIiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZSdzIGNsYXNzICIKKyAgICAgICAgICAnaGFzXG4nCisgICAgICAgICAgJyAgIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzXG4nCisgICAgICAgICAgJyAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgJworICAgICAgICAgICd1c2VyLWRlZmluZWRcbicKKyAgICAgICAgICAnICAgZnVuY3Rpb24gb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGFuIGluc3RhbmNlIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZSBpcyB0aGUgaW5zdGFuY2UuICBTdGF0aWMgbWV0aG9kIGFuZFxuJworICAgICAgICAgICcgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzbyB0cmFuc2Zvcm1lZDsgc2VlIGFib3ZlIHVuZGVyXG4nCisgICAgICAgICAgJyAgICJDbGFzc2VzIi4gIFNlZSBzZWN0aW9uIEltcGxlbWVudGluZyBEZXNjcmlwdG9ycyBmb3IgYW5vdGhlciB3YXkgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICB3aGljaCBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgcmV0cmlldmVkIHZpYSBpdHMgaW5zdGFuY2VzIG1heSAnCisgICAgICAgICAgJ2RpZmZlclxuJworICAgICAgICAgICcgICBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3NcJ3MgIl9fZGljdF9fIi4gIElmICcKKyAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAiICAgY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kLCBhbmQgdGhlIG9iamVjdCdzIGNsYXNzIGhhcyBhXG4iCisgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50cyBhbmQgZGVsZXRpb25zIHVwZGF0ZSB0aGUgaW5zdGFuY2Unc1xuIgorICAgICAgICAgICIgICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzJ3MgZGljdGlvbmFyeS4gIElmIHRoZSBjbGFzcyBoYXMgYVxuIgorICAgICAgICAgICcgICAiX19zZXRhdHRyX18oKSIgb3IgIl9fZGVsYXR0cl9fKCkiIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgJworICAgICAgICAgICdpbnN0ZWFkXG4nCisgICAgICAgICAgJyAgIG9mIHVwZGF0aW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3MgaW5zdGFuY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIG51bWJlcnMsIHNlcXVlbmNlcywgb3IgJworICAgICAgICAgICdtYXBwaW5nc1xuJworICAgICAgICAgICcgICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgbWV0aG9kIG5hbWVzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiAiX19kaWN0X18iIGlzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeTtcbicKKyAgICAgICAgICAnICAgIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSS9PIG9iamVjdHMgKGFsc28ga25vd24gYXMgZmlsZSBvYmplY3RzKVxuJworICAgICAgICAgICcgICBBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmVcbicKKyAgICAgICAgICAnICAgYXZhaWxhYmxlIHRvIGNyZWF0ZSBmaWxlIG9iamVjdHM6IHRoZSAib3BlbigpIiBidWlsdC1pbiAnCisgICAgICAgICAgJ2Z1bmN0aW9uLFxuJworICAgICAgICAgICcgICBhbmQgYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiICcKKyAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgJyAgIG9mIHNvY2tldCBvYmplY3RzIChhbmQgcGVyaGFwcyBieSBvdGhlciBmdW5jdGlvbnMgb3IgbWV0aG9kc1xuJworICAgICAgICAgICcgICBwcm92aWRlZCBieSBleHRlbnNpb24gbW9kdWxlcykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUaGUgb2JqZWN0cyAic3lzLnN0ZGluIiwgInN5cy5zdGRvdXQiIGFuZCAic3lzLnN0ZGVyciIgYXJlXG4nCisgICAgICAgICAgIiAgIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcnByZXRlcidzXG4iCisgICAgICAgICAgJyAgIHN0YW5kYXJkIGlucHV0LCBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXM7IHRoZXkgYXJlIGFsbCBvcGVuIGluICcKKyAgICAgICAgICAndGV4dFxuJworICAgICAgICAgICcgICBtb2RlIGFuZCB0aGVyZWZvcmUgZm9sbG93IHRoZSBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGVcbicKKyAgICAgICAgICAnICAgImlvLlRleHRJT0Jhc2UiIGFic3RyYWN0IGNsYXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSW50ZXJuYWwgdHlwZXNcbicKKyAgICAgICAgICAnICAgQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICB1c2VyLiBUaGVpciBkZWZpbml0aW9ucyBtYXkgY2hhbmdlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIHRoZVxuJworICAgICAgICAgICcgICBpbnRlcnByZXRlciwgYnV0IHRoZXkgYXJlIG1lbnRpb25lZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDb2RlIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgQ29kZSBvYmplY3RzIHJlcHJlc2VudCAqYnl0ZS1jb21waWxlZCogZXhlY3V0YWJsZSBQeXRob24gJworICAgICAgICAgICdjb2RlLFxuJworICAgICAgICAgICcgICAgICBvciAqYnl0ZWNvZGUqLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgY29kZSBvYmplY3QgYW5kIGFcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiAnCisgICAgICAgICAgJ2V4cGxpY2l0XG4nCisgICAgICAgICAgIiAgICAgIHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24ncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0ICIKKyAgICAgICAgICAnd2FzXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluZWQpLCB3aGlsZSBhIGNvZGUgb2JqZWN0IGNvbnRhaW5zIG5vIGNvbnRleHQ7IGFsc28gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgJworICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAnICAgICAgaW4gdGhlIGNvZGUgb2JqZWN0IChiZWNhdXNlIHRoZXkgcmVwcmVzZW50IHZhbHVlcyBjYWxjdWxhdGVkICcKKyAgICAgICAgICAnYXRcbicKKyAgICAgICAgICAnICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgJworICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgICAgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gJworICAgICAgICAgICdtdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiY29fbmFtZSIgZ2l2ZXMgdGhlIGZ1bmN0aW9uICcKKyAgICAgICAgICAnbmFtZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX2FyZ2NvdW50IiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzICcKKyAgICAgICAgICAnKGluY2x1ZGluZ1xuJworICAgICAgICAgICcgICAgICBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7ICJjb19ubG9jYWxzIiBpcyB0aGUgbnVtYmVyICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgYXJndW1lbnRzKTtcbicKKyAgICAgICAgICAnICAgICAgImNvX3Zhcm5hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBsb2NhbFxuJworICAgICAgICAgICcgICAgICB2YXJpYWJsZXMgKHN0YXJ0aW5nIHdpdGggdGhlIGFyZ3VtZW50IG5hbWVzKTsgImNvX2NlbGx2YXJzIiAnCisgICAgICAgICAgJ2lzIGFcbicKKyAgICAgICAgICAnICAgICAgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWwgdmFyaWFibGVzIHRoYXQgYXJlXG4nCisgICAgICAgICAgJyAgICAgIHJlZmVyZW5jZWQgYnkgbmVzdGVkIGZ1bmN0aW9uczsgImNvX2ZyZWV2YXJzIiBpcyBhIHR1cGxlXG4nCisgICAgICAgICAgJyAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWUgdmFyaWFibGVzOyAiY29fY29kZSIgaXMgYSAnCisgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICcgICAgICByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIG9mIGJ5dGVjb2RlIGluc3RydWN0aW9uczsgJworICAgICAgICAgICciY29fY29uc3RzIlxuJworICAgICAgICAgICcgICAgICBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGxpdGVyYWxzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlO1xuJworICAgICAgICAgICcgICAgICAiY29fbmFtZXMiIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieSB0aGUgJworICAgICAgICAgICdieXRlY29kZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX2ZpbGVuYW1lIiBpcyB0aGUgZmlsZW5hbWUgZnJvbSB3aGljaCB0aGUgY29kZSB3YXMgJworICAgICAgICAgICdjb21waWxlZDtcbicKKyAgICAgICAgICAnICAgICAgImNvX2ZpcnN0bGluZW5vIiBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuJworICAgICAgICAgICcgICAgICAiY29fbG5vdGFiIiBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4nCisgICAgICAgICAgJyAgICAgIG9mZnNldHMgdG8gbGluZSBudW1iZXJzIChmb3IgZGV0YWlscyBzZWUgdGhlIHNvdXJjZSBjb2RlIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIGludGVycHJldGVyKTsgImNvX3N0YWNrc2l6ZSIgaXMgdGhlIHJlcXVpcmVkIHN0YWNrIHNpemVcbicKKyAgICAgICAgICAnICAgICAgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZXMpOyAiY29fZmxhZ3MiIGlzIGFuIGludGVnZXIgJworICAgICAgICAgICdlbmNvZGluZyBhXG4nCisgICAgICAgICAgJyAgICAgIG51bWJlciBvZiBmbGFncyBmb3IgdGhlIGludGVycHJldGVyLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yICJjb19mbGFncyI6IGJpdCAnCisgICAgICAgICAgJyIweDA0IlxuJworICAgICAgICAgICcgICAgICBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqYXJndW1lbnRzIiBzeW50YXggdG8gYWNjZXB0ICcKKyAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAnICAgICAgYXJiaXRyYXJ5IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0ICIweDA4IiBpcyBzZXQgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIioqa2V5d29yZHMiIHN5bnRheCB0byBhY2NlcHQgJworICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAnICAgICAga2V5d29yZCBhcmd1bWVudHM7IGJpdCAiMHgyMCIgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiBpcyBhXG4nCisgICAgICAgICAgJyAgICAgIGdlbmVyYXRvci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZ1dHVyZSBmZWF0dXJlIGRlY2xhcmF0aW9ucyAoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgJworICAgICAgICAgICdkaXZpc2lvbiIpXG4nCisgICAgICAgICAgJyAgICAgIGFsc28gdXNlIGJpdHMgaW4gImNvX2ZsYWdzIiB0byBpbmRpY2F0ZSB3aGV0aGVyIGEgY29kZSAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgIjB4MjAwMCIgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICAgICBzZXQgaWYgdGhlIGZ1bmN0aW9uIHdhcyBjb21waWxlZCB3aXRoIGZ1dHVyZSBkaXZpc2lvbiAnCisgICAgICAgICAgJ2VuYWJsZWQ7XG4nCisgICAgICAgICAgJyAgICAgIGJpdHMgIjB4MTAiIGFuZCAiMHgxMDAwIiB3ZXJlIHVzZWQgaW4gZWFybGllciB2ZXJzaW9ucyBvZlxuJworICAgICAgICAgICcgICAgICBQeXRob24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBPdGhlciBiaXRzIGluICJjb19mbGFncyIgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbicKKyAgICAgICAgICAnICAgICAgImNvX2NvbnN0cyIgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbicKKyAgICAgICAgICAnICAgICAgIk5vbmUiIGlmIHVuZGVmaW5lZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEZyYW1lIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgRnJhbWUgb2JqZWN0cyByZXByZXNlbnQgZXhlY3V0aW9uIGZyYW1lcy4gIFRoZXkgbWF5IG9jY3VyIGluXG4nCisgICAgICAgICAgJyAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImZfYmFjayIgaXMgdG8gdGhlIHByZXZpb3VzICcKKyAgICAgICAgICAnc3RhY2tcbicKKyAgICAgICAgICAnICAgICAgZnJhbWUgKHRvd2FyZHMgdGhlIGNhbGxlciksIG9yICJOb25lIiBpZiB0aGlzIGlzIHRoZSBib3R0b21cbicKKyAgICAgICAgICAnICAgICAgc3RhY2sgZnJhbWU7ICJmX2NvZGUiIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZCBpbiAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgICAgZnJhbWU7ICJmX2xvY2FscyIgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwIGxvY2FsXG4nCisgICAgICAgICAgJyAgICAgIHZhcmlhYmxlczsgImZfZ2xvYmFscyIgaXMgdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcztcbicKKyAgICAgICAgICAnICAgICAgImZfYnVpbHRpbnMiIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOyAnCisgICAgICAgICAgJyJmX2xhc3RpIlxuJworICAgICAgICAgICcgICAgICBnaXZlcyB0aGUgcHJlY2lzZSBpbnN0cnVjdGlvbiAodGhpcyBpcyBhbiBpbmRleCBpbnRvIHRoZVxuJworICAgICAgICAgICcgICAgICBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlczogImZfdHJhY2UiLCBpZiBub3QgIk5vbmUiLCBpcyBhXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdXNlZCBieSB0aGUgZGVidWdnZXIpOyAiZl9saW5lbm8iIGlzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGZyYW1lIC0tLSB3cml0aW5nIHRvIHRoaXMgZnJvbSB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiAnCisgICAgICAgICAgJ2p1bXBzXG4nCisgICAgICAgICAgJyAgICAgIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSAnCisgICAgICAgICAgJ2RlYnVnZ2VyXG4nCisgICAgICAgICAgJyAgICAgIGNhbiBpbXBsZW1lbnQgYSBKdW1wIGNvbW1hbmQgKGFrYSBTZXQgTmV4dCBTdGF0ZW1lbnQpIGJ5ICcKKyAgICAgICAgICAnd3JpdGluZ1xuJworICAgICAgICAgICcgICAgICB0byBmX2xpbmVuby5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgZnJhbWUuY2xlYXIoKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhpcyBtZXRob2QgY2xlYXJzIGFsbCByZWZlcmVuY2VzIHRvIGxvY2FsIHZhcmlhYmxlcyBoZWxkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgICAgICAgdGhlIGZyYW1lLiAgQWxzbywgaWYgdGhlIGZyYW1lIGJlbG9uZ2VkIHRvIGEgZ2VuZXJhdG9yLCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICAgICBnZW5lcmF0b3IgaXMgZmluYWxpemVkLiAgVGhpcyBoZWxwcyBicmVhayByZWZlcmVuY2UgJworICAgICAgICAgICdjeWNsZXNcbicKKyAgICAgICAgICAnICAgICAgICAgaW52b2x2aW5nIGZyYW1lIG9iamVjdHMgKGZvciBleGFtcGxlIHdoZW4gY2F0Y2hpbmcgYW5cbicKKyAgICAgICAgICAnICAgICAgICAgZXhjZXB0aW9uIGFuZCBzdG9yaW5nIGl0cyB0cmFjZWJhY2sgZm9yIGxhdGVyIHVzZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICAiUnVudGltZUVycm9yIiBpcyByYWlzZWQgaWYgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSAnCisgICAgICAgICAgJ2V4ZWN1dGluZy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIFRyYWNlYmFjayBvYmplY3RzIHJlcHJlc2VudCBhIHN0YWNrIHRyYWNlIG9mIGFuIGV4Y2VwdGlvbi4gICcKKyAgICAgICAgICAnQVxuJworICAgICAgICAgICcgICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgJworICAgICAgICAgICdhdFxuJworICAgICAgICAgICcgICAgICBlYWNoIHVud291bmQgbGV2ZWwgYSB0cmFjZWJhY2sgb2JqZWN0IGlzIGluc2VydGVkIGluIGZyb250ICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyAnCisgICAgICAgICAgJ2VudGVyZWQsXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gKFNlZSAnCisgICAgICAgICAgJ3NlY3Rpb25cbicKKyAgICAgICAgICAnICAgICAgVGhlIHRyeSBzdGF0ZW1lbnQuKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIHRoZSB0aGlyZCBpdGVtIG9mICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHR1cGxlIHJldHVybmVkIGJ5ICJzeXMuZXhjX2luZm8oKSIuIFdoZW4gdGhlIHByb2dyYW0gY29udGFpbnMgJworICAgICAgICAgICdub1xuJworICAgICAgICAgICcgICAgICBzdWl0YWJsZSBoYW5kbGVyLCB0aGUgc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiAobmljZWx5ICcKKyAgICAgICAgICAnZm9ybWF0dGVkKVxuJworICAgICAgICAgICcgICAgICB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgJworICAgICAgICAgICdpbnRlcmFjdGl2ZSxcbicKKyAgICAgICAgICAnICAgICAgaXQgaXMgYWxzbyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdXNlciBhcyAnCisgICAgICAgICAgJyJzeXMubGFzdF90cmFjZWJhY2siLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogInRiX25leHQiIGlzIHRoZSBuZXh0IGxldmVsIGluICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHN0YWNrIHRyYWNlICh0b3dhcmRzIHRoZSBmcmFtZSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkKSwgJworICAgICAgICAgICdvclxuJworICAgICAgICAgICcgICAgICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgInRiX2ZyYW1lIiBwb2ludHMgdG8gdGhlXG4nCisgICAgICAgICAgJyAgICAgIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDsgInRiX2xpbmVubyIgZ2l2ZXMgdGhlICcKKyAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICcgICAgICBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZDsgInRiX2xhc3RpIiBpbmRpY2F0ZXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgcHJlY2lzZSBpbnN0cnVjdGlvbi4gIFRoZSBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJyAgICAgIHRoZSB0cmFjZWJhY2sgbWF5IGRpZmZlciBmcm9tIHRoZSBsaW5lIG51bWJlciBvZiBpdHMgZnJhbWVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGlmIHRoZSBleGNlcHRpb24gb2NjdXJyZWQgaW4gYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCAnCisgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgJyAgICAgIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2Ugb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2xpY2Ugb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBTbGljZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzbGljZXMgZm9yICcKKyAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZHMuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluICJzbGljZSgpIlxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJzdGFydCIgaXMgdGhlIGxvd2VyIGJvdW5kOyAnCisgICAgICAgICAgJyJzdG9wIlxuJworICAgICAgICAgICcgICAgICBpcyB0aGUgdXBwZXIgYm91bmQ7ICJzdGVwIiBpcyB0aGUgc3RlcCB2YWx1ZTsgZWFjaCBpcyAiTm9uZSIgJworICAgICAgICAgICdpZlxuJworICAgICAgICAgICcgICAgICBvbWl0dGVkLiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gaGF2ZSBhbnkgdHlwZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBUaGlzIG1ldGhvZCB0YWtlcyBhIHNpbmdsZSBpbnRlZ2VyIGFyZ3VtZW50ICpsZW5ndGgqIGFuZFxuJworICAgICAgICAgICcgICAgICAgICBjb21wdXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2xpY2UgdGhhdCB0aGUgc2xpY2UgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgICAgd291bGQgZGVzY3JpYmUgaWYgYXBwbGllZCB0byBhIHNlcXVlbmNlIG9mICpsZW5ndGgqICcKKyAgICAgICAgICAnaXRlbXMuXG4nCisgICAgICAgICAgJyAgICAgICAgIEl0IHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSAqc3RhcnQqIGFuZCAqc3RvcCogaW5kaWNlcyBhbmQgdGhlICpzdGVwKiBvciBzdHJpZGVcbicKKyAgICAgICAgICAnICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzbGljZS4gTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBwcm92aWRlIGEgd2F5IG9mIGRlZmVhdGluZyB0aGVcbicKKyAgICAgICAgICAnICAgICAgdHJhbnNmb3JtYXRpb24gb2YgZnVuY3Rpb24gb2JqZWN0cyB0byBtZXRob2Qgb2JqZWN0cyAnCisgICAgICAgICAgJ2Rlc2NyaWJlZFxuJworICAgICAgICAgICcgICAgICBhYm92ZS4gQSBzdGF0aWMgbWV0aG9kIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGFueSBvdGhlclxuJworICAgICAgICAgICcgICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpY1xuJworICAgICAgICAgICcgICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkIG9iamVjdCwgd2hpY2ggaXMgbm90XG4nCisgICAgICAgICAgJyAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICcgICAgICBub3QgdGhlbXNlbHZlcyBjYWxsYWJsZSwgYWx0aG91Z2ggdGhlIG9iamVjdHMgdGhleSB3cmFwICcKKyAgICAgICAgICAndXN1YWxseVxuJworICAgICAgICAgICcgICAgICBhcmUuIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbicKKyAgICAgICAgICAnICAgICAgInN0YXRpY21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIEEgY2xhc3MgbWV0aG9kIG9iamVjdCwgbGlrZSBhIHN0YXRpYyBtZXRob2Qgb2JqZWN0LCBpcyBhICcKKyAgICAgICAgICAnd3JhcHBlclxuJworICAgICAgICAgICcgICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0ICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIHVwb24gc3VjaCByZXRyaWV2YWwgaXMgZGVzY3JpYmVkIGFib3ZlLFxuJworICAgICAgICAgICcgICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgJworICAgICAgICAgICdjcmVhdGVkXG4nCisgICAgICAgICAgJyAgICAgIGJ5IHRoZSBidWlsdC1pbiAiY2xhc3NtZXRob2QoKSIgY29uc3RydWN0b3IuXG4nLAorICd0eXBlc2Z1bmN0aW9ucyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRnVuY3Rpb25zXG4nCisgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnRnVuY3Rpb24gb2JqZWN0cyBhcmUgY3JlYXRlZCBieSBmdW5jdGlvbiBkZWZpbml0aW9ucy4gIFRoZSAnCisgICAgICAgICAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICcKKyAgICAgICAgICAgICAgICAgICAnImZ1bmMoYXJndW1lbnQtbGlzdCkiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiAnCisgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uc1xuJworICAgICAgICAgICAgICAgICAgICdhbmQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gIEJvdGggc3VwcG9ydCB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiAodG8gY2FsbFxuJworICAgICAgICAgICAgICAgICAgICd0aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1NlZSBGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbWFwcGluZyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ01hcHBpbmcgVHlwZXMgLS0tICJkaWN0IlxuJworICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0EgKm1hcHBpbmcqIG9iamVjdCBtYXBzICpoYXNoYWJsZSogdmFsdWVzIHRvIGFyYml0cmFyeSAnCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnTWFwcGluZ3MgYXJlIG11dGFibGUgb2JqZWN0cy4gIFRoZXJlIGlzIGN1cnJlbnRseSBvbmx5IG9uZSAnCisgICAgICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICAgICAnbWFwcGluZyB0eXBlLCB0aGUgKmRpY3Rpb25hcnkqLiAgKEZvciBvdGhlciBjb250YWluZXJzIHNlZSAnCisgICAgICAgICAgICAgICAgICd0aGUgYnVpbHQtXG4nCisgICAgICAgICAgICAgICAgICdpbiAibGlzdCIsICJzZXQiLCBhbmQgInR1cGxlIiBjbGFzc2VzLCBhbmQgdGhlICJjb2xsZWN0aW9ucyIgJworICAgICAgICAgICAgICAgICAnbW9kdWxlLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiQSBkaWN0aW9uYXJ5J3Mga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyAiCisgICAgICAgICAgICAgICAgICd0aGF0IGFyZVxuJworICAgICAgICAgICAgICAgICAnbm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJpZXMgb3JcbicKKyAgICAgICAgICAgICAgICAgJ290aGVyIG11dGFibGUgdHlwZXMgKHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuICcKKyAgICAgICAgICAgICAgICAgJ2J5IG9iamVjdFxuJworICAgICAgICAgICAgICAgICAnaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciAnCisgICAgICAgICAgICAgICAgICdrZXlzIG9iZXlcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgJworICAgICAgICAgICAgICAgICAnY29tcGFyZSBlcXVhbFxuJworICAgICAgICAgICAgICAgICAnKHN1Y2ggYXMgIjEiIGFuZCAiMS4wIikgdGhlbiB0aGV5IGNhbiBiZSB1c2VkICcKKyAgICAgICAgICAgICAgICAgJ2ludGVyY2hhbmdlYWJseSB0byBpbmRleFxuJworICAgICAgICAgICAgICAgICAndGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgJworICAgICAgICAgICAgICAgICAnY29tcHV0ZXJzIHN0b3JlXG4nCisgICAgICAgICAgICAgICAgICdmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgJworICAgICAgICAgICAgICAgICAndW53aXNlIHRvIHVzZVxuJworICAgICAgICAgICAgICAgICAndGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCAnCisgICAgICAgICAgICAgICAgICdsaXN0IG9mICJrZXk6XG4nCisgICAgICAgICAgICAgICAgICd2YWx1ZSIgcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6ICJ7XCdqYWNrXCc6IDQwOTgsICcKKyAgICAgICAgICAgICAgICAgIidzam9lcmQnOlxuIgorICAgICAgICAgICAgICAgICAnNDEyN30iIG9yICJ7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9Iiwgb3IgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJkaWN0IlxuJworICAgICAgICAgICAgICAgICAnY29uc3RydWN0b3IuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QoKiprd2FyZylcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2lzIGNyZWF0ZWQuXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyAnCisgICAgICAgICAgICAgICAgICdvYmplY3QsIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyAnCisgICAgICAgICAgICAgICAgICd0aGUgbWFwcGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICcKKyAgICAgICAgICAgICAgICAgJyppdGVyYWJsZSpcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gJworICAgICAgICAgICAgICAgICAnaXRlcmFibGUgd2l0aFxuJworICAgICAgICAgICAgICAgICAnICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtICcKKyAgICAgICAgICAgICAgICAgJ2JlY29tZXMgYSBrZXlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSAnCisgICAgICAgICAgICAgICAgICdjb3JyZXNwb25kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgJworICAgICAgICAgICAgICAgICAnZm9yIHRoYXQga2V5XG4nCisgICAgICAgICAgICAgICAgICcgICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kICcKKyAgICAgICAgICAgICAgICAgJ3RoZWlyXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSBmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgZXF1YWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRvICJ7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfSI6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpXG4nCisgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gYiA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDN9XG4iCisgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gYyA9IGRpY3QoemlwKFsnb25lJywgJ3R3bycsICd0aHJlZSddLCBbMSwgMiwgM10pKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGQgPSBkaWN0KFsoJ3R3bycsIDIpLCAoJ29uZScsIDEpLCAoJ3RocmVlJywgMyldKVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGUgPSBkaWN0KHsndGhyZWUnOiAzLCAnb25lJzogMSwgJ3R3byc6IDJ9KVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSAnCisgICAgICAgICAgICAgICAgICd3b3JrcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgJworICAgICAgICAgICAgICAgICAndmFsaWQga2V5c1xuJworICAgICAgICAgICAgICAgICAnICAgY2FuIGJlIHVzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgJworICAgICAgICAgICAgICAgICAndGhlcmVmb3JlLFxuJworICAgICAgICAgICAgICAgICAnICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgbGVuKGQpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZFtrZXldXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSAnCisgICAgICAgICAgICAgICAgICciS2V5RXJyb3IiIGlmXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgYSBzdWJjbGFzcyBvZiBkaWN0IGRlZmluZXMgYSBtZXRob2QgIl9fbWlzc2luZ19fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2FuZCAqa2V5KlxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgbm90IHByZXNlbnQsIHRoZSAiZFtrZXldIiBvcGVyYXRpb24gY2FsbHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdtZXRob2Qgd2l0aFxuJworICAgICAgICAgICAgICAgICAnICAgICAgdGhlIGtleSAqa2V5KiBhcyBhcmd1bWVudC4gIFRoZSAiZFtrZXldIiBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAndGhlbiByZXR1cm5zXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBvciByYWlzZXMgd2hhdGV2ZXIgaXMgcmV0dXJuZWQgb3IgcmFpc2VkIGJ5IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgIl9fbWlzc2luZ19fKGtleSkiIGNhbGwuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBpbnZva2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJfX21pc3NpbmdfXygpIi4gSWYgIl9fbWlzc2luZ19fKCkiIGlzIG5vdCBkZWZpbmVkLCAnCisgICAgICAgICAgICAgICAgICciS2V5RXJyb3IiXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpcyByYWlzZWQuICJfX21pc3NpbmdfXygpIiBtdXN0IGJlIGEgbWV0aG9kOyBpdCBjYW5ub3QgJworICAgICAgICAgICAgICAgICAnYmUgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGluc3RhbmNlIHZhcmlhYmxlOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICA+Pj4gY2xhc3MgQ291bnRlcihkaWN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIC4uLiAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAuLi4gICAgICAgICByZXR1cm4gMFxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgPj4+IGMgPSBDb3VudGVyKClcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgICAgMFxuJworICAgICAgICAgICAgICAgICAiICAgICAgICAgPj4+IGNbJ3JlZCddICs9IDFcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgICAgMVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBUaGUgZXhhbXBsZSBhYm92ZSBzaG93cyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgImNvbGxlY3Rpb25zLkNvdW50ZXIiLiAgQSBkaWZmZXJlbnQgIl9fbWlzc2luZ19fIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QgaXMgdXNlZFxuJworICAgICAgICAgICAgICAgICAnICAgICAgYnkgImNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0Ii5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZFtrZXldID0gdmFsdWVcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgU2V0ICJkW2tleV0iIHRvICp2YWx1ZSouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlbCBkW2tleV1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmVtb3ZlICJkW2tleV0iIGZyb20gKmQqLiAgUmFpc2VzIGEgIktleUVycm9yIiBpZiAnCisgICAgICAgICAgICAgICAgICcqa2V5KiBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGluIHRoZSBtYXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleSBpbiBkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiAiVHJ1ZSIgaWYgKmQqIGhhcyBhIGtleSAqa2V5KiwgZWxzZSAiRmFsc2UiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXkgbm90IGluIGRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgRXF1aXZhbGVudCB0byAibm90IGtleSBpbiBkIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgaXRlcihkKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeS4gICcKKyAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgYVxuJworICAgICAgICAgICAgICAgICAnICAgICAgc2hvcnRjdXQgZm9yICJpdGVyKGQua2V5cygpKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsZWFyKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjb3B5KClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGFzc21ldGhvZCBmcm9ta2V5cyhzZXFbLCB2YWx1ZV0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgc2V0IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAiZnJvbWtleXMoKSIgaXMgYSBjbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIGEgbmV3ICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqdmFsdWUqIGRlZmF1bHRzIHRvICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgZ2V0KGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSwgZWxzZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmRlZmF1bHQqLiBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byAnCisgICAgICAgICAgICAgICAgICciTm9uZSIsIHNvXG4nCisgICAgICAgICAgICAgICAgICcgICAgICB0aGF0IHRoaXMgbWV0aG9kIG5ldmVyIHJhaXNlcyBhICJLZXlFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZW1zKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgaXRlbXMgKCIoa2V5LCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSkiXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBwYWlycykuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGtleXMoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICIgICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeSdzIGtleXMuICBTZWUgdGhlXG4iCisgICAgICAgICAgICAgICAgICcgICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgcG9wKGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmVtb3ZlIGl0IGFuZCByZXR1cm4gJworICAgICAgICAgICAgICAgICAnaXRzIHZhbHVlLFxuJworICAgICAgICAgICAgICAgICAnICAgICAgZWxzZSByZXR1cm4gKmRlZmF1bHQqLiAgSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiBhbmQgJworICAgICAgICAgICAgICAgICAnKmtleSogaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIG5vdCBpbiB0aGUgZGljdGlvbmFyeSwgYSAiS2V5RXJyb3IiIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgcG9waXRlbSgpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSAiKGtleSwgdmFsdWUpIiBwYWlyICcKKyAgICAgICAgICAgICAgICAgJ2Zyb20gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAicG9waXRlbSgpIiBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpcyBlbXB0eSwgY2FsbGluZyAicG9waXRlbSgpIiByYWlzZXMgYSAiS2V5RXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBzZXRkZWZhdWx0KGtleVssIGRlZmF1bHRdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBJZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgcmV0dXJuIGl0cyB2YWx1ZS4gIElmICcKKyAgICAgICAgICAgICAgICAgJ25vdCwgaW5zZXJ0XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAqa2V5KiB3aXRoIGEgdmFsdWUgb2YgKmRlZmF1bHQqIGFuZCByZXR1cm4gKmRlZmF1bHQqLiAgJworICAgICAgICAgICAgICAgICAnKmRlZmF1bHQqXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkZWZhdWx0cyB0byAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHVwZGF0ZShbb3RoZXJdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gJworICAgICAgICAgICAgICAgICAnKm90aGVyKixcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMuICBSZXR1cm4gIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAidXBkYXRlKCkiIGFjY2VwdHMgZWl0aGVyIGFub3RoZXIgZGljdGlvbmFyeSBvYmplY3Qgb3IgJworICAgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGl0ZXJhYmxlIG9mIGtleS92YWx1ZSBwYWlycyAoYXMgdHVwbGVzIG9yIG90aGVyICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlcyBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgbGVuZ3RoIHR3bykuICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgdGhlbiB1cGRhdGVkIHdpdGggdGhvc2Uga2V5L3ZhbHVlIHBhaXJzOiAnCisgICAgICAgICAgICAgICAgICciZC51cGRhdGUocmVkPTEsXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBibHVlPTIpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnkncyB2YWx1ZXMuICBTZWUgIgorICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRGljdGlvbmFyaWVzIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleSBoYXZlIHRoZSAnCisgICAgICAgICAgICAgICAgICdzYW1lICIoa2V5LFxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUpIiBwYWlycy4gT3JkZXIgY29tcGFyaXNvbnMgKFwnPFwnLCBcJzw9XCcsIFwnPj1cJywgJworICAgICAgICAgICAgICAgICAiJz4nKSByYWlzZVxuIgorICAgICAgICAgICAgICAgICAnICAgIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOiAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgJworICAgICAgICAgICAgICAgICAncmVhZC1vbmx5XG4nCisgICAgICAgICAgICAgICAgICcgIHZpZXcgb2YgYSAiZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBvYmplY3RzIHJldHVybmVkIGJ5ICJkaWN0LmtleXMoKSIsICJkaWN0LnZhbHVlcygpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgJworICAgICAgICAgICAgICAgICAndmlldyBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkncyBlbnRyaWVzLCB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIGRpY3Rpb25hcnkgIgorICAgICAgICAgICAgICAgICAnY2hhbmdlcyxcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RpY3Rpb25hcnkgdmlld3MgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgdG8geWllbGQgdGhlaXIgJworICAgICAgICAgICAgICAgICAncmVzcGVjdGl2ZSBkYXRhLFxuJworICAgICAgICAgICAgICAgICAnYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnbGVuKGRpY3R2aWV3KVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdpdGVyKGRpY3R2aWV3KVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cywgdmFsdWVzIG9yIGl0ZW1zICcKKyAgICAgICAgICAgICAgICAgJyhyZXByZXNlbnRlZCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgdHVwbGVzIG9mICIoa2V5LCB2YWx1ZSkiKSBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgS2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIGFuIGFyYml0cmFyeSBvcmRlciAnCisgICAgICAgICAgICAgICAgICd3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAnICAgbm9uLXJhbmRvbSwgdmFyaWVzIGFjcm9zcyBQeXRob24gaW1wbGVtZW50YXRpb25zLCBhbmQgJworICAgICAgICAgICAgICAgICAnZGVwZW5kcyBvblxuJworICAgICAgICAgICAgICAgICAiICAgdGhlIGRpY3Rpb25hcnkncyBoaXN0b3J5IG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gSWYgIgorICAgICAgICAgICAgICAgICAna2V5cyxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyAnCisgICAgICAgICAgICAgICAgICdpbnRlcnZlbmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIG9yZGVyIG9mIGl0ZW1zIHdpbGwgJworICAgICAgICAgICAgICAgICAnZGlyZWN0bHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgIih2YWx1ZSwga2V5KSIgJworICAgICAgICAgICAgICAgICAncGFpcnMgdXNpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ6aXAoKSI6ICJwYWlycyA9IHppcChkLnZhbHVlcygpLCBkLmtleXMoKSkiLiAgQW5vdGhlciAnCisgICAgICAgICAgICAgICAgICd3YXkgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzICJwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpbiAnCisgICAgICAgICAgICAgICAgICdkLml0ZW1zKCldIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSXRlcmF0aW5nIHZpZXdzIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBtYXkgcmFpc2UgYSAiUnVudGltZUVycm9yIiBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlciBhbGwgJworICAgICAgICAgICAgICAgICAnZW50cmllcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAneCBpbiBkaWN0dmlld1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gIlRydWUiIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzICcKKyAgICAgICAgICAgICAgICAgJ2tleXMsIHZhbHVlc1xuJworICAgICAgICAgICAgICAgICAnICAgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhICIoa2V5LCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZSkiXG4nCisgICAgICAgICAgICAgICAgICcgICB0dXBsZSkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0tleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgJworICAgICAgICAgICAgICAgICAnaGFzaGFibGUuXG4nCisgICAgICAgICAgICAgICAgICdJZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAiKGtleSwgdmFsdWUpIiBwYWlycyBhcmUgJworICAgICAgICAgICAgICAgICAndW5pcXVlXG4nCisgICAgICAgICAgICAgICAgICdhbmQgaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgJworICAgICAgICAgICAgICAgICAndmlld3MgYXJlXG4nCisgICAgICAgICAgICAgICAgICdub3QgdHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCAnCisgICAgICAgICAgICAgICAgICd1bmlxdWUuKVxuJworICAgICAgICAgICAgICAgICAnRm9yIHNldC1saWtlIHZpZXdzLCBhbGwgb2YgdGhlIG9wZXJhdGlvbnMgZGVmaW5lZCBmb3IgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2Fic3RyYWN0XG4nCisgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzICJjb2xsZWN0aW9ucy5hYmMuU2V0IiBhcmUgYXZhaWxhYmxlIChmb3IgZXhhbXBsZSwgJworICAgICAgICAgICAgICAgICAnIj09IixcbicKKyAgICAgICAgICAgICAgICAgJyI8Iiwgb3IgIl4iKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkaXNoZXMgPSB7J2VnZ3MnOiAyLCAnc2F1c2FnZSc6IDEsICdiYWNvbic6IDEsICIKKyAgICAgICAgICAgICAgICAgIidzcGFtJzogNTAwfVxuIgorICAgICAgICAgICAgICAgICAnICAgPj4+IGtleXMgPSBkaXNoZXMua2V5cygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gdmFsdWVzID0gZGlzaGVzLnZhbHVlcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAjIGl0ZXJhdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IG4gPSAwXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gZm9yIHZhbCBpbiB2YWx1ZXM6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIG4gKz0gdmFsXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gcHJpbnQobilcbicKKyAgICAgICAgICAgICAgICAgJyAgIDUwNFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBrZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAnb3JkZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KGtleXMpXG4nCisgICAgICAgICAgICAgICAgICIgICBbJ2VnZ3MnLCAnYmFjb24nLCAnc2F1c2FnZScsICdzcGFtJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KHZhbHVlcylcbicKKyAgICAgICAgICAgICAgICAgJyAgIFsyLCAxLCAxLCA1MDBdXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkZWwgZGlzaGVzWydlZ2dzJ11cbiIKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBkZWwgZGlzaGVzWydzYXVzYWdlJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBsaXN0KGtleXMpXG4nCisgICAgICAgICAgICAgICAgICIgICBbJ3NwYW0nLCAnYmFjb24nXVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBzZXQgb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICAgICAiICAgPj4+IGtleXMgJiB7J2VnZ3MnLCAnYmFjb24nLCAnc2FsYWQnfVxuIgorICAgICAgICAgICAgICAgICAiICAgeydiYWNvbid9XG4iCisgICAgICAgICAgICAgICAgICIgICA+Pj4ga2V5cyBeIHsnc2F1c2FnZScsICdqdWljZSd9XG4iCisgICAgICAgICAgICAgICAgICIgICB7J2p1aWNlJywgJ3NhdXNhZ2UnLCAnYmFjb24nLCAnc3BhbSd9XG4iLAorICd0eXBlc21ldGhvZHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ01ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICdub3RhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSB0d28gZmxhdm9yczogYnVpbHQtaW4gbWV0aG9kcyAoc3VjaCBhcyAiYXBwZW5kKCkiICcKKyAgICAgICAgICAgICAgICAgJ29uIGxpc3RzKVxuJworICAgICAgICAgICAgICAgICAnYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWQgJworICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3R5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJZiB5b3UgYWNjZXNzIGEgbWV0aG9kIChhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICduYW1lc3BhY2UpXG4nCisgICAgICAgICAgICAgICAgICd0aHJvdWdoIGFuIGluc3RhbmNlLCB5b3UgZ2V0IGEgc3BlY2lhbCBvYmplY3Q6IGEgKmJvdW5kICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCogKGFsc29cbicKKyAgICAgICAgICAgICAgICAgJ2NhbGxlZCAqaW5zdGFuY2UgbWV0aG9kKikgb2JqZWN0LiBXaGVuIGNhbGxlZCwgaXQgd2lsbCBhZGQgJworICAgICAgICAgICAgICAgICAndGhlICJzZWxmIlxuJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBCb3VuZCBtZXRob2RzIGhhdmUgdHdvICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWwgcmVhZC1cbicKKyAgICAgICAgICAgICAgICAgJ29ubHkgYXR0cmlidXRlczogIm0uX19zZWxmX18iIGlzIHRoZSBvYmplY3Qgb24gd2hpY2ggdGhlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnb3BlcmF0ZXMsIGFuZCAibS5fX2Z1bmNfXyIgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnQ2FsbGluZyAibShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIiBpcyBjb21wbGV0ZWx5ICcKKyAgICAgICAgICAgICAgICAgJ2VxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAgICAgJ2NhbGxpbmcgIm0uX19mdW5jX18obS5fX3NlbGZfXywgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0xpa2UgZnVuY3Rpb24gb2JqZWN0cywgYm91bmQgbWV0aG9kIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nICcKKyAgICAgICAgICAgICAgICAgJ2FyYml0cmFyeVxuJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlcy4gIEhvd2V2ZXIsIHNpbmNlIG1ldGhvZCBhdHRyaWJ1dGVzIGFyZSBhY3R1YWxseSAnCisgICAgICAgICAgICAgICAgICdzdG9yZWQgb25cbicKKyAgICAgICAgICAgICAgICAgJ3RoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdCAoIm1ldGguX19mdW5jX18iKSwgc2V0dGluZyAnCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMgb24gYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLiAgQXR0ZW1wdGluZyB0byAnCisgICAgICAgICAgICAgICAgICdzZXQgYW5cbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvbiBhIG1ldGhvZCByZXN1bHRzIGluIGFuICJBdHRyaWJ1dGVFcnJvciIgYmVpbmcgJworICAgICAgICAgICAgICAgICAncmFpc2VkLiAgSW5cbicKKyAgICAgICAgICAgICAgICAgJ29yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0ICcKKyAgICAgICAgICAgICAgICAgJ2l0IG9uIHRoZVxuJworICAgICAgICAgICAgICAgICAndW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IEMoKVxuJworICAgICAgICAgICAgICAgICAiICAgPj4+IGMubWV0aG9kLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCcgICMgY2FuJ3Qgc2V0IG9uICIKKyAgICAgICAgICAgICAgICAgJ3RoZSBtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAgICAgICAgIiAgIEF0dHJpYnV0ZUVycm9yOiAnbWV0aG9kJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAiCisgICAgICAgICAgICAgICAgICInd2hvYW1pJ1xuIgorICAgICAgICAgICAgICAgICAiICAgPj4+IGMubWV0aG9kLl9fZnVuY19fLndob2FtaSA9ICdteSBuYW1lIGlzIG1ldGhvZCdcbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjLm1ldGhvZC53aG9hbWlcbicKKyAgICAgICAgICAgICAgICAgIiAgICdteSBuYW1lIGlzIG1ldGhvZCdcbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbW9kdWxlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgJ01vZHVsZXNcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKipcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczogJworICAgICAgICAgICAgICAgICAnIm0ubmFtZSIsXG4nCisgICAgICAgICAgICAgICAgICd3aGVyZSAqbSogaXMgYSBtb2R1bGUgYW5kICpuYW1lKiBhY2Nlc3NlcyBhIG5hbWUgZGVmaW5lZCBpbiAnCisgICAgICAgICAgICAgICAgICIqbSonc1xuIgorICAgICAgICAgICAgICAgICAnc3ltYm9sIHRhYmxlLiBNb2R1bGUgYXR0cmlidXRlcyBjYW4gYmUgYXNzaWduZWQgdG8uICAoTm90ZSAnCisgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnImltcG9ydCIgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdvbiBhIG1vZHVsZVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0OyAiaW1wb3J0IGZvbyIgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3QgbmFtZWQgJworICAgICAgICAgICAgICAgICAnKmZvbyogdG9cbicKKyAgICAgICAgICAgICAgICAgJ2V4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbiogZm9yIGEgJworICAgICAgICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICAgICAgICduYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyAiX19kaWN0X18iLiBUaGlzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUuIE1vZGlmeWluZyAiCisgICAgICAgICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUsICIKKyAgICAgICAgICAgICAgICAgJ2J1dCBkaXJlY3RcbicKKyAgICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnQgdG8gdGhlICJfX2RpY3RfXyIgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91ICcKKyAgICAgICAgICAgICAgICAgJ2NhbiB3cml0ZVxuJworICAgICAgICAgICAgICAgICAnIm0uX19kaWN0X19bXCdhXCddID0gMSIsIHdoaWNoIGRlZmluZXMgIm0uYSIgdG8gYmUgIjEiLCBidXQgJworICAgICAgICAgICAgICAgICAieW91IGNhbid0XG4iCisgICAgICAgICAgICAgICAgICd3cml0ZSAibS5fX2RpY3RfXyA9IHt9IikuICBNb2RpZnlpbmcgIl9fZGljdF9fIiBkaXJlY3RseSBpcyAnCisgICAgICAgICAgICAgICAgICdub3RcbicKKyAgICAgICAgICAgICAgICAgJ3JlY29tbWVuZGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogJworICAgICAgICAgICAgICAgICAnIjxtb2R1bGVcbicKKyAgICAgICAgICAgICAgICAgJ1wnc3lzXCcgKGJ1aWx0LWluKT4iLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSAnCisgICAgICAgICAgICAgICAgICd3cml0dGVuIGFzXG4nCisgICAgICAgICAgICAgICAgICciPG1vZHVsZSBcJ29zXCcgZnJvbSAnCisgICAgICAgICAgICAgICAgICdcJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWNcJz4iLlxuJywKKyAndHlwZXNzZXEnOiAnXG4nCisgICAgICAgICAgICAgJ1NlcXVlbmNlIFR5cGVzIC0tLSAibGlzdCIsICJ0dXBsZSIsICJyYW5nZSJcbicKKyAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlcmUgYXJlIHRocmVlIGJhc2ljIHNlcXVlbmNlIHR5cGVzOiBsaXN0cywgdHVwbGVzLCBhbmQgcmFuZ2VcbicKKyAgICAgICAgICAgICAnb2JqZWN0cy4gQWRkaXRpb25hbCBzZXF1ZW5jZSB0eXBlcyB0YWlsb3JlZCBmb3IgcHJvY2Vzc2luZyBvZiAnCisgICAgICAgICAgICAgJ2JpbmFyeVxuJworICAgICAgICAgICAgICdkYXRhIGFuZCB0ZXh0IHN0cmluZ3MgYXJlIGRlc2NyaWJlZCBpbiBkZWRpY2F0ZWQgc2VjdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIHN1cHBvcnRlZCBieSBtb3N0ICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAndHlwZXMsIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlLiBUaGUgJworICAgICAgICAgICAgICciY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkNcbicKKyAgICAgICAgICAgICAnaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSAnCisgICAgICAgICAgICAgJ29wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnb24gY3VzdG9tIHNlcXVlbmNlIHR5cGVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nICcKKyAgICAgICAgICAgICAncHJpb3JpdHkuXG4nCisgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSwgKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLCAqbiosICcKKyAgICAgICAgICAgICAnKmkqLFxuJworICAgICAgICAgICAgICcqaiogYW5kICprKiBhcmUgaW50ZWdlcnMgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgJworICAgICAgICAgICAgICdtZWV0cyBhbnlcbicKKyAgICAgICAgICAgICAndHlwZSBhbmQgdmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb3BlcmF0aW9ucy4gVGhlICIrIiAoY29uY2F0ZW5hdGlvbikgYW5kICIqIiAnCisgICAgICAgICAgICAgJyhyZXBldGl0aW9uKVxuJworICAgICAgICAgICAgICdvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHkgYXMgdGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpY1xuJworICAgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgTm90ZXMgICAgICB8XG4nCisgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICd8ICJ4IGluIHMiICAgICAgICAgICAgICAgICAgIHwgIlRydWUiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAgJworICAgICAgICAgICAgICd8ICgxKSAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWwgdG8gKngqLCBlbHNlICJGYWxzZSIgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAieCBub3QgaW4gcyIgICAgICAgICAgICAgICB8ICJGYWxzZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgICcKKyAgICAgICAgICAgICAnfCAoMSkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiVHJ1ZSIgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMgKyB0IiAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqcyogYW5kICp0KiAnCisgICAgICAgICAgICAgJ3wgKDYpKDcpICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICogbiIgb3IgIm4gKiBzIiAgICAgICAgIHwgZXF1aXZhbGVudCB0byBhZGRpbmcgKnMqIHRvICAgICAgJworICAgICAgICAgICAgICd8ICgyKSg3KSAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRzZWxmICpuKiB0aW1lcyAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpXSIgICAgICAgICAgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgICcKKyAgICAgICAgICAgICAnfCAoMykgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICAnCisgICAgICAgICAgICAgJ3wgKDMpKDQpICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgJworICAgICAgICAgICAgICd8ICgzKSg1KSAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2l0aCBzdGVwICprKiAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAibGVuKHMpIiAgICAgICAgICAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgIm1pbihzKSIgICAgICAgICAgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJtYXgocykiICAgICAgICAgICAgICAgICAgIHwgbGFyZ2VzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5pbmRleCh4WywgaVssIGpdXSkiICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICcKKyAgICAgICAgICAgICAnfCAoOCkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogKGF0IG9yIGFmdGVyIGluZGV4ICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICppKiBhbmQgYmVmb3JlIGluZGV4ICpqKikgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuY291bnQoeCkiICAgICAgICAgICAgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGUgYWxzbyBzdXBwb3J0IGNvbXBhcmlzb25zLiAgSW4gJworICAgICAgICAgICAgICdwYXJ0aWN1bGFyLFxuJworICAgICAgICAgICAgICd0dXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSBieSBjb21wYXJpbmdcbicKKyAgICAgICAgICAgICAnY29ycmVzcG9uZGluZyBlbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5XG4nCisgICAgICAgICAgICAgJ2VsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSAnCisgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAndHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguICAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgJworICAgICAgICAgICAgICdDb21wYXJpc29ucyBpblxuJworICAgICAgICAgICAgICd0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gV2hpbGUgdGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgYXJlIHVzZWQgb25seSBmb3IgJworICAgICAgICAgICAgICdzaW1wbGVcbicKKyAgICAgICAgICAgICAnICAgY29udGFpbm1lbnQgdGVzdGluZyBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBzb21lIHNwZWNpYWxpc2VkICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VzXG4nCisgICAgICAgICAgICAgJyAgIChzdWNoIGFzICJzdHIiLCAiYnl0ZXMiIGFuZCAiYnl0ZWFycmF5IikgYWxzbyB1c2UgdGhlbSBmb3JcbicKKyAgICAgICAgICAgICAnICAgc3Vic2VxdWVuY2UgdGVzdGluZzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiAiZ2ciIGluICJlZ2dzIlxuJworICAgICAgICAgICAgICcgICAgICBUcnVlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBWYWx1ZXMgb2YgKm4qIGxlc3MgdGhhbiAiMCIgYXJlIHRyZWF0ZWQgYXMgIjAiICh3aGljaCB5aWVsZHMgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICcgICBlbXB0eSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlIGFzICpzKikuICBOb3RlIHRoYXQgaXRlbXMgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgKnMqIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlICcKKyAgICAgICAgICAgICAndGltZXMuXG4nCisgICAgICAgICAgICAgJyAgIFRoaXMgb2Z0ZW4gaGF1bnRzIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzID0gW1tdXSAqIDNcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzXG4nCisgICAgICAgICAgICAgJyAgICAgIFtbXSwgW10sIFtdXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1xuJworICAgICAgICAgICAgICcgICAgICBbWzNdLCBbM10sIFszXV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgIltbXV0iIGlzIGEgb25lLWVsZW1lbnQgbGlzdCAnCisgICAgICAgICAgICAgJ2NvbnRhaW5pbmdcbicKKyAgICAgICAgICAgICAnICAgYW4gZW1wdHkgbGlzdCwgc28gYWxsIHRocmVlIGVsZW1lbnRzIG9mICJbW11dICogMyIgYXJlICcKKyAgICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAgICcgICB0byB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbicKKyAgICAgICAgICAgICAnICAgImxpc3RzIiBtb2RpZmllcyB0aGlzIHNpbmdsZSBsaXN0LiBZb3UgY2FuIGNyZWF0ZSBhIGxpc3Qgb2ZcbicKKyAgICAgICAgICAgICAnICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzID0gW1tdIGZvciBpIGluIHJhbmdlKDMpXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1sxXS5hcHBlbmQoNSlcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzJdLmFwcGVuZCg3KVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNcbicKKyAgICAgICAgICAgICAnICAgICAgW1szXSwgWzVdLCBbN11dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBGdXJ0aGVyIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgRkFRIGVudHJ5IEhvdyBkbyBJICcKKyAgICAgICAgICAgICAnY3JlYXRlIGFcbicKKyAgICAgICAgICAgICAnICAgbXVsdGlkaW1lbnNpb25hbCBsaXN0Py5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuIElmICppKiBvciAqaiogaXMgbmVnYXRpdmUsIHRoZSBpbmRleCBpcyByZWxhdGl2ZSB0byB0aGUgZW5kICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgdGhlIHN0cmluZzogImxlbihzKSArIGkiIG9yICJsZW4ocykgKyBqIiBpcyBzdWJzdGl0dXRlZC4gIEJ1dCAnCisgICAgICAgICAgICAgJ25vdGVcbicKKyAgICAgICAgICAgICAnICAgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgaXRlbXMgd2l0aCBpbmRleCAqayogc3VjaCB0aGF0ICJpIDw9IGsgPCBqIi4gIElmICppKiBvciAqaiogJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpcyBvbWl0dGVkIG9yICcKKyAgICAgICAgICAgICAnIk5vbmUiLFxuJworICAgICAgICAgICAgICcgICB1c2UgIjAiLiAgSWYgKmoqIGlzIG9taXR0ZWQgb3IgIk5vbmUiLCB1c2UgImxlbihzKSIuICBJZiAqaSogJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKmoqLCB0aGUgc2xpY2UgaXMgZW1wdHkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc1LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiB3aXRoIHN0ZXAgKmsqIGlzIGRlZmluZWQgYXMgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgInggPSBpICsgbiprIiBzdWNoIHRoYXQgIjAgPD0gbiAnCisgICAgICAgICAgICAgJzxcbicKKyAgICAgICAgICAgICAnICAgKGotaSkvayIuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlICJpIiwgImkrayIsICcKKyAgICAgICAgICAgICAnImkrMiprIixcbicKKyAgICAgICAgICAgICAnICAgImkrMyprIiBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4gKmoqIGlzIHJlYWNoZWQgKGJ1dCBuZXZlclxuJworICAgICAgICAgICAgICcgICBpbmNsdWRpbmcgKmoqKS4gIElmICppKiBvciAqaiogaXMgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2VcbicKKyAgICAgICAgICAgICAnICAgImxlbihzKSIuICBJZiAqaSogb3IgKmoqIGFyZSBvbWl0dGVkIG9yICJOb25lIiwgdGhleSBiZWNvbWUgJworICAgICAgICAgICAgICciZW5kIlxuJworICAgICAgICAgICAgICcgICB2YWx1ZXMgKHdoaWNoIGVuZCBkZXBlbmRzIG9uIHRoZSBzaWduIG9mICprKikuICBOb3RlLCAqayogJworICAgICAgICAgICAgICdjYW5ub3QgYmVcbicKKyAgICAgICAgICAgICAnICAgemVyby4gSWYgKmsqIGlzICJOb25lIiwgaXQgaXMgdHJlYXRlZCBsaWtlICIxIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzYuIENvbmNhdGVuYXRpbmcgaW1tdXRhYmxlIHNlcXVlbmNlcyBhbHdheXMgcmVzdWx0cyBpbiBhIG5ld1xuJworICAgICAgICAgICAgICcgICBvYmplY3QuIFRoaXMgbWVhbnMgdGhhdCBidWlsZGluZyB1cCBhIHNlcXVlbmNlIGJ5IHJlcGVhdGVkXG4nCisgICAgICAgICAgICAgJyAgIGNvbmNhdGVuYXRpb24gd2lsbCBoYXZlIGEgcXVhZHJhdGljIHJ1bnRpbWUgY29zdCBpbiB0aGUgJworICAgICAgICAgICAgICd0b3RhbFxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSBsZW5ndGguIFRvIGdldCBhIGxpbmVhciBydW50aW1lIGNvc3QsIHlvdSBtdXN0ICcKKyAgICAgICAgICAgICAnc3dpdGNoIHRvXG4nCisgICAgICAgICAgICAgJyAgIG9uZSBvZiB0aGUgYWx0ZXJuYXRpdmVzIGJlbG93OlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJzdHIiIG9iamVjdHMsIHlvdSBjYW4gYnVpbGQgYSBsaXN0IGFuZCAnCisgICAgICAgICAgICAgJ3VzZVxuJworICAgICAgICAgICAgICcgICAgICJzdHIuam9pbigpIiBhdCB0aGUgZW5kIG9yIGVsc2Ugd3JpdGUgdG8gYW4gImlvLlN0cmluZ0lPIlxuJworICAgICAgICAgICAgICcgICAgIGluc3RhbmNlIGFuZCByZXRyaWV2ZSBpdHMgdmFsdWUgd2hlbiBjb21wbGV0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJieXRlcyIgb2JqZWN0cywgeW91IGNhbiBzaW1pbGFybHkgdXNlXG4nCisgICAgICAgICAgICAgJyAgICAgImJ5dGVzLmpvaW4oKSIgb3IgImlvLkJ5dGVzSU8iLCBvciB5b3UgY2FuIGRvIGluLXBsYWNlXG4nCisgICAgICAgICAgICAgJyAgICAgY29uY2F0ZW5hdGlvbiB3aXRoIGEgImJ5dGVhcnJheSIgb2JqZWN0LiAgImJ5dGVhcnJheSIgJworICAgICAgICAgICAgICdvYmplY3RzIGFyZVxuJworICAgICAgICAgICAgICcgICAgIG11dGFibGUgYW5kIGhhdmUgYW4gZWZmaWNpZW50IG92ZXJhbGxvY2F0aW9uIG1lY2hhbmlzbVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWRcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogZm9yIG90aGVyIHR5cGVzLCBpbnZlc3RpZ2F0ZSB0aGUgcmVsZXZhbnQgY2xhc3MgJworICAgICAgICAgICAgICdkb2N1bWVudGF0aW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc3LiBTb21lIHNlcXVlbmNlIHR5cGVzIChzdWNoIGFzICJyYW5nZSIpIG9ubHkgc3VwcG9ydCBpdGVtXG4nCisgICAgICAgICAgICAgIiAgIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvbid0ICIKKyAgICAgICAgICAgICAnc3VwcG9ydFxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc4LiAiaW5kZXgiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gJworICAgICAgICAgICAgICdXaGVuXG4nCisgICAgICAgICAgICAgJyAgIHN1cHBvcnRlZCwgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHRoZSBpbmRleCBtZXRob2QgJworICAgICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICAgICcgICBlZmZpY2llbnQgc2VhcmNoaW5nIG9mIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZS4gUGFzc2luZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBleHRyYSBhcmd1bWVudHMgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHVzaW5nICcKKyAgICAgICAgICAgICAnInNbaTpqXS5pbmRleCh4KSIsXG4nCisgICAgICAgICAgICAgJyAgIG9ubHkgd2l0aG91dCBjb3B5aW5nIGFueSBkYXRhIGFuZCB3aXRoIHRoZSByZXR1cm5lZCBpbmRleCAnCisgICAgICAgICAgICAgJ2JlaW5nXG4nCisgICAgICAgICAgICAgJyAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0ICcKKyAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgJyAgIHNsaWNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0ltbXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBnZW5lcmFsbHkgJworICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAndGhhdCBpcyBub3QgYWxzbyBpbXBsZW1lbnRlZCBieSBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGlzICcKKyAgICAgICAgICAgICAnc3VwcG9ydCBmb3JcbicKKyAgICAgICAgICAgICAndGhlICJoYXNoKCkiIGJ1aWx0LWluLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyBzdXBwb3J0IGFsbG93cyBpbW11dGFibGUgc2VxdWVuY2VzLCBzdWNoIGFzICJ0dXBsZSIgJworICAgICAgICAgICAgICdpbnN0YW5jZXMsIHRvXG4nCisgICAgICAgICAgICAgJ2JlIHVzZWQgYXMgImRpY3QiIGtleXMgYW5kIHN0b3JlZCBpbiAic2V0IiBhbmQgImZyb3plbnNldCIgJworICAgICAgICAgICAgICdpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBdHRlbXB0aW5nIHRvIGhhc2ggYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHRoYXQgY29udGFpbnMgJworICAgICAgICAgICAgICd1bmhhc2hhYmxlXG4nCisgICAgICAgICAgICAgJ3ZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdNdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ3R5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byAnCisgICAgICAgICAgICAgJ21ha2VcbicKKyAgICAgICAgICAgICAnaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2Ugb3BlcmF0aW9ucyBvbiBjdXN0b20gJworICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICd0eXBlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiAnCisgICAgICAgICAgICAgJ2lzIGFueVxuJworICAgICAgICAgICAgICdpdGVyYWJsZSBvYmplY3QgYW5kICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHRoYXQgbWVldHMgYW55ICcKKyAgICAgICAgICAgICAndHlwZSBhbmRcbicKKyAgICAgICAgICAgICAndmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgJworICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgJ2FjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9ICcKKyAgICAgICAgICAgICAnMjU1IikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgJ1Jlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkICcKKyAgICAgICAgICAgICAnYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICcqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogJworICAgICAgICAgICAgICdpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiAnCisgICAgICAgICAgICAgJ3RoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICcKKyAgICAgICAgICAgICAnKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSAnCisgICAgICAgICAgICAgJ1tdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgJworICAgICAgICAgICAgICdhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgJworICAgICAgICAgICAgICcqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAnb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgJworICAgICAgICAgICAgICdsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgZW5kIG9mICcKKyAgICAgICAgICAgICAndGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSAnCisgICAgICAgICAgICAgJ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAnW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgJworICAgICAgICAgICAgICcoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCAnCisgICAgICAgICAgICAgJ3NbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93IGNvcHkgb2YgJworICAgICAgICAgICAgICcicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICcKKyAgICAgICAgICAgICAnInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyAnCisgICAgICAgICAgICAgJ29mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSAnCisgICAgICAgICAgICAgJ3NhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAndCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgJworICAgICAgICAgICAgICdjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qICcKKyAgICAgICAgICAgICAndGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0ICcKKyAgICAgICAgICAgICAndGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSAnCisgICAgICAgICAgICAgJ2FzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSAnCisgICAgICAgICAgICAgJ1t4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgKmkqICcKKyAgICAgICAgICAgICAnYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAnCisgICAgICAgICAgICAgJypzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gJworICAgICAgICAgICAgICcqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0gJworICAgICAgICAgICAgICd4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogJworICAgICAgICAgICAgICdpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAncGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMS4gKnQqIG11c3QgaGF2ZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNsaWNlIGl0IGlzIHJlcGxhY2luZy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSAnCisgICAgICAgICAgICAgJ2RlZmF1bHRcbicKKyAgICAgICAgICAgICAnICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuJworICAgICAgICAgICAgICcgICBlY29ub215IG9mIHNwYWNlIHdoZW4gcmV2ZXJzaW5nIGEgbGFyZ2Ugc2VxdWVuY2UuICBUbyByZW1pbmQgJworICAgICAgICAgICAgICd1c2Vyc1xuJworICAgICAgICAgICAgICcgICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlICcKKyAgICAgICAgICAgICAncmV2ZXJzZWRcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc1LiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIGFyZSBpbmNsdWRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAiICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb24ndCBzdXBwb3J0IHNsaWNpbmdcbiIKKyAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoc3VjaCBhcyAiZGljdCIgYW5kICJzZXQiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbicKKyAgICAgICAgICAgICAnICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlICcKKyAgICAgICAgICAgICAnc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgJyAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCAnCisgICAgICAgICAgICAgJ211bHRpcGxlXG4nCisgICAgICAgICAgICAgJyAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgQ29tbW9uIFNlcXVlbmNlICcKKyAgICAgICAgICAgICAnT3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdMaXN0c1xuJworICAgICAgICAgICAgICc9PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTGlzdHMgYXJlIG11dGFibGUgc2VxdWVuY2VzLCB0eXBpY2FsbHkgdXNlZCB0byBzdG9yZSBjb2xsZWN0aW9ucyAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJ2hvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsICcKKyAgICAgICAgICAgICAndmFyeSBieVxuJworICAgICAgICAgICAgICdhcHBsaWNhdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyBsaXN0KFtpdGVyYWJsZV0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0cyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gc2V2ZXJhbCB3YXlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIHBhaXIgb2Ygc3F1YXJlIGJyYWNrZXRzIHRvIGRlbm90ZSB0aGUgZW1wdHkgbGlzdDogJworICAgICAgICAgICAgICciW10iXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogJworICAgICAgICAgICAgICciW2FdIixcbicKKyAgICAgICAgICAgICAnICAgICAiW2EsIGIsIGNdIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbjogIlt4IGZvciB4IGluIGl0ZXJhYmxlXSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgdGhlIHR5cGUgY29uc3RydWN0b3I6ICJsaXN0KCkiIG9yICJsaXN0KGl0ZXJhYmxlKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSBsaXN0IHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAiICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgIgorICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gJworICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICcgICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSBsaXN0LCBhIGNvcHkgaXMgbWFkZSBhbmRcbicKKyAgICAgICAgICAgICAnICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAnImxpc3QoXCdhYmNcJykiXG4nCisgICAgICAgICAgICAgJyAgIHJldHVybnMgIltcJ2FcJywgXCdiXCcsIFwnY1wnXSIgYW5kICJsaXN0KCAoMSwgMiwgMykgKSIgJworICAgICAgICAgICAgICdyZXR1cm5zICJbMSwgMixcbicKKyAgICAgICAgICAgICAnICAgM10iLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICcgICBsaXN0LCAiW10iLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTWFueSBvdGhlciBvcGVyYXRpb25zIGFsc28gcHJvZHVjZSBsaXN0cywgaW5jbHVkaW5nIHRoZSAnCisgICAgICAgICAgICAgJyJzb3J0ZWQoKSJcbicKKyAgICAgICAgICAgICAnICAgYnVpbHQtaW4uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBMaXN0cyBpbXBsZW1lbnQgYWxsIG9mIHRoZSBjb21tb24gYW5kIG11dGFibGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICcgICBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHNvcnQoKiwga2V5PU5vbmUsIHJldmVyc2U9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoaXMgbWV0aG9kIHNvcnRzIHRoZSBsaXN0IGluIHBsYWNlLCB1c2luZyBvbmx5ICI8IiAnCisgICAgICAgICAgICAgJ2NvbXBhcmlzb25zXG4nCisgICAgICAgICAgICAgJyAgICAgIGJldHdlZW4gaXRlbXMuIEV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIC0gaWYgYW55ICcKKyAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICcgICAgICBvcGVyYXRpb25zIGZhaWwsIHRoZSBlbnRpcmUgc29ydCBvcGVyYXRpb24gd2lsbCBmYWlsIChhbmQgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgICAgbGlzdCB3aWxsIGxpa2VseSBiZSBsZWZ0IGluIGEgcGFydGlhbGx5IG1vZGlmaWVkIHN0YXRlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICJzb3J0KCkiIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyB0aGF0IGNhbiBvbmx5IGJlIHBhc3NlZCBieVxuJworICAgICAgICAgICAgICcgICAgICBrZXl3b3JkIChrZXl3b3JkLW9ubHkgYXJndW1lbnRzKTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICcgICAgICBleHRyYWN0IGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudCAoZm9yICcKKyAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAnICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiAnCisgICAgICAgICAgICAgJ3RoZSBsaXN0XG4nCisgICAgICAgICAgICAgJyAgICAgIGlzIGNhbGN1bGF0ZWQgb25jZSBhbmQgdGhlbiB1c2VkIGZvciB0aGUgZW50aXJlIHNvcnRpbmcgJworICAgICAgICAgICAgICdwcm9jZXNzLlxuJworICAgICAgICAgICAgICcgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAiTm9uZSIgbWVhbnMgdGhhdCBsaXN0IGl0ZW1zIGFyZSAnCisgICAgICAgICAgICAgJ3NvcnRlZFxuJworICAgICAgICAgICAgICcgICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlICJmdW5jdG9vbHMuY21wX3RvX2tleSgpIiB1dGlsaXR5IGlzIGF2YWlsYWJsZSB0byAnCisgICAgICAgICAgICAgJ2NvbnZlcnQgYVxuJworICAgICAgICAgICAgICcgICAgICAyLnggc3R5bGUgKmNtcCogZnVuY3Rpb24gdG8gYSAqa2V5KiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gIlRydWUiLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgJ2xpc3RcbicKKyAgICAgICAgICAgICAnICAgICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3IgZWNvbm9teSBvZiAnCisgICAgICAgICAgICAgJ3NwYWNlXG4nCisgICAgICAgICAgICAgJyAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgJworICAgICAgICAgICAgICdvcGVyYXRlc1xuJworICAgICAgICAgICAgICcgICAgICBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSBzb3J0ZWQgc2VxdWVuY2UgJworICAgICAgICAgICAgICcodXNlXG4nCisgICAgICAgICAgICAgJyAgICAgICJzb3J0ZWQoKSIgdG8gZXhwbGljaXRseSByZXF1ZXN0IGEgbmV3IHNvcnRlZCBsaXN0ICcKKyAgICAgICAgICAgICAnaW5zdGFuY2UpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlICJzb3J0KCkiIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZS4gIEEgc29ydCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgICAgIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnICAgICAgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWwgZm9yICcKKyAgICAgICAgICAgICAnc29ydGluZyBpblxuJworICAgICAgICAgICAgICcgICAgICBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsIHRoZW4gYnkgJworICAgICAgICAgICAgICdzYWxhcnlcbicKKyAgICAgICAgICAgICAnICAgICAgZ3JhZGUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgJworICAgICAgICAgICAgICdzb3J0ZWQsXG4nCisgICAgICAgICAgICAgJyAgICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlICcKKyAgICAgICAgICAgICAnbGlzdCBpc1xuJworICAgICAgICAgICAgICcgICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgJworICAgICAgICAgICAgICdhcHBlYXJcbicKKyAgICAgICAgICAgICAnICAgICAgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyAiVmFsdWVFcnJvciIgaWYgaXQgY2FuICcKKyAgICAgICAgICAgICAnZGV0ZWN0XG4nCisgICAgICAgICAgICAgJyAgICAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1R1cGxlc1xuJworICAgICAgICAgICAgICc9PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1R1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgJworICAgICAgICAgICAgICdjb2xsZWN0aW9ucyBvZlxuJworICAgICAgICAgICAgICdoZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJyJlbnVtZXJhdGUoKSJcbicKKyAgICAgICAgICAgICAnYnVpbHQtaW4pLiBUdXBsZXMgYXJlIGFsc28gdXNlZCBmb3IgY2FzZXMgd2hlcmUgYW4gaW1tdXRhYmxlICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAnb2YgaG9tb2dlbmVvdXMgZGF0YSBpcyBuZWVkZWQgKHN1Y2ggYXMgYWxsb3dpbmcgc3RvcmFnZSBpbiBhICcKKyAgICAgICAgICAgICAnInNldCIgb3JcbicKKyAgICAgICAgICAgICAnImRpY3QiIGluc3RhbmNlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHR1cGxlKFtpdGVyYWJsZV0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUdXBsZXMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIGEgbnVtYmVyIG9mIHdheXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAnCisgICAgICAgICAgICAgJyIoKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgJworICAgICAgICAgICAgICciKGEsKSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogU2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogImEsIGIsIGMiIG9yICIoYSwgYiwgYykiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHRoZSAidHVwbGUoKSIgYnVpbHQtaW46ICJ0dXBsZSgpIiBvciAnCisgICAgICAgICAgICAgJyJ0dXBsZShpdGVyYWJsZSkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgdHVwbGUgd2hvc2UgaXRlbXMgYXJlIHRoZSBzYW1lIGFuZCAnCisgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICIgICBzYW1lIG9yZGVyIGFzICppdGVyYWJsZSoncyBpdGVtcy4gICppdGVyYWJsZSogbWF5IGJlIGVpdGhlciAiCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UsIGEgY29udGFpbmVyIHRoYXQgc3VwcG9ydHMgaXRlcmF0aW9uLCBvciBhbiAnCisgICAgICAgICAgICAgJ2l0ZXJhdG9yXG4nCisgICAgICAgICAgICAgJyAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIHR1cGxlLCBpdCBpcyByZXR1cm5lZFxuJworICAgICAgICAgICAgICcgICB1bmNoYW5nZWQuIEZvciBleGFtcGxlLCAidHVwbGUoXCdhYmNcJykiIHJldHVybnMgIihcJ2FcJywgJworICAgICAgICAgICAgICdcJ2JcJywgXCdjXCcpIlxuJworICAgICAgICAgICAgICcgICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBnaXZlbiwgdGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBuZXcgZW1wdHkgdHVwbGUsICIoKSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgaXQgaXMgYWN0dWFsbHkgdGhlIGNvbW1hIHdoaWNoIG1ha2VzIGEgdHVwbGUsIG5vdCAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcgICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSAnCisgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgJyAgIHR1cGxlIGNhc2UsIG9yIHdoZW4gdGhleSBhcmUgbmVlZGVkIHRvIGF2b2lkIHN5bnRhY3RpYyAnCisgICAgICAgICAgICAgJ2FtYmlndWl0eS5cbicKKyAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGUsICJmKGEsIGIsIGMpIiBpcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCB0aHJlZSAnCisgICAgICAgICAgICAgJ2FyZ3VtZW50cyxcbicKKyAgICAgICAgICAgICAnICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSAnCisgICAgICAgICAgICAgJ3NvbGVcbicKKyAgICAgICAgICAgICAnICAgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUdXBsZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGb3IgaGV0ZXJvZ2VuZW91cyBjb2xsZWN0aW9ucyBvZiBkYXRhIHdoZXJlIGFjY2VzcyBieSBuYW1lIGlzICcKKyAgICAgICAgICAgICAnY2xlYXJlclxuJworICAgICAgICAgICAgICd0aGFuIGFjY2VzcyBieSBpbmRleCwgImNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoKSIgbWF5IGJlIGEgbW9yZVxuJworICAgICAgICAgICAgICdhcHByb3ByaWF0ZSBjaG9pY2UgdGhhbiBhIHNpbXBsZSB0dXBsZSBvYmplY3QuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUmFuZ2VzXG4nCisgICAgICAgICAgICAgJz09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJyYW5nZSIgdHlwZSByZXByZXNlbnRzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSBvZiBudW1iZXJzIGFuZCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2NvbW1vbmx5IHVzZWQgZm9yIGxvb3BpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2YgdGltZXMgaW4gImZvciIgJworICAgICAgICAgICAgICdsb29wcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHJhbmdlKHN0b3ApXG4nCisgICAgICAgICAgICAgJ2NsYXNzIHJhbmdlKHN0YXJ0LCBzdG9wWywgc3RlcF0pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgYXJndW1lbnRzIHRvIHRoZSByYW5nZSBjb25zdHJ1Y3RvciBtdXN0IGJlIGludGVnZXJzICcKKyAgICAgICAgICAgICAnKGVpdGhlclxuJworICAgICAgICAgICAgICcgICBidWlsdC1pbiAiaW50IiBvciBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgIl9faW5kZXhfXyJcbicKKyAgICAgICAgICAgICAnICAgc3BlY2lhbCBtZXRob2QpLiAgSWYgdGhlICpzdGVwKiBhcmd1bWVudCBpcyBvbWl0dGVkLCBpdCAnCisgICAgICAgICAgICAgJ2RlZmF1bHRzIHRvXG4nCisgICAgICAgICAgICAgJyAgICIxIi4gSWYgdGhlICpzdGFydCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIjAiLiAnCisgICAgICAgICAgICAgJ0lmXG4nCisgICAgICAgICAgICAgJyAgICpzdGVwKiBpcyB6ZXJvLCAiVmFsdWVFcnJvciIgaXMgcmFpc2VkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRm9yIGEgcG9zaXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgYSByYW5nZSAiciIgYXJlICcKKyAgICAgICAgICAgICAnZGV0ZXJtaW5lZFxuJworICAgICAgICAgICAgICcgICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgJworICAgICAgICAgICAgICcicltpXSA8XG4nCisgICAgICAgICAgICAgJyAgIHN0b3AiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRm9yIGEgbmVnYXRpdmUgKnN0ZXAqLCB0aGUgY29udGVudHMgb2YgdGhlIHJhbmdlIGFyZSBzdGlsbFxuJworICAgICAgICAgICAgICcgICBkZXRlcm1pbmVkIGJ5IHRoZSBmb3JtdWxhICJyW2ldID0gc3RhcnQgKyBzdGVwKmkiLCBidXQgdGhlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnN0cmFpbnRzIGFyZSAiaSA+PSAwIiBhbmQgInJbaV0gPiBzdG9wIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEEgcmFuZ2Ugb2JqZWN0IHdpbGwgYmUgZW1wdHkgaWYgInJbMF0iIGRvZXMgbm90IG1lZXQgdGhlICcKKyAgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICAnICAgY29uc3RyYWludC4gUmFuZ2VzIGRvIHN1cHBvcnQgbmVnYXRpdmUgaW5kaWNlcywgYnV0IHRoZXNlICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJyAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICdkZXRlcm1pbmVkIGJ5XG4nCisgICAgICAgICAgICAgJyAgIHRoZSBwb3NpdGl2ZSBpbmRpY2VzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2VzIGNvbnRhaW5pbmcgYWJzb2x1dGUgdmFsdWVzIGxhcmdlciB0aGFuICJzeXMubWF4c2l6ZSIgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZVxuJworICAgICAgICAgICAgICcgICAiT3ZlcmZsb3dFcnJvciIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSYW5nZSBleGFtcGxlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEwKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDExKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCA1LCAxMCwgMTUsIDIwLCAyNV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMTAsIDMpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgMywgNiwgOV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgLTEwLCAtMSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCAtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgsIC05XVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgwKSlcbicKKyAgICAgICAgICAgICAnICAgICAgW11cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMSwgMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFtdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBSYW5nZXMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICdleGNlcHRcbicKKyAgICAgICAgICAgICAnICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2UgJworICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJyAgIGNhbiBvbmx5IHJlcHJlc2VudCBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgYSBzdHJpY3QgcGF0dGVybiAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICcgICByZXBldGl0aW9uIGFuZCBjb25jYXRlbmF0aW9uIHdpbGwgdXN1YWxseSB2aW9sYXRlIHRoYXQgJworICAgICAgICAgICAgICdwYXR0ZXJuKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHN0YXJ0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGFydCogcGFyYW1ldGVyIChvciAiMCIgaWYgdGhlICcKKyAgICAgICAgICAgICAncGFyYW1ldGVyIHdhc1xuJworICAgICAgICAgICAgICcgICAgICBub3Qgc3VwcGxpZWQpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdG9wXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdG9wKiBwYXJhbWV0ZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHN0ZXBcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgKnN0ZXAqIHBhcmFtZXRlciAob3IgIjEiIGlmIHRoZSBwYXJhbWV0ZXIgJworICAgICAgICAgICAgICd3YXNcbicKKyAgICAgICAgICAgICAnICAgICAgbm90IHN1cHBsaWVkKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGFkdmFudGFnZSBvZiB0aGUgInJhbmdlIiB0eXBlIG92ZXIgYSByZWd1bGFyICJsaXN0IiBvciAnCisgICAgICAgICAgICAgJyJ0dXBsZSIgaXNcbicKKyAgICAgICAgICAgICAndGhhdCBhICJyYW5nZSIgb2JqZWN0IHdpbGwgYWx3YXlzIHRha2UgdGhlIHNhbWUgKHNtYWxsKSBhbW91bnQgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICdtZW1vcnksIG5vIG1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cyAoYXMgaXQgJworICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgJ3N0b3JlcyB0aGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgdmFsdWVzLCBjYWxjdWxhdGluZyAnCisgICAgICAgICAgICAgJ2luZGl2aWR1YWxcbicKKyAgICAgICAgICAgICAnaXRlbXMgYW5kIHN1YnJhbmdlcyBhcyBuZWVkZWQpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kXG4nCisgICAgICAgICAgICAgJ3Byb3ZpZGUgZmVhdHVyZXMgc3VjaCBhcyBjb250YWlubWVudCB0ZXN0cywgZWxlbWVudCBpbmRleCAnCisgICAgICAgICAgICAgJ2xvb2t1cCxcbicKKyAgICAgICAgICAgICAnc2xpY2luZyBhbmQgc3VwcG9ydCBmb3IgbmVnYXRpdmUgaW5kaWNlcyAoc2VlIFNlcXVlbmNlIFR5cGVzIC0tLSAnCisgICAgICAgICAgICAgJ2xpc3QsXG4nCisgICAgICAgICAgICAgJ3R1cGxlLCByYW5nZSk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKVxuJworICAgICAgICAgICAgICc+Pj4gclxuJworICAgICAgICAgICAgICdyYW5nZSgwLCAyMCwgMilcbicKKyAgICAgICAgICAgICAnPj4+IDExIGluIHJcbicKKyAgICAgICAgICAgICAnRmFsc2VcbicKKyAgICAgICAgICAgICAnPj4+IDEwIGluIHJcbicKKyAgICAgICAgICAgICAnVHJ1ZVxuJworICAgICAgICAgICAgICc+Pj4gci5pbmRleCgxMClcbicKKyAgICAgICAgICAgICAnNVxuJworICAgICAgICAgICAgICc+Pj4gcls1XVxuJworICAgICAgICAgICAgICcxMFxuJworICAgICAgICAgICAgICc+Pj4gcls6NV1cbicKKyAgICAgICAgICAgICAncmFuZ2UoMCwgMTAsIDIpXG4nCisgICAgICAgICAgICAgJz4+PiByWy0xXVxuJworICAgICAgICAgICAgICcxOFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGVzdGluZyByYW5nZSBvYmplY3RzIGZvciBlcXVhbGl0eSB3aXRoICI9PSIgYW5kICIhPSIgY29tcGFyZXMgJworICAgICAgICAgICAgICd0aGVtIGFzXG4nCisgICAgICAgICAgICAgJ3NlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmICcKKyAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICdyZXByZXNlbnQgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzLiAgKE5vdGUgdGhhdCB0d28gcmFuZ2UgJworICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJ3RoYXQgY29tcGFyZSBlcXVhbCBtaWdodCBoYXZlIGRpZmZlcmVudCAic3RhcnQiLCAic3RvcCIgYW5kICcKKyAgICAgICAgICAgICAnInN0ZXAiXG4nCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgJworICAgICAgICAgICAgICcicmFuZ2UoMCwgMyxcbicKKyAgICAgICAgICAgICAnMikgPT0gcmFuZ2UoMCwgNCwgMikiLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEltcGxlbWVudCB0aGUgU2VxdWVuY2UgQUJDLiBTdXBwb3J0ICcKKyAgICAgICAgICAgICAnc2xpY2luZ1xuJworICAgICAgICAgICAgICdhbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluICcKKyAgICAgICAgICAgICAnY29uc3RhbnRcbicKKyAgICAgICAgICAgICAndGltZSBpbnN0ZWFkIG9mIGl0ZXJhdGluZyB0aHJvdWdoIGFsbCBpdGVtcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IERlZmluZSAnPT0nIGFuZCAnIT0nIHRvIGNvbXBhcmUgcmFuZ2UgIgorICAgICAgICAgICAgICdvYmplY3RzXG4nCisgICAgICAgICAgICAgJ2Jhc2VkIG9uIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhleSBkZWZpbmUgKGluc3RlYWQgb2YgJworICAgICAgICAgICAgICdjb21wYXJpbmdcbicKKyAgICAgICAgICAgICAnYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5KS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMuXG4nLAorICd0eXBlc3NlcS1tdXRhYmxlJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ011dGFibGUgU2VxdWVuY2UgVHlwZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBvbiAnCisgICAgICAgICAgICAgICAgICAgICAnbXV0YWJsZSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncHJvdmlkZWQgdG8gbWFrZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2l0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gJworICAgICAgICAgICAgICAgICAgICAgJ2N1c3RvbSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJ3R5cGVzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlLCAqdCogaXMgYW55XG4nCisgICAgICAgICAgICAgICAgICAgICAnaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICdtZWV0cyBhbnkgdHlwZSBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSByZXN0cmljdGlvbnMgaW1wb3NlZCBieSAqcyogKGZvciBleGFtcGxlLCAnCisgICAgICAgICAgICAgICAgICAgICAnImJ5dGVhcnJheSIgb25seVxuJworICAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4ICcKKyAgICAgICAgICAgICAgICAgICAgICc8PSAyNTUiKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdyZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICcqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqICcKKyAgICAgICAgICAgICAgICAgICAgICd0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAnCisgICAgICAgICAgICAgICAgICAgICAnKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gJworICAgICAgICAgICAgICAgICAgICAgJ1tdIiAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnInNbaTpqOmtdIiBhcmUgICB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgJworICAgICAgICAgICAgICAgICAgICAgJ29mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6ajprXSIgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2xpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5hcHBlbmQoeCkiICAgICAgICAgICAgICAgICAgfCBhcHBlbmRzICp4KiB0byB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2VuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgJworICAgICAgICAgICAgICAgICAgICAgJ2FzICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gJworICAgICAgICAgICAgICAgICAgICAgJ1t4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyAnCisgICAgICAgICAgICAgICAgICAgICAnZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgImRlbCAnCisgICAgICAgICAgICAgICAgICAgICAnc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLmNvcHkoKSIgICAgICAgICAgICAgICAgICAgICB8IGNyZWF0ZXMgYSBzaGFsbG93ICcKKyAgICAgICAgICAgICAgICAgICAgICdjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAnCisgICAgICAgICAgICAgICAgICAgICAnInNbOl0iKSAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzIG9mIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0ICcKKyAgICAgICAgICAgICAgICAgICAgICdwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAic1tsZW4ocyk6bGVuKHMpXSAnCisgICAgICAgICAgICAgICAgICAgICAnPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMgKj0gbiIgICAgICAgICAgICAgICAgICAgICAgIHwgdXBkYXRlcyAqcyogd2l0aCBpdHMgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiAnCisgICAgICAgICAgICAgICAgICAgICAndGltZXMgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiAnCisgICAgICAgICAgICAgICAgICAgICAnYXQgdGhlICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqICcKKyAgICAgICAgICAgICAgICAgICAgICcoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2k6aV0gPSAnCisgICAgICAgICAgICAgICAgICAgICAnW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5wb3AoW2ldKSIgICAgICAgICAgICAgICAgICAgfCByZXRyaWV2ZXMgdGhlIGl0ZW0gYXQgJworICAgICAgICAgICAgICAgICAgICAgJyppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gJworICAgICAgICAgICAgICAgICAgICAgJypzKiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSAnCisgICAgICAgICAgICAgICAgICAgICAnZnJvbSAqcyogICB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSAnCisgICAgICAgICAgICAgICAgICAgICAneCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGVzOlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncmVwbGFjaW5nLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAnYnkgZGVmYXVsdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gJworICAgICAgICAgICAgICAgICAgICAgJypzKi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICc0LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSAnCisgICAgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gJworICAgICAgICAgICAgICAgICAgICAgJ3JlbWluZCB1c2Vyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgaXQgb3BlcmF0ZXMgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHJldmVyc2VkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5ICcKKyAgICAgICAgICAgICAgICAgICAgICd3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgIiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAnc2xpY2luZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjM6ICJjbGVhcigpIiBhbmQgImNvcHkoKSIgbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICc2LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCAnCisgICAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VkIG11bHRpcGxlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciBDb21tb24gU2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ09wZXJhdGlvbnMuXG4nLAorICd1bmFyeSc6ICdcbicKKyAgICAgICAgICAnVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAncHJpb3JpdHk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIi0iIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpY1xuJworICAgICAgICAgICdhcmd1bWVudC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSB1bmFyeSAiKyIgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCAnCisgICAgICAgICAgJ3VuY2hhbmdlZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSB1bmFyeSAifiIgKGludmVydCkgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAnCisgICAgICAgICAgJ2l0c1xuJworICAgICAgICAgICdpbnRlZ2VyIGFyZ3VtZW50LiAgVGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mICJ4IiBpcyBkZWZpbmVkIGFzXG4nCisgICAgICAgICAgJyItKHgrMSkiLiAgSXQgb25seSBhcHBsaWVzIHRvIGludGVncmFsIG51bWJlcnMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwgJworICAgICAgICAgICdhXG4nCisgICAgICAgICAgJyJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAorICd3aGlsZSc6ICdcbicKKyAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG4nCisgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgdHJ1ZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdmaXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgJworICAgICAgICAgICd0aW1lXG4nCisgICAgICAgICAgJ2l0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyAnCisgICAgICAgICAgJ2V4ZWN1dGVkXG4nCisgICAgICAgICAgJ2FuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgJworICAgICAgICAgICdsb29wXG4nCisgICAgICAgICAgJ3dpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiICcKKyAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgJ2V4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgJworICAgICAgICAgICdiYWNrXG4nCisgICAgICAgICAgJ3RvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAorICd3aXRoJzogJ1xuJworICAgICAgICAgJ1RoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbicKKyAgICAgICAgICdtZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uIFdpdGggU3RhdGVtZW50XG4nCisgICAgICAgICAnQ29udGV4dCBNYW5hZ2VycykuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG4nCisgICAgICAgICAndXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuJworICAgICAgICAgJyAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbicKKyAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbicKKyAgICAgICAgICcgICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZW50ZXJfXygpIiBtZXRob2QgaXMgaW52b2tlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc0LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbicKKyAgICAgICAgICcgICB2YWx1ZSBmcm9tICJfX2VudGVyX18oKSIgaXMgYXNzaWduZWQgdG8gaXQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4nCisgICAgICAgICAnICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsIGFsd2F5cyAnCisgICAgICAgICAnYmVcbicKKyAgICAgICAgICcgICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbicKKyAgICAgICAgICcgICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4nCisgICAgICAgICAnICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJzUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc2LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4nCisgICAgICAgICAnICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsIGFuZFxuJworICAgICAgICAgJyAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgJworICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAnICAgIk5vbmUiIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gJworICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAnICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgJworICAgICAgICAgJ3JlcmFpc2VkLlxuJworICAgICAgICAgJyAgIElmIHRoZSByZXR1cm4gdmFsdWUgd2FzIHRydWUsIHRoZSBleGNlcHRpb24gaXMgc3VwcHJlc3NlZCwgYW5kXG4nCisgICAgICAgICAnICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbicKKyAgICAgICAgICcgICBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sICcKKyAgICAgICAgICd0aGVcbicKKyAgICAgICAgICcgICByZXR1cm4gdmFsdWUgZnJvbSAiX19leGl0X18oKSIgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiAnCisgICAgICAgICAncHJvY2VlZHNcbicKKyAgICAgICAgICcgICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1dpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG4nCisgICAgICAgICAnbXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4nCisgICAgICAgICAnICAgICAgIHN1aXRlXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGE6XG4nCisgICAgICAgICAnICAgICAgIHdpdGggQigpIGFzIGI6XG4nCisgICAgICAgICAnICAgICAgICAgICBzdWl0ZVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAnICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICcKKyAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicsCisgJ3lpZWxkJzogJ1xuJworICAgICAgICAgICdUaGUgInlpZWxkIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBICJ5aWVsZCIgc3RhdGVtZW50IGlzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGEgeWllbGQgJworICAgICAgICAgICdleHByZXNzaW9uLlxuJworICAgICAgICAgICdUaGUgeWllbGQgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIG9taXQgdGhlIHBhcmVudGhlc2VzIHRoYXQgd291bGRcbicKKyAgICAgICAgICAnb3RoZXJ3aXNlIGJlIHJlcXVpcmVkIGluIHRoZSBlcXVpdmFsZW50IHlpZWxkIGV4cHJlc3Npb24gJworICAgICAgICAgICdzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgJ0ZvciBleGFtcGxlLCB0aGUgeWllbGQgc3RhdGVtZW50c1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgeWllbGQgPGV4cHI+XG4nCisgICAgICAgICAgJyAgIHlpZWxkIGZyb20gPGV4cHI+XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhcmUgZXF1aXZhbGVudCB0byB0aGUgeWllbGQgZXhwcmVzc2lvbiBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAoeWllbGQgPGV4cHI+KVxuJworICAgICAgICAgICcgICAoeWllbGQgZnJvbSA8ZXhwcj4pXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdZaWVsZCBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYVxuJworICAgICAgICAgICcqZ2VuZXJhdG9yKiBmdW5jdGlvbiwgYW5kIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlICcKKyAgICAgICAgICAnZ2VuZXJhdG9yXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uLiAgVXNpbmcgeWllbGQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8gJworICAgICAgICAgICdjYXVzZVxuJworICAgICAgICAgICd0aGF0IGRlZmluaXRpb24gdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSBub3JtYWxcbicKKyAgICAgICAgICAnZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdGb3IgZnVsbCBkZXRhaWxzIG9mICJ5aWVsZCIgc2VtYW50aWNzLCByZWZlciB0byB0aGUgWWllbGQgJworICAgICAgICAgICdleHByZXNzaW9uc1xuJworICAgICAgICAgICdzZWN0aW9uLlxuJ30KZGlmZiAtLWdpdCBhL0xpYi9yYW5kb20ucHkgYi9MaWIvcmFuZG9tLnB5CmluZGV4IDU5NTA3MzUuLjFjZmZiMGEgMTAwNjQ0Ci0tLSBhL0xpYi9yYW5kb20ucHkKKysrIGIvTGliL3JhbmRvbS5weQpAQCAtNjA2LDExICs2MDYsMTEgQEAKIAogICAgICAgICAjIFRoaXMgdmVyc2lvbiBkdWUgdG8gSmFubmUgU2lua2tvbmVuLCBhbmQgbWF0Y2hlcyBhbGwgdGhlIHN0ZAogICAgICAgICAjIHRleHRzIChlLmcuLCBLbnV0aCBWb2wgMiBFZCAzIHBnIDEzNCAidGhlIGJldGEgZGlzdHJpYnV0aW9uIikuCi0gICAgICAgIHkgPSBzZWxmLmdhbW1hdmFyaWF0ZShhbHBoYSwgMS4pCisgICAgICAgIHkgPSBzZWxmLmdhbW1hdmFyaWF0ZShhbHBoYSwgMS4wKQogICAgICAgICBpZiB5ID09IDA6CiAgICAgICAgICAgICByZXR1cm4gMC4wCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4geSAvICh5ICsgc2VsZi5nYW1tYXZhcmlhdGUoYmV0YSwgMS4pKQorICAgICAgICAgICAgcmV0dXJuIHkgLyAoeSArIHNlbGYuZ2FtbWF2YXJpYXRlKGJldGEsIDEuMCkpCiAKICMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIFBhcmV0byAtLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9MaWIvcmUucHkgYi9MaWIvcmUucHkKaW5kZXggZGRlODkwMS4uNjYxOTI5ZSAxMDA2NDQKLS0tIGEvTGliL3JlLnB5CisrKyBiL0xpYi9yZS5weQpAQCAtMTE5LDcgKzExOSw2IEBACiAKICIiIgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgc3JlX2NvbXBpbGUKIGltcG9ydCBzcmVfcGFyc2UKIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9ybGNvbXBsZXRlci5weSBiL0xpYi9ybGNvbXBsZXRlci5weQppbmRleCA0MDFhNjI2Li5iY2E0YTdiIDEwMDY0NAotLS0gYS9MaWIvcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3JsY29tcGxldGVyLnB5CkBAIC0xMTMsNiArMTEzLDEyIEBACiAgICAgICAgIGZvciB3b3JkIGluIGtleXdvcmQua3dsaXN0OgogICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gdGV4dDoKICAgICAgICAgICAgICAgICBzZWVuLmFkZCh3b3JkKQorICAgICAgICAgICAgICAgIGlmIHdvcmQgaW4geydmaW5hbGx5JywgJ3RyeSd9OgorICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArICc6JworICAgICAgICAgICAgICAgIGVsaWYgd29yZCBub3QgaW4geydGYWxzZScsICdOb25lJywgJ1RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdicmVhaycsICdjb250aW51ZScsICdwYXNzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxzZSd9OgorICAgICAgICAgICAgICAgICAgICB3b3JkID0gd29yZCArICcgJwogICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHdvcmQpCiAgICAgICAgIGZvciBuc3BhY2UgaW4gW3NlbGYubmFtZXNwYWNlLCBidWlsdGlucy5fX2RpY3RfX106CiAgICAgICAgICAgICBmb3Igd29yZCwgdmFsIGluIG5zcGFjZS5pdGVtcygpOgpAQCAtMTUyLDE0ICsxNTgsMzAgQEAKICAgICAgICAgICAgIHdvcmRzLnVwZGF0ZShnZXRfY2xhc3NfbWVtYmVycyh0aGlzb2JqZWN0Ll9fY2xhc3NfXykpCiAgICAgICAgIG1hdGNoZXMgPSBbXQogICAgICAgICBuID0gbGVuKGF0dHIpCi0gICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgotICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gYXR0cjoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIodGhpc29iamVjdCwgd29yZCkKLSAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgIyBFeGNsdWRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHNldAotICAgICAgICAgICAgICAgIHdvcmQgPSBzZWxmLl9jYWxsYWJsZV9wb3N0Zml4KHZhbCwgIiVzLiVzIiAlIChleHByLCB3b3JkKSkKLSAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCh3b3JkKQorICAgICAgICBpZiBhdHRyID09ICcnOgorICAgICAgICAgICAgbm9wcmVmaXggPSAnXycKKyAgICAgICAgZWxpZiBhdHRyID09ICdfJzoKKyAgICAgICAgICAgIG5vcHJlZml4ID0gJ19fJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9wcmVmaXggPSBOb25lCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKKyAgICAgICAgICAgICAgICBpZiAod29yZFs6bl0gPT0gYXR0ciBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IChub3ByZWZpeCBhbmQgd29yZFs6bisxXSA9PSBub3ByZWZpeCkpOgorICAgICAgICAgICAgICAgICAgICBtYXRjaCA9ICIlcy4lcyIgJSAoZXhwciwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cih0aGlzb2JqZWN0LCB3b3JkKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAgIyBJbmNsdWRlIGV2ZW4gaWYgYXR0cmlidXRlIG5vdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsIG1hdGNoKQorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZChtYXRjaCkKKyAgICAgICAgICAgIGlmIG1hdGNoZXMgb3Igbm90IG5vcHJlZml4OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3ByZWZpeCA9PSAnXyc6CisgICAgICAgICAgICAgICAgbm9wcmVmaXggPSAnX18nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vcHJlZml4ID0gTm9uZQogICAgICAgICBtYXRjaGVzLnNvcnQoKQogICAgICAgICByZXR1cm4gbWF0Y2hlcwogCmRpZmYgLS1naXQgYS9MaWIvc2NoZWQucHkgYi9MaWIvc2NoZWQucHkKaW5kZXggYjQ3NjQ4ZC4uYmQ3YzBmMSAxMDA2NDQKLS0tIGEvTGliL3NjaGVkLnB5CisrKyBiL0xpYi9zY2hlZC5weQpAQCAtNDYsNiArNDYsMTcgQEAKICAgICBkZWYgX19ndF9fKHMsIG8pOiByZXR1cm4gKHMudGltZSwgcy5wcmlvcml0eSkgPiAgKG8udGltZSwgby5wcmlvcml0eSkKICAgICBkZWYgX19nZV9fKHMsIG8pOiByZXR1cm4gKHMudGltZSwgcy5wcmlvcml0eSkgPj0gKG8udGltZSwgby5wcmlvcml0eSkKIAorRXZlbnQudGltZS5fX2RvY19fID0gKCcnJ051bWVyaWMgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKK3RpbWVmdW5jIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuJycnKQorRXZlbnQucHJpb3JpdHkuX19kb2NfXyA9ICgnJydFdmVudHMgc2NoZWR1bGVkIGZvciB0aGUgc2FtZSB0aW1lIHdpbGwgYmUgZXhlY3V0ZWQKK2luIHRoZSBvcmRlciBvZiB0aGVpciBwcmlvcml0eS4nJycpCitFdmVudC5hY3Rpb24uX19kb2NfXyA9ICgnJydFeGVjdXRpbmcgdGhlIGV2ZW50IG1lYW5zIGV4ZWN1dGluZworYWN0aW9uKCphcmd1bWVudCwgKiprd2FyZ3MpJycnKQorRXZlbnQuYXJndW1lbnQuX19kb2NfXyA9ICgnJydhcmd1bWVudCBpcyBhIHNlcXVlbmNlIGhvbGRpbmcgdGhlIHBvc2l0aW9uYWwKK2FyZ3VtZW50cyBmb3IgdGhlIGFjdGlvbi4nJycpCitFdmVudC5rd2FyZ3MuX19kb2NfXyA9ICgnJydrd2FyZ3MgaXMgYSBkaWN0aW9uYXJ5IGhvbGRpbmcgdGhlIGtleXdvcmQKK2FyZ3VtZW50cyBmb3IgdGhlIGFjdGlvbi4nJycpCisKIF9zZW50aW5lbCA9IG9iamVjdCgpCiAKIGNsYXNzIHNjaGVkdWxlcjoKZGlmZiAtLWdpdCBhL0xpYi9zZWNyZXRzLnB5IGIvTGliL3NlY3JldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmYTQ1MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIkdlbmVyYXRlIGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZyBwc2V1ZG8tcmFuZG9tIG51bWJlcnMgc3VpdGFibGUgZm9yCittYW5hZ2luZyBzZWNyZXRzIHN1Y2ggYXMgYWNjb3VudCBhdXRoZW50aWNhdGlvbiwgdG9rZW5zLCBhbmQgc2ltaWxhci4KKworU2VlIFBFUCA1MDYgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNTA2LworCisiIiIKKworX19hbGxfXyA9IFsnY2hvaWNlJywgJ3JhbmRiZWxvdycsICdyYW5kYml0cycsICdTeXN0ZW1SYW5kb20nLAorICAgICAgICAgICAndG9rZW5fYnl0ZXMnLCAndG9rZW5faGV4JywgJ3Rva2VuX3VybHNhZmUnLAorICAgICAgICAgICAnY29tcGFyZV9kaWdlc3QnLAorICAgICAgICAgICBdCisKKworaW1wb3J0IGJhc2U2NAoraW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgb3MKKworZnJvbSBobWFjIGltcG9ydCBjb21wYXJlX2RpZ2VzdAorZnJvbSByYW5kb20gaW1wb3J0IFN5c3RlbVJhbmRvbQorCitfc3lzcmFuZCA9IFN5c3RlbVJhbmRvbSgpCisKK3JhbmRiaXRzID0gX3N5c3JhbmQuZ2V0cmFuZGJpdHMKK2Nob2ljZSA9IF9zeXNyYW5kLmNob2ljZQorCitkZWYgcmFuZGJlbG93KGV4Y2x1c2l2ZV91cHBlcl9ib3VuZCk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIGludCBpbiB0aGUgcmFuZ2UgWzAsIG4pLiIiIgorICAgIHJldHVybiBfc3lzcmFuZC5fcmFuZGJlbG93KGV4Y2x1c2l2ZV91cHBlcl9ib3VuZCkKKworREVGQVVMVF9FTlRST1BZID0gMzIgICMgbnVtYmVyIG9mIGJ5dGVzIHRvIHJldHVybiBieSBkZWZhdWx0CisKK2RlZiB0b2tlbl9ieXRlcyhuYnl0ZXM9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIGJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcgKm5ieXRlcyogYnl0ZXMuCisKKyAgICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZQorICAgIGRlZmF1bHQgaXMgdXNlZC4KKworICAgID4+PiB0b2tlbl9ieXRlcygxNikgICNkb2N0ZXN0OitTS0lQCisgICAgYidcXHhlYnJcXHgxN0QqdFxceGFlXFx4ZDRcXHhlM1NcXHhiNlxceGUyXFx4ZWJQMVxceDhiJworCisgICAgIiIiCisgICAgaWYgbmJ5dGVzIGlzIE5vbmU6CisgICAgICAgIG5ieXRlcyA9IERFRkFVTFRfRU5UUk9QWQorICAgIHJldHVybiBvcy51cmFuZG9tKG5ieXRlcykKKworZGVmIHRva2VuX2hleChuYnl0ZXM9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgcmFuZG9tIHRleHQgc3RyaW5nLCBpbiBoZXhhZGVjaW1hbC4KKworICAgIFRoZSBzdHJpbmcgaGFzICpuYnl0ZXMqIHJhbmRvbSBieXRlcywgZWFjaCBieXRlIGNvbnZlcnRlZCB0byB0d28KKyAgICBoZXggZGlnaXRzLiAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUKKyAgICBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5faGV4KDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAnZjliZjc4YjlhMThjZTZkNDZhMGNkMmIwYjg2ZGY5ZGEnCisKKyAgICAiIiIKKyAgICByZXR1cm4gYmluYXNjaWkuaGV4bGlmeSh0b2tlbl9ieXRlcyhuYnl0ZXMpKS5kZWNvZGUoJ2FzY2lpJykKKworZGVmIHRva2VuX3VybHNhZmUobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBVUkwtc2FmZSB0ZXh0IHN0cmluZywgaW4gQmFzZTY0IGVuY29kaW5nLgorCisgICAgVGhlIHN0cmluZyBoYXMgKm5ieXRlcyogcmFuZG9tIGJ5dGVzLiAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAKKyAgICBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5fdXJsc2FmZSgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgJ0RybWh6ZTZFUGN2MGZOXzgxQmotbkEnCisKKyAgICAiIiIKKyAgICB0b2sgPSB0b2tlbl9ieXRlcyhuYnl0ZXMpCisgICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZSh0b2spLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKZGlmZiAtLWdpdCBhL0xpYi9zaHV0aWwucHkgYi9MaWIvc2h1dGlsLnB5CmluZGV4IDM3MTI0YTAuLmIxOTUzY2MgMTAwNjQ0Ci0tLSBhL0xpYi9zaHV0aWwucHkKKysrIGIvTGliL3NodXRpbC5weQpAQCAtOTc0LDYgKzk3NCw5IEBACiAKICAgICBfX2FsbF9fLmFwcGVuZCgnZGlza191c2FnZScpCiAgICAgX250dXBsZV9kaXNrdXNhZ2UgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCd1c2FnZScsICd0b3RhbCB1c2VkIGZyZWUnKQorICAgIF9udHVwbGVfZGlza3VzYWdlLnRvdGFsLl9fZG9jX18gPSAnVG90YWwgc3BhY2UgaW4gYnl0ZXMnCisgICAgX250dXBsZV9kaXNrdXNhZ2UudXNlZC5fX2RvY19fID0gJ1VzZWQgc3BhY2UgaW4gYnl0ZXMnCisgICAgX250dXBsZV9kaXNrdXNhZ2UuZnJlZS5fX2RvY19fID0gJ0ZyZWUgc3BhY2UgaW4gYnl0ZXMnCiAKICAgICBkZWYgZGlza191c2FnZShwYXRoKToKICAgICAgICAgIiIiUmV0dXJuIGRpc2sgdXNhZ2Ugc3RhdGlzdGljcyBhYm91dCB0aGUgZ2l2ZW4gcGF0aC4KZGlmZiAtLWdpdCBhL0xpYi9zaXRlLXBhY2thZ2VzL1JFQURNRS50eHQgYi9MaWIvc2l0ZS1wYWNrYWdlcy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2Y2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2l0ZS1wYWNrYWdlcy9SRUFETUUudHh0CkBAIC0wLDAgKzEsMiBAQAorVGhpcyBkaXJlY3RvcnkgZXhpc3RzIHNvIHRoYXQgM3JkIHBhcnR5IHBhY2thZ2VzIGNhbiBiZSBpbnN0YWxsZWQKK2hlcmUuICBSZWFkIHRoZSBzb3VyY2UgZm9yIHNpdGUucHkgZm9yIG1vcmUgZGV0YWlscy4KZGlmZiAtLWdpdCBhL0xpYi9zaXRlLnB5IGIvTGliL3NpdGUucHkKaW5kZXggM2Y3OGVmNS4uYTg0ZTNiYiAxMDA2NDQKLS0tIGEvTGliL3NpdGUucHkKKysrIGIvTGliL3NpdGUucHkKQEAgLTEzMSwxMyArMTMxLDEzIEBACiAKIAogZGVmIF9pbml0X3BhdGhpbmZvKCk6Ci0gICAgIiIiUmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gc3lzLnBhdGgiIiIKKyAgICAiIiJSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgZmlsZSBzeXN0ZW0gaXRlbXMgZnJvbSBzeXMucGF0aC4iIiIKICAgICBkID0gc2V0KCkKLSAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcik6Ci0gICAgICAgICAgICAgICAgZGlyLCBkaXJjYXNlID0gbWFrZXBhdGgoZGlyKQotICAgICAgICAgICAgICAgIGQuYWRkKGRpcmNhc2UpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpdGVtKToKKyAgICAgICAgICAgICAgICBfLCBpdGVtY2FzZSA9IG1ha2VwYXRoKGl0ZW0pCisgICAgICAgICAgICAgICAgZC5hZGQoaXRlbWNhc2UpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBjb250aW51ZQogICAgIHJldHVybiBkCkBAIC0xNTAsOSArMTUwLDkgQEAKICAgICAiIiIKICAgICBpZiBrbm93bl9wYXRocyBpcyBOb25lOgogICAgICAgICBrbm93bl9wYXRocyA9IF9pbml0X3BhdGhpbmZvKCkKLSAgICAgICAgcmVzZXQgPSAxCisgICAgICAgIHJlc2V0ID0gVHJ1ZQogICAgIGVsc2U6Ci0gICAgICAgIHJlc2V0ID0gMAorICAgICAgICByZXNldCA9IEZhbHNlCiAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oc2l0ZWRpciwgbmFtZSkKICAgICB0cnk6CiAgICAgICAgIGYgPSBvcGVuKGZ1bGxuYW1lLCAiciIpCkBAIC0xOTAsOSArMTkwLDkgQEAKICAgICAnc2l0ZWRpciciIiIKICAgICBpZiBrbm93bl9wYXRocyBpcyBOb25lOgogICAgICAgICBrbm93bl9wYXRocyA9IF9pbml0X3BhdGhpbmZvKCkKLSAgICAgICAgcmVzZXQgPSAxCisgICAgICAgIHJlc2V0ID0gVHJ1ZQogICAgIGVsc2U6Ci0gICAgICAgIHJlc2V0ID0gMAorICAgICAgICByZXNldCA9IEZhbHNlCiAgICAgc2l0ZWRpciwgc2l0ZWRpcmNhc2UgPSBtYWtlcGF0aChzaXRlZGlyKQogICAgIGlmIG5vdCBzaXRlZGlyY2FzZSBpbiBrbm93bl9wYXRoczoKICAgICAgICAgc3lzLnBhdGguYXBwZW5kKHNpdGVkaXIpICAgICAgICAjIEFkZCBwYXRoIGNvbXBvbmVudApAQCAtMzA0LDcgKzMwNCw3IEBACiAKICAgICAgICAgaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiVkLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXRlLXBhY2thZ2VzIikpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKHByZWZpeCkKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgICAgICAgICAgaWYgZnJhbWV3b3JrOgogICAgICAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oIi9MaWJyYXJ5IiwgZnJhbWV3b3JrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwgInNpdGUtcGFja2FnZXMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sICJzaXRlLXBhY2thZ2VzIikpCiAgICAgcmV0dXJuIHNpdGVwYWNrYWdlcwogCiBkZWYgYWRkc2l0ZXBhY2thZ2VzKGtub3duX3BhdGhzLCBwcmVmaXhlcz1Ob25lKToKQEAgLTUwNCw5ICs1MDQsMTMgQEAKIGRlZiBleGVjc2l0ZWN1c3RvbWl6ZSgpOgogICAgICIiIlJ1biBjdXN0b20gc2l0ZSBzcGVjaWZpYyBjb2RlLCBpZiBhdmFpbGFibGUuIiIiCiAgICAgdHJ5OgotICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLm5hbWUgPT0gJ3NpdGVjdXN0b21pemUnOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlBZVEhPTlZFUkJPU0UiKToKICAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKQEAgLTUyMCw5ICs1MjQsMTMgQEAKIGRlZiBleGVjdXNlcmN1c3RvbWl6ZSgpOgogICAgICIiIlJ1biBjdXN0b20gdXNlciBzcGVjaWZpYyBjb2RlLCBpZiBhdmFpbGFibGUuIiIiCiAgICAgdHJ5OgotICAgICAgICBpbXBvcnQgdXNlcmN1c3RvbWl6ZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgdXNlcmN1c3RvbWl6ZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjLm5hbWUgPT0gJ3VzZXJjdXN0b21pemUnOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKICAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlBZVEhPTlZFUkJPU0UiKToKICAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKZGlmZiAtLWdpdCBhL0xpYi9zbXRwZC5weSBiL0xpYi9zbXRwZC5weQppbmRleCA3MzIwNjZlLi44MTAzY2E5IDEwMDc1NQotLS0gYS9MaWIvc210cGQucHkKKysrIGIvTGliL3NtdHBkLnB5CkBAIC04OSw3ICs4OSwxMCBAQAogZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgogZnJvbSBlbWFpbC5faGVhZGVyX3ZhbHVlX3BhcnNlciBpbXBvcnQgZ2V0X2FkZHJfc3BlYywgZ2V0X2FuZ2xlX2FkZHIKIAotX19hbGxfXyA9IFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJdCitfX2FsbF9fID0gWworICAgICJTTVRQQ2hhbm5lbCIsICJTTVRQU2VydmVyIiwgIkRlYnVnZ2luZ1NlcnZlciIsICJQdXJlUHJveHkiLAorICAgICJNYWlsbWFuUHJveHkiLAorXQogCiBwcm9ncmFtID0gc3lzLmFyZ3ZbMF0KIF9fdmVyc2lvbl9fID0gJ1B5dGhvbiBTTVRQIHByb3h5IHZlcnNpb24gMC4zJwpAQCAtMTI4LDI0ICsxMzEsMTcgQEAKICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbW1hbmRfc2l6ZV9saW1pdAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgY29ubiwgYWRkciwgZGF0YV9zaXplX2xpbWl0PURBVEFfU0laRV9ERUZBVUxULAotICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1Ob25lKToKKyAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9RmFsc2UpOgogICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0Ll9faW5pdF9fKHNlbGYsIGNvbm4sIG1hcD1tYXApCiAgICAgICAgIHNlbGYuc210cF9zZXJ2ZXIgPSBzZXJ2ZXIKICAgICAgICAgc2VsZi5jb25uID0gY29ubgogICAgICAgICBzZWxmLmFkZHIgPSBhZGRyCiAgICAgICAgIHNlbGYuZGF0YV9zaXplX2xpbWl0ID0gZGF0YV9zaXplX2xpbWl0CiAgICAgICAgIHNlbGYuZW5hYmxlX1NNVFBVVEY4ID0gZW5hYmxlX1NNVFBVVEY4Ci0gICAgICAgIGlmIGVuYWJsZV9TTVRQVVRGODoKLSAgICAgICAgICAgIGlmIGRlY29kZV9kYXRhOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRlY29kZV9kYXRhIGFuZCBlbmFibGVfU01UUFVURjggY2Fubm90IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZSBzZXQgdG8gVHJ1ZSBhdCB0aGUgc2FtZSB0aW1lIikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gRmFsc2UKLSAgICAgICAgaWYgZGVjb2RlX2RhdGEgaXMgTm9uZToKLSAgICAgICAgICAgIHdhcm4oIlRoZSBkZWNvZGVfZGF0YSBkZWZhdWx0IG9mIFRydWUgd2lsbCBjaGFuZ2UgdG8gRmFsc2UgaW4gMy42OyIKLSAgICAgICAgICAgICAgICAgIiBzcGVjaWZ5IGFuIGV4cGxpY2l0IHZhbHVlIGZvciB0aGlzIGtleXdvcmQiLAotICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgICAgICBkZWNvZGVfZGF0YSA9IFRydWUKICAgICAgICAgc2VsZi5fZGVjb2RlX2RhdGEgPSBkZWNvZGVfZGF0YQorICAgICAgICBpZiBlbmFibGVfU01UUFVURjggYW5kIGRlY29kZV9kYXRhOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBjYW5ub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmUgc2V0IHRvIFRydWUgYXQgdGhlIHNhbWUgdGltZSIpCiAgICAgICAgIGlmIGRlY29kZV9kYXRhOgogICAgICAgICAgICAgc2VsZi5fZW1wdHlzdHJpbmcgPSAnJwogICAgICAgICAgICAgc2VsZi5fbGluZXNlcCA9ICdcclxuJwpAQCAtNjM1LDIzICs2MzEsMTUgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbGFkZHIsIHJlbW90ZWFkZHIsCiAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZV9saW1pdD1EQVRBX1NJWkVfREVGQVVMVCwgbWFwPU5vbmUsCi0gICAgICAgICAgICAgICAgIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9Tm9uZSk6CisgICAgICAgICAgICAgICAgIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9RmFsc2UpOgogICAgICAgICBzZWxmLl9sb2NhbGFkZHIgPSBsb2NhbGFkZHIKICAgICAgICAgc2VsZi5fcmVtb3RlYWRkciA9IHJlbW90ZWFkZHIKICAgICAgICAgc2VsZi5kYXRhX3NpemVfbGltaXQgPSBkYXRhX3NpemVfbGltaXQKICAgICAgICAgc2VsZi5lbmFibGVfU01UUFVURjggPSBlbmFibGVfU01UUFVURjgKLSAgICAgICAgaWYgZW5hYmxlX1NNVFBVVEY4OgotICAgICAgICAgICAgaWYgZGVjb2RlX2RhdGE6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlIGRlY29kZV9kYXRhIGFuZCBlbmFibGVfU01UUFVURjgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHBhcmFtZXRlcnMgY2Fubm90IGJlIHNldCB0byBUcnVlIGF0IHRoZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc2FtZSB0aW1lLiIpCi0gICAgICAgICAgICBkZWNvZGVfZGF0YSA9IEZhbHNlCi0gICAgICAgIGlmIGRlY29kZV9kYXRhIGlzIE5vbmU6Ci0gICAgICAgICAgICB3YXJuKCJUaGUgZGVjb2RlX2RhdGEgZGVmYXVsdCBvZiBUcnVlIHdpbGwgY2hhbmdlIHRvIEZhbHNlIGluIDMuNjsiCi0gICAgICAgICAgICAgICAgICIgc3BlY2lmeSBhbiBleHBsaWNpdCB2YWx1ZSBmb3IgdGhpcyBrZXl3b3JkIiwKLSAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICAgICAgZGVjb2RlX2RhdGEgPSBUcnVlCiAgICAgICAgIHNlbGYuX2RlY29kZV9kYXRhID0gZGVjb2RlX2RhdGEKKyAgICAgICAgaWYgZW5hYmxlX1NNVFBVVEY4IGFuZCBkZWNvZGVfZGF0YToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRlY29kZV9kYXRhIGFuZCBlbmFibGVfU01UUFVURjggY2Fubm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlIHNldCB0byBUcnVlIGF0IHRoZSBzYW1lIHRpbWUiKQogICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYsIG1hcD1tYXApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGdhaV9yZXN1bHRzID0gc29ja2V0LmdldGFkZHJpbmZvKCpsb2NhbGFkZHIsCkBAIC02OTgsOSArNjg2LDkgQEAKICAgICAgICAgY29udGFpbmluZyBhIGAuJyBmb2xsb3dlZCBieSBvdGhlciB0ZXh0IGhhcyBoYWQgdGhlIGxlYWRpbmcgZG90CiAgICAgICAgIHJlbW92ZWQuCiAKLSAgICAgICAga3dhcmdzIGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIEl0IGlzIGVtcHR5Ci0gICAgICAgIHVubGVzcyBkZWNvZGVfZGF0YT1GYWxzZSBvciBlbmFibGVfU01UUFVURjg9VHJ1ZSB3YXMgZ2l2ZW4gYXMgaW5pdAotICAgICAgICBwYXJhbWV0ZXIsIGluIHdoaWNoIGNhc2UgdXQgd2lsbCBjb250YWluIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgICAga3dhcmdzIGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uICBJdCBpcworICAgICAgICBlbXB0eSBpZiBkZWNvZGVfZGF0YT1UcnVlIHdhcyBnaXZlbiBhcyBpbml0IHBhcmFtZXRlciwgb3RoZXJ3aXNlCisgICAgICAgIGl0IHdpbGwgY29udGFpbiB0aGUgZm9sbG93aW5nIGtleXM6CiAgICAgICAgICAgICAnbWFpbF9vcHRpb25zJzogbGlzdCBvZiBwYXJhbWV0ZXJzIHRvIHRoZSBtYWlsIGNvbW1hbmQuICBBbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUgdXBwZXJjYXNlIHN0cmluZ3MuICBFeGFtcGxlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQk9EWT04QklUTUlNRScsICdTTVRQVVRGOCddLgpkaWZmIC0tZ2l0IGEvTGliL3NuZGhkci5weSBiL0xpYi9zbmRoZHIucHkKaW5kZXggZTU5MDFlYy4uN2VjYWZiNCAxMDA2NDQKLS0tIGEvTGliL3NuZGhkci5weQorKysgYi9MaWIvc25kaGRyLnB5CkBAIC0zNyw2ICszNywxOCBAQAogU25kSGVhZGVycyA9IG5hbWVkdHVwbGUoJ1NuZEhlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGV0eXBlIGZyYW1lcmF0ZSBuY2hhbm5lbHMgbmZyYW1lcyBzYW1wd2lkdGgnKQogCitTbmRIZWFkZXJzLmZpbGV0eXBlLl9fZG9jX18gPSAoIiIiVGhlIHZhbHVlIGZvciB0eXBlIGluZGljYXRlcyB0aGUgZGF0YSB0eXBlCithbmQgd2lsbCBiZSBvbmUgb2YgdGhlIHN0cmluZ3MgJ2FpZmMnLCAnYWlmZicsICdhdScsJ2hjb20nLAorJ3NuZHInLCAnc25kdCcsICd2b2MnLCAnd2F2JywgJzhzdngnLCAnc2InLCAndWInLCBvciAndWwnLiIiIikKK1NuZEhlYWRlcnMuZnJhbWVyYXRlLl9fZG9jX18gPSAoIiIiVGhlIHNhbXBsaW5nX3JhdGUgd2lsbCBiZSBlaXRoZXIgdGhlIGFjdHVhbAordmFsdWUgb3IgMCBpZiB1bmtub3duIG9yIGRpZmZpY3VsdCB0byBkZWNvZGUuIiIiKQorU25kSGVhZGVycy5uY2hhbm5lbHMuX19kb2NfXyA9ICgiIiJUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIDAgaWYgaXQgY2Fubm90IGJlCitkZXRlcm1pbmVkIG9yIGlmIHRoZSB2YWx1ZSBpcyBkaWZmaWN1bHQgdG8gZGVjb2RlLiIiIikKK1NuZEhlYWRlcnMubmZyYW1lcy5fX2RvY19fID0gKCIiIlRoZSB2YWx1ZSBmb3IgZnJhbWVzIHdpbGwgYmUgZWl0aGVyIHRoZSBudW1iZXIKK29mIGZyYW1lcyBvciAtMS4iIiIpCitTbmRIZWFkZXJzLnNhbXB3aWR0aC5fX2RvY19fID0gKCIiIkVpdGhlciB0aGUgc2FtcGxlIHNpemUgaW4gYml0cyBvcgorJ0EnIGZvciBBLUxBVyBvciAnVScgZm9yIHUtTEFXLiIiIikKKwogZGVmIHdoYXQoZmlsZW5hbWUpOgogICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgc291bmQgZmlsZS4iIiIKICAgICByZXMgPSB3aGF0aGRyKGZpbGVuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3NvY2tldHNlcnZlci5weSBiL0xpYi9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggODgwODgxMy4uNDFhMzc2NiAxMDA2NDQKLS0tIGEvTGliL3NvY2tldHNlcnZlci5weQorKysgYi9MaWIvc29ja2V0c2VydmVyLnB5CkBAIC0xMjcsMTYgKzEyNywyMCBAQAogaW1wb3J0IHNlbGVjdG9ycwogaW1wb3J0IG9zCiBpbXBvcnQgZXJybm8KK2ltcG9ydCBzeXMKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKK2Zyb20gaW8gaW1wb3J0IEJ1ZmZlcmVkSU9CYXNlCiBmcm9tIHRpbWUgaW1wb3J0IG1vbm90b25pYyBhcyB0aW1lCiAKLV9fYWxsX18gPSBbIkJhc2VTZXJ2ZXIiLCAiVENQU2VydmVyIiwgIlVEUFNlcnZlciIsICJGb3JraW5nVURQU2VydmVyIiwKLSAgICAgICAgICAgIkZvcmtpbmdUQ1BTZXJ2ZXIiLCAiVGhyZWFkaW5nVURQU2VydmVyIiwgIlRocmVhZGluZ1RDUFNlcnZlciIsCitfX2FsbF9fID0gWyJCYXNlU2VydmVyIiwgIlRDUFNlcnZlciIsICJVRFBTZXJ2ZXIiLAorICAgICAgICAgICAiVGhyZWFkaW5nVURQU2VydmVyIiwgIlRocmVhZGluZ1RDUFNlcnZlciIsCiAgICAgICAgICAgICJCYXNlUmVxdWVzdEhhbmRsZXIiLCAiU3RyZWFtUmVxdWVzdEhhbmRsZXIiLAotICAgICAgICAgICAiRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciIsICJUaHJlYWRpbmdNaXhJbiIsICJGb3JraW5nTWl4SW4iXQorICAgICAgICAgICAiRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciIsICJUaHJlYWRpbmdNaXhJbiJdCitpZiBoYXNhdHRyKG9zLCAiZm9yayIpOgorICAgIF9fYWxsX18uZXh0ZW5kKFsiRm9ya2luZ1VEUFNlcnZlciIsIkZvcmtpbmdUQ1BTZXJ2ZXIiLCAiRm9ya2luZ01peEluIl0pCiBpZiBoYXNhdHRyKHNvY2tldCwgIkFGX1VOSVgiKToKICAgICBfX2FsbF9fLmV4dGVuZChbIlVuaXhTdHJlYW1TZXJ2ZXIiLCJVbml4RGF0YWdyYW1TZXJ2ZXIiLAogICAgICAgICAgICAgICAgICAgICAiVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlciIsCkBAIC0zMTEsOSArMzE1LDEyIEBACiAgICAgICAgIGlmIHNlbGYudmVyaWZ5X3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKICAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAKQEAgLTM2NywxMiArMzc0LDE4IEBACiAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHByaW50IGEgdHJhY2ViYWNrIGFuZCBjb250aW51ZS4KIAogICAgICAgICAiIiIKLSAgICAgICAgcHJpbnQoJy0nKjQwKQotICAgICAgICBwcmludCgnRXhjZXB0aW9uIGhhcHBlbmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIHJlcXVlc3QgZnJvbScsIGVuZD0nICcpCi0gICAgICAgIHByaW50KGNsaWVudF9hZGRyZXNzKQorICAgICAgICBwcmludCgnLScqNDAsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcHJpbnQoJ0V4Y2VwdGlvbiBoYXBwZW5lZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiByZXF1ZXN0IGZyb20nLAorICAgICAgICAgICAgY2xpZW50X2FkZHJlc3MsIGZpbGU9c3lzLnN0ZGVycikKICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkgIyBYWFggQnV0IHRoaXMgZ29lcyB0byBzdGRlcnIhCi0gICAgICAgIHByaW50KCctJyo0MCkKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIHByaW50KCctJyo0MCwgZmlsZT1zeXMuc3RkZXJyKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKIAogCiBjbGFzcyBUQ1BTZXJ2ZXIoQmFzZVNlcnZlcik6CkBAIC01MjcsODUgKzU0MCw4NiBAQAogICAgICAgICAjIE5vIG5lZWQgdG8gY2xvc2UgYW55dGhpbmcuCiAgICAgICAgIHBhc3MKIAotY2xhc3MgRm9ya2luZ01peEluOgoraWYgaGFzYXR0cihvcywgImZvcmsiKToKKyAgICBjbGFzcyBGb3JraW5nTWl4SW46CisgICAgICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHByb2Nlc3MuIiIiCiAKLSAgICAiIiJNaXgtaW4gY2xhc3MgdG8gaGFuZGxlIGVhY2ggcmVxdWVzdCBpbiBhIG5ldyBwcm9jZXNzLiIiIgorICAgICAgICB0aW1lb3V0ID0gMzAwCisgICAgICAgIGFjdGl2ZV9jaGlsZHJlbiA9IE5vbmUKKyAgICAgICAgbWF4X2NoaWxkcmVuID0gNDAKIAotICAgIHRpbWVvdXQgPSAzMDAKLSAgICBhY3RpdmVfY2hpbGRyZW4gPSBOb25lCi0gICAgbWF4X2NoaWxkcmVuID0gNDAKLQotICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgotICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaWxkcmVuIHRoYXQgaGF2ZSBleGl0ZWQuIiIiCi0gICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICAjIElmIHdlJ3JlIGFib3ZlIHRoZSBtYXggbnVtYmVyIG9mIGNoaWxkcmVuLCB3YWl0IGFuZCByZWFwIHRoZW0gdW50aWwKLSAgICAgICAgIyB3ZSBnbyBiYWNrIGJlbG93IHRocmVzaG9sZC4gTm90ZSB0aGF0IHdlIHVzZSB3YWl0cGlkKC0xKSBiZWxvdyB0byBiZQotICAgICAgICAjIGFibGUgdG8gY29sbGVjdCBjaGlsZHJlbiBpbiBzaXplKDxkZWZ1bmN0IGNoaWxkcmVuPikgc3lzY2FsbHMgaW5zdGVhZAotICAgICAgICAjIG9mIHNpemUoPGNoaWxkcmVuPik6IHRoZSBkb3duc2lkZSBpcyB0aGF0IHRoaXMgbWlnaHQgcmVhcCBjaGlsZHJlbgotICAgICAgICAjIHdoaWNoIHdlIGRpZG4ndCBzcGF3biwgd2hpY2ggaXMgd2h5IHdlIG9ubHkgcmVzb3J0IHRvIHRoaXMgd2hlbiB3ZSdyZQotICAgICAgICAjIGFib3ZlIG1heF9jaGlsZHJlbi4KLSAgICAgICAgd2hpbGUgbGVuKHNlbGYuYWN0aXZlX2NoaWxkcmVuKSA+PSBzZWxmLm1heF9jaGlsZHJlbjoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwaWQsIF8gPSBvcy53YWl0cGlkKC0xLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQotICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgotICAgICAgICAgICAgICAgICMgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jbGVhcigpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotCi0gICAgICAgICMgTm93IHJlYXAgYWxsIGRlZnVuY3QgY2hpbGRyZW4uCi0gICAgICAgIGZvciBwaWQgaW4gc2VsZi5hY3RpdmVfY2hpbGRyZW4uY29weSgpOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHBpZCwgXyA9IG9zLndhaXRwaWQocGlkLCBvcy5XTk9IQU5HKQotICAgICAgICAgICAgICAgICMgaWYgdGhlIGNoaWxkIGhhc24ndCBleGl0ZWQgeWV0LCBwaWQgd2lsbCBiZSAwIGFuZCBpZ25vcmVkIGJ5Ci0gICAgICAgICAgICAgICAgIyBkaXNjYXJkKCkgYmVsb3cKLSAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKLSAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKLSAgICAgICAgICAgICAgICAjIHNvbWVvbmUgZWxzZSByZWFwZWQgaXQKLSAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKLSAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLQotICAgIGRlZiBoYW5kbGVfdGltZW91dChzZWxmKToKLSAgICAgICAgIiIiV2FpdCBmb3Igem9tYmllcyBhZnRlciBzZWxmLnRpbWVvdXQgc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgotCi0gICAgICAgIE1heSBiZSBleHRlbmRlZCwgZG8gbm90IG92ZXJyaWRlLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgIGRlZiBzZXJ2aWNlX2FjdGlvbnMoc2VsZik6Ci0gICAgICAgICIiIkNvbGxlY3QgdGhlIHpvbWJpZSBjaGlsZCBwcm9jZXNzZXMgcmVndWxhcmx5IGluIHRoZSBGb3JraW5nTWl4SW4uCi0KLSAgICAgICAgc2VydmljZV9hY3Rpb25zIGlzIGNhbGxlZCBpbiB0aGUgQmFzZVNlcnZlcidzIHNlcnZlX2ZvcnZlciBsb29wLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKLQotICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgotICAgICAgICAiIiJGb3JrIGEgbmV3IHN1YnByb2Nlc3MgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4iIiIKLSAgICAgICAgcGlkID0gb3MuZm9yaygpCi0gICAgICAgIGlmIHBpZDoKLSAgICAgICAgICAgICMgUGFyZW50IHByb2Nlc3MKKyAgICAgICAgZGVmIGNvbGxlY3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaWxkcmVuIHRoYXQgaGF2ZSBleGl0ZWQuIiIiCiAgICAgICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuID0gc2V0KCkKLSAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmFkZChwaWQpCi0gICAgICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzLgotICAgICAgICAgICAgIyBUaGlzIG11c3QgbmV2ZXIgcmV0dXJuLCBoZW5jZSBvcy5fZXhpdCgpIQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBJZiB3ZSdyZSBhYm92ZSB0aGUgbWF4IG51bWJlciBvZiBjaGlsZHJlbiwgd2FpdCBhbmQgcmVhcCB0aGVtIHVudGlsCisgICAgICAgICAgICAjIHdlIGdvIGJhY2sgYmVsb3cgdGhyZXNob2xkLiBOb3RlIHRoYXQgd2UgdXNlIHdhaXRwaWQoLTEpIGJlbG93IHRvIGJlCisgICAgICAgICAgICAjIGFibGUgdG8gY29sbGVjdCBjaGlsZHJlbiBpbiBzaXplKDxkZWZ1bmN0IGNoaWxkcmVuPikgc3lzY2FsbHMgaW5zdGVhZAorICAgICAgICAgICAgIyBvZiBzaXplKDxjaGlsZHJlbj4pOiB0aGUgZG93bnNpZGUgaXMgdGhhdCB0aGlzIG1pZ2h0IHJlYXAgY2hpbGRyZW4KKyAgICAgICAgICAgICMgd2hpY2ggd2UgZGlkbid0IHNwYXduLCB3aGljaCBpcyB3aHkgd2Ugb25seSByZXNvcnQgdG8gdGhpcyB3aGVuIHdlJ3JlCisgICAgICAgICAgICAjIGFib3ZlIG1heF9jaGlsZHJlbi4KKyAgICAgICAgICAgIHdoaWxlIGxlbihzZWxmLmFjdGl2ZV9jaGlsZHJlbikgPj0gc2VsZi5tYXhfY2hpbGRyZW46CiAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIF8gPSBvcy53YWl0cGlkKC0xLCAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgd2UgZG9uJ3QgaGF2ZSBhbnkgY2hpbGRyZW4sIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uY2xlYXIoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIE5vdyByZWFwIGFsbCBkZWZ1bmN0IGNoaWxkcmVuLgorICAgICAgICAgICAgZm9yIHBpZCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5jb3B5KCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIF8gPSBvcy53YWl0cGlkKHBpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgY2hpbGQgaGFzbid0IGV4aXRlZCB5ZXQsIHBpZCB3aWxsIGJlIDAgYW5kIGlnbm9yZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgIyBkaXNjYXJkKCkgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCisgICAgICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIHNvbWVvbmUgZWxzZSByZWFwZWQgaXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgaGFuZGxlX3RpbWVvdXQoc2VsZik6CisgICAgICAgICAgICAiIiJXYWl0IGZvciB6b21iaWVzIGFmdGVyIHNlbGYudGltZW91dCBzZWNvbmRzIG9mIGluYWN0aXZpdHkuCisKKyAgICAgICAgICAgIE1heSBiZSBleHRlbmRlZCwgZG8gbm90IG92ZXJyaWRlLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQorCisgICAgICAgIGRlZiBzZXJ2aWNlX2FjdGlvbnMoc2VsZik6CisgICAgICAgICAgICAiIiJDb2xsZWN0IHRoZSB6b21iaWUgY2hpbGQgcHJvY2Vzc2VzIHJlZ3VsYXJseSBpbiB0aGUgRm9ya2luZ01peEluLgorCisgICAgICAgICAgICBzZXJ2aWNlX2FjdGlvbnMgaXMgY2FsbGVkIGluIHRoZSBCYXNlU2VydmVyJ3Mgc2VydmVfZm9ydmVyIGxvb3AuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCisKKyAgICAgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICAgICAiIiJGb3JrIGEgbmV3IHN1YnByb2Nlc3MgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4iIiIKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgICAgICMgUGFyZW50IHByb2Nlc3MKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbiA9IHNldCgpCisgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uYWRkKHBpZCkKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzLgorICAgICAgICAgICAgICAgICMgVGhpcyBtdXN0IG5ldmVyIHJldHVybiwgaGVuY2Ugb3MuX2V4aXQoKSEKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQogICAgICAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KDEpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoc3RhdHVzKQogCiAKIGNsYXNzIFRocmVhZGluZ01peEluOgpAQCAtNjIzLDkgKzYzNyw5IEBACiAgICAgICAgICIiIgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCiAKICAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKQEAgLTYzNiw4ICs2NTAsOSBAQAogICAgICAgICB0LnN0YXJ0KCkKIAogCi1jbGFzcyBGb3JraW5nVURQU2VydmVyKEZvcmtpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcwotY2xhc3MgRm9ya2luZ1RDUFNlcnZlcihGb3JraW5nTWl4SW4sIFRDUFNlcnZlcik6IHBhc3MKK2lmIGhhc2F0dHIob3MsICJmb3JrIik6CisgICAgY2xhc3MgRm9ya2luZ1VEUFNlcnZlcihGb3JraW5nTWl4SW4sIFVEUFNlcnZlcik6IHBhc3MKKyAgICBjbGFzcyBGb3JraW5nVENQU2VydmVyKEZvcmtpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcwogCiBjbGFzcyBUaHJlYWRpbmdVRFBTZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFVEUFNlcnZlcik6IHBhc3MKIGNsYXNzIFRocmVhZGluZ1RDUFNlcnZlcihUaHJlYWRpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcwpAQCAtNzI5LDcgKzc0NCwxMCBAQAogICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9uLnNldHNvY2tvcHQoc29ja2V0LklQUFJPVE9fVENQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlRDUF9OT0RFTEFZLCBUcnVlKQogICAgICAgICBzZWxmLnJmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCdyYicsIHNlbGYucmJ1ZnNpemUpCi0gICAgICAgIHNlbGYud2ZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3diJywgc2VsZi53YnVmc2l6ZSkKKyAgICAgICAgaWYgc2VsZi53YnVmc2l6ZSA9PSAwOgorICAgICAgICAgICAgc2VsZi53ZmlsZSA9IF9Tb2NrZXRXcml0ZXIoc2VsZi5jb25uZWN0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgnd2InLCBzZWxmLndidWZzaXplKQogCiAgICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICAgaWYgbm90IHNlbGYud2ZpbGUuY2xvc2VkOgpAQCAtNzQyLDYgKzc2MCwyNCBAQAogICAgICAgICBzZWxmLndmaWxlLmNsb3NlKCkKICAgICAgICAgc2VsZi5yZmlsZS5jbG9zZSgpCiAKK2NsYXNzIF9Tb2NrZXRXcml0ZXIoQnVmZmVyZWRJT0Jhc2UpOgorICAgICIiIlNpbXBsZSB3cml0YWJsZSBCdWZmZXJlZElPQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBzb2NrZXQKKworICAgIERvZXMgbm90IGhvbGQgZGF0YSBpbiBhIGJ1ZmZlciwgYXZvaWRpbmcgYW55IG5lZWQgdG8gY2FsbCBmbHVzaCgpLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2spOgorICAgICAgICBzZWxmLl9zb2NrID0gc29jaworCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICBzZWxmLl9zb2NrLnNlbmRhbGwoYikKKyAgICAgICAgd2l0aCBtZW1vcnl2aWV3KGIpIGFzIHZpZXc6CisgICAgICAgICAgICByZXR1cm4gdmlldy5uYnl0ZXMKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLmZpbGVubygpCiAKIGNsYXNzIERhdGFncmFtUmVxdWVzdEhhbmRsZXIoQmFzZVJlcXVlc3RIYW5kbGVyKToKIApkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKaW5kZXggZWM0MmViNy4uNTFjNGQ1MyAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CkBAIC0xODgsNyArMTg4LDEwIEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKICAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKLSAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGluY29tZSBudW1iZXIpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKAorICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgIgorICAgICAgICAgICAgImluY29tZSBudW1iZXIsIHVuaXF1ZV90ZXN0IHRleHQgdW5pcXVlKSIKKyAgICAgICAgKQogICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgpAQCAtNDYyLDYgKzQ2NSw0NCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CiAgICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKIAorICAgIGRlZiBDaGVja0xhc3RSb3dJRE9uUmVwbGFjZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIElOU0VSVCBPUiBSRVBMQUNFIGFuZCBSRVBMQUNFIElOVE8gc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgYmVoYXZpb3IuCisgICAgICAgICIiIgorICAgICAgICBzcWwgPSAne30gSU5UTyB0ZXN0KGlkLCB1bmlxdWVfdGVzdCkgVkFMVUVTICg/LCA/KScKKyAgICAgICAgZm9yIHN0YXRlbWVudCBpbiAoJ0lOU0VSVCBPUiBSRVBMQUNFJywgJ1JFUExBQ0UnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHN0YXRlbWVudD1zdGF0ZW1lbnQpOgorICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksICgxLCAnZm9vJykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMSkKKworICAgIGRlZiBDaGVja0xhc3RSb3dJRE9uSWdub3JlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoCisgICAgICAgICAgICAiaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIHRlc3QodW5pcXVlX3Rlc3QpIHZhbHVlcyAoPykiLAorICAgICAgICAgICAgKCd0ZXN0JywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UubGFzdHJvd2lkLCAyKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoCisgICAgICAgICAgICAiaW5zZXJ0IG9yIGlnbm9yZSBpbnRvIHRlc3QodW5pcXVlX3Rlc3QpIHZhbHVlcyAoPykiLAorICAgICAgICAgICAgKCd0ZXN0JywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UubGFzdHJvd2lkLCAyKQorCisgICAgZGVmIENoZWNrTGFzdFJvd0lESW5zZXJ0T1Ioc2VsZik6CisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3Igc3RhdGVtZW50IGluICgnRkFJTCcsICdBQk9SVCcsICdST0xMQkFDSycpOgorICAgICAgICAgICAgc3FsID0gJ0lOU0VSVCBPUiB7fSBJTlRPIHRlc3QodW5pcXVlX3Rlc3QpIFZBTFVFUyAoPyknCisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzdGF0ZW1lbnQ9J0lOU0VSVCBPUiB7fScuZm9ybWF0KHN0YXRlbWVudCkpOgorICAgICAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShzcWwuZm9ybWF0KHN0YXRlbWVudCksIChzdGF0ZW1lbnQsKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoc3RhdGVtZW50LCBzZWxmLmN1Lmxhc3Ryb3dpZCkpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoc3FsLmZvcm1hdChzdGF0ZW1lbnQpLCAoc3RhdGVtZW50LCkpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKHN0YXRlbWVudCwgc2VsZi5jdS5sYXN0cm93aWQpKQorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgICgnRkFJTCcsIDIpLCAoJ0ZBSUwnLCAyKSwKKyAgICAgICAgICAgICgnQUJPUlQnLCAzKSwgKCdBQk9SVCcsIDMpLAorICAgICAgICAgICAgKCdST0xMQkFDSycsIDQpLCAoJ1JPTExCQUNLJywgNCksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzLCBleHBlY3RlZCkKKworCiBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaGlzIHRlc3QgcmVxdWlyZXMgdGhyZWFkaW5nLicpCiBjbGFzcyBUaHJlYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3NyZV9jb21waWxlLnB5IGIvTGliL3NyZV9jb21waWxlLnB5CmluZGV4IDUwMmIwNjEuLjRlZGIwM2YgMTAwNjQ0Ci0tLSBhL0xpYi9zcmVfY29tcGlsZS5weQorKysgYi9MaWIvc3JlX2NvbXBpbGUucHkKQEAgLTQwOSw1NyArNDA5LDM5IEBACiAgICAgICAgICAgICB0YWJsZVtpXSA9IGlkeCArIDEKICAgICByZXR1cm4gdGFibGUKIAotZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgotICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYW4gaW5mbyBibG9jay4gIGluIHRoZSBjdXJyZW50IHZlcnNpb24sCi0gICAgIyB0aGlzIGNvbnRhaW5zIG1pbi9tYXggcGF0dGVybiB3aWR0aCwgYW5kIGFuIG9wdGlvbmFsIGxpdGVyYWwKLSAgICAjIHByZWZpeCBvciBhIGNoYXJhY3RlciBtYXAKLSAgICBsbywgaGkgPSBwYXR0ZXJuLmdldHdpZHRoKCkKLSAgICBpZiBoaSA+IE1BWENPREU6Ci0gICAgICAgIGhpID0gTUFYQ09ERQotICAgIGlmIGxvID09IDA6Ci0gICAgICAgIGNvZGUuZXh0ZW5kKFtJTkZPLCA0LCAwLCBsbywgaGldKQotICAgICAgICByZXR1cm4KLSAgICAjIGxvb2sgZm9yIGEgbGl0ZXJhbCBwcmVmaXgKK2RlZiBfZ2V0X2xpdGVyYWxfcHJlZml4KHBhdHRlcm4pOgorICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKICAgICBwcmVmaXggPSBbXQogICAgIHByZWZpeGFwcGVuZCA9IHByZWZpeC5hcHBlbmQKLSAgICBwcmVmaXhfc2tpcCA9IDAKKyAgICBwcmVmaXhfc2tpcCA9IE5vbmUKKyAgICBnb3RfYWxsID0gVHJ1ZQorICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybi5kYXRhOgorICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQorICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk46CisgICAgICAgICAgICBwcmVmaXgxLCBwcmVmaXhfc2tpcDEsIGdvdF9hbGwgPSBfZ2V0X2xpdGVyYWxfcHJlZml4KGF2WzFdKQorICAgICAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBhdlswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBsZW4ocHJlZml4KQorICAgICAgICAgICAgICAgIGVsaWYgcHJlZml4X3NraXAxIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IGxlbihwcmVmaXgpICsgcHJlZml4X3NraXAxCisgICAgICAgICAgICBwcmVmaXguZXh0ZW5kKHByZWZpeDEpCisgICAgICAgICAgICBpZiBub3QgZ290X2FsbDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ290X2FsbCA9IEZhbHNlCisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBwcmVmaXgsIHByZWZpeF9za2lwLCBnb3RfYWxsCisKK2RlZiBfZ2V0X2NoYXJzZXRfcHJlZml4KHBhdHRlcm4pOgogICAgIGNoYXJzZXQgPSBbXSAjIG5vdCB1c2VkCiAgICAgY2hhcnNldGFwcGVuZCA9IGNoYXJzZXQuYXBwZW5kCi0gICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0UpOgotICAgICAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4Ci0gICAgICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybi5kYXRhOgorICAgIGlmIHBhdHRlcm4uZGF0YToKKyAgICAgICAgb3AsIGF2ID0gcGF0dGVybi5kYXRhWzBdCisgICAgICAgIGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGF2WzFdOgorICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXA6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gcHJlZml4X3NraXAgKyAxCi0gICAgICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQotICAgICAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBsZW4oYXZbMV0pID09IDE6Ci0gICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KLSAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4Ci0gICAgICAgIGlmIG5vdCBwcmVmaXggYW5kIHBhdHRlcm4uZGF0YToKLSAgICAgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQotICAgICAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06Ci0gICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KLSAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICBjaGFyc2V0YXBwZW5kKChvcCwgYXYpKQotICAgICAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgotICAgICAgICAgICAgICAgICAgICBjID0gW10KLSAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCi0gICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCgob3AsIGF2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgICAgICAgICAgY2hhcnNldGFwcGVuZCgob3AsIGF2KSkKICAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgogICAgICAgICAgICAgICAgIGMgPSBbXQogICAgICAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZApAQCAtNDczLDggKzQ1NSw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYwotICAgICAgICAgICAgZWxpZiBvcCBpcyBJTjoKLSAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYXYKKyAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICBjID0gW10KKyAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZAorICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgaWYgbm90IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQorICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgIGNhcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKKyAgICAgICAgZWxpZiBvcCBpcyBJTjoKKyAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorICAgIHJldHVybiBjaGFyc2V0CisKK2RlZiBfY29tcGlsZV9pbmZvKGNvZGUsIHBhdHRlcm4sIGZsYWdzKToKKyAgICAjIGludGVybmFsOiBjb21waWxlIGFuIGluZm8gYmxvY2suICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLAorICAgICMgdGhpcyBjb250YWlucyBtaW4vbWF4IHBhdHRlcm4gd2lkdGgsIGFuZCBhbiBvcHRpb25hbCBsaXRlcmFsCisgICAgIyBwcmVmaXggb3IgYSBjaGFyYWN0ZXIgbWFwCisgICAgbG8sIGhpID0gcGF0dGVybi5nZXR3aWR0aCgpCisgICAgaWYgaGkgPiBNQVhDT0RFOgorICAgICAgICBoaSA9IE1BWENPREUKKyAgICBpZiBsbyA9PSAwOgorICAgICAgICBjb2RlLmV4dGVuZChbSU5GTywgNCwgMCwgbG8sIGhpXSkKKyAgICAgICAgcmV0dXJuCisgICAgIyBsb29rIGZvciBhIGxpdGVyYWwgcHJlZml4CisgICAgcHJlZml4ID0gW10KKyAgICBwcmVmaXhfc2tpcCA9IDAKKyAgICBjaGFyc2V0ID0gW10gIyBub3QgdXNlZAorICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19JR05PUkVDQVNFKToKKyAgICAgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAorICAgICAgICBwcmVmaXgsIHByZWZpeF9za2lwLCBnb3RfYWxsID0gX2dldF9saXRlcmFsX3ByZWZpeChwYXR0ZXJuKQorICAgICAgICAjIGlmIG5vIHByZWZpeCwgbG9vayBmb3IgY2hhcnNldCBwcmVmaXgKKyAgICAgICAgaWYgbm90IHByZWZpeDoKKyAgICAgICAgICAgIGNoYXJzZXQgPSBfZ2V0X2NoYXJzZXRfcHJlZml4KHBhdHRlcm4pCiAjIyAgICAgaWYgcHJlZml4OgogIyMgICAgICAgICBwcmludCgiKioqIFBSRUZJWCIsIHByZWZpeCwgcHJlZml4X3NraXApCiAjIyAgICAgaWYgY2hhcnNldDoKQEAgLTQ4Nyw3ICs1MDQsNyBAQAogICAgIG1hc2sgPSAwCiAgICAgaWYgcHJlZml4OgogICAgICAgICBtYXNrID0gU1JFX0lORk9fUFJFRklYCi0gICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwID09IGxlbihwYXR0ZXJuLmRhdGEpOgorICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lIGFuZCBnb3RfYWxsOgogICAgICAgICAgICAgbWFzayA9IG1hc2sgfCBTUkVfSU5GT19MSVRFUkFMCiAgICAgZWxpZiBjaGFyc2V0OgogICAgICAgICBtYXNrID0gbWFzayB8IFNSRV9JTkZPX0NIQVJTRVQKQEAgLTUwMiw2ICs1MTksOCBAQAogICAgICMgYWRkIGxpdGVyYWwgcHJlZml4CiAgICAgaWYgcHJlZml4OgogICAgICAgICBlbWl0KGxlbihwcmVmaXgpKSAjIGxlbmd0aAorICAgICAgICBpZiBwcmVmaXhfc2tpcCBpcyBOb25lOgorICAgICAgICAgICAgcHJlZml4X3NraXAgPSAgbGVuKHByZWZpeCkKICAgICAgICAgZW1pdChwcmVmaXhfc2tpcCkgIyBza2lwCiAgICAgICAgIGNvZGUuZXh0ZW5kKHByZWZpeCkKICAgICAgICAgIyBnZW5lcmF0ZSBvdmVybGFwIHRhYmxlCmRpZmYgLS1naXQgYS9MaWIvc3JlX3BhcnNlLnB5IGIvTGliL3NyZV9wYXJzZS5weQppbmRleCA0ZmY1MGQxLi41MjFlMzc5IDEwMDY0NAotLS0gYS9MaWIvc3JlX3BhcnNlLnB5CisrKyBiL0xpYi9zcmVfcGFyc2UucHkKQEAgLTI4MiwzMyArMjgyLDYgQEAKICAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnLCBvZmZzZXQ9MCk6CiAgICAgICAgIHJldHVybiBlcnJvcihtc2csIHNlbGYuc3RyaW5nLCBzZWxmLnRlbGwoKSAtIG9mZnNldCkKIAotIyBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgbm90IHVzZWQgaW4gdGhpcyBtb2R1bGUgYW55bW9yZSwgYnV0IHdlIGtlZXAKLSMgdGhlbSBoZXJlICh3aXRoIERlcHJlY2F0aW9uV2FybmluZ3MpIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLQotZGVmIGlzaWRlbnQoY2hhcik6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgd2FybmluZ3Mud2Fybignc3JlX3BhcnNlLmlzaWRlbnQoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMy41JywKLSAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgIHJldHVybiAiYSIgPD0gY2hhciA8PSAieiIgb3IgIkEiIDw9IGNoYXIgPD0gIloiIG9yIGNoYXIgPT0gIl8iCi0KLWRlZiBpc2RpZ2l0KGNoYXIpOgotICAgIGltcG9ydCB3YXJuaW5ncwotICAgIHdhcm5pbmdzLndhcm4oJ3NyZV9wYXJzZS5pc2RpZ2l0KCkgd2lsbCBiZSByZW1vdmVkIGluIDMuNScsCi0gICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICByZXR1cm4gIjAiIDw9IGNoYXIgPD0gIjkiCi0KLWRlZiBpc25hbWUobmFtZSk6Ci0gICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgd2FybmluZ3Mud2Fybignc3JlX3BhcnNlLmlzbmFtZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjUnLAotICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgIyBjaGVjayB0aGF0IGdyb3VwIG5hbWUgaXMgYSB2YWxpZCBzdHJpbmcKLSAgICBpZiBub3QgaXNpZGVudChuYW1lWzBdKToKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgZm9yIGNoYXIgaW4gbmFtZVsxOl06Ci0gICAgICAgIGlmIG5vdCBpc2lkZW50KGNoYXIpIGFuZCBub3QgaXNkaWdpdChjaGFyKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBUcnVlCi0KIGRlZiBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgZXNjYXBlKToKICAgICAjIGhhbmRsZSBlc2NhcGUgY29kZSBpbnNpZGUgY2hhcmFjdGVyIGNsYXNzCiAgICAgY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKQEAgLTM1MSw5ICszMjQsNyBAQAogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgogICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgogICAgICAgICAgICAgaWYgYyBpbiBBU0NJSUxFVFRFUlM6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignYmFkIGVzY2FwZSAlcycgJSBlc2NhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9OCkKKyAgICAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoJ2JhZCBlc2NhcGUgJXMnICUgZXNjYXBlLCBsZW4oZXNjYXBlKSkKICAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBvcmQoZXNjYXBlWzFdKQogICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICBwYXNzCkBAIC00MTgsOSArMzg5LDcgQEAKICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcigiaW52YWxpZCBncm91cCByZWZlcmVuY2UiLCBsZW4oZXNjYXBlKSkKICAgICAgICAgaWYgbGVuKGVzY2FwZSkgPT0gMjoKICAgICAgICAgICAgIGlmIGMgaW4gQVNDSUlMRVRURVJTOgotICAgICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ2JhZCBlc2NhcGUgJXMnICUgZXNjYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTgpCisgICAgICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCJiYWQgZXNjYXBlICVzIiAlIGVzY2FwZSwgbGVuKGVzY2FwZSkpCiAgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgb3JkKGVzY2FwZVsxXSkKICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgcGFzcwpAQCAtNzk4LDEwICs3NjcsNyBAQAogICAgICMgQ2hlY2sgYW5kIGZpeCBmbGFncyBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgcGF0dGVybiAoc3RyIG9yIGJ5dGVzKQogICAgIGlmIGlzaW5zdGFuY2Uoc3JjLCBzdHIpOgogICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRToKLSAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgd2FybmluZ3Mud2FybigiTE9DQUxFIGZsYWcgd2l0aCBhIHN0ciBwYXR0ZXJuIGlzIGRlcHJlY2F0ZWQuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbGwgYmUgYW4gZXJyb3IgaW4gMy42IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTYpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgdXNlIExPQ0FMRSBmbGFnIHdpdGggYSBzdHIgcGF0dGVybiIpCiAgICAgICAgIGlmIG5vdCBmbGFncyAmIFNSRV9GTEFHX0FTQ0lJOgogICAgICAgICAgICAgZmxhZ3MgfD0gU1JFX0ZMQUdfVU5JQ09ERQogICAgICAgICBlbGlmIGZsYWdzICYgU1JFX0ZMQUdfVU5JQ09ERToKQEAgLTgxMCwxMCArNzc2LDcgQEAKICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHVzZSBVTklDT0RFIGZsYWcgd2l0aCBhIGJ5dGVzIHBhdHRlcm4iKQogICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRSBhbmQgZmxhZ3MgJiBTUkVfRkxBR19BU0NJSToKLSAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQVNDSUkgYW5kIExPQ0FMRSBmbGFncyBhcmUgaW5jb21wYXRpYmxlLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJXaWxsIGJlIGFuIGVycm9yIGluIDMuNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD02KQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQVNDSUkgYW5kIExPQ0FMRSBmbGFncyBhcmUgaW5jb21wYXRpYmxlIikKICAgICByZXR1cm4gZmxhZ3MKIAogZGVmIHBhcnNlKHN0ciwgZmxhZ3M9MCwgcGF0dGVybj1Ob25lKToKQEAgLTkxNCw5ICs4NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICB0aGlzID0gY2hyKEVTQ0FQRVNbdGhpc11bMV0pCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICBpZiBjIGluIEFTQ0lJTEVUVEVSUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignYmFkIGVzY2FwZSAlcycgJSB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHMuZXJyb3IoJ2JhZCBlc2NhcGUgJXMnICUgdGhpcywgbGVuKHRoaXMpKQogICAgICAgICAgICAgICAgIGxhcHBlbmQodGhpcykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGxhcHBlbmQodGhpcykKZGlmZiAtLWdpdCBhL0xpYi9zc2wucHkgYi9MaWIvc3NsLnB5CmluZGV4IDNmNWMzYzQuLjU2MGNmZWYgMTAwNjQ0Ci0tLSBhL0xpYi9zc2wucHkKKysrIGIvTGliL3NzbC5weQpAQCAtODkwLDcgKzg5MCw2IEBACiAgICAgICAgICAgICB3aGlsZSAoY291bnQgPCBhbW91bnQpOgogICAgICAgICAgICAgICAgIHYgPSBzZWxmLnNlbmQoZGF0YVtjb3VudDpdKQogICAgICAgICAgICAgICAgIGNvdW50ICs9IHYKLSAgICAgICAgICAgIHJldHVybiBhbW91bnQKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzb2NrZXQuc2VuZGFsbChzZWxmLCBkYXRhLCBmbGFncykKIApkaWZmIC0tZ2l0IGEvTGliL3N0YXRpc3RpY3MucHkgYi9MaWIvc3RhdGlzdGljcy5weQppbmRleCA0ZjVjMWMxLi42M2FkYzFhIDEwMDY0NAotLS0gYS9MaWIvc3RhdGlzdGljcy5weQorKysgYi9MaWIvc3RhdGlzdGljcy5weQpAQCAtMTA1LDYgKzEwNSw3IEBACiBmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24KIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnkKK2Zyb20gYmlzZWN0IGltcG9ydCBiaXNlY3RfbGVmdCwgYmlzZWN0X3JpZ2h0CiAKIAogCkBAIC0xMzAsMjMgKzEzMSwyMyBAQAogICAgIC0tLS0tLS0tCiAKICAgICA+Pj4gX3N1bShbMywgMi4yNSwgNC41LCAtMC41LCAxLjBdLCAwLjc1KQotICAgICg8Y2xhc3MgJ2Zsb2F0Jz4sIEZyYWN0aW9uKDExLCAxKSwgNSkKKyAgICAoPGNsYXNzICdmbG9hdCcgLi4uPiwgRnJhY3Rpb24oMTEsIDEpLCA1KQogCiAgICAgU29tZSBzb3VyY2VzIG9mIHJvdW5kLW9mZiBlcnJvciB3aWxsIGJlIGF2b2lkZWQ6CiAKICAgICA+Pj4gX3N1bShbMWU1MCwgMSwgLTFlNTBdICogMTAwMCkgICMgQnVpbHQtaW4gc3VtIHJldHVybnMgemVyby4KLSAgICAoPGNsYXNzICdmbG9hdCc+LCBGcmFjdGlvbigxMDAwLCAxKSwgMzAwMCkKKyAgICAoPGNsYXNzICdmbG9hdCcgLi4uPiwgRnJhY3Rpb24oMTAwMCwgMSksIDMwMDApCiAKICAgICBGcmFjdGlvbnMgYW5kIERlY2ltYWxzIGFyZSBhbHNvIHN1cHBvcnRlZDoKIAogICAgID4+PiBmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24gYXMgRgogICAgID4+PiBfc3VtKFtGKDIsIDMpLCBGKDcsIDUpLCBGKDEsIDQpLCBGKDUsIDYpXSkKLSAgICAoPGNsYXNzICdmcmFjdGlvbnMuRnJhY3Rpb24nPiwgRnJhY3Rpb24oNjMsIDIwKSwgNCkKKyAgICAoPGNsYXNzICdmcmFjdGlvbnMuRnJhY3Rpb24nIC4uLj4sIEZyYWN0aW9uKDYzLCAyMCksIDQpCiAKICAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsIGFzIEQKICAgICA+Pj4gZGF0YSA9IFtEKCIwLjEzNzUiKSwgRCgiMC4yMTA4IiksIEQoIjAuMzA2MSIpLCBEKCIwLjA0MTkiKV0KICAgICA+Pj4gX3N1bShkYXRhKQotICAgICg8Y2xhc3MgJ2RlY2ltYWwuRGVjaW1hbCc+LCBGcmFjdGlvbig2OTYzLCAxMDAwMCksIDQpCisgICAgKDxjbGFzcyAnZGVjaW1hbC5EZWNpbWFsJyAuLi4+LCBGcmFjdGlvbig2OTYzLCAxMDAwMCksIDQpCiAKICAgICBNaXhlZCB0eXBlcyBhcmUgY3VycmVudGx5IHRyZWF0ZWQgYXMgYW4gZXJyb3IsIGV4Y2VwdCB0aGF0IGludCBpcwogICAgIGFsbG93ZWQuCkBAIC0yMjMsNTYgKzIyNCwyNiBAQAogICAgICAgICAjIE9wdGltaXNlIHRoZSBjb21tb24gY2FzZSBvZiBmbG9hdHMuIFdlIGV4cGVjdCB0aGF0IHRoZSBtb3N0IG9mdGVuCiAgICAgICAgICMgdXNlZCBudW1lcmljIHR5cGUgd2lsbCBiZSBidWlsdGluIGZsb2F0cywgc28gdHJ5IHRvIG1ha2UgdGhpcyBhcwogICAgICAgICAjIGZhc3QgYXMgcG9zc2libGUuCi0gICAgICAgIGlmIHR5cGUoeCkgaXMgZmxvYXQ6CisgICAgICAgIGlmIHR5cGUoeCkgaXMgZmxvYXQgb3IgdHlwZSh4KSBpcyBEZWNpbWFsOgogICAgICAgICAgICAgcmV0dXJuIHguYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgeCBtYXkgYmUgYW4gaW50LCBGcmFjdGlvbiwgb3IgSW50ZWdyYWwgQUJDLgogICAgICAgICAgICAgcmV0dXJuICh4Lm51bWVyYXRvciwgeC5kZW5vbWluYXRvcikKICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICMgeCBtYXkgYmUgYSBmbG9hdCBzdWJjbGFzcy4KKyAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgZmxvYXQgb3IgRGVjaW1hbCBzdWJjbGFzcy4KICAgICAgICAgICAgICAgICByZXR1cm4geC5hc19pbnRlZ2VyX3JhdGlvKCkKICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICMgeCBtYXkgYmUgYSBEZWNpbWFsLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlY2ltYWxfdG9fcmF0aW8oeCkKLSAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgSnVzdCBnaXZlIHVwPwotICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgIyBKdXN0IGdpdmUgdXA/CisgICAgICAgICAgICAgICAgcGFzcwogICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICMgZmxvYXQgTkFOIG9yIElORi4KLSAgICAgICAgYXNzZXJ0IG5vdCBtYXRoLmlzZmluaXRlKHgpCisgICAgICAgIGFzc2VydCBub3QgX2lzZmluaXRlKHgpCiAgICAgICAgIHJldHVybiAoeCwgTm9uZSkKICAgICBtc2cgPSAiY2FuJ3QgY29udmVydCB0eXBlICd7fScgdG8gbnVtZXJhdG9yL2Rlbm9taW5hdG9yIgogICAgIHJhaXNlIFR5cGVFcnJvcihtc2cuZm9ybWF0KHR5cGUoeCkuX19uYW1lX18pKQogCiAKLSMgRklYTUUgVGhpcyBpcyBmYXN0ZXIgdGhhbiBGcmFjdGlvbi5mcm9tX2RlY2ltYWwsIGJ1dCBzdGlsbCB0b28gc2xvdy4KLWRlZiBfZGVjaW1hbF90b19yYXRpbyhkKToKLSAgICAiIiJDb252ZXJ0IERlY2ltYWwgZCB0byBleGFjdCBpbnRlZ2VyIHJhdGlvIChudW1lcmF0b3IsIGRlbm9taW5hdG9yKS4KLQotICAgID4+PiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKLSAgICA+Pj4gX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMi42IikpCi0gICAgKDI2LCAxMCkKLQotICAgICIiIgotICAgIHNpZ24sIGRpZ2l0cywgZXhwID0gZC5hc190dXBsZSgpCi0gICAgaWYgZXhwIGluICgnRicsICduJywgJ04nKTogICMgSU5GLCBOQU4sIHNOQU4KLSAgICAgICAgYXNzZXJ0IG5vdCBkLmlzX2Zpbml0ZSgpCi0gICAgICAgIHJldHVybiAoZCwgTm9uZSkKLSAgICBudW0gPSAwCi0gICAgZm9yIGRpZ2l0IGluIGRpZ2l0czoKLSAgICAgICAgbnVtID0gbnVtKjEwICsgZGlnaXQKLSAgICBpZiBleHAgPCAwOgotICAgICAgICBkZW4gPSAxMCoqLWV4cAotICAgIGVsc2U6Ci0gICAgICAgIG51bSAqPSAxMCoqZXhwCi0gICAgICAgIGRlbiA9IDEKLSAgICBpZiBzaWduOgotICAgICAgICBudW0gPSAtbnVtCi0gICAgcmV0dXJuIChudW0sIGRlbikKLQotCiBkZWYgX2NvbnZlcnQodmFsdWUsIFQpOgogICAgICIiIkNvbnZlcnQgdmFsdWUgdG8gZ2l2ZW4gbnVtZXJpYyB0eXBlIFQuIiIiCiAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgVDoKQEAgLTMwNSw2ICsyNzYsMjEgQEAKICAgICByZXR1cm4gdGFibGUKIAogCitkZWYgX2ZpbmRfbHRlcShhLCB4KToKKyAgICAnTG9jYXRlIHRoZSBsZWZ0bW9zdCB2YWx1ZSBleGFjdGx5IGVxdWFsIHRvIHgnCisgICAgaSA9IGJpc2VjdF9sZWZ0KGEsIHgpCisgICAgaWYgaSAhPSBsZW4oYSkgYW5kIGFbaV0gPT0geDoKKyAgICAgICAgcmV0dXJuIGkKKyAgICByYWlzZSBWYWx1ZUVycm9yCisKKworZGVmIF9maW5kX3J0ZXEoYSwgbCwgeCk6CisgICAgJ0xvY2F0ZSB0aGUgcmlnaHRtb3N0IHZhbHVlIGV4YWN0bHkgZXF1YWwgdG8geCcKKyAgICBpID0gYmlzZWN0X3JpZ2h0KGEsIHgsIGxvPWwpCisgICAgaWYgaSAhPSAobGVuKGEpKzEpIGFuZCBhW2ktMV0gPT0geDoKKyAgICAgICAgcmV0dXJuIGktMQorICAgIHJhaXNlIFZhbHVlRXJyb3IKKwogIyA9PT0gTWVhc3VyZXMgb2YgY2VudHJhbCB0ZW5kZW5jeSAoYXZlcmFnZXMpID09PQogCiBkZWYgbWVhbihkYXRhKToKQEAgLTQ0Miw5ICs0MjgsMTUgQEAKICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAjIE1peGVkIHR5cGUuIEZvciBub3cgd2UganVzdCBjb2VyY2UgdG8gZmxvYXQuCiAgICAgICAgIEwgPSBmbG9hdCh4KSAtIGZsb2F0KGludGVydmFsKS8yCi0gICAgY2YgPSBkYXRhLmluZGV4KHgpICAjIE51bWJlciBvZiB2YWx1ZXMgYmVsb3cgdGhlIG1lZGlhbiBpbnRlcnZhbC4KLSAgICAjIEZJWE1FIFRoZSBmb2xsb3dpbmcgbGluZSBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCBmb3IgYmlnIGxpc3RzLgotICAgIGYgPSBkYXRhLmNvdW50KHgpICAjIE51bWJlciBvZiBkYXRhIHBvaW50cyBpbiB0aGUgbWVkaWFuIGludGVydmFsLgorCisgICAgIyBVc2VzIGJpc2VjdGlvbiBzZWFyY2ggdG8gc2VhcmNoIGZvciB4IGluIGRhdGEgd2l0aCBsb2cobikgdGltZSBjb21wbGV4aXR5CisgICAgIyBGaW5kIHRoZSBwb3NpdGlvbiBvZiBsZWZ0bW9zdCBvY2N1cnJlbmNlIG9mIHggaW4gZGF0YQorICAgIGwxID0gX2ZpbmRfbHRlcShkYXRhLCB4KQorICAgICMgRmluZCB0aGUgcG9zaXRpb24gb2YgcmlnaHRtb3N0IG9jY3VycmVuY2Ugb2YgeCBpbiBkYXRhW2wxLi4ubGVuKGRhdGEpXQorICAgICMgQXNzdW1pbmcgYWx3YXlzIGwxIDw9IGwyCisgICAgbDIgPSBfZmluZF9ydGVxKGRhdGEsIGwxLCB4KQorICAgIGNmID0gbDEKKyAgICBmID0gbDIgLSBsMSArIDEKICAgICByZXR1cm4gTCArIGludGVydmFsKihuLzIgLSBjZikvZgogCiAKZGlmZiAtLWdpdCBhL0xpYi9zdHJpbmcucHkgYi9MaWIvc3RyaW5nLnB5CmluZGV4IDg5Mjg3YzQuLjcyOThjODkgMTAwNjQ0Ci0tLSBhL0xpYi9zdHJpbmcucHkKKysrIGIvTGliL3N0cmluZy5weQpAQCAtMTE2LDEwICsxMTYsNyBAQAogICAgICAgICAgICAgIyBDaGVjayB0aGUgbW9zdCBjb21tb24gcGF0aCBmaXJzdC4KICAgICAgICAgICAgIG5hbWVkID0gbW8uZ3JvdXAoJ25hbWVkJykgb3IgbW8uZ3JvdXAoJ2JyYWNlZCcpCiAgICAgICAgICAgICBpZiBuYW1lZCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB2YWwgPSBtYXBwaW5nW25hbWVkXQotICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIgd2lsbAotICAgICAgICAgICAgICAgICMgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCi0gICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAodmFsLCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG1hcHBpbmdbbmFtZWRdKQogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VzY2FwZWQnKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdpbnZhbGlkJykgaXMgbm90IE5vbmU6CkBAIC0xNDYsOSArMTQzLDcgQEAKICAgICAgICAgICAgIG5hbWVkID0gbW8uZ3JvdXAoJ25hbWVkJykgb3IgbW8uZ3JvdXAoJ2JyYWNlZCcpCiAgICAgICAgICAgICBpZiBuYW1lZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIKLSAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlIChtYXBwaW5nW25hbWVkXSwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIobWFwcGluZ1tuYW1lZF0pCiAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW8uZ3JvdXAoKQogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VzY2FwZWQnKSBpcyBub3QgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggZDhkNmFiMi4uM2RlYTA4OSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTM3Miw5ICszNzIsMTEgQEAKIAogCiBjbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoU3VicHJvY2Vzc0Vycm9yKToKLSAgICAiIiJUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHByb2Nlc3MgcnVuIGJ5IGNoZWNrX2NhbGwoKSBvcgotICAgIGNoZWNrX291dHB1dCgpIHJldHVybnMgYSBub24temVybyBleGl0IHN0YXR1cy4KLSAgICBUaGUgZXhpdCBzdGF0dXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlOworICAgICIiIlJhaXNlZCB3aGVuIGEgY2hlY2tfY2FsbCgpIG9yIGNoZWNrX291dHB1dCgpIHByb2Nlc3MgcmV0dXJucyBub24temVyby4KKworICAgIFRoZSBleGl0IHN0YXR1cyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUsIG5lZ2F0aXZlCisgICAgaWYgaXQgcmVwcmVzZW50cyBhIHNpZ25hbCBudW1iZXIuCisKICAgICBjaGVja19vdXRwdXQoKSB3aWxsIGFsc28gc3RvcmUgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0IGF0dHJpYnV0ZS4KICAgICAiIiIKICAgICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZSwgY21kLCBvdXRwdXQ9Tm9uZSwgc3RkZXJyPU5vbmUpOgpAQCAtMzg0LDcgKzM4NiwxNiBAQAogICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgc3RhdHVzICVkIiAlIChzZWxmLmNtZCwgc2VsZi5yZXR1cm5jb2RlKQorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgYW5kIHNlbGYucmV0dXJuY29kZSA8IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgZGllZCB3aXRoICVyLiIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZCwgc2lnbmFsLlNpZ25hbHMoLXNlbGYucmV0dXJuY29kZSkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyBkaWVkIHdpdGggdW5rbm93biBzaWduYWwgJWQuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY21kLCAtc2VsZi5yZXR1cm5jb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBzdGF0dXMgJWQuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbWQsIHNlbGYucmV0dXJuY29kZSkKIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBzdGRvdXQoc2VsZik6CkBAIC00NzEsNyArNDgyLDggQEAKICAgICBfX2FsbF9fLmV4dGVuZChbIkNSRUFURV9ORVdfQ09OU09MRSIsICJDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAiLAogICAgICAgICAgICAgICAgICAgICAiU1REX0lOUFVUX0hBTkRMRSIsICJTVERfT1VUUFVUX0hBTkRMRSIsCiAgICAgICAgICAgICAgICAgICAgICJTVERfRVJST1JfSEFORExFIiwgIlNXX0hJREUiLAotICAgICAgICAgICAgICAgICAgICAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciXSkKKyAgICAgICAgICAgICAgICAgICAgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgIlNUQVJURl9VU0VTSE9XV0lORE9XIiwKKyAgICAgICAgICAgICAgICAgICAgIlNUQVJUVVBJTkZPIl0pCiAKICAgICBjbGFzcyBIYW5kbGUoaW50KToKICAgICAgICAgY2xvc2VkID0gRmFsc2UKQEAgLTUyMCw2ICs1MzIsMTYgQEAKICMgYnV0IGl0J3MgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBpbXBvcnRlZCB3aGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRob3V0CiAjIHRocmVhZHMuCiAKK2RlZiBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgb3B0aW1pemF0aW9uIHNldHRpbmdzIGluIHN5cy5mbGFncy4iIiIKKyAgICBhcmdzID0gW10KKyAgICB2YWx1ZSA9IHN5cy5mbGFncy5vcHRpbWl6ZQorICAgIGlmIHZhbHVlID4gMDoKKyAgICAgICAgYXJncy5hcHBlbmQoJy0nICsgJ08nICogdmFsdWUpCisgICAgcmV0dXJuIGFyZ3MKKworCiBkZWYgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgogICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgpAQCAtNTI3LDcgKzU0OSw2IEBACiAgICAgICAgICdkZWJ1Zyc6ICdkJywKICAgICAgICAgIyAnaW5zcGVjdCc6ICdpJywKICAgICAgICAgIyAnaW50ZXJhY3RpdmUnOiAnaScsCi0gICAgICAgICdvcHRpbWl6ZSc6ICdPJywKICAgICAgICAgJ2RvbnRfd3JpdGVfYnl0ZWNvZGUnOiAnQicsCiAgICAgICAgICdub191c2VyX3NpdGUnOiAncycsCiAgICAgICAgICdub19zaXRlJzogJ1MnLApAQCAtNTM1LDggKzU1Niw5IEBACiAgICAgICAgICd2ZXJib3NlJzogJ3YnLAogICAgICAgICAnYnl0ZXNfd2FybmluZyc6ICdiJywKICAgICAgICAgJ3F1aWV0JzogJ3EnLAorICAgICAgICAjIC1PIGlzIGhhbmRsZWQgaW4gX29wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCiAgICAgfQotICAgIGFyZ3MgPSBbXQorICAgIGFyZ3MgPSBfb3B0aW1fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKICAgICBmb3IgZmxhZywgb3B0IGluIGZsYWdfb3B0X21hcC5pdGVtcygpOgogICAgICAgICB2ID0gZ2V0YXR0cihzeXMuZmxhZ3MsIGZsYWcpCiAgICAgICAgIGlmIHYgPiAwOgpAQCAtOTcxLDcgKzk5Myw2IEBACiAKICAgICAgICAgICAgIHJhaXNlCiAKLQogICAgIGRlZiBfdHJhbnNsYXRlX25ld2xpbmVzKHNlbGYsIGRhdGEsIGVuY29kaW5nKToKICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuY29kaW5nKQogICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCJcclxuIiwgIlxuIikucmVwbGFjZSgiXHIiLCAiXG4iKQpAQCAtOTk1LDYgKzEwMTYsMTEgQEAKICAgICAgICAgaWYgbm90IHNlbGYuX2NoaWxkX2NyZWF0ZWQ6CiAgICAgICAgICAgICAjIFdlIGRpZG4ndCBnZXQgdG8gc3VjY2Vzc2Z1bGx5IGNyZWF0ZSBhIGNoaWxkIHByb2Nlc3MuCiAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vdCByZWFkaW5nIHN1YnByb2Nlc3MgZXhpdCBzdGF0dXMgY3JlYXRlcyBhIHpvbWJpIHByb2Nlc3Mgd2hpY2gKKyAgICAgICAgICAgICMgaXMgb25seSBkZXN0cm95ZWQgYXQgdGhlIHBhcmVudCBweXRob24gcHJvY2VzcyBleGl0CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJzdWJwcm9jZXNzICVzIGlzIHN0aWxsIHJ1bm5pbmciICUgc2VsZi5waWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlV2FybmluZywgc291cmNlPXNlbGYpCiAgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCiAgICAgICAgIHNlbGYuX2ludGVybmFsX3BvbGwoX2RlYWRzdGF0ZT1fbWF4c2l6ZSkKICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmUgYW5kIF9hY3RpdmUgaXMgbm90IE5vbmU6CkBAIC0xNTIwLDkgKzE1NDYsMTQgQEAKIAogICAgICAgICAgICAgaWYgZXJycGlwZV9kYXRhOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCAwKQorICAgICAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfZXhpdHN0YXR1cyhzdHMpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBzeXMubWF4c2l6ZQogICAgICAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcGFzcworCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25fbmFtZSwgaGV4X2Vycm5vLCBlcnJfbXNnID0gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnBpcGVfZGF0YS5zcGxpdChiJzonLCAyKSkKZGlmZiAtLWdpdCBhL0xpYi9zeXNjb25maWcucHkgYi9MaWIvc3lzY29uZmlnLnB5CmluZGV4IDljMzRiZTAuLmVmNTMwNjEgMTAwNjQ0Ci0tLSBhL0xpYi9zeXNjb25maWcucHkKKysrIGIvTGliL3N5c2NvbmZpZy5weQpAQCAtODYsOCArODYsOCBAQAogICMgRklYTUUgZG9uJ3QgcmVseSBvbiBzeXMudmVyc2lvbiBoZXJlLCBpdHMgZm9ybWF0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbAogICMgb2YgQ1B5dGhvbiwgdXNlIHN5cy52ZXJzaW9uX2luZm8gb3Igc3lzLmhleHZlcnNpb24KIF9QWV9WRVJTSU9OID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQotX1BZX1ZFUlNJT05fU0hPUlQgPSBzeXMudmVyc2lvbls6M10KLV9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVCA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KK19QWV9WRVJTSU9OX1NIT1JUID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCitfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSAnJWQlZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLnByZWZpeCkKIF9CQVNFX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmJhc2VfcHJlZml4KQogX0VYRUNfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY19wcmVmaXgpCkBAIC0zMzcsNiArMzM3LDggQEAKICAgICAgICAgY29uZmlnX2Rpcl9uYW1lID0gJ2NvbmZpZy0lcyVzJyAlIChfUFlfVkVSU0lPTl9TSE9SVCwgc3lzLmFiaWZsYWdzKQogICAgIGVsc2U6CiAgICAgICAgIGNvbmZpZ19kaXJfbmFtZSA9ICdjb25maWcnCisgICAgaWYgaGFzYXR0cihzeXMuaW1wbGVtZW50YXRpb24sICdfbXVsdGlhcmNoJyk6CisgICAgICAgIGNvbmZpZ19kaXJfbmFtZSArPSAnLSVzJyAlIHN5cy5pbXBsZW1lbnRhdGlvbi5fbXVsdGlhcmNoCiAgICAgcmV0dXJuIG9zLnBhdGguam9pbihnZXRfcGF0aCgnc3RkbGliJyksIGNvbmZpZ19kaXJfbmFtZSwgJ01ha2VmaWxlJykKIAogZGVmIF9nZW5lcmF0ZV9wb3NpeF92YXJzKCk6CkBAIC0zNzksMTQgKzM4MSwxNCBAQAogICAgICMgX3N5c2NvbmZpZ2RhdGEgbW9kdWxlIG1hbnVhbGx5IGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBidWlsZCB2YXJzLgogICAgICMgVGhpcyBpcyBtb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhlIHN1YnNlcXVlbnQgY2FsbCB0bwogICAgICMgZ2V0X3BsYXRmb3JtKCkgc3VjY2VlZHMuCi0gICAgbmFtZSA9ICdfc3lzY29uZmlnZGF0YScKKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhXycgKyBzeXMuYWJpZmxhZ3MKICAgICBpZiAnZGFyd2luJyBpbiBzeXMucGxhdGZvcm06CiAgICAgICAgIGltcG9ydCB0eXBlcwogICAgICAgICBtb2R1bGUgPSB0eXBlcy5Nb2R1bGVUeXBlKG5hbWUpCiAgICAgICAgIG1vZHVsZS5idWlsZF90aW1lX3ZhcnMgPSB2YXJzCiAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbW9kdWxlCiAKLSAgICBweWJ1aWxkZGlyID0gJ2J1aWxkL2xpYi4lcy0lcycgJSAoZ2V0X3BsYXRmb3JtKCksIHN5cy52ZXJzaW9uWzozXSkKKyAgICBweWJ1aWxkZGlyID0gJ2J1aWxkL2xpYi4lcy0lcycgJSAoZ2V0X3BsYXRmb3JtKCksIF9QWV9WRVJTSU9OX1NIT1JUKQogICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgogICAgICAgICBweWJ1aWxkZGlyICs9ICctcHlkZWJ1ZycKICAgICBvcy5tYWtlZGlycyhweWJ1aWxkZGlyLCBleGlzdF9vaz1UcnVlKQpAQCAtNDA1LDcgKzQwNyw5IEBACiBkZWYgX2luaXRfcG9zaXgodmFycyk6CiAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgogICAgICMgX3N5c2NvbmZpZ2RhdGEgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUsIHNlZSBfZ2VuZXJhdGVfcG9zaXhfdmFycygpCi0gICAgZnJvbSBfc3lzY29uZmlnZGF0YSBpbXBvcnQgYnVpbGRfdGltZV92YXJzCisgICAgbmFtZSA9ICdfc3lzY29uZmlnZGF0YV8nICsgc3lzLmFiaWZsYWdzCisgICAgX3RlbXAgPSBfX2ltcG9ydF9fKG5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnYnVpbGRfdGltZV92YXJzJ10sIDApCisgICAgYnVpbGRfdGltZV92YXJzID0gX3RlbXAuYnVpbGRfdGltZV92YXJzCiAgICAgdmFycy51cGRhdGUoYnVpbGRfdGltZV92YXJzKQogCiBkZWYgX2luaXRfbm9uX3Bvc2l4KHZhcnMpOgpAQCAtNTE4LDcgKzUyMiw3IEBACiAgICAgICAgIF9DT05GSUdfVkFSU1snZXhlY19wcmVmaXgnXSA9IF9FWEVDX1BSRUZJWAogICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb24nXSA9IF9QWV9WRVJTSU9OCiAgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9zaG9ydCddID0gX1BZX1ZFUlNJT05fU0hPUlQKLSAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX25vZG90J10gPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCisgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9ub2RvdCddID0gX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UCiAgICAgICAgIF9DT05GSUdfVkFSU1snaW5zdGFsbGVkX2Jhc2UnXSA9IF9CQVNFX1BSRUZJWAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2Jhc2UnXSA9IF9QUkVGSVgKICAgICAgICAgX0NPTkZJR19WQVJTWydpbnN0YWxsZWRfcGxhdGJhc2UnXSA9IF9CQVNFX0VYRUNfUFJFRklYCmRpZmYgLS1naXQgYS9MaWIvdGFyZmlsZS5weSBiL0xpYi90YXJmaWxlLnB5CmluZGV4IDcyMWY5ZDcuLmRmNDc0NWQgMTAwNzU1Ci0tLSBhL0xpYi90YXJmaWxlLnB5CisrKyBiL0xpYi90YXJmaWxlLnB5CkBAIC02NCw3ICs2NCwxMCBAQAogICAgIHBhc3MKIAogIyBmcm9tIHRhcmZpbGUgaW1wb3J0ICoKLV9fYWxsX18gPSBbIlRhckZpbGUiLCAiVGFySW5mbyIsICJpc190YXJmaWxlIiwgIlRhckVycm9yIl0KK19fYWxsX18gPSBbIlRhckZpbGUiLCAiVGFySW5mbyIsICJpc190YXJmaWxlIiwgIlRhckVycm9yIiwgIlJlYWRFcnJvciIsCisgICAgICAgICAgICJDb21wcmVzc2lvbkVycm9yIiwgIlN0cmVhbUVycm9yIiwgIkV4dHJhY3RFcnJvciIsICJIZWFkZXJFcnJvciIsCisgICAgICAgICAgICJFTkNPRElORyIsICJVU1RBUl9GT1JNQVQiLCAiR05VX0ZPUk1BVCIsICJQQVhfRk9STUFUIiwKKyAgICAgICAgICAgIkRFRkFVTFRfRk9STUFUIiwgIm9wZW4iXQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIHRhciBjb25zdGFudHMKQEAgLTIzNzQsOSArMjM3NywzMiBAQAogICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKLSAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCisgICAgICAgICAgICB5aWVsZCBmcm9tIHNlbGYubWVtYmVycworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBZaWVsZCBpdGVtcyB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgIyBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgorICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCisgICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAorICAgICAgICAjIHdoaWNoIHdpbGwgaGF2ZSBhbHJlYWR5IGV4aGF1c3RlZCB0aGUgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbworCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBpbmRleCA8IGxlbihzZWxmLm1lbWJlcnMpOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm1lbWJlcnNbaW5kZXhdCisgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLl9sb2FkZWQ6CisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCisgICAgICAgICAgICAgICAgaWYgbm90IHRhcmluZm86CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgeWllbGQgdGFyaW5mbwogCiAgICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CiAgICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KQEAgLTIzOTcsNDUgKzI0MjMsNiBAQAogICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQotIyBjbGFzcyBUYXJGaWxlCi0KLWNsYXNzIFRhckl0ZXI6Ci0gICAgIiIiSXRlcmF0b3IgQ2xhc3MuCi0KLSAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6Ci0gICAgICAgICAgIHN1aXRlLi4uCi0gICAgIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6Ci0gICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQotICAgICAgICBzZWxmLmluZGV4ID0gMAotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9fbmV4dF9fKHNlbGYpOgotICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KLSAgICAgICAgICAgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KLSAgICAgICAgIiIiCi0gICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgotICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKLSAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KLQotICAgICAgICBpZiBzZWxmLmluZGV4ID09IDAgYW5kIHNlbGYudGFyZmlsZS5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCi0gICAgICAgIGVsaWYgc2VsZi5pbmRleCA8IGxlbihzZWxmLnRhcmZpbGUubWVtYmVycyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm1lbWJlcnNbc2VsZi5pbmRleF0KLSAgICAgICAgZWxpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICAgICAgaWYgbm90IHRhcmluZm86Ci0gICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotICAgICAgICBzZWxmLmluZGV4ICs9IDEKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGV4cG9ydGVkIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvTGliL3RlbG5ldGxpYi5weSBiL0xpYi90ZWxuZXRsaWIucHkKaW5kZXggNzJkYWJjNy4uYjA4NjNiMSAxMDA2NDQKLS0tIGEvTGliL3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVsbmV0bGliLnB5CkBAIC02MzcsNiArNjM3LDEyIEBACiAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgogICAgICAgICByZXR1cm4gKC0xLCBOb25lLCB0ZXh0KQogCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKIAogZGVmIHRlc3QoKToKICAgICAiIiJUZXN0IHByb2dyYW0gZm9yIHRlbG5ldGxpYi4KQEAgLTY2MCwxMSArNjY2LDEwIEBACiAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnRzdHIpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHBvcnRzdHIsICd0Y3AnKQotICAgIHRuID0gVGVsbmV0KCkKLSAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQotICAgIHRuLm9wZW4oaG9zdCwgcG9ydCwgdGltZW91dD0wLjUpCi0gICAgdG4uaW50ZXJhY3QoKQotICAgIHRuLmNsb3NlKCkKKyAgICB3aXRoIFRlbG5ldCgpIGFzIHRuOgorICAgICAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQorICAgICAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQorICAgICAgICB0bi5pbnRlcmFjdCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvdGVtcGZpbGUucHkgYi9MaWIvdGVtcGZpbGUucHkKaW5kZXggYWQ2ODdiOS4uNjE0NjIzNSAxMDA2NDQKLS0tIGEvTGliL3RlbXBmaWxlLnB5CisrKyBiL0xpYi90ZW1wZmlsZS5weQpAQCAtNzk3LDcgKzc5Nyw2IEBACiAgICAgICAgIF9zaHV0aWwucm10cmVlKG5hbWUpCiAgICAgICAgIF93YXJuaW5ncy53YXJuKHdhcm5fbWVzc2FnZSwgUmVzb3VyY2VXYXJuaW5nKQogCi0KICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAiPHt9IHshcn0+Ii5mb3JtYXQoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX19tYWluX18ucHkgYi9MaWIvdGVzdC9fX21haW5fXy5weQppbmRleCBkNWZiZTE1Li4xOWE2YjJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fX21haW5fXy5weQorKysgYi9MaWIvdGVzdC9fX21haW5fXy5weQpAQCAtMSwzICsxLDIgQEAKLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLQotcmVncnRlc3QubWFpbl9pbl90ZW1wX2N3ZCgpCitmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KK21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CmluZGV4IDExYTYzMTAuLjE2NDA3ZGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQorKysgYi9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTE2NjgsNiArMTY2OCwxMCBAQAogZGVmIG11bCh4LCB5KToKICAgICByZXR1cm4geCp5CiAKK2RlZiByYWlzZV9sYXJnZV92YWx1ZXJyb3Iod2FpdCk6CisgICAgdGltZS5zbGVlcCh3YWl0KQorICAgIHJhaXNlIFZhbHVlRXJyb3IoIngiICogMTAyNCoqMikKKwogY2xhc3MgU2F5V2hlbkVycm9yKFZhbHVlRXJyb3IpOiBwYXNzCiAKIGRlZiBleGNlcHRpb25fdGhyb3dpbmdfZ2VuZXJhdG9yKHRvdGFsLCB3aGVuKToKQEAgLTE5MTAsNiArMTkxNCwyNiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgogICAgICAgICAgICAgICAgIHAuYXBwbHkoc2VsZi5fdGVzdF93cmFwcGVkX2V4Y2VwdGlvbikKIAorICAgIGRlZiB0ZXN0X21hcF9ub19mYWlsZmFzdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjM5OTI6IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3VyIHdoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZAorICAgICAgICAjIGR1cmluZyBtYXAoKSB3b3VsZCBtYWtlIFBvb2wuam9pbigpIGRlYWRsb2NrLCBiZWNhdXNlIGEgd29ya2VyCisgICAgICAgICMgcHJvY2VzcyB3b3VsZCBmaWxsIHRoZSByZXN1bHQgcXVldWUgKGFmdGVyIHRoZSByZXN1bHQgaGFuZGxlciB0aHJlYWQKKyAgICAgICAgIyB0ZXJtaW5hdGVkLCBoZW5jZSBub3QgZHJhaW5pbmcgaXQgYW55bW9yZSkuCisKKyAgICAgICAgdF9zdGFydCA9IHRpbWUudGltZSgpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5Qb29sKDIpIGFzIHA6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwLm1hcChyYWlzZV9sYXJnZV92YWx1ZXJyb3IsIFswLCAxXSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgICAgICAgICAgcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHAuam9pbigpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IHdlIGluZGVlZCB3YWl0ZWQgZm9yIGFsbCBqb2JzCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih0aW1lLnRpbWUoKSAtIHRfc3RhcnQsIDAuOSkKKwogCiBkZWYgcmFpc2luZygpOgogICAgIHJhaXNlIEtleUVycm9yKCJrZXkiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvYXVkaW90ZXN0cy5weSBiL0xpYi90ZXN0L2F1ZGlvdGVzdHMucHkKaW5kZXggMGFlMjI0Mi4uZDNlOGU5ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQorKysgYi9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5CkBAIC0xLDkgKzEsOCBAQAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBURVNURk4sIHVubGluawotaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgYXJyYXkKIGltcG9ydCBpbwogaW1wb3J0IHBpY2tsZQotaW1wb3J0IHN5cworCiAKIGNsYXNzIFVuc2Vla2FibGVJTyhpby5GaWxlSU8pOgogICAgIGRlZiB0ZWxsKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvYXV0b3Rlc3QucHkgYi9MaWIvdGVzdC9hdXRvdGVzdC5weQppbmRleCA0MWMyMDg4Li5mYTg1Y2MxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9hdXRvdGVzdC5weQorKysgYi9MaWIvdGVzdC9hdXRvdGVzdC5weQpAQCAtMSw2ICsxLDUgQEAKICMgVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBydW5uaW5nIHJlZ3J0ZXN0LnB5IGZyb20gdGhlIGNtZGxpbmUuCiAjIEl0IGNhbiBiZSBlc3BlY2lhbGx5IGhhbmR5IGlmIHlvdSdyZSBpbiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCwgZS5nLiwKICMgZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdC4KLQotZnJvbSB0ZXN0IGltcG9ydCByZWdydGVzdAotcmVncnRlc3QubWFpbigpCitmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KK21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoLzBlNDAxNWI5LjAgYi9MaWIvdGVzdC9jYXBhdGgvMGU0MDE1YjkuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkMjU5Yi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jYXBhdGgvMGU0MDE1YjkuMAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJQ2xUQ0NBZjZnQXdJQkFnSUpBS0dVOTV3S1I4cFRNQTBHQ1NxR1NJYjNEUUVCQlFVQU1IQXhDekFKQmdOVgotQkFZVEFsaFpNUmN3RlFZRFZRUUhEQTVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNnd2FVSGwwYUc5dQotSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEl6QWhCZ05WQkFNTUduTmxiR1l0YzJsbmJtVmtMbkI1ZEdodgotYm5SbGMzUXVibVYwTUI0WERURTBNVEV3TWpFNE1Ea3lPVm9YRFRJME1UQXpNREU0TURreU9Wb3djREVMTUFrRwotQTFVRUJoTUNXRmt4RnpBVkJnTlZCQWNNRGtOaGMzUnNaU0JCYm5Sb2NtRjRNU013SVFZRFZRUUtEQnBRZVhSbwotYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRWpNQ0VHQTFVRUF3d2FjMlZzWmkxemFXZHVaV1F1Y0hsMAotYUc5dWRHVnpkQzV1WlhRd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFORFhRWFc5dGp5WgotWHQwSXYydExMMStqaW5yNHdHZzM2aW9MRExGa01mKzJZMUdMMHYwQm5LWUc0TjFPS2xBVTE1TFhHZUdlcjh2bQotU3YveUl2bWRyRUx2aEFiYm8zdzRhOVRNWVFBNFhrSVZMZHZ1M212Tk9BZXQrOFBNSnhuMjZkYkRoRzgwOUFMdgotRUhZNTdsUXNCUzNHNTlSWnlCUFZxQXFtSW1XTkpuVnpBZ01CQUFHak56QTFNQ1VHQTFVZEVRUWVNQnlDR25ObAotYkdZdGMybG5ibVZrTG5CNWRHaHZiblJsYzNRdWJtVjBNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTgotQVFFRkJRQURnWUVBSXV6QWhnTW91SnBOZGYzVVJDSElpbmV5b1N0NldLLzkrZXlVY2psS09yRG9YTlphRDcyaAotVFhNZUtZb1d2SnlWY1NMS0w4Y2tQdERvYmdQMk9UdDBVa3lBYWowbitaSGFxcTFsSDJ5VmZHVUExSUxKdjUxNQotQzhCcWJ2Vlp1cW0zaTd5Z213M2JxRS9sWU1nT3JZdFhYbnFPcno2bnZzRTZZYzlWOXJGZmxPTT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC9iMTkzMDIxOC4wIGIvTGliL3Rlc3QvY2FwYXRoL2IxOTMwMjE4LjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NhcGF0aC9iMTkzMDIxOC4wCkBAIC0wLDAgKzEsMjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGJUQ0NBbFdnQXdJQkFnSUpBTENTWkxIeTJpSFFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FMHhDekFKQmdOVgorQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiaUJEUVRFVworTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQWVGdzB4TXpBeE1EUXhPVFEzTURkYUZ3MHlNekF4TURJeAorT1RRM01EZGFNRTB4Q3pBSkJnTlZCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZworUm05MWJtUmhkR2x2YmlCRFFURVdNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPZmU2ZU1NbndDMm9mMHJXNWJTYjh6Z3ZvYTVJRjdzQTNwVgorcStxazZmbEpoZEptMWUzSGV1cFdqaTJQNTBMaVlpaXBuOVlianV1MXRKeWZGS3ZmNXBTTGRoMCtiU1JoN1F5LworQUlwaEROOWN5RFp6RmdETlI3cHRwS1IwaUlNakNobjhDYWM4U2t2VDV4MHQ1T3BNVkNIekp0dUpOeGpVQXJ0QQorTWwray95MGM5OVM3N0k3UFhJS3M1bndJYkVpRllRZC9KZUJjNEx3MFgrQzVCRWQxeUVjTGpield5R2hmTTROaQorMGlCRU5iR3RnUnFLemJ3MXNGeUxSOVlZNlp3WWw4d0JQQ25NNkI3azVNRzQzdWZDRVJpSFdwTTAyS1lsOXhSeAorNitRaG90SVBMaTdVWWdBMTA5YnZYR0JMVEtrVTR0MFZXRVkzTXlhMzV5NWQ3VUxreFUwQ0F3RUFBYU5RTUU0dworSFFZRFZSME9CQllFRkx6ZFl0bDIyaHZTVkd2UDRHYWJIaDU3Vmd3TE1COEdBMVVkSXdRWU1CYUFGTHpkWXRsMgorMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgorQUgwSzljdU4wMTI5bVk3NEt3KzY2OExacGlkUExuc3ZEbVRZSERWUVR1NzhrTG1OYmFqRnhnYXdyL010dnp1NAorUWdmZEdIMXRsVlJYaFJoZ1J5L3JlQnY1NkJmOVdnMkhGeWlzVEdybXZDbjA5RlZ3S1VMZWhlcXJiQ01HWkRCMQorQW81VHZGNEJNemZNSHMyNHBQM0s1RjlsTzRNY2h2RlZBcUE2ajl1UnQwQVV0T2VOMHU1enV1UGxOQzI4bEc5TworSkFiM1g0c09wNDVyM2w1MTlES2FVTEZFTTVyUUJlSjRndi9iMm9wajY2bmQwYitnWWEzam5vb2tYV0lPNTB5UgorZisvZk5EWTdMMTMxaExJdnhHMlRsaHB2TUNqeDJoS2FaTFJBTXgyOTNpdFRxT3ErMXJ4T2x2VkUreklZcnRVZgorOW1tdnRrNTdIVmpzTzZsVG8xNVl5SjQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvY2U3Yjg2NDMuMCBiL0xpYi90ZXN0L2NhcGF0aC9jZTdiODY0My4wCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmQyNTliLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NhcGF0aC9jZTdiODY0My4wCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCi1NSUlDbFRDQ0FmNmdBd0lCQWdJSkFLR1U5NXdLUjhwVE1BMEdDU3FHU0liM0RRRUJCUVVBTUhBeEN6QUpCZ05WCi1CQVlUQWxoWk1SY3dGUVlEVlFRSERBNURZWE4wYkdVZ1FXNTBhSEpoZURFak1DRUdBMVVFQ2d3YVVIbDBhRzl1Ci1JRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4SXpBaEJnTlZCQU1NR25ObGJHWXRjMmxuYm1Wa0xuQjVkR2h2Ci1iblJsYzNRdWJtVjBNQjRYRFRFME1URXdNakU0TURreU9Wb1hEVEkwTVRBek1ERTRNRGt5T1Zvd2NERUxNQWtHCi1BMVVFQmhNQ1dGa3hGekFWQmdOVkJBY01Ea05oYzNSc1pTQkJiblJvY21GNE1TTXdJUVlEVlFRS0RCcFFlWFJvCi1iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmpFak1DRUdBMVVFQXd3YWMyVnNaaTF6YVdkdVpXUXVjSGwwCi1hRzl1ZEdWemRDNXVaWFF3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU5EWFFYVzl0anlaCi1YdDBJdjJ0TEwxK2ppbnI0d0dnMzZpb0xETEZrTWYrMlkxR0wwdjBCbktZRzROMU9LbEFVMTVMWEdlR2VyOHZtCi1Tdi95SXZtZHJFTHZoQWJibzN3NGE5VE1ZUUE0WGtJVkxkdnUzbXZOT0FldCs4UE1KeG4yNmRiRGhHODA5QUx2Ci1FSFk1N2xRc0JTM0c1OVJaeUJQVnFBcW1JbVdOSm5WekFnTUJBQUdqTnpBMU1DVUdBMVVkRVFRZU1CeUNHbk5sCi1iR1l0YzJsbmJtVmtMbkI1ZEdodmJuUmxjM1F1Ym1WME1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOCi1BUUVGQlFBRGdZRUFJdXpBaGdNb3VKcE5kZjNVUkNISWluZXlvU3Q2V0svOStleVVjamxLT3JEb1hOWmFENzJoCi1UWE1lS1lvV3ZKeVZjU0xLTDhja1B0RG9iZ1AyT1R0MFVreUFhajBuK1pIYXFxMWxIMnlWZkdVQTFJTEp2NTE1Ci1DOEJxYnZWWnVxbTNpN3lnbXczYnFFL2xZTWdPcll0WFhucU9yejZudnNFNlljOVY5ckZmbE9NPQotLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoL2NlZmYxNzEwLjAgYi9MaWIvdGVzdC9jYXBhdGgvY2VmZjE3MTAuMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzMzNDljCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY2FwYXRoL2NlZmYxNzEwLjAKQEAgLTAsMCArMSwyMSBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlEYlRDQ0FsV2dBd0lCQWdJSkFMQ1NaTEh5MmlIUU1BMEdDU3FHU0liM0RRRUJCUVVBTUUweEN6QUpCZ05WCitCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJpQkRRVEVXCitNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pBZUZ3MHhNekF4TURReE9UUTNNRGRhRncweU16QXhNREl4CitPVFEzTURkYU1FMHhDekFKQmdOVkJBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnCitSbTkxYm1SaGRHbHZiaUJEUVRFV01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakNDQVNJd0RRWUpLb1pJCitodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9mZTZlTU1ud0Myb2Ywclc1YlNiOHpndm9hNUlGN3NBM3BWCitxK3FrNmZsSmhkSm0xZTNIZXVwV2ppMlA1MExpWWlpcG45WWJqdXUxdEp5ZkZLdmY1cFNMZGgwK2JTUmg3UXkvCitBSXBoRE45Y3lEWnpGZ0ROUjdwdHBLUjBpSU1qQ2huOENhYzhTa3ZUNXgwdDVPcE1WQ0h6SnR1Sk54alVBcnRBCitNbCtrL3kwYzk5Uzc3STdQWElLczVud0liRWlGWVFkL0plQmM0THcwWCtDNUJFZDF5RWNMamJ6V3lHaGZNNE5pCiswaUJFTmJHdGdScUt6Yncxc0Z5TFI5WVk2WndZbDh3QlBDbk02QjdrNU1HNDN1ZkNFUmlIV3BNMDJLWWw5eFJ4Cis2K1Fob3RJUExpN1VZZ0ExMDlidlhHQkxUS2tVNHQwVldFWTNNeWEzNXk1ZDdVTGt4VTBDQXdFQUFhTlFNRTR3CitIUVlEVlIwT0JCWUVGTHpkWXRsMjJodlNWR3ZQNEdhYkhoNTdWZ3dMTUI4R0ExVWRJd1FZTUJhQUZMemRZdGwyCisyaHZTVkd2UDRHYWJIaDU3Vmd3TE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCCitBSDBLOWN1TjAxMjltWTc0S3crNjY4TFpwaWRQTG5zdkRtVFlIRFZRVHU3OGtMbU5iYWpGeGdhd3IvTXR2enU0CitRZ2ZkR0gxdGxWUlhoUmhnUnkvcmVCdjU2QmY5V2cySEZ5aXNUR3JtdkNuMDlGVndLVUxlaGVxcmJDTUdaREIxCitBbzVUdkY0Qk16Zk1IczI0cFAzSzVGOWxPNE1jaHZGVkFxQTZqOXVSdDBBVXRPZU4wdTV6dXVQbE5DMjhsRzlPCitKQWIzWDRzT3A0NXIzbDUxOURLYVVMRkVNNXJRQmVKNGd2L2Iyb3BqNjZuZDBiK2dZYTNqbm9va1hXSU81MHlSCitmKy9mTkRZN0wxMzFoTEl2eEcyVGxocHZNQ2p4MmhLYVpMUkFNeDI5M2l0VHFPcSsxcnhPbHZWRSt6SVlydFVmCis5bW12dGs1N0hWanNPNmxUbzE1WXlKND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5IGIvTGliL3Rlc3QvZGF0ZXRpbWV0ZXN0ZXIucHkKaW5kZXggZjUyMjJjNy4uOGZjMDEzOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvZGF0ZXRpbWV0ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvZGF0ZXRpbWV0ZXN0ZXIucHkKQEAgLTI4NCw3ICsyODQsOCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6IHNlbGYuRVNULmRzdCg1KQogCiAgICAgZGVmIHRlc3RfdHpuYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMrMDA6MDAnLCB0aW1lem9uZShaRVJPKS50em5hbWUoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQycsIHRpbWV6b25lLnV0Yy50em5hbWUoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQycsIHRpbWV6b25lKFpFUk8pLnR6bmFtZShOb25lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDLTA1OjAwJywgdGltZXpvbmUoLTUgKiBIT1VSKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQyswOTozMCcsIHRpbWV6b25lKDkuNSAqIEhPVVIpLnR6bmFtZShOb25lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDLTAwOjAxJywgdGltZXpvbmUodGltZWRlbHRhKG1pbnV0ZXM9LTEpKS50em5hbWUoTm9uZSkpCkBAIC0xNTU4LDEzICsxNTU5LDMyIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBkdDIpCiAKICAgICBkZWYgdGVzdF9pc29mb3JtYXQoc2VsZik6Ci0gICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDIsIDQsIDUsIDEsIDEyMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAgICAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdUJyksICIwMDAyLTAzLTAyVDA0OjA1OjAxLjAwMDEyMyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJyAnKSwgIjAwMDItMDMtMDIgMDQ6MDU6MDEuMDAwMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnXHgwMCcpLCAiMDAwMi0wMy0wMlx4MDAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAxLTAyLTAzIDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDEtMDItMDNceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0naG91cnMnKSwgIjAwMDEtMDItMDNUMDQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJyksICIwMDAxLTAyLTAzVDA0OjA1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHNlcD0nICcsIHRpbWVzcGVjPSdtaW51dGVzJyksICIwMDAxLTAyLTAzIDA0OjA1IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5pc29mb3JtYXQsIHRpbWVzcGVjPSdmb28nKQogICAgICAgICAjIHN0ciBpcyBJU08gZm9ybWF0IHdpdGggdGhlIHNlcGFyYXRvciBmb3JjZWQgdG8gYSBibGFuay4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMS0wMi0wMyAwNDowNTowMS4wMDAxMjMiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDEsIDk5OTUwMCwgdHppbmZvPXRpbWV6b25lLnV0YykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjk5OSswMDowMCIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSwgOTk5NTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuOTk5IikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAwMDAiKQogCiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDA6MDA6MDAiKQpAQCAtMjMyNCw2ICsyMzQ0LDIzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgIjAwOjAwOjAwLjEwMDAwMCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgc3RyKHQpKQogCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0xMjM0NTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2hvdXJzJyksICIxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbnV0ZXMnKSwgIjEyOjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nc2Vjb25kcycpLCAiMTI6MzQ6NTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjEyOjM0OjU2LjEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpLCAiMTI6MzQ6NTYuMTIzNDU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMTI6MzQ6NTYuMTIzNDU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5pc29mb3JtYXQsIHRpbWVzcGVjPSdtb25rZXknKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD05OTk1MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMTI6MzQ6NTYuOTk5IikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIxMjozNDo1Ni4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjEyOjM0OjU2LjAwMDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjEyOjM0OjU2IikKKwogICAgIGRlZiB0ZXN0XzE2NTM3MzYoc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IGl0IGRvZXNuJ3QgYWNjZXB0IGV4dHJhIGtleXdvcmQgYXJndW1lbnRzCiAgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKHNlY29uZD0xKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weSBiL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKaW5kZXggOTkzMWE1NS4uZmZjZGI5OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQorKysgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CkBAIC05LDcgKzksNyBAQAogIiIiCiAKIGltcG9ydCBjb250ZXh0bGliCi1pbXBvcnQgaW8KK2ltcG9ydCBmYXVsdGhhbmRsZXIKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNpZ25hbApAQCAtNTAsNiArNTAsMTAgQEAKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIGNscy5zaWduYWxfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnNpZ25hbF9wZXJpb2QpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjUyNzc6IFVzZSBmYXVsdGhhbmRsZXIgdG8gdHJ5IHRvIGRlYnVnIGEgaGFuZyBvbiBGcmVlQlNECisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKToKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigxMCAqIDYwLCBleGl0PVRydWUpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc3RvcF9hbGFybShjbHMpOgogICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNpZ25hbC5JVElNRVJfUkVBTCwgMCwgMCkKQEAgLTU4LDYgKzYyLDggQEAKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgogICAgICAgICBjbHMuc3RvcF9hbGFybSgpCiAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGNscy5vcmlnX2hhbmRsZXIpCisgICAgICAgIGlmIGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKIAogICAgIGRlZiBzdWJwcm9jZXNzKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICAgY21kX2FyZ3MgPSAoc3lzLmV4ZWN1dGFibGUsICctYycpICsgYXJncwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmEwZTZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSw1IEBACisjIFdlIGltcG9ydCBpbXBvcnRsaWIgKkFTQVAqIGluIG9yZGVyIHRvIHRlc3QgIzE1Mzg2CitpbXBvcnQgaW1wb3J0bGliCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5jbWRsaW5lIGltcG9ydCBfcGFyc2VfYXJncywgUkVTT1VSQ0VfTkFNRVMKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5tYWluIGltcG9ydCBtYWluCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9jbWRsaW5lLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA5YTAxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weQpAQCAtMCwwICsxLDM0MiBAQAoraW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK1VTQUdFID0gIiIiXAorcHl0aG9uIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCitweXRob24gcGF0aC90by9MaWIvdGVzdC9yZWdydGVzdC5weSBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KKyIiIgorCitERVNDUklQVElPTiA9ICIiIlwKK1J1biBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy4KKworSWYgbm8gYXJndW1lbnRzIG9yIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBmaW5kcyBhbGwgZmlsZXMgbWF0Y2hpbmcKK3RoZSBwYXR0ZXJuICJ0ZXN0XyoiIGluIHRoZSBMaWIvdGVzdCBzdWJkaXJlY3RvcnkgYW5kIHJ1bnMKK3RoZW0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyIChidXQgc2VlIC1NIGFuZCAtdSwgYmVsb3csIGZvciBleGNlcHRpb25zKS4KKworRm9yIG1vcmUgcmlnb3JvdXMgdGVzdGluZywgaXQgaXMgdXNlZnVsIHRvIHVzZSB0aGUgZm9sbG93aW5nCitjb21tYW5kIGxpbmU6CisKK3B5dGhvbiAtRSAtV2QgLW0gdGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgLi4uXQorIiIiCisKK0VQSUxPRyA9ICIiIlwKK0FkZGl0aW9uYWwgb3B0aW9uIGRldGFpbHM6CisKKy1yIHJhbmRvbWl6ZXMgdGVzdCBleGVjdXRpb24gb3JkZXIuIFlvdSBjYW4gdXNlIC0tcmFuZHNlZWQ9aW50IHRvIHByb3ZpZGUgYW4KK2ludCBzZWVkIHZhbHVlIGZvciB0aGUgcmFuZG9taXplcjsgdGhpcyBpcyB1c2VmdWwgZm9yIHJlcHJvZHVjaW5nIHRyb3VibGVzb21lCit0ZXN0IG9yZGVycy4KKworLXMgT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcmVncnRlc3QgdXNpbmcgLXMsIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZm91bmQKK29yIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBpcyBydW4sIGFuZCB0aGUgbmFtZSBvZgordGhlIG5leHQgdGVzdCBpcyByZWNvcmRlZCBpbiBhIGZpbGUgbmFtZWQgcHluZXh0dGVzdC4gIElmIHJ1biBmcm9tIHRoZQorUHl0aG9uIGJ1aWxkIGRpcmVjdG9yeSwgcHluZXh0dGVzdCBpcyBsb2NhdGVkIGluIHRoZSAnYnVpbGQnIHN1YmRpcmVjdG9yeSwKK290aGVyd2lzZSBpdCBpcyBsb2NhdGVkIGluIHRlbXBmaWxlLmdldHRlbXBkaXIoKS4gIE9uIHN1YnNlcXVlbnQgcnVucywKK3RoZSB0ZXN0IGluIHB5bmV4dHRlc3QgaXMgcnVuLCBhbmQgdGhlIG5leHQgdGVzdCBpcyB3cml0dGVuIHRvIHB5bmV4dHRlc3QuCitXaGVuIHRoZSBsYXN0IHRlc3QgaGFzIGJlZW4gcnVuLCBweW5leHR0ZXN0IGlzIGRlbGV0ZWQuICBJbiB0aGlzIHdheSBpdAoraXMgcG9zc2libGUgdG8gc2luZ2xlIHN0ZXAgdGhyb3VnaCB0aGUgdGVzdCBmaWxlcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4KK2RvaW5nIG1lbW9yeSBhbmFseXNpcyBvbiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3aGljaCBwcm9jZXNzIHRlbmRzIHRvCitjb25zdW1lIHRvbyBtYW55IHJlc291cmNlcyB0byBydW4gdGhlIGZ1bGwgcmVncmVzc2lvbiB0ZXN0IG5vbi1zdG9wLgorCistUyBpcyB1c2VkIHRvIGNvbnRpbnVlIHJ1bm5pbmcgdGVzdHMgYWZ0ZXIgYW4gYWJvcnRlZCBydW4uICBJdCB3aWxsCittYWludGFpbiB0aGUgb3JkZXIgYSBzdGFuZGFyZCBydW4gKGllLCB0aGlzIGFzc3VtZXMgLXIgaXMgbm90IHVzZWQpLgorVGhpcyBpcyB1c2VmdWwgYWZ0ZXIgdGhlIHRlc3RzIGhhdmUgcHJlbWF0dXJlbHkgc3RvcHBlZCBmb3Igc29tZSBleHRlcm5hbAorcmVhc29uIGFuZCB5b3Ugd2FudCB0byBzdGFydCBydW5uaW5nIGZyb20gd2hlcmUgeW91IGxlZnQgb2ZmIHJhdGhlcgordGhhbiBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuCisKKy1mIHJlYWRzIHRoZSBuYW1lcyBvZiB0ZXN0cyBmcm9tIHRoZSBmaWxlIGdpdmVuIGFzIGYncyBhcmd1bWVudCwgb25lCitvciBtb3JlIHRlc3QgbmFtZXMgcGVyIGxpbmUuICBXaGl0ZXNwYWNlIGlzIGlnbm9yZWQuICBCbGFuayBsaW5lcyBhbmQKK2xpbmVzIGJlZ2lubmluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yCit3aGl0dGxpbmcgZG93biBmYWlsdXJlcyBpbnZvbHZpbmcgaW50ZXJhY3Rpb25zIGFtb25nIHRlc3RzLgorCistTCBjYXVzZXMgdGhlIGxlYWtzKDEpIGNvbW1hbmQgdG8gYmUgcnVuIGp1c3QgYmVmb3JlIGV4aXQgaWYgaXQgZXhpc3RzLgorbGVha3MoMSkgaXMgYXZhaWxhYmxlIG9uIE1hYyBPUyBYIGFuZCBwcmVzdW1hYmx5IG9uIHNvbWUgb3RoZXIKK0ZyZWVCU0QtZGVyaXZlZCBzeXN0ZW1zLgorCistUiBydW5zIGVhY2ggdGVzdCBzZXZlcmFsIHRpbWVzIGFuZCBleGFtaW5lcyBzeXMuZ2V0dG90YWxyZWZjb3VudCgpIHRvCitzZWUgaWYgdGhlIHRlc3QgYXBwZWFycyB0byBiZSBsZWFraW5nIHJlZmVyZW5jZXMuICBUaGUgYXJndW1lbnQgc2hvdWxkCitiZSBvZiB0aGUgZm9ybSBzdGFiOnJ1bjpmbmFtZSB3aGVyZSAnc3RhYicgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKK3Rlc3QgaXMgcnVuIHRvIGxldCBnZXR0b3RhbHJlZmNvdW50IHNldHRsZSBkb3duLCAncnVuJyBpcyB0aGUgbnVtYmVyCitvZiB0aW1lcyBmdXJ0aGVyIGl0IGlzIHJ1biBhbmQgJ2ZuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUKK3JlcG9ydHMgYXJlIHdyaXR0ZW4gdG8uICBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBoYXZlIGRlZmF1bHRzICg1LCA0IGFuZAorInJlZmxvZy50eHQiIHJlc3BlY3RpdmVseSksIGFuZCB0aGUgbWluaW1hbCBpbnZvY2F0aW9uIGlzICctUiA6Jy4KKworLU0gcnVucyB0ZXN0cyB0aGF0IHJlcXVpcmUgYW4gZXhvcmJpdGFudCBhbW91bnQgb2YgbWVtb3J5LiBUaGVzZSB0ZXN0cwordHlwaWNhbGx5IHRyeSB0byBhc2NlcnRhaW4gY29udGFpbmVycyBrZWVwIHdvcmtpbmcgd2hlbiBjb250YWluaW5nIG1vcmUgdGhhbgorMiBiaWxsaW9uIG9iamVjdHMsIHdoaWNoIG9ubHkgd29ya3Mgb24gNjQtYml0IHN5c3RlbXMuIFRoZXJlIGFyZSBhbHNvIHNvbWUKK3Rlc3RzIHRoYXQgdHJ5IHRvIGV4aGF1c3QgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHByb2Nlc3MsIHdoaWNoIG9ubHkgbWFrZXMKK3NlbnNlIG9uIDMyLWJpdCBzeXN0ZW1zIHdpdGggYXQgbGVhc3QgMkdiIG9mIG1lbW9yeS4gVGhlIHBhc3NlZC1pbiBtZW1saW1pdCwKK3doaWNoIGlzIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mICcyLjVHYicsIGRldGVybWluZXMgaG93bXVjaCBtZW1vcnkgdGhlCit0ZXN0cyB3aWxsIGxpbWl0IHRoZW1zZWx2ZXMgdG8gKGJ1dCB0aGV5IG1heSBnbyBzbGlnaHRseSBvdmVyLikgVGhlIG51bWJlcgorc2hvdWxkbid0IGJlIG1vcmUgbWVtb3J5IHRoYW4gdGhlIG1hY2hpbmUgaGFzIChpbmNsdWRpbmcgc3dhcCBtZW1vcnkpLiBZb3UKK3Nob3VsZCBhbHNvIGtlZXAgaW4gbWluZCB0aGF0IHN3YXAgbWVtb3J5IGlzIGdlbmVyYWxseSBtdWNoLCBtdWNoIHNsb3dlcgordGhhbiBSQU0sIGFuZCBzZXR0aW5nIG1lbWxpbWl0IHRvIGFsbCBhdmFpbGFibGUgUkFNIG9yIGhpZ2hlciB3aWxsIGhlYXZpbHkKK3RheCB0aGUgbWFjaGluZS4gT24gdGhlIG90aGVyIGhhbmQsIGl0IGlzIG5vIHVzZSBydW5uaW5nIHRoZXNlIHRlc3RzIHdpdGggYQorbGltaXQgb2YgbGVzcyB0aGFuIDIuNUdiLCBhbmQgbWFueSByZXF1aXJlIG1vcmUgdGhhbiAyMEdiLiBUZXN0cyB0aGF0IGV4cGVjdAordG8gdXNlIG1vcmUgdGhhbiBtZW1saW1pdCBtZW1vcnkgd2lsbCBiZSBza2lwcGVkLiBUaGUgYmlnLW1lbW9yeSB0ZXN0cworZ2VuZXJhbGx5IHJ1biB2ZXJ5LCB2ZXJ5IGxvbmcuCisKKy11IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyB0byBydW4sCitzdWNoIGFzIHRob3NlIHJlcXVpcmluZyBsYXJnZSBmaWxlIHN1cHBvcnQgb3IgbmV0d29yayBjb25uZWN0aXZpdHkuCitUaGUgYXJndW1lbnQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB3b3JkcyBpbmRpY2F0aW5nIHRoZQorcmVzb3VyY2VzIHRvIHRlc3QuICBDdXJyZW50bHkgb25seSB0aGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkOgorCisgICAgYWxsIC0gICAgICAgRW5hYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcy4KKworICAgIG5vbmUgLSAgICAgIERpc2FibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KKworICAgIGF1ZGlvIC0gICAgIFRlc3RzIHRoYXQgdXNlIHRoZSBhdWRpbyBkZXZpY2UuICAoVGhlcmUgYXJlIGtub3duCisgICAgICAgICAgICAgICAgY2FzZXMgb2YgYnJva2VuIGF1ZGlvIGRyaXZlcnMgdGhhdCBjYW4gY3Jhc2ggUHl0aG9uIG9yCisgICAgICAgICAgICAgICAgZXZlbiB0aGUgTGludXgga2VybmVsLikKKworICAgIGN1cnNlcyAtICAgIFRlc3RzIHRoYXQgdXNlIGN1cnNlcyBhbmQgd2lsbCBtb2RpZnkgdGhlIHRlcm1pbmFsJ3MKKyAgICAgICAgICAgICAgICBzdGF0ZSBhbmQgb3V0cHV0IG1vZGVzLgorCisgICAgbGFyZ2VmaWxlIC0gSXQgaXMgb2theSB0byBydW4gc29tZSB0ZXN0IHRoYXQgbWF5IGNyZWF0ZSBodWdlCisgICAgICAgICAgICAgICAgZmlsZXMuICBUaGVzZSB0ZXN0cyBjYW4gdGFrZSBhIGxvbmcgdGltZSBhbmQgbWF5CisgICAgICAgICAgICAgICAgY29uc3VtZSA+MkdCIG9mIGRpc2sgc3BhY2UgdGVtcG9yYXJpbHkuCisKKyAgICBuZXR3b3JrIC0gICBJdCBpcyBva2F5IHRvIHJ1biB0ZXN0cyB0aGF0IHVzZSBleHRlcm5hbCBuZXR3b3JrCisgICAgICAgICAgICAgICAgcmVzb3VyY2UsIGUuZy4gdGVzdGluZyBTU0wgc3VwcG9ydCBmb3Igc29ja2V0cy4KKworICAgIGRlY2ltYWwgLSAgIFRlc3QgdGhlIGRlY2ltYWwgbW9kdWxlIGFnYWluc3QgYSBsYXJnZSBzdWl0ZSB0aGF0CisgICAgICAgICAgICAgICAgdmVyaWZpZXMgY29tcGxpYW5jZSB3aXRoIHN0YW5kYXJkcy4KKworICAgIGNwdSAtICAgICAgIFVzZWQgZm9yIGNlcnRhaW4gQ1BVLWhlYXZ5IHRlc3RzLgorCisgICAgc3VicHJvY2VzcyAgUnVuIGFsbCB0ZXN0cyBmb3IgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLgorCisgICAgdXJsZmV0Y2ggLSAgSXQgaXMgb2theSB0byBkb3dubG9hZCBmaWxlcyByZXF1aXJlZCBvbiB0ZXN0aW5nLgorCisgICAgZ3VpIC0gICAgICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSBhIHJ1bm5pbmcgR1VJLgorCitUbyBlbmFibGUgYWxsIHJlc291cmNlcyBleGNlcHQgb25lLCB1c2UgJy11YWxsLC08cmVzb3VyY2U+Jy4gIEZvcgorZXhhbXBsZSwgdG8gcnVuIGFsbCB0aGUgdGVzdHMgZXhjZXB0IGZvciB0aGUgZ3VpIHRlc3RzLCBnaXZlIHRoZQorb3B0aW9uICctdWFsbCwtZ3VpJy4KKyIiIgorCisKK1JFU09VUkNFX05BTUVTID0gKCdhdWRpbycsICdjdXJzZXMnLCAnbGFyZ2VmaWxlJywgJ25ldHdvcmsnLAorICAgICAgICAgICAgICAgICAgJ2RlY2ltYWwnLCAnY3B1JywgJ3N1YnByb2Nlc3MnLCAndXJsZmV0Y2gnLCAnZ3VpJykKKworY2xhc3MgX0FyZ1BhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSArICJcblBhc3MgLWggb3IgLS1oZWxwIGZvciBjb21wbGV0ZSBoZWxwLiIpCisKKworZGVmIF9jcmVhdGVfcGFyc2VyKCk6CisgICAgIyBTZXQgcHJvZyB0byBwcmV2ZW50IHRoZSB1bmluZm9ybWF0aXZlICJfX21haW5fXy5weSIgZnJvbSBkaXNwbGF5aW5nIGluCisgICAgIyBlcnJvciBtZXNzYWdlcyB3aGVuIHVzaW5nICJweXRob24gLW0gdGVzdCAuLi4iLgorICAgIHBhcnNlciA9IF9BcmdQYXJzZXIocHJvZz0ncmVncnRlc3QucHknLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U9VVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1ERVNDUklQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwaWxvZz1FUElMT0csCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRfaGVscD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpCisKKyAgICAjIEFyZ3VtZW50cyB3aXRoIHRoaXMgY2xhdXNlIGFkZGVkIHRvIGl0cyBoZWxwIGFyZSBkZXNjcmliZWQgZnVydGhlciBpbgorICAgICMgdGhlIGVwaWxvZydzICJBZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzIiBzZWN0aW9uLgorICAgIG1vcmVfZGV0YWlscyA9ICcgIFNlZSB0aGUgc2VjdGlvbiBhdCBib3R0b20gZm9yIG1vcmUgZGV0YWlscy4nCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ0dlbmVyYWwgb3B0aW9ucycpCisgICAgIyBXZSBhZGQgaGVscCBleHBsaWNpdGx5IHRvIGNvbnRyb2wgd2hhdCBhcmd1bWVudCBncm91cCBpdCByZW5kZXJzIHVuZGVyLgorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWgnLCAnLS1oZWxwJywgYWN0aW9uPSdoZWxwJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXRpbWVvdXQnLCBtZXRhdmFyPSdUSU1FT1VUJywgdHlwZT1mbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2R1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9yZSB0aGFuIFRJTUVPVVQgc2Vjb25kczsgZGlzYWJsZWQgaWYgVElNRU9VVCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBuZWdhdGl2ZSBvciBlcXVhbHMgdG8gemVybycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXdhaXQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3YWl0IGZvciB1c2VyIGlucHV0LCBlLmcuLCBhbGxvdyBhIGRlYnVnZ2VyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gYmUgYXR0YWNoZWQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1zbGF2ZWFyZ3MnLCBtZXRhdmFyPSdBUkdTJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1TJywgJy0tc3RhcnQnLCBtZXRhdmFyPSdTVEFSVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3RoZSBuYW1lIG9mIHRoZSB0ZXN0IGF0IHdoaWNoIHRvIHN0YXJ0LicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnVmVyYm9zaXR5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy12JywgJy0tdmVyYm9zZScsIGFjdGlvbj0nY291bnQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGVzdHMgaW4gdmVyYm9zZSBtb2RlIHdpdGggb3V0cHV0IHRvIHN0ZG91dCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdycsICctLXZlcmJvc2UyJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmUtcnVuIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVcnLCAnLS12ZXJib3NlMycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2Rpc3BsYXkgdGVzdCBvdXRwdXQgb24gZmFpbHVyZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcScsICctLXF1aWV0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbm8gb3V0cHV0IHVubGVzcyBvbmUgb3IgbW9yZSB0ZXN0cyBmYWlsJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1vJywgJy0tc2xvdycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3ByaW50X3Nsb3cnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCB0aGUgc2xvd2VzdCAxMCB0ZXN0cycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLWhlYWRlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3ByaW50IGhlYWRlciB3aXRoIGludGVycHJldGVyIGluZm8nKQorCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdTZWxlY3RpbmcgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yYW5kb21pemUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyYW5kb21pemUgdGVzdCBleGVjdXRpb24gb3JkZXIuJyArIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tcmFuZHNlZWQnLCBtZXRhdmFyPSdTRUVEJywKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ncmFuZG9tX3NlZWQnLCB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncGFzcyBhIHJhbmRvbSBzZWVkIHRvIHJlcHJvZHVjZSBhIHByZXZpb3VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmFuZG9tIHJ1bicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctZicsICctLWZyb21maWxlJywgbWV0YXZhcj0nRklMRScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlYWQgbmFtZXMgb2YgdGVzdHMgdG8gcnVuIGZyb20gYSBmaWxlLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy14JywgJy0tZXhjbHVkZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2FyZ3VtZW50cyBhcmUgdGVzdHMgdG8gKmV4Y2x1ZGUqJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1zJywgJy0tc2luZ2xlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc2luZ2xlIHN0ZXAgdGhyb3VnaCBhIHNldCBvZiB0ZXN0cy4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbScsICctLW1hdGNoJywgbWV0YXZhcj0nUEFUJywKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nbWF0Y2hfdGVzdHMnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdtYXRjaCB0ZXN0IGNhc2VzIGFuZCBtZXRob2RzIHdpdGggZ2xvYiBwYXR0ZXJuIFBBVCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRycsICctLWZhaWxmYXN0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZmFpbCBhcyBzb29uIGFzIGEgdGVzdCBmYWlscyAob25seSB3aXRoIC12IG9yIC1XKScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdScsICctLXVzZScsIG1ldGF2YXI9J1JFUzEsUkVTMiwuLi4nLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsIHR5cGU9cmVzb3VyY2VzX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0byBydW4uJyArIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1NJywgJy0tbWVtbGltaXQnLCBtZXRhdmFyPSdMSU1JVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB2ZXJ5IGxhcmdlIG1lbW9yeS1jb25zdW1pbmcgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10ZXN0ZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZXhlY3V0ZSB0ZXN0IGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKGluc3RlYWQgb2YgdGhlIFB5dGhvbiBzdGRsaWIgdGVzdCBzdWl0ZSknKQorCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdTcGVjaWFsIHJ1bnMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWwnLCAnLS1maW5kbGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdpZiBHQyBpcyBhdmFpbGFibGUgZGV0ZWN0IHRlc3RzIHRoYXQgbGVhayBtZW1vcnknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUwnLCAnLS1ydW5sZWFrcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgbGVha3MoMSkgY29tbWFuZCBqdXN0IGJlZm9yZSBleGl0LicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1SJywgJy0taHVudHJsZWFrcycsIG1ldGF2YXI9J1JVTkNPVU5UUycsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9aHVudHJsZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc2VhcmNoIGZvciByZWZlcmVuY2UgbGVha3MgKG5lZWRzIGRlYnVnIGJ1aWxkLCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Zlcnkgc2xvdykuJyArIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1qJywgJy0tbXVsdGlwcm9jZXNzJywgbWV0YXZhcj0nUFJPQ0VTU0VTJywKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndXNlX21wJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biBQUk9DRVNTRVMgcHJvY2Vzc2VzIGF0IG9uY2UnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVQnLCAnLS1jb3ZlcmFnZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3RyYWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ndHVybiBvbiBjb2RlIGNvdmVyYWdlIHRyYWNpbmcgdXNpbmcgdGhlIHRyYWNlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbW9kdWxlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1EJywgJy0tY292ZXJkaXInLCBtZXRhdmFyPSdESVInLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXJlbGF0aXZlX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXJlY3Rvcnkgd2hlcmUgY292ZXJhZ2UgZmlsZXMgYXJlIHB1dCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTicsICctLW5vY292ZXJkaXInLAorICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9Tm9uZSwgZGVzdD0nY292ZXJkaXInLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwdXQgY292ZXJhZ2UgZmlsZXMgYWxvbmdzaWRlIG1vZHVsZXMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXQnLCAnLS10aHJlc2hvbGQnLCBtZXRhdmFyPSdUSFJFU0hPTEQnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nY2FsbCBnYy5zZXRfdGhyZXNob2xkKFRIUkVTSE9MRCknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW4nLCAnLS1ub3dpbmRvd3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzdXBwcmVzcyBlcnJvciBtZXNzYWdlIGJveGVzIG9uIFdpbmRvd3MnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUYnLCAnLS1mb3JldmVyJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRoZSBzcGVjaWZpZWQgdGVzdHMgaW4gYSBsb29wLCB1bnRpbCBhbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yIGhhcHBlbnMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1saXN0LXRlc3RzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ib25seSB3cml0ZSB0aGUgbmFtZSBvZiB0ZXN0cyB0aGF0IHdpbGwgYmUgcnVuLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvbid0IGV4ZWN1dGUgdGhlbSIpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUCcsICctLXBnbycsIGRlc3Q9J3BnbycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2VuYWJsZSBQcm9maWxlIEd1aWRlZCBPcHRpbWl6YXRpb24gdHJhaW5pbmcnKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYXJncycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpCisKKyAgICByZXR1cm4gcGFyc2VyCisKKworZGVmIHJlbGF0aXZlX2ZpbGVuYW1lKHN0cmluZyk6CisgICAgIyBDV0QgaXMgcmVwbGFjZWQgd2l0aCBhIHRlbXBvcmFyeSBkaXIgYmVmb3JlIGNhbGxpbmcgbWFpbigpLCBzbyB3ZQorICAgICMgam9pbiBpdCB3aXRoIHRoZSBzYXZlZCBDV0Qgc28gaXQgZW5kcyB1cCB3aGVyZSB0aGUgdXNlciBleHBlY3RzLgorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc3RyaW5nKQorCisKK2RlZiBodW50cmxlYWtzKHN0cmluZyk6CisgICAgYXJncyA9IHN0cmluZy5zcGxpdCgnOicpCisgICAgaWYgbGVuKGFyZ3MpIG5vdCBpbiAoMiwgMyk6CisgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKAorICAgICAgICAgICAgJ25lZWRzIDIgb3IgMyBjb2xvbi1zZXBhcmF0ZWQgYXJndW1lbnRzJykKKyAgICBud2FybXVwID0gaW50KGFyZ3NbMF0pIGlmIGFyZ3NbMF0gZWxzZSA1CisgICAgbnRyYWNrZWQgPSBpbnQoYXJnc1sxXSkgaWYgYXJnc1sxXSBlbHNlIDQKKyAgICBmbmFtZSA9IGFyZ3NbMl0gaWYgbGVuKGFyZ3MpID4gMiBhbmQgYXJnc1syXSBlbHNlICdyZWZsb2cudHh0JworICAgIHJldHVybiBud2FybXVwLCBudHJhY2tlZCwgZm5hbWUKKworCitkZWYgcmVzb3VyY2VzX2xpc3Qoc3RyaW5nKToKKyAgICB1ID0gW3gubG93ZXIoKSBmb3IgeCBpbiBzdHJpbmcuc3BsaXQoJywnKV0KKyAgICBmb3IgciBpbiB1OgorICAgICAgICBpZiByID09ICdhbGwnIG9yIHIgPT0gJ25vbmUnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgclswXSA9PSAnLSc6CisgICAgICAgICAgICByID0gclsxOl0KKyAgICAgICAgaWYgciBub3QgaW4gUkVTT1VSQ0VfTkFNRVM6CisgICAgICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcignaW52YWxpZCByZXNvdXJjZTogJyArIHIpCisgICAgcmV0dXJuIHUKKworCitkZWYgX3BhcnNlX2FyZ3MoYXJncywgKiprd2FyZ3MpOgorICAgICMgRGVmYXVsdHMKKyAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSh0ZXN0ZGlyPU5vbmUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsCisgICAgICAgICBleGNsdWRlPUZhbHNlLCBzaW5nbGU9RmFsc2UsIHJhbmRvbWl6ZT1GYWxzZSwgZnJvbWZpbGU9Tm9uZSwKKyAgICAgICAgIGZpbmRsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLCB0cmFjZT1GYWxzZSwgY292ZXJkaXI9J2NvdmVyYWdlJywKKyAgICAgICAgIHJ1bmxlYWtzPUZhbHNlLCBodW50cmxlYWtzPUZhbHNlLCB2ZXJib3NlMj1GYWxzZSwgcHJpbnRfc2xvdz1GYWxzZSwKKyAgICAgICAgIHJhbmRvbV9zZWVkPU5vbmUsIHVzZV9tcD1Ob25lLCB2ZXJib3NlMz1GYWxzZSwgZm9yZXZlcj1GYWxzZSwKKyAgICAgICAgIGhlYWRlcj1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsIHBnbz1GYWxzZSkKKyAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIobnMsIGspOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclciBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBmdW5jdGlvbicgJSBrKQorICAgICAgICBzZXRhdHRyKG5zLCBrLCB2KQorICAgIGlmIG5zLnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKKyAgICAgICAgbnMudXNlX3Jlc291cmNlcyA9IFtdCisKKyAgICBwYXJzZXIgPSBfY3JlYXRlX3BhcnNlcigpCisgICAgcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1hcmdzLCBuYW1lc3BhY2U9bnMpCisKKyAgICBpZiBucy5zaW5nbGUgYW5kIG5zLmZyb21maWxlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMudHJhY2U6CisgICAgICAgIHBhcnNlci5lcnJvcigiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCisgICAgaWYgbnMudXNlX21wIGFuZCBucy5maW5kbGVha3M6CisgICAgICAgIHBhcnNlci5lcnJvcigiLWwgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCisgICAgaWYgbnMuZmFpbGZhc3QgYW5kIG5vdCAobnMudmVyYm9zZSBvciBucy52ZXJib3NlMyk6CisgICAgICAgIHBhcnNlci5lcnJvcigiLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVciKQorICAgIGlmIG5zLnBnbyBhbmQgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTIgb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi0tcGdvLy12IGRvbid0IGdvIHRvZ2V0aGVyISIpCisKKyAgICBpZiBucy5ub3dpbmRvd3M6CisgICAgICAgIHByaW50KCJXYXJuaW5nOiB0aGUgLS1ub3dpbmRvd3MgKC1uKSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIgorICAgICAgICAgICAgICAiVXNlIC12diB0byBkaXNwbGF5IGFzc2VydGlvbnMgaW4gc3RkZXJyLiIsIGZpbGU9c3lzLnN0ZGVycikKKworICAgIGlmIG5zLnF1aWV0OgorICAgICAgICBucy52ZXJib3NlID0gMAorICAgIGlmIG5zLnRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIG5zLnRpbWVvdXQgPD0gMDoKKyAgICAgICAgICAgIG5zLnRpbWVvdXQgPSBOb25lCisgICAgaWYgbnMudXNlX21wIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy51c2VfbXAgPD0gMDoKKyAgICAgICAgICAgICMgVXNlIGFsbCBjb3JlcyArIGV4dHJhcyBmb3IgdGVzdHMgdGhhdCBsaWtlIHRvIHNsZWVwCisgICAgICAgICAgICBucy51c2VfbXAgPSAyICsgKG9zLmNwdV9jb3VudCgpIG9yIDEpCisgICAgaWYgbnMudXNlOgorICAgICAgICBmb3IgYSBpbiBucy51c2U6CisgICAgICAgICAgICBmb3IgciBpbiBhOgorICAgICAgICAgICAgICAgIGlmIHIgPT0gJ2FsbCc6CisgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXNbOl0gPSBSRVNPVVJDRV9OQU1FUworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHIgPT0gJ25vbmUnOgorICAgICAgICAgICAgICAgICAgICBkZWwgbnMudXNlX3Jlc291cmNlc1s6XQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlbW92ZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgclswXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgICAgICAgICAgaWYgcmVtb3ZlOgorICAgICAgICAgICAgICAgICAgICBpZiByIGluIG5zLnVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLnJlbW92ZShyKQorICAgICAgICAgICAgICAgIGVsaWYgciBub3QgaW4gbnMudXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5hcHBlbmQocikKKyAgICBpZiBucy5yYW5kb21fc2VlZCBpcyBub3QgTm9uZToKKyAgICAgICAgbnMucmFuZG9taXplID0gVHJ1ZQorCisgICAgcmV0dXJuIG5zCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9tYWluLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAzYzEzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvbWFpbi5weQpAQCAtMCwwICsxLDUwOCBAQAoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCAoCisgICAgZmluZHRlc3RzLCBydW50ZXN0LAorICAgIFNURFRFU1RTLCBOT1RURVNUUywgUEFTU0VELCBGQUlMRUQsIEVOVl9DSEFOR0VELCBTS0lQUEVELCBSRVNPVVJDRV9ERU5JRUQsCisgICAgSU5URVJSVVBURUQsIENISUxEX0VSUk9SLAorICAgIFBST0dSRVNTX01JTl9USU1FLCBmb3JtYXRfdGVzdF9yZXN1bHQpCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2V0dXAgaW1wb3J0IHNldHVwX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworCisjIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCisjIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCisjIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCitpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQorZWxzZToKKyAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCisKKworY2xhc3MgUmVncnRlc3Q6CisgICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCisKKyAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKKyAgICBhY2NvcmRpbmdseS4KKworICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCisgICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKKworICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KKyAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KKworICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQorICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQorICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCisgICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAorICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKKyAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncworICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIE5hbWVzcGFjZSBvZiBjb21tYW5kIGxpbmUgb3B0aW9ucworICAgICAgICBzZWxmLm5zID0gTm9uZQorCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBbXQorCisgICAgICAgICMgdGVzdCByZXN1bHRzCisgICAgICAgIHNlbGYuZ29vZCA9IFtdCisgICAgICAgIHNlbGYuYmFkID0gW10KKyAgICAgICAgc2VsZi5za2lwcGVkID0gW10KKyAgICAgICAgc2VsZi5yZXNvdXJjZV9kZW5pZWRzID0gW10KKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkID0gW10KKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tc2xvdworICAgICAgICBzZWxmLnRlc3RfdGltZXMgPSBbXQorCisgICAgICAgICMgdXNlZCBieSAtLWNvdmVyYWdlLCB0cmFjZS5UcmFjZSBpbnN0YW5jZQorICAgICAgICBzZWxmLnRyYWNlciA9IE5vbmUKKworICAgICAgICAjIHVzZWQgYnkgLS1maW5kbGVha3MsIHN0b3JlIGZvciBnYy5nYXJiYWdlCisgICAgICAgIHNlbGYuZm91bmRfZ2FyYmFnZSA9IFtdCisKKyAgICAgICAgIyB1c2VkIHRvIGRpc3BsYXkgdGhlIHByb2dyZXNzIGJhciAiWyAzLzEwMF0iCisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IHRpbWUubW9ub3RvbmljKCkKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gMQorCisgICAgICAgICMgdXNlZCBieSAtLXNpbmdsZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBOb25lCisgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6CisgICAgICAgICAgICBzZWxmLnRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBzZWxmLmdvb2QuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgorICAgICAgICAgICAgc2VsZi5iYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNlbGYuc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBzZWxmLnJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgdGltZV9kZWx0YShzZWxmLCBjZWlsPUZhbHNlKToKKyAgICAgICAgc2Vjb25kcyA9IHRpbWUubW9ub3RvbmljKCkgLSBzZWxmLnN0YXJ0X3RpbWUKKyAgICAgICAgaWYgY2VpbDoKKyAgICAgICAgICAgIHNlY29uZHMgPSBtYXRoLmNlaWwoc2Vjb25kcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY29uZHMgPSBpbnQoc2Vjb25kcykKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPXNlY29uZHMpCisKKyAgICBkZWYgZGlzcGxheV9wcm9ncmVzcyhzZWxmLCB0ZXN0X2luZGV4LCB0ZXN0KToKKyAgICAgICAgaWYgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmJhZCBhbmQgbm90IHNlbGYubnMucGdvOgorICAgICAgICAgICAgZm10ID0gInt0aW1lfSBbe3Rlc3RfaW5kZXg6e2NvdW50X3dpZHRofX17dGVzdF9jb3VudH0ve25iYWR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9ICJ7dGltZX0gW3t0ZXN0X2luZGV4Ontjb3VudF93aWR0aH19e3Rlc3RfY291bnR9XSB7dGVzdF9uYW1lfSIKKyAgICAgICAgbGluZSA9IGZtdC5mb3JtYXQoY291bnRfd2lkdGg9c2VsZi50ZXN0X2NvdW50X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZGV4PXRlc3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnQ9c2VsZi50ZXN0X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYmFkPWxlbihzZWxmLmJhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZT10ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lPXNlbGYudGltZV9kZWx0YSgpKQorICAgICAgICBwcmludChsaW5lLCBmbHVzaD1UcnVlKQorCisgICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwga3dhcmdzKToKKyAgICAgICAgbnMgPSBfcGFyc2VfYXJncyhzeXMuYXJndlsxOl0sICoqa3dhcmdzKQorCisgICAgICAgIGlmIG5zLnRpbWVvdXQgYW5kIG5vdCBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBwcmludCgiV2FybmluZzogVGhlIHRpbWVvdXQgb3B0aW9uIHJlcXVpcmVzICIKKyAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIiLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorCisgICAgICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZSBhbmQgZ2MgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGlnbm9yZSAtLXRocmVzaG9sZC4nLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBucy50aHJlc2hvbGQgPSBOb25lCisKKyAgICAgICAgaWYgbnMuZmluZGxlYWtzOgorICAgICAgICAgICAgaWYgZ2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gcmVwb3J0IGdhcmJhZ2UgdGhhdCBpcyBub3QKKyAgICAgICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQorICAgICAgICAgICAgICAgICMgZ2FyYmFnZSB0aGF0IGlzIG5vdCBjb2xsZWN0YWJsZSBieSB0aGUgR0MgaXMgcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIC0tZmluZGxlYWtzJywKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKKworICAgICAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgorICAgICAgICByZW1vdmVweShucy5hcmdzKQorCisgICAgICAgIHJldHVybiBucworCisgICAgZGVmIGZpbmRfdGVzdHMoc2VsZiwgdGVzdHMpOgorICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKKworICAgICAgICBpZiBzZWxmLm5zLnNpbmdsZToKKyAgICAgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgJ3B5bmV4dHRlc3QnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lLCAncicpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICBuZXh0X3Rlc3QgPSBmcC5yZWFkKCkuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RzID0gW25leHRfdGVzdF0KKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBzZWxmLm5zLmZyb21maWxlOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IFtdCisgICAgICAgICAgICAjIHJlZ2V4IHRvIG1hdGNoICd0ZXN0X2J1aWx0aW4nIGluIGxpbmU6CisgICAgICAgICAgICAjICcwOjAwOjAwIFsgIDQvNDAwXSB0ZXN0X2J1aWx0aW4gLS0gdGVzdF9kaWN0IHRvb2sgMSBzZWMnCisgICAgICAgICAgICByZWdleCA9IChyJ14oPzpbMC05XSs6WzAtOV0rOlswLTldKyAqKT8nCisgICAgICAgICAgICAgICAgICAgICByJyg/OlxbWzAtOS8gXStcXSAqKT8nCisgICAgICAgICAgICAgICAgICAgICByJyh0ZXN0X1thLXpBLVowLTlfXSspJykKKyAgICAgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyZWdleCkKKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc2VsZi5ucy5mcm9tZmlsZSkpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGZwOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0cy5hcHBlbmQobWF0Y2guZ3JvdXAoMSkpCisKKyAgICAgICAgcmVtb3ZlcHkoc2VsZi50ZXN0cykKKworICAgICAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCisgICAgICAgIG5vdHRlc3RzID0gTk9UVEVTVFMuY29weSgpCisgICAgICAgIGlmIHNlbGYubnMuZXhjbHVkZToKKyAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5ucy5hcmdzOgorICAgICAgICAgICAgICAgIGlmIGFyZyBpbiBzdGR0ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKKyAgICAgICAgICAgICAgICBub3R0ZXN0cy5hZGQoYXJnKQorICAgICAgICAgICAgc2VsZi5ucy5hcmdzID0gW10KKworICAgICAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbworICAgICAgICAjIGRvbid0IGFkZCBkZWZhdWx0IHRlc3RzIHRvIGJlIGV4ZWN1dGVkIG9yIHNraXBwZWQgKHBhc3MgZW1wdHkgdmFsdWVzKQorICAgICAgICBpZiBzZWxmLm5zLnRlc3RkaXI6CisgICAgICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhzZWxmLm5zLnRlc3RkaXIsIGxpc3QoKSwgc2V0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhzZWxmLm5zLnRlc3RkaXIsIHN0ZHRlc3RzLCBub3R0ZXN0cykKKworICAgICAgICBpZiBub3Qgc2VsZi5ucy5mcm9tZmlsZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBzZWxmLnRlc3RzIG9yIHNlbGYubnMuYXJncyBvciBhbGx0ZXN0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYudGVzdHMKKyAgICAgICAgaWYgc2VsZi5ucy5zaW5nbGU6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkID0gc2VsZi5zZWxlY3RlZFs6MV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwb3MgPSBhbGx0ZXN0cy5pbmRleChzZWxmLnNlbGVjdGVkWzBdKQorICAgICAgICAgICAgICAgIHNlbGYubmV4dF9zaW5nbGVfdGVzdCA9IGFsbHRlc3RzW3BvcyArIDFdCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBSZW1vdmUgYWxsIHRoZSBzZWxlY3RlZCB0ZXN0cyB0aGF0IHByZWNlZGUgc3RhcnQgaWYgaXQncyBzZXQuCisgICAgICAgIGlmIHNlbGYubnMuc3RhcnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuc2VsZWN0ZWRbOnNlbGYuc2VsZWN0ZWQuaW5kZXgoc2VsZi5ucy5zdGFydCldCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAlIHNlbGYubnMuc3RhcnQsIGZpbGU9c3lzLnN0ZGVycikKKworICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbWl6ZToKKyAgICAgICAgICAgIGlmIHNlbGYubnMucmFuZG9tX3NlZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLm5zLnJhbmRvbV9zZWVkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwMCkKKyAgICAgICAgICAgIHJhbmRvbS5zZWVkKHNlbGYubnMucmFuZG9tX3NlZWQpCisgICAgICAgICAgICByYW5kb20uc2h1ZmZsZShzZWxmLnNlbGVjdGVkKQorCisgICAgZGVmIGxpc3RfdGVzdHMoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuc2VsZWN0ZWQ6CisgICAgICAgICAgICBwcmludChuYW1lKQorCisgICAgZGVmIHJlcnVuX2ZhaWxlZF90ZXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICBzZWxmLm5zLmZhaWxmYXN0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5ucy52ZXJib3NlMyA9IEZhbHNlCisgICAgICAgIHNlbGYubnMubWF0Y2hfdGVzdHMgPSBOb25lCisKKyAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZSIpCisgICAgICAgIGZvciB0ZXN0IGluIHNlbGYuYmFkWzpdOgorICAgICAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgdGVzdCAlciBpbiB2ZXJib3NlIG1vZGUiICUgdGVzdCwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm5zLnZlcmJvc2UgPSBUcnVlCisgICAgICAgICAgICAgICAgb2sgPSBydW50ZXN0KHNlbGYubnMsIHRlc3QpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFkLnJlbW92ZSh0ZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQorICAgICAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgIGRlZiBkaXNwbGF5X3Jlc3VsdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIGFmdGVyIF5DCisgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCisgICAgICAgICAgICBleGVjdXRlZCA9IHNldChzZWxmLmdvb2QpIHwgc2V0KHNlbGYuYmFkKSB8IHNldChzZWxmLnNraXBwZWQpCisgICAgICAgICAgICBvbWl0dGVkID0gc2V0KHNlbGYuc2VsZWN0ZWQpIC0gZXhlY3V0ZWQKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihvbWl0dGVkKSwgInRlc3QiKSwgIm9taXR0ZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChvbWl0dGVkKQorCisgICAgICAgICMgSWYgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgUEdPIHRoZW4gbm8gb25lIGNhcmVzIGFib3V0CisgICAgICAgICMgcmVzdWx0cy4KKyAgICAgICAgaWYgc2VsZi5ucy5wZ286CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLmdvb2QgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgaWYgKG5vdCBzZWxmLmJhZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5za2lwcGVkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmludGVycnVwdGVkCisgICAgICAgICAgICAgICAgYW5kIGxlbihzZWxmLmdvb2QpID4gMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIkFsbCIsIGVuZD0nICcpCisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5nb29kKSwgInRlc3QiKSwgIk9LLiIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5wcmludF9zbG93OgorICAgICAgICAgICAgc2VsZi50ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICAgICAgcHJpbnQoIjEwIHNsb3dlc3QgdGVzdHM6IikKKyAgICAgICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHNlbGYudGVzdF90aW1lc1s6MTBdOgorICAgICAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQorCisgICAgICAgIGlmIHNlbGYuYmFkOgorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuYmFkKSwgInRlc3QiKSwgImZhaWxlZDoiKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuYmFkKQorCisgICAgICAgIGlmIHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZDoKKyAgICAgICAgICAgIHByaW50KCJ7fSBhbHRlcmVkIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQ6Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICBjb3VudChsZW4oc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkKSwgInRlc3QiKSkpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkKQorCisgICAgICAgIGlmIHNlbGYuc2tpcHBlZCBhbmQgbm90IHNlbGYubnMucXVpZXQ6CisgICAgICAgICAgICBwcmludChjb3VudChsZW4oc2VsZi5za2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLnNraXBwZWQpCisKKyAgICBkZWYgcnVuX3Rlc3RzX3NlcXVlbnRpYWwoc2VsZik6CisgICAgICAgIGlmIHNlbGYubnMudHJhY2U6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2UKKyAgICAgICAgICAgIHNlbGYudHJhY2VyID0gdHJhY2UuVHJhY2UodHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCisKKyAgICAgICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCisKKyAgICAgICAgcHJpbnQoIlJ1biB0ZXN0cyBzZXF1ZW50aWFsbHkiKQorCisgICAgICAgIHByZXZpb3VzX3Rlc3QgPSBOb25lCisgICAgICAgIGZvciB0ZXN0X2luZGV4LCB0ZXN0IGluIGVudW1lcmF0ZShzZWxmLnRlc3RzLCAxKToKKyAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLm1vbm90b25pYygpCisKKyAgICAgICAgICAgIHRleHQgPSB0ZXN0CisgICAgICAgICAgICBpZiBwcmV2aW91c190ZXN0OgorICAgICAgICAgICAgICAgIHRleHQgPSAnJXMgLS0gJXMnICUgKHRleHQsIHByZXZpb3VzX3Rlc3QpCisgICAgICAgICAgICBzZWxmLmRpc3BsYXlfcHJvZ3Jlc3ModGVzdF9pbmRleCwgdGV4dCkKKworICAgICAgICAgICAgaWYgc2VsZi50cmFjZXI6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSB0cmFjaW5nIGNvZGUgY292ZXJhZ2UsIHRoZW4gd2UgZG9uJ3QgZXhpdCB3aXRoIHN0YXR1cworICAgICAgICAgICAgICAgICMgaWYgb24gYSBmYWxzZSByZXR1cm4gdmFsdWUgZnJvbSBtYWluLgorICAgICAgICAgICAgICAgIGNtZCA9ICgncmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KTsgJworICAgICAgICAgICAgICAgICAgICAgICAnc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpJykKKyAgICAgICAgICAgICAgICBucyA9IGRpY3QobG9jYWxzKCkpCisgICAgICAgICAgICAgICAgc2VsZi50cmFjZXIucnVuY3R4KGNtZCwgZ2xvYmFscz1nbG9iYWxzKCksIGxvY2Fscz1ucykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuc1sncmVzdWx0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KHNlbGYubnMsIHRlc3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIChJTlRFUlJVUFRFRCwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCisKKyAgICAgICAgICAgIHByZXZpb3VzX3Rlc3QgPSBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdCwgcmVzdWx0WzBdKQorICAgICAgICAgICAgdGVzdF90aW1lID0gdGltZS5tb25vdG9uaWMoKSAtIHN0YXJ0X3RpbWUKKyAgICAgICAgICAgIGlmIHRlc3RfdGltZSA+PSBQUk9HUkVTU19NSU5fVElNRToKKyAgICAgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gIiVzIGluICUuMGYgc2VjIiAlIChwcmV2aW91c190ZXN0LCB0ZXN0X3RpbWUpCisgICAgICAgICAgICBlbGlmIHJlc3VsdFswXSA9PSBQQVNTRUQ6CisgICAgICAgICAgICAgICAgIyBiZSBxdWlldDogc2F5IG5vdGhpbmcgaWYgdGhlIHRlc3QgcGFzc2VkIHNob3J0bHkKKyAgICAgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLm5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgorICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQorICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKKyAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQorICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZF9nYXJiYWdlLmV4dGVuZChnYy5nYXJiYWdlKQorICAgICAgICAgICAgICAgICAgICBkZWwgZ2MuZ2FyYmFnZVs6XQorCisgICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQorICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnVubG9hZChtb2R1bGUpCisKKyAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgIHByaW50KHByZXZpb3VzX3Rlc3QpCisKKyAgICBkZWYgX3Rlc3RfZm9yZXZlcihzZWxmLCB0ZXN0cyk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5iYWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKKyAgICAgICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgorICAgICAgICBpZiAoc2VsZi5ucy52ZXJib3NlCisgICAgICAgICAgICBvciBzZWxmLm5zLmhlYWRlcgorICAgICAgICAgICAgb3Igbm90IChzZWxmLm5zLnBnbyBvciBzZWxmLm5zLnF1aWV0IG9yIHNlbGYubnMuc2luZ2xlCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYudGVzdHMgb3Igc2VsZi5ucy5hcmdzKSk6CisgICAgICAgICAgICAjIFByaW50IGJhc2ljIHBsYXRmb3JtIGluZm9ybWF0aW9uCisgICAgICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCisgICAgICAgICAgICBwcmludCgiPT0gICIsIHBsYXRmb3JtLnBsYXRmb3JtKGFsaWFzZWQ9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgImhhc2ggYWxnb3JpdGhtOiIsIHN5cy5oYXNoX2luZm8uYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKKyAgICAgICAgICAgIHByaW50KCI9PSAgIiwgb3MuZ2V0Y3dkKCkpCisgICAgICAgICAgICBwcmludCgiVGVzdGluZyB3aXRoIGZsYWdzOiIsIHN5cy5mbGFncykKKworICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbWl6ZToKKyAgICAgICAgICAgIHByaW50KCJVc2luZyByYW5kb20gc2VlZCIsIHNlbGYubnMucmFuZG9tX3NlZWQpCisKKyAgICAgICAgaWYgc2VsZi5ucy5mb3JldmVyOgorICAgICAgICAgICAgc2VsZi50ZXN0cyA9IHNlbGYuX3Rlc3RfZm9yZXZlcihsaXN0KHNlbGYuc2VsZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJycKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudF93aWR0aCA9IDMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBpdGVyKHNlbGYuc2VsZWN0ZWQpCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnQgPSAnL3t9Jy5mb3JtYXQobGVuKHNlbGYuc2VsZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50X3dpZHRoID0gbGVuKHNlbGYudGVzdF9jb3VudCkgLSAxCisKKyAgICAgICAgaWYgc2VsZi5ucy51c2VfbXA6CisgICAgICAgICAgICBmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdF9tcCBpbXBvcnQgcnVuX3Rlc3RzX211bHRpcHJvY2VzcworICAgICAgICAgICAgcnVuX3Rlc3RzX211bHRpcHJvY2VzcyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ydW5fdGVzdHNfc2VxdWVudGlhbCgpCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWU6CisgICAgICAgICAgICBpZiBzZWxmLm5leHRfc2luZ2xlX3Rlc3Q6CisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYubmV4dF9zaW5nbGVfZmlsZW5hbWUsICd3JykgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKHNlbGYubmV4dF9zaW5nbGVfdGVzdCArICdcbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lKQorCisgICAgICAgIGlmIHNlbGYudHJhY2VyOgorICAgICAgICAgICAgciA9IHNlbGYudHJhY2VyLnJlc3VsdHMoKQorICAgICAgICAgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXJkaXI9c2VsZi5ucy5jb3ZlcmRpcikKKworICAgICAgICBwcmludCgiVG90YWwgZHVyYXRpb246ICVzIiAlIHNlbGYudGltZV9kZWx0YShjZWlsPVRydWUpKQorCisgICAgICAgIGlmIHNlbGYubnMucnVubGVha3M6CisgICAgICAgICAgICBvcy5zeXN0ZW0oImxlYWtzICVkIiAlIG9zLmdldHBpZCgpKQorCisgICAgZGVmIG1haW4oc2VsZiwgdGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBnbG9iYWwgVEVNUERJUgorCisgICAgICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihURU1QRElSKQorICAgICAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBEZWZpbmUgYSB3cml0YWJsZSB0ZW1wIGRpciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjd2Qgd2hpbGUgcnVubmluZworICAgICAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCisgICAgICAgICMgdGVzdGluZyAoc2VlIHRoZSAtaiBvcHRpb24pLgorICAgICAgICB0ZXN0X2N3ZCA9ICd0ZXN0X3B5dGhvbl97fScuZm9ybWF0KG9zLmdldHBpZCgpKQorICAgICAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKKworICAgICAgICAjIFJ1biB0aGUgdGVzdHMgaW4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB0ZW1wb3JhcmlseSBjaGFuZ2VzIHRoZSBDV0QgdG8gYQorICAgICAgICAjIHRlbXBvcmFyeSBhbmQgd3JpdGFibGUgZGlyZWN0b3J5LiAgSWYgaXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG9yCisgICAgICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcworICAgICAgICAjIGF2YWlsYWJsZSBmcm9tIHN1cHBvcnQuU0FWRURDV0QuCisgICAgICAgIHdpdGggc3VwcG9ydC50ZW1wX2N3ZCh0ZXN0X2N3ZCwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLl9tYWluKHRlc3RzLCBrd2FyZ3MpCisKKyAgICBkZWYgX21haW4oc2VsZiwgdGVzdHMsIGt3YXJncyk6CisgICAgICAgIHNlbGYubnMgPSBzZWxmLnBhcnNlX2FyZ3Moa3dhcmdzKQorCisgICAgICAgIGlmIHNlbGYubnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJ1bnRlc3RfbXAgaW1wb3J0IHJ1bl90ZXN0c19zbGF2ZQorICAgICAgICAgICAgcnVuX3Rlc3RzX3NsYXZlKHNlbGYubnMuc2xhdmVhcmdzKQorCisgICAgICAgIGlmIHNlbGYubnMud2FpdDoKKyAgICAgICAgICAgIGlucHV0KCJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlLi4uIikKKworICAgICAgICBzZXR1cF90ZXN0cyhzZWxmLm5zKQorCisgICAgICAgIHNlbGYuZmluZF90ZXN0cyh0ZXN0cykKKworICAgICAgICBpZiBzZWxmLm5zLmxpc3RfdGVzdHM6CisgICAgICAgICAgICBzZWxmLmxpc3RfdGVzdHMoKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICBzZWxmLnJ1bl90ZXN0cygpCisgICAgICAgIHNlbGYuZGlzcGxheV9yZXN1bHQoKQorCisgICAgICAgIGlmIHNlbGYubnMudmVyYm9zZTIgYW5kIHNlbGYuYmFkOgorICAgICAgICAgICAgc2VsZi5yZXJ1bl9mYWlsZWRfdGVzdHMoKQorCisgICAgICAgIHNlbGYuZmluYWxpemUoKQorICAgICAgICBzeXMuZXhpdChsZW4oc2VsZi5iYWQpID4gMCBvciBzZWxmLmludGVycnVwdGVkKQorCisKK2RlZiByZW1vdmVweShuYW1lcyk6CisgICAgaWYgbm90IG5hbWVzOgorICAgICAgICByZXR1cm4KKyAgICBmb3IgaWR4LCBuYW1lIGluIGVudW1lcmF0ZShuYW1lcyk6CisgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIGV4dCA9PSAnLnB5JzoKKyAgICAgICAgICAgIG5hbWVzW2lkeF0gPSBiYXNlbmFtZQorCisKK2RlZiBjb3VudChuLCB3b3JkKToKKyAgICBpZiBuID09IDE6CisgICAgICAgIHJldHVybiAiJWQgJXMiICUgKG4sIHdvcmQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICIlZCAlc3MiICUgKG4sIHdvcmQpCisKKworZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgorICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KKworICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCisgICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCisgICAgYmVnaW4gZWFjaCBsaW5lLgorICAgICIiIgorCisgICAgYmxhbmtzID0gJyAnICogaW5kZW50CisgICAgIyBQcmludCB0aGUgc29ydGVkIGxpc3Q6ICd4JyBtYXkgYmUgYSAnLS1yYW5kb20nIGxpc3Qgb3IgYSBzZXQoKQorICAgIHByaW50KHRleHR3cmFwLmZpbGwoJyAnLmpvaW4oc3RyKGVsdCkgZm9yIGVsdCBpbiBzb3J0ZWQoeCkpLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PWJsYW5rcywgc3Vic2VxdWVudF9pbmRlbnQ9YmxhbmtzKSkKKworCitkZWYgbWFpbih0ZXN0cz1Ob25lLCAqKmt3YXJncyk6CisgICAgIiIiUnVuIHRoZSBQeXRob24gc3VpdGUuIiIiCisgICAgUmVncnRlc3QoKS5tYWluKHRlc3RzPXRlc3RzLCAqKmt3YXJncykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3JlZmxlYWsucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZGM0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5CkBAIC0wLDAgKzEsMjAyIEBACitpbXBvcnQgZXJybm8KK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gaW5zcGVjdCBpbXBvcnQgaXNhYnN0cmFjdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKwordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICBNQVhGRCA9IDI1NgorCisKK2RlZiBmZF9jb3VudCgpOgorICAgICIiIkNvdW50IHRoZSBudW1iZXIgb2Ygb3BlbiBmaWxlIGRlc2NyaXB0b3JzIiIiCisgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCdsaW51eCcsICdmcmVlYnNkJykpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoIi9wcm9jL3NlbGYvZmQiKQorICAgICAgICAgICAgcmV0dXJuIGxlbihuYW1lcykKKyAgICAgICAgZXhjZXB0IEZpbGVOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgY291bnQgPSAwCisgICAgZm9yIGZkIGluIHJhbmdlKE1BWEZEKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQcmVmZXIgZHVwKCkgb3ZlciBmc3RhdCgpLiBmc3RhdCgpIGNhbiByZXF1aXJlIGlucHV0L291dHB1dAorICAgICAgICAgICAgIyB3aGVyZWFzIGR1cCgpIGRvZXNuJ3QuCisgICAgICAgICAgICBmZDIgPSBvcy5kdXAoZmQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVCQURGOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5jbG9zZShmZDIpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgcmV0dXJuIGNvdW50CisKKworZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKKyAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgorICAgICIiIgorICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCisgICAgaW1wb3J0IGNvcHlyZWcKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCisKKyAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCisKKyAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KKyAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCisgICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCisgICAgYWJjcyA9IHt9CisgICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKKyAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKKyAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQorCisgICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcworICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQorICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCisgICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKKyAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorICAgIGZkX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisKKyAgICBwcmludCgiYmVnaW5uaW5nIiwgcmVwY291bnQsICJyZXBldGl0aW9ucyIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICBwcmludCgoIjEyMzQ1Njc4OTAiKihyZXBjb3VudC8vMTAgKyAxKSlbOnJlcGNvdW50XSwgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgIGZsdXNoPVRydWUpCisgICAgIyBpbml0aWFsaXplIHZhcmlhYmxlcyB0byBtYWtlIHB5Zmxha2VzIHF1aWV0CisgICAgcmNfYmVmb3JlID0gYWxsb2NfYmVmb3JlID0gZmRfYmVmb3JlID0gMAorICAgIGZvciBpIGluIHJhbmdlKHJlcGNvdW50KToKKyAgICAgICAgaW5kaXJlY3RfdGVzdCgpCisgICAgICAgIGFsbG9jX2FmdGVyLCByY19hZnRlciwgZmRfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJjcykKKyAgICAgICAgcHJpbnQoJy4nLCBlbmQ9JycsIGZsdXNoPVRydWUpCisgICAgICAgIGlmIGkgPj0gbndhcm11cDoKKyAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCisgICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQorICAgICAgICAgICAgZmRfZGVsdGFzW2ldID0gZmRfYWZ0ZXIgLSBmZF9iZWZvcmUKKyAgICAgICAgYWxsb2NfYmVmb3JlID0gYWxsb2NfYWZ0ZXIKKyAgICAgICAgcmNfYmVmb3JlID0gcmNfYWZ0ZXIKKyAgICAgICAgZmRfYmVmb3JlID0gZmRfYWZ0ZXIKKyAgICBwcmludChmaWxlPXN5cy5zdGRlcnIpCisgICAgIyBUaGVzZSBjaGVja2VycyByZXR1cm4gRmFsc2Ugb24gc3VjY2VzcywgVHJ1ZSBvbiBmYWlsdXJlCisgICAgZGVmIGNoZWNrX3JjX2RlbHRhcyhkZWx0YXMpOgorICAgICAgICByZXR1cm4gYW55KGRlbHRhcykKKyAgICBkZWYgY2hlY2tfYWxsb2NfZGVsdGFzKGRlbHRhcyk6CisgICAgICAgICMgQXQgbGVhc3QgMS8zcmQgb2YgMHMKKyAgICAgICAgaWYgMyAqIGRlbHRhcy5jb3VudCgwKSA8IGxlbihkZWx0YXMpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBOb3RoaW5nIGVsc2UgdGhhbiAxcywgMHMgYW5kIC0xcworICAgICAgICBpZiBub3Qgc2V0KGRlbHRhcykgPD0gezEsMCwtMX06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBmYWlsZWQgPSBGYWxzZQorICAgIGZvciBkZWx0YXMsIGl0ZW1fbmFtZSwgY2hlY2tlciBpbiBbCisgICAgICAgIChyY19kZWx0YXMsICdyZWZlcmVuY2VzJywgY2hlY2tfcmNfZGVsdGFzKSwKKyAgICAgICAgKGFsbG9jX2RlbHRhcywgJ21lbW9yeSBibG9ja3MnLCBjaGVja19hbGxvY19kZWx0YXMpLAorICAgICAgICAoZmRfZGVsdGFzLCAnZmlsZSBkZXNjcmlwdG9ycycsIGNoZWNrX3JjX2RlbHRhcyldOgorICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6CisgICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAorICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCisgICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgICAgIHdpdGggb3BlbihmbmFtZSwgImEiKSBhcyByZWZyZXA6CisgICAgICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXJlZnJlcCkKKyAgICAgICAgICAgICAgICByZWZyZXAuZmx1c2goKQorICAgICAgICAgICAgZmFpbGVkID0gVHJ1ZQorICAgIHJldHVybiBmYWlsZWQKKworCitkZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6CisgICAgaW1wb3J0IGdjLCBjb3B5cmVnCisgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCisgICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAorICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYworICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCisgICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0CisKKyAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCisgICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKKyAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6CisgICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KKworICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KKyAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKKyAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKKyAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKKyAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAorICAgIGVsc2U6CisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQorCisgICAgIyBjbGVhciB0eXBlIGNhY2hlCisgICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKKworICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgorICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106CisgICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKKyAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKKworICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCisgICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCisgICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKKyAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKKworICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KKyAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKKyAgICByZS5wdXJnZSgpCisgICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCisgICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKKyAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKKyAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQorICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKKyAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQorICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKKworICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCisgICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCisgICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAorICAgIGdjLmNvbGxlY3QoKQorICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpLCBmZF9jb3VudCgpCisKKworZGVmIHdhcm1fY2FjaGVzKCk6CisgICAgIyBjaGFyIGNhY2hlCisgICAgcyA9IGJ5dGVzKHJhbmdlKDI1NikpCisgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgc1tpOmkrMV0KKyAgICAjIHVuaWNvZGUgY2FjaGUKKyAgICBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildCisgICAgIyBpbnQgY2FjaGUKKyAgICBsaXN0KHJhbmdlKC01LCAyNTcpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxZmViNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkKQEAgLTAsMCArMSwyNjAgQEAKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBpbXBvcnRsaWIKK2ltcG9ydCBpbworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5yZWZsZWFrIGltcG9ydCBkYXNoX1IKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5zYXZlX2VudiBpbXBvcnQgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudAorCisKKyMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgorUEFTU0VEID0gMQorRkFJTEVEID0gMAorRU5WX0NIQU5HRUQgPSAtMQorU0tJUFBFRCA9IC0yCitSRVNPVVJDRV9ERU5JRUQgPSAtMworSU5URVJSVVBURUQgPSAtNAorQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCisKK19GT1JNQVRfVEVTVF9SRVNVTFQgPSB7CisgICAgUEFTU0VEOiAnJXMgcGFzc2VkJywKKyAgICBGQUlMRUQ6ICclcyBmYWlsZWQnLAorICAgIEVOVl9DSEFOR0VEOiAnJXMgZmFpbGVkIChlbnYgY2hhbmdlZCknLAorICAgIFNLSVBQRUQ6ICclcyBza2lwcGVkJywKKyAgICBSRVNPVVJDRV9ERU5JRUQ6ICclcyBza2lwcGVkIChyZXNvdXJjZSBkZW5pZWQpJywKKyAgICBJTlRFUlJVUFRFRDogJyVzIGludGVycnVwdGVkJywKKyAgICBDSElMRF9FUlJPUjogJyVzIGNyYXNoZWQnLAorfQorCisjIE1pbmltdW0gZHVyYXRpb24gb2YgYSB0ZXN0IHRvIGRpc3BsYXkgaXRzIGR1cmF0aW9uIG9yIHRvIG1lbnRpb24gdGhhdAorIyB0aGUgdGVzdCBpcyBydW5uaW5nIGluIGJhY2tncm91bmQKK1BST0dSRVNTX01JTl9USU1FID0gMzAuMCAgICMgc2Vjb25kcworCisjIHNtYWxsIHNldCBvZiB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIGJhc2ljYWxseSBmdW5jdGlvbmluZyBpbnRlcnByZXRlcgorIyAoaS5lLiBpZiBhbnkgb2YgdGhlc2UgZmFpbCwgdGhlbiBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBmb2xsb3cpCitTVERURVNUUyA9IFsKKyAgICAndGVzdF9ncmFtbWFyJywKKyAgICAndGVzdF9vcGNvZGVzJywKKyAgICAndGVzdF9kaWN0JywKKyAgICAndGVzdF9idWlsdGluJywKKyAgICAndGVzdF9leGNlcHRpb25zJywKKyAgICAndGVzdF90eXBlcycsCisgICAgJ3Rlc3RfdW5pdHRlc3QnLAorICAgICd0ZXN0X2RvY3Rlc3QnLAorICAgICd0ZXN0X2RvY3Rlc3QyJywKKyAgICAndGVzdF9zdXBwb3J0JworXQorCisjIHNldCBvZiB0ZXN0cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB1c2luZyByZWdydGVzdAorTk9UVEVTVFMgPSBzZXQoKQorCisKK2RlZiBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdF9uYW1lLCByZXN1bHQpOgorICAgIGZtdCA9IF9GT1JNQVRfVEVTVF9SRVNVTFQuZ2V0KHJlc3VsdCwgIiVzIikKKyAgICByZXR1cm4gZm10ICUgdGVzdF9uYW1lCisKKworZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXBwbGljYWJsZSB0ZXN0IG1vZHVsZXMuIiIiCisgICAgdGVzdGRpciA9IGZpbmR0ZXN0ZGlyKHRlc3RkaXIpCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRlc3RkaXIpCisgICAgdGVzdHMgPSBbXQorICAgIG90aGVycyA9IHNldChzdGR0ZXN0cykgfCBub3R0ZXN0cworICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBtb2QsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKKyAgICAgICAgaWYgbW9kWzo1XSA9PSAidGVzdF8iIGFuZCBleHQgaW4gKCIucHkiLCAiIikgYW5kIG1vZCBub3QgaW4gb3RoZXJzOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZCkKKyAgICByZXR1cm4gc3RkdGVzdHMgKyBzb3J0ZWQodGVzdHMpCisKKworZGVmIHJ1bnRlc3QobnMsIHRlc3QpOgorICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0LgorCisgICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAorICAgIHZlcmJvc2UgLS0gaWYgdHJ1ZSwgcHJpbnQgbW9yZSBtZXNzYWdlcworICAgIHF1aWV0IC0tIGlmIHRydWUsIGRvbid0IHByaW50ICdza2lwcGVkJyBtZXNzYWdlcyAocHJvYmFibHkgcmVkdW5kYW50KQorICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCisgICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cworICAgIG91dHB1dF9vbl9mYWlsdXJlIC0tIGlmIHRydWUsIGRpc3BsYXkgdGVzdCBvdXRwdXQgb24gZmFpbHVyZQorICAgIHRpbWVvdXQgLS0gZHVtcCB0aGUgdHJhY2ViYWNrIGFuZCBleGl0IGlmIGEgdGVzdCB0YWtlcyBtb3JlIHRoYW4KKyAgICAgICAgICAgICAgIHRpbWVvdXQgc2Vjb25kcworICAgIGZhaWxmYXN0LCBtYXRjaF90ZXN0cyAtLSBTZWUgcmVncnRlc3QgY29tbWFuZC1saW5lIGZsYWdzIGZvciB0aGVzZS4KKyAgICBwZ28gLS0gaWYgdHJ1ZSwgc3VwcHJlc3MgYW55IGluZm8gaXJyZWxldmFudCB0byBhIGdlbmVyYXRpbmcgYSBQR08gYnVpbGQKKworICAgIFJldHVybnMgdGhlIHR1cGxlIHJlc3VsdCwgdGVzdF90aW1lLCB3aGVyZSByZXN1bHQgaXMgb25lIG9mIHRoZSBjb25zdGFudHM6CisgICAgICAgIElOVEVSUlVQVEVEICAgICAgS2V5Ym9hcmRJbnRlcnJ1cHQgd2hlbiBydW4gdW5kZXIgLWoKKyAgICAgICAgUkVTT1VSQ0VfREVOSUVEICB0ZXN0IHNraXBwZWQgYmVjYXVzZSByZXNvdXJjZSBkZW5pZWQKKyAgICAgICAgU0tJUFBFRCAgICAgICAgICB0ZXN0IHNraXBwZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCisgICAgICAgIEVOVl9DSEFOR0VEICAgICAgdGVzdCBmYWlsZWQgYmVjYXVzZSBpdCBjaGFuZ2VkIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQKKyAgICAgICAgRkFJTEVEICAgICAgICAgICB0ZXN0IGZhaWxlZAorICAgICAgICBQQVNTRUQgICAgICAgICAgIHRlc3QgcGFzc2VkCisgICAgIiIiCisKKyAgICB2ZXJib3NlID0gbnMudmVyYm9zZQorICAgIHF1aWV0ID0gbnMucXVpZXQKKyAgICBodW50cmxlYWtzID0gbnMuaHVudHJsZWFrcworICAgIG91dHB1dF9vbl9mYWlsdXJlID0gbnMudmVyYm9zZTMKKyAgICBmYWlsZmFzdCA9IG5zLmZhaWxmYXN0CisgICAgbWF0Y2hfdGVzdHMgPSBucy5tYXRjaF90ZXN0cworICAgIHRpbWVvdXQgPSBucy50aW1lb3V0CisgICAgcGdvID0gbnMucGdvCisKKyAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQorICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQorICAgIHRyeToKKyAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCisgICAgICAgIGlmIGZhaWxmYXN0OgorICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCisKKyAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQorICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgorICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgorICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KKyAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQorICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCisKKyAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKG5zLCB0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSwgcGdvPXBnbykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCisgICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSB2ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAorICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcihucywgdGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1ub3QgdmVyYm9zZSwgcGdvPXBnbykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCisgICAgICAgIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdCwgdmVyYm9zZSkKK3J1bnRlc3Quc3RyaW5naW8gPSBOb25lCisKKworZGVmIHJ1bnRlc3RfaW5uZXIobnMsIHRlc3QsIHZlcmJvc2UsIHF1aWV0LAorICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgZGlzcGxheV9mYWlsdXJlPVRydWUsICosIHBnbz1GYWxzZSk6CisgICAgc3VwcG9ydC51bmxvYWQodGVzdCkKKworICAgIHRlc3RfdGltZSA9IDAuMAorICAgIHJlZmxlYWsgPSBGYWxzZSAgIyBUcnVlIGlmIHRoZSB0ZXN0IGxlYWtlZCByZWZlcmVuY2VzLgorICAgIHRyeToKKyAgICAgICAgaWYgdGVzdC5zdGFydHN3aXRoKCd0ZXN0LicpIG9yIG5zLnRlc3RkaXI6CisgICAgICAgICAgICBhYnN0ZXN0ID0gdGVzdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBbHdheXMgaW1wb3J0IGl0IGZyb20gdGhlIHRlc3QgcGFja2FnZQorICAgICAgICAgICAgYWJzdGVzdCA9ICd0ZXN0LicgKyB0ZXN0CisgICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwgcGdvPXBnbykgYXMgZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHRoZV9tb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShhYnN0ZXN0KQorICAgICAgICAgICAgIyBJZiB0aGUgdGVzdCBoYXMgYSB0ZXN0X21haW4sIHRoYXQgd2lsbCBydW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAjIHRlc3RzLiAgSWYgbm90LCB1c2Ugbm9ybWFsIHVuaXR0ZXN0IHRlc3QgbG9hZGluZy4KKyAgICAgICAgICAgIHRlc3RfcnVubmVyID0gZ2V0YXR0cih0aGVfbW9kdWxlLCAidGVzdF9tYWluIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHRlc3RfcnVubmVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVubmVyKCk6CisgICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoZV9tb2R1bGUpCisgICAgICAgICAgICAgICAgICAgIGZvciBlcnJvciBpbiBsb2FkZXIuZXJyb3JzOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZXJyb3IsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGVzdHMiKQorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0cykKKyAgICAgICAgICAgIHRlc3RfcnVubmVyKCkKKyAgICAgICAgICAgIGlmIGh1bnRybGVha3M6CisgICAgICAgICAgICAgICAgcmVmbGVhayA9IGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCB0ZXN0X3J1bm5lciwgaHVudHJsZWFrcykKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQorICAgIGV4Y2VwdCBzdXBwb3J0LlJlc291cmNlRGVuaWVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IHF1aWV0IGFuZCBub3QgcGdvOgorICAgICAgICAgICAgcHJpbnQodGVzdCwgInNraXBwZWQgLS0iLCBtc2csIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBSRVNPVVJDRV9ERU5JRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgorICAgICAgICBpZiBub3QgcGdvOgorICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgIGZsdXNoPVRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCIsIGZpbGU9c3lzLnN0ZGVyciwgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0OgorICAgICAgICBtc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCisgICAgICAgIGlmIG5vdCBwZ286CisgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJjcmFzaGVkIC0tIiwgbXNnLCBmaWxlPXN5cy5zdGRlcnIsCisgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKKyAgICBlbHNlOgorICAgICAgICBpZiByZWZsZWFrOgorICAgICAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgICAgIGlmIGVudmlyb25tZW50LmNoYW5nZWQ6CisgICAgICAgICAgICByZXR1cm4gRU5WX0NIQU5HRUQsIHRlc3RfdGltZQorICAgICAgICByZXR1cm4gUEFTU0VELCB0ZXN0X3RpbWUKKworCitkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6CisgICAgaW1wb3J0IHNodXRpbAorICAgIGltcG9ydCBzdGF0CisgICAgaW1wb3J0IGdjCisKKyAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCisgICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0CisgICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgorICAgIGdjLmNvbGxlY3QoKQorCisgICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQorICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cworICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCisgICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQorICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKKyAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCisgICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKKyAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKKyAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6CisgICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQorICAgICAgICAgICAgbnVrZXIobmFtZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6CisgICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKKworCitkZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKKyAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkgb3Igb3MuY3VyZGlyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0X21wLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA0YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weQpAQCAtMCwwICsxLDI0NSBAQAoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHF1ZXVlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQoIk11bHRpcHJvY2VzcyBvcHRpb24gcmVxdWlyZXMgdGhyZWFkIHN1cHBvcnQiKQorICAgIHN5cy5leGl0KDIpCisKK2Zyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0IGltcG9ydCAoCisgICAgcnVudGVzdCwgSU5URVJSVVBURUQsIENISUxEX0VSUk9SLCBQUk9HUkVTU19NSU5fVElNRSwKKyAgICBmb3JtYXRfdGVzdF9yZXN1bHQpCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2V0dXAgaW1wb3J0IHNldHVwX3Rlc3RzCisKKworIyBEaXNwbGF5IHRoZSBydW5uaW5nIHRlc3RzIGlmIG5vdGhpbmcgaGFwcGVuZWQgbGFzdCBOIHNlY29uZHMKK1BST0dSRVNTX1VQREFURSA9IDMwLjAgICAjIHNlY29uZHMKKworIyBJZiBpbnRlcnJ1cHRlZCwgZGlzcGxheSB0aGUgd2FpdCBwcm9ncmVzcyBldmVyeSBOIHNlY29uZHMKK1dBSVRfUFJPR1JFU1MgPSAyLjAgICAjIHNlY29uZHMKKworCitkZWYgcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0bmFtZSwgbnMpOgorICAgICIiIlJ1biB0aGUgZ2l2ZW4gdGVzdCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCAtLXNsYXZlYXJncy4KKworICAgIG5zIGlzIHRoZSBvcHRpb24gTmFtZXNwYWNlIHBhcnNlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIHJlZ3J0ZXN0CisgICAgaXMgaW52b2tlZCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgLS1zbGF2ZWFyZ3MgYXJndW1lbnQ7IHdoZW4gdGhlCisgICAgc3VicHJvY2VzcyBleGl0cywgaXRzIHJldHVybiBjb2RlLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmV0dXJuZWQgYXMgYQorICAgIDMtdHVwbGUuCisgICAgIiIiCisgICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQorCisgICAgbnNfZGljdCA9IHZhcnMobnMpCisgICAgc2xhdmVhcmdzID0gKG5zX2RpY3QsIHRlc3RuYW1lKQorICAgIHNsYXZlYXJncyA9IGpzb24uZHVtcHMoc2xhdmVhcmdzKQorCisgICAgY21kID0gW3N5cy5leGVjdXRhYmxlLCAqc3VwcG9ydC5hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSwKKyAgICAgICAgICAgJy1YJywgJ2ZhdWx0aGFuZGxlcicsCisgICAgICAgICAgICctbScsICd0ZXN0LnJlZ3J0ZXN0JywKKyAgICAgICAgICAgJy0tc2xhdmVhcmdzJywgc2xhdmVhcmdzXQorICAgIGlmIG5zLnBnbzoKKyAgICAgICAgY21kICs9IFsnLS1wZ28nXQorCisgICAgIyBSdW5uaW5nIHRoZSBjaGlsZCBmcm9tIHRoZSBzYW1lIHdvcmtpbmcgZGlyZWN0b3J5IGFzIHJlZ3J0ZXN0J3Mgb3JpZ2luYWwKKyAgICAjIGludm9jYXRpb24gZW5zdXJlcyB0aGF0IFRFTVBESVIgZm9yIHRoZSBjaGlsZCBpcyB0aGUgc2FtZSB3aGVuCisgICAgIyBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCkgaXMgdHJ1ZS4gU2VlIGlzc3VlIDE1MzAwLgorICAgIHBvcGVuID0gUG9wZW4oY21kLAorICAgICAgICAgICAgICAgICAgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLAorICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9KG9zLm5hbWUgIT0gJ250JyksCisgICAgICAgICAgICAgICAgICBjd2Q9c3VwcG9ydC5TQVZFRENXRCkKKyAgICB3aXRoIHBvcGVuOgorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmV0Y29kZSA9IHBvcGVuLndhaXQoKQorICAgIHJldHVybiByZXRjb2RlLCBzdGRvdXQsIHN0ZGVycgorCisKK2RlZiBydW5fdGVzdHNfc2xhdmUoc2xhdmVhcmdzKToKKyAgICBuc19kaWN0LCB0ZXN0bmFtZSA9IGpzb24ubG9hZHMoc2xhdmVhcmdzKQorICAgIG5zID0gdHlwZXMuU2ltcGxlTmFtZXNwYWNlKCoqbnNfZGljdCkKKworICAgIHNldHVwX3Rlc3RzKG5zKQorCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBydW50ZXN0KG5zLCB0ZXN0bmFtZSkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJlc3VsdCA9IElOVEVSUlVQVEVELCAnJworICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICByZXN1bHQgPSBDSElMRF9FUlJPUiwgc3RyKGUpCisKKyAgICBwcmludCgpICAgIyBGb3JjZSBhIG5ld2xpbmUgKGp1c3QgaW4gY2FzZSkKKyAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCksIGZsdXNoPVRydWUpCisgICAgc3lzLmV4aXQoMCkKKworCisjIFdlIGRvIG5vdCB1c2UgYSBnZW5lcmF0b3Igc28gbXVsdGlwbGUgdGhyZWFkcyBjYW4gY2FsbCBuZXh0KCkuCitjbGFzcyBNdWx0aXByb2Nlc3NJdGVyYXRvcjoKKworICAgICIiIkEgdGhyZWFkLXNhZmUgaXRlcmF0b3Igb3ZlciB0ZXN0cyBmb3IgbXVsdGlwcm9jZXNzIG1vZGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMpOgorICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmxvY2s6CisgICAgICAgICAgICBpZiBzZWxmLmludGVycnVwdGVkOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oJ3Rlc3RzIGludGVycnVwdGVkJykKKyAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYudGVzdHMpCisKKworY2xhc3MgTXVsdGlwcm9jZXNzVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwZW5kaW5nLCBvdXRwdXQsIG5zKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYucGVuZGluZyA9IHBlbmRpbmcKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBvdXRwdXQKKyAgICAgICAgc2VsZi5ucyA9IG5zCisgICAgICAgIHNlbGYuY3VycmVudF90ZXN0ID0gTm9uZQorICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSBOb25lCisKKyAgICBkZWYgX3J1bnRlc3Qoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QgPSBuZXh0KHNlbGYucGVuZGluZykKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBzZWxmLm91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSB0aW1lLm1vbm90b25pYygpCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9IHRlc3QKKworICAgICAgICAgICAgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIgPSBydW5fdGVzdF9pbl9zdWJwcm9jZXNzKHRlc3QsIHNlbGYubnMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9IE5vbmUKKworICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKKyAgICAgICAgaWYgcmV0Y29kZSAhPSAwOgorICAgICAgICAgICAgcmVzdWx0ID0gKENISUxEX0VSUk9SLCAiRXhpdCBjb2RlICVzIiAlIHJldGNvZGUpCisgICAgICAgICAgICBzZWxmLm91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiBub3QgcmVzdWx0OgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHQpCisgICAgICAgIHNlbGYub3V0cHV0LnB1dCgodGVzdCwgc3Rkb3V0LnJzdHJpcCgpLCBzdGRlcnIucnN0cmlwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdG9wID0gRmFsc2UKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzdG9wOgorICAgICAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9ydW50ZXN0KCkKKyAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgICAgICBzZWxmLm91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgcnVuX3Rlc3RzX211bHRpcHJvY2VzcyhyZWdydGVzdCk6CisgICAgb3V0cHV0ID0gcXVldWUuUXVldWUoKQorICAgIHBlbmRpbmcgPSBNdWx0aXByb2Nlc3NJdGVyYXRvcihyZWdydGVzdC50ZXN0cykKKyAgICB0ZXN0X3RpbWVvdXQgPSByZWdydGVzdC5ucy50aW1lb3V0CisgICAgdXNlX3RpbWVvdXQgPSAodGVzdF90aW1lb3V0IGlzIG5vdCBOb25lKQorCisgICAgd29ya2VycyA9IFtNdWx0aXByb2Nlc3NUaHJlYWQocGVuZGluZywgb3V0cHV0LCByZWdydGVzdC5ucykKKyAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHJlZ3J0ZXN0Lm5zLnVzZV9tcCldCisgICAgcHJpbnQoIlJ1biB0ZXN0cyBpbiBwYXJhbGxlbCB1c2luZyAlcyBjaGlsZCBwcm9jZXNzZXMiCisgICAgICAgICAgJSBsZW4od29ya2VycykpCisgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICB3b3JrZXIuc3RhcnQoKQorCisgICAgZGVmIGdldF9ydW5uaW5nKHdvcmtlcnMpOgorICAgICAgICBydW5uaW5nID0gW10KKyAgICAgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICAgICAgY3VycmVudF90ZXN0ID0gd29ya2VyLmN1cnJlbnRfdGVzdAorICAgICAgICAgICAgaWYgbm90IGN1cnJlbnRfdGVzdDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZHQgPSB0aW1lLm1vbm90b25pYygpIC0gd29ya2VyLnN0YXJ0X3RpbWUKKyAgICAgICAgICAgIGlmIGR0ID49IFBST0dSRVNTX01JTl9USU1FOgorICAgICAgICAgICAgICAgIHJ1bm5pbmcuYXBwZW5kKCclcyAoJS4wZiBzZWMpJyAlIChjdXJyZW50X3Rlc3QsIGR0KSkKKyAgICAgICAgcmV0dXJuIHJ1bm5pbmcKKworICAgIGZpbmlzaGVkID0gMAorICAgIHRlc3RfaW5kZXggPSAxCisgICAgZ2V0X3RpbWVvdXQgPSBtYXgoUFJPR1JFU1NfVVBEQVRFLCBQUk9HUkVTU19NSU5fVElNRSkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIGZpbmlzaGVkIDwgcmVncnRlc3QubnMudXNlX21wOgorICAgICAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyKHRlc3RfdGltZW91dCwgZXhpdD1UcnVlKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlbSA9IG91dHB1dC5nZXQodGltZW91dD1nZXRfdGltZW91dCkKKyAgICAgICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gZ2V0X3J1bm5pbmcod29ya2VycykKKyAgICAgICAgICAgICAgICBpZiBydW5uaW5nIGFuZCBub3QgcmVncnRlc3QubnMucGdvOgorICAgICAgICAgICAgICAgICAgICBwcmludCgncnVubmluZzogJXMnICUgJywgJy5qb2luKHJ1bm5pbmcpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRlc3QsIHN0ZG91dCwgc3RkZXJyLCByZXN1bHQgPSBpdGVtCisgICAgICAgICAgICBpZiB0ZXN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZmluaXNoZWQgKz0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZWdydGVzdC5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCisKKyAgICAgICAgICAgICMgRGlzcGxheSBwcm9ncmVzcworICAgICAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICAgICAgdGV4dCA9IGZvcm1hdF90ZXN0X3Jlc3VsdCh0ZXN0LCBvaykKKyAgICAgICAgICAgIGlmIChvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCkKKyAgICAgICAgICAgICAgICBhbmQgdGVzdF90aW1lID49IFBST0dSRVNTX01JTl9USU1FCisgICAgICAgICAgICAgICAgYW5kIG5vdCByZWdydGVzdC5ucy5wZ28pOgorICAgICAgICAgICAgICAgIHRleHQgKz0gJyAoJS4wZiBzZWMpJyAlIHRlc3RfdGltZQorICAgICAgICAgICAgcnVubmluZyA9IGdldF9ydW5uaW5nKHdvcmtlcnMpCisgICAgICAgICAgICBpZiBydW5uaW5nIGFuZCBub3QgcmVncnRlc3QubnMucGdvOgorICAgICAgICAgICAgICAgIHRleHQgKz0gJyAtLSBydW5uaW5nOiAlcycgJSAnLCAnLmpvaW4ocnVubmluZykKKyAgICAgICAgICAgIHJlZ3J0ZXN0LmRpc3BsYXlfcHJvZ3Jlc3ModGVzdF9pbmRleCwgdGV4dCkKKworICAgICAgICAgICAgIyBDb3B5IHN0ZG91dCBhbmQgc3RkZXJyIGZyb20gdGhlIGNoaWxkIHByb2Nlc3MKKyAgICAgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBwcmludChzdGRvdXQsIGZsdXNoPVRydWUpCisgICAgICAgICAgICBpZiBzdGRlcnIgYW5kIG5vdCByZWdydGVzdC5ucy5wZ286CisgICAgICAgICAgICAgICAgcHJpbnQoc3RkZXJyLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisKKyAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBJTlRFUlJVUFRFRDoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IENISUxEX0VSUk9SOgorICAgICAgICAgICAgICAgIG1zZyA9ICJDaGlsZCBlcnJvciBvbiB7fToge30iLmZvcm1hdCh0ZXN0LCByZXN1bHRbMV0pCisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKG1zZykKKyAgICAgICAgICAgIHRlc3RfaW5kZXggKz0gMQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmVncnRlc3QuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgIHBlbmRpbmcuaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgIHByaW50KCkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB1c2VfdGltZW91dDoKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQorCisgICAgIyBJZiB0ZXN0cyBhcmUgaW50ZXJydXB0ZWQsIHdhaXQgdW50aWwgdGVzdHMgY29tcGxldGUKKyAgICB3YWl0X3N0YXJ0ID0gdGltZS5tb25vdG9uaWMoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHJ1bm5pbmcgPSBbd29ya2VyLmN1cnJlbnRfdGVzdCBmb3Igd29ya2VyIGluIHdvcmtlcnNdCisgICAgICAgIHJ1bm5pbmcgPSBsaXN0KGZpbHRlcihib29sLCBydW5uaW5nKSkKKyAgICAgICAgaWYgbm90IHJ1bm5pbmc6CisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGR0ID0gdGltZS5tb25vdG9uaWMoKSAtIHdhaXRfc3RhcnQKKyAgICAgICAgbGluZSA9ICJXYWl0aW5nIGZvciAlcyAoJXMgdGVzdHMpIiAlICgnLCAnLmpvaW4ocnVubmluZyksIGxlbihydW5uaW5nKSkKKyAgICAgICAgaWYgZHQgPj0gV0FJVF9QUk9HUkVTUzoKKyAgICAgICAgICAgIGxpbmUgPSAiJXMgc2luY2UgJS4wZiBzZWMiICUgKGxpbmUsIGR0KQorICAgICAgICBwcmludChsaW5lKQorICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgICAgICB3b3JrZXIuam9pbihXQUlUX1BST0dSRVNTKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zYXZlX2Vudi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI5ZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkKQEAgLTAsMCArMSwyODYgQEAKK2ltcG9ydCBidWlsdGlucworaW1wb3J0IGxvY2FsZQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQordHJ5OgorICAgIGltcG9ydCBfbXVsdGlwcm9jZXNzaW5nLCBtdWx0aXByb2Nlc3NpbmcucHJvY2VzcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIG11bHRpcHJvY2Vzc2luZyA9IE5vbmUKKworCisjIFVuaXQgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGxlYXZlIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdW5jaGFuZ2VkCisjIG9uY2UgdGhleSBjb21wbGV0ZS4gIEJ1dCBzb21ldGltZXMgdGVzdHMgaGF2ZSBidWdzLCBlc3BlY2lhbGx5IHdoZW4KKyMgdGVzdHMgZmFpbCwgYW5kIHRoZSBjaGFuZ2VzIHRvIGVudmlyb25tZW50IGdvIG9uIHRvIG1lc3MgdXAgb3RoZXIKKyMgdGVzdHMuICBUaGlzIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBidWlsZGJvdCBzdGFiaWxpdHksIHNpbmNlIHRlc3RzCisjIGFyZSBydW4gaW4gcmFuZG9tIG9yZGVyIGFuZCBzbyBwcm9ibGVtcyBtYXkgYXBwZWFyIHRvIGNvbWUgYW5kIGdvLgorIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHdlIGNhbiBzYXZlIGFuZCByZXN0b3JlIHRvIG1pdGlnYXRlIHRoaXMsIGFuZAorIyB0aGUgZm9sbG93aW5nIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoaXMgdGFzay4KKworY2xhc3Mgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudDoKKyAgICAiIiJTYXZlIGJpdHMgb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIHJlc3RvcmUgdGhlbSBhdCBibG9jayBleGl0LgorCisgICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0bmFtZSwgdmVyYm9zZSwgcXVpZXQpOgorICAgICAgICAgICAgI3N0dWZmCisKKyAgICBVbmxlc3MgcXVpZXQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyIGlmIGFueSBvZgorICAgIHRoZSBzYXZlZCBpdGVtcyB3YXMgY2hhbmdlZCBieSB0aGUgdGVzdC4gIFRoZSBhdHRyaWJ1dGUgJ2NoYW5nZWQnCisgICAgaXMgaW5pdGlhbGx5IEZhbHNlLCBidXQgaXMgc2V0IHRvIFRydWUgaWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuCisKKyAgICBJZiB2ZXJib3NlIGlzIG1vcmUgdGhhbiAxLCB0aGUgYmVmb3JlIGFuZCBhZnRlciBzdGF0ZSBvZiBjaGFuZ2VkCisgICAgaXRlbXMgaXMgYWxzbyBwcmludGVkLgorICAgICIiIgorCisgICAgY2hhbmdlZCA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdG5hbWUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsICosIHBnbz1GYWxzZSk6CisgICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAorICAgICAgICBzZWxmLnBnbyA9IHBnbworCisgICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAorICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKKyAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKKyAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKKyAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgorICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgorICAgICMKKyAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKKyAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KKworICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAorICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdzeXMucGF0aF9ob29rcycsICdfX2ltcG9ydF9fJywKKyAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzLmZpbHRlcnMnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCisgICAgICAgICAgICAgICAgICdsb2dnaW5nLl9oYW5kbGVycycsICdsb2dnaW5nLl9oYW5kbGVyTGlzdCcsICdzeXMuZ2V0dHJhY2UnLAorICAgICAgICAgICAgICAgICAnc3lzLndhcm5vcHRpb25zJywKKyAgICAgICAgICAgICAgICAgIyBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpIG1heSByZWxlYXNlIHJlZgorICAgICAgICAgICAgICAgICAjIHRvIGEgdGhyZWFkLCBzbyBjaGVjayBwcm9jZXNzZXMgZmlyc3QuCisgICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcnLCAndGhyZWFkaW5nLl9kYW5nbGluZycsCisgICAgICAgICAgICAgICAgICdzeXNjb25maWcuX0NPTkZJR19WQVJTJywgJ3N5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTJywKKyAgICAgICAgICAgICAgICAgJ2ZpbGVzJywgJ2xvY2FsZScsICd3YXJuaW5ncy5zaG93d2FybmluZycsCisgICAgICAgICAgICAgICAgICdzaHV0aWxfYXJjaGl2ZV9mb3JtYXRzJywgJ3NodXRpbF91bnBhY2tfZm9ybWF0cycsCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6CisgICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQorICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KKworICAgIGRlZiBnZXRfY3dkKHNlbGYpOgorICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKKyAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKKyAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQorCisgICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAorICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAorCisgICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgorCisgICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3RkaW4KKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgorICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgorCisgICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKKyAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgorICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQorICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKKworICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQorICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgorICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoX2hvb2tzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGhfaG9va3MpLCBzeXMucGF0aF9ob29rcywgc3lzLnBhdGhfaG9va3NbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aF9ob29rcyhzZWxmLCBzYXZlZF9ob29rcyk6CisgICAgICAgIHN5cy5wYXRoX2hvb2tzID0gc2F2ZWRfaG9va3NbMV0KKyAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzYXZlZF9ob29rc1syXQorCisgICAgZGVmIGdldF9zeXNfZ2V0dHJhY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuZ2V0dHJhY2UoKQorICAgIGRlZiByZXN0b3JlX3N5c19nZXR0cmFjZShzZWxmLCB0cmFjZV9meG4pOgorICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VfZnhuKQorCisgICAgZGVmIGdldF9fX2ltcG9ydF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gYnVpbHRpbnMuX19pbXBvcnRfXworICAgIGRlZiByZXN0b3JlX19faW1wb3J0X18oc2VsZiwgaW1wb3J0Xyk6CisgICAgICAgIGJ1aWx0aW5zLl9faW1wb3J0X18gPSBpbXBvcnRfCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdzX2ZpbHRlcnMoc2VsZik6CisgICAgICAgIHJldHVybiBpZCh3YXJuaW5ncy5maWx0ZXJzKSwgd2FybmluZ3MuZmlsdGVycywgd2FybmluZ3MuZmlsdGVyc1s6XQorICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX2ZpbHRlcnMoc2VsZiwgc2F2ZWRfZmlsdGVycyk6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBzYXZlZF9maWx0ZXJzWzFdCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlZF9maWx0ZXJzWzJdCisKKyAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KKyAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQorICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKKyAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKKyAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQorICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQorCisgICAgZGVmIGdldF9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgorICAgICAgICAjIHdlIGNvdWxkIGNhbGwgZ2V0X2FyY2hpdmVzX2Zvcm1hdHMoKSBidXQgdGhhdCBvbmx5IHJldHVybnMgdGhlCisgICAgICAgICMgcmVnaXN0cnkga2V5czsgd2Ugd2FudCB0byBjaGVjayB0aGUgdmFsdWVzIHRvbyAodGhlIGZ1bmN0aW9ucyB0aGF0CisgICAgICAgICMgYXJlIHJlZ2lzdGVyZWQpCisgICAgICAgIHJldHVybiBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUywgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY29weSgpCisgICAgZGVmIHJlc3RvcmVfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTID0gc2F2ZWRbMF0KKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY2xlYXIoKQorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCisKKyAgICBkZWYgZ2V0X3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMsIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY29weSgpCisgICAgZGVmIHJlc3RvcmVfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUyA9IHNhdmVkWzBdCisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY2xlYXIoKQorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKKworICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlcnMoc2VsZik6CisgICAgICAgICMgX2hhbmRsZXJzIGlzIGEgV2Vha1ZhbHVlRGljdGlvbmFyeQorICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlcnMpLCBsb2dnaW5nLl9oYW5kbGVycywgbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCisgICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlcnMoc2VsZiwgc2F2ZWRfaGFuZGxlcnMpOgorICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKKyAgICAgICAgcGFzcworCisgICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmKToKKyAgICAgICAgIyBfaGFuZGxlckxpc3QgaXMgYSBsaXN0IG9mIHdlYWtyZWZzIHRvIGhhbmRsZXJzCisgICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVyTGlzdCksIGxvZ2dpbmcuX2hhbmRsZXJMaXN0LCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQorICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYsIHNhdmVkX2hhbmRsZXJMaXN0KToKKyAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfc3lzX3dhcm5vcHRpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLndhcm5vcHRpb25zKSwgc3lzLndhcm5vcHRpb25zLCBzeXMud2Fybm9wdGlvbnNbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfd2Fybm9wdGlvbnMoc2VsZiwgc2F2ZWRfb3B0aW9ucyk6CisgICAgICAgIHN5cy53YXJub3B0aW9ucyA9IHNhdmVkX29wdGlvbnNbMV0KKyAgICAgICAgc3lzLndhcm5vcHRpb25zWzpdID0gc2F2ZWRfb3B0aW9uc1syXQorCisgICAgIyBDb250cm9sbGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIFRocmVhZCBvYmplY3RzIGNhbiBtYWtlIGl0IGVhc2llcgorICAgICMgdG8gdHJhY2sgcmVmZXJlbmNlIGxlYWtzLgorICAgIGRlZiBnZXRfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmKToKKyAgICAgICAgaWYgbm90IHRocmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCisgICAgICAgIHJldHVybiB0aHJlYWRpbmcuX2RhbmdsaW5nLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgorICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcuY2xlYXIoKQorICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKKworICAgICMgU2FtZSBmb3IgUHJvY2VzcyBvYmplY3RzCisgICAgZGVmIGdldF9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFVuam9pbmVkIHByb2Nlc3Mgb2JqZWN0cyBjYW4gc3Vydml2ZSBhZnRlciBwcm9jZXNzIGV4aXRzCisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkKKyAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKKyAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgorICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jbGVhcigpCisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCisKKyAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoZSBkaWN0IGlzIGluaXRpYWxpemVkCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHJlZml4JykKKyAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0NPTkZJR19WQVJTKSwgc3lzY29uZmlnLl9DT05GSUdfVkFSUywKKyAgICAgICAgICAgICAgICBkaWN0KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpKQorICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2F2ZWRbMV0KKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy5jbGVhcigpCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMudXBkYXRlKHNhdmVkWzJdKQorCisgICAgZGVmIGdldF9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyksIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLAorICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNvcHkoKSkKKyAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTID0gc2F2ZWRbMV0KKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY2xlYXIoKQorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy51cGRhdGUoc2F2ZWRbMl0pCisKKyAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc29ydGVkKGZuICsgKCcvJyBpZiBvcy5wYXRoLmlzZGlyKGZuKSBlbHNlICcnKQorICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKCkpCisgICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZiwgc2F2ZWRfdmFsdWUpOgorICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIGlmIGZuIG5vdCBpbiBzYXZlZF92YWx1ZSBhbmQgKGZuICsgJy8nKSBub3QgaW4gc2F2ZWRfdmFsdWU6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoZm4pCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgorICAgICAgICAgICAgICAgIHN1cHBvcnQucm10cmVlKGZuKQorCisgICAgX2xjID0gW2dldGF0dHIobG9jYWxlLCBsYykgZm9yIGxjIGluIGRpcihsb2NhbGUpCisgICAgICAgICAgIGlmIGxjLnN0YXJ0c3dpdGgoJ0xDXycpXQorICAgIGRlZiBnZXRfbG9jYWxlKHNlbGYpOgorICAgICAgICBwYWlyaW5ncyA9IFtdCisgICAgICAgIGZvciBsYyBpbiBzZWxmLl9sYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYWlyaW5ncy5hcHBlbmQoKGxjLCBsb2NhbGUuc2V0bG9jYWxlKGxjLCBOb25lKSkpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmV0dXJuIHBhaXJpbmdzCisgICAgZGVmIHJlc3RvcmVfbG9jYWxlKHNlbGYsIHNhdmVkKToKKyAgICAgICAgZm9yIGxjLCBzZXR0aW5nIGluIHNhdmVkOgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsYywgc2V0dGluZykKKworICAgIGRlZiBnZXRfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZik6CisgICAgICAgIHJldHVybiB3YXJuaW5ncy5zaG93d2FybmluZworICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYsIGZ4bik6CisgICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gZnhuCisKKyAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6CisgICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQorICAgICAgICAgICAgZ2V0X25hbWUgPSAnZ2V0XycgKyBtZXRob2Rfc3VmZml4CisgICAgICAgICAgICByZXN0b3JlX25hbWUgPSAncmVzdG9yZV8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgeWllbGQgbmFtZSwgZ2V0YXR0cihzZWxmLCBnZXRfbmFtZSksIGdldGF0dHIoc2VsZiwgcmVzdG9yZV9uYW1lKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlZF92YWx1ZXMgPSBkaWN0KChuYW1lLCBnZXQoKSkgZm9yIG5hbWUsIGdldCwgcmVzdG9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCkpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CisgICAgICAgIHNhdmVkX3ZhbHVlcyA9IHNlbGYuc2F2ZWRfdmFsdWVzCisgICAgICAgIGRlbCBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgorICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCisgICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKKyAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6CisgICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiAgQmVmb3JlOiB7fVxuICBBZnRlcjogIHt9ICIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCwgY3VycmVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NldHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjQ1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weQpAQCAtMCwwICsxLDEyMSBAQAoraW1wb3J0IGF0ZXhpdAoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCBnYworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdjID0gTm9uZQorCitmcm9tIHRlc3QubGlicmVncnRlc3QucmVmbGVhayBpbXBvcnQgd2FybV9jYWNoZXMKKworCitkZWYgc2V0dXBfdGVzdHMobnMpOgorICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMgKGUuZy4gc2VnZmF1bHQpCisgICAgZmF1bHRoYW5kbGVyLmVuYWJsZShhbGxfdGhyZWFkcz1UcnVlKQorCisgICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIFNJR0FMUk0gb3IgU0lHVVNSMSBzaWduYWwKKyAgICBzaWduYWxzID0gW10KKyAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR0FMUk0nKToKKyAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR0FMUk0pCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdVU1IxJyk6CisgICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdVU1IxKQorICAgIGZvciBzaWdudW0gaW4gc2lnbmFsczoKKyAgICAgICAgZmF1bHRoYW5kbGVyLnJlZ2lzdGVyKHNpZ251bSwgY2hhaW49VHJ1ZSkKKworICAgIHJlcGxhY2Vfc3Rkb3V0KCkKKyAgICBzdXBwb3J0LnJlY29yZF9vcmlnaW5hbF9zdGRvdXQoc3lzLnN0ZG91dCkKKworICAgIGlmIG5zLnRlc3RkaXI6CisgICAgICAgICMgUHJlcGVuZCB0ZXN0IGRpcmVjdG9yeSB0byBzeXMucGF0aCwgc28gcnVudGVzdCgpIHdpbGwgYmUgYWJsZQorICAgICAgICAjIHRvIGxvY2F0ZSB0ZXN0cworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5hYnNwYXRoKG5zLnRlc3RkaXIpKQorCisgICAgIyBTb21lIHRpbWVzIF9fcGF0aF9fIGFuZCBfX2ZpbGVfXyBhcmUgbm90IGFic29sdXRlIChlLmcuIHdoaWxlIHJ1bm5pbmcgZnJvbQorICAgICMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQorICAgICMgaW1wb3J0cyBtaWdodCBmYWlsLiAgVGhpcyBhZmZlY3RzIG9ubHkgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYmVmb3JlIG9zLmNoZGlyKCkuCisgICAgIyBUaGVzZSBtb2R1bGVzIGFyZSBzZWFyY2hlZCBmaXJzdCBpbiBzeXMucGF0aFswXSAoc28gJycgLS0gdGhlIENXRCkgYW5kIGlmCisgICAgIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCisgICAgIyBoYXBwZW5zIGJlZm9yZSB0aGUgY2hkaXIpLiAgQWxsIHRoZSBtb2R1bGVzIGltcG9ydGVkIGFmdGVyIHRoZSBjaGRpciwgYXJlCisgICAgIyBub3QgZm91bmQgaW4gdGhlIENXRCwgYW5kIHNpbmNlIHRoZSBvdGhlciBwYXRocyBpbiBzeXMucGF0aFsxOl0gYXJlIGFic29sdXRlCisgICAgIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgorICAgICMgVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0byBhYnNvbHV0aXplIG1hbnVhbGx5IHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gb2YKKyAgICAjIHRoZSBwYWNrYWdlcyB0byBwcmV2ZW50IGxhdGVyIGltcG9ydHMgdG8gZmFpbCB3aGVuIHRoZSBDV0QgaXMgZGlmZmVyZW50LgorICAgIGZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKKyAgICAgICAgICAgIGZvciBpbmRleCwgcGF0aCBpbiBlbnVtZXJhdGUobW9kdWxlLl9fcGF0aF9fKToKKyAgICAgICAgICAgICAgICBtb2R1bGUuX19wYXRoX19baW5kZXhdID0gb3MucGF0aC5hYnNwYXRoKHBhdGgpCisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKKyAgICAgICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCisKKyAgICAjIE1hY09TWCAoYS5rLmEuIERhcndpbikgaGFzIGEgZGVmYXVsdCBzdGFjayBzaXplIHRoYXQgaXMgdG9vIHNtYWxsCisgICAgIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgorICAgICMgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdoZW4gcnVubmluZyB0ZXN0X3JlLnB5IGFuZCB0ZXN0X3NyZS5weS4gIFRoZQorICAgICMgZml4IGlzIHRvIHNldCB0aGUgc3RhY2sgbGltaXQgdG8gMjA0OC4KKyAgICAjIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAorICAgICMgc3VmZmVyIGZyb20gc21hbGwgZGVmYXVsdCBzdGFjayBsaW1pdHMuCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcmVzb3VyY2UKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc29mdCwgaGFyZCA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfU1RBQ0spCisgICAgICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQorICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgKG5ld3NvZnQsIGhhcmQpKQorCisgICAgaWYgbnMuaHVudHJsZWFrczoKKyAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCisKKyAgICAgICAgIyBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIHZhcmlvdXMgY2FjaGVzCisgICAgICAgICMgZmlsbGluZyBzbG93bHkgd2l0aCByYW5kb20gZGF0YToKKyAgICAgICAgd2FybV9jYWNoZXMoKQorCisgICAgaWYgbnMubWVtbGltaXQgaXMgbm90IE5vbmU6CisgICAgICAgIHN1cHBvcnQuc2V0X21lbWxpbWl0KG5zLm1lbWxpbWl0KQorCisgICAgaWYgbnMudGhyZXNob2xkIGlzIG5vdCBOb25lOgorICAgICAgICBnYy5zZXRfdGhyZXNob2xkKG5zLnRocmVzaG9sZCkKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IG1zdmNydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIG1zdmNydC5TZXRFcnJvck1vZGUobXN2Y3J0LlNFTV9GQUlMQ1JJVElDQUxFUlJPUlN8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT0FMSUdOTUVOVEZBVUxURVhDRVBUfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9HUEZBVUxURVJST1JCT1h8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT09QRU5GSUxFRVJST1JCT1gpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICMgcmVsZWFzZSBidWlsZAorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIG0gaW4gW21zdmNydC5DUlRfV0FSTiwgbXN2Y3J0LkNSVF9FUlJPUiwgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgIGlmIG5zLnZlcmJvc2UgYW5kIG5zLnZlcmJvc2UgPj0gMjoKKyAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUobSwgbXN2Y3J0LkNSVERCR19NT0RFX0ZJTEUpCisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRGaWxlKG0sIG1zdmNydC5DUlREQkdfRklMRV9TVERFUlIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUobSwgMCkKKworICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IG5zLnVzZV9yZXNvdXJjZXMKKworCitkZWYgcmVwbGFjZV9zdGRvdXQoKToKKyAgICAiIiJTZXQgc3Rkb3V0IGVuY29kZXIgZXJyb3IgaGFuZGxlciB0byBiYWNrc2xhc2hyZXBsYWNlIChhcyBzdGRlcnIgZXJyb3IKKyAgICBoYW5kbGVyKSB0byBhdm9pZCBVbmljb2RlRW5jb2RlRXJyb3Igd2hlbiBwcmludGluZyBhIHRyYWNlYmFjayIiIgorICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICBzeXMuc3Rkb3V0ID0gb3BlbihzdGRvdXQuZmlsZW5vKCksICd3JywKKyAgICAgICAgZW5jb2Rpbmc9c3Rkb3V0LmVuY29kaW5nLAorICAgICAgICBlcnJvcnM9ImJhY2tzbGFzaHJlcGxhY2UiLAorICAgICAgICBjbG9zZWZkPUZhbHNlLAorICAgICAgICBuZXdsaW5lPSdcbicpCisKKyAgICBkZWYgcmVzdG9yZV9zdGRvdXQoKToKKyAgICAgICAgc3lzLnN0ZG91dC5jbG9zZSgpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKKyAgICBhdGV4aXQucmVnaXN0ZXIocmVzdG9yZV9zdGRvdXQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5IGIvTGliL3Rlc3QvbG9ja190ZXN0cy5weQppbmRleCBhNjRhYTE4Li5hNmNiM2IxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKQEAgLTcsNiArNyw3IEBACiBmcm9tIF90aHJlYWQgaW1wb3J0IHN0YXJ0X25ld190aHJlYWQsIFRJTUVPVVRfTUFYCiBpbXBvcnQgdGhyZWFkaW5nCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCkBAIC0xOTgsNiArMTk5LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0c1swXSkKICAgICAgICAgc2VsZi5hc3NlcnRUaW1lb3V0KHJlc3VsdHNbMV0sIDAuNSkKIAorICAgIGRlZiB0ZXN0X3dlYWtyZWZfZXhpc3RzKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlZigpKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9kZWxldGVkKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKGxvY2spCisgICAgICAgIGRlbCBsb2NrCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlZigpKQorCiAKIGNsYXNzIExvY2tUZXN0cyhCYXNlTG9ja1Rlc3RzKToKICAgICAiIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5IGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKaW5kZXggODFkMDRmOC4uZTQzMjZkNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKKysrIGIvTGliL3Rlc3QvbWFrZV9zc2xfY2VydHMucHkKQEAgLTMsNyArMyw2IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHNodXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGYyNTJhMGEuLjhkZWI1NmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTEwMDAsNyArMTAwMCw3IEBACiAgICAgICAgICAgICBiJzAnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1AKICAgICAgICAgICAgIGInMScsICAgICAgICAgICAgICAgICAgICAgICAjIFBPUF9NQVJLCiAgICAgICAgICAgICBiJzInLCAgICAgICAgICAgICAgICAgICAgICAgIyBEVVAKLSAgICAgICAgICAgICMgYicoMicsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKDInLAogICAgICAgICAgICAgYidSJywgICAgICAgICAgICAgICAgICAgICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJylSJywKICAgICAgICAgICAgIGInYScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORApAQCAtMTAwOSw3ICsxMDA5LDcgQEAKICAgICAgICAgICAgIGInTmInLAogICAgICAgICAgICAgYidkJywgICAgICAgICAgICAgICAgICAgICAgICMgRElDVAogICAgICAgICAgICAgYidlJywgICAgICAgICAgICAgICAgICAgICAgICMgQVBQRU5EUwotICAgICAgICAgICAgIyBiJyhlJywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhlJywKICAgICAgICAgICAgIGInaWJ1aWx0aW5zXG5saXN0XG4nLCAgICAgICAjIElOU1QKICAgICAgICAgICAgIGInbCcsICAgICAgICAgICAgICAgICAgICAgICAjIExJU1QKICAgICAgICAgICAgIGInbycsICAgICAgICAgICAgICAgICAgICAgICAjIE9CSgpAQCAtMTAyMiw3ICsxMDIyLDcgQEAKICAgICAgICAgICAgIGInTk5zJywKICAgICAgICAgICAgIGIndCcsICAgICAgICAgICAgICAgICAgICAgICAjIFRVUExFCiAgICAgICAgICAgICBiJ3UnLCAgICAgICAgICAgICAgICAgICAgICAgIyBTRVRJVEVNUwotICAgICAgICAgICAgIyBiJyh1JywgICAgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgZG9lc24ndCByYWlzZQorICAgICAgICAgICAgYicodScsCiAgICAgICAgICAgICBiJ30oTnUnLAogICAgICAgICAgICAgYidceDgxJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKCiAgICAgICAgICAgICBiJylceDgxJywKQEAgLTEwMzMsNyArMTAzMyw3IEBACiAgICAgICAgICAgICBiJ05ceDg3JywKICAgICAgICAgICAgIGInTk5ceDg3JywKICAgICAgICAgICAgIGInXHg5MCcsICAgICAgICAgICAgICAgICAgICAjIEFERElURU1TCi0gICAgICAgICAgICAjIGInKFx4OTAnLCAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGInKFx4OTAnLAogICAgICAgICAgICAgYidceDkxJywgICAgICAgICAgICAgICAgICAgICMgRlJPWkVOU0VUCiAgICAgICAgICAgICBiJ1x4OTInLCAgICAgICAgICAgICAgICAgICAgIyBORVdPQkpfRVgKICAgICAgICAgICAgIGInKX1ceDkyJywKQEAgLTEwNDYsNyArMTA0Niw3IEBACiAKICAgICBkZWYgdGVzdF9iYWRfbWFyayhzZWxmKToKICAgICAgICAgYmFkcGlja2xlcyA9IFsKLSAgICAgICAgICAgICMgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAorICAgICAgICAgICAgYidOKC4nLCAgICAgICAgICAgICAgICAgICAgICMgU1RPUAogICAgICAgICAgICAgYidOKDInLCAgICAgICAgICAgICAgICAgICAgICMgRFVQCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKShSJywgICAgIyBSRURVQ0UKICAgICAgICAgICAgIGInY2J1aWx0aW5zXG5saXN0XG4oKVInLApAQCAtMTA4MSw3ICsxMDgxLDcgQEAKICAgICAgICAgICAgIGInTihceDk0JywgICAgICAgICAgICAgICAgICAjIE1FTU9JWkUKICAgICAgICAgXQogICAgICAgICBmb3IgcCBpbiBiYWRwaWNrbGVzOgotICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX21hcmtfZXJyb3JzLCBwKQorICAgICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKHNlbGYuYmFkX3N0YWNrX2Vycm9ycywgcCkKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9kYXRhKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3VucGlja2xpbmdfZXJyb3IoRU9GRXJyb3IsIGInJykKQEAgLTE4NTUsMTYgKzE4NTUsMTQgQEAKICAgICAgICAgeC5hYmMgPSA2NjYKICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHByb3RvPXByb3RvKToKLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgeCwgcHJvdG8pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgaWYgcHJvdG8gPCAxOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInXG5MNjQyMDYnLCBzKSAgIyBMT05HCiAgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNXHhjZVx4ZmEnLCBzKSAgIyBCSU5JTlQyCisgICAgICAgICAgICAgICAgZWxpZiBwcm90byA8IDQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidYXHgwNFx4MDBceDAwXHgwMEZBQ0UnLCBzKSAgIyBCSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHByb3RvID49IDQKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1x4OGNceDA0RkFDRScsIHMpICAjIFNIT1JUX0JJTlVOSUNPREUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkpfRVgsIHMpLApAQCAtMjU4MywxMSArMjU4MSw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGluZ0Vycm9yLCBCYWRQaWNrbGVyKCkuZHVtcCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocGlja2xlLlVucGlja2xpbmdFcnJvciwgQmFkVW5waWNrbGVyKCkubG9hZCkKIAotICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKLSAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAotICAgICAgICBzID0gYnl0ZXMoWzB4NTgsIDAsIDAsIDAsIDB4NTRdKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgcGlja2xlLmxvYWRzLCBzKQotCiAKIGNsYXNzIEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvcmVncnRlc3QucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBmZWNmZDA5Li4yMWIwZWRmCi0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC02LDE2MDQgKzYsMzMgQEAKIFJ1biB0aGlzIHNjcmlwdCB3aXRoIC1oIG9yIC0taGVscCBmb3IgZG9jdW1lbnRhdGlvbi4KICIiIgogCi1VU0FHRSA9ICIiIlwKLXB5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCi0iIiIKLQotREVTQ1JJUFRJT04gPSAiIiJcCi1SdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCi0KLUlmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCi10aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCi10aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCi0KLUZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZwotY29tbWFuZCBsaW5lOgotCi1weXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KLSIiIgotCi1FUElMT0cgPSAiIiJcCi1BZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgotCi0tciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCi1pbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQotdGVzdCBvcmRlcnMuCi0KLS1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCi1vciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKLXRoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKLVB5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCi1vdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCi10aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgotV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKLWlzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCi1kb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bwotY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KLQotLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAotbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KLVRoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKLXJlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKLXRoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgotCi0tZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQotb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCi1saW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgotd2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KLQotLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KLWxlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCi1GcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KLQotLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bwotc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAotYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCi10ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgotb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCi1yZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKLSJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCi0KLS1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKLXR5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KLTIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCi10ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCi1zZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCi13aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQotdGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKLXNob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91Ci1zaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKLXRoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Ci10YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKLWxpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKLXRvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKLWdlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgotCi0tdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAotc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgotVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKLXJlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKLQotICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCi0KLSAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCi0KLSAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgotICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgotICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCi0KLSAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCi0gICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KLQotICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQotICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQotICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgotCi0gICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yawotICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCi0KLSAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAotICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCi0KLSAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KLQotICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KLQotICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KLQotICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KLQotVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKLWV4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKLW9wdGlvbiAnLXVhbGwsLWd1aScuCi0iIiIKLQogIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgogaW1wb3J0IGltcG9ydGxpYgogCi1pbXBvcnQgYXJncGFyc2UKLWltcG9ydCBidWlsdGlucwotaW1wb3J0IGZhdWx0aGFuZGxlcgotaW1wb3J0IGlvCi1pbXBvcnQganNvbgotaW1wb3J0IGxvY2FsZQotaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCi1pbXBvcnQgcmFuZG9tCi1pbXBvcnQgcmUKLWltcG9ydCBzaHV0aWwKLWltcG9ydCBzaWduYWwKIGltcG9ydCBzeXMKLWltcG9ydCBzeXNjb25maWcKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB1bml0dGVzdAotaW1wb3J0IHdhcm5pbmdzCi1mcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdC5saWJyZWdydGVzdCBpbXBvcnQgbWFpbgogCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHRocmVhZGluZyA9IE5vbmUKLXRyeToKLSAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCiAKKyMgQWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgKGp1c3QgaW4gY2FzZSkKK21haW5faW5fdGVtcF9jd2QgPSBtYWluCiAKLSMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KLSMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQotIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KLSMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgotIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCi0jIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKLSMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQotIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgotIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgotIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KLWZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgotICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbb3MucGF0aC5hYnNwYXRoKHBhdGgpIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KLSAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6Ci0gICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCiAKLQotIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAotIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgotIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCi0jIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCi0jIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAotIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KLWlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCByZXNvdXJjZQotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQotICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQotICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCi0KLSMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgotUEFTU0VEID0gMQotRkFJTEVEID0gMAotRU5WX0NIQU5HRUQgPSAtMQotU0tJUFBFRCA9IC0yCi1SRVNPVVJDRV9ERU5JRUQgPSAtMwotSU5URVJSVVBURUQgPSAtNAotQ0hJTERfRVJST1IgPSAtNSAgICMgZXJyb3IgaW4gYSBjaGlsZCBwcm9jZXNzCi0KLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCi1SRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKLSAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCi0KLSMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKLSMgdG8ga2VlcCB0aGUgdGVzdCBmaWxlcyBpbiBhIHN1YmZvbGRlci4gIFRoaXMgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKLSMgZmlsZXMgdXNpbmcgdGhlICJtYWtlIGRpc3RjbGVhbiIgY29tbWFuZC4KLWlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICBURU1QRElSID0gb3MucGF0aC5qb2luKHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdidWlsZCcpCi1lbHNlOgotICAgIFRFTVBESVIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKLVRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoVEVNUERJUikKLQotY2xhc3MgX0FyZ1BhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6Ci0KLSAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6Ci0gICAgICAgIHN1cGVyKCkuZXJyb3IobWVzc2FnZSArICJcblBhc3MgLWggb3IgLS1oZWxwIGZvciBjb21wbGV0ZSBoZWxwLiIpCi0KLWRlZiBfY3JlYXRlX3BhcnNlcigpOgotICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgotICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KLSAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQotCi0gICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KLSAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KLSAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJwotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQotICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCi0gICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1QJywgJy0tcGdvJywgZGVzdD0ncGdvJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZW5hYmxlIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiB0cmFpbmluZycpCi0KLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmdzJywgbmFyZ3M9YXJncGFyc2UuUkVNQUlOREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKLQotICAgIHJldHVybiBwYXJzZXIKLQotZGVmIHJlbGF0aXZlX2ZpbGVuYW1lKHN0cmluZyk6Ci0gICAgIyBDV0QgaXMgcmVwbGFjZWQgd2l0aCBhIHRlbXBvcmFyeSBkaXIgYmVmb3JlIGNhbGxpbmcgbWFpbigpLCBzbyB3ZQotICAgICMgam9pbiBpdCB3aXRoIHRoZSBzYXZlZCBDV0Qgc28gaXQgZW5kcyB1cCB3aGVyZSB0aGUgdXNlciBleHBlY3RzLgotICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgc3RyaW5nKQotCi1kZWYgaHVudHJsZWFrcyhzdHJpbmcpOgotICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQotICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgotICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKLSAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCi0gICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQotICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0Ci0gICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKLSAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCi0KLWRlZiByZXNvdXJjZXNfbGlzdChzdHJpbmcpOgotICAgIHUgPSBbeC5sb3dlcigpIGZvciB4IGluIHN0cmluZy5zcGxpdCgnLCcpXQotICAgIGZvciByIGluIHU6Ci0gICAgICAgIGlmIHIgPT0gJ2FsbCcgb3IgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgIHIgPSByWzE6XQotICAgICAgICBpZiByIG5vdCBpbiBSRVNPVVJDRV9OQU1FUzoKLSAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKCdpbnZhbGlkIHJlc291cmNlOiAnICsgcikKLSAgICByZXR1cm4gdQotCi1kZWYgX3BhcnNlX2FyZ3MoYXJncywgKiprd2FyZ3MpOgotICAgICMgRGVmYXVsdHMKLSAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSh0ZXN0ZGlyPU5vbmUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsCi0gICAgICAgICBleGNsdWRlPUZhbHNlLCBzaW5nbGU9RmFsc2UsIHJhbmRvbWl6ZT1GYWxzZSwgZnJvbWZpbGU9Tm9uZSwKLSAgICAgICAgIGZpbmRsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLCB0cmFjZT1GYWxzZSwgY292ZXJkaXI9J2NvdmVyYWdlJywKLSAgICAgICAgIHJ1bmxlYWtzPUZhbHNlLCBodW50cmxlYWtzPUZhbHNlLCB2ZXJib3NlMj1GYWxzZSwgcHJpbnRfc2xvdz1GYWxzZSwKLSAgICAgICAgIHJhbmRvbV9zZWVkPU5vbmUsIHVzZV9tcD1Ob25lLCB2ZXJib3NlMz1GYWxzZSwgZm9yZXZlcj1GYWxzZSwKLSAgICAgICAgIGhlYWRlcj1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsIHBnbz1GYWxzZSkKLSAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKToKLSAgICAgICAgaWYgbm90IGhhc2F0dHIobnMsIGspOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclciBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhpcyBmdW5jdGlvbicgJSBrKQotICAgICAgICBzZXRhdHRyKG5zLCBrLCB2KQotICAgIGlmIG5zLnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKLSAgICAgICAgbnMudXNlX3Jlc291cmNlcyA9IFtdCi0KLSAgICBwYXJzZXIgPSBfY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnBhcnNlX2FyZ3MoYXJncz1hcmdzLCBuYW1lc3BhY2U9bnMpCi0KLSAgICBpZiBucy5zaW5nbGUgYW5kIG5zLmZyb21maWxlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMudHJhY2U6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5maW5kbGVha3M6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLWwgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMudXNlX21wIGFuZCBucy5tZW1saW1pdDoKLSAgICAgICAgcGFyc2VyLmVycm9yKCItTSBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy5mYWlsZmFzdCBhbmQgbm90IChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UzKToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItRy8tLWZhaWxmYXN0IG5lZWRzIGVpdGhlciAtdiBvciAtVyIpCi0KLSAgICBpZiBucy5xdWlldDoKLSAgICAgICAgbnMudmVyYm9zZSA9IDAKLSAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgotICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6Ci0gICAgICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6Ci0gICAgICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50KCJXYXJuaW5nOiBUaGUgdGltZW91dCBvcHRpb24gcmVxdWlyZXMgIgotICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlciIpCi0gICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQotICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6Ci0gICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAotICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQotICAgICAgICBpZiBucy51c2VfbXAgPT0gMToKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IE5vbmUKLSAgICBpZiBucy51c2U6Ci0gICAgICAgIGZvciBhIGluIG5zLnVzZToKLSAgICAgICAgICAgIGZvciByIGluIGE6Ci0gICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgciA9PSAnbm9uZSc6Ci0gICAgICAgICAgICAgICAgICAgIGRlbCBucy51c2VfcmVzb3VyY2VzWzpdCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKLSAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgICAgICAgICBpZiByZW1vdmU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCi0gICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiBucy51c2VfcmVzb3VyY2VzOgotICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLmFwcGVuZChyKQotICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIG5vdCBOb25lOgotICAgICAgICBucy5yYW5kb21pemUgPSBUcnVlCi0KLSAgICByZXR1cm4gbnMKLQotCi1kZWYgcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0bmFtZSwgbnMpOgotICAgICIiIlJ1biB0aGUgZ2l2ZW4gdGVzdCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCAtLXNsYXZlYXJncy4KLQotICAgIG5zIGlzIHRoZSBvcHRpb24gTmFtZXNwYWNlIHBhcnNlZCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuIHJlZ3J0ZXN0Ci0gICAgaXMgaW52b2tlZCBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgLS1zbGF2ZWFyZ3MgYXJndW1lbnQ7IHdoZW4gdGhlCi0gICAgc3VicHJvY2VzcyBleGl0cywgaXRzIHJldHVybiBjb2RlLCBzdGRvdXQgYW5kIHN0ZGVyciBhcmUgcmV0dXJuZWQgYXMgYQotICAgIDMtdHVwbGUuCi0gICAgIiIiCi0gICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQotICAgIGJhc2VfY21kID0gKFtzeXMuZXhlY3V0YWJsZV0gKyBzdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpICsKLSAgICAgICAgICAgICAgICBbJy1YJywgJ2ZhdWx0aGFuZGxlcicsICctbScsICd0ZXN0LnJlZ3J0ZXN0J10pCi0gICAgIyByZXF1aXJlZCB0byBzcGF3biBhIG5ldyBwcm9jZXNzIHdpdGggUEdPIGZsYWcgb24vb2ZmCi0gICAgaWYgbnMucGdvOgotICAgICAgICBiYXNlX2NtZCA9IGJhc2VfY21kICsgWyctLXBnbyddCi0gICAgc2xhdmVhcmdzID0gKAotICAgICAgICAgICAgKHRlc3RuYW1lLCBucy52ZXJib3NlLCBucy5xdWlldCksCi0gICAgICAgICAgICBkaWN0KGh1bnRybGVha3M9bnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlcz1ucy51c2VfcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgbWF0Y2hfdGVzdHM9bnMubWF0Y2hfdGVzdHMsIHBnbz1ucy5wZ28pKQotICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCi0gICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgotICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KLSAgICBwb3BlbiA9IFBvcGVuKGJhc2VfY21kICsgWyctLXNsYXZlYXJncycsIGpzb24uZHVtcHMoc2xhdmVhcmdzKV0sCi0gICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCi0gICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSwKLSAgICAgICAgICAgICAgICAgIGN3ZD1zdXBwb3J0LlNBVkVEQ1dEKQotICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQotICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKLSAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKLQotCi1kZWYgbWFpbih0ZXN0cz1Ob25lLCAqKmt3YXJncyk6Ci0gICAgIiIiRXhlY3V0ZSBhIHRlc3Qgc3VpdGUuCi0KLSAgICBUaGlzIGFsc28gcGFyc2VzIGNvbW1hbmQtbGluZSBvcHRpb25zIGFuZCBtb2RpZmllcyBpdHMgYmVoYXZpb3IKLSAgICBhY2NvcmRpbmdseS4KLQotICAgIHRlc3RzIC0tIGEgbGlzdCBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGVzdCBuYW1lcyAob3B0aW9uYWwpCi0gICAgdGVzdGRpciAtLSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRlc3RzIChvcHRpb25hbCkKLQotICAgIFVzZXJzIG90aGVyIHRoYW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdpbGwgY2VydGFpbmx5IHdhbnQgdG8KLSAgICBzcGVjaWZ5IHRlc3RkaXI7IGlmIGl0J3Mgb21pdHRlZCwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQotICAgIFB5dGhvbiB0ZXN0IHN1aXRlIGlzIHNlYXJjaGVkIGZvci4KLQotICAgIElmIHRoZSB0ZXN0cyBhcmd1bWVudCBpcyBvbWl0dGVkLCB0aGUgdGVzdHMgbGlzdGVkIG9uIHRoZQotICAgIGNvbW1hbmQtbGluZSB3aWxsIGJlIHVzZWQuICBJZiB0aGF0J3MgZW1wdHksIHRvbywgdGhlbiBhbGwgKi5weQotICAgIGZpbGVzIGJlZ2lubmluZyB3aXRoIHRlc3RfIHdpbGwgYmUgdXNlZC4KLQotICAgIFRoZSBvdGhlciBkZWZhdWx0IGFyZ3VtZW50cyAodmVyYm9zZSwgcXVpZXQsIGV4Y2x1ZGUsCi0gICAgc2luZ2xlLCByYW5kb21pemUsIGZpbmRsZWFrcywgdXNlX3Jlc291cmNlcywgdHJhY2UsIGNvdmVyZGlyLAotICAgIHByaW50X3Nsb3csIGFuZCByYW5kb21fc2VlZCkgYWxsb3cgcHJvZ3JhbW1lcnMgY2FsbGluZyBtYWluKCkKLSAgICBkaXJlY3RseSB0byBzZXQgdGhlIHZhbHVlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBieSBmbGFncwotICAgIG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgIiIiCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIGZhdGFsIGVycm9ycyAoZS5nLiBzZWdmYXVsdCkKLSAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKGFsbF90aHJlYWRzPVRydWUpCi0KLSAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gU0lHQUxSTSBvciBTSUdVU1IxIHNpZ25hbAotICAgIHNpZ25hbHMgPSBbXQotICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpOgotICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHQUxSTSkKLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR1VTUjEpCi0gICAgZm9yIHNpZ251bSBpbiBzaWduYWxzOgotICAgICAgICBmYXVsdGhhbmRsZXIucmVnaXN0ZXIoc2lnbnVtLCBjaGFpbj1UcnVlKQotCi0gICAgcmVwbGFjZV9zdGRvdXQoKQotCi0gICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCi0KLSAgICBucyA9IF9wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgKiprd2FyZ3MpCi0KLSAgICBpZiBucy5odW50cmxlYWtzOgotICAgICAgICAjIEF2b2lkIGZhbHNlIHBvc2l0aXZlcyBkdWUgdG8gdmFyaW91cyBjYWNoZXMKLSAgICAgICAgIyBmaWxsaW5nIHNsb3dseSB3aXRoIHJhbmRvbSBkYXRhOgotICAgICAgICB3YXJtX2NhY2hlcygpCi0gICAgaWYgbnMubWVtbGltaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQuc2V0X21lbWxpbWl0KG5zLm1lbWxpbWl0KQotICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKLSAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGdjLnNldF90aHJlc2hvbGQobnMudGhyZXNob2xkKQotICAgIGlmIG5zLm5vd2luZG93czoKLSAgICAgICAgcHJpbnQoJ1RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAnCi0gICAgICAgICAgICAgICdVc2UgLXZ2IHRvIGRpc3BsYXkgYXNzZXJ0aW9ucyBpbiBzdGRlcnIuJykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBtc3ZjcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKLSAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCi0gICAgaWYgbnMud2FpdDoKLSAgICAgICAgaW5wdXQoIlByZXNzIGFueSBrZXkgdG8gY29udGludWUuLi4iKQotCi0gICAgaWYgbnMuc2xhdmVhcmdzIGlzIG5vdCBOb25lOgotICAgICAgICBhcmdzLCBrd2FyZ3MgPSBqc29uLmxvYWRzKG5zLnNsYXZlYXJncykKLSAgICAgICAgaWYga3dhcmdzLmdldCgnaHVudHJsZWFrcycpOgotICAgICAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QoKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKLSAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZToKLSAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQotICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCi0gICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0KSkKLSAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgIGdvb2QgPSBbXQotICAgIGJhZCA9IFtdCi0gICAgc2tpcHBlZCA9IFtdCi0gICAgcmVzb3VyY2VfZGVuaWVkcyA9IFtdCi0gICAgZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCi0gICAgaW50ZXJydXB0ZWQgPSBGYWxzZQotCi0gICAgaWYgbnMuZmluZGxlYWtzOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgZ2MKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcHJpbnQoJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGZpbmRsZWFrcy4nKQotICAgICAgICAgICAgbnMuZmluZGxlYWtzID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90Ci0gICAgICAgICAgICAjIGZyZWVhYmxlIGJ5IHJlZmVyZW5jZSBjb3VudGluZyBhbG9uZS4gIEJ5IGRlZmF1bHQgb25seQotICAgICAgICAgICAgIyBnYXJiYWdlIHRoYXQgaXMgbm90IGNvbGxlY3RhYmxlIGJ5IHRoZSBHQyBpcyByZXBvcnRlZC4KLSAgICAgICAgICAgICNnYy5zZXRfZGVidWcoZ2MuREVCVUdfU0FWRUFMTCkKLSAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UgPSBbXQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgdW5pdHRlc3QuQmFzZVRlc3RTdWl0ZS5fY2xlYW51cCA9IEZhbHNlCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGZwOgotICAgICAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCi0gICAgICAgICAgICAgICAgdGVzdHMgPSBbbmV4dF90ZXN0XQotICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgIGlmIG5zLmZyb21maWxlOgotICAgICAgICB0ZXN0cyA9IFtdCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgbnMuZnJvbWZpbGUpKSBhcyBmcDoKLSAgICAgICAgICAgIGNvdW50X3BhdCA9IHJlLmNvbXBpbGUocidcW1xzKlxkKy9ccypcZCtcXScpCi0gICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKLSAgICAgICAgICAgICAgICBsaW5lID0gY291bnRfcGF0LnN1YignJywgbGluZSkKLSAgICAgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGlmIGd1dHMgYW5kIG5vdCBndXRzWzBdLnN0YXJ0c3dpdGgoJyMnKToKLSAgICAgICAgICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKGd1dHMpCi0KLSAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgotICAgIHJlbW92ZXB5KG5zLmFyZ3MpCi0gICAgcmVtb3ZlcHkodGVzdHMpCi0KLSAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCi0gICAgbm90dGVzdHMgPSBOT1RURVNUUy5jb3B5KCkKLSAgICBpZiBucy5leGNsdWRlOgotICAgICAgICBmb3IgYXJnIGluIG5zLmFyZ3M6Ci0gICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6Ci0gICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKLSAgICAgICAgICAgIG5vdHRlc3RzLmFkZChhcmcpCi0gICAgICAgIG5zLmFyZ3MgPSBbXQotCi0gICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgotICAgIGlmIChucy52ZXJib3NlIG9yIG5zLmhlYWRlciBvcgotICAgICAgICAgICAgbm90IChucy5wZ28gb3IgbnMucXVpZXQgb3IgbnMuc2luZ2xlIG9yIHRlc3RzIG9yIG5zLmFyZ3MpKToKLSAgICAgICAgIyBQcmludCBiYXNpYyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgotICAgICAgICBwcmludCgiPT0iLCBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgKnN5cy52ZXJzaW9uLnNwbGl0KCkpCi0gICAgICAgIHByaW50KCI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcikKLSAgICAgICAgcHJpbnQoIj09ICAiLCAiaGFzaCBhbGdvcml0aG06Iiwgc3lzLmhhc2hfaW5mby5hbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgIjY0Yml0IiBpZiBzeXMubWF4c2l6ZSA+IDIqKjMyIGVsc2UgIjMyYml0IikKLSAgICAgICAgcHJpbnQoIj09ICAiLCBvcy5nZXRjd2QoKSkKLSAgICAgICAgcHJpbnQoIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MpCi0KLSAgICAjIGlmIHRlc3RkaXIgaXMgc2V0LCB0aGVuIHdlIGFyZSBub3QgcnVubmluZyB0aGUgcHl0aG9uIHRlc3RzIHN1aXRlLCBzbwotICAgICMgZG9uJ3QgYWRkIGRlZmF1bHQgdGVzdHMgdG8gYmUgZXhlY3V0ZWQgb3Igc2tpcHBlZCAocGFzcyBlbXB0eSB2YWx1ZXMpCi0gICAgaWYgbnMudGVzdGRpcjoKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgbGlzdCgpLCBzZXQoKSkKLSAgICBlbHNlOgotICAgICAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyhucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCi0KLSAgICBzZWxlY3RlZCA9IHRlc3RzIG9yIG5zLmFyZ3Mgb3IgYWxsdGVzdHMKLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWRbOjFdCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1thbGx0ZXN0cy5pbmRleChzZWxlY3RlZFswXSkrMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQotICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgotICAgIGlmIG5zLnN0YXJ0OgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkZWwgc2VsZWN0ZWRbOnNlbGVjdGVkLmluZGV4KG5zLnN0YXJ0KV0KLSAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiQ291bGRuJ3QgZmluZCBzdGFydGluZyB0ZXN0ICglcyksIHVzaW5nIGFsbCB0ZXN0cyIgJSBucy5zdGFydCkKLSAgICBpZiBucy5yYW5kb21pemU6Ci0gICAgICAgIGlmIG5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6Ci0gICAgICAgICAgICBucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCi0gICAgICAgIHJhbmRvbS5zZWVkKG5zLnJhbmRvbV9zZWVkKQotICAgICAgICBwcmludCgiVXNpbmcgcmFuZG9tIHNlZWQiLCBucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZWN0ZWQpCi0gICAgaWYgbnMudHJhY2U6Ci0gICAgICAgIGltcG9ydCB0cmFjZSwgdGVtcGZpbGUKLSAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLmJhc2VfcHJlZml4LCBzeXMuYmFzZV9leGVjX3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuZ2V0dGVtcGRpcigpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCi0KLSAgICB0ZXN0X3RpbWVzID0gW10KLSAgICBzdXBwb3J0LnZlcmJvc2UgPSBucy52ZXJib3NlICAgICAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKLSAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCi0gICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCi0KLSAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KToKLSAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAotICAgICAgICBpZiBvayBub3QgaW4gKENISUxEX0VSUk9SLCBJTlRFUlJVUFRFRCk6Ci0gICAgICAgICAgICB0ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKLSAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgotICAgICAgICAgICAgZ29vZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBGQUlMRUQ6Ci0gICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6Ci0gICAgICAgICAgICBlbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IFJFU09VUkNFX0RFTklFRDoKLSAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCi0gICAgICAgICAgICByZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQotCi0gICAgaWYgbnMuZm9yZXZlcjoKLSAgICAgICAgZGVmIHRlc3RfZm9yZXZlcih0ZXN0cz1saXN0KHNlbGVjdGVkKSk6Ci0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICB0ZXN0cyA9IHRlc3RfZm9yZXZlcigpCi0gICAgICAgIHRlc3RfY291bnQgPSAnJwotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gMwotICAgIGVsc2U6Ci0gICAgICAgIHRlc3RzID0gaXRlcihzZWxlY3RlZCkKLSAgICAgICAgdGVzdF9jb3VudCA9ICcve30nLmZvcm1hdChsZW4oc2VsZWN0ZWQpKQotICAgICAgICB0ZXN0X2NvdW50X3dpZHRoID0gbGVuKHRlc3RfY291bnQpIC0gMQotCi0gICAgaWYgbnMudXNlX21wOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKLSAgICAgICAgICAgIHN5cy5leGl0KDIpCi0gICAgICAgIGZyb20gcXVldWUgaW1wb3J0IFF1ZXVlCi0gICAgICAgIGRlYnVnX291dHB1dF9wYXQgPSByZS5jb21waWxlKHIiXFtcZCsgcmVmcywgXGQrIGJsb2Nrc1xdJCIpCi0gICAgICAgIG91dHB1dCA9IFF1ZXVlKCkKLSAgICAgICAgcGVuZGluZyA9IE11bHRpcHJvY2Vzc1Rlc3RzKHRlc3RzKQotICAgICAgICBkZWYgd29yaygpOgotICAgICAgICAgICAgIyBBIHdvcmtlciB0aHJlYWQuCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IG5leHQocGVuZGluZykKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICByZXRjb2RlLCBzdGRvdXQsIHN0ZGVyciA9IHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdCwgbnMpCi0gICAgICAgICAgICAgICAgICAgICMgU3RyaXAgbGFzdCByZWZjb3VudCBvdXRwdXQgbGluZSBpZiBpdCBleGlzdHMsIHNpbmNlIGl0Ci0gICAgICAgICAgICAgICAgICAgICMgY29tZXMgZnJvbSB0aGUgc2h1dGRvd24gb2YgdGhlIGludGVycHJldGVyIGluIHRoZSBzdWJjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBkZWJ1Z19vdXRwdXRfcGF0LnN1YigiIiwgc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKLSAgICAgICAgICAgICAgICAgICAgaWYgcmV0Y29kZSAhPSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKENISUxEX0VSUk9SLCAiRXhpdCBjb2RlICVzIiAlIHJldGNvZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVzdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLCByZXN1bHQpKQotICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgd29ya2VycyA9IFtUaHJlYWQodGFyZ2V0PXdvcmspIGZvciBpIGluIHJhbmdlKG5zLnVzZV9tcCldCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5zdGFydCgpCi0gICAgICAgIGZpbmlzaGVkID0gMAotICAgICAgICB0ZXN0X2luZGV4ID0gMQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IG5zLnVzZV9tcDoKLSAgICAgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gb3V0cHV0LmdldCgpCi0gICAgICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICAgICAgaWYgYmFkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9XSB7NH0iCi0gICAgICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGJhZCksIHRlc3QpKQotICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0KQotICAgICAgICAgICAgICAgIGlmIHN0ZGVyciBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3RkZXJyLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJDaGlsZCBlcnJvciBvbiB7fToge30iLmZvcm1hdCh0ZXN0LCByZXN1bHRbMV0pKQotICAgICAgICAgICAgICAgIHRlc3RfaW5kZXggKz0gMQotICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgIHBlbmRpbmcuaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKLSAgICAgICAgICAgIHdvcmtlci5qb2luKCkKLSAgICBlbHNlOgotICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgotICAgICAgICAgICAgaWYgbm90IG5zLnF1aWV0OgotICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgZm10ID0gIlt7MTp7MH19ezJ9L3szfV0gezR9IgotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgIHByaW50KGZtdC5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgIHRlc3RfY291bnRfd2lkdGgsIHRlc3RfaW5kZXgsIHRlc3RfY291bnQsIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgICAgIGlmIG5zLnRyYWNlOgotICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKLSAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KLSAgICAgICAgICAgICAgICB0cmFjZXIucnVuY3R4KCdydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LCB0aW1lb3V0PW5zLnRpbWVvdXQpJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9dmFycygpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QodGVzdCwgbnMudmVyYm9zZSwgbnMucXVpZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMuaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1ucy52ZXJib3NlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIGZhaWxmYXN0PW5zLmZhaWxmYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKQotICAgICAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgICAgICBpZiBnYy5nYXJiYWdlOgotICAgICAgICAgICAgICAgICAgICBwcmludCgiV2FybmluZzogdGVzdCBjcmVhdGVkIiwgbGVuKGdjLmdhcmJhZ2UpLCBlbmQ9JyAnKQotICAgICAgICAgICAgICAgICAgICBwcmludCgidW5jb2xsZWN0YWJsZSBvYmplY3QocykuIikKLSAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQotICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KLSAgICAgICAgICAgICAgICAgICAgZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKLSAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KLSAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCi0gICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKLSAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQudW5sb2FkKG1vZHVsZSkKLQotICAgIGlmIGludGVycnVwdGVkIGFuZCBub3QgbnMucGdvOgotICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQwotICAgICAgICBwcmludCgpCi0gICAgICAgIHByaW50KCJUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuIikKLSAgICAgICAgb21pdHRlZCA9IHNldChzZWxlY3RlZCkgLSBzZXQoZ29vZCkgLSBzZXQoYmFkKSAtIHNldChza2lwcGVkKQotICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCi0gICAgICAgIHByaW50bGlzdChvbWl0dGVkKQotICAgIGlmIGdvb2QgYW5kIG5vdCBucy5xdWlldCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgaWYgbm90IGJhZCBhbmQgbm90IHNraXBwZWQgYW5kIG5vdCBpbnRlcnJ1cHRlZCBhbmQgbGVuKGdvb2QpID4gMToKLSAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjb3VudChsZW4oZ29vZCksICJ0ZXN0IiksICJPSy4iKQotICAgIGlmIG5zLnByaW50X3Nsb3c6Ci0gICAgICAgIHRlc3RfdGltZXMuc29ydChyZXZlcnNlPVRydWUpCi0gICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCi0gICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHRlc3RfdGltZXNbOjEwXToKLSAgICAgICAgICAgIHByaW50KCIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpKQotICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KGJhZCkKLSAgICBpZiBlbnZpcm9ubWVudF9jaGFuZ2VkIGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAotICAgICAgICAgICAgICAgICBjb3VudChsZW4oZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQotICAgICAgICBwcmludGxpc3QoZW52aXJvbm1lbnRfY2hhbmdlZCkKLSAgICBpZiBza2lwcGVkIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihza2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IikKLSAgICAgICAgcHJpbnRsaXN0KHNraXBwZWQpCi0KLSAgICBpZiBucy52ZXJib3NlMiBhbmQgYmFkOgotICAgICAgICBwcmludCgiUmUtcnVubmluZyBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlIikKLSAgICAgICAgZm9yIHRlc3QgaW4gYmFkWzpdOgotICAgICAgICAgICAgaWYgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICBwcmludCgiUmUtcnVubmluZyB0ZXN0ICVyIGluIHZlcmJvc2UgbW9kZSIgJSB0ZXN0KQotICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbnMudmVyYm9zZSA9IFRydWUKLSAgICAgICAgICAgICAgICBvayA9IHJ1bnRlc3QodGVzdCwgVHJ1ZSwgbnMucXVpZXQsIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgcGdvPW5zLnBnbykKLSAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBzZXBhcmF0ZSBmcm9tIHRoZSBeQwotICAgICAgICAgICAgICAgIHByaW50KCkKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBva1swXSBpbiB7UEFTU0VELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVEfToKLSAgICAgICAgICAgICAgICAgICAgYmFkLnJlbW92ZSh0ZXN0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgYmFkOgotICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAndGVzdCcpLCAiZmFpbGVkIGFnYWluOiIpCi0gICAgICAgICAgICAgICAgcHJpbnRsaXN0KGJhZCkKLQotICAgIGlmIG5zLnNpbmdsZToKLSAgICAgICAgaWYgbmV4dF9zaW5nbGVfdGVzdDoKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBmcC53cml0ZShuZXh0X3NpbmdsZV90ZXN0ICsgJ1xuJykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKLQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICByID0gdHJhY2VyLnJlc3VsdHMoKQotICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9bnMuY292ZXJkaXIpCi0KLSAgICBpZiBucy5ydW5sZWFrczoKLSAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKLQotICAgIHN5cy5leGl0KGxlbihiYWQpID4gMCBvciBpbnRlcnJ1cHRlZCkKLQotCi0jIHNtYWxsIHNldCBvZiB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgd2UgaGF2ZSBhIGJhc2ljYWxseSBmdW5jdGlvbmluZyBpbnRlcnByZXRlcgotIyAoaS5lLiBpZiBhbnkgb2YgdGhlc2UgZmFpbCwgdGhlbiBhbnl0aGluZyBlbHNlIGlzIGxpa2VseSB0byBmb2xsb3cpCi1TVERURVNUUyA9IFsKLSAgICAndGVzdF9ncmFtbWFyJywKLSAgICAndGVzdF9vcGNvZGVzJywKLSAgICAndGVzdF9kaWN0JywKLSAgICAndGVzdF9idWlsdGluJywKLSAgICAndGVzdF9leGNlcHRpb25zJywKLSAgICAndGVzdF90eXBlcycsCi0gICAgJ3Rlc3RfdW5pdHRlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QnLAotICAgICd0ZXN0X2RvY3Rlc3QyJywKLSAgICAndGVzdF9zdXBwb3J0JwotXQotCi0jIHNldCBvZiB0ZXN0cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB1c2luZyByZWdydGVzdAotTk9UVEVTVFMgPSBzZXQoKQotCi1kZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKLSAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKLSAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKLSAgICB0ZXN0cyA9IFtdCi0gICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIG1vZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBtb2RbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCBpbiAoIi5weSIsICIiKSBhbmQgbW9kIG5vdCBpbiBvdGhlcnM6Ci0gICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kKQotICAgIHJldHVybiBzdGR0ZXN0cyArIHNvcnRlZCh0ZXN0cykKLQotIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgotY2xhc3MgTXVsdGlwcm9jZXNzVGVzdHMob2JqZWN0KToKLQotICAgICIiIkEgdGhyZWFkLXNhZmUgaXRlcmF0b3Igb3ZlciB0ZXN0cyBmb3IgbXVsdGlwcm9jZXNzIG1vZGUuIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMpOgotICAgICAgICBzZWxmLmludGVycnVwdGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQotICAgICAgICBzZWxmLnRlc3RzID0gdGVzdHMKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmxvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLmludGVycnVwdGVkOgotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oJ3Rlc3RzIGludGVycnVwdGVkJykKLSAgICAgICAgICAgIHJldHVybiBuZXh0KHNlbGYudGVzdHMpCi0KLWRlZiByZXBsYWNlX3N0ZG91dCgpOgotICAgICIiIlNldCBzdGRvdXQgZW5jb2RlciBlcnJvciBoYW5kbGVyIHRvIGJhY2tzbGFzaHJlcGxhY2UgKGFzIHN0ZGVyciBlcnJvcgotICAgIGhhbmRsZXIpIHRvIGF2b2lkIFVuaWNvZGVFbmNvZGVFcnJvciB3aGVuIHByaW50aW5nIGEgdHJhY2ViYWNrIiIiCi0gICAgaW1wb3J0IGF0ZXhpdAotCi0gICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgIHN5cy5zdGRvdXQgPSBvcGVuKHN0ZG91dC5maWxlbm8oKSwgJ3cnLAotICAgICAgICBlbmNvZGluZz1zdGRvdXQuZW5jb2RpbmcsCi0gICAgICAgIGVycm9ycz0iYmFja3NsYXNocmVwbGFjZSIsCi0gICAgICAgIGNsb3NlZmQ9RmFsc2UsCi0gICAgICAgIG5ld2xpbmU9J1xuJykKLQotICAgIGRlZiByZXN0b3JlX3N0ZG91dCgpOgotICAgICAgICBzeXMuc3Rkb3V0LmNsb3NlKCkKLSAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAotICAgIGF0ZXhpdC5yZWdpc3RlcihyZXN0b3JlX3N0ZG91dCkKLQotZGVmIHJ1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQsCi0gICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCB1c2VfcmVzb3VyY2VzPU5vbmUsCi0gICAgICAgICAgICBvdXRwdXRfb25fZmFpbHVyZT1GYWxzZSwgZmFpbGZhc3Q9RmFsc2UsIG1hdGNoX3Rlc3RzPU5vbmUsCi0gICAgICAgICAgICB0aW1lb3V0PU5vbmUsICosIHBnbz1GYWxzZSk6Ci0gICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCi0KLSAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0Ci0gICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCi0gICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCi0gICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKLSAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCi0gICAgdXNlX3Jlc291cmNlcyAtLSBsaXN0IG9mIGV4dHJhIHJlc291cmNlcyB0byB1c2UKLSAgICBvdXRwdXRfb25fZmFpbHVyZSAtLSBpZiB0cnVlLCBkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUKLSAgICB0aW1lb3V0IC0tIGR1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgbW9yZSB0aGFuCi0gICAgICAgICAgICAgICB0aW1lb3V0IHNlY29uZHMKLSAgICBmYWlsZmFzdCwgbWF0Y2hfdGVzdHMgLS0gU2VlIHJlZ3J0ZXN0IGNvbW1hbmQtbGluZSBmbGFncyBmb3IgdGhlc2UuCi0gICAgcGdvIC0tIGlmIHRydWUsIGRvIG5vdCBwcmludCB1bm5lY2Vzc2FyeSBpbmZvIHdoZW4gcnVubmluZyB0aGUgdGVzdAotICAgICAgICAgICBmb3IgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIGJ1aWxkCi0KLSAgICBSZXR1cm5zIHRoZSB0dXBsZSByZXN1bHQsIHRlc3RfdGltZSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzOgotICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCi0gICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCi0gICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgotICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50Ci0gICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKLSAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAotICAgICIiIgotICAgIGlmIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IHVzZV9yZXNvdXJjZXMKLSAgICB1c2VfdGltZW91dCA9ICh0aW1lb3V0IGlzIG5vdCBOb25lKQotICAgIGlmIHVzZV90aW1lb3V0OgotICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIodGltZW91dCwgZXhpdD1UcnVlKQotICAgIHRyeToKLSAgICAgICAgc3VwcG9ydC5tYXRjaF90ZXN0cyA9IG1hdGNoX3Rlc3RzCi0gICAgICAgIGlmIGZhaWxmYXN0OgotICAgICAgICAgICAgc3VwcG9ydC5mYWlsZmFzdCA9IFRydWUKLSAgICAgICAgaWYgb3V0cHV0X29uX2ZhaWx1cmU6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSBUcnVlCi0KLSAgICAgICAgICAgICMgUmV1c2UgdGhlIHNhbWUgaW5zdGFuY2UgdG8gYWxsIGNhbGxzIHRvIHJ1bnRlc3QoKS4gU29tZQotICAgICAgICAgICAgIyB0ZXN0cyBrZWVwIGEgcmVmZXJlbmNlIHRvIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycgotICAgICAgICAgICAgIyAoZWcuIHRlc3RfYXJncGFyc2UpLgotICAgICAgICAgICAgaWYgcnVudGVzdC5zdHJpbmdpbyBpcyBOb25lOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBydW50ZXN0LnN0cmluZ2lvID0gc3RyZWFtCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJ1bnRlc3Quc3RyaW5naW8KLSAgICAgICAgICAgICAgICBzdHJlYW0uc2VlaygwKQotICAgICAgICAgICAgICAgIHN0cmVhbS50cnVuY2F0ZSgpCi0KLSAgICAgICAgICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAotICAgICAgICAgICAgb3JpZ19zdGRlcnIgPSBzeXMuc3RkZXJyCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0cmVhbQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPUZhbHNlLCBwZ289cGdvKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBGQUlMRUQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLndyaXRlKG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gb3JpZ19zdGRlcnIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN1cHBvcnQudmVyYm9zZSA9IHZlcmJvc2UgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0X2lubmVyKHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9bm90IHZlcmJvc2UsIHBnbz1wZ28pCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICBmaW5hbGx5OgotICAgICAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQotICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCi1ydW50ZXN0LnN0cmluZ2lvID0gTm9uZQotCi0jIFVuaXQgdGVzdHMgYXJlIHN1cHBvc2VkIHRvIGxlYXZlIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgdW5jaGFuZ2VkCi0jIG9uY2UgdGhleSBjb21wbGV0ZS4gIEJ1dCBzb21ldGltZXMgdGVzdHMgaGF2ZSBidWdzLCBlc3BlY2lhbGx5IHdoZW4KLSMgdGVzdHMgZmFpbCwgYW5kIHRoZSBjaGFuZ2VzIHRvIGVudmlyb25tZW50IGdvIG9uIHRvIG1lc3MgdXAgb3RoZXIKLSMgdGVzdHMuICBUaGlzIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBidWlsZGJvdCBzdGFiaWxpdHksIHNpbmNlIHRlc3RzCi0jIGFyZSBydW4gaW4gcmFuZG9tIG9yZGVyIGFuZCBzbyBwcm9ibGVtcyBtYXkgYXBwZWFyIHRvIGNvbWUgYW5kIGdvLgotIyBUaGVyZSBhcmUgYSBmZXcgdGhpbmdzIHdlIGNhbiBzYXZlIGFuZCByZXN0b3JlIHRvIG1pdGlnYXRlIHRoaXMsIGFuZAotIyB0aGUgZm9sbG93aW5nIGNvbnRleHQgbWFuYWdlciBoYW5kbGVzIHRoaXMgdGFzay4KLQotY2xhc3Mgc2F2ZWRfdGVzdF9lbnZpcm9ubWVudDoKLSAgICAiIiJTYXZlIGJpdHMgb2YgdGhlIHRlc3QgZW52aXJvbm1lbnQgYW5kIHJlc3RvcmUgdGhlbSBhdCBibG9jayBleGl0LgotCi0gICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0bmFtZSwgdmVyYm9zZSwgcXVpZXQpOgotICAgICAgICAgICAgI3N0dWZmCi0KLSAgICBVbmxlc3MgcXVpZXQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyIGlmIGFueSBvZgotICAgIHRoZSBzYXZlZCBpdGVtcyB3YXMgY2hhbmdlZCBieSB0aGUgdGVzdC4gIFRoZSBhdHRyaWJ1dGUgJ2NoYW5nZWQnCi0gICAgaXMgaW5pdGlhbGx5IEZhbHNlLCBidXQgaXMgc2V0IHRvIFRydWUgaWYgYSBjaGFuZ2UgaXMgZGV0ZWN0ZWQuCi0KLSAgICBJZiB2ZXJib3NlIGlzIG1vcmUgdGhhbiAxLCB0aGUgYmVmb3JlIGFuZCBhZnRlciBzdGF0ZSBvZiBjaGFuZ2VkCi0gICAgaXRlbXMgaXMgYWxzbyBwcmludGVkLgotICAgICIiIgotCi0gICAgY2hhbmdlZCA9IEZhbHNlCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdG5hbWUsIHZlcmJvc2U9MCwgcXVpZXQ9RmFsc2UsICosIHBnbz1GYWxzZSk6Ci0gICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQotICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCi0gICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAotICAgICAgICBzZWxmLnBnbyA9IHBnbwotCi0gICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAotICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKLSAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKLSAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKLSAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgotICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgotICAgICMKLSAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKLSAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KLQotICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAotICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdzeXMucGF0aF9ob29rcycsICdfX2ltcG9ydF9fJywKLSAgICAgICAgICAgICAgICAgJ3dhcm5pbmdzLmZpbHRlcnMnLCAnYXN5bmNvcmUuc29ja2V0X21hcCcsCi0gICAgICAgICAgICAgICAgICdsb2dnaW5nLl9oYW5kbGVycycsICdsb2dnaW5nLl9oYW5kbGVyTGlzdCcsICdzeXMuZ2V0dHJhY2UnLAotICAgICAgICAgICAgICAgICAnc3lzLndhcm5vcHRpb25zJywKLSAgICAgICAgICAgICAgICAgIyBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpIG1heSByZWxlYXNlIHJlZgotICAgICAgICAgICAgICAgICAjIHRvIGEgdGhyZWFkLCBzbyBjaGVjayBwcm9jZXNzZXMgZmlyc3QuCi0gICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcnLCAndGhyZWFkaW5nLl9kYW5nbGluZycsCi0gICAgICAgICAgICAgICAgICdzeXNjb25maWcuX0NPTkZJR19WQVJTJywgJ3N5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTJywKLSAgICAgICAgICAgICAgICAgJ2ZpbGVzJywgJ2xvY2FsZScsICd3YXJuaW5ncy5zaG93d2FybmluZycsCi0gICAgICAgICAgICAgICAgICdzaHV0aWxfYXJjaGl2ZV9mb3JtYXRzJywgJ3NodXRpbF91bnBhY2tfZm9ybWF0cycsCi0gICAgICAgICAgICAgICAgKQotCi0gICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6Ci0gICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQotICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KLQotICAgIGRlZiBnZXRfY3dkKHNlbGYpOgotICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKLSAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKLSAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQotCi0gICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAotICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKLSAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAotCi0gICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgotICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKLSAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgotCi0gICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuc3RkaW4KLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgotICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgotCi0gICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKLSAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgotICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQotICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKLSAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKLQotICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQotICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgotICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KLSAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoX2hvb2tzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGhfaG9va3MpLCBzeXMucGF0aF9ob29rcywgc3lzLnBhdGhfaG9va3NbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aF9ob29rcyhzZWxmLCBzYXZlZF9ob29rcyk6Ci0gICAgICAgIHN5cy5wYXRoX2hvb2tzID0gc2F2ZWRfaG9va3NbMV0KLSAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzYXZlZF9ob29rc1syXQotCi0gICAgZGVmIGdldF9zeXNfZ2V0dHJhY2Uoc2VsZik6Ci0gICAgICAgIHJldHVybiBzeXMuZ2V0dHJhY2UoKQotICAgIGRlZiByZXN0b3JlX3N5c19nZXR0cmFjZShzZWxmLCB0cmFjZV9meG4pOgotICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VfZnhuKQotCi0gICAgZGVmIGdldF9fX2ltcG9ydF9fKHNlbGYpOgotICAgICAgICByZXR1cm4gYnVpbHRpbnMuX19pbXBvcnRfXwotICAgIGRlZiByZXN0b3JlX19faW1wb3J0X18oc2VsZiwgaW1wb3J0Xyk6Ci0gICAgICAgIGJ1aWx0aW5zLl9faW1wb3J0X18gPSBpbXBvcnRfCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX2ZpbHRlcnMoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZCh3YXJuaW5ncy5maWx0ZXJzKSwgd2FybmluZ3MuZmlsdGVycywgd2FybmluZ3MuZmlsdGVyc1s6XQotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX2ZpbHRlcnMoc2VsZiwgc2F2ZWRfZmlsdGVycyk6Ci0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnMgPSBzYXZlZF9maWx0ZXJzWzFdCi0gICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzYXZlZF9maWx0ZXJzWzJdCi0KLSAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KLSAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQotICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKLSAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKLSAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQotICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQotCi0gICAgZGVmIGdldF9zaHV0aWxfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgotICAgICAgICAjIHdlIGNvdWxkIGNhbGwgZ2V0X2FyY2hpdmVzX2Zvcm1hdHMoKSBidXQgdGhhdCBvbmx5IHJldHVybnMgdGhlCi0gICAgICAgICMgcmVnaXN0cnkga2V5czsgd2Ugd2FudCB0byBjaGVjayB0aGUgdmFsdWVzIHRvbyAodGhlIGZ1bmN0aW9ucyB0aGF0Ci0gICAgICAgICMgYXJlIHJlZ2lzdGVyZWQpCi0gICAgICAgIHJldHVybiBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUywgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTID0gc2F2ZWRbMF0KLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMsIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfc2h1dGlsX3VucGFja19mb3JtYXRzKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMuY2xlYXIoKQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLnVwZGF0ZShzYXZlZFsxXSkKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlcnMoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJzIGlzIGEgV2Vha1ZhbHVlRGljdGlvbmFyeQotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlcnMpLCBsb2dnaW5nLl9oYW5kbGVycywgbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbG9nZ2luZ19faGFuZGxlcnMoc2VsZiwgc2F2ZWRfaGFuZGxlcnMpOgotICAgICAgICAjIENhbid0IGVhc2lseSByZXZlcnQgdGhlIGxvZ2dpbmcgc3RhdGUKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGdldF9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmKToKLSAgICAgICAgIyBfaGFuZGxlckxpc3QgaXMgYSBsaXN0IG9mIHdlYWtyZWZzIHRvIGhhbmRsZXJzCi0gICAgICAgIHJldHVybiBpZChsb2dnaW5nLl9oYW5kbGVyTGlzdCksIGxvZ2dpbmcuX2hhbmRsZXJMaXN0LCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJMaXN0KHNlbGYsIHNhdmVkX2hhbmRsZXJMaXN0KToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfc3lzX3dhcm5vcHRpb25zKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLndhcm5vcHRpb25zKSwgc3lzLndhcm5vcHRpb25zLCBzeXMud2Fybm9wdGlvbnNbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfd2Fybm9wdGlvbnMoc2VsZiwgc2F2ZWRfb3B0aW9ucyk6Ci0gICAgICAgIHN5cy53YXJub3B0aW9ucyA9IHNhdmVkX29wdGlvbnNbMV0KLSAgICAgICAgc3lzLndhcm5vcHRpb25zWzpdID0gc2F2ZWRfb3B0aW9uc1syXQotCi0gICAgIyBDb250cm9sbGluZyBkYW5nbGluZyByZWZlcmVuY2VzIHRvIFRocmVhZCBvYmplY3RzIGNhbiBtYWtlIGl0IGVhc2llcgotICAgICMgdG8gdHJhY2sgcmVmZXJlbmNlIGxlYWtzLgotICAgIGRlZiBnZXRfdGhyZWFkaW5nX19kYW5nbGluZyhzZWxmKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiB0aHJlYWRpbmcuX2RhbmdsaW5nLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgdGhyZWFkaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRocmVhZGluZy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLnVwZGF0ZShzYXZlZCkKLQotICAgICMgU2FtZSBmb3IgUHJvY2VzcyBvYmplY3RzCi0gICAgZGVmIGdldF9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBtdWx0aXByb2Nlc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFVuam9pbmVkIHByb2Nlc3Mgb2JqZWN0cyBjYW4gc3Vydml2ZSBhZnRlciBwcm9jZXNzIGV4aXRzCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9jbGVhbnVwKCkKLSAgICAgICAgIyBUaGlzIGNvcGllcyB0aGUgd2Vha3JlZnMgd2l0aG91dCBtYWtpbmcgYW55IHN0cm9uZyByZWZlcmVuY2UKLSAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV9tdWx0aXByb2Nlc3NpbmdfcHJvY2Vzc19fZGFuZ2xpbmcoc2VsZiwgc2F2ZWQpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy5jbGVhcigpCi0gICAgICAgIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICBkZWYgZ2V0X3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZik6Ci0gICAgICAgICMgbWFrZSBzdXJlIHRoZSBkaWN0IGlzIGluaXRpYWxpemVkCi0gICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigncHJlZml4JykKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0NPTkZJR19WQVJTKSwgc3lzY29uZmlnLl9DT05GSUdfVkFSUywKLSAgICAgICAgICAgICAgICBkaWN0KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpKQotICAgIGRlZiByZXN0b3JlX3N5c2NvbmZpZ19fQ09ORklHX1ZBUlMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUy5jbGVhcigpCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmKToKLSAgICAgICAgcmV0dXJuIChpZChzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyksIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLAotICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNvcHkoKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0lOU1RBTExfU0NIRU1FUyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTID0gc2F2ZWRbMV0KLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy51cGRhdGUoc2F2ZWRbMl0pCi0KLSAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICByZXR1cm4gc29ydGVkKGZuICsgKCcvJyBpZiBvcy5wYXRoLmlzZGlyKGZuKSBlbHNlICcnKQotICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKCkpCi0gICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZiwgc2F2ZWRfdmFsdWUpOgotICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCi0gICAgICAgIGlmIGZuIG5vdCBpbiBzYXZlZF92YWx1ZSBhbmQgKGZuICsgJy8nKSBub3QgaW4gc2F2ZWRfdmFsdWU6Ci0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6Ci0gICAgICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoZm4pCi0gICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQucm10cmVlKGZuKQotCi0gICAgX2xjID0gW2dldGF0dHIobG9jYWxlLCBsYykgZm9yIGxjIGluIGRpcihsb2NhbGUpCi0gICAgICAgICAgIGlmIGxjLnN0YXJ0c3dpdGgoJ0xDXycpXQotICAgIGRlZiBnZXRfbG9jYWxlKHNlbGYpOgotICAgICAgICBwYWlyaW5ncyA9IFtdCi0gICAgICAgIGZvciBsYyBpbiBzZWxmLl9sYzoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwYWlyaW5ncy5hcHBlbmQoKGxjLCBsb2NhbGUuc2V0bG9jYWxlKGxjLCBOb25lKSkpCi0gICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgcmV0dXJuIHBhaXJpbmdzCi0gICAgZGVmIHJlc3RvcmVfbG9jYWxlKHNlbGYsIHNhdmVkKToKLSAgICAgICAgZm9yIGxjLCBzZXR0aW5nIGluIHNhdmVkOgotICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsYywgc2V0dGluZykKLQotICAgIGRlZiBnZXRfd2FybmluZ3Nfc2hvd3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiB3YXJuaW5ncy5zaG93d2FybmluZwotICAgIGRlZiByZXN0b3JlX3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYsIGZ4bik6Ci0gICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gZnhuCi0KLSAgICBkZWYgcmVzb3VyY2VfaW5mbyhzZWxmKToKLSAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5yZXNvdXJjZXM6Ci0gICAgICAgICAgICBtZXRob2Rfc3VmZml4ID0gbmFtZS5yZXBsYWNlKCcuJywgJ18nKQotICAgICAgICAgICAgZ2V0X25hbWUgPSAnZ2V0XycgKyBtZXRob2Rfc3VmZml4Ci0gICAgICAgICAgICByZXN0b3JlX25hbWUgPSAncmVzdG9yZV8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgeWllbGQgbmFtZSwgZ2V0YXR0cihzZWxmLCBnZXRfbmFtZSksIGdldGF0dHIoc2VsZiwgcmVzdG9yZV9uYW1lKQotCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zYXZlZF92YWx1ZXMgPSBkaWN0KChuYW1lLCBnZXQoKSkgZm9yIG5hbWUsIGdldCwgcmVzdG9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCkpCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6Ci0gICAgICAgIHNhdmVkX3ZhbHVlcyA9IHNlbGYuc2F2ZWRfdmFsdWVzCi0gICAgICAgIGRlbCBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlIGluIHNlbGYucmVzb3VyY2VfaW5mbygpOgotICAgICAgICAgICAgY3VycmVudCA9IGdldCgpCi0gICAgICAgICAgICBvcmlnaW5hbCA9IHNhdmVkX3ZhbHVlcy5wb3AobmFtZSkKLSAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlJ3MgdmFsdWUKLSAgICAgICAgICAgIGlmIGN1cnJlbnQgIT0gb3JpZ2luYWw6Ci0gICAgICAgICAgICAgICAgc2VsZi5jaGFuZ2VkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJlc3RvcmUob3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucXVpZXQgYW5kIG5vdCBzZWxmLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxIGFuZCBub3Qgc2VsZi5wZ286Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCgiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1kZWYgcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwKLSAgICAgICAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIGRpc3BsYXlfZmFpbHVyZT1UcnVlLCBwZ289RmFsc2UpOgotICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCi0KLSAgICB0ZXN0X3RpbWUgPSAwLjAKLSAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KLSAgICB0cnk6Ci0gICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKToKLSAgICAgICAgICAgIGFic3Rlc3QgPSB0ZXN0Ci0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIEFsd2F5cyBpbXBvcnQgaXQgZnJvbSB0aGUgdGVzdCBwYWNrYWdlCi0gICAgICAgICAgICBhYnN0ZXN0ID0gJ3Rlc3QuJyArIHRlc3QKLSAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBwZ289cGdvKSBhcyBlbnZpcm9ubWVudDoKLSAgICAgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQotICAgICAgICAgICAgdGhlX21vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGFic3Rlc3QpCi0gICAgICAgICAgICAjIElmIHRoZSB0ZXN0IGhhcyBhIHRlc3RfbWFpbiwgdGhhdCB3aWxsIHJ1biB0aGUgYXBwcm9wcmlhdGUKLSAgICAgICAgICAgICMgdGVzdHMuICBJZiBub3QsIHVzZSBub3JtYWwgdW5pdHRlc3QgdGVzdCBsb2FkaW5nLgotICAgICAgICAgICAgdGVzdF9ydW5uZXIgPSBnZXRhdHRyKHRoZV9tb2R1bGUsICJ0ZXN0X21haW4iLCBOb25lKQotICAgICAgICAgICAgaWYgdGVzdF9ydW5uZXIgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW5uZXIoKToKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCi0gICAgICAgICAgICAgICAgICAgIHRlc3RzID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGhlX21vZHVsZSkKLSAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIGxvYWRlci5lcnJvcnM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludChlcnJvciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIuZXJyb3JzOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvcnMgd2hpbGUgbG9hZGluZyB0ZXN0cyIpCi0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3RzKQotICAgICAgICAgICAgdGVzdF9ydW5uZXIoKQotICAgICAgICAgICAgaWYgaHVudHJsZWFrczoKLSAgICAgICAgICAgICAgICByZWZsZWFrID0gZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIHRlc3RfcnVubmVyLCBodW50cmxlYWtzKQotICAgICAgICAgICAgdGVzdF90aW1lID0gdGltZS50aW1lKCkgLSBzdGFydF90aW1lCi0gICAgZXhjZXB0IHN1cHBvcnQuUmVzb3VyY2VEZW5pZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgotICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZykKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICByYWlzZQotICAgIGV4Y2VwdCBzdXBwb3J0LlRlc3RGYWlsZWQgYXMgbXNnOgotICAgICAgICBpZiBub3QgcGdvOgotICAgICAgICAgICAgaWYgZGlzcGxheV9mYWlsdXJlOgotICAgICAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICBleGNlcHQ6Ci0gICAgICAgIG1zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKLSAgICAgICAgaWYgbm90IHBnbzoKLSAgICAgICAgICAgIHByaW50KCJ0ZXN0IiwgdGVzdCwgImNyYXNoZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQotICAgIGVsc2U6Ci0gICAgICAgIGlmIHJlZmxlYWs6Ci0gICAgICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICAgICAgaWYgZW52aXJvbm1lbnQuY2hhbmdlZDoKLSAgICAgICAgICAgIHJldHVybiBFTlZfQ0hBTkdFRCwgdGVzdF90aW1lCi0gICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQotCi1kZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6Ci0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCBzdGF0Ci0gICAgaW1wb3J0IGdjCi0KLSAgICAjIEZpcnN0IGtpbGwgYW55IGRhbmdsaW5nIHJlZmVyZW5jZXMgdG8gb3BlbiBmaWxlcyBldGMuCi0gICAgIyBUaGlzIGNhbiBhbHNvIGlzc3VlIHNvbWUgUmVzb3VyY2VXYXJuaW5ncyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ2V0Ci0gICAgIyB0cmlnZ2VyZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBydW4sIGFuZCBwb3NzaWJseSBwcm9kdWNlIGZhaWx1cmVzLgotICAgIGdjLmNvbGxlY3QoKQotCi0gICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQotICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cwotICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCi0gICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQotICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKLSAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCi0gICAgZm9yIG5hbWUgaW4gKHN1cHBvcnQuVEVTVEZOLAotICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCi0gICAgICAgICAgICAgICAgKToKLSAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQotICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgotICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluawotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQotCi0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCgiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGNobW9kLCBmaXggcG9zc2libGUgcGVybWlzc2lvbnMgcHJvYmxlbXMKLSAgICAgICAgICAgICMgdGhhdCBtaWdodCBwcmV2ZW50IGNsZWFudXAKLSAgICAgICAgICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSk6Ci0gICAgICAgICAgICAgICAgb3MuY2htb2QobmFtZSwgc3RhdC5TX0lSV1hVIHwgc3RhdC5TX0lSV1hHIHwgc3RhdC5TX0lSV1hPKQotICAgICAgICAgICAgbnVrZXIobmFtZSkKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBtc2c6Ci0gICAgICAgICAgICBwcmludCgoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCi0gICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSksIGZpbGU9c3lzLnN0ZGVycikKLQotZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKLSAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgotICAgICIiIgotICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCi0gICAgaW1wb3J0IGNvcHlyZWcKLSAgICBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi0KLSAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6Ci0gICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCi0KLSAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KLSAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBwcyA9IGNvcHlyZWcuZGlzcGF0Y2hfdGFibGUuY29weSgpCi0gICAgcGljID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY29weSgpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgemlwaW1wb3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICB6ZGMgPSBOb25lICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKLSAgICBlbHNlOgotICAgICAgICB6ZGMgPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY29weSgpCi0gICAgYWJjcyA9IHt9Ci0gICAgZm9yIGFiYyBpbiBbZ2V0YXR0cihjb2xsZWN0aW9ucy5hYmMsIGEpIGZvciBhIGluIGNvbGxlY3Rpb25zLmFiYy5fX2FsbF9fXToKLSAgICAgICAgaWYgbm90IGlzYWJzdHJhY3QoYWJjKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKLSAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQotCi0gICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcwotICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIGZuYW1lKQotICAgIHJlcGNvdW50ID0gbndhcm11cCArIG50cmFja2VkCi0gICAgcmNfZGVsdGFzID0gWzBdICogcmVwY291bnQKLSAgICBhbGxvY19kZWx0YXMgPSBbMF0gKiByZXBjb3VudAotCi0gICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6Ci0gICAgICAgIGluZGlyZWN0X3Rlc3QoKQotICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIgPSBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcuJykKLSAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgIGlmIGkgPj0gbndhcm11cDoKLSAgICAgICAgICAgIHJjX2RlbHRhc1tpXSA9IHJjX2FmdGVyIC0gcmNfYmVmb3JlCi0gICAgICAgICAgICBhbGxvY19kZWx0YXNbaV0gPSBhbGxvY19hZnRlciAtIGFsbG9jX2JlZm9yZQotICAgICAgICBhbGxvY19iZWZvcmUsIHJjX2JlZm9yZSA9IGFsbG9jX2FmdGVyLCByY19hZnRlcgotICAgIHByaW50KGZpbGU9c3lzLnN0ZGVycikKLSAgICAjIFRoZXNlIGNoZWNrZXJzIHJldHVybiBGYWxzZSBvbiBzdWNjZXNzLCBUcnVlIG9uIGZhaWx1cmUKLSAgICBkZWYgY2hlY2tfcmNfZGVsdGFzKGRlbHRhcyk6Ci0gICAgICAgIHJldHVybiBhbnkoZGVsdGFzKQotICAgIGRlZiBjaGVja19hbGxvY19kZWx0YXMoZGVsdGFzKToKLSAgICAgICAgIyBBdCBsZWFzdCAxLzNyZCBvZiAwcwotICAgICAgICBpZiAzICogZGVsdGFzLmNvdW50KDApIDwgbGVuKGRlbHRhcyk6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAjIE5vdGhpbmcgZWxzZSB0aGFuIDFzLCAwcyBhbmQgLTFzCi0gICAgICAgIGlmIG5vdCBzZXQoZGVsdGFzKSA8PSB7MSwwLC0xfToKLSAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZhaWxlZCA9IEZhbHNlCi0gICAgZm9yIGRlbHRhcywgaXRlbV9uYW1lLCBjaGVja2VyIGluIFsKLSAgICAgICAgKHJjX2RlbHRhcywgJ3JlZmVyZW5jZXMnLCBjaGVja19yY19kZWx0YXMpLAotICAgICAgICAoYWxsb2NfZGVsdGFzLCAnbWVtb3J5IGJsb2NrcycsIGNoZWNrX2FsbG9jX2RlbHRhcyldOgotICAgICAgICBpZiBjaGVja2VyKGRlbHRhcyk6Ci0gICAgICAgICAgICBtc2cgPSAnJXMgbGVha2VkICVzICVzLCBzdW09JXMnICUgKAotICAgICAgICAgICAgICAgIHRlc3QsIGRlbHRhc1tud2FybXVwOl0sIGl0ZW1fbmFtZSwgc3VtKGRlbHRhcykpCi0gICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKLSAgICAgICAgICAgICAgICBwcmludChtc2csIGZpbGU9cmVmcmVwKQotICAgICAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCi0gICAgICAgICAgICBmYWlsZWQgPSBUcnVlCi0gICAgcmV0dXJuIGZhaWxlZAotCi1kZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6Ci0gICAgaW1wb3J0IGdjLCBjb3B5cmVnCi0gICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCi0gICAgaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QsIG1pbWV0eXBlcywgZG9jdGVzdAotICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAsIGNvbGxlY3Rpb25zLmFiYwotICAgIGZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBfcGF0aF9jcmVhdGVkCi0gICAgZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0Ci0KLSAgICAjIENsZWFyIHRoZSB3YXJuaW5ncyByZWdpc3RyeSwgc28gdGhleSBjYW4gYmUgZGlzcGxheWVkIGFnYWluCi0gICAgZm9yIG1vZCBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKLSAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6Ci0gICAgICAgICAgICBkZWwgbW9kLl9fd2FybmluZ3JlZ2lzdHJ5X18KLQotICAgICMgUmVzdG9yZSBzb21lIG9yaWdpbmFsIHZhbHVlcy4KLSAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gZnMKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKLSAgICBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKLSAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCB6aXBpbXBvcnQKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAotICAgIGVsc2U6Ci0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCi0gICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQotCi0gICAgIyBjbGVhciB0eXBlIGNhY2hlCi0gICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKLQotICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgotICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106Ci0gICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106Ci0gICAgICAgICAgICBvYmouX2FiY19yZWdpc3RyeSA9IGFiY3MuZ2V0KG9iaiwgV2Vha1NldCgpKS5jb3B5KCkKLSAgICAgICAgICAgIG9iai5fYWJjX2NhY2hlLmNsZWFyKCkKLSAgICAgICAgICAgIG9iai5fYWJjX25lZ2F0aXZlX2NhY2hlLmNsZWFyKCkKLQotICAgICMgRmx1c2ggc3RhbmRhcmQgb3V0cHV0LCBzbyB0aGF0IGJ1ZmZlcmVkIGRhdGEgaXMgc2VudCB0byB0aGUgT1MgYW5kCi0gICAgIyBhc3NvY2lhdGVkIFB5dGhvbiBvYmplY3RzIGFyZSByZWNsYWltZWQuCi0gICAgZm9yIHN0cmVhbSBpbiAoc3lzLnN0ZG91dCwgc3lzLnN0ZGVyciwgc3lzLl9fc3Rkb3V0X18sIHN5cy5fX3N0ZGVycl9fKToKLSAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKLQotICAgICMgQ2xlYXIgYXNzb3J0ZWQgbW9kdWxlIGNhY2hlcy4KLSAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKLSAgICByZS5wdXJnZSgpCi0gICAgX3N0cnB0aW1lLl9yZWdleF9jYWNoZS5jbGVhcigpCi0gICAgdXJsbGliLnBhcnNlLmNsZWFyX2NhY2hlKCkKLSAgICB1cmxsaWIucmVxdWVzdC51cmxjbGVhbnVwKCkKLSAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCi0gICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQotICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKLSAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQotICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IGN0eXBlcwotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKLQotICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2ggYW5kIHJlYWQgbWVtb3J5IHN0YXRpc3RpY3MgaW1tZWRpYXRlbHkgYWZ0ZXIuCi0gICAgZnVuYzEgPSBzeXMuZ2V0YWxsb2NhdGVkYmxvY2tzCi0gICAgZnVuYzIgPSBzeXMuZ2V0dG90YWxyZWZjb3VudAotICAgIGdjLmNvbGxlY3QoKQotICAgIHJldHVybiBmdW5jMSgpLCBmdW5jMigpCi0KLWRlZiB3YXJtX2NhY2hlcygpOgotICAgICMgY2hhciBjYWNoZQotICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQotICAgIGZvciBpIGluIHJhbmdlKDI1Nik6Ci0gICAgICAgIHNbaTppKzFdCi0gICAgIyB1bmljb2RlIGNhY2hlCi0gICAgeCA9IFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0KLSAgICAjIGludCBjYWNoZQotICAgIHggPSBsaXN0KHJhbmdlKC01LCAyNTcpKQotCi1kZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKLSAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgotCi1kZWYgcmVtb3ZlcHkobmFtZXMpOgotICAgIGlmIG5vdCBuYW1lczoKLSAgICAgICAgcmV0dXJuCi0gICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgotICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQotICAgICAgICBpZiBleHQgPT0gJy5weSc6Ci0gICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKLQotZGVmIGNvdW50KG4sIHdvcmQpOgotICAgIGlmIG4gPT0gMToKLSAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKLQotZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgotICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KLQotICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCi0gICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCi0gICAgYmVnaW4gZWFjaCBsaW5lLgotICAgICIiIgotCi0gICAgZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZmlsbAotICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAotICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKLSAgICBwcmludChmaWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCi0gICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCi0KLQotZGVmIG1haW5faW5fdGVtcF9jd2QoKToKLSAgICAiIiJSdW4gbWFpbigpIGluIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5LiIiIgotICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKLSAgICAgICAgZXhjZXB0IEZpbGVFeGlzdHNFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLQotICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKLSAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCi0gICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCi0gICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKLSAgICB0ZXN0X2N3ZCA9IG9zLnBhdGguam9pbihURU1QRElSLCB0ZXN0X2N3ZCkKLQotICAgICMgUnVuIHRoZSB0ZXN0cyBpbiBhIGNvbnRleHQgbWFuYWdlciB0aGF0IHRlbXBvcmFyaWx5IGNoYW5nZXMgdGhlIENXRCB0byBhCi0gICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgotICAgICMgY2hhbmdlIHRoZSBDV0QsIHRoZSBvcmlnaW5hbCBDV0Qgd2lsbCBiZSB1c2VkLiAgVGhlIG9yaWdpbmFsIENXRCBpcwotICAgICMgYXZhaWxhYmxlIGZyb20gc3VwcG9ydC5TQVZFRENXRC4KLSAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgotICAgICAgICBtYWluKCkKLQorZGVmIF9tYWluKCk6CisgICAgZ2xvYmFsIF9fZmlsZV9fCiAKLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgIyBSZW1vdmUgcmVncnRlc3QucHkncyBvd24gZGlyZWN0b3J5IGZyb20gdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4gRGVzcGl0ZQogICAgICMgdGhlIGVsaW1pbmF0aW9uIG9mIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvCiAgICAgIyBlbnN1cmUgdGhhdCBzdWJtb2R1bGVzIG9mIHRoZSB0ZXN0IHBhY2thZ2UgZG8gbm90IGluYXBwcm9wcmlhdGVseSBhcHBlYXIKICAgICAjIGFzIHRvcC1sZXZlbCBtb2R1bGVzIGV2ZW4gd2hlbiBwZW9wbGUgKG9yIGJ1aWxkYm90cyEpIGludm9rZSByZWdydGVzdC5weQogICAgICMgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgLW0gc3dpdGNoCiAgICAgbXlkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pKSkKLSAgICBpID0gbGVuKHN5cy5wYXRoKQorICAgIGkgPSBsZW4oc3lzLnBhdGgpIC0gMQogICAgIHdoaWxlIGkgPj0gMDoKLSAgICAgICAgaSAtPSAxCiAgICAgICAgIGlmIG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKHN5cy5wYXRoW2ldKSkgPT0gbXlkaXI6CiAgICAgICAgICAgICBkZWwgc3lzLnBhdGhbaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgLT0gMQogCiAgICAgIyBmaW5kdGVzdGRpcigpIGdldHMgdGhlIGRpcm5hbWUgb3V0IG9mIF9fZmlsZV9fLCBzbyB3ZSBoYXZlIHRvIG1ha2UgaXQKICAgICAjIGFic29sdXRlIGJlZm9yZSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCkBAIC0xNjE0LDQgKzQzLDggQEAKICAgICAjIHNhbml0eSBjaGVjawogICAgIGFzc2VydCBfX2ZpbGVfXyA9PSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCiAKLSAgICBtYWluX2luX3RlbXBfY3dkKCkKKyAgICBtYWluKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3NlcV90ZXN0cy5weSBiL0xpYi90ZXN0L3NlcV90ZXN0cy5weQppbmRleCA3MmY0ODQ1Li4xZTdhNmY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zZXFfdGVzdHMucHkKKysrIGIvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5CkBAIC0zMTgsNyArMzE4LDYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIGlkKHMqMSkpCiAKICAgICBkZWYgdGVzdF9iaWdyZXBlYXQoc2VsZik6Ci0gICAgICAgIGltcG9ydCBzeXMKICAgICAgICAgaWYgc3lzLm1heHNpemUgPD0gMjE0NzQ4MzY0NzoKICAgICAgICAgICAgIHggPSBzZWxmLnR5cGUydGVzdChbMF0pCiAgICAgICAgICAgICB4ICo9IDIqKjE2CmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zaWduYWxpbnRlcnByb2N0ZXN0ZXIucHkgYi9MaWIvdGVzdC9zaWduYWxpbnRlcnByb2N0ZXN0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhZTE3MAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3NpZ25hbGludGVycHJvY3Rlc3Rlci5weQpAQCAtMCwwICsxLDg0IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU0lHVVNSMUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBJbnRlclByb2Nlc3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmdvdF9zaWduYWxzID0geydTSUdIVVAnOiAwLCAnU0lHVVNSMSc6IDAsICdTSUdBTFJNJzogMH0KKworICAgIGRlZiBzaWdodXBfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5nb3Rfc2lnbmFsc1snU0lHSFVQJ10gKz0gMQorCisgICAgZGVmIHNpZ3VzcjFfaGFuZGxlcihzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5nb3Rfc2lnbmFsc1snU0lHVVNSMSddICs9IDEKKyAgICAgICAgcmFpc2UgU0lHVVNSMUV4Y2VwdGlvbgorCisgICAgZGVmIHdhaXRfc2lnbmFsKHNlbGYsIGNoaWxkLCBzaWduYW1lLCBleGNfY2xhc3M9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGNoaWxkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVGhpcyB3YWl0IHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBieSBleGNfY2xhc3MKKyAgICAgICAgICAgICAgICAjIChpZiBzZXQpCisgICAgICAgICAgICAgICAgY2hpbGQud2FpdCgpCisKKyAgICAgICAgICAgIHRpbWVvdXQgPSAxMC4wCisgICAgICAgICAgICBkZWFkbGluZSA9IHRpbWUubW9ub3RvbmljKCkgKyB0aW1lb3V0CisKKyAgICAgICAgICAgIHdoaWxlIHRpbWUubW9ub3RvbmljKCkgPCBkZWFkbGluZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmdvdF9zaWduYWxzW3NpZ25hbWVdOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzaWduYWwucGF1c2UoKQorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBleGM6CisgICAgICAgICAgICBpZiBleGNfY2xhc3MgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UoZXhjLCBleGNfY2xhc3MpOgorICAgICAgICAgICAgICAgICMgZ290IHRoZSBleHBlY3RlZCBleGNlcHRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgc2VsZi5mYWlsKCdzaWduYWwgJXMgbm90IHJlY2VpdmVkIGFmdGVyICVzIHNlY29uZHMnCisgICAgICAgICAgICAgICAgICAlIChzaWduYW1lLCB0aW1lb3V0KSkKKworICAgIGRlZiBzdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHNlbGYsIHBpZCwgc2lnbmFtZSk6CisgICAgICAgIGNvZGUgPSAnaW1wb3J0IG9zLCBzaWduYWw7IG9zLmtpbGwoJXMsIHNpZ25hbC4lcyknICUgKHBpZCwgc2lnbmFtZSkKKyAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgJy1JJywgJy1jJywgY29kZV0KKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oYXJncykKKworICAgIGRlZiB0ZXN0X2ludGVycHJvY2Vzc19zaWduYWwoc2VsZik6CisgICAgICAgICMgSW5zdGFsbCBoYW5kbGVycy4gVGhpcyBmdW5jdGlvbiBydW5zIGluIGEgc3ViLXByb2Nlc3MsIHNvIHdlCisgICAgICAgICMgZG9uJ3Qgd29ycnkgYWJvdXQgcmUtc2V0dGluZyB0aGUgZGVmYXVsdCBoYW5kbGVycy4KKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLnNpZ2h1cF9oYW5kbGVyKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzZWxmLnNpZ3VzcjFfaGFuZGxlcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQorCisgICAgICAgICMgTGV0IHRoZSBzdWItcHJvY2Vzc2VzIGtub3cgd2hvIHRvIHNlbmQgc2lnbmFscyB0by4KKyAgICAgICAgcGlkID0gc3RyKG9zLmdldHBpZCgpKQorCisgICAgICAgIHdpdGggc2VsZi5zdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHBpZCwgIlNJR0hVUCIpIGFzIGNoaWxkOgorICAgICAgICAgICAgc2VsZi53YWl0X3NpZ25hbChjaGlsZCwgJ1NJR0hVUCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKyAgICAgICAgd2l0aCBzZWxmLnN1YnByb2Nlc3Nfc2VuZF9zaWduYWwocGlkLCAiU0lHVVNSMSIpIGFzIGNoaWxkOgorICAgICAgICAgICAgc2VsZi53YWl0X3NpZ25hbChjaGlsZCwgJ1NJR1VTUjEnLCBTSUdVU1IxRXhjZXB0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X3NpZ25hbHMsIHsnU0lHSFVQJzogMSwgJ1NJR1VTUjEnOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0lHQUxSTSc6IDB9KQorCisgICAgICAgIHdpdGggc2VsZi5zdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHBpZCwgIlNJR1VTUjIiKSBhcyBjaGlsZDoKKyAgICAgICAgICAgICMgTm90aGluZyBzaG91bGQgaGFwcGVuOiBTSUdVU1IyIGlzIGlnbm9yZWQKKyAgICAgICAgICAgIGNoaWxkLndhaXQoKQorCisgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICBzZWxmLndhaXRfc2lnbmFsKE5vbmUsICdTSUdBTFJNJywgS2V5Ym9hcmRJbnRlcnJ1cHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3Rfc2lnbmFscywgeydTSUdIVVAnOiAxLCAnU0lHVVNSMSc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTSUdBTFJNJzogMH0pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkgYi9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CmluZGV4IDg2N2RjMmYuLmVmNmI0ZjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IHN5c2NvbmZpZwogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdGltZQoraW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB1cmxsaWIuZXJyb3IKIGltcG9ydCB3YXJuaW5ncwpAQCAtODksNiArOTAsNyBAQAogICAgICJiaWdtZW10ZXN0IiwgImJpZ2FkZHJzcGFjZXRlc3QiLCAiY3B5dGhvbl9vbmx5IiwgImdldF9hdHRyaWJ1dGUiLAogICAgICJyZXF1aXJlc19JRUVFXzc1NCIsICJza2lwX3VubGVzc194YXR0ciIsICJyZXF1aXJlc196bGliIiwKICAgICAiYW50aWNpcGF0ZV9mYWlsdXJlIiwgImxvYWRfcGFja2FnZV90ZXN0cyIsICJkZXRlY3RfYXBpX21pc21hdGNoIiwKKyAgICAiY2hlY2tfX2FsbF9fIiwKICAgICAjIHN5cwogICAgICJpc19qeXRob24iLCAiY2hlY2tfaW1wbF9kZXRhaWwiLAogICAgICMgbmV0d29yawpAQCAtOTAwLDcgKzkwMiw3IEBACiAgICAgICAgIHlpZWxkIHBhdGgKICAgICBmaW5hbGx5OgogICAgICAgICBpZiBkaXJfY3JlYXRlZDoKLSAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKyAgICAgICAgICAgIHJtdHJlZShwYXRoKQogCiBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogZGVmIGNoYW5nZV9jd2QocGF0aCwgcXVpZXQ9RmFsc2UpOgpAQCAtMjA3Nyw2ICsyMDc5LDExIEBACiAgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzIGFuZCBzeXMud2Fybm9wdGlvbnMuIiIiCiAgICAgcmV0dXJuIHN1YnByb2Nlc3MuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCiAKK2RlZiBvcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKKyAgICBvcHRpbWl6YXRpb24gc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgorICAgIHJldHVybiBzdWJwcm9jZXNzLl9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQorCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIFN1cHBvcnQgZm9yIGFzc2VydGlvbnMgYWJvdXQgbG9nZ2luZy4KICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIyMjgsNiArMjIzNSw2NSBAQAogICAgIHJldHVybiBtaXNzaW5nX2l0ZW1zCiAKIAorZGVmIGNoZWNrX19hbGxfXyh0ZXN0X2Nhc2UsIG1vZHVsZSwgbmFtZV9vZl9tb2R1bGU9Tm9uZSwgZXh0cmE9KCksCisgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD0oKSk6CisgICAgIiIiQXNzZXJ0IHRoYXQgdGhlIF9fYWxsX18gdmFyaWFibGUgb2YgJ21vZHVsZScgY29udGFpbnMgYWxsIHB1YmxpYyBuYW1lcy4KKworICAgIFRoZSBtb2R1bGUncyBwdWJsaWMgbmFtZXMgKGl0cyBBUEkpIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uCisgICAgd2hldGhlciB0aGV5IG1hdGNoIHRoZSBwdWJsaWMgbmFtZSBjb252ZW50aW9uIGFuZCB3ZXJlIGRlZmluZWQgaW4KKyAgICAnbW9kdWxlJy4KKworICAgIFRoZSAnbmFtZV9vZl9tb2R1bGUnIGFyZ3VtZW50IGNhbiBzcGVjaWZ5IChhcyBhIHN0cmluZyBvciB0dXBsZSB0aGVyZW9mKQorICAgIHdoYXQgbW9kdWxlKHMpIGFuIEFQSSBjb3VsZCBiZSBkZWZpbmVkIGluIGluIG9yZGVyIHRvIGJlIGRldGVjdGVkIGFzIGEKKyAgICBwdWJsaWMgQVBJLiBPbmUgY2FzZSBmb3IgdGhpcyBpcyB3aGVuICdtb2R1bGUnIGltcG9ydHMgcGFydCBvZiBpdHMgcHVibGljCisgICAgQVBJIGZyb20gb3RoZXIgbW9kdWxlcywgcG9zc2libHkgYSBDIGJhY2tlbmQgKGxpa2UgJ2NzdicgYW5kIGl0cyAnX2NzdicpLgorCisgICAgVGhlICdleHRyYScgYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgd291bGRuJ3Qgb3RoZXJ3aXNlIGJlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhcyAicHVibGljIiwgbGlrZSBvYmplY3RzIHdpdGhvdXQgYSBwcm9wZXIKKyAgICAnX19tb2R1bGVfXycgYXR0cml1YnV0ZS4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBvbmVzLgorCisgICAgVGhlICdibGFja2xpc3QnIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IG11c3Qgbm90IGJlIHRyZWF0ZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGV2ZW4gdGhvdWdoIHRoZWlyIG5hbWVzIGluZGljYXRlIG90aGVyd2lzZS4KKworICAgIFVzYWdlOgorICAgICAgICBpbXBvcnQgYmFyCisgICAgICAgIGltcG9ydCBmb28KKyAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisgICAgICAgIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZm9vKQorCisgICAgICAgIGNsYXNzIE90aGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGV4dHJhID0geydCQVJfQ09OU1QnLCAnRk9PX0NPTlNUJ30KKyAgICAgICAgICAgICAgICBibGFja2xpc3QgPSB7J2Jheid9ICAjIFVuZG9jdW1lbnRlZCBuYW1lLgorICAgICAgICAgICAgICAgICMgYmFyIGltcG9ydHMgcGFydCBvZiBpdHMgQVBJIGZyb20gX2Jhci4KKyAgICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBiYXIsICgnYmFyJywgJ19iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICIiIgorCisgICAgaWYgbmFtZV9vZl9tb2R1bGUgaXMgTm9uZToKKyAgICAgICAgbmFtZV9vZl9tb2R1bGUgPSAobW9kdWxlLl9fbmFtZV9fLCApCisgICAgZWxpZiBpc2luc3RhbmNlKG5hbWVfb2ZfbW9kdWxlLCBzdHIpOgorICAgICAgICBuYW1lX29mX21vZHVsZSA9IChuYW1lX29mX21vZHVsZSwgKQorCisgICAgZXhwZWN0ZWQgPSBzZXQoZXh0cmEpCisKKyAgICBmb3IgbmFtZSBpbiBkaXIobW9kdWxlKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfJykgb3IgbmFtZSBpbiBibGFja2xpc3Q6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKyAgICAgICAgaWYgKGdldGF0dHIob2JqLCAnX19tb2R1bGVfXycsIE5vbmUpIGluIG5hbWVfb2ZfbW9kdWxlIG9yCisgICAgICAgICAgICAgICAgKG5vdCBoYXNhdHRyKG9iaiwgJ19fbW9kdWxlX18nKSBhbmQKKyAgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5Nb2R1bGVUeXBlKSkpOgorICAgICAgICAgICAgZXhwZWN0ZWQuYWRkKG5hbWUpCisgICAgdGVzdF9jYXNlLmFzc2VydENvdW50RXF1YWwobW9kdWxlLl9fYWxsX18sIGV4cGVjdGVkKQorCisKIGNsYXNzIFN1cHByZXNzQ3Jhc2hSZXBvcnQ6CiAgICAgIiIiVHJ5IHRvIHByZXZlbnQgYSBjcmFzaCByZXBvcnQgZnJvbSBwb3BwaW5nIHVwLgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkgYi9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKaW5kZXggNThmMmYwNC4uYWI0ZTI0NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQpAQCAtNCw3ICs0LDYgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBubF9sYW5naW5mbyA9IE5vbmUKIAotaW1wb3J0IGNvZGVjcwogaW1wb3J0IGxvY2FsZQogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CmluZGV4IGFjNjMyNWEuLmJjYmE4Y2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CkBAIC00LDcgKzQsNiBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHNodXRpbAogaW1wb3J0IHN0YXQKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9haWZjLnB5IGIvTGliL3Rlc3QvdGVzdF9haWZjLnB5CmluZGV4IGFiNTE0MzcuLjFiZDFmODkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYWlmYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FpZmMucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cwogZnJvbSBhdWRpb29wIGltcG9ydCBieXRlc3dhcAotaW1wb3J0IG9zCiBpbXBvcnQgaW8KIGltcG9ydCBzeXMKIGltcG9ydCBzdHJ1Y3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CmluZGV4IGY5ZWUzOTguLjUyYzYyNDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQpAQCAtNDUxMiw2ICs0NTEyLDIxIEBACiAgICAgICAgIHN0cmluZyA9ICJOYW1lc3BhY2UoYmFyPSdzcGFtJywgZm9vPTQyKSIKICAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQogCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKip7JyInOiAncXVvdGUnfSkKKyAgICAgICAgc3RyaW5nID0gIiIiTmFtZXNwYWNlKCoqeyciJzogJ3F1b3RlJ30pIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9rd2FyZ3NfYW5kX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KQorICAgICAgICBzdHJpbmcgPSAiIiJOYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KSIiIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfc3Rhcmt3YXJnc19pZGVudGlmaWVyKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgqKnsndmFsaWQnOiBUcnVlfSkKKyAgICAgICAgc3RyaW5nID0gIk5hbWVzcGFjZSh2YWxpZD1UcnVlKSIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKICAgICAgICAgc3RyaW5nID0gKApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggNDgyNTI2ZS4uOGZkNTRjYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC03LDggKzcsNiBAQAogaW1wb3J0IHdlYWtyZWYKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBvcGVyYXRvcgotaW1wb3J0IGlvCi1pbXBvcnQgbWF0aAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCkBAIC0zMTgsOCArMzE2LDE5IEBACiAgICAgICAgICAgICBkID0gcGlja2xlLmR1bXBzKChpdG9yaWcsIG9yaWcpLCBwcm90bykKICAgICAgICAgICAgIGl0LCBhID0gcGlja2xlLmxvYWRzKGQpCiAgICAgICAgICAgICBhLmZyb21saXN0KGRhdGEyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGl0KSwgdHlwZShpdG9yaWcpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKworICAgIGRlZiB0ZXN0X2V4aGF1c3RlZF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCBsaXN0KHNlbGYuZXhhbXBsZSkpCisgICAgICAgIGV4aGl0ID0gaXRlcihhKQorICAgICAgICBlbXBpdCA9IGl0ZXIoYSkKKyAgICAgICAgZm9yIHggaW4gZXhoaXQ6ICAjIGV4aGF1c3QgdGhlIGl0ZXJhdG9yCisgICAgICAgICAgICBuZXh0KGVtcGl0KSAgIyBub3QgZXhoYXVzdGVkCisgICAgICAgIGEuYXBwZW5kKHNlbGYub3V0c2lkZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGV4aGl0KSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChlbXBpdCksIFtzZWxmLm91dHNpZGVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIGxpc3Qoc2VsZi5leGFtcGxlKSArIFtzZWxmLm91dHNpZGVdKQogCiAgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQpAQCAtMTA3MCw2ICsxMDc5LDEyIEBACiAgICAgICAgIGEgPSBhcnJheS5hcnJheSgnQicsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGdldGJ1ZmZlcl93aXRoX251bGxfdmlldywgYSkKIAorICAgIGRlZiB0ZXN0X2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIGl0ZXIsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisgICAgICAgIHN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgcmV2ZXJzZWQsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisKIGNsYXNzIFN0cmluZ1Rlc3QoQmFzZVRlc3QpOgogCiAgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggZDNlNmQzNS4uZTAzMmY2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTEsNyArMSw4IEBACitpbXBvcnQgYXN0CitpbXBvcnQgZGlzCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGFzdAogaW1wb3J0IHdlYWtyZWYKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yMzgsNyArMjM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgYXN0LlB5Q0ZfT05MWV9BU1QpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fdHVwbGUoYXN0X3RyZWUpLCBvKQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRUcnVlb3JkZXIoYXN0X3RyZWUsICgwLCAwKSkKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChhY3Rpb249ImNvbXBpbGluZyIsIGlucHV0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGFjdGlvbj0iY29tcGlsaW5nIiwgaW5wdXQ9aSwga2luZD1raW5kKToKICAgICAgICAgICAgICAgICAgICAgY29tcGlsZShhc3RfdHJlZSwgIj8iLCBraW5kKQogCiAgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CkBAIC01NDcsNiArNTQ4LDE3IEBACiAgICAgICAgICAgICBjb21waWxlKG1vZCwgJ3Rlc3QnLCAnZXhlYycpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImludmFsaWQgaW50ZWdlciB2YWx1ZTogTm9uZSIsIHN0cihjbS5leGNlcHRpb24pKQogCisgICAgZGVmIHRlc3RfbGV2ZWxfYXNfbm9uZShzZWxmKToKKyAgICAgICAgYm9keSA9IFthc3QuSW1wb3J0RnJvbShtb2R1bGU9J3RpbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzPVthc3QuYWxpYXMobmFtZT0nc2xlZXAnKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89MCwgY29sX29mZnNldD0wKV0KKyAgICAgICAgbW9kID0gYXN0Lk1vZHVsZShib2R5KQorICAgICAgICBjb2RlID0gY29tcGlsZShtb2QsICd0ZXN0JywgJ2V4ZWMnKQorICAgICAgICBucyA9IHt9CisgICAgICAgIGV4ZWMoY29kZSwgbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NsZWVwJywgbnMpCisKIAogY2xhc3MgQVNUVmFsaWRhdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC03NDIsNyArNzU0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ltcG9ydGZyb20oc2VsZik6CiAgICAgICAgIGltcCA9IGFzdC5JbXBvcnRGcm9tKE5vbmUsIFthc3QuYWxpYXMoIngiLCBOb25lKV0sIC00MikKLSAgICAgICAgc2VsZi5zdG10KGltcCwgImxldmVsIGxlc3MgdGhhbiAtMSIpCisgICAgICAgIHNlbGYuc3RtdChpbXAsICJOZWdhdGl2ZSBJbXBvcnRGcm9tIGxldmVsIikKICAgICAgICAgc2VsZi5zdG10KGFzdC5JbXBvcnRGcm9tKE5vbmUsIFtdLCAwKSwgImVtcHR5IG5hbWVzIG9uIEltcG9ydEZyb20iKQogCiAgICAgZGVmIHRlc3RfZ2xvYmFsKHNlbGYpOgpAQCAtOTMzLDYgKzk0NSwxMjUgQEAKICAgICAgICAgICAgIGNvbXBpbGUobW9kLCBmbiwgImV4ZWMiKQogCiAKK2NsYXNzIENvbnN0YW50VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG9uIHRoZSBhc3QuQ29uc3RhbnQgbm9kZSB0eXBlLiIiIgorCisgICAgZGVmIGNvbXBpbGVfY29uc3RhbnQoc2VsZiwgdmFsdWUpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCJ4ID0gMTIzIikKKworICAgICAgICBub2RlID0gdHJlZS5ib2R5WzBdLnZhbHVlCisgICAgICAgIG5ld19ub2RlID0gYXN0LkNvbnN0YW50KHZhbHVlPXZhbHVlKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfbm9kZSwgbm9kZSkKKyAgICAgICAgdHJlZS5ib2R5WzBdLnZhbHVlID0gbmV3X25vZGUKKworICAgICAgICBjb2RlID0gY29tcGlsZSh0cmVlLCAiPHN0cmluZz4iLCAiZXhlYyIpCisKKyAgICAgICAgbnMgPSB7fQorICAgICAgICBleGVjKGNvZGUsIG5zKQorICAgICAgICByZXR1cm4gbnNbJ3gnXQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgc2VsZi5jb21waWxlX2NvbnN0YW50KFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ290IGFuIGludmFsaWQgdHlwZSBpbiBDb25zdGFudDogbGlzdCIpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25zKHNlbGYpOgorICAgICAgICBmb3IgY29uc3QgaW4gKE5vbmUsIEZhbHNlLCBUcnVlLCBFbGxpcHNpcywgYicnLCBmcm96ZW5zZXQoKSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjb25zdD1jb25zdCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbXBpbGVfY29uc3RhbnQoY29uc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2YWx1ZSwgY29uc3QpCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIG5lc3RlZF90dXBsZSA9ICgxLCkKKyAgICAgICAgbmVzdGVkX2Zyb3plbnNldCA9IGZyb3plbnNldCh7MX0pCisgICAgICAgIGZvciBsZXZlbCBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIG5lc3RlZF90dXBsZSA9IChuZXN0ZWRfdHVwbGUsIDIpCisgICAgICAgICAgICBuZXN0ZWRfZnJvemVuc2V0ID0gZnJvemVuc2V0KHtuZXN0ZWRfZnJvemVuc2V0LCAyfSkKKyAgICAgICAgdmFsdWVzID0gKDEyMywgMTIzLjAsIDEyM2osCisgICAgICAgICAgICAgICAgICAidW5pY29kZSIsIGInYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgdHVwbGUoInR1cGxlIiksIGZyb3plbnNldCgiZnJvemVuc2V0IiksCisgICAgICAgICAgICAgICAgICBuZXN0ZWRfdHVwbGUsIG5lc3RlZF9mcm96ZW5zZXQpCisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh2YWx1ZT12YWx1ZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb21waWxlX2NvbnN0YW50KHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl90b19jb25zdGFudChzZWxmKToKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZSgieCA9IDEiKQorCisgICAgICAgIHRhcmdldCA9IHRyZWUuYm9keVswXS50YXJnZXRzWzBdCisgICAgICAgIG5ld190YXJnZXQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MSkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X3RhcmdldCwgdGFyZ2V0KQorICAgICAgICB0cmVlLmJvZHlbMF0udGFyZ2V0c1swXSA9IG5ld190YXJnZXQKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgY29tcGlsZSh0cmVlLCAic3RyaW5nIiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIHdoaWNoIGNhbid0IGJlIGFzc2lnbmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidG8gaW4gU3RvcmUgY29udGV4dCIpCisKKyAgICBkZWYgdGVzdF9nZXRfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCInZG9jc3RyaW5nJ1xueCA9IDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5nZXRfZG9jc3RyaW5nKHRyZWUpLCAnZG9jc3RyaW5nJykKKworICAgICAgICB0cmVlLmJvZHlbMF0udmFsdWUgPSBhc3QuQ29uc3RhbnQodmFsdWU9J2NvbnN0YW50IGRvY3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmdldF9kb2NzdHJpbmcodHJlZSksICdjb25zdGFudCBkb2NzdHJpbmcnKQorCisgICAgZGVmIGdldF9sb2FkX2NvbnN0KHNlbGYsIHRyZWUpOgorICAgICAgICAjIENvbXBpbGUgdG8gYnl0ZWNvZGUsIGRpc2Fzc2VtYmxlIGFuZCBnZXQgcGFyYW1ldGVyIG9mIExPQURfQ09OU1QKKyAgICAgICAgIyBpbnN0cnVjdGlvbnMKKyAgICAgICAgY28gPSBjb21waWxlKHRyZWUsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgY29uc3RzID0gW10KKyAgICAgICAgZm9yIGluc3RyIGluIGRpcy5nZXRfaW5zdHJ1Y3Rpb25zKGNvKToKKyAgICAgICAgICAgIGlmIGluc3RyLm9wbmFtZSA9PSAnTE9BRF9DT05TVCc6CisgICAgICAgICAgICAgICAgY29uc3RzLmFwcGVuZChpbnN0ci5hcmd2YWwpCisgICAgICAgIHJldHVybiBjb25zdHMKKworICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2xvYWRfY29uc3Qoc2VsZik6CisgICAgICAgIGNvbnN0cyA9IFtOb25lLAorICAgICAgICAgICAgICAgICAgVHJ1ZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAxMjQsCisgICAgICAgICAgICAgICAgICAyLjAsCisgICAgICAgICAgICAgICAgICAzaiwKKyAgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwKKyAgICAgICAgICAgICAgICAgIGInYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgKDEsIDIsIDMpXQorCisgICAgICAgIGNvZGUgPSAnXG4nLmpvaW4oWyd4PXshcn0nLmZvcm1hdChjb25zdCkgZm9yIGNvbnN0IGluIGNvbnN0c10pCisgICAgICAgIGNvZGUgKz0gJ1xueCA9IC4uLicKKyAgICAgICAgY29uc3RzLmV4dGVuZCgoRWxsaXBzaXMsIE5vbmUpKQorCisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF9sb2FkX2NvbnN0KHRyZWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cykKKworICAgICAgICAjIFJlcGxhY2UgZXhwcmVzc2lvbiBub2RlcyB3aXRoIGNvbnN0YW50cworICAgICAgICBmb3IgYXNzaWduLCBjb25zdCBpbiB6aXAodHJlZS5ib2R5LCBjb25zdHMpOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYXNzaWduLCBhc3QuQXNzaWduKSwgYXN0LmR1bXAoYXNzaWduKQorICAgICAgICAgICAgbmV3X25vZGUgPSBhc3QuQ29uc3RhbnQodmFsdWU9Y29uc3QpCisgICAgICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfbm9kZSwgYXNzaWduLnZhbHVlKQorICAgICAgICAgICAgYXNzaWduLnZhbHVlID0gbmV3X25vZGUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2xvYWRfY29uc3QodHJlZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCIxICsgMiIpCisgICAgICAgIGJpbm9wID0gdHJlZS5ib2R5WzBdLnZhbHVlCisKKyAgICAgICAgbmV3X2xlZnQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MTApCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19sZWZ0LCBiaW5vcC5sZWZ0KQorICAgICAgICBiaW5vcC5sZWZ0ID0gbmV3X2xlZnQKKworICAgICAgICBuZXdfcmlnaHQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MjApCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19yaWdodCwgYmlub3AucmlnaHQpCisgICAgICAgIGJpbm9wLnJpZ2h0ID0gbmV3X3JpZ2h0CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKGJpbm9wKSwgMzApCisKKwogZGVmIG1haW4oKToKICAgICBpZiBfX25hbWVfXyAhPSAnX19tYWluX18nOgogICAgICAgICByZXR1cm4KQEAgLTk0MCw4ICsxMDcxLDkgQEAKICAgICAgICAgZm9yIHN0YXRlbWVudHMsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCAiZXhlYyIpLCAoc2luZ2xlX3Rlc3RzLCAic2luZ2xlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgImV2YWwiKSk6CiAgICAgICAgICAgICBwcmludChraW5kKyJfcmVzdWx0cyA9IFsiKQotICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVtZW50czoKLSAgICAgICAgICAgICAgICBwcmludChyZXByKHRvX3R1cGxlKGNvbXBpbGUocywgIj8iLCBraW5kLCAweDQwMCkpKSsiLCIpCisgICAgICAgICAgICBmb3Igc3RhdGVtZW50IGluIHN0YXRlbWVudHM6CisgICAgICAgICAgICAgICAgdHJlZSA9IGFzdC5wYXJzZShzdGF0ZW1lbnQsICI/Iiwga2luZCkKKyAgICAgICAgICAgICAgICBwcmludCgiJXIsIiAlICh0b190dXBsZSh0cmVlKSwpKQogICAgICAgICAgICAgcHJpbnQoIl0iKQogICAgICAgICBwcmludCgibWFpbigpIikKICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKaW5kZXggM2EzM2ZjOC4uMGViYTc2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CkBAIC0xMiw3ICsxMiw2IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCB1bml0dGVzdC5tb2NrCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwpAQCAtMjk3LDM3ICsyOTYsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzeW5jaGF0LmZpbmRfcHJlZml4X2F0X2VuZCgicXdlcnR5ZGtqZiIsICJcclxuIiksIDApCiAKIAotY2xhc3MgVGVzdEZpZm8odW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKSBhcyBjbToKLSAgICAgICAgICAgIGYgPSBhc3luY2hhdC5maWZvKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20ud2FybmluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYiKQotICAgICAgICBmLnB1c2goNykKLSAgICAgICAgZi5wdXNoKGInYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZmlyc3QoKSwgNykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgNykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZmlyc3QoKSwgYidhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzX2VtcHR5KCksIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCBiJ2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc19lbXB0eSgpLCBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgwLCBOb25lKSkKLQotICAgIGRlZiB0ZXN0X2dpdmVuX2xpc3Qoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpIGFzIGNtOgotICAgICAgICAgICAgZiA9IGFzeW5jaGF0LmZpZm8oW2IneCcsIDE3LCAzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20ud2FybmluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgYid4JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDE3KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgMykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDAsIE5vbmUpKQotCi0KIGNsYXNzIFRlc3ROb3RDb25uZWN0ZWQodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Rpc2FsbG93X25lZ2F0aXZlX3Rlcm1pbmF0b3Ioc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMjU5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDQwYWM5YmYuLjYxMzNiYmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHN5cwotaW1wb3J0IGZ1bmN0b29scwogCiAjIFRoZXNlIHRlc3RzIGFsbCB1c2Ugb25lIG9mIHRoZSBiaWdtZW10ZXN0IGRlY29yYXRvcnMgdG8gaW5kaWNhdGUgaG93IG11Y2gKICMgbWVtb3J5IHRoZXkgdXNlIGFuZCBob3cgbXVjaCBtZW1vcnkgdGhleSBuZWVkIHRvIGJlIGV2ZW4gbWVhbmluZ2Z1bC4gIFRoZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggODM2N2FmZS4uZmJjOTMzZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQpAQCAtMTU5LDExICsxNTksMjUgQEAKICAgICAgICAgIyBUaGVuIGNhbGN1bGF0ZSB0aGUgaGV4YmluNCBiaW5hcnktdG8tQVNDSUkgdHJhbnNsYXRpb24KICAgICAgICAgcmxlID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQogICAgICAgICBhID0gYmluYXNjaWkuYjJhX2hxeChzZWxmLnR5cGUydGVzdChybGUpKQorCiAgICAgICAgIGIsIF8gPSBiaW5hc2NpaS5hMmJfaHF4KHNlbGYudHlwZTJ0ZXN0KGEpKQogICAgICAgICByZXMgPSBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KGIpCi0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKIAorICAgIGRlZiB0ZXN0X3JsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHJlcGV0aXRpb24gd2l0aCBhIHJlcGV0aXRpb24gbG9uZ2VyIHRoYW4gdGhlIGxpbWl0IG9mIDI1NQorICAgICAgICBkYXRhID0gKGInYScgKiAxMDAgKyBiJ2InICsgYidjJyAqIDMwMCkKKworICAgICAgICBlbmNvZGVkID0gYmluYXNjaWkucmxlY29kZV9ocXgoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ2FceDkwZCcgICAgICAjICdhJyAqIDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2InICAgICAgICAgICAjICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwXHhmZicgICAjICdjJyAqIDI1NQorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwLScpKSAgICAjICdjJyAqIDQ1CisKKyAgICAgICAgZGVjb2RlZCA9IGJpbmFzY2lpLnJsZWRlY29kZV9ocXgoZW5jb2RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkLCBkYXRhKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICAjIHRlc3QgaGV4bGlmaWNhdGlvbgogICAgICAgICBzID0gYid7c1wwMDVcMDAwXDAwMFwwMDB3b3JsZGlcMDAyXDAwMFwwMDBcMDAwc1wwMDVcMDAwXDAwMFwwMDBoZWxsb2lcMDAxXDAwMFwwMDBcMDAwMCcKQEAgLTI2Miw2ICsyNzYsMTYgQEAKICAgICAgICAgICAgICMgbm9uLUFTQ0lJIHN0cmluZwogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYTJiLCAiXHg4MCIpCiAKKyAgICBkZWYgdGVzdF9iMmFfYmFzZTY0X25ld2xpbmUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzI1MzU3OiB0ZXN0IG5ld2xpbmUgcGFyYW1ldGVyCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FHVnNiRzg9JykKKwogCiBjbGFzcyBBcnJheUJpbkFTQ0lJVGVzdChCaW5BU0NJSVRlc3QpOgogICAgIGRlZiB0eXBlMnRlc3Qoc2VsZiwgcyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmhleC5weSBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CmluZGV4IDlkNGM4NWEuLjIxZjQ0NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CkBAIC00LDcgKzQsNiBAQAogICAgQmFzZWQgb24gYW4gb3JpZ2luYWwgdGVzdCBieSBSb2dlciBFLiBNYXNzZS4KICIiIgogaW1wb3J0IGJpbmhleAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQppbmRleCBlOWRiZGRjLi5mYzhkMzBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKQEAgLTIsNyArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Ci1mcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbmUsIGx0LCBndCwgbGUsIGdlCitmcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbGUKIGZyb20gYWJjIGltcG9ydCBBQkNNZXRhCiAKIGRlZiBnY2QoYSwgYik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmZlci5weSBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CmluZGV4IDJlZWY5ZmMuLmI4M2YyZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC0xNiw3ICsxNiw2IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBwZXJtdXRhdGlvbnMsIHByb2R1Y3QKIGZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNhbXBsZSwgY2hvaWNlCi1mcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXIKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHN5cywgYXJyYXksIGlvCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CmluZGV4IGNjMzEyYjEuLjA1ZGMyNmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQpAQCAtMzAwLDYgKzMwMCwyMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAnXHgwMCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsICcxMiAgIFx4MDAgICAzNCcpCiAKKyAgICAgICAgZm9yIGRhdGEsIHBvcyBpbiAoCisgICAgICAgICAgICAjIGludmFsaWQgZmlyc3QgaGV4YWRlY2ltYWwgY2hhcmFjdGVyCisgICAgICAgICAgICAoJzEyIHg0IDU2JywgMyksCisgICAgICAgICAgICAjIGludmFsaWQgc2Vjb25kIGhleGFkZWNpbWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgKCcxMiAzeCA1NicsIDQpLAorICAgICAgICAgICAgIyB0d28gaW52YWxpZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAoJzEyIHh5IDU2JywgMyksCisgICAgICAgICAgICAjIHRlc3Qgbm9uLUFTQ0lJIHN0cmluZworICAgICAgICAgICAgKCcxMiAzXHhmZiA1NicsIDQpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUydGVzdC5mcm9taGV4KGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdhdCBwb3NpdGlvbiAlcycgJSBwb3MsIHN0cihjbS5leGNlcHRpb24pKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmhleCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5oZXgsIDEpCkBAIC03MjIsMjYgKzczNiwxMDcgQEAKIAogICAgICMgVGVzdCBQeUJ5dGVzX0Zyb21Gb3JtYXQoKQogICAgIGRlZiB0ZXN0X2Zyb21fZm9ybWF0KHNlbGYpOgotICAgICAgICB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHB5dGhvbmFwaSwgcHlfb2JqZWN0LCBjX2ludCwgY19jaGFyX3AKKyAgICAgICAgY3R5cGVzID0gdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2N0eXBlcycpCisgICAgICAgIF90ZXN0Y2FwaSA9IHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGVzdGNhcGknKQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBweV9vYmplY3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0ICgKKyAgICAgICAgICAgIGNfaW50LCBjX3VpbnQsCisgICAgICAgICAgICBjX2xvbmcsIGNfdWxvbmcsCisgICAgICAgICAgICBjX3NpemVfdCwgY19zc2l6ZV90LAorICAgICAgICAgICAgY19jaGFyX3ApCisKICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0ID0gcHl0aG9uYXBpLlB5Qnl0ZXNfRnJvbUZvcm1hdAogICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQucmVzdHlwZSA9IHB5X29iamVjdAogCisgICAgICAgICMgYmFzaWMgdGVzdHMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidmb3JtYXQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Zvcm1hdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInSGVsbG8gJXMgIScsIGInd29ybGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ0hlbGxvIHdvcmxkICEnKQogCisgICAgICAgICMgdGVzdCBmb3JtYXR0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9XDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludChvcmQoJ0AnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1AJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQoMjU1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPVx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KDEpLCBjX2xvbmcoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9MSBsZD0yIHpkPTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2Q9JWQgbGQ9JWxkIHpkPSV6ZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50KC0xKSwgY19sb25nKC0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19zaXplX3QoLTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2Q9LTEgbGQ9LTIgemQ9LTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3U9JXUgbHU9JWx1IHp1PSV6dScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdWludCgxMjMpLCBjX3Vsb25nKDQ1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KDc4OSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIndT0xMjMgbHU9NDU2IHp1PTc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInaT0laScsIGNfaW50KDEyMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInaT0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2k9JWknLCBjX2ludCgtMTIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidpPS0xMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JXgnLCBjX2ludCgweGFiYykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGIneD1hYmMnKQorCisgICAgICAgIHNpemVvZl9wdHIgPSBjdHlwZXMuc2l6ZW9mKGNfY2hhcl9wKQorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgICMgV2luZG93cyAoTVNDUlQpCisgICAgICAgICAgICBwdHJfZm9ybWF0ID0gJzB4JTB7fVgnLmZvcm1hdCgyICogc2l6ZW9mX3B0cikKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChwdHJfZm9ybWF0ICUgcHRyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVTklYIChnbGliYykKKyAgICAgICAgICAgIGRlZiBwdHJfZm9ybWF0dGVyKHB0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuICclI3gnICUgcHRyCisKKyAgICAgICAgcHRyID0gMHhhYmNkZWYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidwdHI9JXAnLCBjX2NoYXJfcChwdHIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3B0cj0nICsgcHRyX2Zvcm1hdHRlcihwdHIpKS5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIncz0lcycsIGNfY2hhcl9wKGInY3N0cicpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3M9Y3N0cicpCisKKyAgICAgICAgIyB0ZXN0IG1pbmltdW0gYW5kIG1heGltdW0gaW50ZWdlciB2YWx1ZXMKKyAgICAgICAgc2l6ZV9tYXggPSBjX3NpemVfdCgtMSkudmFsdWUKKyAgICAgICAgZm9yIGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUsIHZhbHVlLCBweV9mb3JtYXR0ZXIgaW4gKAorICAgICAgICAgICAgKGInJWQnLCBjX2ludCwgX3Rlc3RjYXBpLklOVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclZCcsIGNfaW50LCBfdGVzdGNhcGkuSU5UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsZCcsIGNfbG9uZywgX3Rlc3RjYXBpLkxPTkdfTUlOLCBzdHIpLAorICAgICAgICAgICAgKGInJWxkJywgY19sb25nLCBfdGVzdGNhcGkuTE9OR19NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclbHUnLCBjX3Vsb25nLCBfdGVzdGNhcGkuVUxPTkdfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJXpkJywgY19zc2l6ZV90LCBfdGVzdGNhcGkuUFlfU1NJWkVfVF9NSU4sIHN0ciksCisgICAgICAgICAgICAoYiclemQnLCBjX3NzaXplX3QsIF90ZXN0Y2FwaS5QWV9TU0laRV9UX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6dScsIGNfc2l6ZV90LCBzaXplX21heCwgc3RyKSwKKyAgICAgICAgICAgIChiJyVwJywgY19jaGFyX3AsIHNpemVfbWF4LCBwdHJfZm9ybWF0dGVyKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGZvcm1hdHN0ciwgY3R5cGVzX3R5cGUodmFsdWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfZm9ybWF0dGVyKHZhbHVlKS5lbmNvZGUoJ2FzY2lpJykpLAorCisgICAgICAgICMgd2lkdGggYW5kIHByZWNpc2lvbiAod2lkdGggaXMgY3VycmVudGx5IGlnbm9yZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJTVzJywgYidhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclLjNzJywgYidhYmNkZWYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FiYycpCisKKyAgICAgICAgIyAnJSUnIGZvcm1hdHRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiclJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidbJSVdJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidbJV0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJWMnLCBjX2ludChvcmQoJ18nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJXMnKQorCisgICAgICAgICMgSW52YWxpZCBmb3JtYXRzIGFuZCBwYXJ0aWFsIGZvcm1hdHRpbmcKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJyksIGInJScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUnKSwgYiclJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJXMnKSwgYiclcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInWyUlXScpLCBiJ1slXScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSUlYycsIGNfaW50KG9yZCgnXycpKSksIGInJV8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3g9JWkgeT0lJywgY19pbnQoMiksIGNfaW50KDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3g9MiB5PSUnKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYzolYycsIGNfaW50KDI1NSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInYzpceGZmJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidzOiVzJywgY19jaGFyX3AoYidjc3RyJykpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInczpjc3RyJykKLQotICAgICAgICAjIElzc3VlICMxOTk2OQorICAgICAgICAjIElzc3VlICMxOTk2OTogJWMgbXVzdCByYWlzZSBPdmVyZmxvd0Vycm9yIGZvciB2YWx1ZXMKKyAgICAgICAgIyBub3QgaW4gdGhlIHJhbmdlIFswOyAyNTVdCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdCwgYiclYycsIGNfaW50KC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKQEAgLTE1MDQsNyArMTU5OSwzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEpLCB0eXBlKGIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEueSksIHR5cGUoYi55KSkKIAotICAgIHRlc3RfZnJvbWhleCA9IEJhc2VCeXRlc1Rlc3QudGVzdF9mcm9taGV4CisgICAgZGVmIHRlc3RfZnJvbWhleChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgoJzFhMkIzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidceDFhXHgyYlx4MzAnKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoYiksIHNlbGYudHlwZTJ0ZXN0KQorCisgICAgICAgIGNsYXNzIEIxKHNlbGYuYmFzZXR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgbWUgPSBzZWxmLmJhc2V0eXBlLl9fbmV3X18oY2xzLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBtZS5mb28gPSAnYmFyJworICAgICAgICAgICAgICAgIHJldHVybiBtZQorCisgICAgICAgIGIgPSBCMS5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBCMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgJ2JhcicpCisKKyAgICAgICAgY2xhc3MgQjIoc2VsZi5iYXNldHlwZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18obWUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5iYXNldHlwZSBpcyBub3QgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFzZXR5cGUuX19pbml0X18obWUsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBtZS5mb28gPSAnYmFyJworCisgICAgICAgIGIgPSBCMi5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBCMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgJ2JhcicpCiAKIAogY2xhc3MgQnl0ZUFycmF5U3ViY2xhc3MoYnl0ZWFycmF5KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CmluZGV4IDgwZWQ2MzIuLjZkYWQwNTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQpAQCAtNzAyLDE5ICs3MDIsMTkgQEAKIAogICAgIGRlZiBhc3NlcnRGYWlsdXJlKHNlbGYsICphcmdzKToKICAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctbScsICdjYWxlbmRhcicsICphcmdzKQotICAgICAgICBzZWxmLmFzc2VydEluKGInVXNhZ2U6Jywgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKGIndXNhZ2U6Jywgc3RkZXJyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAyKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKICAgICAgICAgc3Rkb3V0ID0gc2VsZi5ydW5fb2soJy1oJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1VzYWdlOicsIHN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ3VzYWdlOicsIHN0ZG91dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ2NhbGVuZGFyLnB5Jywgc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydEluKGInLS1oZWxwJywgc3Rkb3V0KQogCiAgICAgZGVmIHRlc3RfaWxsZWdhbF9hcmd1bWVudHMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnLXonKQotICAgICAgICAjc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKLSAgICAgICAgI3NlbGYuYXNzZXJ0RmFpbHVyZSgnMjAwNCcsICdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCcyMDA0JywgJ3NwYW0nKQogICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJy10JywgJ2h0bWwnLCAnMjAwNCcsICcxJykKIAogICAgIGRlZiB0ZXN0X291dHB1dF9jdXJyZW50X3llYXIoc2VsZik6CkBAIC04MTUsNSArODE1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgYidocmVmPSJjdXN0b20uY3NzIiAvPicsIHN0ZG91dCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydtZGF5cycsICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ0VQT0NIJywKKyAgICAgICAgICAgICAgICAgICAgICdNT05EQVknLCAnVFVFU0RBWScsICdXRURORVNEQVknLCAnVEhVUlNEQVknLCAnRlJJREFZJywKKyAgICAgICAgICAgICAgICAgICAgICdTQVRVUkRBWScsICdTVU5EQVknLCAnZGlmZmVyZW50X2xvY2FsZScsICdjJywKKyAgICAgICAgICAgICAgICAgICAgICdwcndlZWsnLCAnd2VlaycsICdmb3JtYXQnLCAnZm9ybWF0c3RyaW5nJywgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjYWxlbmRhciwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CmluZGV4IDFlYWRkMjIuLjY4NTIzODEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKQEAgLTQsOCArNCwxMCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTQ0Miw2ICs0NDQsNyBAQAogICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnN0cmlwKCksIGV4cGVjdGVkX291dHB1dCkKIAorCiBjbGFzcyBTa2lwaXRlbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3Rfc2tpcGl0ZW0oc2VsZik6CkBAIC00OTEsMTAgKzQ5NCwxMCBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHModHVwbGVfMSwgZGljdF9iLAogICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZW5jb2RlKCJhc2NpaSIpLCBrZXl3b3JkcykKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiYXJndW1lbnQgMSAoaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+KSIKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gKHN0cihlKSA9PSBzKQotICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICB3aGVuX25vdF9za2lwcGVkID0gRmFsc2UKIAogICAgICAgICAgICAgIyB0ZXN0IHRoZSBmb3JtYXQgdW5pdCB3aGVuIHNraXBwZWQKQEAgLTUwMyw3ICs1MDYsNyBAQAogICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5wYXJzZV90dXBsZV9hbmRfa2V5d29yZHMoZW1wdHlfdHVwbGUsIGRpY3RfYiwKICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9ybWF0LmVuY29kZSgiYXNjaWkiKSwga2V5d29yZHMpCiAgICAgICAgICAgICAgICAgd2hlbl9za2lwcGVkID0gRmFsc2UKLSAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvciBhcyBlOgogICAgICAgICAgICAgICAgIHMgPSAiaW1wb3NzaWJsZTxiYWQgZm9ybWF0IGNoYXI+OiAne30nIi5mb3JtYXQoZm9ybWF0KQogICAgICAgICAgICAgICAgIHdoZW5fc2tpcHBlZCA9IChzdHIoZSkgPT0gcykKIApAQCAtNTI0LDYgKzUyNywzMiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoKSwge30sIGInJywgWzQyXSkKIAorICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfb25seShzZWxmKToKKyAgICAgICAgcGFyc2UgPSBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzCisKKyAgICAgICAgcGFyc2UoKDEsIDIsIDMpLCB7fSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwgMiksIHsnYSc6IDN9LCBiJ09PTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDIgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgxIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHsnYSc6IDN9LCBiJ09PTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098T08nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICdGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAxIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMCBnaXZlblwpJyk6CisgICAgICAgICAgICBwYXJzZSgoKSwge30sIGInT3xPTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCAyKSwgeydhJzogM30sIGInT08kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIHRha2VzIGV4YWN0bHkgMiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDEgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKDEsKSwgeydhJzogM30sIGInT08kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098TyRPJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAnRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKCksIHt9LCBiJ098TyRPJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUVycm9yLCAnRW1wdHkgcGFyYW1ldGVyIG5hbWUgYWZ0ZXIgXCQnKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098JE9PJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5c3RlbUVycm9yLCAnRW1wdHkga2V5d29yZCcpOgorICAgICAgICAgICAgcGFyc2UoKDEsKSwge30sIGInT3xPTycsIFsnJywgJ2EnLCAnJ10pCisKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKIGNsYXNzIFRlc3RUaHJlYWRTdGF0ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTU0OCw2ICs1NzcsNyBAQAogICAgICAgICB0LnN0YXJ0KCkKICAgICAgICAgdC5qb2luKCkKIAorCiBjbGFzcyBUZXN0X3Rlc3RjYXBpKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9fdGVzdGNhcGkoc2VsZik6CiAgICAgICAgIGZvciBuYW1lIGluIGRpcihfdGVzdGNhcGkpOgpAQCAtNTU2LDUgKzU4Niw4NCBAQAogICAgICAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihfdGVzdGNhcGksIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgIHRlc3QoKQogCisKK2NsYXNzIFB5TWVtRGVidWdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgUFlUSE9OTUFMTE9DID0gJ2RlYnVnJworICAgICMgJzB4MDRjMDZlMCcgb3IgJzA0QzA2RTAnCisgICAgUFRSX1JFR0VYID0gcicoPzoweCk/WzAtOWEtZkEtRl0rJworCisgICAgZGVmIGNoZWNrKHNlbGYsIGNvZGUpOgorICAgICAgICB3aXRoIHN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpOgorICAgICAgICAgICAgb3V0ID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctYycsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFlUSE9OTUFMTE9DPXNlbGYuUFlUSE9OTUFMTE9DKQorICAgICAgICBzdGRlcnIgPSBvdXQuZXJyCisgICAgICAgIHJldHVybiBzdGRlcnIuZGVjb2RlKCdhc2NpaScsICdyZXBsYWNlJykKKworICAgIGRlZiB0ZXN0X2J1ZmZlcl9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjaygnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5bWVtX2J1ZmZlcl9vdmVyZmxvdygpJykKKyAgICAgICAgcmVnZXggPSAociJEZWJ1ZyBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyBwPXtwdHJ9OiBBUEkgJ20nXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIDE2IGJ5dGVzIG9yaWdpbmFsbHkgcmVxdWVzdGVkXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIFRoZSBbMC05XSBwYWQgYnl0ZXMgYXQgcC1bMC05XSBhcmUgRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIFRoZSBbMC05XSBwYWQgYnl0ZXMgYXQgdGFpbD17cHRyfSBhcmUgbm90IGFsbCBGT1JCSURERU5CWVRFIFwoMHhbMC05YS1mXXt7Mn19XCk6XG4iCisgICAgICAgICAgICAgICAgIHIiICAgICAgICBhdCB0YWlsXCswOiAweDc4IFwqXCpcKiBPVUNIXG4iCisgICAgICAgICAgICAgICAgIHIiICAgICAgICBhdCB0YWlsXCsxOiAweGZiXG4iCisgICAgICAgICAgICAgICAgIHIiICAgICAgICBhdCB0YWlsXCsyOiAweGZiXG4iCisgICAgICAgICAgICAgICAgIHIiICAgICAgICAuKlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjWzAtOV0rIHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBEYXRhIGF0IHA6IGNiIGNiIGNiIC4qXG4iCisgICAgICAgICAgICAgICAgIHIiXG4iCisgICAgICAgICAgICAgICAgIHIiRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgdHJhaWxpbmcgcGFkIGJ5dGUiKQorICAgICAgICByZWdleCA9IHJlZ2V4LmZvcm1hdChwdHI9c2VsZi5QVFJfUkVHRVgpCisgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyZWdleCwgZmxhZ3M9cmUuRE9UQUxMKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KG91dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9hcGlfbWlzdXNlKHNlbGYpOgorICAgICAgICBvdXQgPSBzZWxmLmNoZWNrKCdpbXBvcnQgX3Rlc3RjYXBpOyBfdGVzdGNhcGkucHltZW1fYXBpX21pc3VzZSgpJykKKyAgICAgICAgcmVnZXggPSAociJEZWJ1ZyBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyBwPXtwdHJ9OiBBUEkgJ20nXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIDE2IGJ5dGVzIG9yaWdpbmFsbHkgcmVxdWVzdGVkXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIFRoZSBbMC05XSBwYWQgYnl0ZXMgYXQgcC1bMC05XSBhcmUgRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIFRoZSBbMC05XSBwYWQgYnl0ZXMgYXQgdGFpbD17cHRyfSBhcmUgRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIFRoZSBibG9jayB3YXMgbWFkZSBieSBjYWxsICNbMC05XSsgdG8gZGVidWcgbWFsbG9jL3JlYWxsb2MuXG4iCisgICAgICAgICAgICAgICAgIHIiICAgIERhdGEgYXQgcDogY2IgY2IgY2IgLipcbiIKKyAgICAgICAgICAgICAgICAgciJcbiIKKyAgICAgICAgICAgICAgICAgciJGYXRhbCBQeXRob24gZXJyb3I6IGJhZCBJRDogQWxsb2NhdGVkIHVzaW5nIEFQSSAnbScsIHZlcmlmaWVkIHVzaW5nIEFQSSAncidcbiIpCisgICAgICAgIHJlZ2V4ID0gcmVnZXguZm9ybWF0KHB0cj1zZWxmLlBUUl9SRUdFWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXQsIHJlZ2V4KQorCisgICAgZGVmIGNoZWNrX21hbGxvY193aXRob3V0X2dpbChzZWxmLCBjb2RlKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjayhjb2RlKQorICAgICAgICBleHBlY3RlZCA9ICgnRmF0YWwgUHl0aG9uIGVycm9yOiBQeXRob24gbWVtb3J5IGFsbG9jYXRvciBjYWxsZWQgJworICAgICAgICAgICAgICAgICAgICAnd2l0aG91dCBob2xkaW5nIHRoZSBHSUwnKQorICAgICAgICBzZWxmLmFzc2VydEluKGV4cGVjdGVkLCBvdXQpCisKKyAgICBkZWYgdGVzdF9weW1lbV9tYWxsb2Nfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgRGVidWcgaG9va3MgbXVzdCByYWlzZSBhbiBlcnJvciBpZiBQeU1lbV9NYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgIyB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICBjb2RlID0gJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW1lbV9tYWxsb2Nfd2l0aG91dF9naWwoKScKKyAgICAgICAgc2VsZi5jaGVja19tYWxsb2Nfd2l0aG91dF9naWwoY29kZSkKKworICAgIGRlZiB0ZXN0X3B5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbChzZWxmKToKKyAgICAgICAgIyBEZWJ1ZyBob29rcyBtdXN0IHJhaXNlIGFuIGVycm9yIGlmIFB5T2JqZWN0X01hbGxvYygpIGlzIGNhbGxlZAorICAgICAgICAjIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMCisgICAgICAgIGNvZGUgPSAnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbCgpJworICAgICAgICBzZWxmLmNoZWNrX21hbGxvY193aXRob3V0X2dpbChjb2RlKQorCisKK2NsYXNzIFB5TWVtTWFsbG9jRGVidWdUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgIFBZVEhPTk1BTExPQyA9ICdtYWxsb2NfZGVidWcnCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdXSVRIX1BZTUFMTE9DJykgPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICduZWVkIHB5bWFsbG9jJykKK2NsYXNzIFB5TWVtUHltYWxsb2NEZWJ1Z1Rlc3RzKFB5TWVtRGVidWdUZXN0cyk6CisgICAgUFlUSE9OTUFMTE9DID0gJ3B5bWFsbG9jX2RlYnVnJworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKFB5X0RFQlVHLCAnbmVlZCBQeV9ERUJVRycpCitjbGFzcyBQeU1lbURlZmF1bHRUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgICMgdGVzdCBkZWZhdWx0IGFsbG9jYXRvciBvZiBQeXRob24gY29tcGlsZWQgaW4gZGVidWcgbW9kZQorICAgIFBZVEhPTk1BTExPQyA9ICcnCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5IGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKaW5kZXggYWI5ZjZhYi4uMTY0Nzg0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jZ2kucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jZ2kucHkKQEAgLTcsNiArNyw3IEBACiBpbXBvcnQgd2FybmluZ3MKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPLCBCeXRlc0lPCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogY2xhc3MgSGFja2VkU3lzTW9kdWxlOgogICAgICMgVGhlIHJlZ3Jlc3Npb24gdGVzdCB3aWxsIGhhdmUgcmVhbCB2YWx1ZXMgaW4gc3lzLmFyZ3YsIHdoaWNoCkBAIC00NzMsNiArNDc0LDExIEBACiAgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCdmb3JtLWRhdGE7IG5hbWU9ImZpbGVzIjsgZmlsZW5hbWU9ImZvXFwibztiYXIiJyksCiAgICAgICAgICAgICAoImZvcm0tZGF0YSIsIHsibmFtZSI6ICJmaWxlcyIsICJmaWxlbmFtZSI6ICdmbyJvO2Jhcid9KSkKIAorICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geyJsb2dmaWxlIiwgImxvZ2ZwIiwgImluaXRsb2ciLCAiZG9sb2ciLCAibm9sb2ciLAorICAgICAgICAgICAgICAgICAgICAgImNsb3NlbG9nIiwgImxvZyIsICJtYXhsZW4iLCAidmFsaWRfYm91bmRhcnkifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBjZ2ksIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKIAogQk9VTkRBUlkgPSAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0IgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CmluZGV4IDQwNjRhZWYuLjBkNDU5NGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CkBAIC05LDcgKzksNyBAQAogCiAiIiIjIgogCi1pbXBvcnQgdGVzdC5zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiAKIGltcG9ydCBjb2RlY3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weSBiL0xpYi90ZXN0L3Rlc3RfY2xhc3MucHkKaW5kZXggNGQ1NTRhMy4uZTAyYTNjYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbGFzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NsYXNzLnB5CkBAIC01NjgsNSArNTY4LDE1IEBACiAgICAgICAgIGEgPSBBKGhhc2goQS5mKV4oLTEpKQogICAgICAgICBoYXNoKGEuZikKIAorICAgIGRlZiB0ZXN0X2NsYXNzX3JlcHIoc2VsZik6CisgICAgICAgICMgV2Ugc2hvdWxkIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gcmVwcihBKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KHJlc3VsdCwKKyAgICAgICAgICAgICI8Y2xhc3MgJ3Rlc3QudGVzdF9jbGFzcy5DbGFzc1Rlc3RzLnRlc3RfY2xhc3NfcmVwci48bG9jYWxzPi5BJyIKKyAgICAgICAgICAgICIgYXQgMHguKz4iKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weSBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKaW5kZXggZGNlNDE4Yi4uOGZhYThlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CkBAIC0zNDgsOCArMzQ4LDkgQEAKICAgICAgICAgICAgIHRlc3Quc3VwcG9ydC5TdXBwcmVzc0NyYXNoUmVwb3J0KCkuX19lbnRlcl9fKCkKICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ3gnKQogICAgICAgICAgICAgb3MuY2xvc2Uoc3lzLnN0ZG91dC5maWxlbm8oKSkiIiIKLSAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLWMnLCBjb2RlKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1jJywgY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjAsIHJjKQogICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KGVyci5kZWNvZGUoJ2FzY2lpJywgJ2lnbm9yZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICdFeGNlcHRpb24gaWdub3JlZCBpbi4qXG5PU0Vycm9yOiAuKicpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKaW5kZXggYjJiZTliMS4uZTdjNjM1MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKQEAgLTEyNyw3ICsxMjcsMTAgQEAKICAgICAgICAgICAgIHByaW50KHByaW50ZWRfcGFja2FnZSkKICAgICAgICAgICAgIHByaW50KHByaW50ZWRfYXJndjApCiAgICAgICAgICAgICBwcmludChwcmludGVkX2N3ZCkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihwcmludGVkX2xvYWRlci5lbmNvZGUoJ3V0Zi04JyksIGRhdGEpCisgICAgICAgIGV4cGVjdGVkID0gcHJpbnRlZF9sb2FkZXIuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGlkeCA9IGV4cGVjdGVkLmZpbmQoYiJhdCAweCIpCisgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRbOmlkeF0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgZGF0YSkKICAgICAgICAgc2VsZi5hc3NlcnRJbihwcmludGVkX2ZpbGUuZW5jb2RlKCd1dGYtOCcpLCBkYXRhKQogICAgICAgICBzZWxmLmFzc2VydEluKHByaW50ZWRfcGFja2FnZS5lbmNvZGUoJ3V0Zi04JyksIGRhdGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHJpbnRlZF9hcmd2MC5lbmNvZGUoJ3V0Zi04JyksIGRhdGEpCkBAIC0xMzgsOSArMTQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGF0aDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcGFja2FnZSwgZXhwZWN0ZWRfbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbWRfbGluZV9zd2l0Y2hlcyk6Ci0gICAgICAgIGlmIG5vdCBfX2RlYnVnX186Ci0gICAgICAgICAgICBjbWRfbGluZV9zd2l0Y2hlcyArPSAoJy0nICsgJ08nICogc3lzLmZsYWdzLm9wdGltaXplLCkKLSAgICAgICAgcnVuX2FyZ3MgPSBjbWRfbGluZV9zd2l0Y2hlcyArIChzY3JpcHRfbmFtZSwpICsgdHVwbGUoZXhhbXBsZV9hcmdzKQorICAgICAgICBydW5fYXJncyA9IFsqc3VwcG9ydC5vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgKmNtZF9saW5lX3N3aXRjaGVzLCBzY3JpcHRfbmFtZSwgKmV4YW1wbGVfYXJnc10KICAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygqcnVuX2FyZ3MsIF9faXNvbGF0ZWQ9RmFsc2UpCiAgICAgICAgIHNlbGYuX2NoZWNrX291dHB1dChzY3JpcHRfbmFtZSwgcmMsIG91dCArIGVyciwgZXhwZWN0ZWRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2FyZ3YwLCBleHBlY3RlZF9wYXRoMCwKQEAgLTE1OSw2ICsxNjEsOCBAQAogICAgIGRlZiB0ZXN0X2Rhc2hfY19sb2FkZXIoc2VsZik6CiAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soIi1jIiwgInByaW50KF9fbG9hZGVyX18pIikKICAgICAgICAgZXhwZWN0ZWQgPSByZXByKGltcG9ydGxpYi5tYWNoaW5lcnkuQnVpbHRpbkltcG9ydGVyKS5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaWR4ID0gZXhwZWN0ZWQuZmluZChiImF0IDB4IikKKyAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZFs6aWR4XQogICAgICAgICBzZWxmLmFzc2VydEluKGV4cGVjdGVkLCBvdXQpCiAKICAgICBkZWYgdGVzdF9zdGRpbl9sb2FkZXIoc2VsZik6CkBAIC0xNzIsNiArMTc2LDggQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG91dCA9IGtpbGxfcHl0aG9uKHApCiAgICAgICAgIGV4cGVjdGVkID0gcmVwcihpbXBvcnRsaWIubWFjaGluZXJ5LkJ1aWx0aW5JbXBvcnRlcikuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGlkeCA9IGV4cGVjdGVkLmZpbmQoYiJhdCAweCIpCisgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRbOmlkeF0KICAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgb3V0KQogCiAgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CmluZGV4IGVlMWUyOGEuLmM4Y2RhY2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB0ZXN0LnN1cHBvcnQKIGltcG9ydCB1bmljb2RlZGF0YQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgUG9zUmV0dXJuOgogICAgICMgdGhpcyBjYW4gYmUgdXNlZCBmb3IgY29uZmlndXJhYmxlIGNhbGxiYWNrcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggZDBlM2ExNS4uM2JkZjdkMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CmluZGV4IGJiOWJlMTEuLmM1ZTJmOTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weQppbmRleCA4YTNjYTcwLi4wMGVhMWMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CkBAIC0xLDYgKzEsNSBAQAogIyBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSVNPIDIwMjIgZW5jb2RpbmdzLgogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CmluZGV4IDQ0YjYzYTAuLjk0Mzc4ZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CmluZGV4IGI2YTc0ZmIuLjg2M2QxNmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQppbmRleCA5MTc0Mjk2Li5iYjFkMTMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MuCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQppbmRleCBmMWJkMzg0Li44OWU1MWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQppbmRleCA0YzBjNDE1Li43YTQ4ZDI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CmluZGV4IDU3NzM4MjMuLmZkZmVjODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKaW5kZXggNmNiNDFjOC4uNDcxY2Q3NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKaW5kZXggMmVhNDRiNS4uMTQ1YTk3ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9DIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggMDQ3OTU0Mi4uZDg3NTM0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTQsNyArNCw2IEBACiBpbXBvcnQgbG9jYWxlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGVuY29kaW5ncwogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTI3LDYgKzI2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlcihpbnB1dCksIChleHBlY3QsIGxlbihpbnB1dCkpKQogICAgIHJldHVybiBjaGVjawogCisKIGNsYXNzIFF1ZXVlKG9iamVjdCk6CiAgICAgIiIiCiAgICAgcXVldWU6IHdyaXRlIGJ5dGVzIGF0IG9uZSBlbmQsIHJlYWQgYnl0ZXMgZnJvbSB0aGUgb3RoZXIgZW5kCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBzZWxmLl9idWZmZXJbc2l6ZTpdCiAgICAgICAgICAgICByZXR1cm4gcwogCisKIGNsYXNzIE1peEluQ2hlY2tTdGF0ZUhhbmRsaW5nOgogICAgIGRlZiBjaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZiwgZW5jb2RpbmcsIHUsIHMpOgogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocykrMSk6CkBAIC04MCw2ICs4MSw3IEBACiAgICAgICAgICAgICBwYXJ0MiA9IGQuZW5jb2RlKHVbaTpdLCBUcnVlKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBwYXJ0MStwYXJ0MikKIAorCiBjbGFzcyBSZWFkVGVzdChNaXhJbkNoZWNrU3RhdGVIYW5kbGluZyk6CiAgICAgZGVmIGNoZWNrX3BhcnRpYWwoc2VsZiwgaW5wdXQsIHBhcnRpYWxyZXN1bHRzKToKICAgICAgICAgIyBnZXQgYSBTdHJlYW1SZWFkZXIgZm9yIHRoZSBlbmNvZGluZyBhbmQgZmVlZCB0aGUgYnl0ZXN0cmluZyB2ZXJzaW9uCkBAIC0zNTgsNiArMzYwLDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiWz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICAgICAgIyBzZXF1ZW50aWFsIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdUQ4MDBcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgImlnbm9yZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIls/P10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKwogICAgICAgICBib20gPSAiIi5lbmNvZGUoc2VsZi5lbmNvZGluZykKICAgICAgICAgZm9yIGJlZm9yZSwgYWZ0ZXIgaW4gWygiXFUwMDAxMGZmZiIsICJBIiksICgiWyIsICJdIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkEiLCAiXFUwMDAxMGZmZiIpXToKQEAgLTM4Myw2ICszOTEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X3NlcXVlbmNlLmRlY29kZShzZWxmLmVuY29kaW5nLCAiYmFja3NsYXNocmVwbGFjZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgKyBiYWNrc2xhc2hyZXBsYWNlICsgYWZ0ZXIpCiAKKwogY2xhc3MgVVRGMzJUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyIgogICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CkBAIC00NzgsNiArNDg3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXFUwMDAxMDAwMCcgKiAxMDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZGVjb2RlKGVuY29kZWRfYmUpWzBdKQogCisKIGNsYXNzIFVURjMyTEVUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyLWxlIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2UgPSBiIlx4ODBceGRjXHgwMFx4MDAiCkBAIC01MjMsNiArNTMzLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXFUwMDAxMDAwMCcgKiAxMDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlKGVuY29kZWQpWzBdKQogCisKIGNsYXNzIFVURjMyQkVUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyLWJlIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2UgPSBiIlx4MDBceDAwXHhkY1x4ODAiCkBAIC03NDcsNiArNzU4LDcgQEAKICAgICBlbmNvZGluZyA9ICJ1dGYtOCIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceGVkXHhiMlx4ODAiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZV9yZXBsYWNlID0gIlx1ZmZmZCIgKiAzCisgICAgQk9NID0gYicnCiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCkBAIC03NzUsMjcgKzc4Nyw0OSBAQAogICAgICAgICBzZWxmLmNoZWNrX3N0YXRlX2hhbmRsaW5nX2RlY29kZShzZWxmLmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LCB1LmVuY29kZShzZWxmLmVuY29kaW5nKSkKIAorICAgIGRlZiB0ZXN0X2RlY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGVycm9yX2hhbmRsZXIsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnaWdub3JlJywgJ1tdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3JlcGxhY2UnLCAnW1x1ZmZmZFx1ZmZmZF0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnc3Vycm9nYXRlZXNjYXBlJywgJ1tcdWRjODBcdWRjZmZdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLCAnW1xceDgwXFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGVycm9yX2hhbmRsZXI9ZXJyb3JfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKHNlbGYuZW5jb2RpbmcsIGVycm9yX2hhbmRsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpCisKICAgICBkZWYgdGVzdF9sb25lX3N1cnJvZ2F0ZXMoc2VsZik6CiAgICAgICAgIHN1cGVyKCkudGVzdF9sb25lX3N1cnJvZ2F0ZXMoKQogICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgaXMgbWFraW5nIHNlbnNlIGZvcgogICAgICAgICAjIFVURi0xNiBhbmQgVVRGLTMyCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoJ3V0Zi04JywgInN1cnJvZ2F0ZWVzY2FwZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInW1x4ODBdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlZXNjYXBlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceDgwXScpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgIltcdURDODBcdUQ4MDBcdURGRkZdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpCisgICAgICAgIGV4YyA9IGNtLmV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5vYmplY3RbZXhjLnN0YXJ0OmV4Yy5lbmRdLCAnXHVEODAwXHVERkZGJykKIAogICAgIGRlZiB0ZXN0X3N1cnJvZ2F0ZXBhc3NfaGFuZGxlcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiImFiY1x4ZWRceGEwXHg4MGRlZiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNceGVkXHhhMFx4ODBkZWYiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhYmNcdWQ4MDBkZWYiLmVuY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJcVTAwMDEwZmZmXHVEODAwIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdUQ4MDBcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGInW1x4ZWRceGEwXHg4MFx4ZWRceGIyXHg4MF0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNceGVkXHhhMFx4ODBkZWYiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhYmNcdWQ4MDBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJcVTAwMDEwZmZmXHVEODAwIi5lbmNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiXFUwMDAxMGZmZlx1RDgwMCIpCisKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGVjcy5sb29rdXBfZXJyb3IoInN1cnJvZ2F0ZXBhc3MiKSkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgotICAgICAgICAgICAgYiJhYmNceGVkXHhhMCIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKQorICAgICAgICAgICAgYiJhYmNceGVkXHhhMHoiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsCiAgICAgICAgICAgICAgICAgICAgICAnY3A2NTAwMSBpcyBhIFdpbmRvd3Mtb25seSBjb2RlYycpCkBAIC0xMDU5LDYgKzEwOTMsNyBAQAogCiBjbGFzcyBVVEY4U2lnVGVzdChVVEY4VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi04LXNpZyIKKyAgICBCT00gPSBjb2RlY3MuQk9NX1VURjgKIAogICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKQEAgLTExOTQsNiArMTIyOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceDBdXHgwIiwgImlnbm9yZSIpLCAoYiJbXSIsIDgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJyZXBsYWNlIiksIChiIls/XT8iLCA4KSkKIAorCiBjbGFzcyBSZWNvZGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3JlY29kaW5nKHNlbGYpOgogICAgICAgICBmID0gaW8uQnl0ZXNJTygpCkBAIC0xMzEzLDYgKzEzNDksNyBAQAogICAgIGlmIGxlbihpKSE9MjoKICAgICAgICAgcHJpbnQocmVwcihpKSkKIAorCiBjbGFzcyBQdW55Y29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKICAgICAgICAgZm9yIHVuaSwgcHVueSBpbiBwdW55Y29kZV90ZXN0Y2FzZXM6CkBAIC0xMzMyLDYgKzEzNjksNyBAQAogICAgICAgICAgICAgcHVueSA9IHB1bnkuZGVjb2RlKCJhc2NpaSIpLmVuY29kZSgiYXNjaWkiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmksIHB1bnkuZGVjb2RlKCJwdW55Y29kZSIpKQogCisKIGNsYXNzIFVuaWNvZGVJbnRlcm5hbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFNJWkVPRl9XQ0hBUl9UID09IDQsICdzcGVjaWZpYyB0byAzMi1iaXQgd2NoYXJfdCcpCiAgICAgZGVmIHRlc3RfYnVnMTI1MTMwMChzZWxmKToKQEAgLTE1ODYsNiArMTYyNCw3IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBzdXBwb3J0LlRlc3RGYWlsZWQoIlRlc3QgMy4lZDogJXMiICUgKHBvcysxLCBzdHIoZSkpKQogCisKIGNsYXNzIElETkFDb2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2J1aWx0aW5fZGVjb2RlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihiInB5dGhvbi5vcmciLCAiaWRuYSIpLCAicHl0aG9uLm9yZyIpCkBAIC0xNjcyLDYgKzE3MTEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgIGIicHl0aG9uLm9yZyIuZGVjb2RlLCAiaWRuYSIsIGVycm9ycykKIAorCiBjbGFzcyBDb2RlY3NNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKQEAgLTE3ODAsNiArMTgyMCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsCiAgICAgICAgICAgICAgICAgY29kZWNzLmRlY29kZSwgYidhYmMnLCAndW5kZWZpbmVkJywgZXJyb3JzKQogCisKIGNsYXNzIFN0cmVhbVJlYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTc5MCw2ICsxODMxLDcgQEAKICAgICAgICAgZiA9IHNlbGYucmVhZGVyKHNlbGYuc3RyZWFtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKCksIFsnXHVkNTVjXG4nLCAnXHVhZTAwJ10pCiAKKwogY2xhc3MgRW5jb2RlZEZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgpAQCAtMTkyMCw2ICsxOTYyLDcgQEAKICAgICAidW5pY29kZV9pbnRlcm5hbCIKIF0KIAorCiBjbGFzcyBCYXNpY1VuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZyk6CiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgogICAgICAgICBzID0gImFiYzEyMyIgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKQEAgLTIwODIsNiArMjEyNSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXRlX2hhbmRsaW5nX2VuY29kZShlbmNvZGluZywgdSwgdS5lbmNvZGUoZW5jb2RpbmcpKQogCisKIGNsYXNzIENoYXJtYXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9zdHJpbmdfbWFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtMjMzMiw2ICsyMzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyZWFtd3JpdGVyLCAnc3RyaWN0JykgYXMgc3J3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcncucmVhZCgpLCAiXHhmYyIpCiAKKwogY2xhc3MgVHlwZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBNb3N0IGRlY29kZXJzIGRvbid0IGFjY2VwdCB1bmljb2RlIGlucHV0CkBAIC0yNjIyLDYgKzI2NjcsNyBAQAogICAgIGJ5dGVzX3RyYW5zZm9ybV9lbmNvZGluZ3MuYXBwZW5kKCJiejJfY29kZWMiKQogICAgIHRyYW5zZm9ybV9hbGlhc2VzWyJiejJfY29kZWMiXSA9IFsiYnoyIl0KIAorCiBjbGFzcyBUcmFuc2Zvcm1Db2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgpAQCAtMzA5OSw1ICszMTQ1LDgxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZCwgKCdhYmMnLCAzKSkKIAogCitjbGFzcyBBU0NJSVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjMTIzJy5lbmNvZGUoJ2FzY2lpJyksIGInYWJjMTIzJykKKworICAgIGRlZiB0ZXN0X2VuY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGVycm9yX2hhbmRsZXIsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgICgnW1x4ODBceGZmXHUyMGFjXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAncmVwbGFjZScsIGInWz8/P10nKSwKKyAgICAgICAgICAgICgnW1x4ODBceGZmXHUyMGFjXScsICd4bWxjaGFycmVmcmVwbGFjZScsIGInWyYjMTI4OyYjMjU1OyYjODM2NDtdJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xceDgwXFx4ZmZcXHUyMGFjXFxVMDAwYWJjZGVdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnYXNjaWknLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX3N1cnJvZ2F0ZWVzY2FwZV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgIyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBkZWNvZGVkLCBidXQgbm90IHRoZSBzZWNvbmQKKyAgICAgICAgICAgICdcdWRjODBceGZmJy5lbmNvZGUoJ2FzY2lpJywgJ3N1cnJvZ2F0ZWVzY2FwZScpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMnLmRlY29kZSgnYXNjaWknKSwgJ2FiYycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZSgnYXNjaWknLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisKK2NsYXNzIExhdGluMVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgICgnYWJjJywgYidhYmMnKSwKKyAgICAgICAgICAgICgnXHg4MFx4ZTlceGZmJywgYidceDgwXHhlOVx4ZmYnKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2xhdGluMScpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9lcnJvcnMoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ2lnbm9yZScsIGInW10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAncmVwbGFjZScsIGInWz8/XScpLAorICAgICAgICAgICAgKCdbXHUyMGFjXFUwMDBhYmNkZV0nLCAnYmFja3NsYXNocmVwbGFjZScsCisgICAgICAgICAgICAgYidbXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICd4bWxjaGFycmVmcmVwbGFjZScsIGInWyYjODM2NDsmIzU2NDQ4O10nKSwKKyAgICAgICAgICAgICgnW1x1ZGM4MFx1ZGNmZl0nLCAnc3Vycm9nYXRlZXNjYXBlJywgYidbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGVycm9yX2hhbmRsZXI9ZXJyb3JfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX3N1cnJvZ2F0ZWVzY2FwZV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgIyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBkZWNvZGVkLCBidXQgbm90IHRoZSBzZWNvbmQKKyAgICAgICAgICAgICdcdWRjODBcdTIwYWMnLmVuY29kZSgnbGF0aW4xJywgJ3N1cnJvZ2F0ZWVzY2FwZScpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidhYmMnLCAnYWJjJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2xhdGluMScpLCBleHBlY3RlZCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQppbmRleCA1MDliZjVkLi45OGRhMjZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQpAQCAtMjgyLDcgKzI4Miw2IEBACiAgICAgICAgIGFpKCJpZiAoYSA9PSAxIGFuZCBiID0gMik6IHBhc3MiKQogCiAgICAgICAgIGFpKCJkZWwgMSIpCi0gICAgICAgIGFpKCJkZWwgKCkiKQogICAgICAgICBhaSgiZGVsICgxLCkiKQogICAgICAgICBhaSgiZGVsIFsxXSIpCiAgICAgICAgIGFpKCJkZWwgJzEnIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CmluZGV4IDRjMzJlMDkuLjM4MjRhODcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQpAQCAtMjAsMTAgKzIwLDEwIEBACiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDaGFpbk1hcAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBBd2FpdGFibGUsIENvcm91dGluZSwgQXN5bmNJdGVyYXRvciwgQXN5bmNJdGVyYWJsZQotZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvcgorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvciwgUmV2ZXJzaWJsZQogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgU2V0LCBNdXRhYmxlU2V0Ci1mcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIEtleXNWaWV3LCBJdGVtc1ZpZXcKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgS2V5c1ZpZXcsIEl0ZW1zVmlldywgVmFsdWVzVmlldwogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNlcXVlbmNlLCBNdXRhYmxlU2VxdWVuY2UKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBCeXRlU3RyaW5nCiAKQEAgLTY4OSw2ICs2ODksMzEgQEAKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhYmxlLCAnX19pdGVyX18nKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoSXRlcmFibGUsICdfX2l0ZXJfXycpCiAKKyAgICBkZWYgdGVzdF9SZXZlcnNpYmxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLXJldmVyc2libGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgZGljdCgpLCBzZXQoKSwgZnJvemVuc2V0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSByZXZlcnNpYmxlcworICAgICAgICBzYW1wbGVzID0gW3R1cGxlKCksIGxpc3QoKV0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBSZXZlcnNpYmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgYWxzbyBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgYW5kIFNlcXVlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFNlcXVlbmNlLCBSZXZlcnNpYmxlKSwgcmVwcihTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhNYXBwaW5nLCBSZXZlcnNpYmxlKSwgcmVwcihNYXBwaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKE11dGFibGVNYXBwaW5nLCBSZXZlcnNpYmxlKSwgcmVwcihNdXRhYmxlTWFwcGluZykpCisgICAgICAgICMgQ2hlY2sgZGlyZWN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIFIoUmV2ZXJzaWJsZSk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIobGlzdCgpKQorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChSKCkpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmbG9hdCwgUikpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhSZXZlcnNpYmxlLCAnX19yZXZlcnNlZF9fJywgJ19faXRlcl9fJykKKwogICAgIGRlZiB0ZXN0X0l0ZXJhdG9yKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosIGIiIiwgIiIsICgpLCBbXSwge30sIHNldCgpXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTg0MiwxNCArODY3LDE0IEBACiAgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShDYWxsYWJsZSwgJ19fY2FsbF9fJykKIAogICAgIGRlZiB0ZXN0X2RpcmVjdF9zdWJjbGFzc2luZyhzZWxmKToKLSAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFJldmVyc2libGUsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgogICAgICAgICAgICAgY2xhc3MgQyhCKToKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhpbnQsIEMpKQogCiAgICAgZGVmIHRlc3RfcmVnaXN0cmF0aW9uKHNlbGYpOgotICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKKyAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgUmV2ZXJzaWJsZSwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAgIyBNYWtlIHN1cmUgaXQgaXNuJ3QgaGFzaGFibGUgYnkgZGVmYXVsdAogICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQpAQCAtMTA0OSw2ICsxMDc0LDI2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmNzID4gY3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuY3MgPj0gY3MpCiAKKyAgICBkZWYgdGVzdF9pc3N1ZTI2OTE1KHNlbGYpOgorICAgICAgICAjIENvbnRhaW5lciBtZW1iZXJzaGlwIHRlc3Qgc2hvdWxkIGNoZWNrIGlkZW50aXR5IGZpcnN0CisgICAgICAgIGNsYXNzIEN1c3RvbUVxdWFsT2JqZWN0OgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGNsYXNzIEN1c3RvbVNlcXVlbmNlKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlLl9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSkKKworICAgICAgICBuYW4gPSBmbG9hdCgnbmFuJykKKyAgICAgICAgb2JqID0gQ3VzdG9tRXF1YWxPYmplY3QoKQorICAgICAgICBjb250YWluZXJzID0gWworICAgICAgICAgICAgQ3VzdG9tU2VxdWVuY2UoW25hbiwgb2JqXSksCisgICAgICAgICAgICBJdGVtc1ZpZXcoezE6IG5hbiwgMjogb2JqfSksCisgICAgICAgICAgICBWYWx1ZXNWaWV3KHsxOiBuYW4sIDI6IG9ian0pCisgICAgICAgIF0KKyAgICAgICAgZm9yIGNvbnRhaW5lciBpbiBjb250YWluZXJzOgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gY29udGFpbmVyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgY29udGFpbmVyKQorCiAgICAgZGVmIGFzc2VydFNhbWVTZXQoc2VsZiwgczEsIHMyKToKICAgICAgICAgIyBjb2VyY2UgYm90aCB0byBhIHJlYWwgc2V0IHRoZW4gY2hlY2sgZXF1YWxpdHkKICAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzZXQoczEpLCBzZXQoczIpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CmluZGV4IDJjZThhNjEuLjliNDI0YTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKQEAgLTEsNiArMSw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgY29tcGlsZWFsbAogaW1wb3J0IGltcG9ydGxpYi51dGlsCitpbXBvcnQgdGVzdC50ZXN0X2ltcG9ydGxpYi51dGlsCiBpbXBvcnQgb3MKIGltcG9ydCBwYXRobGliCiBpbXBvcnQgcHlfY29tcGlsZQpAQCAtNDAsNiArNDEsMTEgQEAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXJlY3RvcnkpCiAKKyAgICBkZWYgYWRkX2JhZF9zb3VyY2VfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5iYWRfc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdF9iYWQucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iYWRfc291cmNlX3BhdGgsICd3JykgYXMgZmlsZToKKyAgICAgICAgICAgIGZpbGUud3JpdGUoJ3ggKFxuJykKKwogICAgIGRlZiBkYXRhKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgogICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCg4KQpAQCAtNzgsMTUgKzg0LDQzIEBACiAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLnNvdXJjZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKICAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQ9VHJ1ZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgyKQorICAgICAgICAjIFRlc3QgYWdhaW5zdCBiYWQgZmlsZXMKKyAgICAgICAgc2VsZi5hZGRfYmFkX3NvdXJjZV9maWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLmJhZF9zb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD0yKSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfcGF0aChzZWxmKToKKyAgICAgICAgIyBFeGNsdWRlIExpYi90ZXN0LyB3aGljaCBjb250YWlucyBpbnZhbGlkIFB5dGhvbiBmaWxlcyBsaWtlCisgICAgICAgICMgTGliL3Rlc3QvYmFkc3ludGF4X3BlcDMxMjAucHkKKyAgICAgICAgdGVzdGRpciA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKyAgICAgICAgaWYgdGVzdGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXRhdHRyLCBzeXMsICdwYXRoJywgc3lzLnBhdGgpCisKKyAgICAgICAgICAgIHN5cy5wYXRoID0gbGlzdChzeXMucGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUodGVzdGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX3BhdGgocXVpZXQ9MikpCisKKyAgICAgICAgd2l0aCB0ZXN0LnRlc3RfaW1wb3J0bGliLnV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W3NlbGYuZGlyZWN0b3J5XSk6CisgICAgICAgICAgICBzZWxmLmFkZF9iYWRfc291cmNlX2ZpbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgcXVpZXQ9MikpCiAKICAgICBkZWYgdGVzdF9ub19weWNhY2hlX2luX25vbl9wYWNrYWdlKHNlbGYpOgogICAgICAgICAjIEJ1ZyA4NTYzIHJlcG9ydGVkIHRoYXQgX19weWNhY2hlX18gZGlyZWN0b3JpZXMgZ290IGNyZWF0ZWQgYnkKQEAgLTE5NywxMCArMjMxLDkgQEAKICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdub3QgYWxsIGVudHJpZXMgb24gc3lzLnBhdGggYXJlIHdyaXRhYmxlJykKIAogICAgIGRlZiBfZ2V0X3J1bl9hcmdzKHNlbGYsIGFyZ3MpOgotICAgICAgICBpbnRlcnBfYXJncyA9IFsnLVMnXQotICAgICAgICBpZiBzeXMuZmxhZ3Mub3B0aW1pemU6Ci0gICAgICAgICAgICBpbnRlcnBfYXJncy5hcHBlbmQoezEgOiAnLU8nLCAyIDogJy1PTyd9W3N5cy5mbGFncy5vcHRpbWl6ZV0pCi0gICAgICAgIHJldHVybiBpbnRlcnBfYXJncyArIFsnLW0nLCAnY29tcGlsZWFsbCddICsgbGlzdChhcmdzKQorICAgICAgICByZXR1cm4gWypzdXBwb3J0Lm9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpLAorICAgICAgICAgICAgICAgICctUycsICctbScsICdjb21waWxlYWxsJywKKyAgICAgICAgICAgICAgICAqYXJnc10KIAogICAgIGRlZiBhc3NlcnRSdW5PSyhzZWxmLCAqYXJncywgKiplbnZfdmFycyk6CiAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vaygKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQppbmRleCA1MTY0MDNlLi5jMDRjODA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC0xMiw2ICsxMiwzOSBAQAogICAgIHRocmVhZGluZyA9IE5vbmUKIAogCitjbGFzcyBUZXN0QWJzdHJhY3RDb250ZXh0TWFuYWdlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lbnRlcihzZWxmKToKKyAgICAgICAgY2xhc3MgRGVmYXVsdEVudGVyKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9fZXhpdF9fKCphcmdzKQorCisgICAgICAgIG1hbmFnZXIgPSBEZWZhdWx0RW50ZXIoKQorICAgICAgICBzZWxmLmFzc2VydElzKG1hbmFnZXIuX19lbnRlcl9fKCksIG1hbmFnZXIpCisKKyAgICBkZWYgdGVzdF9leGl0X2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBNaXNzaW5nRXhpdChBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBNaXNzaW5nRXhpdCgpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3R1cmFsX3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBNYW5hZ2VyRnJvbVNjcmF0Y2g6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE1hbmFnZXJGcm9tU2NyYXRjaCwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcikpCisKKyAgICAgICAgY2xhc3MgRGVmYXVsdEVudGVyKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9fZXhpdF9fKCphcmdzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKERlZmF1bHRFbnRlciwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcikpCisKKwogY2xhc3MgQ29udGV4dE1hbmFnZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9wbGFpbihzZWxmKToKQEAgLTg5LDcgKzEyMiw3IEBACiAgICAgICAgIGRlZiB3b29ob28oKToKICAgICAgICAgICAgIHlpZWxkCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgICAgIHdpdGggd29vaG9vKCk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHN0b3BfZXhjCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKaW5kZXggMGUxZjY3MC4uNDVhNjkyMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQpAQCAtOTgsNyArOTgsNyBAQAogICAgICAgICB0ZXN0cyA9IFtOb25lLCAuLi4sIE5vdEltcGxlbWVudGVkLAogICAgICAgICAgICAgICAgICA0MiwgMioqMTAwLCAzLjE0LCBUcnVlLCBGYWxzZSwgMWosCiAgICAgICAgICAgICAgICAgICJoZWxsbyIsICJoZWxsb1x1MTIzNCIsIGYuX19jb2RlX18sCi0gICAgICAgICAgICAgICAgIGIid29ybGQiLCBieXRlcyhyYW5nZSgyNTYpKSwgcmFuZ2UoMTApLAorICAgICAgICAgICAgICAgICBiIndvcmxkIiwgYnl0ZXMocmFuZ2UoMjU2KSksIHJhbmdlKDEwKSwgc2xpY2UoMSwgMTAsIDIpLAogICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgQ2xhc3NpYywgbWF4LCBXaXRoTWV0YWNsYXNzXQogICAgICAgICBmb3IgeCBpbiB0ZXN0czoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29weS5jb3B5KHgpLCB4KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkKaW5kZXggZjE4OTgzZi4uNTNmODkxNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nwcm9maWxlLnB5CkBAIC02LDcgKzYsNyBAQAogIyByaXAgb2ZmIGFsbCBpbnRlcmVzdGluZyBzdHVmZiBmcm9tIHRlc3RfcHJvZmlsZQogaW1wb3J0IGNQcm9maWxlCiBmcm9tIHRlc3QudGVzdF9wcm9maWxlIGltcG9ydCBQcm9maWxlVGVzdCwgcmVnZW5lcmF0ZV9leHBlY3RlZF9vdXRwdXQKLWZyb20gdGVzdC5wcm9maWxlZSBpbXBvcnQgdGVzdGZ1bmMKKwogCiBjbGFzcyBDUHJvZmlsZVRlc3QoUHJvZmlsZVRlc3QpOgogICAgIHByb2ZpbGVyY2xhc3MgPSBjUHJvZmlsZS5Qcm9maWxlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nzdi5weSBiL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CmluZGV4IDc3YzMxNWUuLmU5N2M5ZjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CkBAIC0yLDkgKzIsNyBAQAogIyBjc3YgcGFja2FnZSB1bml0IHRlc3RzCiAKIGltcG9ydCBjb3B5Ci1pbXBvcnQgaW8KIGltcG9ydCBzeXMKLWltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZW1wZmlsZSBpbXBvcnQgVGVtcG9yYXJ5RmlsZQpAQCAtNDI2LDE3ICs0MjQsMTYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IC0xKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWFkZXIsIFtdLCBxdW90aW5nID0gMTAwKQogCi0gICAgIyBTZWUgaXNzdWUgIzIyOTk1Ci0gICAgIyMgZGVmIHRlc3RfY29weShzZWxmKToKLSAgICAjIyAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKLSAgICAjIyAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKLSAgICAjIyAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weS5jb3B5LCBkaWFsZWN0KQorICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6CisgICAgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHkuY29weSwgZGlhbGVjdCkKIAotICAgICMjIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSAgICAjIyAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKLSAgICAjIyAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKLSAgICAjIyAgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgotICAgICMjICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGlja2xlLmR1bXBzLCBkaWFsZWN0LCBwcm90bykKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6CisgICAgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCisgICAgICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZGlhbGVjdCwgcHJvdG8pCiAKIGNsYXNzIFRlc3RDc3ZCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgcmVhZGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CkBAIC0xMDgwLDcgKzEwNzcsNiBAQAogICAgICAgICAgICAgICJGcmFuw6dvaXMgUGluYXJkIl0KIAogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVhZChzZWxmKToKLSAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgidysiLCBuZXdsaW5lPScnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlb2JqOgogICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiLCIuam9pbihzZWxmLm5hbWVzKSArICJcclxuIikKICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQpAQCAtMTA4OSw3ICsxMDg1LDYgQEAKIAogCiAgICAgZGVmIHRlc3RfdW5pY29kZV93cml0ZShzZWxmKToKLSAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgidysiLCBuZXdsaW5lPScnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlb2JqOgogICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQogICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHNlbGYubmFtZXMpCkBAIC0xMDk4LDUgKzEwOTMsMTEgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsnX19kb2NfXycsICdfX3ZlcnNpb25fXyd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGNzdiwgKCdjc3YnLCAnX2NzdicpLCBleHRyYT1leHRyYSkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2RibS5weQppbmRleCA2MjNkOTkyLi5mMGE0MjhkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibS5weQpAQCAtMSw2ICsxLDUgQEAKICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgZGJtLm9wZW4gZnVuY3Rpb24gYmFzZWQgb24gdGVzdGR1bWJkYm0ucHkiIiIKIAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBnbG9iCiBpbXBvcnQgdGVzdC5zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkgYi9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkKaW5kZXggYTc4MDhmNS4uMzA0YjMzMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtX2dudS5weQpAQCAtMiw3ICsyLDcgQEAKIGdkYm0gPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoImRibS5nbnUiKSAjc2tpcCBpZiBub3Qgc3VwcG9ydGVkCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcwotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgdW5saW5rCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCB1bmxpbmsKIAogCiBmaWxlbmFtZSA9IFRFU1RGTgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weSBiL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkKaW5kZXggMjI5MTU2MS4uNDlmNDQyNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibV9uZGJtLnB5CkBAIC0xLDggKzEsNiBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBzdXBwb3J0LmltcG9ydF9tb2R1bGUoImRibS5uZGJtIikgI3NraXAgaWYgbm90IHN1cHBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgb3MKLWltcG9ydCByYW5kb20KIGltcG9ydCBkYm0ubmRibQogZnJvbSBkYm0ubmRibSBpbXBvcnQgZXJyb3IKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IGNkZTVkNzguLjY0ZTFjYzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTIwNDcsNiArMjA0NywzOSBAQAogICAgICAgICBkID0gRGVjaW1hbCggKDEsICgwLCAyLCA3LCAxKSwgJ0YnKSApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMSwgKDAsKSwgJ0YnKSkKIAorICAgIGRlZiB0ZXN0X2FzX2ludGVnZXJfcmF0aW8oc2VsZik6CisgICAgICAgIERlY2ltYWwgPSBzZWxmLmRlY2ltYWwuRGVjaW1hbAorCisgICAgICAgICMgZXhjZXB0aW9uYWwgY2FzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCctaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLW5hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJ3NuYW4xMjMnKSkKKworICAgICAgICBmb3IgZXhwIGluIHJhbmdlKC00LCAyKToKKyAgICAgICAgICAgIGZvciBjb2VmZiBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICBmb3Igc2lnbiBpbiAnKycsICctJzoKKyAgICAgICAgICAgICAgICAgICAgZCA9IERlY2ltYWwoJyVzJWRFJWQnICUgKHNpZ24sIGNvZWZmLCBleHApKQorICAgICAgICAgICAgICAgICAgICBwcSA9IGQuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICAgICAgICAgICAgIHAsIHEgPSBwcQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgcmV0dXJuIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBxLCB0dXBsZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHAsIGludCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHEsIGludCkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIG5vcm1hbGl6YXRpb246ICBxIHNob3VsZCBiZSBwb3NpdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgIyBwIHNob3VsZCBiZSByZWxhdGl2ZWx5IHByaW1lIHRvIHEuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihxLCAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZ2NkKHAsIHEpLCAxKQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdGhhdCBwL3EgYWN0dWFsbHkgZ2l2ZXMgdGhlIGNvcnJlY3QgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKHApIC8gRGVjaW1hbChxKSwgZCkKKwogICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgogICAgICAgICAjIERpZmZlcmVudCBiZWhhdmlvdXJzIHdoZW4gc3ViY2xhc3NpbmcgRGVjaW1hbAogICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CmluZGV4IGE5MGJjMmIuLjViYjRlMTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICBkMiA9IGRlZmF1bHRkaWN0KGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGludCkKICAgICAgICAgZDJbMTJdID0gNDIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQyKSwgImRlZmF1bHRkaWN0KDxjbGFzcyAnaW50Jz4sIHsxMjogNDJ9KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgocmVwcihkMiksIHIiZGVmYXVsdGRpY3RcKDxjbGFzcyAnaW50JyBhdCAweC4rPiwgezEyOiA0Mn1cKSIpCiAgICAgICAgIGRlZiBmb28oKTogcmV0dXJuIDQzCiAgICAgICAgIGQzID0gZGVmYXVsdGRpY3QoZm9vKQogICAgICAgICBzZWxmLmFzc2VydFRydWUoZDMuZGVmYXVsdF9mYWN0b3J5IGlzIGZvbykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CmluZGV4IGY1MjU0MjkuLjRmZDBjYzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQpAQCAtMjg5LDcgKzI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaW5kZXgoZWxlbWVudCwgc3RhcnQsIHN0b3ApLCB0YXJnZXQpCiAKLSAgICBkZWYgdGVzdF9pbnNlcnRfYnVnXzI0OTEzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2luZGV4X2J1Z18yNDkxMyhzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKCdBJyAqIDMpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CiAgICAgICAgICAgICBpID0gZC5pbmRleCgiSGVsbG8gd29ybGQiLCAwLCA0KQpAQCAtNjIyLDIwICs2MjIsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgotICAgICAgICBkID0gZGVxdWUocmFuZ2UoMjAwKSkKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoZCwgaSkKLSAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorICAgICAgICBmb3IgZCBpbiBkZXF1ZShyYW5nZSgyMDApKSwgZGVxdWUocmFuZ2UoMjAwKSwgMTAwKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkLCBpKQorICAgICAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGUpLCBpZChkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZSksIGxpc3QoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1heGxlbiwgZC5tYXhsZW4pCiAKLSMjICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6Ci0jIyAgICAgICAgZCA9IGRlcXVlKCdhYmMnKQotIyMgICAgICAgIGQuYXBwZW5kKGQpCi0jIyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKLSMjICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCi0jIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlWy0xXSkpCisgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgZm9yIGQgaW4gZGVxdWUoJ2FiYycpLCBkZXF1ZSgnYWJjJywgMyk6CisgICAgICAgICAgICBkLmFwcGVuZChkKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkLCBpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGUpLCBpZChkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGVbLTFdKSwgaWQoZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1heGxlbiwgZC5tYXhsZW4pCiAKICAgICBkZWYgdGVzdF9pdGVyYXRvcl9waWNrbGUoc2VsZik6CiAgICAgICAgIG9yaWcgPSBkZXF1ZShyYW5nZSgyMDApKQpAQCAtNjk2LDYgKzY5OCwxNSBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgZm9yIG1heGxlbiBpbiByYW5nZSgtMSwgNik6CisgICAgICAgICAgICAgICAgcyA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGogaW4gcmFuZ2UoaSldCisgICAgICAgICAgICAgICAgZCA9IGRlcXVlKHMpIGlmIG1heGxlbiA9PSAtMSBlbHNlIGRlcXVlKHMsIG1heGxlbikKKyAgICAgICAgICAgICAgICBlID0gZC5jb3B5KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLm1heGxlbiwgZS5tYXhsZW4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbCh4IGlzIHkgZm9yIHgsIHkgaW4gemlwKGQsIGUpKSkKKwogICAgIGRlZiB0ZXN0X2NvcHlfbWV0aG9kKHNlbGYpOgogICAgICAgICBtdXQgPSBbMTBdCiAgICAgICAgIGQgPSBkZXF1ZShbbXV0XSkKQEAgLTg0NSwyNCArODU2LDI2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoZSkpCiAKLSMjICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSMjICAgICAgICBkID0gRGVxdWUoJ2FiYycpCi0jIyAgICAgICAgZC5hcHBlbmQoZCkKLSMjCi0jIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQotIyMgICAgICAgIGRkID0gZC5wb3AoKQotIyMgICAgICAgIGVlID0gZS5wb3AoKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZSksIGlkKGVlKSkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCi0jIwotIyMgICAgICAgIGQueCA9IGQKLSMjICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkKSkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlLngpKQotIyMKLSMjICAgICAgICBkID0gRGVxdWVXaXRoQmFkSXRlcignYWJjJykKLSMjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZCkKKyAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGZvciBkIGluIERlcXVlKCdhYmMnKSwgRGVxdWUoJ2FiYycsIDMpOgorICAgICAgICAgICAgICAgIGQuYXBwZW5kKGQpCisKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkLCBwcm90bykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUpLCB0eXBlKGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQorICAgICAgICAgICAgICAgIGRkID0gZC5wb3AoKQorICAgICAgICAgICAgICAgIGVlID0gZS5wb3AoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZWUpLCBpZChlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUsIGQpCisKKyAgICAgICAgICAgICAgICBkLnggPSBkCisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZS54KSwgaWQoZSkpCisKKyAgICAgICAgICAgIGZvciBkIGluIERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpLCBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnLCAyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZCwgcHJvdG8pCiAKICAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgogICAgICAgICBkID0gZGVxdWUoJ2dhbGxhaGFkJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IGExMzBjZWMuLjk1NGVmMmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtNDU0NCw5ICs0NTQ0LDkgQEAKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGZvbyA9IEZvbygpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgocmVwcihmb28ubWV0aG9kKSwgIyBhY2Nlc3MgdmlhIGluc3RhbmNlCi0gICAgICAgICAgICByIjxib3VuZCBtZXRob2QgLipGb29cLm1ldGhvZCBvZiA8Y2xhc3MgJy4qRm9vJz4+IikKKyAgICAgICAgICAgIHIiPGJvdW5kIG1ldGhvZCAuKkZvb1wubWV0aG9kIG9mIDxjbGFzcyAnLipGb28nIGF0IDB4Lis+PiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgocmVwcihGb28ubWV0aG9kKSwgIyBhY2Nlc3MgdmlhIHRoZSBjbGFzcwotICAgICAgICAgICAgciI8Ym91bmQgbWV0aG9kIC4qRm9vXC5tZXRob2Qgb2YgPGNsYXNzICcuKkZvbyc+PiIpCisgICAgICAgICAgICByIjxib3VuZCBtZXRob2QgLipGb29cLm1ldGhvZCBvZiA8Y2xhc3MgJy4qRm9vJyBhdCAweC4rPj4iKQogCiAKICAgICAgICAgY2xhc3MgTXlDYWxsYWJsZToKQEAgLTQ3MzgsMTEgKzQ3MzgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoYXJncywga3dhcmdzKQogICAgICAgICBvYmogPSBDMygpCiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6Ci0gICAgICAgICAgICBpZiBwcm90byA+PSA0OgorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1Y2UocHJvdG8sIG9iaiwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxpZiBwcm90byA+PSAyOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIG9iai5fX3JlZHVjZV9leF9fKHByb3RvKQogCiAgICAgICAgIGNsYXNzIEM0OgogICAgICAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgpAQCAtNTA2MSwxMCArNTA1OCw2IEBACiAgICAgICAgICAgICAgICAga3dhcmdzID0gZ2V0YXR0cihjbHMsICdLV0FSR1MnLCB7fSkKICAgICAgICAgICAgICAgICBvYmogPSBjbHMoKmNscy5BUkdTLCAqKmt3YXJncykKICAgICAgICAgICAgICAgICBwcm90byA9IHBpY2tsZV9jb3BpZXIucHJvdG8KLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNCBhbmQgaGFzYXR0cihjbHMsICdfX2dldG5ld2FyZ3NfZXhfXycpOgotICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvcGllci5kdW1wcyhvYmosIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIG9iamNvcHkgPSBwaWNrbGVfY29waWVyLmNvcHkob2JqKQogICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9pc19jb3B5KG9iaiwgb2JqY29weSkKICAgICAgICAgICAgICAgICAjIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBzdXBwb3J0cyB0aGlzLCBtYWtlIHN1cmUgd2UgZGlkbid0IGdvCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjcnR1dC5weQppbmRleCA1MDZkMWFiLi44MGNmYTQxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKQEAgLTM3LDE2ICszNywxNiBAQAogSGVyZSdzIHRoZSBuZXcgdHlwZSBhdCB3b3JrOgogCiAgICAgPj4+IHByaW50KGRlZmF1bHRkaWN0KSAgICAgICAgICAgICAgIyBzaG93IG91ciB0eXBlCi0gICAgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuZGVmYXVsdGRpY3QnPgorICAgIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LmRlZmF1bHRkaWN0JyAuLi4+CiAgICAgPj4+IHByaW50KHR5cGUoZGVmYXVsdGRpY3QpKSAgICAgICAgIyBpdHMgbWV0YXR5cGUKLSAgICA8Y2xhc3MgJ3R5cGUnPgorICAgIDxjbGFzcyAndHlwZScgLi4uPgogICAgID4+PiBhID0gZGVmYXVsdGRpY3QoZGVmYXVsdD0wLjApICAgICMgY3JlYXRlIGFuIGluc3RhbmNlCiAgICAgPj4+IHByaW50KGEpICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHRoZSBpbnN0YW5jZQogICAgIHt9CiAgICAgPj4+IHByaW50KHR5cGUoYSkpICAgICAgICAgICAgICAgICAgIyBzaG93IGl0cyB0eXBlCi0gICAgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuZGVmYXVsdGRpY3QnPgorICAgIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LmRlZmF1bHRkaWN0JyAuLi4+CiAgICAgPj4+IHByaW50KGEuX19jbGFzc19fKSAgICAgICAgICAgICAgIyBzaG93IGl0cyBjbGFzcwotICAgIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LmRlZmF1bHRkaWN0Jz4KKyAgICA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5kZWZhdWx0ZGljdCcgLi4uPgogICAgID4+PiBwcmludCh0eXBlKGEpIGlzIGEuX19jbGFzc19fKSAgICMgaXRzIHR5cGUgaXMgaXRzIGNsYXNzCiAgICAgVHJ1ZQogICAgID4+PiBhWzFdID0gMy4yNSAgICAgICAgICAgICAgICAgICAgICMgbW9kaWZ5IHRoZSBpbnN0YW5jZQpAQCAtMTQ5LDExICsxNDksMTEgQEAKIEZvciBpbnN0YW5jZSBvZiBidWlsdC1pbiB0eXBlcywgeC5fX2NsYXNzX18gaXMgbm93IHRoZSBzYW1lIGFzIHR5cGUoeCk6CiAKICAgICA+Pj4gdHlwZShbXSkKLSAgICA8Y2xhc3MgJ2xpc3QnPgorICAgIDxjbGFzcyAnbGlzdCcgLi4uPgogICAgID4+PiBbXS5fX2NsYXNzX18KLSAgICA8Y2xhc3MgJ2xpc3QnPgorICAgIDxjbGFzcyAnbGlzdCcgLi4uPgogICAgID4+PiBsaXN0Ci0gICAgPGNsYXNzICdsaXN0Jz4KKyAgICA8Y2xhc3MgJ2xpc3QnIC4uLj4KICAgICA+Pj4gaXNpbnN0YW5jZShbXSwgbGlzdCkKICAgICBUcnVlCiAgICAgPj4+IGlzaW5zdGFuY2UoW10sIGRpY3QpCkBAIC0yNTgsMTkgKzI1OCwxOSBAQAogICAgIC4uLiAgICAgICAgIHByaW50KCJjbGFzc21ldGhvZCIsIGNscywgeSkKIAogICAgID4+PiBDLmZvbygxKQotICAgIGNsYXNzbWV0aG9kIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LkMnPiAxCisgICAgY2xhc3NtZXRob2QgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuQycgLi4uPiAxCiAgICAgPj4+IGMgPSBDKCkKICAgICA+Pj4gYy5mb28oMSkKLSAgICBjbGFzc21ldGhvZCA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5DJz4gMQorICAgIGNsYXNzbWV0aG9kIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LkMnIC4uLj4gMQogCiAgICAgPj4+IGNsYXNzIEQoQyk6CiAgICAgLi4uICAgICBwYXNzCiAKICAgICA+Pj4gRC5mb28oMSkKLSAgICBjbGFzc21ldGhvZCA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5EJz4gMQorICAgIGNsYXNzbWV0aG9kIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LkQnIC4uLj4gMQogICAgID4+PiBkID0gRCgpCiAgICAgPj4+IGQuZm9vKDEpCi0gICAgY2xhc3NtZXRob2QgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuRCc+IDEKKyAgICBjbGFzc21ldGhvZCA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5EJyAuLi4+IDEKIAogVGhpcyBwcmludHMgImNsYXNzbWV0aG9kIF9fbWFpbl9fLkQgMSIgYm90aCB0aW1lczsgaW4gb3RoZXIgd29yZHMsIHRoZQogY2xhc3MgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBmb28oKSBpcyB0aGUgY2xhc3MgaW52b2x2ZWQgaW4gdGhlCkBAIC0yODYsMTEgKzI4NiwxMSBAQAogCiAgICAgPj4+IEUuZm9vKDEpCiAgICAgRS5mb28oKSBjYWxsZWQKLSAgICBjbGFzc21ldGhvZCA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5DJz4gMQorICAgIGNsYXNzbWV0aG9kIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LkMnIC4uLj4gMQogICAgID4+PiBlID0gRSgpCiAgICAgPj4+IGUuZm9vKDEpCiAgICAgRS5mb28oKSBjYWxsZWQKLSAgICBjbGFzc21ldGhvZCA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5DJz4gMQorICAgIGNsYXNzbWV0aG9kIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LkMnIC4uLj4gMQogCiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBjYWxsIHRvIEMuZm9vKCkgZnJvbSBFLmZvbygpIHdpbGwgc2VlIGNsYXNzIEMgYXMgaXRzCiBmaXJzdCBhcmd1bWVudCwgbm90IGNsYXNzIEUuIFRoaXMgaXMgdG8gYmUgZXhwZWN0ZWQsIHNpbmNlIHRoZSBjYWxsCkBAIC0zNTAsNyArMzUwLDcgQEAKIAogICAgID4+PiBkZWwgcHJvcGVydHkgICMgdW5tYXNrIHRoZSBidWlsdGluCiAgICAgPj4+IHByb3BlcnR5Ci0gICAgPGNsYXNzICdwcm9wZXJ0eSc+CisgICAgPGNsYXNzICdwcm9wZXJ0eScgLi4uPgogCiAgICAgPj4+IGNsYXNzIEMob2JqZWN0KToKICAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmKToKQEAgLTQ3OCw3ICs0NzgsOCBAQAogICAgICMgYnVzaW5lc3MgaXMgdXNlZCB0aGUgbmFtZSBjYW4gY2hhbmdlIGRlcGVuZGluZyBvbiBob3cgdGhlIHRlc3QgaXMKICAgICAjIGludm9rZWQuCiAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCB0ZXN0X2Rlc2NydHV0Ci0gICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2Rlc2NydHV0LCB2ZXJib3NlKQorICAgIGltcG9ydCBkb2N0ZXN0CisgICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2Rlc2NydHV0LCB2ZXJib3NlLCBvcHRpb25mbGFncz1kb2N0ZXN0LkVMTElQU0lTKQogCiAjIFRoaXMgcGFydCBpc24ndCBuZWVkZWQgZm9yIHJlZ3J0ZXN0LCBidXQgZm9yIHJ1bm5pbmcgdGhlIHRlc3QgZGlyZWN0bHkuCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5CmluZGV4IDk1NTYxOGEuLmMxMzNjODEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGV2cG9sbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkKQEAgLTUsOSArNSw4IEBACiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KIGltcG9ydCBzZWxlY3QKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCBjcHl0aG9uX29ubHkKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNweXRob25fb25seQogCiBpZiBub3QgaGFzYXR0cihzZWxlY3QsICdkZXZwb2xsJykgOgogICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCd0ZXN0IHdvcmtzIG9ubHkgb24gU29sYXJpcyBPUyBmYW1pbHknKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CmluZGV4IDZkNjhlNzYuLjZjNDcwNjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKQEAgLTEsMTAgKzEsMTIgQEAKLWltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Ci0KLWltcG9ydCBjb2xsZWN0aW9ucywgcmFuZG9tLCBzdHJpbmcKK2ltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYwotaW1wb3J0IGdjLCB3ZWFrcmVmCitpbXBvcnQgZ2MKIGltcG9ydCBwaWNrbGUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTk2OSw1ICs5NzEsNiBAQAogY2xhc3MgU3ViY2xhc3NNYXBwaW5nVGVzdHMobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgogICAgIHR5cGUydGVzdCA9IERpY3QKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0Y29tcHMucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQppbmRleCAzYzhiOTVjLi4wODczMDcxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQpAQCAtMSw3ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQogIyBGb3Igc2NvcGUgdGVzdGluZy4KIGcgPSAiR2xvYmFsIHZhcmlhYmxlIgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3R2aWV3cy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CmluZGV4IGFiMjNjYTEuLjRjMjkwZmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CkBAIC0xLDMgKzEsNCBAQAoraW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHVuaXR0ZXN0CkBAIC0yMTksNiArMjIwLDI3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBwaWNrbGUuUGlja2xpbmdFcnJvciksCiAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzLCBkLml0ZW1zKCksIHByb3RvKQogCisgICAgZGVmIHRlc3RfYWJjX3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBkID0gZGljdChhPTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5LZXlzVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuSXRlcmFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmtleXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5WYWx1ZXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC52YWx1ZXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVtc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5TZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNpemVkKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuQ29udGFpbmVyKQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rpcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CmluZGV4IDBmZDEzNDguLjA5ZTY4Y2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGlzLnB5CkBAIC00MCw0MSArNDAsNDEgQEAKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICAgICAgOSBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoc2VsZikKLSAgICAgICAgICAgICAxMiBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAxOCBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgICAgIDYgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKHNlbGYpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuX19pbml0X18uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLCkKIAogZGlzX2NfaW5zdGFuY2VfbWV0aG9kX2J5dGVzID0gIiIiXAogICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgIDE4IFJFVFVSTl9WQUxVRQorICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgNiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgICA4IFNUT1JFX0FUVFIgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDApCisgICAgICAgICAxMiBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfY19jbGFzc19tZXRob2QgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgIDYgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQotICAgICAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCi0gICAgICAgICAgICAgMTIgU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTUgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTggUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChjbHMpCisgICAgICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTIgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0MuY20uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAyLCkKIAogZGlzX2Nfc3RhdGljX21ldGhvZCA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAgNiBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCi0gICAgICAgICAgICAgIDkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMTUgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQorICAgICAgICAgICAgICA2IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiICUgKF9DLnNtLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMiwpCiAKICMgQ2xhc3MgZGlzYXNzZW1ibGluZyBpbmZvIGhhcyBhbiBleHRyYSBuZXdsaW5lIGF0IGVuZC4KQEAgLTk1LDIzICs5NSwyMyBAQAogCiBkaXNfZiA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocHJpbnQpCi0gICAgICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCi0gICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgIDkgUE9QX1RPUAorICAgICAgICAgICAgICAyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorICAgICAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgICAgICA2IFBPUF9UT1AKIAotJTNkICAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgIDEzIFJFVFVSTl9WQUxVRQorJTNkICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiICUgKF9mLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMSwKICAgICAgICBfZi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIpCiAKIAogZGlzX2ZfY29fY29kZSA9ICIiIlwKICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgIDMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAgNiBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMSAoMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKLSAgICAgICAgICA5IFBPUF9UT1AKLSAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgICA0IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgIDYgUE9QX1RPUAorICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAxMCBSRVRVUk5fVkFMVUUKICIiIgogCiAKQEAgLTEyMSwyMCArMTIxLDIwIEBACiAgICAgICAgIHBhc3MKIAogZGlzX2J1ZzcwODkwMSA9ICIiIlwKLSUzZCAgICAgICAgICAgMCBTRVRVUF9MT09QICAgICAgICAgICAgICAyMyAodG8gMjYpCi0gICAgICAgICAgICAgIDMgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHJhbmdlKQotICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorJTNkICAgICAgICAgICAwIFNFVFVQX0xPT1AgICAgICAgICAgICAgIDE4ICh0byAyMCkKKyAgICAgICAgICAgICAgMiBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocmFuZ2UpCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCiAKLSUzZCAgICAgICAgICAgOSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMTApCi0gICAgICAgICAgICAgMTIgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDIgKDIgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgMTUgR0VUX0lURVIKLSAgICAgICAgPj4gICAxNiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNiAodG8gMjUpCi0gICAgICAgICAgICAgMTkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKKyUzZCAgICAgICAgICAgNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMTApCisgICAgICAgICAgICAgIDggQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDIgKDIgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisgICAgICAgICAgICAgMTAgR0VUX0lURVIKKyAgICAgICAgPj4gICAxMiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNCAodG8gMTgpCisgICAgICAgICAgICAgMTQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKIAotJTNkICAgICAgICAgIDIyIEpVTVBfQUJTT0xVVEUgICAgICAgICAgIDE2Ci0gICAgICAgID4+ICAgMjUgUE9QX0JMT0NLCi0gICAgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMjkgUkVUVVJOX1ZBTFVFCislM2QgICAgICAgICAgMTYgSlVNUF9BQlNPTFVURSAgICAgICAgICAgMTIKKyAgICAgICAgPj4gICAxOCBQT1BfQkxPQ0sKKyAgICAgICAgPj4gICAyMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAyMiBSRVRVUk5fVkFMVUUKICIiIiAlIChidWc3MDg5MDEuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIGJ1ZzcwODkwMS5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIsCiAgICAgICAgYnVnNzA4OTAxLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMykKQEAgLTE0NywyMiArMTQ3LDIyIEBACiAKIGRpc19idWcxMzMzOTgyID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgwKQotICAgICAgICAgICAgICAzIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDM1Ci0gICAgICAgICAgICAgIDYgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQotICAgICAgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCi0gICAgICAgICAgICAgMTUgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAxOCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAyMSBHRVRfSVRFUgorICAgICAgICAgICAgICAyIFBPUF9KVU1QX0lGX1RSVUUgICAgICAgIDI2CisgICAgICAgICAgICAgIDQgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEFzc2VydGlvbkVycm9yKQorICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICg8Y29kZSBvYmplY3QgPGxpc3Rjb21wPiBhdCAweC4uLiwgZmlsZSAiJXMiLCBsaW5lICVkPikKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMyAoJ2J1ZzEzMzM5ODIuPGxvY2Fscz4uPGxpc3Rjb21wPicpCisgICAgICAgICAgICAgMTAgTUFLRV9GVU5DVElPTiAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAxMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNCBHRVRfSVRFUgorICAgICAgICAgICAgIDE2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorCislM2QgICAgICAgICAgMTggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDQgKDEpCisgICAgICAgICAgICAgMjAgQklOQVJZX0FERAogICAgICAgICAgICAgIDIyIENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQorICAgICAgICAgICAgIDI0IFJBSVNFX1ZBUkFSR1MgICAgICAgICAgICAxCiAKLSUzZCAgICAgICAgICAyNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgNCAoMSkKLSAgICAgICAgICAgICAyOCBCSU5BUllfQURECi0gICAgICAgICAgICAgMjkgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCi0gICAgICAgICAgICAgMzIgUkFJU0VfVkFSQVJHUyAgICAgICAgICAgIDEKLQotJTNkICAgICA+PiAgIDM1IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgIDM4IFJFVFVSTl9WQUxVRQorJTNkICAgICA+PiAgIDI2IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDI4IFJFVFVSTl9WQUxVRQogIiIiICUgKGJ1ZzEzMzM5ODIuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIF9fZmlsZV9fLAogICAgICAgIGJ1ZzEzMzM5ODIuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLApAQCAtMTcxLDE5ICsxNzEsMTkgQEAKIAogX0JJR19MSU5FTk9fRk9STUFUID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChzcGFtKQotICAgICAgICAgICAgICAzIFBPUF9UT1AKKyAgICAgICAgICAgICAgMiBQT1BfVE9QCiAgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDYgUkVUVVJOX1ZBTFVFCiAiIiIKIAogZGlzX21vZHVsZV9leHBlY3RlZF9yZXN1bHRzID0gIiIiXAogRGlzYXNzZW1ibHkgb2YgZjoKICAgNCAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBSRVRVUk5fVkFMVUUKIAogRGlzYXNzZW1ibHkgb2YgZzoKICAgNSAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBSRVRVUk5fVkFMVUUKIAogIiIiCiAKQEAgLTE5MSwyMCArMTkxLDIwIEBACiAKIGRpc19leHByX3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKLSAgICAgICAgICAgICAgNiBCSU5BUllfQURECi0gICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCisgICAgICAgICAgICAgIDQgQklOQVJZX0FERAorICAgICAgICAgICAgICA2IFJFVFVSTl9WQUxVRQogIiIiCiAKIHNpbXBsZV9zdG10X3N0ciA9ICJ4ID0geCArIDEiCiAKIGRpc19zaW1wbGVfc3RtdF9zdHIgPSAiIiJcCiAgIDEgICAgICAgICAgIDAgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCi0gICAgICAgICAgICAgIDYgQklOQVJZX0FERAotICAgICAgICAgICAgICA3IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDEwIExPQURfQ09OU1QgICAgICAgICAgICAgICAxIChOb25lKQotICAgICAgICAgICAgIDEzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgxKQorICAgICAgICAgICAgICA0IEJJTkFSWV9BREQKKyAgICAgICAgICAgICAgNiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoTm9uZSkKKyAgICAgICAgICAgICAxMCBSRVRVUk5fVkFMVUUKICIiIgogCiBjb21wb3VuZF9zdG10X3N0ciA9ICIiIlwKQEAgLTIxNSw1NCArMjE1LDU0IEBACiAKIGRpc19jb21wb3VuZF9zdG10X3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgICAgICAgMyBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgMiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKIAotICAyICAgICAgICAgICA2IFNFVFVQX0xPT1AgICAgICAgICAgICAgIDE0ICh0byAyMykKKyAgMiAgICAgICAgICAgNCBTRVRVUF9MT09QICAgICAgICAgICAgICAxMiAodG8gMTgpCiAKLSAgMyAgICAgPj4gICAgOSBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAxNSBJTlBMQUNFX0FERAotICAgICAgICAgICAgIDE2IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDE5IEpVTVBfQUJTT0xVVEUgICAgICAgICAgICA5Ci0gICAgICAgICAgICAgMjIgUE9QX0JMT0NLCi0gICAgICAgID4+ICAgMjMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKE5vbmUpCi0gICAgICAgICAgICAgMjYgUkVUVVJOX1ZBTFVFCisgIDMgICAgID4+ICAgIDYgTE9BRF9OQU1FICAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgMTAgSU5QTEFDRV9BREQKKyAgICAgICAgICAgICAxMiBTVE9SRV9OQU1FICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNCBKVU1QX0FCU09MVVRFICAgICAgICAgICAgNgorICAgICAgICAgICAgIDE2IFBPUF9CTE9DSworICAgICAgICA+PiAgIDE4IExPQURfQ09OU1QgICAgICAgICAgICAgICAyIChOb25lKQorICAgICAgICAgICAgIDIwIFJFVFVSTl9WQUxVRQogIiIiCiAKIGRpc190cmFjZWJhY2sgPSAiIiJcCi0lM2QgICAgICAgICAgIDAgU0VUVVBfRVhDRVBUICAgICAgICAgICAgMTIgKHRvIDE1KQorJTNkICAgICAgICAgICAwIFNFVFVQX0VYQ0VQVCAgICAgICAgICAgIDEyICh0byAxNCkKIAotJTNkICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgwKQotICAgIC0tPiAgICAgICA5IEJJTkFSWV9UUlVFX0RJVklERQotICAgICAgICAgICAgIDEwIFBPUF9UT1AKLSAgICAgICAgICAgICAxMSBQT1BfQkxPQ0sKLSAgICAgICAgICAgICAxMiBKVU1QX0ZPUldBUkQgICAgICAgICAgICA0NiAodG8gNjEpCislM2QgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDApCisgICAgLS0+ICAgICAgIDYgQklOQVJZX1RSVUVfRElWSURFCisgICAgICAgICAgICAgIDggUE9QX1RPUAorICAgICAgICAgICAgIDEwIFBPUF9CTE9DSworICAgICAgICAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgIDQwICh0byA1NCkKIAotJTNkICAgICA+PiAgIDE1IERVUF9UT1AKKyUzZCAgICAgPj4gICAxNCBEVVBfVE9QCiAgICAgICAgICAgICAgMTYgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAxOSBDT01QQVJFX09QICAgICAgICAgICAgICAxMCAoZXhjZXB0aW9uIG1hdGNoKQotICAgICAgICAgICAgIDIyIFBPUF9KVU1QX0lGX0ZBTFNFICAgICAgIDYwCi0gICAgICAgICAgICAgMjUgUE9QX1RPUAotICAgICAgICAgICAgIDI2IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChlKQotICAgICAgICAgICAgIDI5IFBPUF9UT1AKLSAgICAgICAgICAgICAzMCBTRVRVUF9GSU5BTExZICAgICAgICAgICAxNCAodG8gNDcpCisgICAgICAgICAgICAgMTggQ09NUEFSRV9PUCAgICAgICAgICAgICAgMTAgKGV4Y2VwdGlvbiBtYXRjaCkKKyAgICAgICAgICAgICAyMCBQT1BfSlVNUF9JRl9GQUxTRSAgICAgICA1MgorICAgICAgICAgICAgIDIyIFBPUF9UT1AKKyAgICAgICAgICAgICAyNCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKKyAgICAgICAgICAgICAyNiBQT1BfVE9QCisgICAgICAgICAgICAgMjggU0VUVVBfRklOQUxMWSAgICAgICAgICAgMTIgKHRvIDQyKQogCi0lM2QgICAgICAgICAgMzMgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGUpCi0gICAgICAgICAgICAgMzYgTE9BRF9BVFRSICAgICAgICAgICAgICAgIDEgKF9fdHJhY2ViYWNrX18pCi0gICAgICAgICAgICAgMzkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDEgKHRiKQotICAgICAgICAgICAgIDQyIFBPUF9CTE9DSwotICAgICAgICAgICAgIDQzIFBPUF9FWENFUFQKLSAgICAgICAgICAgICA0NCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgPj4gICA0NyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICA1MCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICA1MyBERUxFVEVfRkFTVCAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICA1NiBFTkRfRklOQUxMWQotICAgICAgICAgICAgIDU3IEpVTVBfRk9SV0FSRCAgICAgICAgICAgICAxICh0byA2MSkKLSAgICAgICAgPj4gICA2MCBFTkRfRklOQUxMWQorJTNkICAgICAgICAgIDMwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChlKQorICAgICAgICAgICAgIDMyIExPQURfQVRUUiAgICAgICAgICAgICAgICAxIChfX3RyYWNlYmFja19fKQorICAgICAgICAgICAgIDM0IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAxICh0YikKKyAgICAgICAgICAgICAzNiBQT1BfQkxPQ0sKKyAgICAgICAgICAgICAzOCBQT1BfRVhDRVBUCisgICAgICAgICAgICAgNDAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgID4+ICAgNDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgNDQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgNDYgREVMRVRFX0ZBU1QgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgNDggRU5EX0ZJTkFMTFkKKyAgICAgICAgICAgICA1MCBKVU1QX0ZPUldBUkQgICAgICAgICAgICAgMiAodG8gNTQpCisgICAgICAgID4+ICAgNTIgRU5EX0ZJTkFMTFkKIAotJTNkICAgICA+PiAgIDYxIExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh0YikKLSAgICAgICAgICAgICA2NCBSRVRVUk5fVkFMVUUKKyUzZCAgICAgPj4gICA1NCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAodGIpCisgICAgICAgICAgICAgNTYgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoVFJBQ0VCQUNLX0NPREUuY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIFRSQUNFQkFDS19DT0RFLmNvX2ZpcnN0bGluZW5vICsgMiwKICAgICAgICBUUkFDRUJBQ0tfQ09ERS5jb19maXJzdGxpbmVubyArIDMsCkBAIC02NDksMTcxICs2NDksMTY5IEBACiAKIEluc3RydWN0aW9uID0gZGlzLkluc3RydWN0aW9uCiBleHBlY3RlZF9vcGluZm9fb3V0ZXIgPSBbCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MywgYXJncmVwcj0nMycsIG9mZnNldD0wLCBzdGFydHNfbGluZT0yLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9Y29kZV9vYmplY3RfZiwgYXJncmVwcj1yZXByKGNvZGVfb2JqZWN0X2YpLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mJyIsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfQ0xPU1VSRScsIG9wY29kZT0xMzQsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTIxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MCwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTI3LCBzdGFydHNfbGluZT03LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTMwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTMzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9JycsIGFyZ3JlcHI9IicnIiwgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz02LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD0zOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX0xJU1QnLCBvcGNvZGU9MTAzLCBhcmc9MCwgYXJndmFsPTAsIGFyZ3JlcHI9JycsIG9mZnNldD00Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX01BUCcsIG9wY29kZT0xMDUsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTQ1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz03LCBhcmd2YWw9J0hlbGxvIHdvcmxkIScsIGFyZ3JlcHI9IidIZWxsbyB3b3JsZCEnIiwgb2Zmc2V0PTQ4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz03LCBhcmd2YWw9NywgYXJncmVwcj0nNyBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD01MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MiwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD01NSwgc3RhcnRzX2xpbmU9OCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTgsIGFyZ3ZhbD0oMywgNCksIGFyZ3JlcHI9JygzLCA0KScsIG9mZnNldD0wLCBzdGFydHNfbGluZT0yLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz0yLCBhcmd2YWw9MiwgYXJncmVwcj0nJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9mLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfZiksIG9mZnNldD04LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J291dGVyLjxsb2NhbHM+LmYnLCBhcmdyZXByPSInb3V0ZXIuPGxvY2Fscz4uZiciLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdNQUtFX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMiwgYXJnPTksIGFyZ3ZhbD05LCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0nJywgYXJncmVwcj0iJyciLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTElTVCcsIG9wY29kZT0xMDMsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTUFQJywgb3Bjb2RlPTEwNSwgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0nSGVsbG8gd29ybGQhJywgYXJncmVwcj0iJ0hlbGxvIHdvcmxkISciLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTcsIGFyZ3ZhbD03LCBhcmdyZXByPSc3IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAogXQogCiBleHBlY3RlZF9vcGluZm9fZiA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEsIGFyZ3ZhbD01LCBhcmdyZXByPSc1Jywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTMsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0wLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9UVVBMRScsIG9wY29kZT0xMDIsIGFyZz00LCBhcmd2YWw9NCwgYXJncmVwcj0nJywgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9Y29kZV9vYmplY3RfaW5uZXIsIGFyZ3JlcHI9cmVwcihjb2RlX29iamVjdF9pbm5lciksIG9mZnNldD0yMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdvdXRlci48bG9jYWxzPi5mLjxsb2NhbHM+LmlubmVyJywgYXJncmVwcj0iJ291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInIiwgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTUFLRV9DTE9TVVJFJywgb3Bjb2RlPTEzNCwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0zMywgc3RhcnRzX2xpbmU9NSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0zOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD00Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD00NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JzQgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD01Miwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0oNSwgNiksIGFyZ3JlcHI9Jyg1LCA2KScsIG9mZnNldD0wLCBzdGFydHNfbGluZT0zLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTIsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0zLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTQsIGFyZ3ZhbD00LCBhcmdyZXByPScnLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9pbm5lciwgYXJncmVwcj1yZXByKGNvZGVfb2JqZWN0X2lubmVyKSwgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInLCBhcmdyZXByPSInb3V0ZXIuPGxvY2Fscz4uZi48bG9jYWxzPi5pbm5lciciLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdNQUtFX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMiwgYXJnPTksIGFyZ3ZhbD05LCBhcmdyZXByPScnLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0yMCwgc3RhcnRzX2xpbmU9NSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0yNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD0yNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JzQgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0naW5uZXInLCBhcmdyZXByPSdpbm5lcicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2lubmVyID0gWwogICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0wLCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MiwgYXJndmFsPSdjJywgYXJncmVwcj0nYycsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0zLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0nZScsIGFyZ3JlcHI9J2UnLCBvZmZzZXQ9MTUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MSwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NiwgYXJndmFsPTYsIGFyZ3JlcHI9JzYgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2UnLCBhcmdyZXByPSdlJywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTEsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTYsIGFyZ3ZhbD02LCBhcmdyZXByPSc2IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKIGV4cGVjdGVkX29waW5mb19qdW1weSA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTY4LCBhcmd2YWw9NzEsIGFyZ3JlcHI9J3RvIDcxJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3JhbmdlJywgYXJncmVwcj0ncmFuZ2UnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MSwgYXJndmFsPTEwLCBhcmdyZXByPScxMCcsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nR0VUX0lURVInLCBvcGNvZGU9NjgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRk9SX0lURVInLCBvcGNvZGU9OTMsIGFyZz00NCwgYXJndmFsPTYwLCBhcmdyZXByPSd0byA2MCcsIG9mZnNldD0xMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE5LCBzdGFydHNfbGluZT00LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTI1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTI5LCBzdGFydHNfbGluZT01LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MCwgYXJndmFsPSc8JywgYXJncmVwcj0nPCcsIG9mZnNldD0zNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTQ0LCBhcmd2YWw9NDQsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9MTMsIGFyZ3ZhbD0xMywgYXJncmVwcj0nJywgb2Zmc2V0PTQxLCBzdGFydHNfbGluZT02LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NDQsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9NDcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTQsIGFyZ3ZhbD0nPicsIGFyZ3JlcHI9Jz4nLCBvZmZzZXQ9NTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCUkVBS19MT09QJywgb3Bjb2RlPTgwLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01Niwgc3RhcnRzX2xpbmU9OCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9MTMsIGFyZ3ZhbD0xMywgYXJncmVwcj0nJywgb2Zmc2V0PTU3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD02MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTYxLCBzdGFydHNfbGluZT0xMCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdJIGNhbiBoYXogZWxzZSBjbGF1c2U/JywgYXJncmVwcj0iJ0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nIiwgb2Zmc2V0PTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD02Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTY4LCBhcmd2YWw9MTQyLCBhcmdyZXByPSd0byAxNDInLCBvZmZzZXQ9NzEsIHN0YXJ0c19saW5lPTExLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD03NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTMxLCBhcmd2YWw9MTMxLCBhcmdyZXByPScnLCBvZmZzZXQ9NzcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9ODAsIHN0YXJ0c19saW5lPTEyLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9ODMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTg2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD04OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTkwLCBzdGFydHNfbGluZT0xMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9OTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdJTlBMQUNFX1NVQlRSQUNUJywgb3Bjb2RlPTU2LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD05Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD05Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTEwMCwgc3RhcnRzX2xpbmU9MTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTEwMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD0xMDYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMTUsIGFyZ3ZhbD0xMTUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMDksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTc0LCBhcmd2YWw9NzQsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTIsIHN0YXJ0c19saW5lPTE1LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTE1LCBzdGFydHNfbGluZT0xNiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD0xMTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTAsIGFyZ3ZhbD0nPCcsIGFyZ3JlcHI9JzwnLCBvZmZzZXQ9MTIxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTEyNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyNywgc3RhcnRzX2xpbmU9MTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTc0LCBhcmd2YWw9NzQsIGFyZ3JlcHI9JycsIG9mZnNldD0xMjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTEzMiwgc3RhcnRzX2xpbmU9MTksIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0nV2hvIGxldCBsb2xjYXR6IGludG8gdGhpcyB0ZXN0IHN1aXRlPycsIGFyZ3JlcHI9IidXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JyIsIG9mZnNldD0xMzUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTEzOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfRklOQUxMWScsIG9wY29kZT0xMjIsIGFyZz03MywgYXJndmFsPTIxOCwgYXJncmVwcj0ndG8gMjE4Jywgb2Zmc2V0PTE0Miwgc3RhcnRzX2xpbmU9MjAsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0VYQ0VQVCcsIG9wY29kZT0xMjEsIGFyZz0xMiwgYXJndmFsPTE2MCwgYXJncmVwcj0ndG8gMTYwJywgb2Zmc2V0PTE0NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9MTQ4LCBzdGFydHNfbGluZT0yMSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NywgYXJndmFsPTAsIGFyZ3JlcHI9JzAnLCBvZmZzZXQ9MTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQklOQVJZX1RSVUVfRElWSURFJywgb3Bjb2RlPTI3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTU2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI4LCBhcmd2YWw9MTg4LCBhcmdyZXByPSd0byAxODgnLCBvZmZzZXQ9MTU3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRFVQX1RPUCcsIG9wY29kZT00LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjAsIHN0YXJ0c19saW5lPTIyLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0yLCBhcmd2YWw9J1plcm9EaXZpc2lvbkVycm9yJywgYXJncmVwcj0nWmVyb0RpdmlzaW9uRXJyb3InLCBvZmZzZXQ9MTYxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0xMCwgYXJndmFsPSdleGNlcHRpb24gbWF0Y2gnLCBhcmdyZXByPSdleGNlcHRpb24gbWF0Y2gnLCBvZmZzZXQ9MTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTg3LCBhcmd2YWw9MTg3LCBhcmdyZXByPScnLCBvZmZzZXQ9MTY3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE3Mywgc3RhcnRzX2xpbmU9MjMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTgsIGFyZ3ZhbD0nSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLicsIGFyZ3JlcHI9IidIZXJlIHdlIGdvLCBoZXJlIHdlIGdvLCBoZXJlIHdlIGdvLi4uJyIsIG9mZnNldD0xNzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE3OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTgyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0VYQ0VQVCcsIG9wY29kZT04OSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTgzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI3LCBhcmd2YWw9MjE0LCBhcmdyZXByPSd0byAyMTQnLCBvZmZzZXQ9MTg0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTg4LCBzdGFydHNfbGluZT0yNSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfV0lUSCcsIG9wY29kZT0xNDMsIGFyZz0xNywgYXJndmFsPTIxMSwgYXJncmVwcj0ndG8gMjExJywgb2Zmc2V0PTE5MSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MSwgYXJndmFsPSdkb2RneScsIGFyZ3JlcHI9J2RvZGd5Jywgb2Zmc2V0PTE5NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xOTcsIHN0YXJ0c19saW5lPTI2LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz05LCBhcmd2YWw9J05ldmVyIHJlYWNoIHRoaXMnLCBhcmdyZXByPSInTmV2ZXIgcmVhY2ggdGhpcyciLCBvZmZzZXQ9MjAwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0yMDMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjA3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yMDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfU1RBUlQnLCBvcGNvZGU9ODEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIxMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nV0lUSF9DTEVBTlVQX0ZJTklTSCcsIG9wY29kZT04MiwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIxMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTIxNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0yMTgsIHN0YXJ0c19saW5lPTI4LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEwLCBhcmd2YWw9Ik9LLCBub3cgd2UncmUgZG9uZSIsIGFyZ3JlcHI9JyJPSywgbm93IHdlXCdyZSBkb25lIicsIG9mZnNldD0yMjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTIyNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjI3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MjI5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9MT09QJywgb3Bjb2RlPTEyMCwgYXJnPTUyLCBhcmd2YWw9NTQsIGFyZ3JlcHI9J3RvIDU0Jywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3JhbmdlJywgYXJncmVwcj0ncmFuZ2UnLCBvZmZzZXQ9Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MSwgYXJndmFsPTEwLCBhcmdyZXByPScxMCcsIG9mZnNldD00LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nR0VUX0lURVInLCBvcGNvZGU9NjgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdGT1JfSVRFUicsIG9wY29kZT05MywgYXJnPTMyLCBhcmd2YWw9NDQsIGFyZ3JlcHI9J3RvIDQ0Jywgb2Zmc2V0PTEwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjIsIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MzIsIGFyZ3ZhbD0zMiwgYXJncmVwcj0nJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0zMiwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD0zNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTEwLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JycsIG9mZnNldD0zOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQwLCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMCwgYXJndmFsPTEwLCBhcmdyZXByPScnLCBvZmZzZXQ9NDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTQ0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NDYsIHN0YXJ0c19saW5lPTEwLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nLCBhcmdyZXByPSInSSBjYW4gaGF6IGVsc2UgY2xhdXNlPyciLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTUwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NTIsIGFyZ3ZhbD0xMDgsIGFyZ3JlcHI9J3RvIDEwOCcsIG9mZnNldD01NCwgc3RhcnRzX2xpbmU9MTEsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTU2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz05OCwgYXJndmFsPTk4LCBhcmdyZXByPScnLCBvZmZzZXQ9NTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NjAsIHN0YXJ0c19saW5lPTEyLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTY0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD02Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTY4LCBzdGFydHNfbGluZT0xMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9NzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdJTlBMQUNFX1NVQlRSQUNUJywgb3Bjb2RlPTU2LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD03Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD03NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTc2LCBzdGFydHNfbGluZT0xNCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9NzgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTQsIGFyZ3ZhbD0nPicsIGFyZ3JlcHI9Jz4nLCBvZmZzZXQ9ODAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz04NiwgYXJndmFsPTg2LCBhcmdyZXByPScnLCBvZmZzZXQ9ODIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTU2LCBhcmd2YWw9NTYsIGFyZ3JlcHI9JycsIG9mZnNldD04NCwgc3RhcnRzX2xpbmU9MTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD04Niwgc3RhcnRzX2xpbmU9MTYsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MiwgYXJndmFsPTQsIGFyZ3JlcHI9JzQnLCBvZmZzZXQ9ODgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTAsIGFyZ3ZhbD0nPCcsIGFyZ3JlcHI9JzwnLCBvZmZzZXQ9OTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz01NiwgYXJndmFsPTU2LCBhcmdyZXByPScnLCBvZmZzZXQ9OTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCUkVBS19MT09QJywgb3Bjb2RlPTgwLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD05NCwgc3RhcnRzX2xpbmU9MTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTU2LCBhcmd2YWw9NTYsIGFyZ3JlcHI9JycsIG9mZnNldD05Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9OTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xMDAsIHN0YXJ0c19saW5lPTE5LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz02LCBhcmd2YWw9J1dobyBsZXQgbG9sY2F0eiBpbnRvIHRoaXMgdGVzdCBzdWl0ZT8nLCBhcmdyZXByPSInV2hvIGxldCBsb2xjYXR6IGludG8gdGhpcyB0ZXN0IHN1aXRlPyciLCBvZmZzZXQ9MTAyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xMDQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0ZJTkFMTFknLCBvcGNvZGU9MTIyLCBhcmc9NzAsIGFyZ3ZhbD0xODAsIGFyZ3JlcHI9J3RvIDE4MCcsIG9mZnNldD0xMDgsIHN0YXJ0c19saW5lPTIwLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9FWENFUFQnLCBvcGNvZGU9MTIxLCBhcmc9MTIsIGFyZ3ZhbD0xMjQsIGFyZ3JlcHI9J3RvIDEyNCcsIG9mZnNldD0xMTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTExMiwgc3RhcnRzX2xpbmU9MjEsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0wLCBhcmdyZXByPScwJywgb2Zmc2V0PTExNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JJTkFSWV9UUlVFX0RJVklERScsIG9wY29kZT0yNywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEyMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfRk9SV0FSRCcsIG9wY29kZT0xMTAsIGFyZz0yOCwgYXJndmFsPTE1MiwgYXJncmVwcj0ndG8gMTUyJywgb2Zmc2V0PTEyMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0RVUF9UT1AnLCBvcGNvZGU9NCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTI0LCBzdGFydHNfbGluZT0yMiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MiwgYXJndmFsPSdaZXJvRGl2aXNpb25FcnJvcicsIGFyZ3JlcHI9J1plcm9EaXZpc2lvbkVycm9yJywgb2Zmc2V0PTEyNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MTAsIGFyZ3ZhbD0nZXhjZXB0aW9uIG1hdGNoJywgYXJncmVwcj0nZXhjZXB0aW9uIG1hdGNoJywgb2Zmc2V0PTEyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTE1MCwgYXJndmFsPTE1MCwgYXJncmVwcj0nJywgb2Zmc2V0PTEzMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xMzgsIHN0YXJ0c19saW5lPTIzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz04LCBhcmd2YWw9J0hlcmUgd2UgZ28sIGhlcmUgd2UgZ28sIGhlcmUgd2UgZ28uLi4nLCBhcmdyZXByPSInSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLiciLCBvZmZzZXQ9MTQwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xNDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE0NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9FWENFUFQnLCBvcGNvZGU9ODksIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE0Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfRk9SV0FSRCcsIG9wY29kZT0xMTAsIGFyZz0yNiwgYXJndmFsPTE3NiwgYXJncmVwcj0ndG8gMTc2Jywgb2Zmc2V0PTE0OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTE1Miwgc3RhcnRzX2xpbmU9MjUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX1dJVEgnLCBvcGNvZGU9MTQzLCBhcmc9MTQsIGFyZ3ZhbD0xNzAsIGFyZ3JlcHI9J3RvIDE3MCcsIG9mZnNldD0xNTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTEsIGFyZ3ZhbD0nZG9kZ3knLCBhcmdyZXByPSdkb2RneScsIG9mZnNldD0xNTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTU4LCBzdGFydHNfbGluZT0yNiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OSwgYXJndmFsPSdOZXZlciByZWFjaCB0aGlzJywgYXJncmVwcj0iJ05ldmVyIHJlYWNoIHRoaXMnIiwgb2Zmc2V0PTE2MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTYyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTY4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nV0lUSF9DTEVBTlVQX1NUQVJUJywgb3Bjb2RlPTgxLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1dJVEhfQ0xFQU5VUF9GSU5JU0gnLCBvcGNvZGU9ODIsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0xNzgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTgwLCBzdGFydHNfbGluZT0yOCwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xMCwgYXJndmFsPSJPSywgbm93IHdlJ3JlIGRvbmUiLCBhcmdyZXByPSciT0ssIG5vdyB3ZVwncmUgZG9uZSInLCBvZmZzZXQ9MTgyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xODQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0VORF9GSU5BTExZJywgb3Bjb2RlPTg4LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTE5MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTkyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKICMgT25lIGxhc3QgcGllY2Ugb2YgaW5zcGVjdCBmb2RkZXIgdG8gY2hlY2sgdGhlIGRlZmF1bHQgbGluZSBudW1iZXIgaGFuZGxpbmcKIGRlZiBzaW1wbGUoKTogcGFzcwogZXhwZWN0ZWRfb3BpbmZvX3NpbXBsZSA9IFsKICAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPXNpbXBsZS5fX2NvZGVfXy5jb19maXJzdGxpbmVubywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSkKIF0KIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggMzMxNjNiOS4uYjQxNmNiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMTg3Niw3ICsxODc2LDYgQEAKICAgICAgICAgVG8gZGVtb25zdHJhdGUgdGhpcywgd2UnbGwgY3JlYXRlIGEgZmFrZSBzdGFuZGFyZCBpbnB1dCB0aGF0CiAgICAgICAgIGNhcHR1cmVzIG91ciBkZWJ1Z2dlciBpbnB1dDoKIAotICAgICAgICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKICAgICAgICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgogICAgICAgICAgID4+PiBzeXMuc3RkaW4gPSBfRmFrZUlucHV0KFsKICAgICAgICAgICAuLi4gICAgJ3ByaW50KHgpJywgICMgcHJpbnQgZGF0YSBkZWZpbmVkIGJ5IHRoZSBleGFtcGxlCkBAIC0xOTE3LDcgKzE5MTYsNyBAQAogICAgICAgICAgIC4uLiBmaW5hbGx5OgogICAgICAgICAgIC4uLiAgICAgc3lzLnN0ZGluID0gcmVhbF9zdGRpbgogICAgICAgICAgIC0tUmV0dXJuLS0KLSAgICAgICAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZVs4XT4oMyljYWxsc19zZXRfdHJhY2UoKS0+Tm9uZQorICAgICAgICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlWzddPigzKWNhbGxzX3NldF90cmFjZSgpLT5Ob25lCiAgICAgICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgICAgKFBkYikgcHJpbnQoeSkKICAgICAgICAgICAyCkBAIC0yMzM5LDcgKzIzMzgsNyBAQAogICAgICAgIGBfX2ZpbGVfX2AgZ2xvYmFsLCB3aGljaCBpcyBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIGZpbGUKICAgICAgICBjb250YWluaW5nIHRoZSB0ZXN0czoKIAotICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdDMudHh0JykKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QzLnR4dCcsIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMpCiAgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKICAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MSBlcnJvcnM9MCBmYWlsdXJlcz0wPgogCkBAIC0yNzk4LDcgKzI3OTcsNiBAQAogICAgIC4uLiAgICAgICAgIF8gPSBmLndyaXRlKCIgICAgICAgJ2FiYyBkZWYnXG4iKQogICAgIC4uLiAgICAgICAgIF8gPSBmLndyaXRlKCJcbiIpCiAgICAgLi4uICAgICAgICAgXyA9IGYud3JpdGUoJyAgIFwiXCJcIlxuJykKLSAgICAuLi4gICAgIGltcG9ydCBzaHV0aWwKICAgICAuLi4gICAgIHJjMSwgb3V0MSwgZXJyMSA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKAogICAgIC4uLiAgICAgICAgICAgICAnLW0nLCAnZG9jdGVzdCcsIGZuLCBmbjIpCiAgICAgLi4uICAgICByYzIsIG91dDIsIGVycjIgPSBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2soCkBAIC0yOTQyLDEyICsyOTQwLDExIEBACiBkZWYgdGVzdF9tYWluKCk6CiAgICAgIyBDaGVjayB0aGUgZG9jdGVzdCBjYXNlcyBpbiBkb2N0ZXN0IGl0c2VsZjoKICAgICByZXQgPSBzdXBwb3J0LnJ1bl9kb2N0ZXN0KGRvY3Rlc3QsIHZlcmJvc2l0eT1UcnVlKQorCiAgICAgIyBDaGVjayB0aGUgZG9jdGVzdCBjYXNlcyBkZWZpbmVkIGhlcmU6CiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RvY3Rlc3QKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCiAKLWltcG9ydCBzeXMsIHJlLCBpbwotCiBkZWYgdGVzdF9jb3ZlcmFnZShjb3ZlcmRpcik6CiAgICAgdHJhY2UgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RyYWNlJykKICAgICB0cmFjZXIgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMuYmFzZV9wcmVmaXgsIHN5cy5iYXNlX2V4ZWNfcHJlZml4LF0sCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QzLnR4dCBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0CmluZGV4IGRkODU1N2UuLjM4MGVhNzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0CkBAIC0yLDQgKzIsNCBAQAogSGVyZSB3ZSBjaGVjayB0aGF0IGBfX2ZpbGVfX2AgaXMgcHJvdmlkZWQ6CiAKICAgPj4+IHR5cGUoX19maWxlX18pCi0gIDxjbGFzcyAnc3RyJz4KKyAgPGNsYXNzICdzdHInIC4uLj4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weSBiL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weQppbmRleCA1MDgwZWM5Li4zYWUwOTBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2R5bmFtaWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9keW5hbWljLnB5CkBAIC0xLDcgKzEsNiBAQAogIyBUZXN0IHRoZSBtb3N0IGR5bmFtaWMgY29ybmVyIGNhc2VzIG9mIFB5dGhvbidzIHJ1bnRpbWUgc2VtYW50aWNzLgogCiBpbXBvcnQgYnVpbHRpbnMKLWltcG9ydCBjb250ZXh0bGliCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHN3YXBfaXRlbSwgc3dhcF9hdHRyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5IGIvTGliL3Rlc3QvdGVzdF9laW50ci5weQppbmRleCBhYWJhZDgzLi4yNWY4NmQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKQEAgLTEsNyArMSw1IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0xNiwxNCArMTQsOCBAQAogICAgICAgICAjIFJ1biB0aGUgdGVzdGVyIGluIGEgc3ViLXByb2Nlc3MsIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZQogICAgICAgICAjIHRocmVhZCAoZm9yIHJlbGlhYmxlIHNpZ25hbCBkZWxpdmVyeSkuCiAgICAgICAgIHRlc3RlciA9IHN1cHBvcnQuZmluZGZpbGUoImVpbnRyX3Rlc3Rlci5weSIsIHN1YmRpcj0iZWludHJkYXRhIikKLQotICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCB0ZXN0ZXJdCi0gICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oYXJncykgYXMgcHJvYzoKLSAgICAgICAgICAgICAgICBleGl0Y29kZSA9IHByb2Mud2FpdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRjb2RlLCAwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKHRlc3RlcikKKyAgICAgICAgIyB1c2UgLXUgdG8gdHJ5IHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgaWYgdGhlIHRlc3QgaGFuZ3Mgb3IgY3Jhc2gKKyAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKCItdSIsIHRlc3RlcikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvX19pbml0X18ucHkKaW5kZXggZDJmN2QzMS4uMTYwMDE1OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL19faW5pdF9fLnB5CkBAIC0xLDUgKzEsNCBAQAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGVtYWlsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2FzaWFuX2NvZGVjcy5weQppbmRleCBmOWNkN2Q5Li4xZTBjYWVlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9hc2lhbl9jb2RlY3MucHkKQEAgLTMsNyArMyw2IEBACiAjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKIAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKIGZyb20gdGVzdC50ZXN0X2VtYWlsIGltcG9ydCBUZXN0RW1haWxCYXNlCiBmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weQppbmRleCA4OTRiODAwLi5hZjNmYjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZW1haWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2VtYWlsLnB5CkBAIC0zNDIxLDcgKzM0MjEsNiBAQAogY2xhc3MgVGVzdEZlZWRQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgogCiAgICAgZGVmIHBhcnNlKHNlbGYsIGNodW5rcyk6Ci0gICAgICAgIGZyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgogICAgICAgICBmZWVkcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgICBmZWVkcGFyc2VyLmZlZWQoY2h1bmspCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkKaW5kZXggNTVlY2RlYS4uYWY4MzZkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2hlYWRlcnJlZ2lzdHJ5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9oZWFkZXJyZWdpc3RyeS5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0eXBlcwogZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCiBmcm9tIGVtYWlsIGltcG9ydCBwb2xpY3kKIGZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5IGIvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CmluZGV4IGU5NzBhMjYuLmIxYTU4NTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW51bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKQEAgLTYsNiArNiw3IEBACiBmcm9tIGVudW0gaW1wb3J0IEVudW0sIEludEVudW0sIEVudW1NZXRhLCB1bmlxdWUKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHBpY2tsZSBpbXBvcnQgZHVtcHMsIGxvYWRzLCBQaWNrbGluZ0Vycm9yLCBISUdIRVNUX1BST1RPQ09MCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogIyBmb3IgcGlja2xlIHRlc3RzCiB0cnk6CkBAIC0yODMsNiArMjg0LDI4IEBACiAgICAgICAgICAgICBjbGFzcyBXcm9uZyhFbnVtKToKICAgICAgICAgICAgICAgICBfYW55X25hbWVfID0gOQogCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBwbGFpbiBFbnVtIG1lbWJlcnMgYXJlIGFsd2F5cyBUcnVlCisgICAgICAgIGNsYXNzIExvZ2ljKEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IFRydWUKKyAgICAgICAgICAgIGZhbHNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKExvZ2ljLnRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMb2dpYy5mYWxzZSkKKyAgICAgICAgIyB1bmxlc3Mgb3ZlcnJpZGRlbgorICAgICAgICBjbGFzcyBSZWFsTG9naWMoRW51bSk6CisgICAgICAgICAgICB0cnVlID0gVHJ1ZQorICAgICAgICAgICAgZmFsc2UgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZhbHVlXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFJlYWxMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFJlYWxMb2dpYy5mYWxzZSkKKyAgICAgICAgIyBtaXhlZCBFbnVtcyBkZXBlbmQgb24gbWl4ZWQtaW4gdHlwZQorICAgICAgICBjbGFzcyBJbnRMb2dpYyhpbnQsIEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IDEKKyAgICAgICAgICAgIGZhbHNlID0gMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoSW50TG9naWMudHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJbnRMb2dpYy5mYWxzZSkKKwogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBTZWFzb24gPSBzZWxmLlNlYXNvbgogICAgICAgICBzZWxmLmFzc2VydEluKFNlYXNvbi5BVVRVTU4sIFNlYXNvbikKQEAgLTE3MzksNSArMTc2Miw0NyBAQAogICAgICAgICBpZiBmYWlsZWQ6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCwgc2VlIHByaW50IGFib3ZlIikKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZW51bSkKKworCisjIFRoZXNlIGFyZSB1bm9yZGVyZWQgaGVyZSBvbiBwdXJwb3NlIHRvIGVuc3VyZSB0aGF0IGRlY2xhcmF0aW9uIG9yZGVyCisjIG1ha2VzIG5vIGRpZmZlcmVuY2UuCitDT05WRVJUX1RFU1RfTkFNRV9EID0gNQorQ09OVkVSVF9URVNUX05BTUVfQyA9IDUKK0NPTlZFUlRfVEVTVF9OQU1FX0IgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9BID0gNSAgIyBUaGlzIG9uZSBzaG91bGQgc29ydCBmaXJzdC4KK0NPTlZFUlRfVEVTVF9OQU1FX0UgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9GID0gNQorCitjbGFzcyBUZXN0SW50RW51bUNvbnZlcnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnZlcnRfdmFsdWVfbG9va3VwX3ByaW9yaXR5KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBXZSBkb24ndCB3YW50IHRoZSByZXZlcnNlIGxvb2t1cCB2YWx1ZSB0byB2YXJ5IHdoZW4gdGhlcmUgYXJlCisgICAgICAgICMgbXVsdGlwbGUgcG9zc2libGUgbmFtZXMgZm9yIGEgZ2l2ZW4gdmFsdWUuICBJdCBzaG91bGQgYWx3YXlzCisgICAgICAgICMgcmVwb3J0IHRoZSBmaXJzdCBsZXhpZ3JhcGhpY2FsIG5hbWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZSg1KS5uYW1lLCAnQ09OVkVSVF9URVNUX05BTUVfQScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0ZXN0X3R5cGUgaGFzIGFsbCBvZiB0aGUgZGVzaXJlZCBuYW1lcyBhbmQgdmFsdWVzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9GLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9BKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9CLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9DLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9ELCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9FLCA1KQorICAgICAgICAjIEVuc3VyZSB0aGF0IHRlc3RfdHlwZSBvbmx5IHBpY2tlZCB1cCBuYW1lcyBtYXRjaGluZyB0aGUgZmlsdGVyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtuYW1lIGZvciBuYW1lIGluIGRpcih0ZXN0X3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbMDoyXSBub3QgaW4gKCdDTycsICdfXycpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgbXNnPSdOYW1lcyBvdGhlciB0aGFuIENPTlZFUlRfVEVTVF8qIGZvdW5kLicpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkgYi9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CmluZGV4IGE3MzU5ZTkuLmE3YWZmOGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgImVwb2xsIik6CiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInRlc3Qgd29ya3Mgb25seSBvbiBMaW51eCAyLjYiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weSBiL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CmluZGV4IDE1NjJlZWMuLmZjMmQ2ZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CkBAIC0yMyw2ICsyMyw3IEBACiAgICAgX3Rlc3RjYXBpID0gTm9uZQogCiBUSU1FT1VUID0gMC41CitNU19XSU5ET1dTID0gKG9zLm5hbWUgPT0gJ250JykKIAogZGVmIGV4cGVjdGVkX3RyYWNlYmFjayhsaW5lbm8xLCBsaW5lbm8yLCBoZWFkZXIsIG1pbl9jb3VudD0xKToKICAgICByZWdleCA9IGhlYWRlcgpAQCAtNTgsOCArNTksOSBAQAogICAgICAgICAgICAgcGFzc19mZHMuYXBwZW5kKGZkKQogICAgICAgICB3aXRoIHN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpOgogICAgICAgICAgICAgcHJvY2VzcyA9IHNjcmlwdF9oZWxwZXIuc3Bhd25fcHl0aG9uKCctYycsIGNvZGUsIHBhc3NfZmRzPXBhc3NfZmRzKQotICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQotICAgICAgICBleGl0Y29kZSA9IHByb2Nlc3Mud2FpdCgpCisgICAgICAgICAgICB3aXRoIHByb2Nlc3M6CisgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgICAgICBleGl0Y29kZSA9IHByb2Nlc3Mud2FpdCgpCiAgICAgICAgIG91dHB1dCA9IHN1cHBvcnQuc3RyaXBfcHl0aG9uX3N0ZGVycihzdGRvdXQpCiAgICAgICAgIG91dHB1dCA9IG91dHB1dC5kZWNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKQogICAgICAgICBpZiBmaWxlbmFtZToKQEAgLTczLDE0ICs3NSwxMSBAQAogICAgICAgICAgICAgd2l0aCBvcGVuKGZkLCAicmIiLCBjbG9zZWZkPUZhbHNlKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBmcC5yZWFkKCkKICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5kZWNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKQotICAgICAgICBvdXRwdXQgPSByZS5zdWIoJ0N1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rJywKLSAgICAgICAgICAgICAgICAgICAgICAgICdDdXJyZW50IHRocmVhZCBYWFgnLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQogICAgICAgICByZXR1cm4gb3V0cHV0LnNwbGl0bGluZXMoKSwgZXhpdGNvZGUKIAotICAgIGRlZiBjaGVja19mYXRhbF9lcnJvcihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgbmFtZV9yZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Tm9uZSwgYWxsX3RocmVhZHM9VHJ1ZSwgb3RoZXJfcmVnZXg9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmQ9Tm9uZSk6CisgICAgZGVmIGNoZWNrX2Vycm9yKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBmYXRhbF9lcnJvciwgKiwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Tm9uZSwgYWxsX3RocmVhZHM9VHJ1ZSwgb3RoZXJfcmVnZXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZmQ9Tm9uZSwga25vd19jdXJyZW50X3RocmVhZD1UcnVlKToKICAgICAgICAgIiIiCiAgICAgICAgIENoZWNrIHRoYXQgdGhlIGZhdWx0IGhhbmRsZXIgZm9yIGZhdGFsIGVycm9ycyBpcyBlbmFibGVkIGFuZCBjaGVjayB0aGUKICAgICAgICAgdHJhY2ViYWNrIGZyb20gdGhlIGNoaWxkIHByb2Nlc3Mgb3V0cHV0LgpAQCAtODgsMTkgKzg3LDIyIEBACiAgICAgICAgIFJhaXNlIGFuIGVycm9yIGlmIHRoZSBvdXRwdXQgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgZm9ybWF0LgogICAgICAgICAiIiIKICAgICAgICAgaWYgYWxsX3RocmVhZHM6Ci0gICAgICAgICAgICBoZWFkZXIgPSAnQ3VycmVudCB0aHJlYWQgWFhYIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KScKKyAgICAgICAgICAgIGlmIGtub3dfY3VycmVudF90aHJlYWQ6CisgICAgICAgICAgICAgICAgaGVhZGVyID0gJ0N1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAnVGhyZWFkIDB4WzAtOWEtZl0rJwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGVhZGVyID0gJ1N0YWNrIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KScKKyAgICAgICAgICAgIGhlYWRlciA9ICdTdGFjaycKICAgICAgICAgcmVnZXggPSAiIiIKLSAgICAgICAgICAgIF5GYXRhbCBQeXRob24gZXJyb3I6IHtuYW1lfQorICAgICAgICAgICAgXntmYXRhbF9lcnJvcn0KIAotICAgICAgICAgICAge2hlYWRlcn06CisgICAgICAgICAgICB7aGVhZGVyfSBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKToKICAgICAgICAgICAgICAgRmlsZSAiPHN0cmluZz4iLCBsaW5lIHtsaW5lbm99IGluIDxtb2R1bGU+CiAgICAgICAgICAgICAiIiIKICAgICAgICAgcmVnZXggPSBkZWRlbnQocmVnZXguZm9ybWF0KAogICAgICAgICAgICAgbGluZW5vPWxpbmVfbnVtYmVyLAotICAgICAgICAgICAgbmFtZT1uYW1lX3JlZ2V4LAotICAgICAgICAgICAgaGVhZGVyPXJlLmVzY2FwZShoZWFkZXIpKSkuc3RyaXAoKQorICAgICAgICAgICAgZmF0YWxfZXJyb3I9ZmF0YWxfZXJyb3IsCisgICAgICAgICAgICBoZWFkZXI9aGVhZGVyKSkuc3RyaXAoKQogICAgICAgICBpZiBvdGhlcl9yZWdleDoKICAgICAgICAgICAgIHJlZ2V4ICs9ICd8JyArIG90aGVyX3JlZ2V4CiAgICAgICAgIG91dHB1dCwgZXhpdGNvZGUgPSBzZWxmLmdldF9vdXRwdXQoY29kZSwgZmlsZW5hbWU9ZmlsZW5hbWUsIGZkPWZkKQpAQCAtMTA4LDE3ICsxMTAsMzYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXRwdXQsIHJlZ2V4KQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV4aXRjb2RlLCAwKQogCisgICAgZGVmIGNoZWNrX2ZhdGFsX2Vycm9yKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBuYW1lX3JlZ2V4LCAqKmt3KToKKyAgICAgICAgZmF0YWxfZXJyb3IgPSAnRmF0YWwgUHl0aG9uIGVycm9yOiAlcycgJSBuYW1lX3JlZ2V4CisgICAgICAgIHNlbGYuY2hlY2tfZXJyb3IoY29kZSwgbGluZV9udW1iZXIsIGZhdGFsX2Vycm9yLCAqKmt3KQorCisgICAgZGVmIGNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBuYW1lX3JlZ2V4LCAqKmt3KToKKyAgICAgICAgZmF0YWxfZXJyb3IgPSAnV2luZG93cyBmYXRhbCBleGNlcHRpb246ICVzJyAlIG5hbWVfcmVnZXgKKyAgICAgICAgc2VsZi5jaGVja19lcnJvcihjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICoqa3cpCisKICAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhaXgnKSwKICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmlyc3QgcGFnZSBvZiBtZW1vcnkgaXMgYSBtYXBwZWQgcmVhZC1vbmx5IG9uIEFJWCIpCiAgICAgZGVmIHRlc3RfcmVhZF9udWxsKHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgotICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgotICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCi0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCi0gICAgICAgICAgICAiIiIsCi0gICAgICAgICAgICAzLAotICAgICAgICAgICAgIyBJc3N1ZSAjMTI3MDA6IFJlYWQgTlVMTCByYWlzZXMgU0lHSUxMIG9uIE1hYyBPUyBYIExpb24KLSAgICAgICAgICAgICcoPzpTZWdtZW50YXRpb24gZmF1bHR8QnVzIGVycm9yfElsbGVnYWwgaW5zdHJ1Y3Rpb24pJykKKyAgICAgICAgaWYgbm90IE1TX1dJTkRPV1M6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgorICAgICAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCisgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgIyBJc3N1ZSAjMTI3MDA6IFJlYWQgTlVMTCByYWlzZXMgU0lHSUxMIG9uIE1hYyBPUyBYIExpb24KKyAgICAgICAgICAgICAgICAnKD86U2VnbWVudGF0aW9uIGZhdWx0JworICAgICAgICAgICAgICAgICAgICAnfEJ1cyBlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgJ3xJbGxlZ2FsIGluc3RydWN0aW9uKScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKCIiIgorICAgICAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCisgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgJ2FjY2VzcyB2aW9sYXRpb24nKQogCiAgICAgZGVmIHRlc3Rfc2lnc2VndihzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKQEAgLTEyOSw2ICsxNTAsMTcgQEAKICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAnU2VnbWVudGF0aW9uIGZhdWx0JykKIAorICAgIEB1bml0dGVzdC5za2lwSWYobm90IEhBVkVfVEhSRUFEUywgJ25lZWQgdGhyZWFkcycpCisgICAgZGVmIHRlc3RfZmF0YWxfZXJyb3JfY190aHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCisgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fZmF0YWxfZXJyb3JfY190aHJlYWQoKQorICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgICdpbiBuZXcgdGhyZWFkJywKKyAgICAgICAgICAgIGtub3dfY3VycmVudF90aHJlYWQ9RmFsc2UpCisKICAgICBkZWYgdGVzdF9zaWdhYnJ0KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgogICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgpAQCAtNDY1LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgIEZpbGUgIi4qdGhyZWFkaW5nLnB5IiwgbGluZSBbMC05XSsgaW4gX2Jvb3RzdHJhcF9pbm5lcgogICAgICAgICAgICAgICBGaWxlICIuKnRocmVhZGluZy5weSIsIGxpbmUgWzAtOV0rIGluIF9ib290c3RyYXAKIAotICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgWFhYIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgorICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6CiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSB7bGluZW5vfSBpbiBkdW1wCiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSAyOCBpbiA8bW9kdWxlPiQKICAgICAgICAgICAgICIiIgpAQCAtNjM3LDcgKzY2OSw3IEBACiAgICAgICAgIHRyYWNlID0gJ1xuJy5qb2luKHRyYWNlKQogICAgICAgICBpZiBub3QgdW5yZWdpc3RlcjoKICAgICAgICAgICAgIGlmIGFsbF90aHJlYWRzOgotICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0N1cnJlbnQgdGhyZWFkIFhYWCBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKKyAgICAgICAgICAgICAgICByZWdleCA9ICdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKyBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmVnZXggPSAnU3RhY2sgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6XG4nCiAgICAgICAgICAgICByZWdleCA9IGV4cGVjdGVkX3RyYWNlYmFjaygxNCwgMzIsIHJlZ2V4KQpAQCAtNjk2LDYgKzcyOCwyMiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLmNoZWNrX3N0ZGVycl9ub25lKCk6CiAgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLnJlZ2lzdGVyKHNpZ25hbC5TSUdVU1IxKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoTVNfV0lORE9XUywgJ3NwZWNpZmljIHRvIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0X3JhaXNlX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGV4YywgbmFtZSBpbiAoCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OJywgJ2FjY2VzcyB2aW9sYXRpb24nKSwKKyAgICAgICAgICAgICgnRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTycsICdpbnQgZGl2aWRlIGJ5IHplcm8nKSwKKyAgICAgICAgICAgICgnRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XJywgJ3N0YWNrIG92ZXJmbG93JyksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKGYiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yYWlzZV9leGNlcHRpb24oZmF1bHRoYW5kbGVyLl97ZXhjfSkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICBuYW1lKQorCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQppbmRleCA0ZTM5MmI3Li42NWJlMzBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CkBAIC03LDcgKzcsNyBAQAogaW1wb3J0IGlvCiBpbXBvcnQgX3B5aW8gYXMgcHlpbwogCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4KIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJMaXN0CiAKIGNsYXNzIEF1dG9GaWxlVGVzdHM6CkBAIC0xMzksNyArMTM5LDcgQEAKIAogICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CiAgICAgICAgICMgY2hlY2sgaW52YWxpZCBtb2RlIHN0cmluZ3MKLSAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIik6CisgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIsICJVKyIsICIrVSIsICJyVSsiKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgbW9kZSkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQppbmRleCA3ODRiYzkyLi41NjU2MzNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQpAQCAtMjIsOCArMjIsOSBAQAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTywgU3RyaW5nSU8KIGZyb20gZmlsZWlucHV0IGltcG9ydCBGaWxlSW5wdXQsIGhvb2tfZW5jb2RlZAogCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOLCBydW5fdW5pdHRlc3QsIGNoZWNrX3dhcm5pbmdzCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOLCBjaGVja193YXJuaW5ncwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHVubGluayBhcyBzYWZlX3VubGluaworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCiAKIApAQCAtOTIsNyArOTMsMTEgQEAKICAgICAgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiTGluZSAlcyBvZiBmaWxlIDJcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxMCldKQogICAgICAgICAgICAgICAgIHQzID0gd3JpdGVUbXAoMywgWyJMaW5lICVzIG9mIGZpbGUgM1xuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDUpXSkKICAgICAgICAgICAgICAgICB0NCA9IHdyaXRlVG1wKDQsIFsiTGluZSAlcyBvZiBmaWxlIDRcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxKV0pCi0gICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgaWYgYnM6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyLCB0MywgdDQpCiAKQEAgLTk0MCw3ICs5NDUsOCBAQAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAgICAgICAgIGVuY29kaW5nID0gb2JqZWN0KCkKLSAgICAgICAgcmVzdWx0ID0gZmlsZWlucHV0Lmhvb2tfZW5jb2RlZChlbmNvZGluZykKKyAgICAgICAgZXJyb3JzID0gb2JqZWN0KCkKKyAgICAgICAgcmVzdWx0ID0gZmlsZWlucHV0Lmhvb2tfZW5jb2RlZChlbmNvZGluZywgZXJyb3JzPWVycm9ycykKIAogICAgICAgICBmYWtlX29wZW4gPSBJbnZvY2F0aW9uUmVjb3JkZXIoKQogICAgICAgICBvcmlnaW5hbF9vcGVuID0gYnVpbHRpbnMub3BlbgpAQCAtOTU4LDggKzk2NCwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGFyZ3NbMF0sIGZpbGVuYW1lKQogICAgICAgICBzZWxmLmFzc2VydElzKGFyZ3NbMV0sIG1vZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoa3dhcmdzLnBvcCgnZW5jb2RpbmcnKSwgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoa3dhcmdzLnBvcCgnZXJyb3JzJyksIGVycm9ycykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrd2FyZ3MpCiAKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3YicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGInXHg4MGFiYycpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzYWZlX3VubGluaywgVEVTVEZOKQorCisgICAgICAgIGRlZiBjaGVjayhlcnJvcnMsIGV4cGVjdGVkX2xpbmVzKToKKyAgICAgICAgICAgIHdpdGggRmlsZUlucHV0KGZpbGVzPVRFU1RGTiwgbW9kZT0ncicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuaG9vaz1ob29rX2VuY29kZWQoJ3V0Zi04JywgZXJyb3JzPWVycm9ycykpIGFzIGZpOgorICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIGV4cGVjdGVkX2xpbmVzKQorCisgICAgICAgIGNoZWNrKCdpZ25vcmUnLCBbJ2FiYyddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICBjaGVjaygnc3RyaWN0JywgWydhYmMnXSkKKyAgICAgICAgY2hlY2soJ3JlcGxhY2UnLCBbJ1x1ZmZmZGFiYyddKQorICAgICAgICBjaGVjaygnYmFja3NsYXNocmVwbGFjZScsIFsnXFx4ODBhYmMnXSkKKwogICAgIGRlZiB0ZXN0X21vZGVzKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgIyBVVEYtNyBpcyBhIGNvbnZlbmllbnQsIHNlbGRvbSB1c2VkIGVuY29kaW5nCkBAIC05ODEsNSArMTAwNSwxMSBAQAogICAgICAgICAgICAgY2hlY2soJ3JiJywgWydBXG4nLCAnQlxyXG4nLCAnQ1xyJywgJ0RcdTIwYWMnXSkKIAogCitjbGFzcyBNaXNjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZpbGVpbnB1dCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mbG9hdC5weSBiL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKaW5kZXggY2IxZjZkYi4uNjhiMjEyZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CkBAIC0xLDYgKzEsNSBAQAogCiBpbXBvcnQgZnJhY3Rpb25zCi1pbXBvcnQgbWF0aAogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KQEAgLTE2MiwxMSArMTYxLDEyIEBACiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzdHIoc2VsZikpICsgMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMSgpKSwgNDIuKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzIoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28zKDIxKSksIDQyLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGb28xKCkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vMigpKSwgNDIuKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vMygyMSkpLCA0Mi4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQsIEZvbzQoNDIpKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvb1N0cignOCcpKSwgOS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vU3RyKCc4JykpLCA5LikKIAogICAgICAgICBjbGFzcyBGb281OgogICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKQEAgLTE3NywxMCArMTc3LDE0IEBACiAgICAgICAgIGNsYXNzIEY6CiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBPdGhlckZsb2F0U3ViY2xhc3MoNDIuKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEYoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGZsb2F0KEYoKSkpLCBPdGhlckZsb2F0U3ViY2xhc3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoRmxvYXRTdWJjbGFzcyhGKCkpLCA0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShGbG9hdFN1YmNsYXNzKEYoKSkpLCBGbG9hdFN1YmNsYXNzKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRigpKSwgNDIuKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShmbG9hdChGKCkpKSwgZmxvYXQpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGbG9hdFN1YmNsYXNzKEYoKSksIDQyLikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoRmxvYXRTdWJjbGFzcyhGKCkpKSwgRmxvYXRTdWJjbGFzcykKIAogICAgIGRlZiB0ZXN0X2lzX2ludGVnZXIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDEuMSkuaXNfaW50ZWdlcigpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQppbmRleCA5YjEzNjMyLi44YWZkNWI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICAgIHRlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiJWQgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IHN0ciIpCiAgICAgICAgIHRlc3RfZXhjKCcleCcsICcxJywgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3Qgc3RyIikKICAgICAgICAgdGVzdF9leGMoJyV4JywgMy4xNCwgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3QgZmxvYXQiKQotICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKQorICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgIm11c3QgYmUgcmVhbCBudW1iZXIsIG5vdCBzdHIiKQogICAgICAgICB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgJzEnLCBUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKICAgICAgICAgdGVzdF9leGMoJyVjJywgLTEsIE92ZXJmbG93RXJyb3IsICIlYyBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKSIpCkBAIC0zMDAsNiArMzAwLDggQEAKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgNywgYiJceDA3IikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYiJaIiwgYiJaIikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYnl0ZWFycmF5KGIiWiIpLCBiIloiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJTVjIiwgNjUsIGIiICAgIEEiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJS01YyIsIDY1LCBiIkEgICAgIikKICAgICAgICAgIyAlYiB3aWxsIGluc2VydCBhIHNlcmllcyBvZiBieXRlcywgZWl0aGVyIGZyb20gYSB0eXBlIHRoYXQgc3VwcG9ydHMKICAgICAgICAgIyB0aGUgUHlfYnVmZmVyIHByb3RvY29sLCBvciBzb21ldGhpbmcgdGhhdCBoYXMgYSBfX2J5dGVzX18gbWV0aG9kCiAgICAgICAgIGNsYXNzIEZha2VCeXRlcyhvYmplY3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQppbmRleCAxNjk5ODUyLi43M2QyZGQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQpAQCAtMjYzLDEzICsyNjMsMTMgQEAKICAgICAgICAgbmFuID0gaW5mIC0gaW5mCiAgICAgICAgICMgYnVnIDE2NDY5OiBlcnJvciB0eXBlcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIGZsb2F0IC0+IGludAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgaW5mIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZmxvYXQsIGluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1pbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgLWluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IG5hbiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgbmFuKQogCiAgICAgZGVmIHRlc3RGcm9tRGVjaW1hbChzZWxmKToKQEAgLTI4NCwxNiArMjg0LDE2IEBACiAKICAgICAgICAgIyBidWcgMTY0Njk6IGVycm9yIHR5cGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZGVjaW1hbCAtPiBpbnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgiaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCAtSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCItaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgibmFuIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBzTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoInNuYW4iKSkKIAogICAgIGRlZiB0ZXN0TGltaXREZW5vbWluYXRvcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJkZWRmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5CkBAIC0wLDAgKzEsNzQ1IEBACitpbXBvcnQgYXN0CitpbXBvcnQgdHlwZXMKK2ltcG9ydCBkZWNpbWFsCitpbXBvcnQgdW5pdHRlc3QKKworYV9nbG9iYWwgPSAnZ2xvYmFsIHZhcmlhYmxlJworCisjIFlvdSBjb3VsZCBhcmd1ZSB0aGF0IEknbSB0b28gc3RyaWN0IGluIGxvb2tpbmcgZm9yIHNwZWNpZmljIGVycm9yCisjICB2YWx1ZXMgd2l0aCBhc3NlcnRSYWlzZXNSZWdleCwgYnV0IHdpdGhvdXQgaXQgaXQncyB3YXkgdG9vIGVhc3kgdG8KKyMgIG1ha2UgYSBzeW50YXggZXJyb3IgaW4gdGhlIHRlc3Qgc3RyaW5ncy4gRXNwZWNpYWxseSB3aXRoIGFsbCBvZiB0aGUKKyMgIHRyaXBsZSBxdW90ZXMsIHJhdyBzdHJpbmdzLCBiYWNrc2xhc2hlcywgZXRjLiBJIHRoaW5rIGl0J3MgYQorIyAgd29ydGh3aGlsZSB0cmFkZW9mZi4gV2hlbiBJIHN3aXRjaGVkIHRvIHRoaXMgbWV0aG9kLCBJIGZvdW5kIG1hbnkKKyMgIGV4YW1wbGVzIHdoZXJlIEkgd2Fzbid0IHRlc3Rpbmcgd2hhdCBJIHRob3VnaHQgSSB3YXMuCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0QWxsUmFpc2Uoc2VsZiwgZXhjZXB0aW9uX3R5cGUsIHJlZ2V4LCBlcnJvcl9zdHJpbmdzKToKKyAgICAgICAgZm9yIHN0ciBpbiBlcnJvcl9zdHJpbmdzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RyPXN0cik6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGV4Y2VwdGlvbl90eXBlLCByZWdleCk6CisgICAgICAgICAgICAgICAgICAgIGV2YWwoc3RyKQorCisgICAgZGVmIHRlc3RfX2Zvcm1hdF9fbG9va3VwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBfX2Zvcm1hdF9fIGlzIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSwgbm90IHRoZSBpbnN0YW5jZS4KKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAnY2xhc3MnCisKKyAgICAgICAgeCA9IFgoKQorCisgICAgICAgICMgQWRkIGEgYm91bmQgX19mb3JtYXRfXyBtZXRob2QgdG8gdGhlICd5JyBpbnN0YW5jZSwgYnV0IG5vdAorICAgICAgICAjICB0aGUgJ3gnIGluc3RhbmNlLgorICAgICAgICB5ID0gWCgpCisgICAgICAgIHkuX19mb3JtYXRfXyA9IHR5cGVzLk1ldGhvZFR5cGUobGFtYmRhIHNlbGYsIHNwZWM6ICdpbnN0YW5jZScsIHkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsIGZvcm1hdCh5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgpLCBmb3JtYXQoeSkpCisKKyAgICAgICAgIyBfX2Zvcm1hdF9fIGlzIG5vdCBjYWxsZWQgdGhpcyB3YXksIGJ1dCBzdGlsbCBtYWtlIHN1cmUgaXQKKyAgICAgICAgIyAgcmV0dXJucyB3aGF0IHdlIGV4cGVjdCAoc28gd2UgY2FuIG1ha2Ugc3VyZSB3ZSdyZSBieXBhc3NpbmcKKyAgICAgICAgIyAgaXQpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19mb3JtYXRfXygnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2Zvcm1hdF9fKCcnKSwgJ2luc3RhbmNlJykKKworICAgICAgICAjIFRoaXMgaXMgaG93IF9fZm9ybWF0X18gaXMgYWN0dWFsbHkgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeCkuX19mb3JtYXRfXyh4LCAnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh5KS5fX2Zvcm1hdF9fKHksICcnKSwgJ2NsYXNzJykKKworICAgIGRlZiB0ZXN0X2FzdChzZWxmKToKKyAgICAgICAgIyBJbnNwaXJlZCBieSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQ5NzUKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBleHByID0gIiIiCithID0gMTAKK2Yne2EgKiB4KCl9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgeCB3YXMgbm90IGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4LmNhbGxlZCkKKworICAgICAgICAjIEFjdHVhbGx5IHJ1biB0aGUgY29kZS4KKyAgICAgICAgZXhlYyhjKQorCisgICAgICAgICMgTWFrZSBzdXJlIHggd2FzIGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguY2FsbGVkKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICAjIFdpdGggbm8gZXhwcmVzc2lvbnMsIGFuIGYtc3RyaW5nIGlzIG9rYXkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyIpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyAneSciKSwgJ3h5JykKKworICAgICAgICAjIEJ1dCB0aGlzIHNob3VsZCByYWlzZSBhbiBlcnJvci4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYneHszfSciKQorCisgICAgICAgICMgQXMgc2hvdWxkIHRoaXMsIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgYXN0IG5vZGUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYnezN9JyIpCisKKyAgICBkZWYgdGVzdF9hc3RfY29tcGlsZV90aW1lX2NvbmNhdChzZWxmKToKKyAgICAgICAgeCA9IFsnJ10KKworICAgICAgICBleHByID0gIiIieFswXSA9ICdmb28nIGYnezN9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisgICAgICAgIGV4ZWMoYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLCAnZm9vMycpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhJywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnICcsICcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzOTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnXE57VHJ1ZX0nLCAnXHUyMmE4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZidcTntUcnVlfScsIHInXE5UcnVlJykKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9vcmRlcihzZWxmKToKKyAgICAgICAgIyBub3RlIHRoYXQgaGV4KG9yZCgneycpKSA9PSAweDdiLCBzbyB0aGlzCisgICAgICAgICMgIHN0cmluZyBiZWNvbWVzIGYnYXs0KjEwfWInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHUwMDdiNCoxMH1iJywgJ2E0MGInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYVx4N2I0KjEwfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHg3YjQqMTBcTntSSUdIVCBDVVJMWSBCUkFDS0VUfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIVxOe0xBVElOIFNNQUxMIExFVFRFUiBSfX0nLCAiJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMFx4M2EwMlh9JywgJzBBJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMDowMlxOe0xBVElOIENBUElUQUwgTEVUVEVSIFh9fScsICcwQScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciIiImYnYXtcdTAwN2I0KjEwfWInIiIiLCAgICAjIG1pcy1tYXRjaGVkIGJyYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZid7ImEiXCFyfSciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3thXCFyfSciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF91bnRlcm1pbmF0ZWRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZid7IngnIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7Inh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3soInh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfcGFyZW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IG1pc21hdGNoZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7KCh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3snLCAneycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhe3snLCAnYXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3tiJywgJ3tiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7e2InLCAnYXtiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYX19JywgJ2F9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YicsICd9YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX1iJywgJ2F9YicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t7ezEwfScsICd7MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX17MTB9JywgJ30xMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXt7ezEwfScsICd9ezEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YXt7ezEwfScsICd9YXsxMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH17eycsICcxMHsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19JywgJzEwfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX17eycsICcxMH17JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fWF7eycgJ30nLCAnMTB9YXt9JykKKworICAgICAgICAjIEluc2lkZSBvZiBzdHJpbmdzLCBkb24ndCBpbnRlcnByZXQgZG91YmxlZCBicmFja2V0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sie3t9fSJ9JywgJ3t7fX0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAndW5oYXNoYWJsZSB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyB7e319IH0nIiwgIyBkaWN0IGluIGEgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3RpbWVfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gJ2RlZicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJyMjIHt4fWdoaScsICdhYmMjIyBkZWZnaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYne3h9JyAnZ2hpJywgJ2FiY2RlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaCcgZidpe3g6NH0nLCAnYWJjZGVmZ2hpZGVmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t4fScgZid7eH0nLCAne3h9ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3gnIGYne3h9JywgJ3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3h9fScgZid7eH0nLCAne3t4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3gnIGYne3h9JywgJ3t7eGRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3h9fScgZid7eH0nLCAneH19ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgJ3h9fScsICdkZWZ4fX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnJywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnMicsICdkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nICcyJywgJzFkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nLCAnMWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nIGYnLXt4fScsICdkZWYtZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycgJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycgJycsICcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szJyBmJ30nIiwgICMgY2FuJ3QgY29uY2F0IHRvIGdldCBhIHZhbGlkIGYtc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgIyBUaGVzZSBhcmVuJ3QgY29tbWVudHMsIHNpbmNlIHRoZXkncmUgaW4gc3RyaW5ncy4KKyAgICAgICAgZCA9IHsnIyc6ICdoYXNoJ30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIyJ9JywgJyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbIiMiXX0nLCAnaGFzaCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nIGNhbm5vdCBpbmNsdWRlICcjJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3sxI30nIiwgICAjIGVycm9yIGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gYmVjb21lcyAiKDEjKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMoIyl9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9tYW55X2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIHN0cmluZyB3aXRoIG1hbnkgZXhwcmVzc2lvbnMgaW4gaXQuIE5vdGUgdGhhdAorICAgICAgICAjICBiZWNhdXNlIHdlIGhhdmUgYSBzcGFjZSBpbiBoZXJlIGFzIGEgbGl0ZXJhbCwgd2UncmUgYWN0dWFsbHkKKyAgICAgICAgIyAgZ29pbmcgdG8gdXNlIHR3aWNlIGFzIG1hbnkgYXN0IG5vZGVzOiBvbmUgZm9yIGVhY2ggbGl0ZXJhbAorICAgICAgICAjICBwbHVzIG9uZSBmb3IgZWFjaCBleHByZXNzaW9uLgorICAgICAgICBkZWYgYnVpbGRfZnN0cihuLCBleHRyYT0nJyk6CisgICAgICAgICAgICByZXR1cm4gImYnIiArICgne3h9ICcgKiBuKSArIGV4dHJhICsgIiciCisKKyAgICAgICAgeCA9ICdYJworICAgICAgICB3aWR0aCA9IDEKKworICAgICAgICAjIFRlc3QgYXJvdW5kIDI1Ni4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjUwLCAyNjApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoaSkpLCAoeCsnICcpKmkpCisKKyAgICAgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgMiBsYXJncyBmc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoMjU1KSoyNTYpLCAoeCsnICcpKigyNTUqMjU2KSkKKworICAgICAgICBzID0gYnVpbGRfZnN0cigyNTMsICd7eDp7d2lkdGh9fSAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwocyksICh4KycgJykqMjU0KQorCisgICAgICAgICMgVGVzdCBsb3RzIG9mIGV4cHJlc3Npb25zIGFuZCBjb25zdGFudHMsIGNvbmNhdGVuYXRlZC4KKyAgICAgICAgcyA9ICJmJ3sxfScgJ3gnICd5JyIgKiAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgJzF4eScgKiAxMDI0KQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3NwZWNpZmllcl9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgd2lkdGggPSAxMAorICAgICAgICBwcmVjaXNpb24gPSA0CisgICAgICAgIHZhbHVlID0gZGVjaW1hbC5EZWNpbWFsKCcxMi4zNDU2NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGh9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoIXJ9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7MX17MDowfS57cHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6eyAxfXsgMDowfS57IHByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMDojezF9MHh9JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOnsiIyJ9MXswfXsieCJ9fScsICcgICAgICAgMHhhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3stMTA6LXsiIyJ9MXswfXh9JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDp7Ii0ifSN7MX0weyJ4In19JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MyAhPSB7NDo1fSBhbmQgd2lkdGh9eH0nLCAnICAgICAgIDB4YScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIiIiZid7InMiIXJ7IjoxMCJ9fSciIiIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGxvb2tzIGxpa2UgYSBuZXN0ZWQgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImludmFsaWQgc3ludGF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBJbnZhbGlkIHN5dGF4IGluc2lkZSBhIG5lc3RlZCBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7NDp7LzV9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwcmVzc2lvbnMgbmVzdGVkIHRvbyBkZWVwbHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIENhbid0IG5lc3QgZm9ybWF0IHNwZWNpZmllcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aDp7MH19LntwcmVjaXNpb246MX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBObyBleHBhbnNpb24gaW5zaWRlIGNvbnZlcnNpb24gb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIHRoZSA6IG9yICEgaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJmJ3sicyIheyJyIn19JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3NpZGVfZWZmZWN0X29yZGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLmkpCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9IHt4fScsICcxIDInKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IH0nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZicge30gJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAhcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezEwOnsgfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnIHsgfSAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3tcbn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3tcbiBcbn0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhdGNoIHRoZSBlbXB0eSBleHByZXNzaW9uIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgaW52YWxpZCBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6YX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHI6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cjphfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7On0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGZpbmQgdGhlIGVtcHR5IGV4cHJlc3Npb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBtaXNzaW5nIGNsb3NpbmcgYnJhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezp4JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9wYXJlbnNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Myx9JywgJygzLCknKQorCisgICAgICAgICMgQWRkIHRoZXNlIGJlY2F1c2Ugd2hlbiBhbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgcGFyZW5zCisgICAgICAgICMgIGFyZSBhZGRlZCBhcm91bmQgaXQuIEJ1dCB3ZSBzaG91bGRuJ3QgZ28gZnJvbSBhbiBpbnZhbGlkCisgICAgICAgICMgIGV4cHJlc3Npb24gdG8gYSB2YWxpZCBvbmUuIFRoZSBhZGRlZCBwYXJlbnMgYXJlIGp1c3QKKyAgICAgICAgIyAgc3VwcG9zZWQgdG8gYWxsb3cgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIG5ld2xpbmVzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyx9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3ssfSciLCAgIyB0aGlzIGlzICgsKSwgd2hpY2ggaXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7MykrKDR9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ0VPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3tcbn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVzX2luX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezB9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezBcbn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MFxyfScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcbjBcbn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XHIwXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMFxyfScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcbjB9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMrXG40fScsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szK1xcXG40fScsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZicnJ3szKworNH0nJycsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycnezMrXAorNH0nJycsICc3JykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbGFtYmRhKHNlbGYpOgorICAgICAgICB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iikhcn0nLCAiJzg4ODg4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyOjEwfScsICInODg4ODgnICAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpOjEwfScsICI4ODg4OCAgICAgIikKKworICAgICAgICAjIGxhbWJkYSBkb2Vzbid0IHdvcmsgd2l0aG91dCBwYXJlbnMsIGJlY2F1c2UgdGhlIGNvbG9uCisgICAgICAgICMgIG1ha2VzIHRoZSBwYXJzZXIgdGhpbmsgaXQncyBhIGZvcm1hdF9zcGVjCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne2xhbWJkYSB4Onh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF95aWVsZChzZWxmKToKKyAgICAgICAgIyBOb3QgdGVycmlibHkgdXNlZnVsLCBidXQgbWFrZSBzdXJlIHRoZSB5aWVsZCB0dXJucworICAgICAgICAjICBhIGZ1bmN0aW9uIGludG8gYSBnZW5lcmF0b3IKKyAgICAgICAgZGVmIGZuKHkpOgorICAgICAgICAgICAgZid5Ont5aWVsZCB5KjJ9JworCisgICAgICAgIGcgPSBmbig0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoZyksIDgpCisKKyAgICBkZWYgdGVzdF95aWVsZF9zZW5kKHNlbGYpOgorICAgICAgICBkZWYgZm4oeCk6CisgICAgICAgICAgICB5aWVsZCBmJ3g6e3lpZWxkIChsYW1iZGEgaTogeCAqIGkpfScKKworICAgICAgICBnID0gZm4oMTApCisgICAgICAgIHRoZV9sYW1iZGEgPSBuZXh0KGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlX2xhbWJkYSg0KSwgNDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5zZW5kKCdzdHJpbmcnKSwgJ3g6c3RyaW5nJykKKworICAgIGRlZiB0ZXN0X2V4cHJlc3Npb25zX3dpdGhfdHJpcGxlX3F1b3RlZF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ3gnJyd9IiwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ2VyaWMncycnJ30iLCAiZXJpYydzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljXCdzIiIifScsICJlcmljJ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ2VyaWNcInMnJyd9IiwgJ2VyaWMicycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IiIiZXJpYyJzIiIifScsICdlcmljInMnKQorCisgICAgICAgICMgVGVzdCBjb25jYXRlbmF0aW9uIHdpdGhpbiBhbiBleHByZXNzaW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IngiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieCIgIiIiZXJpYyJzIiIifScsICd4ZXJpYyJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljInMiIiIgInkifScsICdlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAiIiJ5IiIifScsICd4ZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ciIiIngiIiIgIiIiZXJpYyJzIiIiICIiInkiIiJ9JywgJ3hlcmljInN5JykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3ZhcnMoc2VsZik6CisgICAgICAgIHggPSA5OAorICAgICAgICB5ID0gJ2FiYycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fScsICc5OGFiYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH17eX0nLCAnWDk4YWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX0nLCAnOThYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fVgnLCAnOThhYmNYJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fVl7eX0nLCAnWDk4WWFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9e3l9WScsICdYOThhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX1ZJywgJzk4WGFiY1knKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9WXt5fVonLCAnWDk4WWFiY1onKQorCisgICAgZGVmIHRlc3RfY2xvc3VyZShzZWxmKToKKyAgICAgICAgZGVmIG91dGVyKHgpOgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYneDp7eH0nCisgICAgICAgICAgICByZXR1cm4gaW5uZXIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKCc5ODcnKSgpLCAneDo5ODcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKDcpKCksICd4OjcnKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICB5ID0gMgorICAgICAgICBkZWYgZih4LCB3aWR0aCk6CisgICAgICAgICAgICByZXR1cm4gZid4PXt4Knk6e3dpZHRofX0nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKCdmb28nLCAxMCksICd4PWZvb2ZvbyAgICAnKQorICAgICAgICB4ID0gJ2JhcicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEwLCAxMCksICd4PSAgICAgICAgMjAnKQorCisgICAgZGVmIHRlc3RfbG9jYWxzKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IDEyMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYndjp7dmFsdWV9JywgJ3Y6MTIzJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFyaWFibGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIGYndjp7dmFsdWV9JworCisgICAgZGVmIHRlc3RfbWlzc2luZ19mb3JtYXRfc3BlYyhzZWxmKToKKyAgICAgICAgY2xhc3MgTzoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzcGVjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyonCisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp4fScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tPKCl9JywgJyonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp9JywgJyonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhczp9JywgJzMnKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6Z2xvYmFsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywgImc6J2dsb2JhbCB2YXJpYWJsZSciKQorCisgICAgICAgIGFfbG9jYWwgPSAnbG9jYWwgdmFyaWFibGUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnOmdsb2JhbCB2YXJpYWJsZSBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzonZ2xvYmFsIHZhcmlhYmxlJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6Z2xvYmFsIHZhcmlhYmxlIGw6J2xvY2FsIHZhcmlhYmxlJyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigibW9kdWxlICd1bml0dGVzdCcgZnJvbSIsIGYne3VuaXR0ZXN0fScpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dlZF9nbG9iYWwoc2VsZik6CisgICAgICAgIGFfZ2xvYmFsID0gJ3JlYWxseSBhIGxvY2FsJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6cmVhbGx5IGEgbG9jYWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLCAiZzoncmVhbGx5IGEgbG9jYWwnIikKKworICAgICAgICBhX2xvY2FsID0gJ2xvY2FsIHZhcmlhYmxlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWx9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZzpyZWFsbHkgYSBsb2NhbCBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzoncmVhbGx5IGEgbG9jYWwnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzpyZWFsbHkgYSBsb2NhbCBsOidsb2NhbCB2YXJpYWJsZSciKQorCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgZGVmIGZvbyh4KToKKyAgICAgICAgICAgIHJldHVybiAneD0nICsgc3RyKHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmb28oMTApfScsICd4PTEwJykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9mc3RyaW5ncyhzZWxmKToKKyAgICAgICAgeSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInswfSIqM30nLCAnMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInt5fSIqM30nLCAnNTU1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmIntcJ3hcJ30iKjN9JywgJ3h4eCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntyJ3gnIGYne1wic1wifSd9IiwgJ3hzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntyJ3gncmYne1wic1wifSd9IiwgJ3hzJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfc3RyaW5nX3ByZWZpeGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAndW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmVScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidUYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZnInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVVInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sZWFkaW5nX3RyYWlsaW5nX3NwYWNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sgM30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ICAzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcdDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1x0XHQzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIH0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyAgfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szXHR9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezNcdFx0fScsICczJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZXhwcj17IHt4OiB5IGZvciB4LCB5IGluIFsoMSwgMiksIF19fScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHI9ezE6IDJ9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2V4cHI9eyB7eDogeSBmb3IgeCwgeSBpbiBbKDEsIDIpLCBdfSB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcj17MTogMn0nKQorCisgICAgZGVmIHRlc3RfY2hhcmFjdGVyX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7NH1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICc0XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7e319XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9ezN9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAne31cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0zJykKKworICAgIGRlZiB0ZXN0X25vdF9lcXVhbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIGEgc3BlY2lhbCB0ZXN0IGZvciB0aGlzIGJlY2F1c2UgdGhlcmUncyBhIHNwZWNpYWwKKyAgICAgICAgIyAgY2FzZSBpbiB0aGUgZi1zdHJpbmcgcGFyc2VyIHRvIGxvb2sgZm9yICE9IGFzIG5vdCBlbmRpbmcgYW4KKyAgICAgICAgIyAgZXhwcmVzc2lvbi4gTm9ybWFsbHkgaXQgd291bGQsIHdoaWxlIGxvb2tpbmcgZm9yICFzIG9yICFyLgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NH0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NDp9JywgJ1RydWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhPTQhc30nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzOi4zfScsICdUcnUnKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDoxMC4xMH0nLCAnICAgICAgMy4xNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFzOjEwLjEwfScsICczLjE0ICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXI6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhYToxMC4xMH0nLCAnMy4xNCAgICAgICcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSJ9JywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFyfScsICInYSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFhfScsICInYSciKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSFyIn0nLCAiYSFyIikKKworICAgICAgICAjIE5vdCBhIGNvbnZlcnNpb24sIGJ1dCBzaG93IHRoYXQgISBpcyBhbGxvd2VkIGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDohPDEwLjEwfScsICczLjE0ISEhISEhJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0ifScsICdcdTAzOTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0iIXJ9JywgIidcdTAzOTQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9IiFhfScsICInXFx1MDM5NCciKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogaW52YWxpZCBjb252ZXJzaW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szIWd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szISF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szITp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhIHN9JyIsICAjIG5vIHNwYWNlIGJlZm9yZSBjb252ZXJzaW9uIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3ghXFx4MDA6LjwxMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7eCFze3l9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzc30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhc3M6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzczpzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnJyA9IDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MH0nID0geCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t4fScgPSB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RlbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImRlbCBmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsICcnIGYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9taXNtYXRjaGVkX2JyYWNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne3t9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7fX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneH14JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYW4ndCBoYXZlIHsgb3IgfSBpbiBhIGZvcm1hdCBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7Mzp9PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezM6XFx9PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7Mzp9fT4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7Mzp7ez4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXM6MyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4e3gnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6cyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e3snIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t9fXsnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7MzpcXHs+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgIyBCdXQgdGhlc2UgYXJlIGp1c3Qgbm9ybWFsIHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7InsifScsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sifSJ9JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezM6eyJ9In0+MTB9JywgJ319fX19fX19fTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezI6eyJ7In0+MTB9JywgJ3t7e3t7e3t7ezInKQorCisgICAgZGVmIHRlc3RfaWZfY29uZGl0aW9uYWwoc2VsZik6CisgICAgICAgICMgVGhlcmUncyBzcGVjaWFsIGxvZ2ljIGluIGNvbXBpbGUuYyB0byB0ZXN0IGlmIHRoZQorICAgICAgICAjICBjb25kaXRpb25hbCBmb3IgYW4gaWYgKGFuZCB3aGlsZSkgYXJlIGNvbnN0YW50cy4gRXhlcmNpc2UKKyAgICAgICAgIyAgdGhhdCBjb2RlLgorCisgICAgICAgIGRlZiB0ZXN0X2ZzdHJpbmcoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcnIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfbm9uX2VtcHR5KHgsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGZsYWcgPSAwCisgICAgICAgICAgICBpZiAnICcgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIHRlc3RfZnN0cmluZygnJywgMikKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcgJywgMSkKKworICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnJywgMikKKyAgICAgICAgdGVzdF9jb25jYXRfZW1wdHkoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X25vbl9lbXB0eSgnJywgMSkKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcgJywgMSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2Zvcm1hdF9zcGVjaWZpZXIoc2VsZik6CisgICAgICAgIHggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4On0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFzOn0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFyOn0nLCAiJ3Rlc3QnIikKKworICAgIGRlZiB0ZXN0X3N0cl9mb3JtYXRfZGlmZmVyZW5jZXMoc2VsZik6CisgICAgICAgIGQgPSB7J2EnOiAnc3RyaW5nJywKKyAgICAgICAgICAgICAwOiAnaW50ZWdlcicsCisgICAgICAgICAgICAgfQorICAgICAgICBhID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbMF19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbImEiXX0nLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkW2FdfScsICdpbnRlZ2VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbYV19Jy5mb3JtYXQoZD1kKSwgJ3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tkWzBdfScuZm9ybWF0KGQ9ZCksICdpbnRlZ2VyJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7YVs0KX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3thKDRdfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlIDI2Mjg3CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAnbm9uLWVtcHR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3sobGFtYmRhOiAwKTp4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYneygwLCk6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShWYWx1ZUVycm9yLCAnVW5rbm93biBmb3JtYXQgY29kZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7MTAwMDpqfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezEwMDA6an0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbG9vcChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnaTp7aX0nLCAnaTonICsgc3RyKGkpKQorCisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgZCA9IHsnIic6ICdkcXVvdGUnLAorICAgICAgICAgICAgICInIjogJ3NxdW90ZScsCisgICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAorICAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkWyJcJyJdfScsICdzcXVvdGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbJ1wiJ119IiwgJ2RxdW90ZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycne2RbIiciXX0nJycsICdzcXVvdGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYiIiJ7ZFsnIiddfSIiIiwgJ2RxdW90ZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkWyJmb28iXX0nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntkWydmb28nXX0iLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkW1wnZm9vXCddfScsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbXCJmb29cIl19IiwgJ2JhcicpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX3F1b3RlcyhzZWxmKToKKyAgICAgICAgZCA9IHsnIic6ICdhJywKKyAgICAgICAgICAgICAiJyI6ICdiJ30KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyIntkWydcIiddfSIsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcid7ZFsiXCciXX0nLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnIieydcIid9IiwgJyInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyJ3siXCcifScsICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siXFwiMyJ9JywgJyIzJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyJycnZid7IiIiXFx9JyAnJycsICAjIEJhY2tzbGFzaCBhdCBlbmQgb2YgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAndW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgbGluZSBjb250aW51YXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyInJmJ3szXH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQppbmRleCBhZWY2NmRhLi45ZDhkZTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQpAQCAtMTA0OSwxMCArMTA0OSwxOSBAQAogICAgICAgICBmdHAuY2xvc2UoKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZShUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J01TR19PT0InLCAnRlRQX1BPUlQnLCAnTUFYTElORScsICdDUkxGJywgJ0JfQ1JMRicsCisgICAgICAgICAgICAgICAgICAgICAnRXJyb3InLCAncGFyc2UxNTAnLCAncGFyc2UyMjcnLCAncGFyc2UyMjknLCAncGFyc2UyNTcnLAorICAgICAgICAgICAgICAgICAgICAgJ3ByaW50X2xpbmUnLCAnZnRwY3AnLCAndGVzdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZ0cGxpYiwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbVGVzdEZUUENsYXNzLCBUZXN0VGltZW91dHMsCiAgICAgICAgICAgICAgVGVzdElQdjZFbnZpcm9ubWVudCwKLSAgICAgICAgICAgICBUZXN0VExTX0ZUUENsYXNzTWl4aW4sIFRlc3RUTFNfRlRQQ2xhc3NdCisgICAgICAgICAgICAgVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzLAorICAgICAgICAgICAgIE1pc2NUZXN0Q2FzZV0KIAogICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggYWI1MWEzNS4uZTJhYjY1NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTE1NzcsNyArMTU3Nyw3IEBACiAgICAgICAgICAgICBtID0gbXJvKEQsIGJhc2VzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbRCwgYy5NdXRhYmxlU2VxdWVuY2UsIGMuU2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmRlZmF1bHRkaWN0LCBkaWN0LCBjLk11dGFibGVNYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5NYXBwaW5nLCBjLlNpemVkLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuTWFwcGluZywgYy5TaXplZCwgYy5SZXZlcnNpYmxlLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF0pCiAKICAgICAgICAgIyBDb250YWluZXIgYW5kIENhbGxhYmxlIGFyZSByZWdpc3RlcmVkIG9uIGRpZmZlcmVudCBiYXNlIGNsYXNzZXMgYW5kCkBAIC0xNzU4LDEzICsxNzU4LDEwIEBACiAgICAgICAgIGMuQ29udGFpbmVyLnJlZ2lzdGVyKFApCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKSBhcyByZV9vbmU6CiAgICAgICAgICAgICBnKHApCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oCi0gICAgICAgICAgICBzdHIocmVfb25lLmV4Y2VwdGlvbiksCi0gICAgICAgICAgICAoKCJBbWJpZ3VvdXMgZGlzcGF0Y2g6IDxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcic+ICIKLSAgICAgICAgICAgICAgIm9yIDxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlJz4iKSwKLSAgICAgICAgICAgICAoIkFtYmlndW91cyBkaXNwYXRjaDogPGNsYXNzICdjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGUnPiAiCi0gICAgICAgICAgICAgICJvciA8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInPiIpKSwKLSAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEluKCJBbWJpZ3VvdXMgZGlzcGF0Y2g6Iiwgc3RyKHJlX29uZS5leGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEluKCI8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInIiwgc3RyKHJlX29uZS5leGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEluKCI8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5JdGVyYWJsZSciLCBzdHIocmVfb25lLmV4Y2VwdGlvbikpCisKICAgICAgICAgY2xhc3MgUShjLlNpemVkKToKICAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiAwCkBAIC0xNzkwLDEzICsxNzg3LDEwIEBACiAgICAgICAgICMgcGVyc3BlY3RpdmUuCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKSBhcyByZV90d286CiAgICAgICAgICAgICBoKGMuZGVmYXVsdGRpY3QobGFtYmRhOiAwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbigKLSAgICAgICAgICAgIHN0cihyZV90d28uZXhjZXB0aW9uKSwKLSAgICAgICAgICAgICgoIkFtYmlndW91cyBkaXNwYXRjaDogPGNsYXNzICdjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyJz4gIgotICAgICAgICAgICAgICAib3IgPGNsYXNzICdjb2xsZWN0aW9ucy5hYmMuU2l6ZWQnPiIpLAotICAgICAgICAgICAgICgiQW1iaWd1b3VzIGRpc3BhdGNoOiA8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5TaXplZCc+ICIKLSAgICAgICAgICAgICAgIm9yIDxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lcic+IikpLAotICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIkFtYmlndW91cyBkaXNwYXRjaDoiLCBzdHIocmVfdHdvLmV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIjxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLkNvbnRhaW5lciciLCBzdHIocmVfdHdvLmV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIjxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLlNpemVkJyIsIHN0cihyZV90d28uZXhjZXB0aW9uKSkKKwogICAgICAgICBjbGFzcyBSKGMuZGVmYXVsdGRpY3QpOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBjLk11dGFibGVTZXF1ZW5jZS5yZWdpc3RlcihSKQpAQCAtMTgzMCwxMyArMTgyNCwxMCBAQAogICAgICAgICAjIFRoZXJlIGlzIG5vIHByZWZlcmVuY2UgZm9yIHJlZ2lzdGVyZWQgdmVyc3VzIGluZmVycmVkIEFCQ3MuCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKSBhcyByZV90aHJlZToKICAgICAgICAgICAgIGgodSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbigKLSAgICAgICAgICAgIHN0cihyZV90aHJlZS5leGNlcHRpb24pLAotICAgICAgICAgICAgKCgiQW1iaWd1b3VzIGRpc3BhdGNoOiA8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInPiAiCi0gICAgICAgICAgICAgICJvciA8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5TaXplZCc+IiksCi0gICAgICAgICAgICAgKCJBbWJpZ3VvdXMgZGlzcGF0Y2g6IDxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLlNpemVkJz4gIgotICAgICAgICAgICAgICAib3IgPGNsYXNzICdjb2xsZWN0aW9ucy5hYmMuQ29udGFpbmVyJz4iKSksCi0gICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiQW1iaWd1b3VzIGRpc3BhdGNoOiIsIHN0cihyZV90aHJlZS5leGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEluKCI8Y2xhc3MgJ2NvbGxlY3Rpb25zLmFiYy5Db250YWluZXInIiwgc3RyKHJlX3RocmVlLmV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIjxjbGFzcyAnY29sbGVjdGlvbnMuYWJjLlNpemVkJyIsIHN0cihyZV90aHJlZS5leGNlcHRpb24pKQorCiAgICAgICAgIGNsYXNzIFYoYy5TaXplZCwgUyk6CiAgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nYy5weSBiL0xpYi90ZXN0L3Rlc3RfZ2MucHkKaW5kZXggYTRkNjg0Yi4uZTcyNzQ5OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2djLnB5CkBAIC02ODQsNyArNjg0LDYgQEAKICAgICAgICAgIyBDcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUgdGhyb3VnaCB0aGUgX19tYWluX18gbW9kdWxlIGFuZCBjaGVjawogICAgICAgICAjIGl0IGdldHMgY29sbGVjdGVkIGF0IGludGVycHJldGVyIHNodXRkb3duLgogICAgICAgICBjb2RlID0gIiIiaWYgMToKLSAgICAgICAgICAgIGltcG9ydCB3ZWFrcmVmCiAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICBwcmludCgnX19kZWxfXyBjYWxsZWQnKQpAQCAtNjk5LDcgKzY5OCw2IEBACiAgICAgICAgICMgU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGggYSBub24tX19tYWluX18gbW9kdWxlLgogICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKICAgICAgICAgICAgIG1vZHVsZSA9ICIiImlmIDE6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHdlYWtyZWYKICAgICAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCdfX2RlbF9fIGNhbGxlZCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dkYi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5CmluZGV4IGNkN2QyOTIuLjczMGI2MjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5CkBAIC01LDcgKzUsNiBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCByZQotaW1wb3J0IHBwcmludAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKQEAgLTE3Niw2ICsxNzUsNyBAQAogICAgICAgICBhcmdzID0gWyctLWV2YWwtY29tbWFuZD0lcycgJSBjbWQgZm9yIGNtZCBpbiBjb21tYW5kc10KICAgICAgICAgYXJncyArPSBbIi0tYXJncyIsCiAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlXQorICAgICAgICBhcmdzLmV4dGVuZChzdWJwcm9jZXNzLl9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSkKIAogICAgICAgICBpZiBub3QgaW1wb3J0X3NpdGU6CiAgICAgICAgICAgICAjIC1TIHN1cHByZXNzZXMgdGhlIGRlZmF1bHQgJ2ltcG9ydCBzaXRlJwpAQCAtMjkxLDcgKzI5MSw5IEBACiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBkaWN0aW9uYXJpZXMnCiAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7fSkKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2Jhcid9LCAieydmb28nOiAnYmFyJ30iKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJywgJ2RvdWdsYXMnOiA0Mn0sICJ7J2RvdWdsYXMnOiA0MiwgJ2Zvbyc6ICdiYXInfSIpCisgICAgICAgICMgUFlUSE9OSEFTSFNFRUQgaXMgbmVlZCB0byBnZXQgdGhlIGV4YWN0IGl0ZW0gb3JkZXIKKyAgICAgICAgaWYgbm90IHN5cy5mbGFncy5pZ25vcmVfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJywgJ2RvdWdsYXMnOiA0Mn0sICJ7J2RvdWdsYXMnOiA0MiwgJ2Zvbyc6ICdiYXInfSIpCiAKICAgICBkZWYgdGVzdF9saXN0cyhzZWxmKToKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGxpc3RzJwpAQCAtMzU0LDkgKzM1NiwxMiBAQAogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2Ygc2V0cycKICAgICAgICAgaWYgKGdkYl9tYWpvcl92ZXJzaW9uLCBnZGJfbWlub3JfdmVyc2lvbikgPCAoNywgMyk6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJwcmV0dHktcHJpbnRpbmcgb2Ygc2V0cyBuZWVkcyBnZGIgNy4zIG9yIGxhdGVyIikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldCgpLCAnc2V0KCknKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYScsICdiJ10pLCAieydhJywgJ2InfSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWzQsIDUsIDZdKSwgIns0LCA1LCA2fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoKSwgInNldCgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbJ2EnXSksICJ7J2EnfSIpCisgICAgICAgICMgUFlUSE9OSEFTSFNFRUQgaXMgbmVlZCB0byBnZXQgdGhlIGV4YWN0IGZyb3plbnNldCBpdGVtIG9yZGVyCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbJ2EnLCAnYiddKSwgInsnYScsICdiJ30iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbNCwgNSwgNl0pLCAiezQsIDUsIDZ9IikKIAogICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGhhbmRsZSBzZXRzIGNvbnRhaW5pbmcgdGhlICJkdW1teSIga2V5IHZhbHVlLAogICAgICAgICAjIHdoaWNoIGhhcHBlbnMgb24gZGVsZXRpb246CkBAIC0zNjksOSArMzc0LDEyIEBACiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBmcm96ZW5zZXRzJwogICAgICAgICBpZiAoZ2RiX21ham9yX3ZlcnNpb24sIGdkYl9taW5vcl92ZXJzaW9uKSA8ICg3LCAzKToKICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInByZXR0eS1wcmludGluZyBvZiBmcm96ZW5zZXRzIG5lZWRzIGdkYiA3LjMgb3IgbGF0ZXIiKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KCksICdmcm96ZW5zZXQoKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWydhJywgJ2InXSksICJmcm96ZW5zZXQoeydhJywgJ2InfSkiKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFs0LCA1LCA2XSksICJmcm96ZW5zZXQoezQsIDUsIDZ9KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoKSwgImZyb3plbnNldCgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbJ2EnXSksICJmcm96ZW5zZXQoeydhJ30pIikKKyAgICAgICAgIyBQWVRIT05IQVNIU0VFRCBpcyBuZWVkIHRvIGdldCB0aGUgZXhhY3QgZnJvemVuc2V0IGl0ZW0gb3JkZXIKKyAgICAgICAgaWYgbm90IHN5cy5mbGFncy5pZ25vcmVfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYScsICdiJ10pLCAiZnJvemVuc2V0KHsnYScsICdiJ30pIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWzQsIDUsIDZdKSwgImZyb3plbnNldCh7NCwgNSwgNn0pIikKIAogICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CiAgICAgICAgICMgVGVzdCBhIFJ1bnRpbWVFcnJvcgpAQCAtNTAwLDYgKzUwOCwxMCBAQAogCiAgICAgZGVmIHRlc3RfYnVpbHRpbnNfaGVscChzZWxmKToKICAgICAgICAgJ0Vuc3VyZSB0aGF0IHRoZSBuZXctc3R5bGUgY2xhc3MgX0hlbHBlciBpbiBzaXRlLnB5IGNhbiBiZSBoYW5kbGVkJworCisgICAgICAgIGlmIHN5cy5mbGFncy5ub19zaXRlOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgibmVlZCBzaXRlIG1vZHVsZSwgYnV0IC1TIG9wdGlvbiB3YXMgdXNlZCIpCisKICAgICAgICAgIyAodGhpcyB3YXMgdGhlIGlzc3VlIGNhdXNpbmcgdHJhY2ViYWNrcyBpbgogICAgICAgICAjICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlODAzMiNtc2cxMDA1MzcgKQogICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCdpZChfX2J1aWx0aW5zX18uaGVscCknLCBpbXBvcnRfc2l0ZT1UcnVlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CmluZGV4IDNmODI0NjIuLmMxOTMzMDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTI0NSwxMSArMjQ1LDExIEBACiAgICAgICAgICAgICB5aWVsZAogCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiksIFwKLSAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogCiAgICAgICAgICAgICBuZXh0KGdlbigpKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRvciAuKiByYWlzZWQgU3RvcEl0ZXJhdGlvbiIpLCBcCiAgICAgICAgICAgICAgd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKIApAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgICAgIGcgPSBmKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGcpLCAxKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbik6CiAgICAgICAgICAgICAgICAgbmV4dChnKQogCkBAIC02NzEsMTAgKzY3MSwxMCBAQAogLi4uICAgICB5aWVsZCAxCiAuLi4KID4+PiB0eXBlKGcpCi08Y2xhc3MgJ2Z1bmN0aW9uJz4KKzxjbGFzcyAnZnVuY3Rpb24nIC4uLj4KID4+PiBpID0gZygpCiA+Pj4gdHlwZShpKQotPGNsYXNzICdnZW5lcmF0b3InPgorPGNsYXNzICdnZW5lcmF0b3InIC4uLj4KID4+PiBbcyBmb3IgcyBpbiBkaXIoaSkgaWYgbm90IHMuc3RhcnRzd2l0aCgnXycpXQogWydjbG9zZScsICdnaV9jb2RlJywgJ2dpX2ZyYW1lJywgJ2dpX3J1bm5pbmcnLCAnZ2lfeWllbGRmcm9tJywgJ3NlbmQnLCAndGhyb3cnXQogPj4+IGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBIQVZFX0RPQ1NUUklOR1MKQEAgLTY5MSw3ICs2OTEsNyBAQAogPj4+IGkuZ2lfcnVubmluZwogMAogPj4+IHR5cGUoaS5naV9mcmFtZSkKLTxjbGFzcyAnZnJhbWUnPgorPGNsYXNzICdmcmFtZScgLi4uPgogPj4+IGkuZ2lfcnVubmluZyA9IDQyCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIC4uLgpAQCAtMTA2NiwyNyArMTA2NiwyNyBAQAogPj4+IGRlZiBmKCk6CiAuLi4gICAgeWllbGQKID4+PiB0eXBlKGYoKSkKLTxjbGFzcyAnZ2VuZXJhdG9yJz4KKzxjbGFzcyAnZ2VuZXJhdG9yJyAuLi4+CiAKIAogPj4+IGRlZiBmKCk6CiAuLi4gICAgaWYgMDoKIC4uLiAgICAgICAgeWllbGQKID4+PiB0eXBlKGYoKSkKLTxjbGFzcyAnZ2VuZXJhdG9yJz4KKzxjbGFzcyAnZ2VuZXJhdG9yJyAuLi4+CiAKIAogPj4+IGRlZiBmKCk6CiAuLi4gICAgIGlmIDA6CiAuLi4gICAgICAgICB5aWVsZCAxCiA+Pj4gdHlwZShmKCkpCi08Y2xhc3MgJ2dlbmVyYXRvcic+Cis8Y2xhc3MgJ2dlbmVyYXRvcicgLi4uPgogCiA+Pj4gZGVmIGYoKToKIC4uLiAgICBpZiAiIjoKIC4uLiAgICAgICAgeWllbGQgTm9uZQogPj4+IHR5cGUoZigpKQotPGNsYXNzICdnZW5lcmF0b3InPgorPGNsYXNzICdnZW5lcmF0b3InIC4uLj4KIAogPj4+IGRlZiBmKCk6CiAuLi4gICAgIHJldHVybgpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIC4uLiAgICAgICAgIHggPSAxCiAuLi4gICAgIHJldHVybgogPj4+IHR5cGUoZigpKQotPGNsYXNzICdnZW5lcmF0b3InPgorPGNsYXNzICdnZW5lcmF0b3InIC4uLj4KIAogPj4+IGRlZiBmKCk6CiAuLi4gICAgIGlmIDA6CkBAIC0xMTE4LDcgKzExMTgsNyBAQAogLi4uICAgICAgICAgICAgIHlpZWxkIDEKIC4uLgogPj4+IHR5cGUoZigpKQotPGNsYXNzICdOb25lVHlwZSc+Cis8Y2xhc3MgJ05vbmVUeXBlJyAuLi4+CiAKID4+PiBkZWYgZigpOgogLi4uICAgICBpZiAwOgpAQCAtMTEyOCw3ICsxMTI4LDcgQEAKIC4uLiAgICAgICAgICAgICBkZWYgZihzZWxmKToKIC4uLiAgICAgICAgICAgICAgICAgeWllbGQgMgogPj4+IHR5cGUoZigpKQotPGNsYXNzICdOb25lVHlwZSc+Cis8Y2xhc3MgJ05vbmVUeXBlJyAuLi4+CiAKID4+PiBkZWYgZigpOgogLi4uICAgICBpZiAwOgpAQCAtMTEzNiw3ICsxMTM2LDcgQEAKIC4uLiAgICAgaWYgMDoKIC4uLiAgICAgICAgIHlpZWxkIDIKID4+PiB0eXBlKGYoKSkKLTxjbGFzcyAnZ2VuZXJhdG9yJz4KKzxjbGFzcyAnZ2VuZXJhdG9yJyAuLi4+CiAKIFRoaXMgb25lIGNhdXNlZCBhIGNyYXNoIChzZWUgU0YgYnVnIDU2NzUzOCk6CiAKQEAgLTE3OTEsNyArMTc5MSw3IEBACiAKID4+PiBkZWYgZigpOiBsaXN0KGkgZm9yIGkgaW4gWyh5aWVsZCAyNildKQogPj4+IHR5cGUoZigpKQotPGNsYXNzICdnZW5lcmF0b3InPgorPGNsYXNzICdnZW5lcmF0b3InIC4uLj4KIAogCiBBIHlpZWxkIGV4cHJlc3Npb24gd2l0aCBhdWdtZW50ZWQgYXNzaWdubWVudC4KQEAgLTIwNDcsMjUgKzIwNDcsMjUgQEAKIAogPj4+IGRlZiBmKCk6IHggKz0geWllbGQKID4+PiB0eXBlKGYoKSkKLTxjbGFzcyAnZ2VuZXJhdG9yJz4KKzxjbGFzcyAnZ2VuZXJhdG9yJyAuLi4+CiAKID4+PiBkZWYgZigpOiB4ID0geWllbGQKID4+PiB0eXBlKGYoKSkKLTxjbGFzcyAnZ2VuZXJhdG9yJz4KKzxjbGFzcyAnZ2VuZXJhdG9yJyAuLi4+CiAKID4+PiBkZWYgZigpOiBsYW1iZGEgeD0oeWllbGQpOiAxCiA+Pj4gdHlwZShmKCkpCi08Y2xhc3MgJ2dlbmVyYXRvcic+Cis8Y2xhc3MgJ2dlbmVyYXRvcicgLi4uPgogCiA+Pj4gZGVmIGYoKTogeD0oaSBmb3IgaSBpbiAoeWllbGQpIGlmICh5aWVsZCkpCiA+Pj4gdHlwZShmKCkpCi08Y2xhc3MgJ2dlbmVyYXRvcic+Cis8Y2xhc3MgJ2dlbmVyYXRvcicgLi4uPgogCiA+Pj4gZGVmIGYoZCk6IGRbKHlpZWxkICJhIildID0gZFsoeWllbGQgImIiKV0gPSAyNwogPj4+IGRhdGEgPSBbMSwyXQogPj4+IGcgPSBmKGRhdGEpCiA+Pj4gdHlwZShnKQotPGNsYXNzICdnZW5lcmF0b3InPgorPGNsYXNzICdnZW5lcmF0b3InIC4uLj4KID4+PiBnLnNlbmQoTm9uZSkKICdhJwogPj4+IGRhdGEKQEAgLTIxNzQsOCArMjE3NCw5IEBACiAjIHNvIHRoaXMgd29ya3MgYXMgZXhwZWN0ZWQgaW4gYm90aCB3YXlzIG9mIHJ1bm5pbmcgcmVncnRlc3QuCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CiAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCB0ZXN0X2dlbmVyYXRvcnMKKyAgICBpbXBvcnQgZG9jdGVzdAogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQotICAgIHN1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9nZW5lcmF0b3JzLCB2ZXJib3NlKQorICAgIHN1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9nZW5lcmF0b3JzLCB2ZXJib3NlLCBvcHRpb25mbGFncz1kb2N0ZXN0LkVMTElQU0lTKQogCiAjIFRoaXMgcGFydCBpc24ndCBuZWVkZWQgZm9yIHJlZ3J0ZXN0LCBidXQgZm9yIHJ1bm5pbmcgdGhlIHRlc3QgZGlyZWN0bHkuCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKaW5kZXggODZmYzJkZS4uOWMyOGE2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CkBAIC0xMCwxMSArMTAsOSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAotZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6Ci0gICAgdHJ5OgotICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBwYXNzCitkZWYgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGRhdGE9Yidmb28nKToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd4YicsIDApIGFzIGZwOgorICAgICAgICBmcC53cml0ZShkYXRhKQogCiAKIGNsYXNzIEdlbmVyaWNUZXN0OgpAQCAtOTcsNTIgKzk1LDQ3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczFbbjpuKzFdLCBzMltuOm4rMV0pCiAKICAgICBkZWYgdGVzdF9nZXRzaXplKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUoc3VwcG9ydC5URVNURk4pLCAzKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKIAotICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6Ci0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJhYiIpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZShmaWxlbmFtZSksIDUpCisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidIZWxsbyBXb3JsZCEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aG1vZHVsZS5nZXRzaXplKGZpbGVuYW1lKSwgMTIpCisKKyAgICBkZWYgdGVzdF9maWxldGltZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ2ZvbycpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAiYWIiLCAwKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImJhciIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKQotICAgICAgICAgICAgZCA9IGYucmVhZCgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgYiJmb29iYXIiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgKLSAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRtdGltZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgICkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImZvb2JhciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUoZmlsZW5hbWUpLAorICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldG10aW1lKGZpbGVuYW1lKQorICAgICAgICApCiAKICAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAieGIiKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXRobW9kdWxlID09IGdlbmVyaWNwYXRoOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmxleGlzdHMoc3VwcG9ydC5URVNURk4pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhtb2R1bGUgPT0gZ2VuZXJpY3BhdGg6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKGZpbGVuYW1lKSwgVHJ1ZSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJwaXBlIiksICJyZXF1aXJlcyBvcy5waXBlKCkiKQogICAgIGRlZiB0ZXN0X2V4aXN0c19mZChzZWxmKToKQEAgLTE1NCw1MyArMTQ3LDY2IEBACiAgICAgICAgICAgICBvcy5jbG9zZSh3KQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5leGlzdHMocikpCiAKLSAgICBkZWYgdGVzdF9pc2RpcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIEZhbHNlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihzdXBwb3J0LlRFU1RGTiksIFRydWUpCi0gICAgICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIHNhZmVfcm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgZGVmIHRlc3RfaXNkaXJfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQogCi0gICAgZGVmIHRlc3RfaXNmaWxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgb3MucmVtb3ZlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2FmZV9ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCiAKLSAgICBAc3RhdGljbWV0aG9kCi0gICAgZGVmIF9jcmVhdGVfZmlsZShmaWxlbmFtZSk6Ci0gICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoYidmb28nKQorICAgIGRlZiB0ZXN0X2lzZGlyX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgRmFsc2UpCisKKyAgICAgICAgb3MubWtkaXIoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzZmlsZV9maWxlKHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNmaWxlX2RpcihzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybWRpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZmlsZShmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIG9zLm1rZGlyKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X3NhbWVmaWxlKHNlbGYpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0X2ZuID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4pCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4sIHRlc3RfZm4pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgZmlsZTEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBmaWxlMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZTIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUxKSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUoZmlsZTEsIGZpbGUyKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSkKKworICAgIGRlZiBfdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6CisgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4xKQorCisgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCisgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUodGVzdF9mbjEsIHRlc3RfZm4yKSkKIAogICAgIEBzdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9zeW1saW5rKHNlbGYpOgpAQCAtMjA5LDMxICsyMTUsMzcgQEAKICAgICBkZWYgdGVzdF9zYW1lZmlsZV9vbl9saW5rKHNlbGYpOgogICAgICAgICBzZWxmLl90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhvcy5saW5rKQogCi0gICAgZGVmIF90ZXN0X3NhbWVmaWxlX29uX2xpbmtfZnVuYyhzZWxmLCBmdW5jKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjEpCi0KLSAgICAgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjEpCi0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCi0KICAgICBkZWYgdGVzdF9zYW1lc3RhdChzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbiA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuKQotICAgICAgICAgICAgdGVzdF9mbnMgPSBbdGVzdF9mbl0qMgotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbikKKyAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjEpCisgICAgICAgIHN0YXQxID0gb3Muc3RhdCh0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChzdGF0MSwgb3Muc3RhdCh0ZXN0X2ZuMSkpKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4yKQorICAgICAgICBzdGF0MiA9IG9zLnN0YXQodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KHN0YXQxLCBzdGF0MikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQpCisKKyAgICBkZWYgX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKKyAgICAgICAgZnVuYyh0ZXN0X2ZuMSwgdGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQob3Muc3RhdCh0ZXN0X2ZuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X2ZuMikpKQorICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KG9zLnN0YXQodGVzdF9mbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3RfZm4yKSkpCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fc3ltbGluayhzZWxmKToKQEAgLTI0MiwzMSArMjU0LDE3IEBACiAgICAgZGVmIHRlc3Rfc2FtZXN0YXRfb25fbGluayhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMob3MubGluaykKIAotICAgIGRlZiBfdGVzdF9zYW1lc3RhdF9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4xKQotICAgICAgICAgICAgdGVzdF9mbnMgPSAodGVzdF9mbjEsIHRlc3RfZm4yKQotICAgICAgICAgICAgZnVuYygqdGVzdF9mbnMpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQoKnN0YXRzKSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjIpCi0gICAgICAgICAgICBzdGF0cyA9IG1hcChvcy5zdGF0LCB0ZXN0X2ZucykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4xKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCiAgICAgZGVmIHRlc3Rfc2FtZW9wZW5maWxlKHNlbGYpOgotICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgIHdpdGggb3BlbihmbmFtZSwgIndiIikgYXMgYSwgb3BlbihmbmFtZSwgIndiIikgYXMgYjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZW9wZW5maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmZpbGVubygpLCBiLmZpbGVubygpKSkKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSkKKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIsIDApIGFzIGZwMToKKyAgICAgICAgICAgIGZkMSA9IGZwMS5maWxlbm8oKQorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmcDI6CisgICAgICAgICAgICAgICAgZmQyID0gZnAyLmZpbGVubygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lb3BlbmZpbGUoZmQxLCBmZDIpKQorCiAKIGNsYXNzIFRlc3RHZW5lcmljVGVzdChHZW5lcmljVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgICMgSXNzdWUgMTY4NTI6IEdlbmVyaWNUZXN0IGNhbid0IGluaGVyaXQgZnJvbSB1bml0dGVzdC5UZXN0Q2FzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CmluZGV4IGZiNTMxZDYuLmM1ZTEwZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKQEAgLTI3LDcgKzI3LDcgQEAKIAogICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSg0KSkKICAgICA+Pj4gdHlwZShnKQotICAgIDxjbGFzcyAnZ2VuZXJhdG9yJz4KKyAgICA8Y2xhc3MgJ2dlbmVyYXRvcicgLi4uPgogICAgID4+PiBsaXN0KGcpCiAgICAgWzAsIDEsIDQsIDldCiAKQEAgLTI2OSw3ICsyNjksOCBAQAogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9nZW5leHBzCi0gICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2dlbmV4cHMsIHZlcmJvc2UpCisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZ2VuZXhwcywgdmVyYm9zZSwgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5FTExJUFNJUykKIAogICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZwogICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKaW5kZXggOTg0YWFjNy4uMTZlMTYzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC0zNjUsNyArMzY1LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoRmxvYXRTdWJjbGFzcyg3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZihGbG9hdFN1YmNsYXNzMig3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZiwgQmFkRmxvYXQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoQmFkRmxvYXQyKCkpLCA0LjI1KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0MigpKSwgNC4yNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoQmFkRmxvYXQzKDcuNSkpLCA3LjUpCiAKICAgICAgICAgZm9yIHggaW4gKEZMVF9NSU4sIC1GTFRfTUlOLCBGTFRfTUFYLCAtRkxUX01BWCwgSU5GLCAtSU5GKToKQEAgLTM5MCw3ICszOTEsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChGbG9hdFN1YmNsYXNzKDcuNSkpLCA3LjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19kKEZsb2F0U3ViY2xhc3MyKDcuNSkpLCA3LjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19kLCBCYWRGbG9hdCgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChCYWRGbG9hdDIoKSksIDQuMjUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQyKCkpLCA0LjI1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChCYWRGbG9hdDMoNy41KSksIDcuNSkKIAogICAgICAgICBmb3IgeCBpbiAoREJMX01JTiwgLURCTF9NSU4sIERCTF9NQVgsIC1EQkxfTUFYLCBJTkYsIC1JTkYpOgpAQCAtNDc0LDcgKzQ3Niw3IEBACiAKICAgICAgICAgcmV0ID0gZ2V0X2FyZ3MoKlR1cGxlU3ViY2xhc3MoWzEsIDJdKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsICgxLCAyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJldCwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyZXQpLCB0dXBsZSkKIAogICAgICAgICByZXQgPSBnZXRfYXJncygpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmV0LCAoKCksIE5vbmUpKQpAQCAtNTEyLDcgKzUxNCw3IEBACiAKICAgICAgICAgcmV0ID0gZ2V0X2t3YXJncygqKkRpY3RTdWJjbGFzcyh7J2EnOiAxLCAnYic6IDJ9KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIHsnYSc6IDEsICdiJzogMn0pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXQsIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyZXQpLCBkaWN0KQogCiAgICAgICAgIHJldCA9IGdldF9rd2FyZ3MoKQogICAgICAgICBzZWxmLmFzc2VydEluKHJldCwgKHt9LCBOb25lKSkKQEAgLTY1Niw2ICs2NTgsMzkgQEAKICAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZF9vbmx5KDEsIDIsICoqeydcdURDODAnOiAxMH0pCiAKIAorY2xhc3MgUG9zaXRpb25hbE9ubHlBbmRLZXl3b3Jkc19UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcyBhcyBnZXRhcmdzCisKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX2FyZ3Moc2VsZik6CisgICAgICAgICMgdXNpbmcgYWxsIHBvc3NpYmxlIHBvc2l0aW9uYWwgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxLCAyLCAzKSwgKDEsIDIsIDMpKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfYXJncyhzZWxmKToKKyAgICAgICAgIyBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSwgMiwga2V5d29yZD0zKSwgKDEsIDIsIDMpKQorCisgICAgZGVmIHRlc3Rfb3B0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgIyBtaXNzaW5nIG9wdGlvbmFsIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSwgMiksICgxLCAyLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIGtleXdvcmQ9MyksICgxLCAtMSwgMykpCisKKyAgICBkZWYgdGVzdF9yZXF1aXJlZF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxKSwgKDEsIC0xLCAtMSkpCisgICAgICAgICMgcmVxdWlyZWQgcG9zaXRpb25hbCBhcmcgbWlzc2luZworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgIkZ1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDEgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgwIGdpdmVuXCkiKToKKyAgICAgICAgICAgIHNlbGYuZ2V0YXJncygpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAxIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMCBnaXZlblwpIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3Moa2V5d29yZD0zKQorCisgICAgZGVmIHRlc3RfZW1wdHlfa2V5d29yZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICInJyBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iKToKKyAgICAgICAgICAgIHNlbGYuZ2V0YXJncygxLCAyLCAqKnsnJzogNjY2fSkKKworCiBjbGFzcyBCeXRlc19UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfYyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfYwpAQCAtODIyLDEwICs4NTcsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2VzX2hhc2goJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKSwgYidhYmNceGU5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ2FiY1x4ZTlceDAwJykpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheShiJ3gnKjQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19lc19oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYnl0ZWFycmF5KGIneCcqNCkpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19lc19oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogCiAgICAgZGVmIHRlc3RfZXRfaGFzaChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfZXRfaGFzaApAQCAtODQ4LDEwICs4ODMsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2V0X2hhc2goJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKSwgYidhYmNceGU5JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ2FiY1x4ZTlceDAwJykpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheShiJ3gnKjQpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19ldF9oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYnl0ZWFycmF5KGIneCcqNCkpCiAgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19ldF9oYXNoLCAnYWJjXHhlOScsICdsYXRpbjEnLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQogCiAgICAgZGVmIHRlc3RfdShzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfdQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5IGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CmluZGV4IGRlNjEwYzcuLmQzNDViYWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgb3MKIGltcG9ydCBiYXNlNjQKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBnZXR0ZXh0CiBpbXBvcnQgdW5pdHRlc3QKIApAQCAtNDQwLDYgKzQzOSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19jbGFzc19fLCBEdW1teUdOVVRyYW5zbGF0aW9ucykKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydjMnB5JywgJ0VOT0VOVCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGdldHRleHQsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKaW5kZXggMTU0ZTNiNi4uYmZlNTIyNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtMjk1LDYgKzI5NSwxMCBAQAogICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLGsyPTEwMCx0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwKQogICAgICAgICBwb3Mya2V5MmRpY3QoMSwyLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDAsIGsyPTEwMCkKIAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImRlZiBmKCopOiBwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqLCk6IHBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImRlZiBmKCosICoqa3dkcyk6IHBhc3MiKQorCiAgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgYWZ0ZXIgKmFyZ2xpc3QKICAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKQEAgLTM0MSw3ICszNDUsNyBAQAogICAgICAgICBkZWYgZih4KSAtPiBsaXN0OiBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5fX2Fubm90YXRpb25zX18sIHsncmV0dXJuJzogbGlzdH0pCiAKLSAgICAgICAgIyB0ZXN0IE1BS0VfQ0xPU1VSRSB3aXRoIGEgdmFyaWV0eSBvZiBvcGFyZydzCisgICAgICAgICMgdGVzdCBjbG9zdXJlcyB3aXRoIGEgdmFyaWV0eSBvZiBvcGFyZ3MKICAgICAgICAgY2xvc3VyZSA9IDEKICAgICAgICAgZGVmIGYoKTogcmV0dXJuIGNsb3N1cmUKICAgICAgICAgZGVmIGYoeD0xKTogcmV0dXJuIGNsb3N1cmUKQEAgLTM1Miw2ICszNTYsMjMgQEAKICAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCpnKDE9MikpIikKICAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCoqZygxPTIpKSIpCiAKKyAgICAgICAgIyBDaGVjayB0cmFpbGluZyBjb21tYXMgYXJlIHBlcm1pdHRlZCBpbiBmdW5jZGVmIGFyZ3VtZW50IGxpc3QKKyAgICAgICAgZGVmIGYoYSwpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKCosIGIsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsIGIsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKCphcmdzLCBiLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqLCBiLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZihhLCAqYXJncywgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiwgYiwgKiprd2RzLCk6IHBhc3MKKwogICAgIGRlZiB0ZXN0X2xhbWJkZWYoc2VsZik6CiAgICAgICAgICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CiAgICAgICAgIGwxID0gbGFtYmRhIDogMApAQCAtMzcwLDYgKzM5MSwyMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGw2KDEsMiksIDErMisyMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNigxLDIsaz0xMCksIDErMisxMCkKIAorICAgICAgICAjIGNoZWNrIHRoYXQgdHJhaWxpbmcgY29tbWFzIGFyZSBwZXJtaXR0ZWQKKyAgICAgICAgbDEwID0gbGFtYmRhIGEsOiAwCisgICAgICAgIGwxMSA9IGxhbWJkYSAqYXJncyw6IDAKKyAgICAgICAgbDEyID0gbGFtYmRhICoqa3dkcyw6IDAKKyAgICAgICAgbDEzID0gbGFtYmRhIGEsICphcmdzLDogMAorICAgICAgICBsMTQgPSBsYW1iZGEgYSwgKiprd2RzLDogMAorICAgICAgICBsMTUgPSBsYW1iZGEgKmFyZ3MsIGIsOiAwCisgICAgICAgIGwxNiA9IGxhbWJkYSAqLCBiLDogMAorICAgICAgICBsMTcgPSBsYW1iZGEgKmFyZ3MsICoqa3dkcyw6IDAKKyAgICAgICAgbDE4ID0gbGFtYmRhIGEsICphcmdzLCBiLDogMAorICAgICAgICBsMTkgPSBsYW1iZGEgYSwgKiwgYiw6IDAKKyAgICAgICAgbDIwID0gbGFtYmRhIGEsICphcmdzLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyMSA9IGxhbWJkYSAqYXJncywgYiwgKiprd2RzLDogMAorICAgICAgICBsMjIgPSBsYW1iZGEgKiwgYiwgKiprd2RzLDogMAorICAgICAgICBsMjMgPSBsYW1iZGEgYSwgKmFyZ3MsIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDI0ID0gbGFtYmRhIGEsICosIGIsICoqa3dkcyw6IDAKKwogCiAgICAgIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAogICAgICMgVGVzdGVkIGJlbG93CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dycC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CmluZGV4IDI3MmIwODYuLjY5MDk1YTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CkBAIC05Miw1ICs5MiwxNSBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBncnAuZ2V0Z3JnaWQsIGZha2VnaWQpCiAKKyAgICBkZWYgdGVzdF9ub25pbnRlZ2VyX2dpZChzZWxmKToKKyAgICAgICAgZW50cmllcyA9IGdycC5nZXRncmFsbCgpCisgICAgICAgIGlmIG5vdCBlbnRyaWVzOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gZ3JvdXBzJykKKyAgICAgICAgIyBDaG9vc2UgYW4gZXhpc3RlbnQgZ2lkLgorICAgICAgICBnaWQgPSBlbnRyaWVzWzBdWzJdCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCBncnAuZ2V0Z3JnaWQsIGZsb2F0KGdpZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCBncnAuZ2V0Z3JnaWQsIHN0cihnaWQpKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5IGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQppbmRleCBiN2U4MjU5Li4yZjhjNjQ4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKQEAgLTEsNiArMSw1IEBACiAiIiJVbml0dGVzdHMgZm9yIGhlYXBxLiIiIgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9obWFjLnB5IGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CmluZGV4IDk4ODI2YjUuLjA2N2UxM2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2htYWMucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgaGFzaGxpYgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKIGRlZiBpZ25vcmVfd2FybmluZyhmdW5jKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weQppbmRleCAxMTQyMGIyLi5hN2Y1M2QzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IGh0bWwucGFyc2VyCiBpbXBvcnQgcHByaW50CiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKIGNsYXNzIEV2ZW50Q29sbGVjdG9yKGh0bWwucGFyc2VyLkhUTUxQYXJzZXIpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weSBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKaW5kZXggNzJlNmUwOC4uN2Y0YjBmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CkBAIC0xOCw2ICsxOCw3IEBACiBpbXBvcnQgaHRtbAogaW1wb3J0IGh0dHAuY2xpZW50CiBpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKIGltcG9ydCB1bml0dGVzdApAQCAtMzg4LDcgKzM4OSw3IEBACiAgICAgICAgIHF1b3RlZG5hbWUgPSB1cmxsaWIucGFyc2UucXVvdGUoZmlsZW5hbWUsIGVycm9ycz0nc3Vycm9nYXRlcGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdocmVmPSIlcyInICUgcXVvdGVkbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAuZW5jb2RlKGVuYywgJ3N1cnJvZ2F0ZWVzY2FwZScpLCBib2R5KQotICAgICAgICBzZWxmLmFzc2VydEluKCgnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lLCBxdW90ZT1GYWxzZSkpCiAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShlbmMsICdzdXJyb2dhdGVlc2NhcGUnKSwgYm9keSkKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi5iYXNlX3VybCArICcvJyArIHF1b3RlZG5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIEhUVFBTdGF0dXMuT0ssCkBAIC00NjYsNiArNDY3LDI3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UuZ2V0aGVhZGVyKCJMb2NhdGlvbiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVtcGRpcl9uYW1lICsgIi8/aGk9MSIpCiAKKyAgICBkZWYgdGVzdF9odG1sX2VzY2FwZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSAnPHRlc3QmPi50eHQnCisgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgZmlsZW5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3BlbihmdWxscGF0aCwgJ3cnKS5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ0NhbiBub3QgY3JlYXRlIGZpbGUgJXMgb24gY3VycmVudCBmaWxlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW0nICUgZmlsZW5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi5iYXNlX3VybCArICcvJykKKyAgICAgICAgICAgIGJvZHkgPSBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LKQorICAgICAgICAgICAgZW5jID0gcmVzcG9uc2UuaGVhZGVycy5nZXRfY29udGVudF9jaGFyc2V0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhmdWxscGF0aCkgICMgYXZvaWQgYWZmZWN0aW5nIHRlc3RfdW5kZWNvZGFibGVfZmlsZW5hbWUKKworICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShlbmMpCisgICAgICAgIGh0bWxfdGV4dCA9ICc+JXM8JyAlIGh0bWwuZXNjYXBlKGZpbGVuYW1lLCBxdW90ZT1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihodG1sX3RleHQuZW5jb2RlKGVuYyksIGJvZHkpCisKIAogY2dpX2ZpbGUxID0gIiIiXAogIyElcwpAQCAtOTE2LDcgKzkzOCw3IEBACiAgICAgICAgICMgSXNzdWUgIzY3OTE6IHNhbWUgZm9yIGhlYWRlcnMKICAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgKICAgICAgICAgICAgIGInR0VUIC8gSFRUUC8xLjFcclxuWC1Gb286IGJhcicgKyBiJ3InICogNjU1MzcgKyBiJ1xyXG5cclxuJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDAwIExpbmUgdG9vIGxvbmdcclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIGInSFRUUC8xLjEgNDMxIExpbmUgdG9vIGxvbmdcclxuJykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMScpCiAKQEAgLTkyNyw2ICs5NDksMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIucmVxdWVzdGxpbmUsICdHRVQgLyBIVFRQLzEuMScpCiAKKyAgICBkZWYgdGVzdF9odG1sX2VzY2FwZV9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgKKyAgICAgICAgICAgIGInPHNjcmlwdD5hbGVydCgiaGVsbG8iKTwvc2NyaXB0PiAvIEhUVFAvMS4xJykKKyAgICAgICAgcmVzdWx0ID0gYicnLmpvaW4ocmVzdWx0KQorICAgICAgICB0ZXh0ID0gJzxzY3JpcHQ+YWxlcnQoImhlbGxvIik8L3NjcmlwdD4nCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaHRtbC5lc2NhcGUodGV4dCwgcXVvdGU9RmFsc2UpLmVuY29kZSgnYXNjaWknKSwgcmVzdWx0KQorCiAgICAgZGVmIHRlc3RfY2xvc2VfY29ubmVjdGlvbihzZWxmKToKICAgICAgICAgIyBoYW5kbGVfb25lX3JlcXVlc3QoKSBzaG91bGQgYmUgcmVwZWF0ZWRseSBjYWxsZWQgdW50aWwKICAgICAgICAgIyBpdCBzZXRzIGNsb3NlX2Nvbm5lY3Rpb24KQEAgLTk0Miw2ICs5NzEsMTkgQEAKICAgICAgICAgc2VsZi5oYW5kbGVyLmhhbmRsZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGNsb3NlX3ZhbHVlcykKIAorICAgIGRlZiB0ZXN0X2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgICMgdGhpcyBpcyB0aGUgb2xkIGNvZGUgdGhhdCBmb3JtYXRzIHRoZSB0aW1lc3RhbXAKKyAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZShub3cpCisgICAgICAgIGV4cGVjdGVkID0gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlci53ZWVrZGF5bmFtZVt3ZF0sCisgICAgICAgICAgICBkYXksCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIubW9udGhuYW1lW21vbnRoXSwKKyAgICAgICAgICAgIHllYXIsIGhoLCBtbSwgc3MKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaGFuZGxlci5kYXRlX3RpbWVfc3RyaW5nKHRpbWVzdGFtcD1ub3cpLCBleHBlY3RlZCkKKworCiBjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiIFRlc3QgdXJsIHBhcnNpbmcgIiIiCiAgICAgZGVmIHNldFVwKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pZGxlLnB5IGIvTGliL3Rlc3QvdGVzdF9pZGxlLnB5CmluZGV4IDE0MWU4OWUuLmFkODhlMjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaWRsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2lkbGUucHkKQEAgLTEsMTYgKzEsMjEgQEAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgaW1wb3J0X21vZHVsZQogCi0jIFNraXAgdGVzdCBpZiBfdGhyZWFkIG9yIF90a2ludGVyIHdhc24ndCBidWlsdCBvciBpZGxlbGliIHdhcyBkZWxldGVkLgorIyBTa2lwIHRlc3QgaWYgX3RocmVhZCBvciBfdGtpbnRlciB3YXNuJ3QgYnVpbHQsIG9yIGlkbGVsaWIgaXMgbWlzc2luZywKKyMgb3IgaWYgdGNsL3RrIHZlcnNpb24gYmVmb3JlIDguNSwgd2hpY2ggaXMgbmVlZGVkIGZvciB0dGsgd2lkZ2V0cy4KKwogaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykgICMgaW1wb3J0ZWQgYnkgUHlTaGVsbCwgaW1wb3J0cyBfdGhyZWFkCiB0ayA9IGltcG9ydF9tb2R1bGUoJ3RraW50ZXInKSAgIyBpbXBvcnRzIF90a2ludGVyCi1pZGxldGVzdCA9IGltcG9ydF9tb2R1bGUoJ2lkbGVsaWIuaWRsZV90ZXN0JykKK2lmIHRrLlRrVmVyc2lvbiA8IDguNToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiSURMRSByZXF1aXJlcyB0ayA4LjUgb3IgbGF0ZXIuIikKK3RrLk5vRGVmYXVsdFJvb3QoKQoraWRsZWxpYiA9IGltcG9ydF9tb2R1bGUoJ2lkbGVsaWInKQoraWRsZWxpYi50ZXN0aW5nID0gVHJ1ZSAgIyBBdm9pZCBsb2NhbGUtY2hhbmdlZCB0ZXN0IGVycm9yCiAKLSMgV2l0aG91dCB0ZXN0X21haW4gcHJlc2VudCwgcmVncnRlc3QucnVudGVzdF9pbm5lciAobGluZTEyMTkpIGNhbGxzCi0jIHVuaXR0ZXN0LlRlc3RMb2FkZXIoKS5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoaXNfbW9kdWxlKSB3aGljaCBjYWxscwotIyBsb2FkX3Rlc3RzKCkgaWYgaXQgZmluZHMgaXQuIChVbml0dGVzdC5tYWluIGRvZXMgdGhlIHNhbWUuKQotbG9hZF90ZXN0cyA9IGlkbGV0ZXN0LmxvYWRfdGVzdHMKKyMgV2l0aG91dCB0ZXN0X21haW4gcHJlc2VudCwgdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0LnJ1bnRlc3RfaW5uZXIKKyMgY2FsbHMgKGxpbmUgMTczKSB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZShtb2R1bGUpCisjIHdoaWNoIGNhbGxzIGxvYWRfdGVzdHMoKSBpZiBpdCBmaW5kcyBpdC4gKFVuaXR0ZXN0Lm1haW4gZG9lcyB0aGUgc2FtZS4pCitmcm9tIGlkbGVsaWIuaWRsZV90ZXN0IGltcG9ydCBsb2FkX3Rlc3RzCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQppbmRleCAwNzE1N2Y1Li44ZTQ5OTBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CkBAIC0yNDMsNiArMjQzLDU1IEBACiAgICAgICAgICAgICBjbGllbnQuc2h1dGRvd24oKQogCiAgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X2JyYWNrZXRfZmxhZ3Moc2VsZik6CisKKyAgICAgICAgIyBUaGlzIHZpb2xhdGVzIFJGQyAzNTAxLCB3aGljaCBkaXNhbGxvd3MgJ10nIGNoYXJhY3RlcnMgaW4gdGFnIG5hbWVzLAorICAgICAgICAjIGJ1dCBpbWFwbGliIGhhcyBhbGxvd2VkIHByb2R1Y2luZyBzdWNoIHRhZ3MgZm9yZXZlciwgb3RoZXIgcHJvZ3JhbXMKKyAgICAgICAgIyBhbHNvIHByb2R1Y2UgdGhlbSAoZWc6IE90aGVySW5ib3gncyBPcmdhbml6ZXIgYXBwIGFzIG9mIDIwMTQwNzE2KSwKKyAgICAgICAgIyBhbmQgR21haWwsIGZvciBleGFtcGxlLCBhY2NlcHRzIHRoZW0gYW5kIHByb2R1Y2VzIHRoZW0uICBTbyB3ZQorICAgICAgICAjIHN1cHBvcnQgdGhlbS4gIFNlZSBpc3N1ZSAjMjE4MTUuCisKKyAgICAgICAgY2xhc3MgQnJhY2tldEZsYWdIYW5kbGVyKFNpbXBsZUlNQVBIYW5kbGVyKToKKworICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWdzID0gWydBbnN3ZXJlZCcsICdGbGFnZ2VkJywgJ0RlbGV0ZWQnLCAnU2VlbicsICdEcmFmdCddCisgICAgICAgICAgICAgICAgc3VwZXIoKS5oYW5kbGUoKQorCisgICAgICAgICAgICBkZWYgY21kX0FVVEhFTlRJQ0FURShzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGV4dGxpbmUoJysnKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnJlc3BvbnNlID0geWllbGQKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RhZ2dlZCh0YWcsICdPSycsICdGQUtFQVVUSCBzdWNjZXNzZnVsJykKKworICAgICAgICAgICAgZGVmIGNtZF9TRUxFQ1Qoc2VsZiwgdGFnLCBhcmdzKToKKyAgICAgICAgICAgICAgICBmbGFnX21zZyA9ICcgXFwnLmpvaW4oc2VsZi5mbGFncykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoKCcqIEZMQUdTICglcyknICUgZmxhZ19tc2cpLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoYicqIDIgRVhJU1RTJykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUoYicqIDAgUkVDRU5UJykKKyAgICAgICAgICAgICAgICBtc2cgPSAoJyogT0sgW1BFUk1BTkVOVEZMQUdTICVzIFxcKildIEZsYWdzIHBlcm1pdHRlZC4nCisgICAgICAgICAgICAgICAgICAgICAgICAlIGZsYWdfbXNnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShtc2cuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGFnZ2VkKHRhZywgJ09LJywgJ1tSRUFELVdSSVRFXSBTRUxFQ1QgY29tcGxldGVkLicpCisKKyAgICAgICAgICAgIGRlZiBjbWRfU1RPUkUoc2VsZiwgdGFnLCBhcmdzKToKKyAgICAgICAgICAgICAgICBuZXdfZmxhZ3MgPSBhcmdzWzJdLnN0cmlwKCcoJykuc3RyaXAoJyknKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgc2VsZi5mbGFncy5leHRlbmQobmV3X2ZsYWdzKQorICAgICAgICAgICAgICAgIGZsYWdzX21zZyA9ICcoRkxBR1MgKCVzKSknICUgJyBcXCcuam9pbihzZWxmLmZsYWdzKQorICAgICAgICAgICAgICAgIG1zZyA9ICcqICVzIEZFVENIICVzJyAlIChhcmdzWzBdLCBmbGFnc19tc2cpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKG1zZy5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90YWdnZWQodGFnLCAnT0snLCAnU1RPUkUgY29tcGxldGVkLicpCisKKyAgICAgICAgd2l0aCBzZWxmLnJlYXBlZF9wYWlyKEJyYWNrZXRGbGFnSGFuZGxlcikgYXMgKHNlcnZlciwgY2xpZW50KToKKyAgICAgICAgICAgIGNvZGUsIGRhdGEgPSBjbGllbnQuYXV0aGVudGljYXRlKCdNWUFVVEgnLCBsYW1iZGEgeDogYidmYWtlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZSwgJ09LJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnJlc3BvbnNlLCBiJ1ptRnJaUT09XHJcbicpCisgICAgICAgICAgICBjbGllbnQuc2VsZWN0KCd0ZXN0JykKKyAgICAgICAgICAgIHR5cCwgW2RhdGFdID0gY2xpZW50LnN0b3JlKGInMScsICIrRkxBR1MiLCAiW3Rlc3RdIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidbdGVzdF0nLCBkYXRhKQorICAgICAgICAgICAgY2xpZW50LnNlbGVjdCgndGVzdCcpCisgICAgICAgICAgICB0eXAsIFtkYXRhXSA9IGNsaWVudC5yZXNwb25zZSgnUEVSTUFORU5URkxBR1MnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1t0ZXN0XScsIGRhdGEpCisKKyAgICBAcmVhcF90aHJlYWRzCiAgICAgZGVmIHRlc3RfaXNzdWU1OTQ5KHNlbGYpOgogCiAgICAgICAgIGNsYXNzIEVPRkhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKaW5kZXggZWU5ZWUxYS4uNGVjZTM2NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXAucHkKQEAgLTYsMTMgKzYsMTIgQEAKIGltcG9ydCBpbXBvcnRsaWIudXRpbAogaW1wb3J0IG9zCiBpbXBvcnQgb3MucGF0aAotaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKICAgICBpbXBvcnQgaW1wCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKaW5kZXggNzA2YzNlNC4uYjc0ZTkwMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CkBAIC0xLDUgKzEsNCBAQAogZnJvbSBpbXBvcnRsaWIgaW1wb3J0IF9ib290c3RyYXBfZXh0ZXJuYWwKLWltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTgsOCArNyw2IEBACiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCiAKLSMgWFhYIGZpbmRfc3BlYyB0ZXN0cwotCiBAdW5pdHRlc3Quc2tpcElmKHV0aWwuRVhURU5TSU9OUy5maWxlbmFtZSBpcyBOb25lLCAnX3Rlc3RjYXBpIG5vdCBhdmFpbGFibGUnKQogQHV0aWwuY2FzZV9pbnNlbnNpdGl2ZV90ZXN0cwogY2xhc3MgRXh0ZW5zaW9uTW9kdWxlQ2FzZVNlbnNpdGl2aXR5VGVzdDoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weQppbmRleCA3MWJmNjdmLi5jOWI0YTM3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfZmluZGVyLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIAotIyBYWFggZmluZF9zcGVjIHRlc3RzCiAKIGNsYXNzIEZpbmRlclRlc3RzKGFiYy5GaW5kZXJUZXN0cyk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weQppbmRleCA4ZjRiOGJiLi5hNGI1YTY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfcGF0aF9ob29rLnB5CkBAIC0yLDggKzIsNiBAQAogCiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCi1pbXBvcnQgY29sbGVjdGlvbnMKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weQppbmRleCA2MDNjN2Q3Li4yOWVjZmYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZnJvemVuL3Rlc3RfbG9hZGVyLnB5CkBAIC0zLDggKzMsNiBAQAogCiBtYWNoaW5lcnkgPSB1dGlsLmltcG9ydF9pbXBvcnRsaWIoJ2ltcG9ydGxpYi5tYWNoaW5lcnknKQogCi0KLWltcG9ydCBzeXMKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQKIGltcG9ydCB0eXBlcwogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkKaW5kZXggYzdkM2EyYS4uN2Y2NDU0OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weQpAQCAtNSw2ICs1LDcgQEAKIAogIiIiCiBpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncwogZnJvbSAuLiBpbXBvcnQgdXRpbAogCiAKQEAgLTMzLDMxICszNCw1MCBAQAogCiAgICAgIiIiCiAKLSAgICBkZWYgdGVzdF91c2luZ19fX3BhY2thZ2VfXyhzZWxmKToKLSAgICAgICAgIyBbX19wYWNrYWdlX19dCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgZ2xvYmFsc18pOgogICAgICAgICB3aXRoIHNlbGYubW9ja19tb2R1bGVzKCdwa2cuX19pbml0X18nLCAncGtnLmZha2UnKSBhcyBpbXBvcnRlcjoKICAgICAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUobWV0YV9wYXRoPVtpbXBvcnRlcl0pOgogICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygncGtnLmZha2UnKQogICAgICAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuX19pbXBvcnRfXygnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscz17J19fcGFja2FnZV9fJzogJ3BrZy5mYWtlJ30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21saXN0PVsnYXR0ciddLCBsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPWdsb2JhbHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIG1vZHVsZQorCisgICAgZGVmIHRlc3RfdXNpbmdfX19wYWNrYWdlX18oc2VsZik6CisgICAgICAgICMgW19fcGFja2FnZV9fXQorICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZSd9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCiAKLSAgICBkZWYgdGVzdF91c2luZ19fX25hbWVfXyhzZWxmLCBwYWNrYWdlX2FzX05vbmU9RmFsc2UpOgorICAgIGRlZiB0ZXN0X3VzaW5nX19fbmFtZV9fKHNlbGYpOgogICAgICAgICAjIFtfX25hbWVfX10KLSAgICAgICAgZ2xvYmFsc18gPSB7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW119Ci0gICAgICAgIGlmIHBhY2thZ2VfYXNfTm9uZToKLSAgICAgICAgICAgIGdsb2JhbHNfWydfX3BhY2thZ2VfXyddID0gTm9uZQotICAgICAgICB3aXRoIHNlbGYubW9ja19tb2R1bGVzKCdwa2cuX19pbml0X18nLCAncGtnLmZha2UnKSBhcyBpbXBvcnRlcjoKLSAgICAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUobWV0YV9wYXRoPVtpbXBvcnRlcl0pOgotICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygncGtnLmZha2UnKQotICAgICAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuX19pbXBvcnRfXygnJywgZ2xvYmFscz0gZ2xvYmFsc18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19uYW1lX18nOiAncGtnLmZha2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYXRoX18nOiBbXX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3dhcm5fd2hlbl91c2luZ19fX25hbWVfXyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKEltcG9ydFdhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19uYW1lX18nOiAncGtnLmZha2UnLCAnX19wYXRoX18nOiBbXX0pCiAKICAgICBkZWYgdGVzdF9Ob25lX2FzX19fcGFja2FnZV9fKHNlbGYpOgogICAgICAgICAjIFtOb25lXQotICAgICAgICBzZWxmLnRlc3RfdXNpbmdfX19uYW1lX18ocGFja2FnZV9hc19Ob25lPVRydWUpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7CisgICAgICAgICAgICAgICAgJ19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW10sICdfX3BhY2thZ2VfXyc6IE5vbmUgfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorCisgICAgZGVmIHRlc3Rfc3BlY19mYWxsYmFjayhzZWxmKToKKyAgICAgICAgIyBJZiBfX3BhY2thZ2VfXyBpc24ndCBkZWZpbmVkLCBmYWxsIGJhY2sgb24gX19zcGVjX18ucGFyZW50LgorICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3NwZWNfXyc6IEZha2VTcGVjKCdwa2cuZmFrZScpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQorCisgICAgZGVmIHRlc3Rfd2Fybl93aGVuX3BhY2thZ2VfYW5kX3NwZWNfZGlzYWdyZWUoc2VsZik6CisgICAgICAgICMgUmFpc2UgYW4gSW1wb3J0V2FybmluZyBpZiBfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhJbXBvcnRXYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0X21vZHVsZSh7J19fcGFja2FnZV9fJzogJ3BrZy5mYWtlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fc3BlY19fJzogRmFrZVNwZWMoJ3BrZy5mYWtlZmFrZScpfSkKIAogICAgIGRlZiB0ZXN0X2JhZF9fcGFja2FnZV9fKHNlbGYpOgogICAgICAgICBnbG9iYWxzID0geydfX3BhY2thZ2VfXyc6ICc8bm90IHJlYWw+J30KQEAgLTcwLDYgKzkwLDExIEBACiAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJycsIGdsb2JhbHMsIHt9LCBbJ3JlbGltcG9ydCddLCAxKQogCiAKK2NsYXNzIEZha2VTcGVjOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorCisKIGNsYXNzIFVzaW5nX19wYWNrYWdlX19QRVAzMDIoVXNpbmdfX3BhY2thZ2VfXyk6CiAgICAgbW9ja19tb2R1bGVzID0gdXRpbC5tb2NrX21vZHVsZXMKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5CmluZGV4IDM3NTViODQuLjI0Mzk2MDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYWNrYWdlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkKQEAgLTEsNyArMSw2IEBACiBmcm9tIC4uIGltcG9ydCB1dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpbXBvcnRsaWIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKaW5kZXggYjMyYTg3Ni4uN2FhMjZiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKQEAgLTE2LDExICsxNiwxNCBAQAogCiAgICAgIiIiVGVzdHMgZm9yIFBhdGhGaW5kZXIuIiIiCiAKKyAgICBmaW5kID0gTm9uZQorICAgIGNoZWNrX2ZvdW5kID0gTm9uZQorCiAgICAgZGVmIHRlc3RfZmFpbHVyZShzZWxmKToKICAgICAgICAgIyBUZXN0IE5vbmUgcmV0dXJuZWQgdXBvbiBub3QgZmluZGluZyBhIHN1aXRhYmxlIGxvYWRlci4KICAgICAgICAgbW9kdWxlID0gJzx0ZXN0IG1vZHVsZT4nCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZChtb2R1bGUpKQogCiAgICAgZGVmIHRlc3Rfc3lzX3BhdGgoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IHN5cy5wYXRoIGlzIHVzZWQgd2hlbiAncGF0aCcgaXMgTm9uZS4KQEAgLTMwLDggKzMzLDggQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9W3BhdGhdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsb2FkZXIsIGltcG9ydGVyKQorICAgICAgICAgICAgZm91bmQgPSBzZWxmLmZpbmQobW9kdWxlKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAKICAgICBkZWYgdGVzdF9wYXRoKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCAncGF0aCcgaXMgdXNlZCB3aGVuIHNldC4KQEAgLTQwLDggKzQzLDggQEAKICAgICAgICAgcGF0aCA9ICc8dGVzdCBwYXRoPicKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9KToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlLCBbcGF0aF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUsIFtwYXRoXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfbGlzdChzZWxmKToKICAgICAgICAgIyBBbiBlbXB0eSBsaXN0IHNob3VsZCBub3QgY291bnQgYXMgYXNraW5nIGZvciBzeXMucGF0aC4KQEAgLTUwLDcgKzUzLDcgQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9W3BhdGhdKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoJ21vZHVsZScsIFtdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZCgnbW9kdWxlJywgW10pKQogCiAgICAgZGVmIHRlc3RfcGF0aF9ob29rcyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgc3lzLnBhdGhfaG9va3MgaXMgdXNlZC4KQEAgLTYwLDggKzYzLDggQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIGhvb2sgPSB1dGlsLm1vY2tfcGF0aF9ob29rKHBhdGgsIGltcG9ydGVyPWltcG9ydGVyKQogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGhfaG9va3M9W2hvb2tdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlLCBbcGF0aF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUsIFtwYXRoXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihwYXRoLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF0sIGltcG9ydGVyKQogCkBAIC03Myw3ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF9lbnRyeV0pOgogICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnb3MnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmZpbmQoJ29zJykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF9lbnRyeV0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Mod1stMV0uY2F0ZWdvcnksIEltcG9ydFdhcm5pbmcpKQpAQCAtODUsOCArODgsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgaG9vayA9IHV0aWwubW9ja19wYXRoX2hvb2sob3MuZ2V0Y3dkKCksIGltcG9ydGVyPWltcG9ydGVyKQogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W3BhdGhdLCBwYXRoX2hvb2tzPVtob29rXSk6Ci0gICAgICAgICAgICBsb2FkZXIgPSBzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfbW9kdWxlKG1vZHVsZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvcy5nZXRjd2QoKSwgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUpCiAKICAgICBkZWYgdGVzdF9Ob25lX29uX3N5c19wYXRoKHNlbGYpOgpAQCAtMTgyLDE1ICsxODUsNTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCd3aGF0ZXZlcicpKQogCiAKK2NsYXNzIEZpbmRNb2R1bGVUZXN0cyhGaW5kZXJUZXN0cyk6CisgICAgZGVmIGZpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjaGVja19mb3VuZChzZWxmLCBmb3VuZCwgaW1wb3J0ZXIpOgorICAgICAgICBzZWxmLmFzc2VydElzKGZvdW5kLCBpbXBvcnRlcikKIAogCi0oRnJvemVuX0ZpbmRlclRlc3RzLAotIFNvdXJjZV9GaW5kZXJUZXN0cwotICkgPSB1dGlsLnRlc3RfYm90aChGaW5kZXJUZXN0cywgaW1wb3J0bGliPWltcG9ydGxpYiwgbWFjaGluZXJ5PW1hY2hpbmVyeSkKKyhGcm96ZW5fRmluZE1vZHVsZVRlc3RzLAorIFNvdXJjZV9GaW5kTW9kdWxlVGVzdHMKKykgPSB1dGlsLnRlc3RfYm90aChGaW5kTW9kdWxlVGVzdHMsIGltcG9ydGxpYj1pbXBvcnRsaWIsIG1hY2hpbmVyeT1tYWNoaW5lcnkpCisKKworY2xhc3MgRmluZFNwZWNUZXN0cyhGaW5kZXJUZXN0cyk6CisgICAgZGVmIGZpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgY2hlY2tfZm91bmQoc2VsZiwgZm91bmQsIGltcG9ydGVyKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhmb3VuZC5sb2FkZXIsIGltcG9ydGVyKQorCisKKyhGcm96ZW5fRmluZFNwZWNUZXN0cywKKyBTb3VyY2VfRmluZFNwZWNUZXN0cworICkgPSB1dGlsLnRlc3RfYm90aChGaW5kU3BlY1Rlc3RzLCBpbXBvcnRsaWI9aW1wb3J0bGliLCBtYWNoaW5lcnk9bWFjaGluZXJ5KQogCiAKIGNsYXNzIFBhdGhFbnRyeUZpbmRlclRlc3RzOgogCisgICAgZGVmIHRlc3RfZmluZGVyX3dpdGhfZmFpbGluZ19maW5kX3NwZWMoc2VsZik6CisgICAgICAgICMgUGF0aEVudHJ5RmluZGVyIHdpdGggZmluZF9tb2R1bGUoKSBkZWZpbmVkIHNob3VsZCB3b3JrLgorICAgICAgICAjIElzc3VlICMyMDc2My4KKyAgICAgICAgY2xhc3MgRmluZGVyOgorICAgICAgICAgICAgcGF0aF9sb2NhdGlvbiA9ICd0ZXN0X2ZpbmRlcl93aXRoX2ZpbmRfbW9kdWxlJworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgICAgIGlmIHBhdGggIT0gc2VsZi5wYXRoX2xvY2F0aW9uOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZmluZF9tb2R1bGUoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKworICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W0ZpbmRlci5wYXRoX2xvY2F0aW9uXStzeXMucGF0aFs6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzPVtGaW5kZXJdKToKKyAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCdpbXBvcnRsaWInKQorCiAgICAgZGVmIHRlc3RfZmluZGVyX3dpdGhfZmFpbGluZ19maW5kX21vZHVsZShzZWxmKToKICAgICAgICAgIyBQYXRoRW50cnlGaW5kZXIgd2l0aCBmaW5kX21vZHVsZSgpIGRlZmluZWQgc2hvdWxkIHdvcmsuCiAgICAgICAgICMgSXNzdWUgIzIwNzYzLgpAQCAtMjA3LDcgKzI0NSw3IEBACiAKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoPVtGaW5kZXIucGF0aF9sb2NhdGlvbl0rc3lzLnBhdGhbOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcz1bRmluZGVyXSk6Ci0gICAgICAgICAgICBzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfc3BlYygnaW1wb3J0bGliJykKKyAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoJ2ltcG9ydGxpYicpCiAKIAogKEZyb3plbl9QRUZUZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9yZWxhdGl2ZV9pbXBvcnRzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKaW5kZXggM2JiODE5Zi4uOGE5NWEzMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKQEAgLTEsNyArMSw4IEBACiAiIiJUZXN0IHJlbGF0aXZlIGltcG9ydHMgKFBFUCAzMjgpLiIiIgogZnJvbSAuLiBpbXBvcnQgdXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKwogCiBjbGFzcyBSZWxhdGl2ZUltcG9ydHM6CiAKQEAgLTY1LDkgKzY2LDExIEBACiAgICAgICAgICAgICAgICAgdW5jYWNoZV9uYW1lcy5hcHBlbmQobmFtZVs6LWxlbignLl9faW5pdF9fJyldKQogICAgICAgICB3aXRoIHV0aWwubW9ja19zcGVjKCpjcmVhdGUpIGFzIGltcG9ydGVyOgogICAgICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W2ltcG9ydGVyXSk6Ci0gICAgICAgICAgICAgICAgZm9yIGdsb2JhbF8gaW4gZ2xvYmFsc186Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggdXRpbC51bmNhY2hlKCp1bmNhY2hlX25hbWVzKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCisgICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgIGZvciBnbG9iYWxfIGluIGdsb2JhbHNfOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1dGlsLnVuY2FjaGUoKnVuY2FjaGVfbmFtZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCiAKIAogICAgIGRlZiB0ZXN0X21vZHVsZV9mcm9tX21vZHVsZShzZWxmKToKQEAgLTIwNCwxMSArMjA3LDE4IEBACiAKICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRfbm9fZ2xvYmFscyhzZWxmKToKICAgICAgICAgIyBObyBnbG9iYWxzIGZvciBhIHJlbGF0aXZlIGltcG9ydCBpcyBhbiBlcnJvci4KLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3N5cycsIGxldmVsPTEpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnc3lzJywgbGV2ZWw9MSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnYScsIHsnX19wYWNrYWdlX18nOiAnJywgJ19fc3BlY19fJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSkKIAogICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlX2V4aXN0c19hYnNvbHV0ZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvcik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdzeXMnLCB7J19fcGFja2FnZV9fJzogJycsICdfX3NwZWNfXyc6IE5vbmV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPTEpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmUxMWYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0iIiJSdW4gUHl0aG9uJ3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZSB1c2luZyBpbXBvcnRsaWIuX19pbXBvcnRfXy4KLQotVGVzdHMga25vd24gdG8gZmFpbCBiZWNhdXNlIG9mIGFzc3VtcHRpb25zIHRoYXQgaW1wb3J0bGliIChwcm9wZXJseSkKLWludmFsaWRhdGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNraXBwZWQgaWYgdGhlIGVudGlyZSB0ZXN0IHN1aXRlIGlzIHJ1bi4KLU90aGVyd2lzZSBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMgdmFsaWQgZm9yIHRlc3QucmVncnRlc3QgYXJlIGFsc28gdmFsaWQgZm9yCi10aGlzIHNjcmlwdC4KLQotIiIiCi1pbXBvcnQgaW1wb3J0bGliCi1pbXBvcnQgc3lzCi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgX19idWlsdGluc19fLl9faW1wb3J0X18gPSBpbXBvcnRsaWIuX19pbXBvcnRfXwotICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKLQotICAgIHJlZ3J0ZXN0Lm1haW4ocXVpZXQ9VHJ1ZSwgdmVyYm9zZTI9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CmluZGV4IGMyNzRiMzguLjBkNmMzODggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQpAQCAtNSw3ICs1LDYgQEAKIG1hY2hpbmVyeSA9IHV0aWwuaW1wb3J0X2ltcG9ydGxpYignaW1wb3J0bGliLm1hY2hpbmVyeScpCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0IGFzIHRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2ZpbGVfbG9hZGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKaW5kZXggNzNmNGM2Mi4uYTE1MTE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICAgICAgIyBQRVAgMzAyCiAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICAgICAgbW9kID0gbG9hZGVyLmxvYWRfbW9kdWxlKCdfdGVtcCcpICMgWFhYCisgICAgICAgICAgICAgICAgbW9kID0gbG9hZGVyLmxvYWRfbW9kdWxlKCdfdGVtcCcpCiAgICAgICAgICAgICAjIFNhbml0eSBjaGVja3MuCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5fX2NhY2hlZF9fLCBjb21waWxlZCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLngsIDUpCkBAIC0yNDUsMTIgKzI0NSw3IEBACiBjbGFzcyBCYWRCeXRlY29kZVRlc3Q6CiAKICAgICBkZWYgaW1wb3J0XyhzZWxmLCBmaWxlLCBtb2R1bGVfbmFtZSk6Ci0gICAgICAgIGxvYWRlciA9IHNlbGYubG9hZGVyKG1vZHVsZV9uYW1lLCBmaWxlKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICMgWFhYIENoYW5nZSB0byB1c2UgZXhlY19tb2R1bGUoKS4KLSAgICAgICAgICAgIG1vZHVsZSA9IGxvYWRlci5sb2FkX21vZHVsZShtb2R1bGVfbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGVfbmFtZSwgc3lzLm1vZHVsZXMpCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKIAogICAgIGRlZiBtYW5pcHVsYXRlX2J5dGVjb2RlKHNlbGYsIG5hbWUsIG1hcHBpbmcsIG1hbmlwdWxhdG9yLCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9zb3VyY2U9RmFsc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5CmluZGV4IGU2YTI0MTUuLjc5NWQ0MzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3BhdGhfaG9vay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkKQEAgLTE2LDEwICsxNiwxOSBAQAogICAgIGRlZiB0ZXN0X3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIHdpdGggdXRpbC5jcmVhdGVfbW9kdWxlcygnZHVtbXknKSBhcyBtYXBwaW5nOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKShtYXBwaW5nWycucm9vdCddKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5kX21vZHVsZScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfc3BlYycpKQorCisgICAgZGVmIHRlc3Rfc3VjY2Vzc19sZWdhY3koc2VsZik6CisgICAgICAgIHdpdGggdXRpbC5jcmVhdGVfbW9kdWxlcygnZHVtbXknKSBhcyBtYXBwaW5nOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKShtYXBwaW5nWycucm9vdCddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5kX21vZHVsZScpKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIFRoZSBlbXB0eSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgY3dkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKCcnKSwgJ2ZpbmRfc3BlYycpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nX2xlZ2FjeShzZWxmKToKKyAgICAgICAgIyBUaGUgZW1wdHkgc3RyaW5nIHJlcHJlc2VudHMgdGhlIGN3ZC4KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKSgnJyksICdmaW5kX21vZHVsZScpKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weQppbmRleCAxZTA3NzFiLi45ODA4NTVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9zb3VyY2VfZW5jb2RpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5CkBAIC01LDcgKzUsNiBAQAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgcmUKLWltcG9ydCBzeXMKIGltcG9ydCB0eXBlcwogIyBCZWNhdXNlIHN5cy5wYXRoIGdldHMgZXNzZW50aWFsbHkgYmxhbmtlZCwgbmVlZCB0byBoYXZlIHVuaWNvZGVkYXRhIGFscmVhZHkKICMgaW1wb3J0ZWQgZm9yIHRoZSBwYXJzZXIgdG8gdXNlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hYmMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQppbmRleCBkNGJmOTE1Li5jODYyNDgwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQpAQCAtMjA3LDYgKzIwNywxMCBAQAogCiAgICAgU1BMSVQgPSBtYWtlX2FiY19zdWJjbGFzc2VzKExvYWRlcikKIAorICAgIGRlZiB0ZXN0X2NyZWF0ZV9tb2R1bGUoc2VsZik6CisgICAgICAgIHNwZWMgPSAnYSBzcGVjJworICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmlucy5jcmVhdGVfbW9kdWxlKHNwZWMpKQorCiAgICAgZGVmIHRlc3RfbG9hZF9tb2R1bGUoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgc2VsZi5pbnMubG9hZF9tb2R1bGUoJ3NvbWV0aGluZycpCkBAIC01MTksNiArNTIzLDEyIEBACiAgICAgICAgIHN1cHBvcnQudW5sb2FkKHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubG9hZCwgc2VsZi5tb2R1bGVfbmFtZSkKIAorICAgIGRlZiBsb2FkKHNlbGYsIGxvYWRlcik6CisgICAgICAgIHNwZWMgPSBzZWxmLnV0aWwuc3BlY19mcm9tX2xvYWRlcihzZWxmLm1vZHVsZV9uYW1lLCBsb2FkZXIpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5pdC5fYm9vdHN0cmFwLl9sb2FkX3VubG9ja2VkKHNwZWMpCisKICAgICBkZWYgbW9ja19nZXRfY29kZShzZWxmKToKICAgICAgICAgcmV0dXJuIG1vY2sucGF0Y2gub2JqZWN0KHNlbGYuSW5zcGVjdExvYWRlclN1YmNsYXNzLCAnZ2V0X2NvZGUnKQogCkBAIC01MjgsOSArNTM4LDcgQEAKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5zaWRlX2VmZmVjdCA9IEltcG9ydEVycm9yCiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKICAgICAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sb2FkKGxvYWRlcikKIAogICAgIGRlZiB0ZXN0X2dldF9jb2RlX05vbmUoc2VsZik6CiAgICAgICAgICMgSWYgZ2V0X2NvZGUoKSByZXR1cm5zIE5vbmUsIHJhaXNlIEltcG9ydEVycm9yLgpAQCAtNTM4LDcgKzU0Niw3IEBACiAgICAgICAgICAgICBtb2NrZWRfZ2V0X2NvZGUucmV0dXJuX3ZhbHVlID0gTm9uZQogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MoKQotICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYubG9hZChsb2FkZXIpCiAKICAgICBkZWYgdGVzdF9tb2R1bGVfcmV0dXJuZWQoc2VsZik6CiAgICAgICAgICMgVGhlIGxvYWRlZCBtb2R1bGUgc2hvdWxkIGJlIHJldHVybmVkLgpAQCAtNTQ2LDE0ICs1NTQsMTYgQEAKICAgICAgICAgd2l0aCBzZWxmLm1vY2tfZ2V0X2NvZGUoKSBhcyBtb2NrZWRfZ2V0X2NvZGU6CiAgICAgICAgICAgICBtb2NrZWRfZ2V0X2NvZGUucmV0dXJuX3ZhbHVlID0gY29kZQogICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MoKQotICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmxvYWQobG9hZGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUsIHN5cy5tb2R1bGVzW3NlbGYubW9kdWxlX25hbWVdKQogCiAKIChGcm96ZW5fSUxMb2FkTW9kdWxlVGVzdHMsCiAgU291cmNlX0lMTG9hZE1vZHVsZVRlc3RzCiAgKSA9IHRlc3RfdXRpbC50ZXN0X2JvdGgoSW5zcGVjdExvYWRlckxvYWRNb2R1bGVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnNwZWN0TG9hZGVyU3ViY2xhc3M9U1BMSVRfSUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zcGVjdExvYWRlclN1YmNsYXNzPVNQTElUX0lMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ9aW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsPXV0aWwpCiAKIAogIyMjIyMgRXhlY3V0aW9uTG9hZGVyIGNvbmNyZXRlIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKaW5kZXggNmJjM2M1Ni4uYjBhOTRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKQEAgLTk5LDkgKzk5LDcgQEAKIAogY2xhc3MgRmluZExvYWRlclRlc3RzOgogCi0gICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6Ci0gICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgZGVmIGZpbmRfbW9kdWxlKG5hbWUsIHBhdGg9Tm9uZSk6IHJldHVybiBuYW1lLCBwYXRoCisgICAgRmFrZU1ldGFGaW5kZXIgPSBOb25lCiAKICAgICBkZWYgdGVzdF9zeXNfbW9kdWxlcyhzZWxmKToKICAgICAgICAgIyBJZiBhIG1vZHVsZSB3aXRoIF9fbG9hZGVyX18gaXMgaW4gc3lzLm1vZHVsZXMsIHRoZW4gcmV0dXJuIGl0LgpAQCAtMTcxLDkgKzE2OSwzMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5pbml0LmZpbmRfbG9hZGVyKCduZXZlcmdvaW5ndG9maW5kdGhpc21vZHVsZScpKQogCiAKLShGcm96ZW5fRmluZExvYWRlclRlc3RzLAotIFNvdXJjZV9GaW5kTG9hZGVyVGVzdHMKLSApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyVGVzdHMsIGluaXQ9aW5pdCkKK2NsYXNzIEZpbmRMb2FkZXJQRVA0NTFUZXN0cyhGaW5kTG9hZGVyVGVzdHMpOgorCisgICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGZpbmRfc3BlYyhuYW1lLCBwYXRoPU5vbmUsIHRhcmdldD1Ob25lKToKKyAgICAgICAgICAgIHJldHVybiBtYWNoaW5lcnlbJ1NvdXJjZSddLk1vZHVsZVNwZWMobmFtZSwgKG5hbWUsIHBhdGgpKQorCisKKyhGcm96ZW5fRmluZExvYWRlclBFUDQ1MVRlc3RzLAorIFNvdXJjZV9GaW5kTG9hZGVyUEVQNDUxVGVzdHMKKyApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyUEVQNDUxVGVzdHMsIGluaXQ9aW5pdCkKKworCitjbGFzcyBGaW5kTG9hZGVyUEVQMzAyVGVzdHMoRmluZExvYWRlclRlc3RzKToKKworICAgIGNsYXNzIEZha2VNZXRhRmluZGVyOgorICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBmaW5kX21vZHVsZShuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIG5hbWUsIHBhdGgKKworCisoRnJvemVuX0ZpbmRMb2FkZXJQRVAzMDJUZXN0cywKKyBTb3VyY2VfRmluZExvYWRlclBFUDMwMlRlc3RzCisgKSA9IHRlc3RfdXRpbC50ZXN0X2JvdGgoRmluZExvYWRlclBFUDMwMlRlc3RzLCBpbml0PWluaXQpCiAKIAogY2xhc3MgUmVsb2FkVGVzdHM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkKaW5kZXggY2MzODNjMi4uZmZkOGRjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sYXp5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weQpAQCAtNjYsNiArNjYsOCBAQAogICAgICAgICBzcGVjID0gdXRpbC5zcGVjX2Zyb21fbG9hZGVyKFRlc3RpbmdJbXBvcnRlci5tb2R1bGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLkxhenlMb2FkZXIobG9hZGVyKSkKICAgICAgICAgbW9kdWxlID0gc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZShzcGVjKQorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUoVGVzdGluZ0ltcG9ydGVyLm1vZHVsZV9uYW1lKQogICAgICAgICBtb2R1bGUuX19zcGVjX18gPSBzcGVjCiAgICAgICAgIG1vZHVsZS5fX2xvYWRlcl9fID0gc3BlYy5sb2FkZXIKICAgICAgICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbG9ja3MucHkKaW5kZXggZGYwYWYxMi4uYjJhYWRmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5CkBAIC0zLDcgKzMsNiBAQAogaW5pdCA9IHRlc3RfdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWInKQogCiBpbXBvcnQgc3lzCi1pbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2Vha3JlZgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9uYW1lc3BhY2VfcGtncy5weQppbmRleCA2NjM5NjEyLi5lMzdkOGExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkKQEAgLTEsMTMgKzEsMTAgQEAKIGltcG9ydCBjb250ZXh0bGliCi1pbXBvcnQgaW1wb3J0bGliLmFiYwotaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKK2ltcG9ydCBpbXBvcnRsaWIKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0LnRlc3RfaW1wb3J0bGliIGltcG9ydCB1dGlsCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKICMgbmVlZGVkIHRlc3RzOgogIwpAQCAtNzEsNiArNjgsNyBAQAogICAgICAgICAjIFRPRE86IHdpbGwgd2UgZXZlciB3YW50IHRvIHBhc3MgZXhjX2luZm8gdG8gX19leGl0X18/CiAgICAgICAgIHNlbGYuY3R4Ll9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCiAKKwogY2xhc3MgU2luZ2xlTmFtZXNwYWNlUGFja2FnZShOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CiAgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KIApAQCAtODcsNyArODUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZm9vKSwgIjxtb2R1bGUgJ2ZvbycgKG5hbWVzcGFjZSk+IikKIAogCi1jbGFzcyBEeW5hbWljUGF0aGVOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKK2NsYXNzIER5bmFtaWNQYXRoTmFtZXNwYWNlUGFja2FnZShOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CiAgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KIAogICAgIGRlZiB0ZXN0X2R5bmFtaWNfcGF0aChzZWxmKToKQEAgLTI4OSw1ICsyODcsMzUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhX3Rlc3QuYXR0ciwgJ2luIG1vZHVsZScpCiAKIAorY2xhc3MgUmVsb2FkVGVzdHMoTmFtZXNwYWNlUGFja2FnZVRlc3QpOgorICAgIHBhdGhzID0gWydwb3J0aW9uMSddCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcGFja2FnZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvby5vbmUKKyAgICAgICAgZm9vID0gaW1wb3J0bGliLnJlbG9hZChmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLm9uZS5hdHRyLCAncG9ydGlvbjEgZm9vIG9uZScpCisKKyAgICBkZWYgdGVzdF9jYW50X2ltcG9ydF9vdGhlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvbworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGltcG9ydCBmb28udHdvCisgICAgICAgIGZvbyA9IGltcG9ydGxpYi5yZWxvYWQoZm9vKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGltcG9ydCBmb28udHdvCisKKyAgICBkZWYgdGVzdF9keW5hbWljX3BhdGgoc2VsZik6CisgICAgICAgIGltcG9ydCBmb28ub25lCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKworICAgICAgICAjIE5vdyBtb2RpZnkgc3lzLnBhdGggYW5kIHJlbG9hZC4KKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguam9pbihzZWxmLnJvb3QsICdwb3J0aW9uMicpKQorICAgICAgICBmb28gPSBpbXBvcnRsaWIucmVsb2FkKGZvbykKKworICAgICAgICAjIEFuZCBtYWtlIHN1cmUgZm9vLnR3byBpcyBub3cgaW1wb3J0YWJsZQorICAgICAgICBpbXBvcnQgZm9vLnR3bworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby50d28uYXR0ciwgJ3BvcnRpb24yIGZvbyB0d28nKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkKaW5kZXggYzg5M2JjZi4uMDA1YjY4NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF93aW5kb3dzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weQpAQCAtNDAsNyArNDAsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHJvb3QgPSBtYWNoaW5lcnkuV2luZG93c1JlZ2lzdHJ5RmluZGVyLlJFR0lTVFJZX0tFWQogICAgIGtleSA9IHJvb3QuZm9ybWF0KGZ1bGxuYW1lPW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249c3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPSclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICB0cnk6CiAgICAgICAgIHdpdGggdGVtcF9tb2R1bGUobmFtZSwgImEgPSAxIikgYXMgbG9jYXRpb246CiAgICAgICAgICAgICBzdWJrZXkgPSBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIGtleSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCA2NzFlMDVhLi40NzI0NGFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC0zMCw2ICszMCw3IEBACiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCiBmcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyMiBhcyBtb2QyCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogZnJvbSB0ZXN0LnRlc3RfaW1wb3J0IGltcG9ydCBfcmVhZHlfdG9faW1wb3J0CiAKQEAgLTM4LDcgKzM5LDcgQEAKICMgaXNtb2R1bGUsIGlzY2xhc3MsIGlzbWV0aG9kLCBpc2Z1bmN0aW9uLCBpc3RyYWNlYmFjaywgaXNmcmFtZSwgaXNjb2RlLAogIyBpc2J1aWx0aW4sIGlzcm91dGluZSwgaXNnZW5lcmF0b3IsIGlzZ2VuZXJhdG9yZnVuY3Rpb24sIGdldG1lbWJlcnMsCiAjIGdldGRvYywgZ2V0ZmlsZSwgZ2V0bW9kdWxlLCBnZXRzb3VyY2VmaWxlLCBnZXRjb21tZW50cywgZ2V0c291cmNlLAotIyBnZXRjbGFzc3RyZWUsIGdldGFyZ3NwZWMsIGdldGFyZ3ZhbHVlcywgZm9ybWF0YXJnc3BlYywgZm9ybWF0YXJndmFsdWVzLAorIyBnZXRjbGFzc3RyZWUsIGdldGFyZ3ZhbHVlcywgZm9ybWF0YXJnc3BlYywgZm9ybWF0YXJndmFsdWVzLAogIyBjdXJyZW50ZnJhbWUsIHN0YWNrLCB0cmFjZSwgaXNkYXRhZGVzY3JpcHRvcgogCiAjIE5PVEU6IFRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdGVzdHMgcmVsYXRpbmcgdG8gaW50ZXJhY3Rpb24gd2l0aApAQCAtNDAwLDcgKzQwMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWNhc2UoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKG1vZC5zcGFtKSksIG1vZGZpbGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWNhc2UoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGdpdC5hYnVzZSkpLCBtb2RmaWxlKQogICAgICAgICBmbiA9ICJfbm9uX2V4aXN0aW5nX2ZpbGVuYW1lX3VzZWRfZm9yX3NvdXJjZWZpbGVfdGVzdC5weSIKLSAgICAgICAgY28gPSBjb21waWxlKCJOb25lIiwgZm4sICJleGVjIikKKyAgICAgICAgY28gPSBjb21waWxlKCJ4PTEiLCBmbiwgImV4ZWMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShjbyksIE5vbmUpCiAgICAgICAgIGxpbmVjYWNoZS5jYWNoZVtjby5jb19maWxlbmFtZV0gPSAoMSwgTm9uZSwgIk5vbmUiLCBjby5jb19maWxlbmFtZSkKICAgICAgICAgdHJ5OgpAQCAtMjkwMiw2ICsyOTAzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbm90IGEgdmFsaWQgcGFyYW1ldGVyIG5hbWUnKToKICAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKCckJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5WQVJfS0VZV09SRCkKIAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIgbmFtZScpOgorICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoJy5hJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5WQVJfS0VZV09SRCkKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ2Nhbm5vdCBoYXZlIGRlZmF1bHQgdmFsdWVzJyk6CiAgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignYScsIGRlZmF1bHQ9NDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlZBUl9LRVlXT1JEKQpAQCAtMjk4NSw2ICsyOTkwLDE3IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICduYW1lIG11c3QgYmUgYSBzdHInKToKICAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKE5vbmUsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQogCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpZ25hdHVyZV9wYXJhbWV0ZXJfaW1wbGljaXQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0IGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCBpbiBhcycpOgorICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoJy4wJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkpCisKKyAgICAgICAgcGFyYW0gPSBpbnNwZWN0LlBhcmFtZXRlcigKKyAgICAgICAgICAgICcuMCcsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PUl9LRVlXT1JEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLmtpbmQsIGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbS5uYW1lLCAnaW1wbGljaXQwJykKKwogICAgIGRlZiB0ZXN0X3NpZ25hdHVyZV9wYXJhbWV0ZXJfaW1tdXRhYmlsaXR5KHNlbGYpOgogICAgICAgICBwID0gaW5zcGVjdC5QYXJhbWV0ZXIoJ3NwYW0nLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLktFWVdPUkRfT05MWSkKIApAQCAtMzIzMyw2ICszMjQ5LDE3IEBACiAgICAgICAgIGJhID0gc2lnLmJpbmQoYXJncz0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhLmFyZ3VtZW50cywgeydrd2FyZ3MnOiB7J2FyZ3MnOiAxfX0pCiAKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX2JpbmRfaW1wbGljaXRfYXJnKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxOTYxMTogZ2V0Y2FsbGFyZ3Mgc2hvdWxkIHdvcmsgd2l0aCBzZXQgY29tcHJlaGVuc2lvbnMKKyAgICAgICAgZGVmIG1ha2Vfc2V0KCk6CisgICAgICAgICAgICByZXR1cm4ge3ogKiB6IGZvciB6IGluIHJhbmdlKDUpfQorICAgICAgICBzZXRjb21wX2NvZGUgPSBtYWtlX3NldC5fX2NvZGVfXy5jb19jb25zdHNbMV0KKyAgICAgICAgc2V0Y29tcF9mdW5jID0gdHlwZXMuRnVuY3Rpb25UeXBlKHNldGNvbXBfY29kZSwge30pCisKKyAgICAgICAgaXRlcmF0b3IgPSBpdGVyKHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2FsbChzZXRjb21wX2Z1bmMsIGl0ZXJhdG9yKSwgezAsIDEsIDQsIDksIDE2fSkKKwogCiBjbGFzcyBUZXN0Qm91bmRBcmd1bWVudHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3NpZ25hdHVyZV9ib3VuZF9hcmd1bWVudHNfdW5oYXNoYWJsZShzZWxmKToKQEAgLTM1NDMsMTQgKzM1NzAsMTQgQEAKIAogICAgIGRlZiB0ZXN0X2RldGFpbHMoc2VsZik6CiAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCd1bml0dGVzdCcpCi0gICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1tJywgJ2luc3BlY3QnLAorICAgICAgICBhcmdzID0gc3VwcG9ydC5vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCphcmdzLCAnLW0nLCAnaW5zcGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuaXR0ZXN0JywgJy0tZGV0YWlscycpCiAgICAgICAgIG91dHB1dCA9IG91dC5kZWNvZGUoKQogICAgICAgICAjIEp1c3QgYSBxdWljayBzYW5pdHkgY2hlY2sgb24gdGhlIG91dHB1dAogICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZS5fX25hbWVfXywgb3V0cHV0KQogICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZS5fX2ZpbGVfXywgb3V0cHV0KQotICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLm9wdGltaXplOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGUuX19jYWNoZWRfXywgb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZS5fX2NhY2hlZF9fLCBvdXRwdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pby5weSBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKaW5kZXggNTExMTg4Mi4uYzQ4ZWMzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2lvLnB5CkBAIC00OTYsNyArNDk2LDExIEBACiAgICAgZGVmIHRlc3Rfb3Blbl9oYW5kbGVzX05VTF9jaGFycyhzZWxmKToKICAgICAgICAgZm5fd2l0aF9OVUwgPSAnZm9vXDBiYXInCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgZm5fd2l0aF9OVUwsICd3JykKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBieXRlcyhmbl93aXRoX05VTCwgJ2FzY2lpJyksICd3JykKKworICAgICAgICBieXRlc19mbiA9IGJ5dGVzKGZuX3dpdGhfTlVMLCAnYXNjaWknKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYub3BlbiwgYnl0ZXNfZm4sICd3JykKIAogICAgIGRlZiB0ZXN0X3Jhd19maWxlX2lvKHNlbGYpOgogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmZmVyaW5nPTApIGFzIGY6CkBAIC04NTYsNiArODYwLDMyIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHN0cmVhbSwgbWV0aG9kKShidWZmZXIpLCA1KQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYnVmZmVyKSwgYiIxMjM0NSIpCiAKKyAgICBkZWYgdGVzdF9mc3BhdGhfc3VwcG9ydChzZWxmKToKKyAgICAgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICAgICAgZGVmIGNoZWNrX3BhdGhfc3VjY2VlZHMocGF0aCk6CisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihwYXRoLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiZWdnXG4iKQorCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihwYXRoLCAiciIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgImVnZ1xuIikKKworICAgICAgICBjaGVja19wYXRoX3N1Y2NlZWRzKFBhdGhMaWtlKHN1cHBvcnQuVEVTVEZOKSkKKyAgICAgICAgY2hlY2tfcGF0aF9zdWNjZWVkcyhQYXRoTGlrZShzdXBwb3J0LlRFU1RGTi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgICAgIGJhZF9wYXRoID0gUGF0aExpa2UoVHlwZUVycm9yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzZWxmLm9wZW4oYmFkX3BhdGgsICd3JykKKworICAgICAgICAjIGVuc3VyZSB0aGF0IHJlZmNvdW50aW5nIGlzIGNvcnJlY3Qgd2l0aCBzb21lIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdyZWFkL3dyaXRlL2FwcGVuZCBtb2RlJyk6CisgICAgICAgICAgICBzZWxmLm9wZW4oUGF0aExpa2Uoc3VwcG9ydC5URVNURk4pLCAncnd4YScpCisKIAogY2xhc3MgQ0lPVGVzdChJT1Rlc3QpOgogCkBAIC0zMjQ2LDggKzMyNzYsNyBAQAogCiBjbGFzcyBQeVRleHRJT1dyYXBwZXJUZXN0KFRleHRJT1dyYXBwZXJUZXN0KToKICAgICBpbyA9IHB5aW8KLSAgICAjc2h1dGRvd25fZXJyb3IgPSAiTG9va3VwRXJyb3I6IHVua25vd24gZW5jb2Rpbmc6IGFzY2lpIgotICAgIHNodXRkb3duX2Vycm9yID0gIlR5cGVFcnJvcjogJ05vbmVUeXBlJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIgorICAgIHNodXRkb3duX2Vycm9yID0gIkxvb2t1cEVycm9yOiB1bmtub3duIGVuY29kaW5nOiBhc2NpaSIKIAogCiBjbGFzcyBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lwYWRkcmVzcy5weSBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CmluZGV4IGJlNjJmYWQuLjZjMDhmODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5CkBAIC0xMTc2LDYgKzExNzYsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYuaXB2Nl9uZXR3b3JrWzVdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnMjAwMTo2NTg6MjJhOmNhZmU6OjUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZWxmLmlwdjZfbmV0d29yay5fX2dldGl0ZW1fXywgMSA8PCA2NCkKIAogICAgIGRlZiB0ZXN0R2V0aXRlbShzZWxmKToKICAgICAgICAgIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaXBhZGRyLXB5L2lzc3Vlcy9kZXRhaWw/aWQ9MTUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQppbmRleCAxNTJmNWZjLi40MWM5NzUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CkBAIC00Miw3ICs0Miw2IEBACiAiIiIKIAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gaXRlcnRvb2xzIGltcG9ydCByZXBlYXQKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBsZW5ndGhfaGludApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVydG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQppbmRleCBmOTQwODUyLi45NDVjNThkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB3ZWFrcmVmCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKIGZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgotaW1wb3J0IHN5cwogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgY29weQpAQCAtNjEzLDYgKzYxMiw1NiBAQAogICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKICAgICAgICAgICAgIHNlbGYucGlja2xldGVzdChwcm90bywgY3ljbGUoJ2FiYycpKQogCisgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgIyB0ZXN0IHdpdGggcGFydGlhbCBjb25zdW1lZCBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgaXQgPSBpdGVyKCdhYmNkZScpCisgICAgICAgICAgICBjID0gY3ljbGUoaXQpCisgICAgICAgICAgICBfID0gW25leHQoYykgZm9yIGkgaW4gcmFuZ2UoMildICAgICAgIyBjb25zdW1lIDIgb2YgNSBpbnB1dHMKKyAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoYywgcHJvdG8pCisgICAgICAgICAgICBkID0gcGlja2xlLmxvYWRzKHApICAgICAgICAgICAgICAgICAgIyByZWJ1aWxkIHRoZSBjeWNsZSBvYmplY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgZCksIGxpc3QoJ2NkZWFiY2RlYWJjZGVhYmNkZWFiJykpCisKKyAgICAgICAgICAgICMgdGVzdCB3aXRoIGNvbXBsZXRlbHkgY29uc3VtZWQgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgIGl0ID0gaXRlcignYWJjZGUnKQorICAgICAgICAgICAgYyA9IGN5Y2xlKGl0KQorICAgICAgICAgICAgXyA9IFtuZXh0KGMpIGZvciBpIGluIHJhbmdlKDcpXSAgICAgICMgY29uc3VtZSA3IG9mIDUgaW5wdXRzCisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKGMsIHByb3RvKQorICAgICAgICAgICAgZCA9IHBpY2tsZS5sb2FkcyhwKSAgICAgICAgICAgICAgICAgICMgcmVidWlsZCB0aGUgY3ljbGUgb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGQpLCBsaXN0KCdjZGVhYmNkZWFiY2RlYWJjZGVhYicpKQorCisgICAgZGVmIHRlc3RfY3ljbGVfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IGJvdGggbW9kZXMgZm9yIHJlc3RvcmluZyBzdGF0ZQorCisgICAgICAgICMgTW9kZSAwIGlzIGVmZmljaWVudC4gIEl0IHVzZXMgYW4gaW5jb21wbGV0ZWx5IGNvbnN1bWVkIGlucHV0CisgICAgICAgICMgaXRlcmF0b3IgdG8gYnVpbGQgYSBjeWNsZSBvYmplY3QgYW5kIHRoZW4gcGFzc2VzIGluIHN0YXRlIHdpdGgKKyAgICAgICAgIyBhIGxpc3Qgb2YgcHJldmlvdXNseSBjb25zdW1lZCB2YWx1ZXMuICBUaGVyZSBpcyBubyBkYXRhCisgICAgICAgICMgb3ZlcmxhcCBiZXR3ZWVuIHRoZSB0d28uCisgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgIGMuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmMnKSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgYyksIGxpc3QoJ2RlZmdhYmNkZWZnYWJjZGVmZ2FiJykpCisKKyAgICAgICAgIyBNb2RlIDEgaXMgaW5lZmZpY2llbnQuICBJdCBzdGFydHMgd2l0aCBhIGN5Y2xlIG9iamVjdCBidWlsdAorICAgICAgICAjIGZyb20gYW4gaXRlcmF0b3Igb3ZlciB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGluIGEgcGFydGlhbAorICAgICAgICAjIGN5Y2xlIGFuZCB0aGVuIHBhc3NlcyBpbiBzdGF0ZSB3aXRoIGFsbCBvZiB0aGUgcHJldmlvdXNseQorICAgICAgICAjIHNlZW4gdmFsdWVzICh0aGlzIG92ZXJsYXBzIHZhbHVlcyBpbmNsdWRlZCBpbiB0aGUgaXRlcmF0b3IpLgorICAgICAgICBjID0gY3ljbGUoJ2RlZmcnKQorICAgICAgICBjLl9fc2V0c3RhdGVfXygobGlzdCgnYWJjZGVmZycpLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjKSwgbGlzdCgnZGVmZ2FiY2RlZmdhYmNkZWZnYWInKSkKKworICAgICAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCB0byBzZXRzdGF0ZSBuZWVkcyB0byBiZSBhIHR1cGxlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IpOgorICAgICAgICAgICAgY3ljbGUoJ2RlZmcnKS5fX3NldHN0YXRlX18oW2xpc3QoJ2FiY2RlZmcnKSwgMF0pCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgICAgICBjLl9fc2V0c3RhdGVfXygoZGljdC5mcm9ta2V5cygnZGVmZycpLCAwKSkKKyAgICAgICAgICAgIHRha2UoMjAsIGMpCisKKyAgICAgICAgIyBUaGUgZmlyc3QgYXJndW1lbnQgaW4gdGhlIHNldHN0YXRlIHR1cGxlIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGN5Y2xlKCdkZWZnJykuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmNkZWZnJyksICd4JykpCisKICAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgogICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgYWNjZXB0cyBhcmd1bWVudHMgY29ycmVjdGx5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZ3JvdXBieShbXSkpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5CmluZGV4IDA4MDdlNmYuLmJhYzM3MGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfanNvbi9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2pzb24vX19pbml0X18ucHkKQEAgLTEsNSArMSw0IEBACiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBqc29uCiBpbXBvcnQgZG9jdGVzdAogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5IGIvTGliL3Rlc3QvdGVzdF9qc29uL3Rlc3RfZmFpbC5weQppbmRleCA5NWZmNWI4Li43OTEwNTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfanNvbi90ZXN0X2ZhaWwucHkKQEAgLTEsNSArMSw0IEBACiBmcm9tIHRlc3QudGVzdF9qc29uIGltcG9ydCBQeVRlc3QsIENUZXN0Ci1pbXBvcnQgcmUKIAogIyAyMDA3LTEwLTA1CiBKU09ORE9DUyA9IFsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKaW5kZXggZjgyMjAyNC4uOWY0OTg4NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzb2NrZXQKLWltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9saW5lY2FjaGUucHkgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQppbmRleCA0N2UyZWRkLi4zNzVkOWM0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQpAQCAtMyw2ICszLDggQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRva2VuaXplCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCkBAIC0xMCw4ICsxMiw2IEBACiBOT05FWElTVEVOVF9GSUxFTkFNRSA9IEZJTEVOQU1FICsgJy5taXNzaW5nJwogSU5WQUxJRF9OQU1FID0gJyFAJCkoIUAjXzEnCiBFTVBUWSA9ICcnCi1URVNUUyA9ICdpbnNwZWN0X2ZvZGRlciBpbnNwZWN0X2ZvZGRlcjIgbWFwcGluZ190ZXN0cycKLVRFU1RTID0gVEVTVFMuc3BsaXQoKQogVEVTVF9QQVRIID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQogTU9EVUxFUyA9ICJsaW5lY2FjaGUgYWJjIi5zcGxpdCgpCiBNT0RVTEVfUEFUSCA9IG9zLnBhdGguZGlybmFtZShGSUxFTkFNRSkKQEAgLTM3LDYgKzM3LDY1IEBACiAgICAgcmV0dXJuIDMnJycgIyBObyBlbmRpbmcgbmV3bGluZQogCiAKK2NsYXNzIFRlbXBGaWxlOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcigpLnNldFVwKCkKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGVsZXRlPUZhbHNlKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuZmlsZV9uYW1lID0gZnAubmFtZQorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5maWxlX2J5dGVfc3RyaW5nKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHNlbGYuZmlsZV9uYW1lKQorCisKK2NsYXNzIEdldExpbmVUZXN0c0dvb2REYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfbGlzdCAgID0gWydsaXN0XG4nLCAnb2ZcbicsICdnb29kXG4nLCAnc3RyaW5nc1xuJ10KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlX2J5dGVfc3RyaW5nID0gJycuam9pbihzZWxmLmZpbGVfbGlzdCkuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKKyAgICAgICAgd2l0aCB0b2tlbml6ZS5vcGVuKHNlbGYuZmlsZV9uYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZnApOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICdcbicKKworICAgICAgICAgICAgICAgIGNhY2hlZF9saW5lID0gbGluZWNhY2hlLmdldGxpbmUoc2VsZi5maWxlX25hbWUsIGluZGV4ICsgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGNhY2hlZF9saW5lKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBzZWxmLmZpbGVfbGlzdCkKKworCitjbGFzcyBHZXRMaW5lVGVzdHNCYWREYXRhKFRlbXBGaWxlKToKKyAgICAjIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ0JhZCBkYXRhIGdvZXMgaGVyZScKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUsIHNlbGYuZmlsZV9uYW1lLCAxKQorCisgICAgZGVmIHRlc3RfZ2V0bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChTeW50YXhFcnJvciwgVW5pY29kZURlY29kZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzLCBzZWxmLmZpbGVfbmFtZSkKKworCitjbGFzcyBFbXB0eUZpbGUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbXQorCisKK2NsYXNzIFNpbmdsZUVtcHR5TGluZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFsnXG4nXQorCisKK2NsYXNzIEdvb2RVbmljb2RlKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gWyfDoVxuJywgJ2JcbicsICdhYmNkZWZcbicsICfDocOhw6HDocOhXG4nXQorCisKK2NsYXNzIEJhZFVuaWNvZGUoR2V0TGluZVRlc3RzQmFkRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfYnl0ZV9zdHJpbmcgPSBiJ1x4ODBhYmMnCisKKwogY2xhc3MgTGluZUNhY2hlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKQEAgLTUzLDEzICsxMTIsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoRU1QVFksIDEpLCBFTVBUWSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKElOVkFMSURfTkFNRSwgMSksIEVNUFRZKQogCi0gICAgICAgICMgQ2hlY2sgd2hldGhlciBsaW5lcyBjb3JyZXNwb25kIHRvIHRob3NlIGZyb20gZmlsZSBpdGVyYXRpb24KLSAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgotICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JwotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmaWxlOgotICAgICAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZmlsZSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShmaWxlbmFtZSwgaW5kZXggKyAxKSkKLQogICAgICAgICAjIENoZWNrIG1vZHVsZSBsb2FkaW5nCiAgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgogICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCkBAIC04MCwxMiArMTMyLDEzIEBACiAKICAgICBkZWYgdGVzdF9jbGVhcmNhY2hlKHNlbGYpOgogICAgICAgICBjYWNoZWQgPSBbXQotICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCisgICAgICAgIGZvciBlbnRyeSBpbiBNT0RVTEVTOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oTU9EVUxFX1BBVEgsIGVudHJ5KSArICcucHknCiAgICAgICAgICAgICBjYWNoZWQuYXBwZW5kKGZpbGVuYW1lKQogICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIDEpCiAKICAgICAgICAgIyBBcmUgYWxsIGZpbGVzIGNhY2hlZD8KKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjYWNoZWQsIFtdKQogICAgICAgICBjYWNoZWRfZW1wdHkgPSBbZm4gZm9yIGZuIGluIGNhY2hlZCBpZiBmbiBub3QgaW4gbGluZWNhY2hlLmNhY2hlXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlZF9lbXB0eSwgW10pCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQppbmRleCA4ZjgyYWI1Li5hZWU2MmRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saXN0LnB5CkBAIC0xLDUgKzEsNSBAQAogaW1wb3J0IHN5cwotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCBsaXN0X3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IGxpc3RfdGVzdHMKIGltcG9ydCBwaWNrbGUKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKaW5kZXggY2I2YTYyOC4uMDYyZGYwZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQpAQCAtNDE2MSw2ICs0MTYxLDE3IEBACiAgICAgICAgIG1zZyA9ICdSZWNvcmQgbm90IGZvdW5kIGluIGV2ZW50IGxvZywgd2VudCBiYWNrICVkIHJlY29yZHMnICUgR09fQkFDSwogICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsIG1zZz1tc2cpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbG9nVGhyZWFkcycsICdsb2dNdWx0aXByb2Nlc3NpbmcnLAorICAgICAgICAgICAgICAgICAgICAgJ2xvZ1Byb2Nlc3NlcycsICdjdXJyZW50ZnJhbWUnLAorICAgICAgICAgICAgICAgICAgICAgJ1BlcmNlbnRTdHlsZScsICdTdHJGb3JtYXRTdHlsZScsICdTdHJpbmdUZW1wbGF0ZVN0eWxlJywKKyAgICAgICAgICAgICAgICAgICAgICdGaWx0ZXJlcicsICdQbGFjZUhvbGRlcicsICdNYW5hZ2VyJywgJ1Jvb3RMb2dnZXInLAorICAgICAgICAgICAgICAgICAgICAgJ3Jvb3QnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBsb2dnaW5nLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKICMgU2V0IHRoZSBsb2NhbGUgdG8gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0LiAgSSBoYXZlIG5vIGlkZWEKICMgd2h5IHRoZSB0ZXN0IGRvZXMgdGhpcywgYnV0IGluIGFueSBjYXNlIHdlIHNhdmUgdGhlIGN1cnJlbnQgbG9jYWxlCiAjIGZpcnN0IGFuZCByZXN0b3JlIGl0IGF0IHRoZSBlbmQuCkBAIC00MTc3LDcgKzQxODgsOCBAQAogICAgICAgICBSb3RhdGluZ0ZpbGVIYW5kbGVyVGVzdCwgIExhc3RSZXNvcnRUZXN0LCBMb2dSZWNvcmRUZXN0LAogICAgICAgICBFeGNlcHRpb25UZXN0LCBTeXNMb2dIYW5kbGVyVGVzdCwgSFRUUEhhbmRsZXJUZXN0LAogICAgICAgICBOVEV2ZW50TG9nSGFuZGxlclRlc3QsIFRpbWVkUm90YXRpbmdGaWxlSGFuZGxlclRlc3QsCi0gICAgICAgIFVuaXhTb2NrZXRIYW5kbGVyVGVzdCwgVW5peERhdGFncmFtSGFuZGxlclRlc3QsIFVuaXhTeXNMb2dIYW5kbGVyVGVzdCkKKyAgICAgICAgVW5peFNvY2tldEhhbmRsZXJUZXN0LCBVbml4RGF0YWdyYW1IYW5kbGVyVGVzdCwgVW5peFN5c0xvZ0hhbmRsZXJUZXN0LAorICAgICAgICBNaXNjVGVzdENhc2UpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCBiMmQwMDhiLi5mMGRkMDc0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC02ODksNiArNjg5LDIwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGludCwgZmxvYXQoJy1pbmYnKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCBmbG9hdCgnbmFuJykpCiAKKyAgICBkZWYgdGVzdF9tb2RfZGl2aXNpb24oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgXyA9IDEgJSAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMyAlIDEwLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMyAlIDEwLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzICUgLTEwLCAtNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTMgJSAtMTAsIC0zKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgJSA0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAlIDQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgJSAtNCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIgJSAtNCwgMCkKKwogICAgIGRlZiB0ZXN0X3RydWVfZGl2aXNpb24oc2VsZik6CiAgICAgICAgIGh1Z2UgPSAxIDw8IDQwMDAwCiAgICAgICAgIG1odWdlID0gLWh1Z2UKQEAgLTcyMyw2ICs3MzcsMjUgQEAKICAgICAgICAgZm9yIHplcm8gaW4gWyJodWdlIC8gMCIsICJtaHVnZSAvIDAiXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBldmFsLCB6ZXJvLCBuYW1lc3BhY2UpCiAKKyAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBfID0gMSAvLyAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyIC8vIDMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiAvLyAtMywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgLy8gMywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgLy8gLTMsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTEgLy8gLTMsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTExIC8vIDMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExIC8vIC0zLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMSAvLyAzLCAzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyIC8vIC0zLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAvLyAzLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAvLyAtMywgLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIgLy8gMywgNCkKKwogICAgIGRlZiBjaGVja190cnVlZGl2KHNlbGYsIGEsIGIsIHNraXBfc21hbGw9VHJ1ZSk6CiAgICAgICAgICIiIlZlcmlmeSB0aGF0IHRoZSByZXN1bHQgb2YgYS9iIGlzIGNvcnJlY3RseSByb3VuZGVkLCBieQogICAgICAgICBjb21wYXJpbmcgaXQgd2l0aCBhIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIGNvcnJlY3RseQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CmluZGV4IDgwYmVjN2EuLjA2OThmZjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgbWFjcGF0aAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCB0ZXN0X2dlbmVyaWNwYXRoCitmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZ2VuZXJpY3BhdGgKIGltcG9ydCB1bml0dGVzdAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCAwOTkxZjc0Li5hZWFiZGJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC03LDE3ICs3LDEyIEBACiBpbXBvcnQgZW1haWwubWVzc2FnZQogaW1wb3J0IHJlCiBpbXBvcnQgaW8KLWltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IG1haWxib3gKIGltcG9ydCBnbG9iCi10cnk6Ci0gICAgaW1wb3J0IGZjbnRsCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgcGFzcwogCiAKIGNsYXNzIFRlc3RCYXNlOgpAQCAtMjI3MywxMiArMjI2OCwxOCBAQAogIiIiKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7ImxpbmVzZXAiLCAiZmNudGwifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBtYWlsYm94LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0cyA9IChUZXN0TWFpbGJveFN1cGVyY2xhc3MsIFRlc3RNYWlsZGlyLCBUZXN0TWJveCwgVGVzdE1NREYsIFRlc3RNSCwKICAgICAgICAgICAgICBUZXN0QmFieWwsIFRlc3RNZXNzYWdlLCBUZXN0TWFpbGRpck1lc3NhZ2UsIFRlc3RNYm94TWVzc2FnZSwKICAgICAgICAgICAgICBUZXN0TUhNZXNzYWdlLCBUZXN0QmFieWxNZXNzYWdlLCBUZXN0TU1ERk1lc3NhZ2UsCiAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VDb252ZXJzaW9uLCBUZXN0UHJveHlGaWxlLCBUZXN0UGFydGlhbEZpbGUsCi0gICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlLCBUZXN0RmFrZU1haWxCb3gpCisgICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlLCBUZXN0RmFrZU1haWxCb3gsIE1pc2NUZXN0Q2FzZSkKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCiAgICAgc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5CmluZGV4IDIyYjJmY2MuLjYyM2ZhZGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGNhcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgbWFpbGNhcAogaW1wb3J0IG9zCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgdGVzdC5zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5IGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CmluZGV4IGM3ZGVmOWEuLmIzNzhmZmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKQEAgLTEzNSw2ICsxMzUsMTMgQEAKICAgICAgICAgZm9yIGNvbnN0cnVjdG9yIGluIChzZXQsIGZyb3plbnNldCk6CiAgICAgICAgICAgICBzZWxmLmhlbHBlcihjb25zdHJ1Y3RvcihzZWxmLmQua2V5cygpKSkKIAorICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2VtcHR5X2Zyb3plbnNldF9zaW5nbGV0b24oc2VsZik6CisgICAgICAgICMgbWFyc2hhbC5sb2FkcygpIG11c3QgcmV1c2UgdGhlIGVtcHR5IGZyb3plbnNldCBzaW5nbGV0b24KKyAgICAgICAgb2JqID0gZnJvemVuc2V0KCkKKyAgICAgICAgb2JqMiA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhvYmopKQorICAgICAgICBzZWxmLmFzc2VydElzKG9iajIsIG9iaikKKwogCiBjbGFzcyBCdWZmZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwgSGVscGVyTWl4aW4pOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKaW5kZXggNmM3Yjk5ZC4uZDBiYzc5MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQpAQCAtNiw3ICs2LDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG1hdGgKIGltcG9ydCBvcwotaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RydWN0CiBpbXBvcnQgc3lzY29uZmlnCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21ldGFjbGFzcy5weSBiL0xpYi90ZXN0L3Rlc3RfbWV0YWNsYXNzLnB5CmluZGV4IGU2ZmUyMGEuLmJlNjgzZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWV0YWNsYXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWV0YWNsYXNzLnB5CkBAIC03OCw3ICs3OCw3IEBACiAgICAgPj4+IGNsYXNzIEMob2JqZWN0LCBtZXRhY2xhc3M9TSwgb3RoZXI9ImhhaGEiKToKICAgICAuLi4gICAgIHBhc3MKICAgICAuLi4KLSAgICBQcmVwYXJlIGNhbGxlZDogKCdDJywgKDxjbGFzcyAnb2JqZWN0Jz4sKSkgeydvdGhlcic6ICdoYWhhJ30KKyAgICBQcmVwYXJlIGNhbGxlZDogKCdDJywgKDxjbGFzcyAnb2JqZWN0JyAuLi4+LCkpIHsnb3RoZXInOiAnaGFoYSd9CiAgICAgTmV3IGNhbGxlZDogeydvdGhlcic6ICdoYWhhJ30KICAgICA+Pj4gQy5fX2NsYXNzX18gaXMgTQogICAgIFRydWUKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgID4+PiBrd2RzID0geydtZXRhY2xhc3MnOiBNLCAnb3RoZXInOiAnaGFoYSd9CiAgICAgPj4+IGNsYXNzIEMoKmJhc2VzLCAqKmt3ZHMpOiBwYXNzCiAgICAgLi4uCi0gICAgUHJlcGFyZSBjYWxsZWQ6ICgnQycsICg8Y2xhc3MgJ29iamVjdCc+LCkpIHsnb3RoZXInOiAnaGFoYSd9CisgICAgUHJlcGFyZSBjYWxsZWQ6ICgnQycsICg8Y2xhc3MgJ29iamVjdCcgLi4uPiwpKSB7J290aGVyJzogJ2hhaGEnfQogICAgIE5ldyBjYWxsZWQ6IHsnb3RoZXInOiAnaGFoYSd9CiAgICAgPj4+IEMuX19jbGFzc19fIGlzIE0KICAgICBUcnVlCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICA+Pj4ga3dkcyA9IHsnb3RoZXInOiAnaGFoYSd9CiAgICAgPj4+IGNsYXNzIEMoQiwgbWV0YWNsYXNzPU0sICpiYXNlcywgKiprd2RzKTogcGFzcwogICAgIC4uLgotICAgIFByZXBhcmUgY2FsbGVkOiAoJ0MnLCAoPGNsYXNzICd0ZXN0LnRlc3RfbWV0YWNsYXNzLkInPiwgPGNsYXNzICdvYmplY3QnPikpIHsnb3RoZXInOiAnaGFoYSd9CisgICAgUHJlcGFyZSBjYWxsZWQ6ICgnQycsICg8Y2xhc3MgJ3Rlc3QudGVzdF9tZXRhY2xhc3MuQicgLi4uPiwgPGNsYXNzICdvYmplY3QnIC4uLj4pKSB7J290aGVyJzogJ2hhaGEnfQogICAgIE5ldyBjYWxsZWQ6IHsnb3RoZXInOiAnaGFoYSd9CiAgICAgPj4+IEMuX19jbGFzc19fIGlzIE0KICAgICBUcnVlCkBAIC0yNTksNyArMjU5LDggQEAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1GYWxzZSk6CiAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X21ldGFjbGFzcwotICAgIHN1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9tZXRhY2xhc3MsIHZlcmJvc2UpCisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfbWV0YWNsYXNzLCB2ZXJib3NlLCBvcHRpb25mbGFncz1kb2N0ZXN0LkVMTElQU0lTKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CmluZGV4IDY4NTY1OTMuLjRlMmM5MDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CkBAIC0xMDEsNSArMTAxLDExIEBACiAgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiaW1hZ2UuanBnIiksICgiaW1hZ2UvanBlZyIsIE5vbmUpKQogICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImltYWdlLnBuZyIpLCAoImltYWdlL3BuZyIsIE5vbmUpKQogCisKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBtaW1ldHlwZXMpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weSBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQppbmRleCBiMzY1ZDg0Li5iYmI0MDcwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21tYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC03MTMsNiArNzEzLDE0IEBACiAgICAgICAgIGdjX2NvbGxlY3QoKQogICAgICAgICBzZWxmLmFzc2VydElzKHdyKCksIE5vbmUpCiAKKyAgICBkZWYgdGVzdF93cml0ZV9yZXR1cm5pbmdfdGhlX251bWJlcl9vZl9ieXRlc193cml0dGVuKHNlbGYpOgorICAgICAgICBtbSA9IG1tYXAubW1hcCgtMSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiIiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiIngiKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiInl6IiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW0ud3JpdGUoYiJweXRob24iKSwgNikKKworCiBjbGFzcyBMYXJnZU1tYXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21zaWxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfbXNpbGliLnB5CmluZGV4IDhlZjMzNGYuLmY2NTZmNzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXNpbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXNpbGliLnB5CkBAIC0xLDYgKzEsNSBAQAogIiIiIFRlc3Qgc3VpdGUgZm9yIHRoZSBjb2RlIGluIG1zaWxpYiAiIiIKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IG9zCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgaW1wb3J0X21vZHVsZQogbXNpbGliID0gaW1wb3J0X21vZHVsZSgnbXNpbGliJykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKaW5kZXggOGQ3YTIxMy4uMDFhMWNkMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC01LDcgKzUsNyBAQAogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4KLWltcG9ydCB1bml0dGVzdCwgaW8sIGNvZGVjcywgc3lzLCBvcworaW1wb3J0IHVuaXR0ZXN0LCBpbywgY29kZWNzLCBzeXMKIGltcG9ydCBfbXVsdGlieXRlY29kZWMKIAogQUxMX0NKS0VOQ09ESU5HUyA9IFsKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19tYWluX2hhbmRsaW5nLnB5CmluZGV4IDUyMjczZWEuLjJlMTVjZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weQpAQCAtNiw3ICs2LDYgQEAKIAogaW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKLWltcG9ydCB6aXBpbXBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCkBAIC0xNSw3ICsxNCw3IEBACiAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0ICgKICAgICBtYWtlX3BrZywgbWFrZV9zY3JpcHQsIG1ha2VfemlwX3BrZywgbWFrZV96aXBfc2NyaXB0LAotICAgIGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZSwgc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbikKKyAgICBhc3NlcnRfcHl0aG9uX29rKQogCiAjIExvb2sgdXAgd2hpY2ggc3RhcnQgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIHRlc3QKIGltcG9ydCBtdWx0aXByb2Nlc3NpbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbmlzLnB5IGIvTGliL3Rlc3QvdGVzdF9uaXMucHkKaW5kZXggMzg3YTRlNy4uMjEwNzRjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9uaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9uaXMucHkKQEAgLTEsNiArMSw1IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogCiAjIFNraXAgdGVzdCBpZiBuaXMgbW9kdWxlIGRvZXMgbm90IGV4aXN0LgogbmlzID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCduaXMnKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5IGIvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CmluZGV4IDMwZmE2MTIuLjViNTkwZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKQEAgLTMsNyArMyw2IEBACiAKIGZyb20gaHR0cC5jbGllbnQgaW1wb3J0IEhUVFBFeGNlcHRpb24KIGltcG9ydCBzeXMKLWltcG9ydCBvcwogZnJvbSB1bmljb2RlZGF0YSBpbXBvcnQgbm9ybWFsaXplLCB1bmlkYXRhX3ZlcnNpb24KIAogVEVTVERBVEFGSUxFID0gIk5vcm1hbGl6YXRpb25UZXN0LnR4dCIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CmluZGV4IGI1YmE5NzYuLjYyNTQwOTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQpAQCAtMTIwLDYzICsxMjAsNjMgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hZGQoMywgNCkgPT0gNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hZGQoMywgNCksIDcpCiAKICAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpID09IDB4YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSwgMHhhKQogCiAgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpID09ICdweXRob24nKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFsxLCAyXSwgWzMsIDRdKSA9PSBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpID09IFs1LCA2LCA3XSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSkgPT0gWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpLCAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSwgWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSksIFs1LCA2LCA3XSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKIAogICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgNSksIDApCiAKICAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSBbNCwgMywgMiwgMV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob3BlcmF0b3IuZGVsaXRlbShhLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbNCwgMiwgMV0pCiAKICAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5mbG9vcmRpdig1LCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci50cnVlZGl2KDUsIDIpLCAyLjUpCiAKICAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIGEgPSByYW5nZSgxMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRpdGVtKGEsIDIpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuZ2V0aXRlbShhLCAyKSwgMikKIAogICAgIGRlZiB0ZXN0X2luZGV4T2Yoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbmRleE9mKFs0LCAzLCAyLCAxXSwgMyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKIAogICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKQEAgLTE4OSwyMSArMTg5LDIxIEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubHNoaWZ0KDUsIDApLCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIDIsIC0xKQogCiAgICAgZGVmIHRlc3RfbW9kKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tb2QoNSwgMikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5tb2QoNSwgMiksIDEpCiAKICAgICBkZWYgdGVzdF9tdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm11bCg1LCAyKSwgMTApCiAKICAgICBkZWYgdGVzdF9tYXRtdWwoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm9yXygweGEsIDB4NSkgPT0gMHhmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm9yXygweGEsIDB4NSksIDB4ZikKIAogICAgIGRlZiB0ZXN0X3BvcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjUwLDggKzI1MCw4IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJzaGlmdCg1LCAxKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IucnNoaWZ0KDUsIDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgpAQCAtMjY2LDE1ICsyNjYsMTUgQEAKICAgICAgICAgYSA9IGxpc3QocmFuZ2UoMykpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG9wZXJhdG9yLnNldGl0ZW0oYSwgMCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzIsIDEsIDJdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCA0LCAyKQogCiAgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnN1Yig1LCAyKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnN1Yig1LCAyKSwgMykKIAogICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvcikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci54b3IoMHhiLCAweGMpID09IDB4NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci54b3IoMHhiLCAweGMpLCAweDcpCiAKICAgICBkZWYgdGVzdF9pcyhzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggNzYyMWMyNC4uOTFhMDMxOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xNiw2ICsxNiw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCitpbXBvcnQgb3B0cGFyc2UKIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uLCBPcHRpb24sIFwKICAgICAgVGl0bGVkSGVscEZvcm1hdHRlciwgT3B0aW9uUGFyc2VyLCBPcHRpb25Hcm91cCwgXAogICAgICBTVVBQUkVTU19VU0FHRSwgT3B0aW9uRXJyb3IsIE9wdGlvbkNvbmZsaWN0RXJyb3IsIFwKQEAgLTE2NTAsNiArMTY1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICcweDEyeCciKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2NoZWNrX2J1aWx0aW4nLCAnQW1iaWd1b3VzT3B0aW9uRXJyb3InLCAnTk9fREVGQVVMVCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG9wdHBhcnNlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcmRlcmVkX2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQppbmRleCA5MDFkNGIyLi42ZmJjMWI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weQpAQCAtMjk4LDkgKzI5OCwxMSBAQAogICAgICAgICAjIGRvIG5vdCBzYXZlIGluc3RhbmNlIGRpY3Rpb25hcnkgaWYgbm90IG5lZWRlZAogICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQogICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob2QuX19kaWN0X18sIGRpY3QpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG9kLl9fcmVkdWNlX18oKVsyXSkKICAgICAgICAgb2QueCA9IDEwCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG9kLl9fcmVkdWNlX18oKVsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5fX2RpY3RfX1sneCddLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5fX3JlZHVjZV9fKClbMl0sIHsneCc6IDEwfSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6CiAgICAgICAgIE9yZGVyZWREaWN0ID0gc2VsZi5PcmRlcmVkRGljdApAQCAtNDAzLDYgKzQwNSwxNCBAQAogICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCoqZCkKICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHN5cy5nZXRzaXplb2Yob2QpLCBzeXMuZ2V0c2l6ZW9mKGQpKQogCisgICAgZGVmIHRlc3Rfdmlld3Moc2VsZik6CisgICAgICAgIE9yZGVyZWREaWN0ID0gc2VsZi5PcmRlcmVkRGljdAorICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQyODYKKyAgICAgICAgcyA9ICd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIGEgbGF6eSBkb2cgeWVzdGVyZGF5IGJlZm9yZSBkYXduJy5zcGxpdCgpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QuZnJvbWtleXMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5rZXlzKCksIGRpY3Qob2QpLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5pdGVtcygpLCBkaWN0KG9kKS5pdGVtcygpKQorCiAgICAgZGVmIHRlc3Rfb3ZlcnJpZGVfdXBkYXRlKHNlbGYpOgogICAgICAgICBPcmRlcmVkRGljdCA9IHNlbGYuT3JkZXJlZERpY3QKICAgICAgICAgIyBWZXJpZnkgdGhhdCBzdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB1cGRhdGUoKSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IDg3NGY5ZTQuLjRhZGU0YWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMTUsNyArMTUsNiBAQAogaW1wb3J0IG1tYXAKIGltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQotaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgcmUKIGltcG9ydCBzaHV0aWwKIGltcG9ydCBzaWduYWwKQEAgLTY2LDYgKzY1LDcgQEAKIAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vawogCisKIHJvb3RfaW5fcG9zaXggPSBGYWxzZQogaWYgaGFzYXR0cihvcywgJ2dldGV1aWQnKToKICAgICByb290X2luX3Bvc2l4ID0gKG9zLmdldGV1aWQoKSA9PSAwKQpAQCAtODIsNiArODIsMjggQEAKICMgSXNzdWUgIzE0MTEwOiBTb21lIHRlc3RzIGZhaWwgb24gRnJlZUJTRCBpZiB0aGUgdXNlciBpcyBpbiB0aGUgd2hlZWwgZ3JvdXAuCiBIQVZFX1dIRUVMX0dST1VQID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSBhbmQgb3MuZ2V0Z2lkKCkgPT0gMAogCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKG1zZ19yZWdleCwgcXVpZXQ9RmFsc2UpOgorICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygobXNnX3JlZ2V4LCBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1xdWlldCk6CisgICAgICAgIHlpZWxkCisKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBieXRlc19maWxlbmFtZV93YXJuKGV4cGVjdGVkKToKKyAgICBtc2cgPSAnVGhlIFdpbmRvd3MgYnl0ZXMgQVBJIGhhcyBiZWVuIGRlcHJlY2F0ZWQnCisgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncyhtc2csIHF1aWV0PW5vdCBleHBlY3RlZCk6CisgICAgICAgICAgICB5aWVsZAorICAgIGVsc2U6CisgICAgICAgIHlpZWxkCisKKworZGVmIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBjb250ZW50PWInY29udGVudCcpOgorICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInhiIiwgMCkgYXMgZnA6CisgICAgICAgIGZwLndyaXRlKGNvbnRlbnQpCisKKwogIyBUZXN0cyBjcmVhdGluZyBURVNURk4KIGNsYXNzIEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTQwLDkgKzE2Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIElOVF9NQVggPCBQWV9TU0laRV9UX01BWCIpCiAgICAgQHN1cHBvcnQuYmlnbWVtdGVzdChzaXplPUlOVF9NQVggKyAxMCwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCiAgICAgZGVmIHRlc3RfbGFyZ2VfcmVhZChzZWxmLCBzaXplKToKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKLSAgICAgICAgICAgIGZwLndyaXRlKGIndGVzdCcpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBiJ3Rlc3QnKQogCiAgICAgICAgICMgSXNzdWUgIzIxOTMyOiBNYWtlIHN1cmUgdGhhdCBvcy5yZWFkKCkgZG9lcyBub3QgcmFpc2UgYW4KICAgICAgICAgIyBPdmVyZmxvd0Vycm9yIGZvciBzaXplIGxhcmdlciB0aGFuIElOVF9NQVgKQEAgLTE5OSwxMSArMjIwLDEyIEBACiAKICAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgogICAgICAgICBURVNURk4yID0gc3VwcG9ydC5URVNURk4gKyAiLjIiCi0gICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZSgiMSIpCi0gICAgICAgIHdpdGggb3BlbihURVNURk4yLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCIyIikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnVubGluaywgVEVTVEZOMikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBURVNURk4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHN1cHBvcnQuVEVTVEZOLCBiIjEiKQorICAgICAgICBjcmVhdGVfZmlsZShURVNURk4yLCBiIjIiKQorCiAgICAgICAgIG9zLnJlcGxhY2Uoc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEZpbGVOb3RGb3VuZEVycm9yLCBvcy5zdGF0LCBzdXBwb3J0LlRFU1RGTikKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdyJykgYXMgZjoKQEAgLTIyNiwxNSArMjQ4LDkgQEAKICMgVGVzdCBhdHRyaWJ1dGVzIG9uIHJldHVybiB2YWx1ZXMgZnJvbSBvcy4qc3RhdCogZmFtaWx5LgogY2xhc3MgU3RhdEF0dHJpYnV0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmZuYW1lID0gb3MucGF0aC5qb2luKHN1cHBvcnQuVEVTVEZOLCAiZjEiKQotICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lLCAnd2InKQotICAgICAgICBmLndyaXRlKGIiQUJDIikKLSAgICAgICAgZi5jbG9zZSgpCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIG9zLnVubGluayhzZWxmLmZuYW1lKQotICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5mbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5mbmFtZSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc2VsZi5mbmFtZSwgYiJBQkMiKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N0YXQnKSwgJ3Rlc3QgbmVlZHMgb3Muc3RhdCgpJykKICAgICBkZWYgY2hlY2tfc3RhdF9hdHRyaWJ1dGVzKHNlbGYsIGZuYW1lKToKQEAgLTMxMCw4ICszMjYsNyBAQAogICAgICAgICAgICAgZm5hbWUgPSBzZWxmLmZuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3QgZW5jb2RlICVhIGZvciB0aGUgZmlsZXN5c3RlbSIgJSBzZWxmLmZuYW1lKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgogICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0X2F0dHJpYnV0ZXMoZm5hbWUpCiAKICAgICBkZWYgdGVzdF9zdGF0X3Jlc3VsdF9waWNrbGUoc2VsZik6CkBAIC00MjYsNyArNDQxLDExIEBACiAgICAgICAgICAgICAwKQogCiAgICAgICAgICMgdGVzdCBkaXJlY3Rvcnkgc3RfZmlsZV9hdHRyaWJ1dGVzIChGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkgc2V0KQotICAgICAgICByZXN1bHQgPSBvcy5zdGF0KHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBkaXJuYW1lID0gc3VwcG9ydC5URVNURk4gKyAiZGlyIgorICAgICAgICBvcy5ta2RpcihkaXJuYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3Mucm1kaXIsIGRpcm5hbWUpCisKKyAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChkaXJuYW1lKQogICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfYXR0cmlidXRlcyhyZXN1bHQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICByZXN1bHQuc3RfZmlsZV9hdHRyaWJ1dGVzICYgc3RhdC5GSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlksCkBAIC00NDAsMTkgKzQ1OSwxNCBAQAogCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi5kaXJuYW1lKQogICAgICAgICBvcy5ta2RpcihzZWxmLmRpcm5hbWUpCi0gICAgICAgIHdpdGggb3BlbihzZWxmLmZuYW1lLCAnd2InKSBhcyBmcDoKLSAgICAgICAgICAgIGZwLndyaXRlKGIiQUJDIikKKyAgICAgICAgY3JlYXRlX2ZpbGUoc2VsZi5mbmFtZSkKIAogICAgICAgICBkZWYgcmVzdG9yZV9mbG9hdF90aW1lcyhzdGF0ZSk6Ci0gICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0KKyAgICAgICAgICAgIHdpdGggaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKCdzdGF0X2Zsb2F0X3RpbWVzJyk6CiAgICAgICAgICAgICAgICAgb3Muc3RhdF9mbG9hdF90aW1lcyhzdGF0ZSkKIAogICAgICAgICAjIGVuc3VyZSB0aGF0IHN0X2F0aW1lIGFuZCBzdF9tdGltZSBhcmUgZmxvYXQKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0KKyAgICAgICAgd2l0aCBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MoJ3N0YXRfZmxvYXRfdGltZXMnKToKICAgICAgICAgICAgIG9sZF9mbG9hdF90aW1lcyA9IG9zLnN0YXRfZmxvYXRfdGltZXMoLTEpCiAgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9mbG9hdF90aW1lcywgb2xkX2Zsb2F0X3RpbWVzKQogCkBAIC01NDQsNyArNTU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmQgc3VwcG9ydCBmb3IgdXRpbWUgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4iKQogICAgIGRlZiB0ZXN0X3V0aW1lX2ZkKHNlbGYpOgogICAgICAgICBkZWYgc2V0X3RpbWUoZmlsZW5hbWUsIG5zKToKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgZnA6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicsIDApIGFzIGZwOgogICAgICAgICAgICAgICAgICMgdXNlIGEgZmlsZSBkZXNjcmlwdG9yIHRvIHRlc3QgZnV0aW1lbnModGltZXNwZWMpCiAgICAgICAgICAgICAgICAgIyBvciBmdXRpbWVzKHRpbWV2YWwpCiAgICAgICAgICAgICAgICAgb3MudXRpbWUoZnAuZmlsZW5vKCksIG5zPW5zKQpAQCAtNzk4LDYgKzgxMiw3IEBACiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIGpvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzdXBwb3J0LlRFU1RGTikKIAogICAgICAgICAjIEJ1aWxkOgogICAgICAgICAjICAgICBURVNURk4vCkBAIC04MzAsOSArODQ1LDggQEAKICAgICAgICAgb3MubWFrZWRpcnModDJfcGF0aCkKIAogICAgICAgICBmb3IgcGF0aCBpbiB0bXAxX3BhdGgsIHRtcDJfcGF0aCwgdG1wM19wYXRoLCB0bXA0X3BhdGg6Ci0gICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCi0gICAgICAgICAgICBmLndyaXRlKCJJJ20gIiArIHBhdGggKyAiIGFuZCBwcm91ZCBvZiBpdC4gIEJsYW1lIHRlc3Rfb3MuXG4iKQotICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIngiKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIkknbSAiICsgcGF0aCArICIgYW5kIHByb3VkIG9mIGl0LiAgQmxhbWUgdGVzdF9vcy5cbiIpCiAKICAgICAgICAgaWYgc3VwcG9ydC5jYW5fc3ltbGluaygpOgogICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLmFic3BhdGgodDJfcGF0aCksIHNlbGYubGlua19wYXRoKQpAQCAtODc4LDcgKzg5Miw3IEBACiAgICAgICAgICMgV2FsayBib3R0b20tdXAuCiAgICAgICAgIGFsbCA9IGxpc3Qoc2VsZi53YWxrKHNlbGYud2Fsa19wYXRoLCB0b3Bkb3duPUZhbHNlKSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCA0LCBhbGwpCiAgICAgICAgICMgV2UgY2FuJ3Qga25vdyB3aGljaCBvcmRlciBTVUIxIGFuZCBTVUIyIHdpbGwgYXBwZWFyIGluLgogICAgICAgICAjIE5vdCBmbGlwcGVkOiAgU1VCMTEsIFNVQjEsIFNVQjIsIFRFU1RGTgogICAgICAgICAjICAgICBmbGlwcGVkOiAgU1VCMiwgU1VCMTEsIFNVQjEsIFRFU1RGTgpAQCAtOTA4LDIyICs5MjIsNiBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgZm9sbG93IHN5bWxpbmsgd2l0aCBmb2xsb3dsaW5rcz1UcnVlIikKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgIyBUZWFyIGV2ZXJ5dGhpbmcgZG93bi4gIFRoaXMgaXMgYSBkZWNlbnQgdXNlIGZvciBib3R0b20tdXAgb24KLSAgICAgICAgIyBXaW5kb3dzLCB3aGljaCBkb2Vzbid0IGhhdmUgYSByZWN1cnNpdmUgZGVsZXRlIGNvbW1hbmQuICBUaGUKLSAgICAgICAgIyAobm90IHNvKSBzdWJ0bGV0eSBpcyB0aGF0IHJtZGlyIHdpbGwgZmFpbCB1bmxlc3MgdGhlIGRpcidzCi0gICAgICAgICMga2lkcyBhcmUgcmVtb3ZlZCBmaXJzdCwgc28gYm90dG9tIHVwIGlzIGVzc2VudGlhbC4KLSAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3VwcG9ydC5URVNURk4sIHRvcGRvd249RmFsc2UpOgotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6Ci0gICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhkaXJuYW1lKToKLSAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGlybmFtZSkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0KICAgICBkZWYgdGVzdF93YWxrX2JhZF9kaXIoc2VsZik6CiAgICAgICAgICMgV2FsayB0b3AtZG93bi4KICAgICAgICAgZXJyb3JzID0gW10KQEAgLTEwMDYsMjcgKzEwMDQsMTMgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLmNsb3NlLCBuZXdmZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdmZCwgbWluZmQpCiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgICMgY2xlYW51cAotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMsIHJvb3RmZCBpbiBvcy5md2FsayhzdXBwb3J0LlRFU1RGTiwgdG9wZG93bj1GYWxzZSk6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSwgZGlyX2ZkPXJvb3RmZCkKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6Ci0gICAgICAgICAgICAgICAgc3QgPSBvcy5zdGF0KG5hbWUsIGRpcl9mZD1yb290ZmQsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkKLSAgICAgICAgICAgICAgICBpZiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUsIGRpcl9mZD1yb290ZmQpCi0gICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQotCiBjbGFzcyBCeXRlc1dhbGtUZXN0cyhXYWxrVGVzdHMpOgogICAgICIiIlRlc3RzIGZvciBvcy53YWxrKCkgd2l0aCBieXRlcy4iIiIKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cGVyKCkuc2V0VXAoKQogICAgICAgICBzZWxmLnN0YWNrID0gY29udGV4dGxpYi5FeGl0U3RhY2soKQogICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6Ci0gICAgICAgICAgICBzZWxmLnN0YWNrLmVudGVyX2NvbnRleHQod2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKSkKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5zdGFjay5lbnRlcl9jb250ZXh0KGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnN0YWNrLmNsb3NlKCkKQEAgLTEyMDMsOCArMTE4Nyw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmEsICdmaWxlLnR4dCcpKQogICAgICAgICBvcy5yZW1vdmVkaXJzKGRpcmIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZGlyYikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhkaXJhKSkKQEAgLTEyMTUsOCArMTE5OCw3IEBACiAgICAgICAgIG9zLm1rZGlyKGRpcmEpCiAgICAgICAgIGRpcmIgPSBvcy5wYXRoLmpvaW4oZGlyYSwgJ2RpcmInKQogICAgICAgICBvcy5ta2RpcihkaXJiKQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCd0ZXh0JykKKyAgICAgICAgY3JlYXRlX2ZpbGUob3MucGF0aC5qb2luKGRpcmIsICdmaWxlLnR4dCcpKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpOgogICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhkaXJiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZGlyYikpCkBAIC0xMjI2LDcgKzEyMDgsNyBAQAogCiBjbGFzcyBEZXZOdWxsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Rldm51bGwoc2VsZik6Ci0gICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAnd2InKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3diJywgMCkgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYidoZWxsbycpCiAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICdyYicpIGFzIGY6CkBAIC0xMzEzLDkgKzEyOTUsOSBAQAogICAgIGRlZiB0ZXN0X3VyYW5kb21fZmRfcmVvcGVuZWQoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzIxMjA3OiB1cmFuZG9tKCkgc2hvdWxkIGRldGVjdCBpdHMgZmQgdG8gL2Rldi91cmFuZG9tCiAgICAgICAgICMgY2hhbmdlZCB0byBzb21ldGhpbmcgZWxzZSwgYW5kIHJlb3BlbiBpdC4KLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAnd2InKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShiIngiICogMjU2KQotICAgICAgICBzZWxmLmFkZENsZWFudXAob3MudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGIieCIgKiAyNTYpCisKICAgICAgICAgY29kZSA9ICIiImlmIDE6CiAgICAgICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgICAgIGltcG9ydCBzeXMKQEAgLTE0NDQsNiArMTQyNiwxOCBAQAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKIGNsYXNzIFdpbjMyRXJyb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5zdGF0KHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBleGlzdHMgPSBGYWxzZQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBleGlzdHMgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoImZpbGUgJXMgbXVzdCBub3QgZXhpc3Q7IG9zLnN0YXQgZmFpbGVkIHdpdGggJXMiCisgICAgICAgICAgICAgICAgICAgICAgJSAoc3VwcG9ydC5URVNURk4sIGV4YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImZpbGUgJXMgbXVzdCBub3QgZXhpc3QiICUgc3VwcG9ydC5URVNURk4pCisKICAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLnJlbmFtZSwgc3VwcG9ydC5URVNURk4sIHN1cHBvcnQuVEVTVEZOKyIuYmFrIikKIApAQCAtMTQ1NCwxMiArMTQ0OCwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5jaGRpciwgc3VwcG9ydC5URVNURk4pCiAKICAgICBkZWYgdGVzdF9ta2RpcihzZWxmKToKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3IikKLSAgICAgICAgdHJ5OgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorCisgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgIngiKSBhcyBmOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MubWtkaXIsIHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBvcy51bmxpbmsoc3VwcG9ydC5URVNURk4pCiAKICAgICBkZWYgdGVzdF91dGltZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MudXRpbWUsIHN1cHBvcnQuVEVTVEZOLCBOb25lKQpAQCAtMTQ2Nyw2ICsxNDU5LDcgQEAKICAgICBkZWYgdGVzdF9jaG1vZChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MuY2htb2QsIHN1cHBvcnQuVEVTVEZOLCAwKQogCisKIGNsYXNzIFRlc3RJbnZhbGlkRkQodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIHNpbmdsZXMgPSBbImZjaGRpciIsICJkdXAiLCAiZmRvcGVuIiwgImZkYXRhc3luYyIsICJmc3RhdCIsCiAgICAgICAgICAgICAgICAiZnN0YXR2ZnMiLCAiZnN5bmMiLCAidGNnZXRwZ3JwIiwgInR0eW5hbWUiXQpAQCAtMTU3OCwxMSArMTU3MSw5IEBACiAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGUpCiAKICAgICBkZWYgX3Rlc3RfbGluayhzZWxmLCBmaWxlMSwgZmlsZTIpOgotICAgICAgICB3aXRoIG9wZW4oZmlsZTEsICJ3IikgYXMgZjE6Ci0gICAgICAgICAgICBmMS53cml0ZSgidGVzdCIpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGUxKQogCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgogICAgICAgICAgICAgb3MubGluayhmaWxlMSwgZmlsZTIpCiAgICAgICAgIHdpdGggb3BlbihmaWxlMSwgInIiKSBhcyBmMSwgb3BlbihmaWxlMiwgInIiKSBhcyBmMjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLnNhbWVvcGVuZmlsZShmMS5maWxlbm8oKSwgZjIuZmlsZW5vKCkpKQpAQCAtMTg3NCwxMCArMTg2NSwxMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKHN1cHBvcnQuVEVTVEZOKSksCiAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVkX3BhdGhzKQorCiAgICAgICAgICMgYnl0ZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikpKSwKLSAgICAgICAgICAgICAgICBbb3MuZnNlbmNvZGUocGF0aCkgZm9yIHBhdGggaW4gc2VsZi5jcmVhdGVkX3BhdGhzXSkKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpLAorICAgICAgICAgICAgICAgICAgICBbb3MuZnNlbmNvZGUocGF0aCkgZm9yIHBhdGggaW4gc2VsZi5jcmVhdGVkX3BhdGhzXSkKIAogICAgIGRlZiB0ZXN0X2xpc3RkaXJfZXh0ZW5kZWRfcGF0aChzZWxmKToKICAgICAgICAgIiIiVGVzdCB3aGVuIHRoZSBwYXRoIHN0YXJ0cyB3aXRoICdcXFxcP1xcJy4iIiIKQEAgLTE4ODcsMTEgKzE4ODAsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICBzb3J0ZWQob3MubGlzdGRpcihwYXRoKSksCiAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVkX3BhdGhzKQorCiAgICAgICAgICMgYnl0ZXMKLSAgICAgICAgcGF0aCA9IGInXFxcXD9cXCcgKyBvcy5mc2VuY29kZShvcy5wYXRoLmFic3BhdGgoc3VwcG9ydC5URVNURk4pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKHBhdGgpKSwKLSAgICAgICAgICAgICAgICBbb3MuZnNlbmNvZGUocGF0aCkgZm9yIHBhdGggaW4gc2VsZi5jcmVhdGVkX3BhdGhzXSkKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKToKKyAgICAgICAgICAgIHBhdGggPSBiJ1xcXFw/XFwnICsgb3MuZnNlbmNvZGUob3MucGF0aC5hYnNwYXRoKHN1cHBvcnQuVEVTVEZOKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKHBhdGgpKSwKKyAgICAgICAgICAgICAgICAgICAgW29zLmZzZW5jb2RlKHBhdGgpIGZvciBwYXRoIGluIHNlbGYuY3JlYXRlZF9wYXRoc10pCiAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0cyIpCkBAIC0xOTY2LDUxICsxOTYxLDQ1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3MubHN0YXQobGluayksIG9zLnN0YXQobGluaykpCiAKICAgICAgICAgYnl0ZXNfbGluayA9IG9zLmZzZW5jb2RlKGxpbmspCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoYnl0ZXNfbGluayksIG9zLnN0YXQodGFyZ2V0KSkKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5sc3RhdChieXRlc19saW5rKSwgb3Muc3RhdChieXRlc19saW5rKSkKIAogICAgIGRlZiB0ZXN0XzEyMDg0KHNlbGYpOgogICAgICAgICBsZXZlbDEgPSBvcy5wYXRoLmFic3BhdGgoc3VwcG9ydC5URVNURk4pCiAgICAgICAgIGxldmVsMiA9IG9zLnBhdGguam9pbihsZXZlbDEsICJsZXZlbDIiKQogICAgICAgICBsZXZlbDMgPSBvcy5wYXRoLmpvaW4obGV2ZWwyLCAibGV2ZWwzIikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBsZXZlbDEpCisKKyAgICAgICAgb3MubWtkaXIobGV2ZWwxKQorICAgICAgICBvcy5ta2RpcihsZXZlbDIpCisgICAgICAgIG9zLm1rZGlyKGxldmVsMykKKworICAgICAgICBmaWxlMSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4obGV2ZWwxLCAiZmlsZTEiKSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCisKKyAgICAgICAgb3JpZ19kaXIgPSBvcy5nZXRjd2QoKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcy5ta2RpcihsZXZlbDEpCi0gICAgICAgICAgICBvcy5ta2RpcihsZXZlbDIpCi0gICAgICAgICAgICBvcy5ta2RpcihsZXZlbDMpCisgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDIpCisgICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKGxldmVsMiwgImxpbmsiKQorICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLnJlbHBhdGgoZmlsZTEpLCAibGluayIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJsaW5rIiwgb3MubGlzdGRpcihvcy5nZXRjd2QoKSkpCiAKLSAgICAgICAgICAgIGZpbGUxID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihsZXZlbDEsICJmaWxlMSIpKQorICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gdGhlIHNhbWUgZGlyIGFzIHRoZSBsaW5rCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLCBvcy5zdGF0KCJsaW5rIikpCiAKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlMSwgInciKSBhcyBmOgotICAgICAgICAgICAgICAgIGYud3JpdGUoImZpbGUxIikKKyAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGJlbG93IHRoZSBsaW5rCisgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCiAKLSAgICAgICAgICAgIG9yaWdfZGlyID0gb3MuZ2V0Y3dkKCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDIpCi0gICAgICAgICAgICAgICAgbGluayA9IG9zLnBhdGguam9pbihsZXZlbDIsICJsaW5rIikKLSAgICAgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGgucmVscGF0aChmaWxlMSksICJsaW5rIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJsaW5rIiwgb3MubGlzdGRpcihvcy5nZXRjd2QoKSkpCi0KLSAgICAgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSB0aGUgc2FtZSBkaXIgYXMgdGhlIGxpbmsKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLCBvcy5zdGF0KCJsaW5rIikpCi0KLSAgICAgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBiZWxvdyB0aGUgbGluawotICAgICAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQotCi0gICAgICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYWJvdmUgdGhlIGxpbmsKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDMpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgb3MuY2hkaXIob3JpZ19kaXIpCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKLSAgICAgICAgICAgIHNlbGYuZmFpbChlcnIpCisgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBhYm92ZSB0aGUgbGluaworICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGUxKQotICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShsZXZlbDEpCisgICAgICAgICAgICBvcy5jaGRpcihvcmlnX2RpcikKIAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKQEAgLTIxNDYsOCArMjEzNSw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG5ld19wcmlvID0gb3MuZ2V0cHJpb3JpdHkob3MuUFJJT19QUk9DRVNTLCBvcy5nZXRwaWQoKSkKICAgICAgICAgICAgIGlmIGJhc2UgPj0gMTkgYW5kIG5ld19wcmlvIDw9IDE5OgotICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KAotICAgICAgInVuYWJsZSB0byByZWxpYWJseSB0ZXN0IHNldHByaW9yaXR5IGF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ1bmFibGUgdG8gcmVsaWFibHkgdGVzdCBzZXRwcmlvcml0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGN1cnJlbnQgbmljZSBsZXZlbCBvZiAlcyIgJSBiYXNlKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19wcmlvLCBiYXNlICsgMSkKICAgICAgICAgZmluYWxseToKQEAgLTIyNTcsOCArMjI0Niw3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLmtleSA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShjbHMuREFUQSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGNscy5EQVRBKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKQEAgLTI0MDgsMTAgKzIzOTYsMTEgQEAKICAgICBkZWYgdGVzdF90cmFpbGVycyhzZWxmKToKICAgICAgICAgVEVTVEZOMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCiAgICAgICAgIGZpbGVfZGF0YSA9IGIiYWJjZGVmIgotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3diJykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoZmlsZV9kYXRhKQotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJylhcyBmOgotICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgVEVTVEZOMikKKworICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIFRFU1RGTjIpCisgICAgICAgIGNyZWF0ZV9maWxlKFRFU1RGTjIsIGZpbGVfZGF0YSkKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgIG9zLnNlbmRmaWxlKHNlbGYuc29ja25vLCBmLmZpbGVubygpLCAwLCBsZW4oZmlsZV9kYXRhKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXJzPVtiIjEyMzQiXSkKICAgICAgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKQEAgLTI0MzQsMzUgKzI0MjMsMzcgQEAKIGRlZiBzdXBwb3J0c19leHRlbmRlZF9hdHRyaWJ1dGVzKCk6CiAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzZXR4YXR0ciIpOgogICAgICAgICByZXR1cm4gRmFsc2UKKwogICAgIHRyeToKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAieGIiLCAwKSBhcyBmcDoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBvcy5zZXR4YXR0cihmcC5maWxlbm8oKSwgYiJ1c2VyLnRlc3QiLCBiIiIpCiAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICBmaW5hbGx5OgogICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAjIEtlcm5lbHMgPCAyLjYuMzkgZG9uJ3QgcmVzcGVjdCBzZXR4YXR0ciBmbGFncy4KLSAgICBrZXJuZWxfdmVyc2lvbiA9IHBsYXRmb3JtLnJlbGVhc2UoKQotICAgIG0gPSByZS5tYXRjaCgiMi42LihcZHsxLDJ9KSIsIGtlcm5lbF92ZXJzaW9uKQotICAgIHJldHVybiBtIGlzIE5vbmUgb3IgaW50KG0uZ3JvdXAoMSkpID49IDM5CisKKyAgICByZXR1cm4gVHJ1ZQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnRzX2V4dGVuZGVkX2F0dHJpYnV0ZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICJubyBub24tYnJva2VuIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdXBwb3J0IikKKyMgS2VybmVscyA8IDIuNi4zOSBkb24ndCByZXNwZWN0IHNldHhhdHRyIGZsYWdzLgorQHN1cHBvcnQucmVxdWlyZXNfbGludXhfdmVyc2lvbigyLCA2LCAzOSkKIGNsYXNzIEV4dGVuZGVkQXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLQogICAgIGRlZiBfY2hlY2tfeGF0dHJzX3N0cihzZWxmLCBzLCBnZXR4YXR0ciwgc2V0eGF0dHIsIHJlbW92ZXhhdHRyLCBsaXN0eGF0dHIsICoqa3dhcmdzKToKICAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgotICAgICAgICBvcGVuKGZuLCAid2IiKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm4pCisgICAgICAgIGNyZWF0ZV9maWxlKGZuKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICBpbml0X3hhdHRyID0gbGlzdHhhdHRyKGZuKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5pdF94YXR0ciwgbGlzdCkKKwogICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksIGIiIiwgKiprd2FyZ3MpCiAgICAgICAgIHhhdHRyID0gc2V0KGluaXRfeGF0dHIpCiAgICAgICAgIHhhdHRyLmFkZCgidXNlci50ZXN0IikKQEAgLTI0NzAsMTkgKzI0NjEsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgYiJ1c2VyLnRlc3QiLCAqKmt3YXJncyksIGIiIikKICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImhlbGxvIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0eGF0dHIoZm4sIGIidXNlci50ZXN0IiwgKiprd2FyZ3MpLCBiImhlbGxvIikKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdCIpLCBiImJ5ZSIsIG9zLlhBVFRSX0NSRUFURSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FRVhJU1QpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiYnllIiwgb3MuWEFUVFJfUkVQTEFDRSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9EQVRBKQorCiAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksIGIiZm9vIiwgb3MuWEFUVFJfQ1JFQVRFLCAqKmt3YXJncykKICAgICAgICAgeGF0dHIuYWRkKCJ1c2VyLnRlc3QyIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHhhdHRyKQogICAgICAgICByZW1vdmV4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBnZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksICoqa3dhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PREFUQSkKKwogICAgICAgICB4YXR0ci5yZW1vdmUoInVzZXIudGVzdCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxpc3R4YXR0cihmbikpLCB4YXR0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgcygidXNlci50ZXN0MiIpLCAqKmt3YXJncyksIGIiZm9vIikKQEAgLTI0OTUsMTEgKzI0OTEsMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHNldChpbml0X3hhdHRyKSB8IHNldChtYW55KSkKIAogICAgIGRlZiBfY2hlY2tfeGF0dHJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgIGRlZiBtYWtlX2J5dGVzKHMpOgotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKHMsICJhc2NpaSIpCiAgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRyc19zdHIoc3RyLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG1ha2VfYnl0ZXMsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLl9jaGVja194YXR0cnNfc3RyKG9zLmZzZW5jb2RlLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQogCiAgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja194YXR0cnMob3MuZ2V0eGF0dHIsIG9zLnNldHhhdHRyLCBvcy5yZW1vdmV4YXR0ciwKQEAgLTI1MTQsMTAgKzI1MTAsMTAgQEAKICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAicmIiKSBhcyBmcDoKICAgICAgICAgICAgICAgICByZXR1cm4gb3MuZ2V0eGF0dHIoZnAuZmlsZW5vKCksICphcmdzKQogICAgICAgICBkZWYgc2V0eGF0dHIocGF0aCwgKmFyZ3MpOgotICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIsIDApIGFzIGZwOgogICAgICAgICAgICAgICAgIG9zLnNldHhhdHRyKGZwLmZpbGVubygpLCAqYXJncykKICAgICAgICAgZGVmIHJlbW92ZXhhdHRyKHBhdGgsICphcmdzKToKLSAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiLCAwKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvcy5yZW1vdmV4YXR0cihmcC5maWxlbm8oKSwgKmFyZ3MpCiAgICAgICAgIGRlZiBsaXN0eGF0dHIocGF0aCwgKmFyZ3MpOgogICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGZwOgpAQCAtMjUzMCwzNiArMjUyNiwzOSBAQAogICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWQoc2VsZik6CiAgICAgICAgIGltcG9ydCBudAogICAgICAgICBmaWxlbmFtZSA9IG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImVycm9yIiwgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgICAgICAgICAgZm9yIGZ1bmMsICphcmdzIGluICgKLSAgICAgICAgICAgICAgICAobnQuX2dldGZ1bGxwYXRobmFtZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChudC5faXNkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MuYWNjZXNzLCBmaWxlbmFtZSwgb3MuUl9PSyksCi0gICAgICAgICAgICAgICAgKG9zLmNoZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmNobW9kLCBmaWxlbmFtZSwgMG83NzcpLAotICAgICAgICAgICAgICAgIChvcy5nZXRjd2RiLCksCi0gICAgICAgICAgICAgICAgKG9zLmxpbmssIGZpbGVuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLmxpc3RkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubHN0YXQsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubWtkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Mub3BlbiwgZmlsZW5hbWUsIG9zLk9fUkRPTkxZKSwKLSAgICAgICAgICAgICAgICAob3MucmVuYW1lLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5ybWRpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5zdGFydGZpbGUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3Muc3RhdCwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy51bmxpbmssIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MudXRpbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGVwcmVjYXRpb25XYXJuaW5nLCBmdW5jLCAqYXJncykKKyAgICAgICAgZm9yIGZ1bmMsICphcmdzIGluICgKKyAgICAgICAgICAgIChudC5fZ2V0ZnVsbHBhdGhuYW1lLCBmaWxlbmFtZSksCisgICAgICAgICAgICAobnQuX2lzZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MuYWNjZXNzLCBmaWxlbmFtZSwgb3MuUl9PSyksCisgICAgICAgICAgICAob3MuY2hkaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5jaG1vZCwgZmlsZW5hbWUsIDBvNzc3KSwKKyAgICAgICAgICAgIChvcy5nZXRjd2RiLCksCisgICAgICAgICAgICAob3MubGluaywgZmlsZW5hbWUsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5saXN0ZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MubHN0YXQsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5ta2RpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLm9wZW4sIGZpbGVuYW1lLCBvcy5PX1JET05MWSksCisgICAgICAgICAgICAob3MucmVuYW1lLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnJtZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Muc3RhcnRmaWxlLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Muc3RhdCwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnVubGluaywgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLnV0aW1lLCBmaWxlbmFtZSksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBPU0Vycm9yLCB3ZSBvbmx5IGNhcmUgYWJvdXQgRGVwcmVjYXRpb25XYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHBhc3MKIAogICAgIEBzdXBwb3J0LnNraXBfdW5sZXNzX3N5bWxpbmsKICAgICBkZWYgdGVzdF9zeW1saW5rKHNlbGYpOgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorCiAgICAgICAgIGZpbGVuYW1lID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZXJyb3IiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rLCBmaWxlbmFtZSwgZmlsZW5hbWUpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoZmlsZW5hbWUsIGZpbGVuYW1lKQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRfdGVybWluYWxfc2l6ZScpLCAicmVxdWlyZXMgb3MuZ2V0X3Rlcm1pbmFsX3NpemUiKQpAQCAtMjY5Nyw3ICsyNjk2LDggQEAKICAgICAgICAgZm9yIGZpbGVuYW1lcywgZnVuYywgKmZ1bmNfYXJncyBpbiBmdW5jczoKICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGZ1bmMobmFtZSwgKmZ1bmNfYXJncykKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKEZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMobmFtZSwgKmZ1bmNfYXJncykKICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZXJyLmZpbGVuYW1lLCBuYW1lKQogICAgICAgICAgICAgICAgIGVsc2U6CkBAIC0yODIwLDE1ICsyODIwLDE4IEBACiAKIAogY2xhc3MgVGVzdFNjYW5kaXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcgPSBzdXBwb3J0LmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcKKwogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5wYXRoID0gb3MucGF0aC5yZWFscGF0aChzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5ieXRlc19wYXRoID0gb3MuZnNlbmNvZGUoc2VsZi5wYXRoKQogICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYucGF0aCkKICAgICAgICAgb3MubWtkaXIoc2VsZi5wYXRoKQogCiAgICAgZGVmIGNyZWF0ZV9maWxlKHNlbGYsIG5hbWU9ImZpbGUudHh0Iik6Ci0gICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgbmFtZSkKLSAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAid2IiKSBhcyBmcDoKLSAgICAgICAgICAgIGZwLndyaXRlKGIncHl0aG9uJykKKyAgICAgICAgcGF0aCA9IHNlbGYuYnl0ZXNfcGF0aCBpZiBpc2luc3RhbmNlKG5hbWUsIGJ5dGVzKSBlbHNlIHNlbGYucGF0aAorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBuYW1lKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidweXRob24nKQogICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogICAgIGRlZiBnZXRfZW50cmllcyhzZWxmLCBuYW1lcyk6CkBAIC0yODUxLDYgKzI4NTQsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0MSwgc3RhdDIpCiAKICAgICBkZWYgY2hlY2tfZW50cnkoc2VsZiwgZW50cnksIG5hbWUsIGlzX2RpciwgaXNfZmlsZSwgaXNfc3ltbGluayk6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnRyeSwgb3MuRGlyRW50cnkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkubmFtZSwgbmFtZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5wYXRoLCBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5pbm9kZSgpLApAQCAtMjkxNiwxNSArMjkyMCwxNiBAQAogICAgICAgICAgICAgc2VsZi5jaGVja19lbnRyeShlbnRyeSwgJ3N5bWxpbmtfZmlsZS50eHQnLCBGYWxzZSwgVHJ1ZSwgVHJ1ZSkKIAogICAgIGRlZiBnZXRfZW50cnkoc2VsZiwgbmFtZSk6Ci0gICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIoc2VsZi5wYXRoKSkKKyAgICAgICAgcGF0aCA9IHNlbGYuYnl0ZXNfcGF0aCBpZiBpc2luc3RhbmNlKG5hbWUsIGJ5dGVzKSBlbHNlIHNlbGYucGF0aAorICAgICAgICBlbnRyaWVzID0gbGlzdChvcy5zY2FuZGlyKHBhdGgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlbnRyaWVzKSwgMSkKIAogICAgICAgICBlbnRyeSA9IGVudHJpZXNbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5uYW1lLCBuYW1lKQogICAgICAgICByZXR1cm4gZW50cnkKIAotICAgIGRlZiBjcmVhdGVfZmlsZV9lbnRyeShzZWxmKToKLSAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNyZWF0ZV9maWxlKCkKKyAgICBkZWYgY3JlYXRlX2ZpbGVfZW50cnkoc2VsZiwgbmFtZT0nZmlsZS50eHQnKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNyZWF0ZV9maWxlKG5hbWU9bmFtZSkKICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5KG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQogCiAgICAgZGVmIHRlc3RfY3VycmVudF9kaXJlY3Rvcnkoc2VsZik6CkBAIC0yOTQ1LDYgKzI5NTAsMTkgQEAKICAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGVudHJ5KSwgIjxEaXJFbnRyeSAnZmlsZS50eHQnPiIpCiAKKyAgICBkZWYgdGVzdF9mc3BhdGhfcHJvdG9jb2woc2VsZik6CisgICAgICAgIGVudHJ5ID0gc2VsZi5jcmVhdGVfZmlsZV9lbnRyeSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZnNwYXRoKGVudHJ5KSwgb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2ZpbGUudHh0JykpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gIm50IiwgInRlc3QgcmVxdWlyZXMgYnl0ZXMgcGF0aCBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF9mc3BhdGhfcHJvdG9jb2xfYnl0ZXMoc2VsZik6CisgICAgICAgIGJ5dGVzX2ZpbGVuYW1lID0gb3MuZnNlbmNvZGUoJ2J5dGVzZmlsZS50eHQnKQorICAgICAgICBieXRlc19lbnRyeSA9IHNlbGYuY3JlYXRlX2ZpbGVfZW50cnkobmFtZT1ieXRlc19maWxlbmFtZSkKKyAgICAgICAgZnNwYXRoID0gb3MuZnNwYXRoKGJ5dGVzX2VudHJ5KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZnNwYXRoLCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmc3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLmZzZW5jb2RlKHNlbGYucGF0aCksYnl0ZXNfZmlsZW5hbWUpKQorCiAgICAgZGVmIHRlc3RfcmVtb3ZlZF9kaXIoc2VsZik6CiAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnZGlyJykKIApAQCAtMzAxMCw3ICszMDI4LDggQEAKICAgICBkZWYgdGVzdF9ieXRlcyhzZWxmKToKICAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCBvcy5zY2FuZGlyKGJ5dGVzKSBtdXN0IHJhaXNlIGFuIGV4Y2VwdGlvbgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQorICAgICAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3Muc2NhbmRpciwgYicuJykKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKQEAgLTMwNDIsNiArMzA2MSwxMTIgQEAKICAgICAgICAgZm9yIG9iaiBpbiBbMTIzNCwgMS4yMzQsIHt9LCBbXV06CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9zLnNjYW5kaXIsIG9iaikKIAorICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIGl0ZXJhdG9yID0gb3Muc2NhbmRpcihzZWxmLnBhdGgpCisgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCkKKyAgICAgICAgIyBtdWx0aXBsZSBjbG9zZXMKKyAgICAgICAgaXRlcmF0b3IuY2xvc2UoKQorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXIoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgd2l0aCBvcy5zY2FuZGlyKHNlbGYucGF0aCkgYXMgaXRlcmF0b3I6CisgICAgICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICB3aXRoIHNlbGYuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpOgorICAgICAgICAgICAgZGVsIGl0ZXJhdG9yCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgd2l0aCBvcy5zY2FuZGlyKHNlbGYucGF0aCkgYXMgaXRlcmF0b3I6CisgICAgICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggb3Muc2NhbmRpcihzZWxmLnBhdGgpIGFzIGl0ZXJhdG9yOgorICAgICAgICAgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgICAgICAgICAgMS8wCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X3Jlc291cmNlX3dhcm5pbmcoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgaXRlcmF0b3IgPSBvcy5zY2FuZGlyKHNlbGYucGF0aCkKKyAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKFJlc291cmNlV2FybmluZyk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKyAgICAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgICMgZXhoYXVzdGVkIGl0ZXJhdG9yCisgICAgICAgIGl0ZXJhdG9yID0gb3Muc2NhbmRpcihzZWxmLnBhdGgpCisgICAgICAgIGxpc3QoaXRlcmF0b3IpCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworCitjbGFzcyBUZXN0UEVQNTE5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgQWJzdHJhY3RlZCBzbyBpdCBjYW4gYmUgb3ZlcnJpZGRlbiB0byB0ZXN0IHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uCisgICAgIyBpZiBhIEMgdmVyc2lvbiBpcyBwcm92aWRlZC4KKyAgICBmc3BhdGggPSBzdGF0aWNtZXRob2Qob3MuZnNwYXRoKQorCisgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPScnKToKKyAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgZGVmIF9fZnNwYXRoX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICBkZWYgdGVzdF9yZXR1cm5fYnl0ZXMoc2VsZik6CisgICAgICAgIGZvciBiIGluIGInaGVsbG8nLCBiJ2dvb2RieWUnLCBiJ3NvbWUvcGF0aC9hbmQvZmlsZSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYuZnNwYXRoKGIpKQorCisgICAgZGVmIHRlc3RfcmV0dXJuX3N0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gJ2hlbGxvJywgJ2dvb2RieWUnLCAnc29tZS9wYXRoL2FuZC9maWxlJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2VsZi5mc3BhdGgocykpCisKKyAgICBkZWYgdGVzdF9mc2VuY29kZV9mc2RlY29kZShzZWxmKToKKyAgICAgICAgZm9yIHAgaW4gInBhdGgvbGlrZS9vYmplY3QiLCBiInBhdGgvbGlrZS9vYmplY3QiOgorICAgICAgICAgICAgcGF0aGxpa2UgPSBzZWxmLlBhdGhMaWtlKHApCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgc2VsZi5mc3BhdGgocGF0aGxpa2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiInBhdGgvbGlrZS9vYmplY3QiLCBvcy5mc2VuY29kZShwYXRobGlrZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJwYXRoL2xpa2Uvb2JqZWN0Iiwgb3MuZnNkZWNvZGUocGF0aGxpa2UpKQorCisgICAgZGVmIHRlc3RfcGF0aGxpa2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyNmZWVsdGhlZ2lsJywgc2VsZi5mc3BhdGgoc2VsZi5QYXRoTGlrZSgnI2ZlZWx0aGVnaWwnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNlbGYuUGF0aExpa2UsIG9zLlBhdGhMaWtlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5QYXRoTGlrZSgpLCBvcy5QYXRoTGlrZSkpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5mc3BhdGgoc2VsZi5QYXRoTGlrZSg0MikpCisKKyAgICBkZWYgdGVzdF9nYXJiYWdlX2luX2V4Y2VwdGlvbl9vdXQoc2VsZik6CisgICAgICAgIHZhcG9yID0gdHlwZSgnYmxhaCcsICgpLCB7fSkKKyAgICAgICAgZm9yIG8gaW4gaW50LCB0eXBlLCBvcywgdmFwb3IoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgsIG8pCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudF9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5mc3BhdGgoKQorCisKKyMgT25seSB0ZXN0IGlmIHRoZSBDIHZlcnNpb24gaXMgcHJvdmlkZWQsIG90aGVyd2lzZSBUZXN0UEVQNTE5IGFscmVhZHkgdGVzdGVkCisjIHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KK2lmIGhhc2F0dHIob3MsICJfZnNwYXRoIik6CisgICAgY2xhc3MgVGVzdFBFUDUxOVB1cmVQeXRob24oVGVzdFBFUDUxOSk6CisKKyAgICAgICAgIiIiRXhwbGljaXRseSB0ZXN0IHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBvcy5mc3BhdGgoKS4iIiIKKworICAgICAgICBmc3BhdGggPSBzdGF0aWNtZXRob2Qob3MuX2ZzcGF0aCkKKwogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQppbmRleCBhYjY1NzdmLi4xZTdkMzMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBwYXJzZXIKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgc3RydWN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQppbmRleCBmYTk2ZDlmLi4yZjJiYTNjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CkBAIC0xOTAsMTMgKzE5MCwxOCBAQAogICAgICAgICBQID0gc2VsZi5jbHMKICAgICAgICAgcCA9IFAoJ2EnKQogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocCwgUCkKKyAgICAgICAgY2xhc3MgUGF0aExpa2U6CisgICAgICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImEvYi9jIgogICAgICAgICBQKCdhJywgJ2InLCAnYycpCiAgICAgICAgIFAoJy9hJywgJ2InLCAnYycpCiAgICAgICAgIFAoJ2EvYi9jJykKICAgICAgICAgUCgnL2EvYi9jJykKKyAgICAgICAgUChQYXRoTGlrZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpKSwgUCgnYScpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpLCAnYicpLCBQKCdhL2InKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQKFAoJ2EnKSwgUCgnYicpKSwgUCgnYS9iJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUChQKCdhJyksIFAoJ2InKSwgUCgnYycpKSwgUChQYXRoTGlrZSgpKSkKIAogICAgIGRlZiBfY2hlY2tfc3RyX3N1YmNsYXNzKHNlbGYsICphcmdzKToKICAgICAgICAgIyBJc3N1ZSAjMjExMjc6IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgYSBQdXJlUGF0aCBvYmplY3QKQEAgLTM4NCw2ICszODksMTIgQEAKICAgICAgICAgcGFydHMgPSBwLnBhcnRzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFydHMsIChzZXAsICdhJywgJ2InKSkKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9jb21tb24oc2VsZik6CisgICAgICAgIFAgPSBzZWxmLmNscworICAgICAgICBwID0gUCgnYS9iJykKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyKHAuX19mc3BhdGhfXygpLCAoJ2EvYicsKSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc3RyKG9zLmZzcGF0aChwKSwgKCdhL2InLCkpCisKICAgICBkZWYgdGVzdF9lcXVpdmFsZW5jZXMoc2VsZik6CiAgICAgICAgIGZvciBrLCB0dXBsZXMgaW4gc2VsZi5lcXVpdmFsZW5jZXMuaXRlbXMoKToKICAgICAgICAgICAgIGNhbm9uID0gay5yZXBsYWNlKCcvJywgc2VsZi5zZXApCkBAIC0xNDc0LDEzICsxNDg1LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHAuZ2xvYigiZGlyQS8uLi9maWxlKiIpKSwgeyBQKEJBU0UsICJkaXJBLy4uL2ZpbGVBIikgfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocC5nbG9iKCIuLi94eXp6eSIpKSwgc2V0KCkpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfcmVsYXRpdmUoc2VsZiwgcCwgZXhwZWN0ZWQpOgorCisgICAgZGVmIF9jaGVja19yZXNvbHZlKHNlbGYsIHAsIGV4cGVjdGVkKToKICAgICAgICAgcSA9IHAucmVzb2x2ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgZXhwZWN0ZWQpCiAKLSAgICBkZWYgX2NoZWNrX3Jlc29sdmVfYWJzb2x1dGUoc2VsZiwgcCwgZXhwZWN0ZWQpOgotICAgICAgICBxID0gcC5yZXNvbHZlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBleHBlY3RlZCkKKyAgICAjIHRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgYm90aCByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgcmVzb2x1dGlvbnMKKyAgICBfY2hlY2tfcmVzb2x2ZV9yZWxhdGl2ZSA9IF9jaGVja19yZXNvbHZlX2Fic29sdXRlID0gX2NoZWNrX3Jlc29sdmUKIAogICAgIEB3aXRoX3N5bWxpbmtzCiAgICAgZGVmIHRlc3RfcmVzb2x2ZV9jb21tb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BkYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CmluZGV4IDQ1YmE1YTkuLmE2M2NjZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGRiLnB5CkBAIC01NTgsNyArNTU4LDYgQEAKIAogZGVmIHBkYl9pbnZva2UobWV0aG9kLCBhcmcpOgogICAgICIiIlJ1biBwZGIubWV0aG9kKGFyZykuIiIiCi0gICAgaW1wb3J0IHBkYgogICAgIGdldGF0dHIocGRiLlBkYihub3NpZ2ludD1UcnVlKSwgbWV0aG9kKShhcmcpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQppbmRleCA0MWU1MDkxLi5iMDMzNjQwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weQpAQCAtMSw5ICsxLDggQEAKIGltcG9ydCBkaXMKIGltcG9ydCByZQogaW1wb3J0IHN5cwotZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIG1hdGggaW1wb3J0IGNvcHlzaWduCiAKIGZyb20gdGVzdC5ieXRlY29kZV9oZWxwZXIgaW1wb3J0IEJ5dGVjb2RlVGVzdENhc2UKIApAQCAtMzAsMjIgKzI5LDI1IEBACiAKICAgICBkZWYgdGVzdF9nbG9iYWxfYXNfY29uc3RhbnQoc2VsZik6CiAgICAgICAgICMgTE9BRF9HTE9CQUwgTm9uZS9UcnVlL0ZhbHNlICAtLT4gIExPQURfQ09OU1QgTm9uZS9UcnVlL0ZhbHNlCi0gICAgICAgIGRlZiBmKHgpOgotICAgICAgICAgICAgTm9uZQotICAgICAgICAgICAgTm9uZQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgeCA9IE5vbmUKKyAgICAgICAgICAgIHggPSBOb25lCiAgICAgICAgICAgICByZXR1cm4geAotICAgICAgICBkZWYgZyh4KToKLSAgICAgICAgICAgIFRydWUKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHggPSBUcnVlCiAgICAgICAgICAgICByZXR1cm4geAotICAgICAgICBkZWYgaCh4KToKLSAgICAgICAgICAgIEZhbHNlCisgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICB4ID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybiB4CisKICAgICAgICAgZm9yIGZ1bmMsIGVsZW0gaW4gKChmLCBOb25lKSwgKGcsIFRydWUpLCAoaCwgRmFsc2UpKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW5CeXRlY29kZShmdW5jLCAnTE9BRF9HTE9CQUwnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbkJ5dGVjb2RlKGZ1bmMsICdMT0FEX0NPTlNUJywgZWxlbSkKKwogICAgICAgICBkZWYgZigpOgogICAgICAgICAgICAgJ0FkZGluZyBhIGRvY3N0cmluZyBtYWRlIHRoaXMgdGVzdCBmYWlsIGluIFB5Mi41LjAnCiAgICAgICAgICAgICByZXR1cm4gTm9uZQorCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW5CeXRlY29kZShmLCAnTE9BRF9HTE9CQUwnKQogICAgICAgICBzZWxmLmFzc2VydEluQnl0ZWNvZGUoZiwgJ0xPQURfQ09OU1QnLCBOb25lKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkKaW5kZXggN2IwZDQ2NS4uODY0OTU5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAzMTUxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVwMzE1MS5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgZXJybm8KIGZyb20gZXJybm8gaW1wb3J0IEVFWElTVApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCA3Yzk4YzQ2Li4yN2Q1MTRmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGJ1aWx0aW5zCi1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCBvcwogZnJvbSBwbGF0Zm9ybSBpbXBvcnQgc3lzdGVtIGFzIHBsYXRmb3JtX3N5c3RlbQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CmluZGV4IGVlN2E2NjcuLmUyYmExYWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0zMyw4ICszMyw2IEBACiAKICAgICB1bnBpY2tsZXIgPSBwaWNrbGUuX1VucGlja2xlcgogICAgIGJhZF9zdGFja19lcnJvcnMgPSAoSW5kZXhFcnJvciwpCi0gICAgYmFkX21hcmtfZXJyb3JzID0gKEluZGV4RXJyb3IsIHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKQogICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvciwgSW5kZXhFcnJvciwgSW1wb3J0RXJyb3IpCkBAIC02OSw4ICs2Nyw2IEBACiAgICAgcGlja2xlciA9IHBpY2tsZS5fUGlja2xlcgogICAgIHVucGlja2xlciA9IHBpY2tsZS5fVW5waWNrbGVyCiAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yKQotICAgIGJhZF9tYXJrX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBJbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBFT0ZFcnJvcikKICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXJyb3IsIEluZGV4RXJyb3IsIEltcG9ydEVycm9yKQpAQCAtMTMyLDcgKzEyOCw2IEBACiAgICAgY2xhc3MgQ1VucGlja2xlclRlc3RzKFB5VW5waWNrbGVyVGVzdHMpOgogICAgICAgICB1bnBpY2tsZXIgPSBfcGlja2xlLlVucGlja2xlcgogICAgICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsKQotICAgICAgICBiYWRfbWFya19lcnJvcnMgPSAoRU9GRXJyb3IsKQogICAgICAgICB0cnVuY2F0ZWRfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEVPRkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQppbmRleCBiYmU2ODc1Li44NmJlYmZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKQEAgLTEsOSArMSw5IEBACi1pbXBvcnQgc3RydWN0CiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgcGlja2xldG9vbHMKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgQWJzdHJhY3RQaWNrbGVUZXN0cwogZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cworaW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIE9wdGltaXplZFBpY2tsZVRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMsIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMpOgogCkBAIC01OSw4ICs1OSw0MCBAQAogICAgICAgICBzZWxmLmFzc2VydE5vdEluKHBpY2tsZS5CSU5QVVQsIHBpY2tsZWQyKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J2J5dGVzX3R5cGVzJywKKyAgICAgICAgICAgICAgICAgICAgICdVUF9UT19ORVdMSU5FJywgJ1RBS0VOX0ZST01fQVJHVU1FTlQxJywKKyAgICAgICAgICAgICAgICAgICAgICdUQUtFTl9GUk9NX0FSR1VNRU5UNCcsICdUQUtFTl9GUk9NX0FSR1VNRU5UNFUnLAorICAgICAgICAgICAgICAgICAgICAgJ1RBS0VOX0ZST01fQVJHVU1FTlQ4VScsICdBcmd1bWVudERlc2NyaXB0b3InLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdWludDEnLCAncmVhZF91aW50MicsICdyZWFkX2ludDQnLCAncmVhZF91aW50NCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91aW50OCcsICdyZWFkX3N0cmluZ25sJywgJ3JlYWRfc3RyaW5nbmxfbm9lc2NhcGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfc3RyaW5nbmxfbm9lc2NhcGVfcGFpcicsICdyZWFkX3N0cmluZzEnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfc3RyaW5nNCcsICdyZWFkX2J5dGVzMScsICdyZWFkX2J5dGVzNCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9ieXRlczgnLCAncmVhZF91bmljb2Rlc3RyaW5nbmwnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfdW5pY29kZXN0cmluZzEnLCAncmVhZF91bmljb2Rlc3RyaW5nNCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91bmljb2Rlc3RyaW5nOCcsICdyZWFkX2RlY2ltYWxubF9zaG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9kZWNpbWFsbmxfbG9uZycsICdyZWFkX2Zsb2F0bmwnLCAncmVhZF9mbG9hdDgnLAorICAgICAgICAgICAgICAgICAgICAgJ3JlYWRfbG9uZzEnLCAncmVhZF9sb25nNCcsCisgICAgICAgICAgICAgICAgICAgICAndWludDEnLCAndWludDInLCAnaW50NCcsICd1aW50NCcsICd1aW50OCcsICdzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nbmxfbm9lc2NhcGUnLCAnc3RyaW5nbmxfbm9lc2NhcGVfcGFpcicsICdzdHJpbmcxJywKKyAgICAgICAgICAgICAgICAgICAgICdzdHJpbmc0JywgJ2J5dGVzMScsICdieXRlczQnLCAnYnl0ZXM4JywKKyAgICAgICAgICAgICAgICAgICAgICd1bmljb2Rlc3RyaW5nbmwnLCAndW5pY29kZXN0cmluZzEnLCAndW5pY29kZXN0cmluZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVzdHJpbmc4JywgJ2RlY2ltYWxubF9zaG9ydCcsICdkZWNpbWFsbmxfbG9uZycsCisgICAgICAgICAgICAgICAgICAgICAnZmxvYXRubCcsICdmbG9hdDgnLCAnbG9uZzEnLCAnbG9uZzQnLAorICAgICAgICAgICAgICAgICAgICAgJ1N0YWNrT2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICdweWludCcsICdweWxvbmcnLCAncHlpbnRlZ2VyX29yX2Jvb2wnLCAncHlib29sJywgJ3B5ZmxvYXQnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5Ynl0ZXNfb3Jfc3RyJywgJ3B5c3RyaW5nJywgJ3B5Ynl0ZXMnLCAncHl1bmljb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICdweW5vbmUnLCAncHl0dXBsZScsICdweWxpc3QnLCAncHlkaWN0JywgJ3B5c2V0JywKKyAgICAgICAgICAgICAgICAgICAgICdweWZyb3plbnNldCcsICdhbnlvYmplY3QnLCAnbWFya29iamVjdCcsICdzdGFja3NsaWNlJywKKyAgICAgICAgICAgICAgICAgICAgICdPcGNvZGVJbmZvJywgJ29wY29kZXMnLCAnY29kZTJvcCcsCisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHBpY2tsZXRvb2xzLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChPcHRpbWl6ZWRQaWNrbGVUZXN0cykKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChNaXNjVGVzdENhc2UpCiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdChwaWNrbGV0b29scykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BpcGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9waXBlcy5weQppbmRleCA2YTdiNDVmLi5hZDAxZDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BpcGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkKQEAgLTIsNiArMiw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzdHJpbmcKIGltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNodXRpbAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCB1bmxpbmssIHJlYXBfY2hpbGRyZW4KIAogaWYgb3MubmFtZSAhPSAncG9zaXgnOgpAQCAtMTgsNiArMTksOCBAQAogICAgICAgICAgICAgdW5saW5rKGYpCiAKICAgICBkZWYgdGVzdFNpbXBsZVBpcGUxKHNlbGYpOgorICAgICAgICBpZiBzaHV0aWwud2hpY2goJ3RyJykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3RyIGlzIG5vdCBhdmFpbGFibGUnKQogICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQogICAgICAgICB0LmFwcGVuZChzX2NvbW1hbmQsIHBpcGVzLlNURElOX1NURE9VVCkKICAgICAgICAgZiA9IHQub3BlbihURVNURk4sICd3JykKQEAgLTI3LDYgKzMwLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMScpCiAKICAgICBkZWYgdGVzdFNpbXBsZVBpcGUyKHNlbGYpOgorICAgICAgICBpZiBzaHV0aWwud2hpY2goJ3RyJykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3RyIGlzIG5vdCBhdmFpbGFibGUnKQogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMicpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCkBAIC0zNiw2ICs0MSw4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnSEVMTE8gV09STEQgIzInKQogCiAgICAgZGVmIHRlc3RTaW1wbGVQaXBlMyhzZWxmKToKKyAgICAgICAgaWYgc2h1dGlsLndoaWNoKCd0cicpIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCd0ciBpcyBub3QgYXZhaWxhYmxlJykKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZSgnaGVsbG8gd29ybGQgIzInKQogICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKaW5kZXggMTYxMTRmOS4uNjBmZjkxOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5CkBAIC03LDcgKzcsNiBAQAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGJpbmFzY2lpCiBpbXBvcnQgY29sbGVjdGlvbnMKLWltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogCkBAIC01MjcsOCArNTI2LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VyLCBpbl9kYXRhKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7IlBsaXN0Rm9ybWF0IiwgIlBMSVNUSEVBREVSIn0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgcGxpc3RsaWIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgotICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RQbGlzdGxpYiwgVGVzdFBsaXN0bGliRGVwcmVjYXRlZCkKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UGxpc3RsaWIsIFRlc3RQbGlzdGxpYkRlcHJlY2F0ZWQsIE1pc2NUZXN0Q2FzZSkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQppbmRleCBiY2VlYjkzLi43Yjk2MDZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weQpAQCAtOCw3ICs4LDYgQEAKIGltcG9ydCBhc3luY2hhdAogaW1wb3J0IHNvY2tldAogaW1wb3J0IG9zCi1pbXBvcnQgdGltZQogaW1wb3J0IGVycm5vCiAKIGZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlLCBza2lwVW5sZXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCAyYTU5YzM4Li42YTFjODI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTExLDcgKzExLDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgcHdkCi1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTQxMSw3ICs0MTAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RhdChieXRlYXJyYXkob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgJ2NhblwndCBzcGVjaWZ5IE5vbmUgZm9yIHBhdGggYXJndW1lbnQnLAorICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLAogICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICdzaG91bGQgYmUgc3RyaW5nLCBieXRlcyBvciBpbnRlZ2VyLCBub3QnLApAQCAtODYzLDkgKzg2Miw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKICAgICAgICAgICAgIHMyID0gcG9zaXguc3RhdChzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPU5vbmUpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9cG9zaXguZ2V0Y3dkKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyLCBub3QnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciBvciBOb25lLCBub3QnLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPWZsb2F0KGYpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgc3VwcG9ydC5URVNURk4sIGRpcl9mZD0xMCoqMjApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CmluZGV4IGFjZjExMDIuLjRmZjQ0NWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CkBAIC0xLDcgKzEsNSBAQAotaW1wb3J0IGl0ZXJ0b29scwogaW1wb3J0IG9zCiBpbXBvcnQgcG9zaXhwYXRoCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogZnJvbSBwb3NpeHBhdGggaW1wb3J0IHJlYWxwYXRoLCBhYnNwYXRoLCBkaXJuYW1lLCBiYXNlbmFtZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3cucHkgYi9MaWIvdGVzdC90ZXN0X3Bvdy5weQppbmRleCA2ZmVhYzQwLi5jZTk5ZmU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvdy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvdy5weQpAQCAtMSw0ICsxLDQgQEAKLWltcG9ydCB0ZXN0LnN1cHBvcnQsIHVuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgUG93VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5IGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKaW5kZXggN2ViYzI5OC4uMjI4MzkyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKQEAgLTg0OCwxMiArODQ4LDExIEBACiAKICAgICBkZWYgdGVzdF9kZWZhdWx0X2RpY3Qoc2VsZik6CiAgICAgICAgIGQgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZCwgd2lkdGg9MSksICJkZWZhdWx0ZGljdCg8Y2xhc3MgJ2ludCc+LCB7fSkiKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KHBwcmludC5wZm9ybWF0KGQsIHdpZHRoPTEpLCByImRlZmF1bHRkaWN0XCg8Y2xhc3MgJ2ludCcgYXQgMHguKz4sIHt9XCkiKQogICAgICAgICB3b3JkcyA9ICd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIGEgbGF6eSBkb2cnLnNwbGl0KCkKICAgICAgICAgZCA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGludCwgemlwKHdvcmRzLCBpdGVydG9vbHMuY291bnQoKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZCksCi0iIiJcCi1kZWZhdWx0ZGljdCg8Y2xhc3MgJ2ludCc+LAorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KHBwcmludC5wZm9ybWF0KGQpLAorciIiImRlZmF1bHRkaWN0XCg8Y2xhc3MgJ2ludCcgYXQgMHguKz4sCiAgICAgICAgICAgICB7J2EnOiA2LAogICAgICAgICAgICAgICdicm93bic6IDIsCiAgICAgICAgICAgICAgJ2RvZyc6IDgsCkBAIC04NjIsNyArODYxLDcgQEAKICAgICAgICAgICAgICAnbGF6eSc6IDcsCiAgICAgICAgICAgICAgJ292ZXInOiA1LAogICAgICAgICAgICAgICdxdWljayc6IDEsCi0gICAgICAgICAgICAgJ3RoZSc6IDB9KSIiIikKKyAgICAgICAgICAgICAndGhlJzogMH1cKSIiIikKIAogICAgIGRlZiB0ZXN0X2NvdW50ZXIoc2VsZik6CiAgICAgICAgIGQgPSBjb2xsZWN0aW9ucy5Db3VudGVyKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHR5LnB5IGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKaW5kZXggZWY1ZTk5ZS4uMTVmODhlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wdHkucHkKQEAgLTI3Nyw3ICsyNzcsNiBAQAogICAgICAgICBzb2NrZXRwYWlyID0gc2VsZi5fc29ja2V0cGFpcigpCiAgICAgICAgIG1hc3RlcnMgPSBbcy5maWxlbm8oKSBmb3IgcyBpbiBzb2NrZXRwYWlyXQogCi0gICAgICAgIG9zLmNsb3NlKG1hc3RlcnNbMV0pCiAgICAgICAgIHNvY2tldHBhaXJbMV0uY2xvc2UoKQogICAgICAgICBvcy5jbG9zZSh3cml0ZV90b19zdGRpbl9mZCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wdWxsZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9wdWxsZG9tLnB5CmluZGV4IDE5MzJjNmIuLjNkODllM2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHVsbGRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgaW8KIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IHN5cwogaW1wb3J0IHhtbC5zYXgKIAogZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgQXR0cmlidXRlc0ltcGwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggNmZmYmJiZC4uMDZjMTBjMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAjIFRoZXNlIHdlcmUgb25jZSBhYm91dCB0aGUgMTAgbG9uZ2VzdCBtb2R1bGVzCiAgICAgICAgIGNtKCdyYW5kb20nLCBpZ25vcmU9KCdSYW5kb20nLCkpICAjIGZyb20gX3JhbmRvbSBpbXBvcnQgUmFuZG9tIGFzIENvcmVHZW5lcmF0b3IKICAgICAgICAgY20oJ2NnaScsIGlnbm9yZT0oJ2xvZycsKSkgICAgICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCi0gICAgICAgIGNtKCdwaWNrbGUnKQorICAgICAgICBjbSgncGlja2xlJywgaWdub3JlPSgncGFydGlhbCcsKSkKICAgICAgICAgY20oJ2FpZmMnLCBpZ25vcmU9KCdvcGVuZnAnLCAnX2FpZmNfcGFyYW1zJykpICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCiAgICAgICAgIGNtKCdzcmVfcGFyc2UnLCBpZ25vcmU9KCdkdW1wJywgJ2dyb3VwcycpKSAjIGZyb20gc3JlX2NvbnN0YW50cyBpbXBvcnQgKjsgcHJvcGVydHkKICAgICAgICAgY20oJ3BkYicpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5IGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQppbmRleCBhZWU5NzliLi44ODljZTU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKQEAgLTg1NSw2ICs4NTUsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9nZXRfc3VtbWFyeV9saW5lKHQud3JhcCksCiAgICAgICAgICAgICAid3JhcCh0ZXh0KSBtZXRob2Qgb2YgdGV4dHdyYXAuVGV4dFdyYXBwZXIgaW5zdGFuY2UiKQogCisgICAgZGVmIHRlc3RfZmllbGRfb3JkZXJfZm9yX25hbWVkX3R1cGxlcyhzZWxmKToKKyAgICAgICAgUGVyc29uID0gbmFtZWR0dXBsZSgnUGVyc29uJywgWyduaWNrbmFtZScsICdmaXJzdG5hbWUnLCAnYWdlZ3JvdXAnXSkKKyAgICAgICAgcyA9IHB5ZG9jLnJlbmRlcl9kb2MoUGVyc29uKQorICAgICAgICBzZWxmLmFzc2VydExlc3Mocy5pbmRleCgnbmlja25hbWUnKSwgcy5pbmRleCgnZmlyc3RuYW1lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzLmluZGV4KCdmaXJzdG5hbWUnKSwgcy5pbmRleCgnYWdlZ3JvdXAnKSkKKworICAgICAgICBjbGFzcyBOb25JdGVyYWJsZUZpZWxkczoKKyAgICAgICAgICAgIF9maWVsZHMgPSBOb25lCisKKyAgICAgICAgY2xhc3MgTm9uSGFzaGFibGVGaWVsZHM6CisgICAgICAgICAgICBfZmllbGRzID0gW1tdXQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZXNlIGRvZXNuJ3QgZmFpbAorICAgICAgICBweWRvYy5yZW5kZXJfZG9jKE5vbkl0ZXJhYmxlRmllbGRzKQorICAgICAgICBweWRvYy5yZW5kZXJfZG9jKE5vbkhhc2hhYmxlRmllbGRzKQorCiAgICAgQHJlcXVpcmVzX2RvY3N0cmluZ3MKICAgICBkZWYgdGVzdF9ib3VuZF9idWlsdGluX21ldGhvZChzZWxmKToKICAgICAgICAgcyA9IFN0cmluZ0lPKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5IGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKaW5kZXggN2NhYzAxMy4uNzE1NTQ0YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKQEAgLTEsNiArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIAotaW1wb3J0IHN5cywgb3MsIGlvLCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzLCBpbywgc3VicHJvY2VzcwogaW1wb3J0IHF1b3ByaQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmdlLnB5CmluZGV4IDEwNmM3MzIuLmUwM2I1NzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yYW5nZS5weQpAQCAtMSw2ICsxLDYgQEAKICMgUHl0aG9uIHRlc3Qgc2V0IC0tIGJ1aWx0LWluIGZ1bmN0aW9ucwogCi1pbXBvcnQgdGVzdC5zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgaXRlcnRvb2xzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JlLnB5IGIvTGliL3Rlc3QvdGVzdF9yZS5weQppbmRleCA3YTc0MTQxLi4yNGEwNjA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIChjaHIoOSkrY2hyKDEwKStjaHIoMTEpK2NocigxMykrY2hyKDEyKStjaHIoNykrY2hyKDgpKSkKICAgICAgICAgZm9yIGMgaW4gJ2NkZWhpamtsbW9wcXN1d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGMpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignYScsICdcXCcgKyBjLCAnYScpLCAnXFwnICsgYykKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignXlxzKicsICdYJywgJ3Rlc3QnKSwgJ1h0ZXN0JykKQEAgLTQxNCwxOSArNDE0LDMzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygpLCAoJ2InLCBOb25lLCAnYicsICdjJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygiIiksICgnYicsICIiLCAnYicsICdjJykpCiAKLSAgICAgICAgIyBBIHNpbmdsZSBncm91cAotICAgICAgICBtID0gcmUubWF0Y2goJyhhKScsICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSksICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEsIDEpLCAoJ2EnLCAnYScpKQotCiAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJyg/Oig/UDxhMT5hKXwoP1A8YjI+YikpKD9QPGMzPmMpPycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhJykuZ3JvdXAoMSwgMiwgMyksICgnYScsIE5vbmUsIE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYicpLmdyb3VwKCdhMScsICdiMicsICdjMycpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnYicsIE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYWMnKS5ncm91cCgxLCAnYjInLCAzKSwgKCdhJywgTm9uZSwgJ2MnKSkKIAorICAgIGRlZiB0ZXN0X2dyb3VwKHNlbGYpOgorICAgICAgICBjbGFzcyBJbmRleDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisgICAgICAgICMgQSBzaW5nbGUgZ3JvdXAKKyAgICAgICAgbSA9IHJlLm1hdGNoKCcoYSkoYiknLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoKSwgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKEluZGV4KDEpKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgMTw8MTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgSW5kZXgoMTw8MTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsICd4JykKKyAgICAgICAgIyBNdWx0aXBsZSBncm91cHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDIsIDEpLCAoJ2InLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoSW5kZXgoMiksIEluZGV4KDEpKSwgKCdiJywgJ2EnKSkKKwogICAgIGRlZiB0ZXN0X3JlX2Z1bGxtYXRjaChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAxNjIwMzogUHJvcG9zYWw6IGFkZCByZS5mdWxsbWF0Y2goKSBtZXRob2QuCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZnVsbG1hdGNoKHIiYSIsICJhIikuc3BhbigpLCAoMCwgMSkpCkBAIC02MzMsMTQgKzY0NywxMCBAQAogICAgICAgICByZS5wdXJnZSgpICAjIGZvciB3YXJuaW5ncwogICAgICAgICBmb3IgYyBpbiAnY2VnaGlqa2xtb3BxeXpDRUZHSElKS0xNTk9QUVJUVlhZJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGMpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZ1bGxtYXRjaCgnXFwlYycgJSBjLCBjKS5ncm91cCgpLCBjKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgnXFwlYycgJSBjLCAnYScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnXFwlYycgJSBjKQogICAgICAgICBmb3IgYyBpbiAnY2VnaGlqa2xtb3BxeXpBQkNFRkdISUpLTE1OT1BRUlRWWFlaJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGMpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZ1bGxtYXRjaCgnW1xcJWNdJyAlIGMsIGMpLmdyb3VwKCksIGMpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKCdbXFwlY10nICUgYywgJ2EnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJ1tcXCVjXScgJSBjKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5nX2JvdW5kYXJpZXMoc2VsZik6CiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDcxMwpAQCAtOTkzLDEwICsxMDAzLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJceCUwMngiICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIlx4JTAyeDAiICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkrYiIwIikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiXHglMDJ4eiIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKStiInoiKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXHUxMjM0IiwgYid1MTIzNCcpKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcVTAwMDEyMzQ1IiwgYidVMDAwMTIzNDUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIGJyIlx1MTIzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJcVTAwMDEyMzQ1IikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlwwIiwgYiJcMDAwIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcMDgiLCBiIlwwMDA4IikpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcMDEiLCBiIlwwMDEiKSkKQEAgLTEwMTgsMTAgKzEwMjYsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIltceCUwMnhdIiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJbXHglMDJ4MF0iICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIltceCUwMnh6XSIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIltcdTEyMzRdIiwgYid1JykpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIltcVTAwMDEyMzQ1XSIsIGInVScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgYnIiW1x1MTIzNF0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgYnIiW1xVMDAwMTIzNDVdIikKICAgICAgICAgc2VsZi5jaGVja1BhdHRlcm5FcnJvcihiciJbXDU2N10iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInb2N0YWwgZXNjYXBlIHZhbHVlIFw1Njcgb3V0c2lkZSBvZiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidyYW5nZSAwLTBvMzc3JywgMSkKQEAgLTEzNjMsMTIgKzEzNjksMTIgQEAKICAgICAgICAgaWYgYmxldHRlcjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBhdC5tYXRjaChibGV0dGVyKSkKICAgICAgICAgIyBJbmNvbXBhdGliaWxpdGllcwotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgJycsIHJlLkxPQ0FMRSkKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsICcoP0wpJykKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsIGInJywgcmUuTE9DQUxFIHwgcmUuQVNDSUkpCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCBiJyg/TCknLCByZS5BU0NJSSkKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsIGInKD9hKScsIHJlLkxPQ0FMRSkKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsIGInKD9hTCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCAnJywgcmUuTE9DQUxFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCAnKD9MKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGInJywgcmUuTE9DQUxFIHwgcmUuQVNDSUkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGInKD9MKScsIHJlLkFTQ0lJKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5jb21waWxlLCBiJyg/YSknLCByZS5MT0NBTEUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGInKD9hTCknKQogCiAgICAgZGVmIHRlc3RfYnVnXzY1MDkoc2VsZik6CiAgICAgICAgICMgUmVwbGFjZW1lbnQgc3RyaW5ncyBvZiBib3RoIHR5cGVzIG11c3QgcGFyc2UgcHJvcGVybHkuCkBAIC0xNDE5LDEzICsxNDI1LDYgQEAKICAgICAgICAgIyBUZXN0IGJlaGF2aW91ciB3aGVuIG5vdCBnaXZlbiBhIHN0cmluZyBvciBwYXR0ZXJuIGFzIHBhcmFtZXRlcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlLmNvbXBpbGUsIDApCiAKLSAgICBkZWYgdGVzdF9idWdfMTM4OTkoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzEzODk5OiByZSBwYXR0ZXJuIHIiW1xBXSIgc2hvdWxkIHdvcmsgbGlrZSAiQSIgYnV0IG1hdGNoZXMKLSAgICAgICAgIyBub3RoaW5nLiBEaXR0byBCIGFuZCBaLgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbChyJ1tcQVxCXGJcQ1xaXScsICdBQlxiQ1onKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydBJywgJ0InLCAnXGInLCAnQycsICdaJ10pCi0KICAgICBAYmlnbWVtdGVzdChzaXplPV8yRywgbWVtdXNlPTEpCiAgICAgZGVmIHRlc3RfbGFyZ2Vfc2VhcmNoKHNlbGYsIHNpemUpOgogICAgICAgICAjIElzc3VlICMxMDE4MjogaW5kaWNlcyB3ZXJlIDMyLWJpdC10cnVuY2F0ZWQuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5IGIvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weQppbmRleCA4YzJhZDg1Li45Yzg5NWExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKQEAgLTEyMSw2ICsxMjEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVJNPSd4dGVybS0yNTZjb2xvcicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LCBiJycpCiAKKyAgICBhdXRvX2hpc3Rvcnlfc2NyaXB0ID0gIiIiXAoraW1wb3J0IHJlYWRsaW5lCityZWFkbGluZS5zZXRfYXV0b19oaXN0b3J5KHt9KQoraW5wdXQoKQorcHJpbnQoIkhpc3RvcnkgbGVuZ3RoOiIsIHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCkpCisiIiIKKworICAgIGRlZiB0ZXN0X2F1dG9faGlzdG9yeV9lbmFibGVkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBydW5fcHR5KHNlbGYuYXV0b19oaXN0b3J5X3NjcmlwdC5mb3JtYXQoVHJ1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJIaXN0b3J5IGxlbmd0aDogMVxyXG4iLCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9hdXRvX2hpc3RvcnlfZGlzYWJsZWQoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHJ1bl9wdHkoc2VsZi5hdXRvX2hpc3Rvcnlfc2NyaXB0LmZvcm1hdChGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJIaXN0b3J5IGxlbmd0aDogMFxyXG4iLCBvdXRwdXQpCisKICAgICBkZWYgdGVzdF9ub25hc2NpaShzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVhZGxpbmUuYWRkX2hpc3RvcnkoIlx4RUJceEVGIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkgYi9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CmluZGV4IGEzOThhNGYuLjMyZWRmZjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQpAQCAtMSwyMSArMSw0OCBAQAogIiIiCiBUZXN0cyBvZiByZWdydGVzdC5weS4KKworTm90ZTogdGVzdF9yZWdydGVzdCBjYW5ub3QgYmUgcnVuIHR3aWNlIGluIHBhcmFsbGVsLgogIiIiCiAKLWltcG9ydCBhcmdwYXJzZQoraW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBmYXVsdGhhbmRsZXIKLWltcG9ydCBnZXRvcHQKK2ltcG9ydCBpbwogaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCByZWdydGVzdCwgc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCBsaWJyZWdydGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CisKKworUHlfREVCVUcgPSBoYXNhdHRyKHN5cywgJ2dldG9iamVjdHMnKQorUk9PVF9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgJy4uJykKK1JPT1RfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoUk9PVF9ESVIpKQorCitURVNUX0lOVEVSUlVQVEVEID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgIGZyb20gc2lnbmFsIGltcG9ydCBTSUdJTlQKKyAgICB0cnk6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCByYWlzZV9zaWduYWwKKyAgICAgICAgcmFpc2Vfc2lnbmFsKFNJR0lOVCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBvcy5raWxsKG9zLmdldHBpZCgpLCBTSUdJTlQpCisgICAgIiIiKQorCiAKIGNsYXNzIFBhcnNlQXJnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICAgICIiIlRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLiIiIgorICAgICIiIgorICAgIFRlc3QgcmVncnRlc3QncyBhcmd1bWVudCBwYXJzaW5nLCBmdW5jdGlvbiBfcGFyc2VfYXJncygpLgorICAgICIiIgogCiAgICAgZGVmIGNoZWNrRXJyb3Ioc2VsZiwgYXJncywgbXNnKToKICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZGVycigpIGFzIGVyciwgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICByZWdydGVzdC5fcGFyc2VfYXJncyhhcmdzKQorICAgICAgICAgICAgbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoYXJncykKICAgICAgICAgc2VsZi5hc3NlcnRJbihtc2csIGVyci5nZXR2YWx1ZSgpKQogCiAgICAgZGVmIHRlc3RfaGVscChzZWxmKToKQEAgLTIzLDgyICs1MCw4MiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6CiAgICAgICAgICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dCwgXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6Ci0gICAgICAgICAgICAgICAgICAgIHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgICAgICBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuJywgb3V0LmdldHZhbHVlKCkpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcigpIHJlcXVpcmVkIikKICAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10aW1lb3V0JywgJzQuMiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnRpbWVvdXQsIDQuMikKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS10aW1lb3V0J10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRpbWVvdXQnLCAnZm9vJ10sICdpbnZhbGlkIGZsb2F0IHZhbHVlJykKIAogICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXdhaXQnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0td2FpdCddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMud2FpdCkKIAogICAgIGRlZiB0ZXN0X3NsYXZlYXJncyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc2xhdmVhcmdzJywgJ1tbXSwge31dJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXNsYXZlYXJncycsICdbW10sIHt9XSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnNsYXZlYXJncywgJ1tbXSwge31dJykKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1zbGF2ZWFyZ3MnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9zdGFydChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVMnLCAnLS1zdGFydCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdmb28nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnZm9vJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy12J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdiddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDEpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctdnZ2J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMykKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMSkKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdmVyYm9zZSddICogMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAzKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF92ZXJib3NlMihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXcnLCAnLS12ZXJib3NlMic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnZlcmJvc2UyKQogCiAgICAgZGVmIHRlc3RfdmVyYm9zZTMoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1XJywgJy0tdmVyYm9zZTMnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy52ZXJib3NlMykKIAogICAgIGRlZiB0ZXN0X3F1aWV0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcScsICctLXF1aWV0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3Rfc2xvdyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW8nLCAnLS1zbG93JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucHJpbnRfc2xvdykKIAogICAgIGRlZiB0ZXN0X2hlYWRlcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0taGVhZGVyJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLWhlYWRlciddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuaGVhZGVyKQogCiAgICAgZGVmIHRlc3RfcmFuZG9taXplKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcicsICctLXJhbmRvbWl6ZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKIAogICAgIGRlZiB0ZXN0X3JhbmRzZWVkKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1yYW5kc2VlZCcsICcxMjM0NSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnJhbmRvbV9zZWVkLCAxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJhbmRvbWl6ZSkKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS1yYW5kc2VlZCddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKQEAgLTEwNyw3ICsxMzQsNyBAQAogICAgIGRlZiB0ZXN0X2Zyb21maWxlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctZicsICctLWZyb21maWxlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuZnJvbWZpbGUsICdmb28nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nLCAnLXMnXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKQEAgLTExNSw0MiArMTQyLDQyIEBACiAgICAgZGVmIHRlc3RfZXhjbHVkZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXgnLCAnLS1leGNsdWRlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X3NpbmdsZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXMnLCAnLS1zaW5nbGUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5zaW5nbGUpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICctZicsICdmb28nXSwgImRvbid0IGdvIHRvZ2V0aGVyIikKIAogICAgIGRlZiB0ZXN0X21hdGNoKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbScsICctLW1hdGNoJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ3BhdHRlcm4nXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdwYXR0ZXJuJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tYXRjaF90ZXN0cywgJ3BhdHRlcm4nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9mYWlsZmFzdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUcnLCAnLS1mYWlsZmFzdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctdiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy12J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLmZhaWxmYXN0KQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy1XJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLVcnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZmFpbGZhc3QpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVcnKQogCiAgICAgZGVmIHRlc3RfdXNlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdScsICctLXVzZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxuZXR3b3JrJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfcmVzb3VyY2VzLCBbJ2d1aScsICduZXR3b3JrJ10pCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5vbmUsbmV0d29yayddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxub25lLG5ldHdvcmsnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIFsnbmV0d29yayddKQotICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdChyZWdydGVzdC5SRVNPVVJDRV9OQU1FUykKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QobGlicmVncnRlc3QuUkVTT1VSQ0VfTkFNRVMpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucmVtb3ZlKCdndWknKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2FsbCwtZ3VpJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnYWxsLC1ndWknXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICdmb28nXSwgJ2ludmFsaWQgcmVzb3VyY2UnKQpAQCAtMTU4LDMxICsxODUsMzEgQEAKICAgICBkZWYgdGVzdF9tZW1saW1pdChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLU0nLCAnLS1tZW1saW1pdCc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc0RyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzRHJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5tZW1saW1pdCwgJzRHJykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogCiAgICAgZGVmIHRlc3RfdGVzdGRpcihzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tdGVzdGRpcicsICdmb28nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50ZXN0ZGlyLCBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRlc3RkaXInXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF9ydW5sZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUwnLCAnLS1ydW5sZWFrcyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnJ1bmxlYWtzKQogCiAgICAgZGVmIHRlc3RfaHVudHJsZWFrcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVInLCAnLS1odW50cmxlYWtzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzonXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6J10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNiwgNCwgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc6MyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzozJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNSwgMywgJ3JlZmxvZy50eHQnKSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OjM6bGVha3MubG9nJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjozOmxlYWtzLmxvZyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuaHVudHJsZWFrcywgKDYsIDMsICdsZWFrcy5sb2cnKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnNiddLApAQCAtMTkzLDI0ICsyMjAsMjMgQEAKICAgICBkZWYgdGVzdF9tdWx0aXByb2Nlc3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1qJywgJy0tbXVsdGlwcm9jZXNzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzInXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcyJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy51c2VfbXAsIDIpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctVCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctbCddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQotICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnMicsICctTScsICc0RyddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogCiAgICAgZGVmIHRlc3RfY292ZXJhZ2Uoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1UJywgJy0tY292ZXJhZ2UnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy50cmFjZSkKIAogICAgIGRlZiB0ZXN0X2NvdmVyZGlyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctRCcsICctLWNvdmVyZGlyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuY292ZXJkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3VwcG9ydC5TQVZFRENXRCwgJ2ZvbycpKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCkBAIC0yMTgsMTMgKzI0NCwxMyBAQAogICAgIGRlZiB0ZXN0X25vY292ZXJkaXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1OJywgJy0tbm9jb3ZlcmRpcic6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobnMuY292ZXJkaXIpCiAKICAgICBkZWYgdGVzdF90aHJlc2hvbGQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy10JywgJy0tdGhyZXNob2xkJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzEwMDAnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICcxMDAwJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy50aHJlc2hvbGQsIDEwMDApCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCBpbnQgdmFsdWUnKQpAQCAtMjMyLDEzICsyNTgsMTYgQEAKICAgICBkZWYgdGVzdF9ub3dpbmRvd3Moc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1uJywgJy0tbm93aW5kb3dzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLnJlZGlyZWN0X3N0ZGVycihpby5TdHJpbmdJTygpKSBhcyBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLm5vd2luZG93cykKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RoZSAtLW5vd2luZG93cyAoLW4pIG9wdGlvbiBpcyBkZXByZWNhdGVkJywgZXJyKQogCiAgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLUYnLCAnLS1mb3JldmVyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZm9yZXZlcikKIAogCkBAIC0yNDYsMzAgKzI3NSw1MDYgQEAKICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFsnLS14eHgnXSwgJ3VzYWdlOicpCiAKICAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9fcGFydGlhbChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aSddKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucXVpZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3R3b19vcHRpb25zKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICctLWV4Y2x1ZGUnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnLS1leGNsdWRlJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZXhjbHVkZSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl93aXRoX2VtcHR5X3N0cmluZ192YWx1ZShzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc3RhcnQnLCAnJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXN0YXJ0JywgJyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnN0YXJ0LCAnJykKIAogICAgIGRlZiB0ZXN0X2FyZyhzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJ2ZvbyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYXJncywgWydmb28nXSkKIAogICAgIGRlZiB0ZXN0X29wdGlvbl9hbmRfYXJnKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICdmb28nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpZXQnLCAnZm9vJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmFyZ3MsIFsnZm9vJ10pCiAKIAorY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBURVNUX1VOSVFVRV9JRCA9IDEKKyAgICBURVNUTkFNRV9QUkVGSVggPSAndGVzdF9yZWdydGVzdF8nCisgICAgVEVTVE5BTUVfUkVHRVggPSByJ3Rlc3RfW2EtekEtWjAtOV9dKycKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0ZGlyID0gb3MucGF0aC5yZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCisgICAgICAgIHNlbGYudG1wdGVzdGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHNlbGYudG1wdGVzdGRpcikKKworICAgIGRlZiBjcmVhdGVfdGVzdChzZWxmLCBuYW1lPU5vbmUsIGNvZGU9JycpOgorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAnbm9vcCVzJyAlIEJhc2VUZXN0Q2FzZS5URVNUX1VOSVFVRV9JRAorICAgICAgICAgICAgQmFzZVRlc3RDYXNlLlRFU1RfVU5JUVVFX0lEICs9IDEKKworICAgICAgICAjIHRlc3RfcmVncnRlc3QgY2Fubm90IGJlIHJ1biB0d2ljZSBpbiBwYXJhbGxlbCBiZWNhdXNlCisgICAgICAgICMgb2Ygc2V0VXAoKSBhbmQgY3JlYXRlX3Rlc3QoKQorICAgICAgICBuYW1lID0gc2VsZi5URVNUTkFNRV9QUkVGSVggKyBuYW1lCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi50bXB0ZXN0ZGlyLCBuYW1lICsgJy5weScpCisKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBwYXRoKQorICAgICAgICAjIFVzZSAneCcgbW9kZSB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgdGVzdHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd4JywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoY29kZSkKKyAgICAgICAgZXhjZXB0IFBlcm1pc3Npb25FcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImNhbm5vdCB3cml0ZSAlczogJXMiICUgKHBhdGgsIGV4YykpCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIHJlZ2V4X3NlYXJjaChzZWxmLCByZWdleCwgb3V0cHV0KToKKyAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2gocmVnZXgsIG91dHB1dCwgcmUuTVVMVElMSU5FKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIG5vdCBmb3VuZCBpbiAlciIgJSAocmVnZXgsIG91dHB1dCkpCisgICAgICAgIHJldHVybiBtYXRjaAorCisgICAgZGVmIGNoZWNrX2xpbmUoc2VsZiwgb3V0cHV0LCByZWdleCk6CisgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyJ14nICsgcmVnZXgsIHJlLk1VTFRJTElORSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHBhcnNlX2V4ZWN1dGVkX3Rlc3RzKHNlbGYsIG91dHB1dCk6CisgICAgICAgIHJlZ2V4ID0gKHInXlswLTldKzpbMC05XSs6WzAtOV0rIFxbICpbMC05XSsoPzovICpbMC05XSspP1xdICglcyknCisgICAgICAgICAgICAgICAgICUgc2VsZi5URVNUTkFNRV9SRUdFWCkKKyAgICAgICAgcGFyc2VyID0gcmUuZmluZGl0ZXIocmVnZXgsIG91dHB1dCwgcmUuTVVMVElMSU5FKQorICAgICAgICByZXR1cm4gbGlzdChtYXRjaC5ncm91cCgxKSBmb3IgbWF0Y2ggaW4gcGFyc2VyKQorCisgICAgZGVmIGNoZWNrX2V4ZWN1dGVkX3Rlc3RzKHNlbGYsIG91dHB1dCwgdGVzdHMsIHNraXBwZWQ9KCksIGZhaWxlZD0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21pdHRlZD0oKSwgcmFuZG9taXplPUZhbHNlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgc3RyKToKKyAgICAgICAgICAgIHRlc3RzID0gW3Rlc3RzXQorICAgICAgICBpZiBpc2luc3RhbmNlKHNraXBwZWQsIHN0cik6CisgICAgICAgICAgICBza2lwcGVkID0gW3NraXBwZWRdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbGVkLCBzdHIpOgorICAgICAgICAgICAgZmFpbGVkID0gW2ZhaWxlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvbWl0dGVkLCBzdHIpOgorICAgICAgICAgICAgb21pdHRlZCA9IFtvbWl0dGVkXQorICAgICAgICBudGVzdCA9IGxlbih0ZXN0cykKKyAgICAgICAgbnNraXBwZWQgPSBsZW4oc2tpcHBlZCkKKyAgICAgICAgbmZhaWxlZCA9IGxlbihmYWlsZWQpCisgICAgICAgIG5vbWl0dGVkID0gbGVuKG9taXR0ZWQpCisKKyAgICAgICAgZXhlY3V0ZWQgPSBzZWxmLnBhcnNlX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCkKKyAgICAgICAgaWYgcmFuZG9taXplOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZXhlY3V0ZWQpLCBzZXQodGVzdHMpLCBvdXRwdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4ZWN1dGVkLCB0ZXN0cywgb3V0cHV0KQorCisgICAgICAgIGRlZiBwbHVyYWwoY291bnQpOgorICAgICAgICAgICAgcmV0dXJuICdzJyBpZiBjb3VudCAhPSAxIGVsc2UgJycKKworICAgICAgICBkZWYgbGlzdF9yZWdleChsaW5lX2Zvcm1hdCwgdGVzdHMpOgorICAgICAgICAgICAgY291bnQgPSBsZW4odGVzdHMpCisgICAgICAgICAgICBuYW1lcyA9ICcgJy5qb2luKHNvcnRlZCh0ZXN0cykpCisgICAgICAgICAgICByZWdleCA9IGxpbmVfZm9ybWF0ICUgKGNvdW50LCBwbHVyYWwoY291bnQpKQorICAgICAgICAgICAgcmVnZXggPSByJyVzOlxuICAgICVzJCcgJSAocmVnZXgsIG5hbWVzKQorICAgICAgICAgICAgcmV0dXJuIHJlZ2V4CisKKyAgICAgICAgaWYgc2tpcHBlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIHNraXBwZWQnLCBza2lwcGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgZmFpbGVkJywgZmFpbGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgaWYgb21pdHRlZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gbGlzdF9yZWdleCgnJXMgdGVzdCVzIG9taXR0ZWQnLCBvbWl0dGVkKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICAgICAgZ29vZCA9IG50ZXN0IC0gbnNraXBwZWQgLSBuZmFpbGVkIC0gbm9taXR0ZWQKKyAgICAgICAgaWYgZ29vZDoKKyAgICAgICAgICAgIHJlZ2V4ID0gciclcyB0ZXN0JXMgT0tcLiQnICUgKGdvb2QsIHBsdXJhbChnb29kKSkKKyAgICAgICAgICAgIGlmIG5vdCBza2lwcGVkIGFuZCBub3QgZmFpbGVkIGFuZCBnb29kID4gMToKKyAgICAgICAgICAgICAgICByZWdleCA9ICdBbGwgJXMnICUgcmVnZXgKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHBhcnNlX3JhbmRvbV9zZWVkKHNlbGYsIG91dHB1dCk6CisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidVc2luZyByYW5kb20gc2VlZCAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgcmFuZHNlZWQgPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHJhbmRzZWVkIDw9IDEwMDAwMDAwLCByYW5kc2VlZCkKKyAgICAgICAgcmV0dXJuIHJhbmRzZWVkCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgYXJncywgaW5wdXQ9Tm9uZSwgZXhpdGNvZGU9MCwgKiprdyk6CisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIGlucHV0ID0gJycKKyAgICAgICAgaWYgJ3N0ZGVycicgbm90IGluIGt3OgorICAgICAgICAgICAga3dbJ3N0ZGVyciddID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLnJ1bihhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dD1pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmt3KQorICAgICAgICBpZiBwcm9jLnJldHVybmNvZGUgIT0gZXhpdGNvZGU6CisgICAgICAgICAgICBtc2cgPSAoIkNvbW1hbmQgJXMgZmFpbGVkIHdpdGggZXhpdCBjb2RlICVzXG4iCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICJzdGRvdXQ6XG4iCisgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICIlc1xuIgorICAgICAgICAgICAgICAgICAgICItLS1cbiIKKyAgICAgICAgICAgICAgICAgICAlIChzdHIoYXJncyksIHByb2MucmV0dXJuY29kZSwgcHJvYy5zdGRvdXQpKQorICAgICAgICAgICAgaWYgcHJvYy5zdGRlcnI6CisgICAgICAgICAgICAgICAgbXNnICs9ICgiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAic3RkZXJyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBwcm9jLnN0ZGVycikKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCisgICAgICAgIHJldHVybiBwcm9jCisKKworICAgIGRlZiBydW5fcHl0aG9uKHNlbGYsIGFyZ3MsICoqa3cpOgorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAnLVgnLCAnZmF1bHRoYW5kbGVyJywgJy1JJywgKmFyZ3NdCisgICAgICAgIHByb2MgPSBzZWxmLnJ1bl9jb21tYW5kKGFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiBwcm9jLnN0ZG91dAorCisKK2NsYXNzIFByb2dyYW1zVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHZhcmlvdXMgd2F5cyB0byBydW4gdGhlIFB5dGhvbiB0ZXN0IHN1aXRlLiBVc2Ugb3B0aW9ucyBjbG9zZQorICAgIHRvIG9wdGlvbnMgdXNlZCBvbiB0aGUgYnVpbGRib3QuCisgICAgIiIiCisKKyAgICBOVEVTVCA9IDQKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisKKyAgICAgICAgIyBDcmVhdGUgTlRFU1QgdGVzdHMgZG9pbmcgbm90aGluZworICAgICAgICBzZWxmLnRlc3RzID0gW3NlbGYuY3JlYXRlX3Rlc3QoKSBmb3IgaW5kZXggaW4gcmFuZ2Uoc2VsZi5OVEVTVCldCisKKyAgICAgICAgc2VsZi5weXRob25fYXJncyA9IFsnLVdkJywgJy1FJywgJy1iYiddCisgICAgICAgIHNlbGYucmVncnRlc3RfYXJncyA9IFsnLXVhbGwnLCAnLXJ3VycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS10ZXN0ZGlyPSVzJyAlIHNlbGYudG1wdGVzdGRpcl0KKyAgICAgICAgaWYgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgc2VsZi5yZWdydGVzdF9hcmdzLmV4dGVuZCgoJy0tdGltZW91dCcsICczNjAwJywgJy1qNCcpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHNlbGYucmVncnRlc3RfYXJncy5hcHBlbmQoJy1uJykKKworICAgIGRlZiBjaGVja19vdXRwdXQoc2VsZiwgb3V0cHV0KToKKyAgICAgICAgc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBzZWxmLnRlc3RzLCByYW5kb21pemU9VHJ1ZSkKKworICAgIGRlZiBydW5fdGVzdHMoc2VsZiwgYXJncyk6CisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3B5dGhvbihhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX291dHB1dChvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9zY3JpcHRfcmVncnRlc3Qoc2VsZik6CisgICAgICAgICMgTGliL3Rlc3QvcmVncnRlc3QucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRpciwgJ3JlZ3J0ZXN0LnB5JykKKworICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCBzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3Rlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfcmVncnRlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdC5yZWdydGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdC5yZWdydGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfYXV0b3Rlc3Qoc2VsZik6CisgICAgICAgICMgLW0gdGVzdC5hdXRvdGVzdAorICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLW0nLCAndGVzdC5hdXRvdGVzdCcsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfZnJvbV90ZXN0X2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIGZyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QKKyAgICAgICAgY29kZSA9ICdmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0JworICAgICAgICBhcmdzID0gWypzZWxmLnB5dGhvbl9hcmdzLCAnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X2F1dG90ZXN0KHNlbGYpOgorICAgICAgICAjIExpYi90ZXN0L2F1dG90ZXN0LnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RkaXIsICdhdXRvdGVzdC5weScpCisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsIHNjcmlwdCwgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bl90ZXN0cy5weSBzY3JpcHQgaXMgbm90IGluc3RhbGxlZCcpCisgICAgZGVmIHRlc3RfdG9vbHNfc2NyaXB0X3J1bl90ZXN0cyhzZWxmKToKKyAgICAgICAgIyBUb29scy9zY3JpcHRzL3J1bl90ZXN0cy5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsICdUb29scycsICdzY3JpcHRzJywgJ3J1bl90ZXN0cy5weScpCisgICAgICAgIGFyZ3MgPSBbc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiBydW5fYmF0Y2goc2VsZiwgKmFyZ3MpOgorICAgICAgICBwcm9jID0gc2VsZi5ydW5fY29tbWFuZChhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX291dHB1dChwcm9jLnN0ZG91dCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5iYXQgc2NyaXB0IGlzIG5vdCBpbnN0YWxsZWQnKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAnV2luZG93cyBvbmx5JykKKyAgICBkZWYgdGVzdF90b29sc19idWlsZGJvdF90ZXN0KHNlbGYpOgorICAgICAgICAjIFRvb2xzXGJ1aWxkYm90XHRlc3QuYmF0CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ1Rvb2xzJywgJ2J1aWxkYm90JywgJ3Rlc3QuYmF0JykKKyAgICAgICAgdGVzdF9hcmdzID0gWyctLXRlc3RkaXI9JXMnICUgc2VsZi50bXB0ZXN0ZGlyXQorICAgICAgICBpZiBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSA9PSAnNjRiaXQnOgorICAgICAgICAgICAgdGVzdF9hcmdzLmFwcGVuZCgnLXg2NCcpICAgIyA2NC1iaXQgYnVpbGQKKyAgICAgICAgaWYgbm90IFB5X0RFQlVHOgorICAgICAgICAgICAgdGVzdF9hcmdzLmFwcGVuZCgnK2QnKSAgICAgIyBSZWxlYXNlIGJ1aWxkLCB1c2UgcHl0aG9uLmV4ZQorICAgICAgICBzZWxmLnJ1bl9iYXRjaChzY3JpcHQsICp0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdXaW5kb3dzIG9ubHknKQorICAgIGRlZiB0ZXN0X3BjYnVpbGRfcnQoc2VsZik6CisgICAgICAgICMgUENidWlsZFxydC5iYXQKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCByJ1BDYnVpbGRccnQuYmF0JykKKyAgICAgICAgcnRfYXJncyA9IFsiLXEiXSAgICAgICAgICAgICAjIFF1aWNrLCBkb24ndCBydW4gdGVzdHMgdHdpY2UKKyAgICAgICAgaWYgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0gPT0gJzY0Yml0JzoKKyAgICAgICAgICAgIHJ0X2FyZ3MuYXBwZW5kKCcteDY0JykgICAjIDY0LWJpdCBidWlsZAorICAgICAgICBpZiBQeV9ERUJVRzoKKyAgICAgICAgICAgIHJ0X2FyZ3MuYXBwZW5kKCctZCcpICAgICAjIERlYnVnIGJ1aWxkLCB1c2UgcHl0aG9uX2QuZXhlCisgICAgICAgIHNlbGYucnVuX2JhdGNoKHNjcmlwdCwgKnJ0X2FyZ3MsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzKQorCisKK2NsYXNzIEFyZ3NUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgYXJndW1lbnRzIG9mIHRoZSBQeXRob24gdGVzdCBzdWl0ZS4KKyAgICAiIiIKKworICAgIGRlZiBydW5fdGVzdHMoc2VsZiwgKnRlc3RhcmdzLCAqKmt3KToKKyAgICAgICAgY21kYXJncyA9IFsnLW0nLCAndGVzdCcsICctLXRlc3RkaXI9JXMnICUgc2VsZi50bXB0ZXN0ZGlyLCAqdGVzdGFyZ3NdCisgICAgICAgIHJldHVybiBzZWxmLnJ1bl9weXRob24oY21kYXJncywgKiprdykKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfdGVzdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGEgZmFpbGluZyB0ZXN0CisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRmFpbGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X2ZhaWxpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiYnVnIikKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0X29rID0gc2VsZi5jcmVhdGVfdGVzdCgnb2snKQorICAgICAgICB0ZXN0X2ZhaWxpbmcgPSBzZWxmLmNyZWF0ZV90ZXN0KCdmYWlsaW5nJywgY29kZT1jb2RlKQorICAgICAgICB0ZXN0cyA9IFt0ZXN0X29rLCB0ZXN0X2ZhaWxpbmddCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKnRlc3RzLCBleGl0Y29kZT0xKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMsIGZhaWxlZD10ZXN0X2ZhaWxpbmcpCisKKyAgICBkZWYgdGVzdF9yZXNvdXJjZXMoc2VsZik6CisgICAgICAgICMgdGVzdCAtdSBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgIHRlc3RzID0ge30KKyAgICAgICAgZm9yIHJlc291cmNlIGluICgnYXVkaW8nLCAnbmV0d29yaycpOgorICAgICAgICAgICAgY29kZSA9ICdmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnRcbnN1cHBvcnQucmVxdWlyZXMoJXIpJyAlIHJlc291cmNlCisgICAgICAgICAgICB0ZXN0c1tyZXNvdXJjZV0gPSBzZWxmLmNyZWF0ZV90ZXN0KHJlc291cmNlLCBjb2RlKQorICAgICAgICB0ZXN0X25hbWVzID0gc29ydGVkKHRlc3RzLnZhbHVlcygpKQorCisgICAgICAgICMgLXUgYWxsOiAyIHJlc291cmNlcyBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctdScsICdhbGwnLCAqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMpCisKKyAgICAgICAgIyAtdSBhdWRpbzogMSByZXNvdXJjZSBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctdWF1ZGlvJywgKnRlc3RfbmFtZXMpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0X25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWQ9dGVzdHNbJ25ldHdvcmsnXSkKKworICAgICAgICAjIG5vIG9wdGlvbjogMCByZXNvdXJjZXMgZW5hYmxlZAorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZD10ZXN0X25hbWVzKQorCisgICAgZGVmIHRlc3RfcmFuZG9tKHNlbGYpOgorICAgICAgICAjIHRlc3QgLXIgYW5kIC0tcmFuZHNlZWQgY29tbWFuZCBsaW5lIG9wdGlvbgorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICAgICAgcHJpbnQoIlRFU1RSQU5ET006ICVzIiAlIHJhbmRvbS5yYW5kaW50KDEsIDEwMDApKQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdyYW5kb20nLCBjb2RlKQorCisgICAgICAgICMgZmlyc3QgcnVuIHRvIGdldCB0aGUgb3V0cHV0IHdpdGggdGhlIHJhbmRvbSBzZWVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctcicsIHRlc3QpCisgICAgICAgIHJhbmRzZWVkID0gc2VsZi5wYXJzZV9yYW5kb21fc2VlZChvdXRwdXQpCisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidURVNUUkFORE9NOiAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgdGVzdF9yYW5kb20gPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisKKyAgICAgICAgIyB0cnkgdG8gcmVwcm9kdWNlIHdpdGggdGhlIHJhbmRvbSBzZWVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctcicsICctLXJhbmRzZWVkPSVzJyAlIHJhbmRzZWVkLCB0ZXN0KQorICAgICAgICByYW5kc2VlZDIgPSBzZWxmLnBhcnNlX3JhbmRvbV9zZWVkKG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5kc2VlZDIsIHJhbmRzZWVkKQorCisgICAgICAgIG1hdGNoID0gc2VsZi5yZWdleF9zZWFyY2gocidURVNUUkFORE9NOiAoWzAtOV0rKScsIG91dHB1dCkKKyAgICAgICAgdGVzdF9yYW5kb20yID0gaW50KG1hdGNoLmdyb3VwKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfcmFuZG9tMiwgdGVzdF9yYW5kb20pCisKKyAgICBkZWYgdGVzdF9mcm9tZmlsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tZnJvbWZpbGUKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSg1KV0KKworICAgICAgICAjIFdyaXRlIHRoZSBsaXN0IG9mIGZpbGVzIHVzaW5nIGEgZm9ybWF0IHNpbWlsYXIgdG8gcmVncnRlc3Qgb3V0cHV0OgorICAgICAgICAjIFsxLzJdIHRlc3RfMQorICAgICAgICAjIFsyLzJdIHRlc3RfMgorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisKKyAgICAgICAgIyB0ZXN0IGZvcm1hdCAnMDowMDowMCBbMi83XSB0ZXN0X29wY29kZXMgLS0gdGVzdF9ncmFtbWFyIHRvb2sgMCBzZWMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIHByZXZpb3VzID0gTm9uZQorICAgICAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZSh0ZXN0cywgMSk6CisgICAgICAgICAgICAgICAgbGluZSA9ICgiMDA6MDA6JTAyaSBbJXMvJXNdICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAoaW5kZXgsIGluZGV4LCBsZW4odGVzdHMpLCBuYW1lKSkKKyAgICAgICAgICAgICAgICBpZiBwcmV2aW91czoKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSAiIC0tICVzIHRvb2sgMCBzZWMiICUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICBwcmludChsaW5lLCBmaWxlPWZwKQorICAgICAgICAgICAgICAgIHByZXZpb3VzID0gbmFtZQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWZyb21maWxlJywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cykKKworICAgICAgICAjIHRlc3QgZm9ybWF0ICdbMi83XSB0ZXN0X29wY29kZXMnCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUodGVzdHMsIDEpOgorICAgICAgICAgICAgICAgIHByaW50KCJbJXMvJXNdICVzIiAlIChpbmRleCwgbGVuKHRlc3RzKSwgbmFtZSksIGZpbGU9ZnApCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZnJvbWZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorCisgICAgICAgICMgdGVzdCBmb3JtYXQgJ3Rlc3Rfb3Bjb2RlcycKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgcHJpbnQobmFtZSwgZmlsZT1mcCkKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlZChzZWxmKToKKyAgICAgICAgY29kZSA9IFRFU1RfSU5URVJSVVBURUQKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ3NpZ2ludCcsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHModGVzdCwgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3QsIG9taXR0ZWQ9dGVzdCkKKworICAgIGRlZiB0ZXN0X3Nsb3coc2VsZik6CisgICAgICAgICMgdGVzdCAtLXNsb3cKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZSgzKV0KKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tc2xvdyIsICp0ZXN0cykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicKKyAgICAgICAgICAgICAgICAgJyg/OiVzOiBbMC05XStcLlswLTldK3Ncbil7JXN9JworICAgICAgICAgICAgICAgICAlIChzZWxmLlRFU1ROQU1FX1JFR0VYLCBsZW4odGVzdHMpKSkKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9zbG93X2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyNTM3MzogdGVzdCAtLXNsb3cgd2l0aCBhbiBpbnRlcnJ1cHRlZCB0ZXN0CisgICAgICAgIGNvZGUgPSBURVNUX0lOVEVSUlVQVEVECisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCJzaWdpbnQiLCBjb2RlPWNvZGUpCisKKyAgICAgICAgZm9yIG11bHRpcHJvY2Vzc2luZyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgaWYgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgICAgIGFyZ3MgPSAoIi0tc2xvdyIsICItajIiLCB0ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzID0gKCItLXNsb3ciLCB0ZXN0KQorICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoKmFyZ3MsIGV4aXRjb2RlPTEpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdCwgb21pdHRlZD10ZXN0KQorICAgICAgICAgICAgcmVnZXggPSAoJzEwIHNsb3dlc3QgdGVzdHM6XG4nKQorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULicpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tY292ZXJhZ2UKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2NvdmVyYWdlJykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0tY292ZXJhZ2UiLCB0ZXN0KQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdKQorICAgICAgICByZWdleCA9ICgnbGluZXMgK2NvdiUgK21vZHVsZSArXChwYXRoXClcbicKKyAgICAgICAgICAgICAgICAgJyg/OiAqWzAtOV0rICpbMC05XXsxLDJ9JSAqW14gXSsgK1woW14pXStcKSspKycpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3Rfd2FpdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0td2FpdAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnd2FpdCcpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCItLXdhaXQiLCB0ZXN0LCBpbnB1dD0na2V5JykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgJ1ByZXNzIGFueSBrZXkgdG8gY29udGludWUnKQorCisgICAgZGVmIHRlc3RfZm9yZXZlcihzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tZm9yZXZlcgorICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IGJ1aWx0aW5zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgY2xhc3MgRm9yZXZlclRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAjIFN0b3JlIHRoZSBzdGF0ZSBpbiB0aGUgYnVpbHRpbnMgbW9kdWxlLCBiZWNhdXNlIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIGlzIHJlbG9hZCBhdCBlYWNoIHJ1bgorICAgICAgICAgICAgICAgICAgICBpZiAnUlVOJyBpbiBidWlsdGlucy5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBidWlsdGlucy5fX2RpY3RfX1snUlVOJ10gPj0gMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZhaWwgYXQgdGhlIDNyZCBydW5zIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSA9IDEKKyAgICAgICAgIiIiKQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnZm9yZXZlcicsIGNvZGU9Y29kZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZm9yZXZlcicsIHRlc3QsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0qMywgZmFpbGVkPXRlc3QpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgYSBkZWJ1ZyBidWlsZCcpCisgICAgZGVmIHRlc3RfaHVudHJsZWFrc19mZF9sZWFrKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1odW50cmxlYWtzIGZvciBmaWxlIGRlc2NyaXB0b3IgbGVhaworICAgICAgICBjb2RlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBpbXBvcnQgdW5pdHRlc3QKKworICAgICAgICAgICAgIyBJc3N1ZSAjMjUzMDY6IERpc2FibGUgcG9wdXBzIGFuZCBsb2dzIHRvIHN0ZGVyciBvbiBhc3NlcnRpb24KKyAgICAgICAgICAgICMgZmFpbHVyZXMgaW4gTVNDUlQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKKyAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICAjIG5vIFdpbmRvd3MsIG8gcmVsZWFzZSBidWlsZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gW21zdmNydC5DUlRfV0FSTiwgbXN2Y3J0LkNSVF9FUlJPUiwgbXN2Y3J0LkNSVF9BU1NFUlRdOgorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQorCisgICAgICAgICAgICBjbGFzcyBGRExlYWtUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9sZWFrKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4oX19maWxlX18sIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgICAgICAgICAjIGJ1ZzogbmV2ZXIgY2xvZXMgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdodW50cmxlYWtzJywgY29kZT1jb2RlKQorCisgICAgICAgIGZpbGVuYW1lID0gJ3JlZmxvZy50eHQnCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWh1bnRybGVha3MnLCAnMzozOicsIHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRjb2RlPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIFt0ZXN0XSwgZmFpbGVkPXRlc3QpCisKKyAgICAgICAgbGluZSA9ICdiZWdpbm5pbmcgNiByZXBldGl0aW9uc1xuMTIzNDU2XG4uLi4uLi5cbicKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmUuZXNjYXBlKGxpbmUpKQorCisgICAgICAgIGxpbmUyID0gJyVzIGxlYWtlZCBbMSwgMSwgMV0gZmlsZSBkZXNjcmlwdG9ycywgc3VtPTNcbicgJSB0ZXN0CisgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsIHJlLmVzY2FwZShsaW5lMikpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIHJlZmxvZyA9IGZwLnJlYWQoKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXRjb3VudHMnKToKKyAgICAgICAgICAgICAgICAjIFR5cGVzIGFyZSBpbW1wb3J0YWwgaWYgQ09VTlRfQUxMT0NTIGlzIGRlZmluZWQKKyAgICAgICAgICAgICAgICByZWZsb2cgPSByZWZsb2cuc3BsaXRsaW5lcyhUcnVlKVstMV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmbG9nLCBsaW5lMikKKworICAgIGRlZiB0ZXN0X2xpc3RfdGVzdHMoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWxpc3QtdGVzdHMKKyAgICAgICAgdGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpIGluIHJhbmdlKDUpXQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1saXN0LXRlc3RzJywgKnRlc3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5yc3RyaXAoKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVwcmxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcmVwcmxpYi5weQppbmRleCA0YmY5MTk0Li4yZWNlYTAyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JlcHJsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZXBybGliLnB5CkBAIC0yOTIsOCArMjkyLDggQEAKICcnJykKICAgICAgICAgaW1wb3J0bGliLmludmFsaWRhdGVfY2FjaGVzKCkKICAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBmb28KLSAgICAgICAgZXEocmVwcihmb28uZm9vKSwKLSAgICAgICAgICAgICAgICI8Y2xhc3MgJyVzLmZvbyc+IiAlIGZvby5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChyZXByKGZvby5mb28pLAorICAgICAgICAgICAgICAgciI8Y2xhc3MgJyVzLmZvbycgYXQgMHguKz4iICUgZm9vLl9fbmFtZV9fKQogCiAgICAgQHVuaXR0ZXN0LnNraXAoJ25lZWQgYSBzdWl0YWJsZSBvYmplY3QnKQogICAgIGRlZiB0ZXN0X29iamVjdChzZWxmKToKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgICAgICBpbXBvcnRsaWIuaW52YWxpZGF0ZV9jYWNoZXMoKQogICAgICAgICBmcm9tIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5hcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24gaW1wb3J0IGJhcgogICAgICAgICAjIE1vZHVsZSBuYW1lIG1heSBiZSBwcmVmaXhlZCB3aXRoICJ0ZXN0LiIsIGRlcGVuZGluZyBvbiBob3cgcnVuLgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYmFyLmJhciksICI8Y2xhc3MgJyVzLmJhcic+IiAlIGJhci5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChyZXByKGJhci5iYXIpLCByIjxjbGFzcyAnJXMuYmFyJyBhdCAweC4rPiIgJSBiYXIuX19uYW1lX18pCiAKICAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tfcGF0aF9saW1pdGF0aW9ucygnYmF6JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQppbmRleCAxNTgyY2FhLi41ODcyOWE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CkBAIC0yNTMsNiArMjUzLDMxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICE9IGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDwgYikKIAorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9tZXNzYWdlKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBOb25lLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogTm9uZSA8IDQyLCByIic8JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPiBOb25lLCByIic+JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPCBOb25lLCByIic8JyAuKiBvZiAnc3RyJyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogImZvbyIgPj0gNjY2LCByIic+PScgLiogb2YgJ3N0cicgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8PSBOb25lLCByIic8PScgLiogb2YgJ2ludCcgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyID49IE5vbmUsIHIiJz49JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBbXSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdsaXN0JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogKCkgPiBbXSwgciInPicgLiogb2YgJ3R1cGxlJyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lID49IE5vbmUsIHIiJz49JyAuKiBvZiAnTm9uZVR5cGUnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBTcGFtKCkgPCA0MiwgciInPCcgLiogb2YgJ1NwYW0nIGFuZCAnaW50JyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPCBTcGFtKCksIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnU3BhbSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8PSBTcGFtKCksIHIiJzw9JyAuKiBvZiAnU3BhbScgYW5kICdTcGFtJyIpLAorICAgICAgICBdCisgICAgICAgIGZvciBpLCB0ZXN0IGluIGVudW1lcmF0ZSh0ZXN0cyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh0ZXN0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsIHRlc3RbMV0pOgorICAgICAgICAgICAgICAgICAgICB0ZXN0WzBdKCkKKworCiBjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kaWN0cyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CmluZGV4IDg1M2U3NzMuLjBkYzEwODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQpAQCAtMSwxMSArMSwxMiBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdW5pdHRlc3QubW9jaworZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAogaW1wb3J0IGJ1aWx0aW5zCiBpbXBvcnQgcmxjb21wbGV0ZXIKIAogY2xhc3MgQ29tcGxldGVNZToKICAgICAiIiIgVHJpdmlhbCBjbGFzcyB1c2VkIGluIHRlc3Rpbmcgcmxjb21wbGV0ZXIuQ29tcGxldGVyLiAiIiIKICAgICBzcGFtID0gMQorICAgIF9oYW0gPSAyCiAKIAogY2xhc3MgVGVzdFJsY29tcGxldGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTUyLDE4ICs1MywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnc3RyLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ3R1cGxlLmZvb3NwYW1lZ2cnKSwgW10pCisgICAgICAgIGV4cGVjdGVkID0gc29ydGVkKHsnTm9uZS4lcyVzJyAlICh4LCAnKCcgaWYgeCAhPSAnX19kb2NfXycgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIGRpcihOb25lKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGRjb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdOb25lLicpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuXycpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuX18nKSwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB0ZXN0IHdpdGggYSBjdXN0b21pemVkIG5hbWVzcGFjZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5zcCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5zcGFtJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZW1lLmVnZycpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLm1ybygnLCAnQ29tcGxldGVNZS5zcGFtJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLl8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUuX2hhbSddKQorICAgICAgICBtYXRjaGVzID0gc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLl9fJykKKyAgICAgICAgZm9yIHggaW4gbWF0Y2hlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LnN0YXJ0c3dpdGgoJ0NvbXBsZXRlTWUuX18nKSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25hbWVfXycsIG1hdGNoZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0NvbXBsZXRlTWUuX19uZXdfXygnLCBtYXRjaGVzKQogCi0gICAgICAgIENvbXBsZXRlTWUubWUgPSBDb21wbGV0ZU1lCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLm1lLm1lLnNwYW0nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ2VnZy5zJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQorICAgICAgICB3aXRoIHBhdGNoLm9iamVjdChDb21wbGV0ZU1lLCAibWUiLCBDb21wbGV0ZU1lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5tZS5tZS5zcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ2VnZy5zJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZWdnLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCiAKICAgICBkZWYgdGVzdF9leGNlc3NpdmVfZ2V0YXR0cihzZWxmKToKICAgICAgICAgIyBFbnN1cmUgZ2V0YXR0cigpIGlzIGludm9rZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIGF0dHJpYnV0ZQpAQCAtNzgsMTQgKzkzLDI3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdmLmInLCAwKSwgJ2YuYmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNhbGxzLCAxKQogCisgICAgZGVmIHRlc3RfdW5jcmVhdGVkX2F0dHIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlcyBsaWtlIHByb3BlcnRpZXMgYW5kIHNsb3RzIHNob3VsZCBiZSBjb21wbGV0ZWQgZXZlbiB3aGVuCisgICAgICAgICMgdGhleSBoYXZlbid0IGJlZW4gY3JlYXRlZCBvbiBhbiBpbnN0YW5jZQorICAgICAgICBjbGFzcyBGb286CisgICAgICAgICAgICBfX3Nsb3RzX18gPSAoImJhciIsKQorICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoZGljdChmPUZvbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuJywgMCksICdmLmJhcicpCisKICAgICBAdW5pdHRlc3QubW9jay5wYXRjaCgncmxjb21wbGV0ZXIuX3JlYWRsaW5lX2F2YWlsYWJsZScsIEZhbHNlKQogICAgIGRlZiB0ZXN0X2NvbXBsZXRlKHNlbGYpOgogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnJywgMCksICdcdCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMCksICdhbmQnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhbicsIDApLCAnYW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDEpLCAnYXMgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FzJywgMiksICdhc3NlcnQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3BhJywgMCksICdwYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ0ZhJywgMCksICdGYWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDApLCAnZWxpZiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZWwnLCAxKSwgJ2Vsc2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHInLCAwKSwgJ3RyeTonKQogCiAgICAgZGVmIHRlc3RfZHVwbGljYXRlX2dsb2JhbHMoc2VsZik6CiAgICAgICAgIG5hbWVzcGFjZSA9IHsKQEAgLTk4LDkgKzEyNiwxMCBAQAogICAgICAgICBjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIobmFtZXNwYWNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmFsc2UnLCAwKSwgJ0ZhbHNlJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDEpKSAgIyBObyBkdXBsaWNhdGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCcpCisgICAgICAgICMgU3BhY2Ugb3IgY29sb24gYWRkZWQgZHVlIHRvIGJlaW5nIGEgcmVzZXJ2ZWQga2V5d29yZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXNzZXJ0JywgMCksICdhc3NlcnQgJykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ3RyeScsIDApLCAndHJ5OicpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMSkpCiAgICAgICAgICMgTm8gb3BlbmluZyBicmFja2V0ICIoIiBiZWNhdXNlIHdlIG92ZXJyb2RlIHRoZSBidWlsdC1pbiBjbGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnbWVtb3J5dmlldycsIDApLCAnbWVtb3J5dmlldycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5IGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQppbmRleCBkMDEyNjZmLi43NmY0ZjdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKQEAgLTEsOCArMSw3IEBACiBpbXBvcnQgaW8KIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHVybGxpYi5yb2JvdHBhcnNlcgotZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IFVSTEVycm9yLCBIVFRQRXJyb3IKLWZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgogdHJ5OgpAQCAtMTIsNyArMTEsOCBAQAogCiAKIGNsYXNzIFJvYm90VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleD1Ob25lLCBwYXJzZXI9Tm9uZSwgdXJsPU5vbmUsIGdvb2Q9Tm9uZSwgYWdlbnQ9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLAorICAgICAgICAgICAgICAgICBhZ2VudD1Ob25lLCByZXF1ZXN0X3JhdGU9Tm9uZSwgY3Jhd2xfZGVsYXk9Tm9uZSk6CiAgICAgICAgICMgd29ya2Fyb3VuZCB0byBtYWtlIHVuaXR0ZXN0IGRpc2NvdmVyeSB3b3JrIChzZWUgIzE3MDY2KQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbmRleCwgaW50KToKICAgICAgICAgICAgIHJldHVybgpAQCAtMjUsNiArMjUsOCBAQAogICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgICBzZWxmLmdvb2QgPSBnb29kCiAgICAgICAgIHNlbGYuYWdlbnQgPSBhZ2VudAorICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZSA9IHJlcXVlc3RfcmF0ZQorICAgICAgICBzZWxmLmNyYXdsX2RlbGF5ID0gY3Jhd2xfZGVsYXkKIAogICAgIGRlZiBydW5UZXN0KHNlbGYpOgogICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudXJsLCB0dXBsZSk6CkBAIC0zNCw2ICszNiwxOCBAQAogICAgICAgICAgICAgYWdlbnQgPSBzZWxmLmFnZW50CiAgICAgICAgIGlmIHNlbGYuZ29vZDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmNyYXdsX2RlbGF5KGFnZW50KSwgc2VsZi5jcmF3bF9kZWxheSkKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBhY3R1YWwgdmFsdWVzIGZvciByZXF1ZXN0IHJhdGUKKyAgICAgICAgICAgIGlmIHNlbGYucmVxdWVzdF9yYXRlIGFuZCBzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkucmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlLnJlcXVlc3RzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCkuc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUuc2Vjb25kcworICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KSwgc2VsZi5yZXF1ZXN0X3JhdGUpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKIApAQCAtNDMsMTUgKzU3LDE3IEBACiB0ZXN0cyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCiAKIGRlZiBSb2JvdFRlc3QoaW5kZXgsIHJvYm90c190eHQsIGdvb2RfdXJscywgYmFkX3VybHMsCi0gICAgICAgICAgICAgIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CisgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksIGFnZW50PSJ0ZXN0X3JvYm90cGFyc2VyIik6CiAKICAgICBsaW5lcyA9IGlvLlN0cmluZ0lPKHJvYm90c190eHQpLnJlYWRsaW5lcygpCiAgICAgcGFyc2VyID0gdXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCiAgICAgcGFyc2VyLnBhcnNlKGxpbmVzKQogICAgIGZvciB1cmwgaW4gZ29vZF91cmxzOgotICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAxLCBhZ2VudCkpCisgICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50LAorICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpKQogICAgIGZvciB1cmwgaW4gYmFkX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDAsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAKICMgRXhhbXBsZXMgZnJvbSBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvd2Mvbm9yb2JvdHMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCkBAIC02NSwxNCArODEsMTggQEAKIAogZ29vZCA9IFsnLycsJy90ZXN0Lmh0bWwnXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy90bXAveHh4JywnL2Zvby5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUKK2NyYXdsX2RlbGF5ID0gTm9uZQogCi1Sb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMi4KIGRvYyA9ICIiIgogIyByb2JvdHMudHh0IGZvciBodHRwOi8vd3d3LmV4YW1wbGUuY29tLwogCiBVc2VyLWFnZW50OiAqCitDcmF3bC1kZWxheTogMQorUmVxdWVzdC1yYXRlOiAzLzE1CiBEaXNhbGxvdzogL2N5YmVyd29ybGQvbWFwLyAjIFRoaXMgaXMgYW4gaW5maW5pdGUgdmlydHVhbCBVUkwgc3BhY2UKIAogIyBDeWJlcm1hcHBlciBrbm93cyB3aGVyZSB0byBnby4KQEAgLTgzLDggKzEwMywxMCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCcsKCdjeWJlcm1hcHBlcicsJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJyldCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJ10KK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgVGhlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVxdWFsIHRvIE5vbmUgc2luY2UgdGhleQorY3Jhd2xfZGVsYXkgPSBOb25lICAgIyBkb24ndCBhcHBseSB0byB0aGUgY3liZXJtYXBwZXIgdXNlciBhZ2VudAogCi1Sb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXkpCiAKICMgMy4KIGRvYyA9ICIiIgpAQCAtOTUsMTQgKzExNywxOCBAQAogCiBnb29kID0gW10KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnLCcvJywnL3RtcC8nXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy1yZmMuaHRtbCAoZmV0Y2hlZCAyMDAyKQogCiAjIDQuCiBkb2MgPSAiIiIKIFVzZXItYWdlbnQ6IGZpZ3RyZWUKK0NyYXdsLWRlbGF5OiAzCitSZXF1ZXN0LXJhdGU6IDkvMzAKIERpc2FsbG93OiAvdG1wCiBEaXNhbGxvdzogL2ElM2NkLmh0bWwKIERpc2FsbG93OiAvYSUyZmIuaHRtbApAQCAtMTE1LDggKzE0MSwxNyBAQAogICAgICAgICcvfmpvZS9pbmRleC5odG1sJwogICAgICAgIF0KIAotUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCAnZmlndHJlZScpCi1Sb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsICdGaWdUcmVlIFJvYm90IGxpYnd3dy1wZXJsLzUuMDQnKQorcmVxdWVzdF9yYXRlID0gbmFtZWR0dXBsZSgncmVxX3JhdGUnLCAncmVxdWVzdHMgc2Vjb25kcycpCityZXF1ZXN0X3JhdGUucmVxdWVzdHMgPSA5CityZXF1ZXN0X3JhdGUuc2Vjb25kcyA9IDMwCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZV9iYWQgPSBOb25lICAjIG5vdCBhY3R1YWxseSB0ZXN0ZWQsIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHBhcnNlIGl0CitjcmF3bF9kZWxheV9iYWQgPSBOb25lICAjIGluIG9yZGVyIHRvIGFjY29tbW9kYXRlIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisKKworUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5LCAnZmlndHJlZScgKQorUm9ib3RUZXN0KDUsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGVfYmFkLCBjcmF3bF9kZWxheV9iYWQsCisgICAgICAgICAgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCiAKICMgNi4KIGRvYyA9ICIiIgpAQCAtMTI1LDE0ICsxNjAsMTggQEAKIERpc2FsbG93OiAvYSUzQ2QuaHRtbAogRGlzYWxsb3c6IC9hL2IuaHRtbAogRGlzYWxsb3c6IC8lN2Vqb2UvaW5kZXguaHRtbAorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvdG1wJyxdICMgWEZBSUw6ICcvYSUyZmIuaHRtbCcKIGJhZCA9IFsnL3RtcC8nLCcvdG1wL2EuaHRtbCcsCiAgICAgICAgJy9hJTNjZC5odG1sJywnL2ElM0NkLmh0bWwnLCIvYS9iLmh0bWwiLAogICAgICAgICcvJTdFam9lL2luZGV4Lmh0bWwnXQorY3Jhd2xfZGVsYXkgPSAzCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIHNpbmNlIHJlcXVlc3QgcmF0ZSBoYXMgaW52YWxpZCBzeW50YXgsIHJldHVybiBOb25lCiAKLVJvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCg2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyBGcm9tIGJ1ZyByZXBvcnQgIzUyMzA0MQogCkBAIC0xNDAsMTIgKzE3OSwxNiBAQAogZG9jID0gIiIiCiBVc2VyLUFnZW50OiAqCiBEaXNhbGxvdzogLy4KK0NyYXdsLWRlbGF5OiBwZWFycwogIiIiCiAKIGdvb2QgPSBbJy9mb28uaHRtbCddCi1iYWQgPSBbXSAjIEJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKK2JhZCA9IFtdICAjIGJ1ZyByZXBvcnQgc2F5cyAiLyIgc2hvdWxkIGJlIGRlbmllZCwgYnV0IHRoYXQgaXMgbm90IGluIHRoZSBSRkMKIAotUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkKQorY3Jhd2xfZGVsYXkgPSBOb25lICAjIHNpbmNlIGNyYXdsIGRlbGF5IGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUKKworUm9ib3RUZXN0KDcsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlKQogCiAjIEZyb20gR29vZ2xlOiBodHRwOi8vd3d3Lmdvb2dsZS5jb20vc3VwcG9ydC93ZWJtYXN0ZXJzL2Jpbi9hbnN3ZXIucHk/aGw9ZW4mYW5zd2VyPTQwMzY0CiAKQEAgLTE1NCwxMiArMTk3LDE1IEBACiBVc2VyLWFnZW50OiBHb29nbGVib3QKIEFsbG93OiAvZm9sZGVyMS9teWZpbGUuaHRtbAogRGlzYWxsb3c6IC9mb2xkZXIxLworUmVxdWVzdC1yYXRlOiB3aGFsZS9iYW5hbmEKICIiIgogCiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQorY3Jhd2xfZGVsYXkgPSBOb25lCityZXF1ZXN0X3JhdGUgPSBOb25lICAjIGludmFsaWQgc3ludGF4LCByZXR1cm4gbm9uZQogCi1Sb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDgsIGRvYywgZ29vZCwgYmFkLCBjcmF3bF9kZWxheSwgcmVxdWVzdF9yYXRlLCBhZ2VudD0iR29vZ2xlYm90IikKIAogIyA5LiAgVGhpcyBmaWxlIGlzIGluY29ycmVjdCBiZWNhdXNlICJHb29nbGVib3QiIGlzIGEgc3Vic3RyaW5nIG9mCiAjICAgICAiR29vZ2xlYm90LU1vYmlsZSIsIHNvIHRlc3QgMTAgd29ya3MganVzdCBsaWtlIHRlc3QgOS4KQEAgLTE3NCwxMiArMjIwLDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorUm9ib3RUZXN0KDksIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEwLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAjIDExLiAgR2V0IHRoZSBvcmRlciBjb3JyZWN0LgogZG9jID0gIiIiCkBAIC0xOTMsMTIgKzIzOSwxMiBAQAogZ29vZCA9IFtdCiBiYWQgPSBbJy9zb21ldGhpbmcuanBnJ10KIAotUm9ib3RUZXN0KDExLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90IikKIAogZ29vZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogYmFkID0gW10KIAotUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQogCiAKICMgMTMuICBHb29nbGUgYWxzbyBnb3QgdGhlIG9yZGVyIHdyb25nIGluICM4LiAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUKQEAgLTIxMiw3ICsyNTgsNyBAQAogZ29vZCA9IFsnL2ZvbGRlcjEvbXlmaWxlLmh0bWwnXQogYmFkID0gWycvZm9sZGVyMS9hbm90aGVyZmlsZS5odG1sJ10KIAotUm9ib3RUZXN0KDEzLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Imdvb2dsZWJvdCIpCitSb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iZ29vZ2xlYm90IikKIAogCiAjIDE0LiBGb3IgaXNzdWUgIzYzMjUgKHF1ZXJ5IHN0cmluZyBzdXBwb3J0KQpAQCAtMjI0LDcgKzI3MCw3IEBACiBnb29kID0gWycvc29tZS9wYXRoJ10KIGJhZCA9IFsnL3NvbWUvcGF0aD9uYW1lPXZhbHVlJ10KIAotUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNCwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTUuIEZvciBpc3N1ZSAjNDEwOCAob2JleSBmaXJzdCAqIGVudHJ5KQogZG9jID0gIiIiCkBAIC0yMzgsNyArMjg0LDcgQEAKIGdvb2QgPSBbJy9hbm90aGVyL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoJ10KIAotUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxNSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUpCiAKICMgMTYuIEVtcHR5IHF1ZXJ5IChpc3N1ZSAjMTc0MDMpLiBOb3JtYWxpemluZyB0aGUgdXJsIGZpcnN0LgogZG9jID0gIiIiCkBAIC0yNTAsNyArMjk2LDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGg/J10KIGJhZCA9IFsnL2Fub3RoZXIvcGF0aD8nXQogCi1Sb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE2LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogCiBjbGFzcyBSb2JvdEhhbmRsZXIoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5IGIvTGliL3Rlc3QvdGVzdF9zY2hlZC5weQppbmRleCBmZThlNzg1Li5mODZmNTk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NoZWQucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgc2NoZWQKIGltcG9ydCB0aW1lCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc2VjcmV0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY1Y2YwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5CkBAIC0wLDAgKzEsMTIzIEBACisiIiJUZXN0IHRoZSBzZWNyZXRzIG1vZHVsZS4KKworQXMgbW9zdCBvZiB0aGUgZnVuY3Rpb25zIGluIHNlY3JldHMgYXJlIHRoaW4gd3JhcHBlcnMgYXJvdW5kIGZ1bmN0aW9ucworZGVmaW5lZCBlbHNld2hlcmUsIHdlIGRvbid0IG5lZWQgdG8gdGVzdCB0aGVtIGV4aGF1c3RpdmVseS4KKyIiIgorCisKK2ltcG9ydCBzZWNyZXRzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJpbmcKKworCisjID09PSBVbml0IHRlc3RzID09PQorCitjbGFzcyBDb21wYXJlX0RpZ2VzdF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0IGZ1bmN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfZXF1YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wYXJlX2RpZ2VzdCBmdW5jdGlvbmFsaXR5IHdpdGggZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgZm9yIHMgaW4gKCJhIiwgImJjZCIsICJ4eXoxMjMiKToKKyAgICAgICAgICAgIGEgPSBzKjEwMAorICAgICAgICAgICAgYiA9IHMqMTAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEuZW5jb2RlKCd1dGYtOCcpLCBiLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICBkZWYgdGVzdF91bmVxdWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29tcGFyZV9kaWdlc3QgZnVuY3Rpb25hbGl0eSB3aXRoIHVuZXF1YWwgKGJ5dGUvdGV4dCkgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoYiJhYmMiLCBiImFiY2QiKSkKKyAgICAgICAgZm9yIHMgaW4gKCJ4IiwgIm1uIiwgImExYjJjMyIpOgorICAgICAgICAgICAgYSA9IHMqMTAwICsgInEiCisgICAgICAgICAgICBiID0gcyoxMDAgKyAiayIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLCBiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChhLmVuY29kZSgndXRmLTgnKSwgYi5lbmNvZGUoJ3V0Zi04JykpKQorCisgICAgZGVmIHRlc3RfYmFkX3R5cGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjb21wYXJlX2RpZ2VzdCByYWlzZXMgd2l0aCBtaXhlZCB0eXBlcy4KKyAgICAgICAgYSA9ICdhYmNkZScKKyAgICAgICAgYiA9IGEuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGEsIHN0cikKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYiwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VjcmV0cy5jb21wYXJlX2RpZ2VzdCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0LCBiLCBhKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgY29tcGFyZV9kaWdlc3QgcmV0dXJucyBhIGJvb2wuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAiYWJjIiksIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KCJhYmMiLCAieHl6IiksIGJvb2wpCisKKworY2xhc3MgUmFuZG9tX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHdyYXBwZXJzIGFyb3VuZCBTeXN0ZW1SYW5kb20gbWV0aG9kcy4iIiIKKworICAgIGRlZiB0ZXN0X3JhbmRiaXRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJpdHMuCisgICAgICAgIGVycm1zZyA9ICJyYW5kYml0cyglZCkgcmV0dXJuZWQgJWQiCisgICAgICAgIGZvciBudW1iaXRzIGluICgzLCAxMiwgMzApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICAgICAgbiA9IHNlY3JldHMucmFuZGJpdHMobnVtYml0cykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBuIDwgMioqbnVtYml0cywgZXJybXNnICUgKG51bWJpdHMsIG4pKQorCisgICAgZGVmIHRlc3RfY2hvaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2hvaWNlLgorICAgICAgICBpdGVtcyA9IFsxLCAyLCA0LCA4LCAxNiwgMzIsIDY0XQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0cy5jaG9pY2UoaXRlbXMpIGluIGl0ZW1zKQorCisgICAgZGVmIHRlc3RfcmFuZGJlbG93KHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZGJlbG93LgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCAxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlY3JldHMucmFuZGJlbG93KGkpLCByYW5nZShpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VjcmV0cy5yYW5kYmVsb3csIDApCisKKworY2xhc3MgVG9rZW5fVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdG9rZW4gZnVuY3Rpb25zLiIiIgorCisgICAgZGVmIHRlc3RfdG9rZW5fZGVmYXVsdHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRva2VuXyogZnVuY3Rpb25zIGhhbmRsZSBkZWZhdWx0IHNpemUgY29ycmVjdGx5LgorICAgICAgICBmb3IgZnVuYyBpbiAoc2VjcmV0cy50b2tlbl9ieXRlcywgc2VjcmV0cy50b2tlbl9oZXgsCisgICAgICAgICAgICAgICAgICAgICBzZWNyZXRzLnRva2VuX3VybHNhZmUpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBuYW1lID0gZnVuYy5fX25hbWVfXworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbm8gYXJndW1lbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoTm9uZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBOb25lIiAlIG5hbWUpCisgICAgICAgIHNpemUgPSBzZWNyZXRzLkRFRkFVTFRfRU5UUk9QWQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKE5vbmUpKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VjcmV0cy50b2tlbl9oZXgoTm9uZSkpLCAyKnNpemUpCisKKyAgICBkZWYgdGVzdF90b2tlbl9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2J5dGVzLgorICAgICAgICBmb3IgbiBpbiAoMSwgOCwgMTcsIDEwMCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNyZXRzLnRva2VuX2J5dGVzKG4pLCBieXRlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2J5dGVzKG4pKSwgbikKKworICAgIGRlZiB0ZXN0X3Rva2VuX2hleChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRva2VuX2hleC4KKyAgICAgICAgZm9yIG4gaW4gKDEsIDEyLCAyNSwgOTApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzID0gc2VjcmV0cy50b2tlbl9oZXgobikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAyKm4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIHN0cmluZy5oZXhkaWdpdHMgZm9yIGMgaW4gcykpCisKKyAgICBkZWYgdGVzdF90b2tlbl91cmxzYWZlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5fdXJsc2FmZS4KKyAgICAgICAgbGVnYWwgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnLV8nCisgICAgICAgIGZvciBuIGluICgxLCAxMSwgMjgsIDc2KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgcyA9IHNlY3JldHMudG9rZW5fdXJsc2FmZShuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChjIGluIGxlZ2FsIGZvciBjIGluIHMpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDFhNDllZGYuLjQ5YWJmYjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC02LDEwICs2LDExIEBACiBpbXBvcnQgY29weQogaW1wb3J0IHBpY2tsZQogZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZSwgc2h1ZmZsZQotaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCBzdHJpbmcKIAogY2xhc3MgUGFzc1RocnUoRXhjZXB0aW9uKToKICAgICBwYXNzCkBAIC03MTQsNiArNzE1LDI4IEBACiAgICAgICAgICAgICBhZGRoYXNodmFsdWUoaGFzaChmcm96ZW5zZXQoW2UgZm9yIGUsIG0gaW4gZWxlbW1hc2tzIGlmIG0maV0pKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaGFzaHZhbHVlcyksIDIqKm4pCiAKKyAgICAgICAgZGVmIGxldHRlcl9yYW5nZShuKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuYXNjaWlfbGV0dGVyc1s6bl0KKworICAgICAgICBkZWYgemZfcmFuZ2Uobik6CisgICAgICAgICAgICAjIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NldC10aGVvcmV0aWNfZGVmaW5pdGlvbl9vZl9uYXR1cmFsX251bWJlcnMKKyAgICAgICAgICAgIG51bXMgPSBbZnJvemVuc2V0KCldCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuLTEpOgorICAgICAgICAgICAgICAgIG51bSA9IGZyb3plbnNldChudW1zKQorICAgICAgICAgICAgICAgIG51bXMuYXBwZW5kKG51bSkKKyAgICAgICAgICAgIHJldHVybiBudW1zWzpuXQorCisgICAgICAgIGRlZiBwb3dlcnNldChzKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzKSsxKToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIG1hcChmcm96ZW5zZXQsIGl0ZXJ0b29scy5jb21iaW5hdGlvbnMocywgaSkpCisKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMTgpOgorICAgICAgICAgICAgdCA9IDIgKiogbgorICAgICAgICAgICAgbWFzayA9IHQgLSAxCisgICAgICAgICAgICBmb3IgbnVtcyBpbiAocmFuZ2UsIGxldHRlcl9yYW5nZSwgemZfcmFuZ2UpOgorICAgICAgICAgICAgICAgIHUgPSBsZW4oe2ggJiBtYXNrIGZvciBoIGluIG1hcChoYXNoLCBwb3dlcnNldChudW1zKG4pKSl9KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcig0KnUsIHQpCisKIGNsYXNzIEZyb3plblNldFN1YmNsYXNzKGZyb3plbnNldCk6CiAgICAgcGFzcwogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CmluZGV4IDFiODBmZjAuLmFiNDJlZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CkBAIC0yMiwyOSArMjIsNiBAQAogICAgIF90ZXN0Y2FwaSA9IE5vbmUKIAogCi1jbGFzcyBIYW5kbGVyQkNhbGxlZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1kZWYgZXhpdF9zdWJwcm9jZXNzKCk6Ci0gICAgIiIiVXNlIG9zLl9leGl0KDApIHRvIGV4aXQgdGhlIGN1cnJlbnQgc3VicHJvY2Vzcy4KLQotICAgIE90aGVyd2lzZSwgdGhlIHRlc3QgY2F0Y2hlcyB0aGUgU3lzdGVtRXhpdCBhbmQgY29udGludWVzIGV4ZWN1dGluZwotICAgIGluIHBhcmFsbGVsIHdpdGggdGhlIG9yaWdpbmFsIHRlc3QsIHNvIHlvdSB3aW5kIHVwIHdpdGggYW4KLSAgICBleHBvbmVudGlhbCBudW1iZXIgb2YgdGVzdHMgcnVubmluZyBjb25jdXJyZW50bHkuCi0gICAgIiIiCi0gICAgb3MuX2V4aXQoMCkKLQotCi1kZWYgaWdub3JpbmdfZWludHIoX19mdW5jLCAqYXJncywgKiprd2FyZ3MpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIF9fZnVuYygqYXJncywgKiprd2FyZ3MpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIHJldHVybiBOb25lCi0KLQogY2xhc3MgR2VuZXJpY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEB1bml0dGVzdC5za2lwSWYodGhyZWFkaW5nIGlzIE5vbmUsICJ0ZXN0IG5lZWRzIHRocmVhZGluZyBtb2R1bGUiKQpAQCAtNjMsMTQ1ICs0MCw2IEBACiAKIAogQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKLWNsYXNzIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBNQVhfRFVSQVRJT04gPSAyMCAgICMgRW50aXJlIHRlc3Qgc2hvdWxkIGxhc3QgYXQgbW9zdCAyMCBzZWMuCi0KLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudXNpbmdfZ2MgPSBnYy5pc2VuYWJsZWQoKQotICAgICAgICBnYy5kaXNhYmxlKCkKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi51c2luZ19nYzoKLSAgICAgICAgICAgIGdjLmVuYWJsZSgpCi0KLSAgICBkZWYgZm9ybWF0X2ZyYW1lKHNlbGYsIGZyYW1lLCBsaW1pdD1Ob25lKToKLSAgICAgICAgcmV0dXJuICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9zdGFjayhmcmFtZSwgbGltaXQ9bGltaXQpKQotCi0gICAgZGVmIGhhbmRsZXJBKHNlbGYsIHNpZ251bSwgZnJhbWUpOgotICAgICAgICBzZWxmLmFfY2FsbGVkID0gVHJ1ZQotCi0gICAgZGVmIGhhbmRsZXJCKHNlbGYsIHNpZ251bSwgZnJhbWUpOgotICAgICAgICBzZWxmLmJfY2FsbGVkID0gVHJ1ZQotICAgICAgICByYWlzZSBIYW5kbGVyQkNhbGxlZChzaWdudW0sIHNlbGYuZm9ybWF0X2ZyYW1lKGZyYW1lKSkKLQotICAgIGRlZiB3YWl0KHNlbGYsIGNoaWxkKToKLSAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgdG8gZmluaXNoLCBpZ25vcmluZyBFSU5UUi4iIiIKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBjaGlsZC53YWl0KCkKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UKLQotICAgIGRlZiBydW5fdGVzdChzZWxmKToKLSAgICAgICAgIyBJbnN0YWxsIGhhbmRsZXJzLiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gYSBzdWItcHJvY2Vzcywgc28gd2UKLSAgICAgICAgIyBkb24ndCB3b3JyeSBhYm91dCByZS1zZXR0aW5nIHRoZSBkZWZhdWx0IGhhbmRsZXJzLgotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuaGFuZGxlckEpCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNlbGYuaGFuZGxlckIpCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjIsIHNpZ25hbC5TSUdfSUdOKQotICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKLQotICAgICAgICAjIFZhcmlhYmxlcyB0aGUgc2lnbmFscyB3aWxsIG1vZGlmeToKLSAgICAgICAgc2VsZi5hX2NhbGxlZCA9IEZhbHNlCi0gICAgICAgIHNlbGYuYl9jYWxsZWQgPSBGYWxzZQotCi0gICAgICAgICMgTGV0IHRoZSBzdWItcHJvY2Vzc2VzIGtub3cgd2hvIHRvIHNlbmQgc2lnbmFscyB0by4KLSAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKLQotICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctSFVQJywgc3RyKHBpZCldKQotICAgICAgICBpZiBjaGlsZDoKLSAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFfY2FsbGVkOgotICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkgICMgR2l2ZSB0aGUgc2lnbmFsIHRpbWUgdG8gYmUgZGVsaXZlcmVkLgotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hX2NhbGxlZCkKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmJfY2FsbGVkKQotICAgICAgICBzZWxmLmFfY2FsbGVkID0gRmFsc2UKLQotICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2lnbmFsIGlzbid0IGRlbGl2ZXJlZCB3aGlsZSB0aGUgcHJldmlvdXMKLSAgICAgICAgIyBQb3BlbiBvYmplY3QgaXMgYmVpbmcgZGVzdHJveWVkLCBiZWNhdXNlIF9fZGVsX18gc3dhbGxvd3MKLSAgICAgICAgIyBleGNlcHRpb25zLgotICAgICAgICBkZWwgY2hpbGQKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY2hpbGQgPSBzdWJwcm9jZXNzLlBvcGVuKFsna2lsbCcsICctVVNSMScsIHN0cihwaWQpXSkKLSAgICAgICAgICAgICMgVGhpcyB3YWl0IHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgc2lnbmFsJ3MgZXhjZXB0aW9uLgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKQotICAgICAgICAgICAgdGltZS5zbGVlcCgxKSAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBiZSBkZWxpdmVyZWQuCi0gICAgICAgICAgICBzZWxmLmZhaWwoJ0hhbmRsZXJCQ2FsbGVkIGV4Y2VwdGlvbiBub3QgcmFpc2VkJykKLSAgICAgICAgZXhjZXB0IEhhbmRsZXJCQ2FsbGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYl9jYWxsZWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYV9jYWxsZWQpCi0KLSAgICAgICAgY2hpbGQgPSBpZ25vcmluZ19laW50cihzdWJwcm9jZXNzLlBvcGVuLCBbJ2tpbGwnLCAnLVVTUjInLCBzdHIocGlkKV0pCi0gICAgICAgIGlmIGNoaWxkOgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKSAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW4uCi0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCi0gICAgICAgICAgICAjIFRoZSByYWNlIGNvbmRpdGlvbiBpbiBwYXVzZSBkb2Vzbid0IG1hdHRlciBpbiB0aGlzIGNhc2UsCi0gICAgICAgICAgICAjIHNpbmNlIGFsYXJtIGlzIGdvaW5nIHRvIHJhaXNlIGEgS2V5Ym9hcmRFeGNlcHRpb24sIHdoaWNoCi0gICAgICAgICAgICAjIHdpbGwgc2tpcCB0aGUgY2FsbC4KLSAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCi0gICAgICAgICAgICAjIEJ1dCBpZiBhbm90aGVyIHNpZ25hbCBhcnJpdmVzIGJlZm9yZSB0aGUgYWxhcm0sIHBhdXNlCi0gICAgICAgICAgICAjIG1heSByZXR1cm4gZWFybHkuCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDEpCi0gICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgc2VsZi5mYWlsKCJTb21lIG90aGVyIGV4Y2VwdGlvbiB3b2tlIHVzIGZyb20gcGF1c2U6ICVzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbCgicGF1c2UgcmV0dXJuZWQgb2YgaXRzIG93biBhY2NvcmQsIGFuZCB0aGUgc2lnbmFsIgotICAgICAgICAgICAgICAgICAgICAgICIgZGlkbid0IGFycml2ZSBhZnRlciBhbm90aGVyIHNlY29uZC4iKQotCi0gICAgIyBJc3N1ZSAzODY0LCB1bmtub3duIGlmIHRoaXMgYWZmZWN0cyBlYXJsaWVyIHZlcnNpb25zIG9mIGZyZWVic2QgYWxzbwotICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtPT0nZnJlZWJzZDYnLAotICAgICAgICAnaW50ZXIgcHJvY2VzcyBzaWduYWxzIG5vdCByZWxpYWJsZSAoZG8gbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSAnCi0gICAgICAgICdvbiBmcmVlYnNkNicpCi0gICAgZGVmIHRlc3RfbWFpbihzZWxmKToKLSAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIHNwYXducyBhIGNoaWxkIHByb2Nlc3MgdG8gaW5zdWxhdGUgdGhlIG1haW4KLSAgICAgICAgIyB0ZXN0LXJ1bm5pbmcgcHJvY2VzcyBmcm9tIGFsbCB0aGUgc2lnbmFscy4gSXQgdGhlbgotICAgICAgICAjIGNvbW11bmljYXRlcyB3aXRoIHRoYXQgY2hpbGQgcHJvY2VzcyBvdmVyIGEgcGlwZSBhbmQKLSAgICAgICAgIyByZS1yYWlzZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGV4Y2VwdGlvbnMgdGhlIGNoaWxkCi0gICAgICAgICMgcmFpc2VzLiBUaGUgcmVhbCB3b3JrIGhhcHBlbnMgaW4gc2VsZi5ydW5fdGVzdCgpLgotICAgICAgICBvc19kb25lX3IsIG9zX2RvbmVfdyA9IG9zLnBpcGUoKQotICAgICAgICB3aXRoIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfciwgJ3JiJykpIGFzIGRvbmVfciwgXAotICAgICAgICAgICAgIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfdywgJ3diJykpIGFzIGRvbmVfdzoKLSAgICAgICAgICAgIGNoaWxkID0gb3MuZm9yaygpCi0gICAgICAgICAgICBpZiBjaGlsZCA9PSAwOgotICAgICAgICAgICAgICAgICMgSW4gdGhlIGNoaWxkIHByb2Nlc3M7IHJ1biB0aGUgdGVzdCBhbmQgcmVwb3J0IHJlc3VsdHMKLSAgICAgICAgICAgICAgICAjIHRocm91Z2ggdGhlIHBpcGUuCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBkb25lX3IuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAjIEhhdmUgdG8gY2xvc2UgZG9uZV93IGFnYWluIGhlcmUgYmVjYXVzZQotICAgICAgICAgICAgICAgICAgICAjIGV4aXRfc3VicHJvY2VzcygpIHdpbGwgc2tpcCB0aGUgZW5jbG9zaW5nIHdpdGggYmxvY2suCi0gICAgICAgICAgICAgICAgICAgIHdpdGggY2xvc2luZyhkb25lX3cpOgotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX3Rlc3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKHRyYWNlYmFjay5mb3JtYXRfZXhjKCksIGRvbmVfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXAoTm9uZSwgZG9uZV93KQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1VoIG9oLCByYWlzZWQgZnJvbSBwaWNrbGUuJykKLSAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCi0gICAgICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICAgICAgZXhpdF9zdWJwcm9jZXNzKCkKLQotICAgICAgICAgICAgZG9uZV93LmNsb3NlKCkKLSAgICAgICAgICAgICMgQmxvY2sgZm9yIHVwIHRvIE1BWF9EVVJBVElPTiBzZWNvbmRzIGZvciB0aGUgdGVzdCB0byBmaW5pc2guCi0gICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbZG9uZV9yXSwgW10sIFtdLCBzZWxmLk1BWF9EVVJBVElPTikKLSAgICAgICAgICAgIGlmIGRvbmVfciBpbiByOgotICAgICAgICAgICAgICAgIHRiID0gcGlja2xlLmxvYWQoZG9uZV9yKQotICAgICAgICAgICAgICAgIGlmIHRiOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwodGIpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG9zLmtpbGwoY2hpbGQsIHNpZ25hbC5TSUdLSUxMKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnVGVzdCBkZWFkbG9ja2VkIGFmdGVyICVkIHNlY29uZHMuJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTUFYX0RVUkFUSU9OKQotCi0KLUB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCiBjbGFzcyBQb3NpeFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdHJpdmlhbF9zaWduYWxfaGFuZGxlcihzZWxmLCAqYXJncyk6CiAgICAgICAgIHBhc3MKQEAgLTIyNCw2ICs2MiwxNSBAQAogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIGh1cCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdIVVApLCBodXApCiAKKyAgICAjIElzc3VlIDM4NjQsIHVua25vd24gaWYgdGhpcyBhZmZlY3RzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZnJlZWJzZCBhbHNvCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCisgICAgICAgICdpbnRlciBwcm9jZXNzIHNpZ25hbHMgbm90IHJlbGlhYmxlIChkbyBub3QgbWl4IHdlbGwgd2l0aCB0aHJlYWRpbmcpICcKKyAgICAgICAgJ29uIGZyZWVic2Q2JykKKyAgICBkZWYgdGVzdF9pbnRlcnByb2Nlc3Nfc2lnbmFsKHNlbGYpOgorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3NpZ25hbGludGVycHJvY3Rlc3Rlci5weScpCisgICAgICAgIGFzc2VydF9weXRob25fb2soc2NyaXB0KQorCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luZG93cyBzcGVjaWZpYyIpCiBjbGFzcyBXaW5kb3dzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CmluZGV4IGRhMjBhM2QuLmY2OTg5MjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBkZWYgdGVzdF9pbml0X3BhdGhpbmZvKHNlbGYpOgogICAgICAgICBkaXJfc2V0ID0gc2l0ZS5faW5pdF9wYXRoaW5mbygpCiAgICAgICAgIGZvciBlbnRyeSBpbiBbc2l0ZS5tYWtlcGF0aChwYXRoKVsxXSBmb3IgcGF0aCBpbiBzeXMucGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBhbmQgb3MucGF0aC5pc2RpcihwYXRoKV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmV4aXN0cyhwYXRoKV06CiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVudHJ5LCBkaXJfc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZnJvbSBzeXMucGF0aCBub3QgZm91bmQgaW4gc2V0IHJldHVybmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5IF9pbml0X3BhdGhpbmZvKCk6ICVzIiAlIChlbnRyeSwgZGlyX3NldCkpCkBAIC0yNDMsMTMgKzI0MywxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDIpCiAgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJy9MaWJyYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzFdLCB3YW50ZWQpCiAgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKICAgICAgICAgICAgICMgT1MgWCBub24tZnJhbXdld29yayBidWlsZHMsIExpbnV4LCBGcmVlQlNELCBldGMKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAxKQotICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdweXRob24nICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbiVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgd2FudGVkKQogICAgICAgICBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zbXRwZC5weSBiL0xpYi90ZXN0L3Rlc3Rfc210cGQucHkKaW5kZXggODhkYmZkZi4uM2VlYmU5NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zbXRwZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5CkBAIC01MywxMCArNTMsNiBAQAogICAgICAgICB3cml0ZV9saW5lKGInREFUQScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHdyaXRlX2xpbmUsIGInc3BhbVxyXG4uXHJcbicpCiAKLSAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9kZWZhdWx0X3dhcm5zKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQotCiAgICAgZGVmIHRlc3RfZGVjb2RlX2RhdGFfYW5kX2VuYWJsZV9TTVRQVVRGOF9yYWlzZXMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAogICAgICAgICAgICAgVmFsdWVFcnJvciwKQEAgLTEwOCwxMCArMTA0LDkgQEAKICAgICAgICAgICAgICAiIiIpKQogCiAgICAgZGVmIHRlc3RfcHJvY2Vzc19tZXNzYWdlX3dpdGhfZGVjb2RlX2RhdGFfZmFsc2Uoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLkRlYnVnZ2luZ1NlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gc210cGQuRGVidWdnaW5nU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSkKICAgICAgICAgY29ubiwgYWRkciA9IHNlcnZlci5hY2NlcHQoKQotICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkcikKICAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIHM6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZGF0YShjaGFubmVsLCBiJ0Zyb206IHRlc3RcblxuaFx4YzNceGE5bGxvXHhmZlxuJykKICAgICAgICAgc3Rkb3V0ID0gcy5nZXR2YWx1ZSgpCkBAIC0xNzUsMTMgKzE3MCwxMSBAQAogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydC5JUFY2X0VOQUJMRUQsICJJUHY2IG5vdCBlbmFibGVkIikKICAgICBkZWYgdGVzdF9zb2NrZXRfdXNlc19JUHY2KHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1R2NiwgMCksIChzdXBwb3J0LkhPU1QsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1R2NiwgMCksIChzdXBwb3J0LkhPU1QsIDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zb2NrZXQuZmFtaWx5LCBzb2NrZXQuQUZfSU5FVDYpCiAKICAgICBkZWYgdGVzdF9zb2NrZXRfdXNlc19JUHY0KHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoc3VwcG9ydC5IT1NUdjYsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5TTVRQU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoc3VwcG9ydC5IT1NUdjYsIDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zb2NrZXQuZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKIAogCkBAIC0yMDQsMTggKzE5NywxOCBAQAogICAgICAgICBjaGFubmVsLmhhbmRsZV9yZWFkKCkKIAogICAgIGRlZiB0ZXN0X3BhcmFtc19yZWplY3RlZChzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidNQUlMIGZyb206IDxmb29AZXhhbXBsZS5jb20+IHNpemU9MjAnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidSQ1BUIHRvOiA8Zm9vQGV4YW1wbGUuY29tPiBmb289YmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFubmVsLnNvY2tldC5sYXN0LCBzZWxmLmVycm9yX3Jlc3BvbnNlKQogCiAgICAgZGVmIHRlc3Rfbm90aGluZ19hY2NlcHRlZChzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidNQUlMIGZyb206IDxmb29AZXhhbXBsZS5jb20+IHNpemU9MjAnKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidSQ1BUIHRvOiA8Zm9vQGV4YW1wbGUuY29tPicpCkBAIC0yNTcsOSArMjUwLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFubmVsLnNvY2tldC5sYXN0LCBiJzI1MCBPS1xyXG4nKQogCiAgICAgZGVmIHRlc3Rfd2l0aF9kZWNvZGVfZGF0YV9mYWxzZShzZWxmKToKLSAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApLCBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICBzZWxmLndyaXRlX2xpbmUoY2hhbm5lbCwgYidFSExPIGV4YW1wbGUnKQogICAgICAgICBmb3IgbGluZSBpbiBbCiAgICAgICAgICAgICBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCBTTVRQVVRGOCcsCkBAIC03NjUsMTMgKzc1OCw2IEBACiAgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIERlcHJlY2F0aW9uV2FybmluZykpOgogICAgICAgICAgICAgc2VsZi5jaGFubmVsLl9TTVRQQ2hhbm5lbF9fYWRkciA9ICdzcGFtJwogCi0gICAgZGVmIHRlc3RfZGVjb2RlX2RhdGFfZGVmYXVsdF93YXJuaW5nKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlcnZlciA9IER1bW15U2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSkKLSAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQotCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzdXBwb3J0LklQVjZfRU5BQkxFRCwgIklQdjYgbm90IGVuYWJsZWQiKQogY2xhc3MgU01UUERDaGFubmVsSVB2NlRlc3QoU01UUERDaGFubmVsVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtODQ1LDEyICs4MzEsOSBAQAogICAgICAgICBzbXRwZC5zb2NrZXQgPSBhc3luY29yZS5zb2NrZXQgPSBtb2NrX3NvY2tldAogICAgICAgICBzZWxmLm9sZF9kZWJ1Z3N0cmVhbSA9IHNtdHBkLkRFQlVHU1RSRUFNCiAgICAgICAgIHNlbGYuZGVidWcgPSBzbXRwZC5ERUJVR1NUUkVBTSA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgIyBTZXQgZGVjb2RlX2RhdGEgdG8gRmFsc2UKLSAgICAgICAgc2VsZi5jaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VsZi5zZXJ2ZXIsIGNvbm4sIGFkZHIsCi0gICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlbGYuY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlbGYuc2VydmVyLCBjb25uLCBhZGRyKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoKQpAQCAtMTAxNSw1ICs5OTgsMTYgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGVfbGluZShiJ3Rlc3RcclxuLicpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2hhbm5lbC5zb2NrZXQubGFzdFswOjNdLCBiJzI1MCcpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsKKyAgICAgICAgICAgICJwcm9ncmFtIiwgIkRldm51bGwiLCAiREVCVUdTVFJFQU0iLCAiTkVXTElORSIsICJDT01NQVNQQUNFIiwKKyAgICAgICAgICAgICJEQVRBX1NJWkVfREVGQVVMVCIsICJ1c2FnZSIsICJPcHRpb25zIiwgInBhcnNlYXJncyIsCisKKyAgICAgICAgfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBzbXRwZCwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQppbmRleCBjMTUxYTUwLi5mYWFjZDYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMTMsNyArMTMsNiBAQAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgYXJyYXkKLWltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IGNvbnRleHRsaWIKIGZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKIGltcG9ydCBzaWduYWwKQEAgLTExNjEsNiArMTE2MCwxNyBAQAogICAgICAgICBzb2NrLmNsb3NlKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc29jay5zZW5kLCBiInNwYW0iKQogCisgICAgZGVmIHRlc3RDbG9zZUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzb2NrZXQuc29ja2V0KGZpbGVubz1zb2NrLmZpbGVubygpKS5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgICAgICAjIFdpbnNvY2sgYXBwYXJlbnRseSByYWlzZXMgRU5PVFNPQ0sKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXJyLmVycm5vLCAoZXJybm8uRUJBREYsIGVycm5vLkVOT1RTT0NLKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2xvc2UoKSBzaG91bGQgcmFpc2UgRUJBREYvRU5PVFNPQ0siKQorCiAgICAgZGVmIHRlc3ROZXdBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3RpbmcgLmZhbWlseSwgLnR5cGUgYW5kIC5wcm90b2NvbAogCkBAIC0xMjA3LDYgKzEyMTcsMjIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5pb2N0bCwgLTEsIE5vbmUpCiAgICAgICAgIHMuaW9jdGwoc29ja2V0LlNJT19LRUVQQUxJVkVfVkFMUywgKDEsIDEwMCwgMTAwKSkKIAorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwgIldpbmRvd3Mgc3BlY2lmaWMiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc29ja2V0LCAnU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdMb29wYmFjayBmYXN0IHBhdGggc3VwcG9ydCByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0JykKKyAgICBkZWYgdGVzdF9zaW9fbG9vcGJhY2tfZmFzdF9wYXRoKHNlbGYpOgorICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzLmlvY3RsKHNvY2tldC5TSU9fTE9PUEJBQ0tfRkFTVF9QQVRILCBUcnVlKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBXU0FFT1BOT1RTVVBQID0gMTAwNDUKKyAgICAgICAgICAgIGlmIGV4Yy53aW5lcnJvciA9PSBXU0FFT1BOT1RTVVBQOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNJT19MT09QQkFDS19GQVNUX1BBVEggaXMgZGVmaW5lZCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvZXNuJ3QgaW1wbGVtZW50ZWQgaW4gdGhpcyBXaW5kb3dzIHZlcnNpb24iKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLmlvY3RsLCBzb2NrZXQuU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCwgTm9uZSkKKwogICAgIGRlZiB0ZXN0R2V0YWRkcmluZm8oc2VsZik6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbygnbG9jYWxob3N0JywgODApCkBAIC0yODIzLDYgKzI4NDksNyBAQAogICAgICAgICAgICAgbmJ5dGVzID0gc2VsZi5zZW5kbXNnVG9TZXJ2ZXIoW21zZ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmJ5dGVzLCBsZW4obXNnKSkKIAorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iLCAic2VlIGlzc3VlICMyNDcyNSIpCiAgICAgZGVmIHRlc3RGRFBhc3NFbXB0eShzZWxmKToKICAgICAgICAgIyBUcnkgdG8gcGFzcyBhbiBlbXB0eSBGRCBhcnJheS4gIENhbiByZWNlaXZlIGVpdGhlciBubyBhcnJheQogICAgICAgICAjIG9yIGFuIGVtcHR5IGFycmF5LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkgYi9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weQppbmRleCAwZDBmODZmLi4zZjRkZmExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weQpAQCAtMywxMiArMywxMSBAQAogIiIiCiAKIGltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgaW8KIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNpZ25hbAogaW1wb3J0IHNvY2tldAotaW1wb3J0IHNlbGVjdAotaW1wb3J0IGVycm5vCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHNvY2tldHNlcnZlcgpAQCAtNDYsNyArNDUsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidGltZWQgb3V0IG9uICVyIiAlIChzb2NrLCkpCiAKLWlmIEhBVkVfVU5JWF9TT0NLRVRTOgoraWYgSEFWRV9VTklYX1NPQ0tFVFMgYW5kIEhBVkVfRk9SS0lORzoKICAgICBjbGFzcyBGb3JraW5nVW5peFN0cmVhbVNlcnZlcihzb2NrZXRzZXJ2ZXIuRm9ya2luZ01peEluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5Vbml4U3RyZWFtU2VydmVyKToKICAgICAgICAgcGFzcwpAQCAtNTgsNiArNTcsNyBAQAogCiBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogZGVmIHNpbXBsZV9zdWJwcm9jZXNzKHRlc3RjYXNlKToKKyAgICAiIiJUZXN0cyB0aGF0IGEgY3VzdG9tIGNoaWxkIHByb2Nlc3MgaXMgbm90IHdhaXRlZCBvbiAoSXNzdWUgMTU0MDM4NikiIiIKICAgICBwaWQgPSBvcy5mb3JrKCkKICAgICBpZiBwaWQgPT0gMDoKICAgICAgICAgIyBEb24ndCByYWlzZSBhbiBleGNlcHRpb247IGl0IHdvdWxkIGJlIGNhdWdodCBieSB0aGUgdGVzdCBoYXJuZXNzLgpAQCAtMTAzLDcgKzEwMyw2IEBACiAgICAgICAgIGNsYXNzIE15U2VydmVyKHN2cmNscyk6CiAgICAgICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKLSAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCiAgICAgICAgICAgICAgICAgcmFpc2UKIAogICAgICAgICBjbGFzcyBNeUhhbmRsZXIoaGRscmJhc2UpOgpAQCAtMjc5LDYgKzI3OCwxODIgQEAKICAgICAgICAgICAgICAgICBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpCiAKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXIoc2VsZik6CisgICAgICAgIHdpdGggc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgc2VydmVyLnNvY2tldC5maWxlbm8oKSkKKworCitjbGFzcyBFcnJvckhhbmRsZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIHNlcnZlcnMgcGFzcyBub3JtYWwgZXhjZXB0aW9ucyBmcm9tIHRoZSBoYW5kbGVyIHRvCisgICAgaGFuZGxlX2Vycm9yKCksIGFuZCB0aGF0IGV4aXRpbmcgZXhjZXB0aW9ucyBsaWtlIFN5c3RlbUV4aXQgYW5kCisgICAgS2V5Ym9hcmRJbnRlcnJ1cHQgYXJlIG5vdCBwYXNzZWQuIiIiCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Quc3VwcG9ydC51bmxpbmsodGVzdC5zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3N5bmNfaGFuZGxlZChzZWxmKToKKyAgICAgICAgQmFzZUVycm9yVGVzdFNlcnZlcihWYWx1ZUVycm9yKQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPVRydWUpCisKKyAgICBkZWYgdGVzdF9zeW5jX25vdF9oYW5kbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgQmFzZUVycm9yVGVzdFNlcnZlcihTeXN0ZW1FeGl0KQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPUZhbHNlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF90aHJlYWRpbmdfaGFuZGxlZChzZWxmKToKKyAgICAgICAgVGhyZWFkaW5nRXJyb3JUZXN0U2VydmVyKFZhbHVlRXJyb3IpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9VHJ1ZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3RfdGhyZWFkaW5nX25vdF9oYW5kbGVkKHNlbGYpOgorICAgICAgICBUaHJlYWRpbmdFcnJvclRlc3RTZXJ2ZXIoU3lzdGVtRXhpdCkKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1GYWxzZSkKKworICAgIEByZXF1aXJlc19mb3JraW5nCisgICAgZGVmIHRlc3RfZm9ya2luZ19oYW5kbGVkKHNlbGYpOgorICAgICAgICBGb3JraW5nRXJyb3JUZXN0U2VydmVyKFZhbHVlRXJyb3IpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9VHJ1ZSkKKworICAgIEByZXF1aXJlc19mb3JraW5nCisgICAgZGVmIHRlc3RfZm9ya2luZ19ub3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgRm9ya2luZ0Vycm9yVGVzdFNlcnZlcihTeXN0ZW1FeGl0KQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPUZhbHNlKQorCisgICAgZGVmIGNoZWNrX3Jlc3VsdChzZWxmLCBoYW5kbGVkKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Quc3VwcG9ydC5URVNURk4pIGFzIGxvZzoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gJ0hhbmRsZXIgY2FsbGVkXG4nICsgJ0Vycm9yIGhhbmRsZWRcbicgKiBoYW5kbGVkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZy5yZWFkKCksIGV4cGVjdGVkKQorCisKK2NsYXNzIEJhc2VFcnJvclRlc3RTZXJ2ZXIoc29ja2V0c2VydmVyLlRDUFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjZXB0aW9uCisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKEhPU1QsIDApLCBCYWRIYW5kbGVyKQorICAgICAgICB3aXRoIHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbihzZWxmLnNlcnZlcl9hZGRyZXNzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCisgICAgICAgIHNlbGYud2FpdF9kb25lKCkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICB3aXRoIG9wZW4odGVzdC5zdXBwb3J0LlRFU1RGTiwgJ2EnKSBhcyBsb2c6CisgICAgICAgICAgICBsb2cud3JpdGUoJ0Vycm9yIGhhbmRsZWRcbicpCisKKyAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgQmFkSGFuZGxlcihzb2NrZXRzZXJ2ZXIuQmFzZVJlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4odGVzdC5zdXBwb3J0LlRFU1RGTiwgJ2EnKSBhcyBsb2c6CisgICAgICAgICAgICBsb2cud3JpdGUoJ0hhbmRsZXIgY2FsbGVkXG4nKQorICAgICAgICByYWlzZSBzZWxmLnNlcnZlci5leGNlcHRpb24oJ1Rlc3QgZXJyb3InKQorCisKK2NsYXNzIFRocmVhZGluZ0Vycm9yVGVzdFNlcnZlcihzb2NrZXRzZXJ2ZXIuVGhyZWFkaW5nTWl4SW4sCisgICAgICAgIEJhc2VFcnJvclRlc3RTZXJ2ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqcG9zLCAqKmt3KToKKyAgICAgICAgc2VsZi5kb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygqcG9zLCAqKmt3KQorCisgICAgZGVmIHNodXRkb3duX3JlcXVlc3Qoc2VsZiwgKnBvcywgKiprdyk6CisgICAgICAgIHN1cGVyKCkuc2h1dGRvd25fcmVxdWVzdCgqcG9zLCAqKmt3KQorICAgICAgICBzZWxmLmRvbmUuc2V0KCkKKworICAgIGRlZiB3YWl0X2RvbmUoc2VsZik6CisgICAgICAgIHNlbGYuZG9uZS53YWl0KCkKKworCitpZiBIQVZFX0ZPUktJTkc6CisgICAgY2xhc3MgRm9ya2luZ0Vycm9yVGVzdFNlcnZlcihzb2NrZXRzZXJ2ZXIuRm9ya2luZ01peEluLCBCYXNlRXJyb3JUZXN0U2VydmVyKToKKyAgICAgICAgZGVmIHdhaXRfZG9uZShzZWxmKToKKyAgICAgICAgICAgIFtjaGlsZF0gPSBzZWxmLmFjdGl2ZV9jaGlsZHJlbgorICAgICAgICAgICAgb3Mud2FpdHBpZChjaGlsZCwgMCkKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNsZWFyKCkKKworCitjbGFzcyBTb2NrZXRXcml0ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGNsYXNzIEhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIud2ZpbGUgPSBzZWxmLndmaWxlCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIud2ZpbGVfZmlsZW5vID0gc2VsZi53ZmlsZS5maWxlbm8oKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnJlcXVlc3RfZmlsZW5vID0gc2VsZi5yZXF1ZXN0LmZpbGVubygpCisKKyAgICAgICAgc2VydmVyID0gc29ja2V0c2VydmVyLlRDUFNlcnZlcigoSE9TVCwgMCksIEhhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuc2VydmVyX2Nsb3NlKQorICAgICAgICBzID0gc29ja2V0LnNvY2tldCgKKyAgICAgICAgICAgIHNlcnZlci5hZGRyZXNzX2ZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNLCBzb2NrZXQuSVBQUk9UT19UQ1ApCisgICAgICAgIHdpdGggczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZXJ2ZXIuc2VydmVyX2FkZHJlc3MpCisgICAgICAgIHNlcnZlci5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZXJ2ZXIud2ZpbGUsIGlvLkJ1ZmZlcmVkSU9CYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci53ZmlsZV9maWxlbm8sIHNlcnZlci5yZXF1ZXN0X2ZpbGVubykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHdmaWxlLndyaXRlKCkgc2VuZHMgZGF0YSBpbW1lZGlhdGVseSwgYW5kIHRoYXQgaXQgZG9lcworICAgICAgICAjIG5vdCB0cnVuY2F0ZSBzZW5kcyB3aGVuIGludGVycnVwdGVkIGJ5IGEgVW5peCBzaWduYWwKKyAgICAgICAgcHRocmVhZF9raWxsID0gdGVzdC5zdXBwb3J0LmdldF9hdHRyaWJ1dGUoc2lnbmFsLCAncHRocmVhZF9raWxsJykKKworICAgICAgICBjbGFzcyBIYW5kbGVyKHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnNlbnQxID0gc2VsZi53ZmlsZS53cml0ZShiJ3dyaXRlIGRhdGFcbicpCisgICAgICAgICAgICAgICAgIyBTaG91bGQgYmUgc2VudCBpbW1lZGlhdGVseSwgd2l0aG91dCByZXF1aXJpbmcgZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnJlY2VpdmVkID0gc2VsZi5yZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgYmlnX2NodW5rID0gYnl0ZXModGVzdC5zdXBwb3J0LlNPQ0tfTUFYX1NJWkUpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VudDIgPSBzZWxmLndmaWxlLndyaXRlKGJpZ19jaHVuaykKKworICAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAwKSwgSGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlcnZlci5zZXJ2ZXJfY2xvc2UpCisgICAgICAgIGludGVycnVwdGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBkZWYgc2lnbmFsX2hhbmRsZXIoc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICBpbnRlcnJ1cHRlZC5zZXQoKQorCisgICAgICAgIG9yaWdpbmFsID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgc2lnbmFsX2hhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzaWduYWwuc2lnbmFsLCBzaWduYWwuU0lHVVNSMSwgb3JpZ2luYWwpCisgICAgICAgIHJlc3BvbnNlMSA9IE5vbmUKKyAgICAgICAgcmVjZWl2ZWQyID0gTm9uZQorICAgICAgICBtYWluX3RocmVhZCA9IHRocmVhZGluZy5nZXRfaWRlbnQoKQorCisgICAgICAgIGRlZiBydW5fY2xpZW50KCk6CisgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzZXJ2ZXIuYWRkcmVzc19mYW1pbHksIHNvY2tldC5TT0NLX1NUUkVBTSwKKyAgICAgICAgICAgICAgICBzb2NrZXQuSVBQUk9UT19UQ1ApCisgICAgICAgICAgICB3aXRoIHMsIHMubWFrZWZpbGUoJ3JiJykgYXMgcmVhZGVyOgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChzZXJ2ZXIuc2VydmVyX2FkZHJlc3MpCisgICAgICAgICAgICAgICAgbm9ubG9jYWwgcmVzcG9uc2UxCisgICAgICAgICAgICAgICAgcmVzcG9uc2UxID0gcmVhZGVyLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzLnNlbmRhbGwoYidjbGllbnQgcmVzcG9uc2VcbicpCisKKyAgICAgICAgICAgICAgICByZWFkZXIucmVhZCgxMDApCisgICAgICAgICAgICAgICAgIyBUaGUgbWFpbiB0aHJlYWQgc2hvdWxkIG5vdyBiZSBibG9ja2luZyBpbiBhIHNlbmQoKSBzeXNjYWxsLgorICAgICAgICAgICAgICAgICMgQnV0IGluIHRoZW9yeSwgaXQgY291bGQgZ2V0IGludGVycnVwdGVkIGJ5IG90aGVyIHNpZ25hbHMsCisgICAgICAgICAgICAgICAgIyBhbmQgdGhlbiByZXRyaWVkLiBTbyBrZWVwIHNlbmRpbmcgdGhlIHNpZ25hbCBpbiBhIGxvb3AsIGluCisgICAgICAgICAgICAgICAgIyBjYXNlIGFuIGVhcmxpZXIgc2lnbmFsIGhhcHBlbnMgdG8gYmUgZGVsaXZlcmVkIGF0IGFuCisgICAgICAgICAgICAgICAgIyBpbmNvbnZlbmllbnQgbW9tZW50LgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfa2lsbChtYWluX3RocmVhZCwgc2lnbmFsLlNJR1VTUjEpCisgICAgICAgICAgICAgICAgICAgIGlmIGludGVycnVwdGVkLndhaXQodGltZW91dD1mbG9hdCgxKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG5vbmxvY2FsIHJlY2VpdmVkMgorICAgICAgICAgICAgICAgIHJlY2VpdmVkMiA9IGxlbihyZWFkZXIucmVhZCgpKQorCisgICAgICAgIGJhY2tncm91bmQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW5fY2xpZW50KQorICAgICAgICBiYWNrZ3JvdW5kLnN0YXJ0KCkKKyAgICAgICAgc2VydmVyLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgYmFja2dyb3VuZC5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIuc2VudDEsIGxlbihyZXNwb25zZTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlMSwgYid3cml0ZSBkYXRhXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5yZWNlaXZlZCwgYidjbGllbnQgcmVzcG9uc2VcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNlbnQyLCB0ZXN0LnN1cHBvcnQuU09DS19NQVhfU0laRSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNlaXZlZDIsIHRlc3Quc3VwcG9ydC5TT0NLX01BWF9TSVpFIC0gMTAwKQorCiAKIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQppbmRleCBhNWQwZWJmLi45OGNjYWI1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CkBAIC0xLDYgKzEsNSBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBpbXBvcnQgcmFuZG9tCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBjbXBfdG9fa2V5CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQppbmRleCBiZWE3YWIxLi5lODkzZjNhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Nwd2QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CkBAIC01Niw1ICs1NiwyMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcHdkLmdldHNwbmFtLCBieXRlc19uYW1lKQogCiAKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgJ25vbi1yb290IHVzZXIgcmVxdWlyZWQnKQorY2xhc3MgVGVzdFNwd2ROb25Sb290KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dldHNwbmFtX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgbmFtZSA9ICdiaW4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUGVybWlzc2lvbkVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBzcHdkLmdldHNwbmFtKG5hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBleGM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJzcHdkIGVudHJ5ICVyIGRvZXNuJ3QgZXhpc3Q6ICVzIiAlIChuYW1lLCBleGMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwgJ1tFcnJubyAxM10gUGVybWlzc2lvbiBkZW5pZWQnKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NzbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CmluZGV4IGQyZmMzNmQuLjc4MjRlOWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC0yMSw2ICsyMSwxMyBAQAogCiBzc2wgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoInNzbCIpCiAKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2hhdmVfdGhyZWFkcyA9IEZhbHNlCitlbHNlOgorICAgIF9oYXZlX3RocmVhZHMgPSBUcnVlCisKIFBST1RPQ09MUyA9IHNvcnRlZChzc2wuX1BST1RPQ09MX05BTUVTKQogSE9TVCA9IHN1cHBvcnQuSE9TVAogCkBAIC01MywxMCArNjAsMTAgQEAKICMgVHdvIGtleXMgYW5kIGNlcnRzIHNpZ25lZCBieSB0aGUgc2FtZSBDQSAoZm9yIFNOSSB0ZXN0cykKIFNJR05FRF9DRVJURklMRSA9IGRhdGFfZmlsZSgia2V5Y2VydDMucGVtIikKIFNJR05FRF9DRVJURklMRTIgPSBkYXRhX2ZpbGUoImtleWNlcnQ0LnBlbSIpCi1TSUdOSU5HX0NBID0gZGF0YV9maWxlKCJweWNhY2VydC5wZW0iKQorIyBTYW1lIGNlcnRpZmljYXRlIGFzIHB5Y2FjZXJ0LnBlbSwgYnV0IHdpdGhvdXQgZXh0cmEgdGV4dCBpbiBmaWxlCitTSUdOSU5HX0NBID0gZGF0YV9maWxlKCJjYXBhdGgiLCAiY2VmZjE3MTAuMCIpCiAKIFJFTU9URV9IT1NUID0gInNlbGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0IgotUkVNT1RFX1JPT1RfQ0VSVCA9IGRhdGFfZmlsZSgic2VsZnNpZ25lZF9weXRob250ZXN0ZG90bmV0LnBlbSIpCiAKIEVNUFRZQ0VSVCA9IGRhdGFfZmlsZSgibnVsbGNlcnQucGVtIikKIEJBRENFUlQgPSBkYXRhX2ZpbGUoImJhZGNlcnQucGVtIikKQEAgLTMyOCw3ICszMzUsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHNzKQogICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCIiLCBSZXNvdXJjZVdhcm5pbmcpKToKICAgICAgICAgICAgIGRlbCBzcwotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cigpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCiAKICAgICBkZWYgdGVzdF93cmFwcGVkX3VuY29ubmVjdGVkKHNlbGYpOgogICAgICAgICAjIE1ldGhvZHMgb24gYW4gdW5jb25uZWN0ZWQgU1NMU29ja2V0IHByb3BhZ2F0ZSB0aGUgb3JpZ2luYWwKQEAgLTc4Myw2ICs3OTAsMjIgQEAKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfb2soIkZlYiAgOSAwMDowMDowMCAyMDA3IEdNVCIsIDExNzA5NzkyMDAuMCkKICAgICAgICAgc2VsZi5jZXJ0X3RpbWVfZmFpbChsb2NhbF9mZWJydWFyeV9uYW1lKCkgKyAiICA5IDAwOjAwOjAwIDIwMDcgR01UIikKIAorICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlcnZlciA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuY2xvc2UpCisgICAgICAgIHBvcnQgPSBzdXBwb3J0LmJpbmRfcG9ydChzZXJ2ZXIpICAjIFJlc2VydmUgcG9ydCBidXQgZG9uJ3QgbGlzdGVuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKEhPU1QsIHBvcnQpKQorICAgICAgICAjIElzc3VlICMxOTkxOTogV2luZG93cyBtYWNoaW5lcyBvciBWTXMgaG9zdGVkIG9uIFdpbmRvd3MKKyAgICAgICAgIyBtYWNoaW5lcyBzb21ldGltZXMgcmV0dXJuIEVXT1VMREJMT0NLLgorICAgICAgICBlcnJvcnMgPSAoCisgICAgICAgICAgICBlcnJuby5FQ09OTlJFRlVTRUQsIGVycm5vLkVIT1NUVU5SRUFDSCwgZXJybm8uRVRJTUVET1VULAorICAgICAgICAgICAgZXJybm8uRVdPVUxEQkxPQ0ssCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgZXJyb3JzKQorCiAKIGNsYXNzIENvbnRleHRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTEzNjksMTQwICsxMzkyLDEwMyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpby53cml0ZSwgMSkKIAogCi1jbGFzcyBOZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CitAdW5pdHRlc3Quc2tpcFVubGVzcyhfaGF2ZV90aHJlYWRzLCAiTmVlZHMgdGhyZWFkaW5nIG1vZHVsZSIpCitjbGFzcyBTaW1wbGVCYWNrZ3JvdW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdHMgdGhhdCBjb25uZWN0IHRvIGEgc2ltcGxlIHNlcnZlciBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihTSUdORURfQ0VSVEZJTEUpCisgICAgICAgIHNlbGYuc2VydmVyX2FkZHIgPSAoSE9TVCwgc2VydmVyLnBvcnQpCisgICAgICAgIHNlcnZlci5fX2VudGVyX18oKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLl9fZXhpdF9fLCBOb25lLCBOb25lLCBOb25lKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGhhdmUgbm8gdmVyaWZpY2F0aW9uIGNlcnRzCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIHRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCiAKLSAgICAgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgZGVmIHRlc3RfY29ubmVjdF9mYWlsKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cy4gQ29ubmVjdGlvbgorICAgICAgICAjIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuIGluZGVwZW5kZW50CisgICAgICAgICMgdGVzdCBtZXRob2QuCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogY2hlY2sgY29ubmVjdF9leCgpIGltcGxlbWVudGF0aW9uCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNJR05JTkdfQ0EpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHMuY29ubmVjdF9leChzZWxmLnNlcnZlcl9hZGRyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKIAogICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19jb25uZWN0X2V4KHNlbGYpOgogICAgICAgICAjIElzc3VlICMxMTMyNjogbm9uLWJsb2NraW5nIGNvbm5lY3RfZXgoKSBzaG91bGQgYWxsb3cgaGFuZHNoYWtlCiAgICAgICAgICMgdG8gcHJvY2VlZCBhZnRlciB0aGUgc29ja2V0IGdldHMgcmVhZHkuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICMgRVdPVUxEQkxPQ0sgdW5kZXIgV2luZG93cywgRUlOUFJPR1JFU1MgZWxzZXdoZXJlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10sIDUuMCkKKyAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCisgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoMCwgZXJybm8uRUlOUFJPR1JFU1MsIGVycm5vLkVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50V3JpdGVFcnJvcjoKICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCi0gICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQotICAgICAgICAgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF90aW1lb3V0X2Nvbm5lY3RfZXgoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzEyMDY1OiBvbiBhIHRpbWVvdXQsIGNvbm5lY3RfZXgoKSBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbAotICAgICAgICAjIGVycm5vIChtaW1pY2tpbmcgdGhlIGJlaGF2aW91ciBvZiBub24tU1NMIHNvY2tldHMpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9UkVNT1RFX1JPT1RfQ0VSVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgaWYgcmMgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoZXJybm8uRUFHQUlOLCBlcnJuby5FV09VTERCTE9DSykpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQotCi0gICAgZGVmIHRlc3RfY29ubmVjdF9leF9lcnJvcihzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDQpKQotICAgICAgICAgICAgICAgICMgSXNzdWUgIzE5OTE5OiBXaW5kb3dzIG1hY2hpbmVzIG9yIFZNcyBob3N0ZWQgb24gV2luZG93cwotICAgICAgICAgICAgICAgICMgbWFjaGluZXMgc29tZXRpbWVzIHJldHVybiBFV09VTERCTE9DSy4KLSAgICAgICAgICAgICAgICBlcnJvcnMgPSAoCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVDT05OUkVGVVNFRCwgZXJybm8uRUhPU1RVTlJFQUNILCBlcnJuby5FVElNRURPVVQsCi0gICAgICAgICAgICAgICAgICAgIGVycm5vLkVXT1VMREJMT0NLLAotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCBlcnJvcnMpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAjIFNTTCBlc3RhYmxpc2hlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHQoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgIyBTYW1lIGFzIHRlc3RfY29ubmVjdCwgYnV0IHdpdGggYSBzZXBhcmF0ZWx5IGNyZWF0ZWQgY29udGV4dAotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIHNlcnZlciBob3N0bmFtZQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPVJFTU9URV9IT1NUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuY2xvc2UoKQotICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoUkVNT1RFX1JPT1RfQ0VSVCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgU2FtZSBhcyB0ZXN0X2Nvbm5lY3QsIGJ1dCB3aXRoIGEgc2VwYXJhdGVseSBjcmVhdGVkIGNvbnRleHQKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgIyBTYW1lIHdpdGggYSBzZXJ2ZXIgaG9zdG5hbWUKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPSJkdW1teSIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgIyBUaGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0CisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoU0lHTklOR19DQSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorCisgICAgZGVmIHRlc3RfY29ubmVjdF93aXRoX2NvbnRleHRfZmFpbChzZWxmKToKKyAgICAgICAgIyBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMuIENvbm5lY3Rpb24KKyAgICAgICAgIyBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbiBpbmRlcGVuZGVudAorICAgICAgICAjIHRlc3QgbWV0aG9kLgorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJjZXJ0aWZpY2F0ZSB2ZXJpZnkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0LCBzZWxmLnNlcnZlcl9hZGRyKQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYXBhdGgoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHNlcnZlciBjZXJ0aWZpY2F0ZXMgdXNpbmcgdGhlIGBjYXBhdGhgIGFyZ3VtZW50CkBAIC0xNTEwLDE5OCArMTQ5NiwxMzAgQEAKICAgICAgICAgIyBPcGVuU1NMIDAuOS44biBhbmQgMS4wLjAsIGFzIGEgcmVzdWx0IHRoZSBjYXBhdGggZGlyZWN0b3J5IG11c3QKICAgICAgICAgIyBjb250YWluIGJvdGggdmVyc2lvbnMgb2YgZWFjaCBjZXJ0aWZpY2F0ZSAoc2FtZSBjb250ZW50LCBkaWZmZXJlbnQKICAgICAgICAgIyBmaWxlbmFtZSkgZm9yIHRoaXMgdGVzdCB0byBiZSBwb3J0YWJsZSBhY3Jvc3MgT3BlblNTTCByZWxlYXNlcy4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICAjIFNhbWUgd2l0aCBhIGJ5dGVzIGBjYXBhdGhgIGFyZ3VtZW50CisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUJZVEVTX0NBUEFUSCkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgZGVmIHRlc3RfY29ubmVjdF9jYWRhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggb3BlbihSRU1PVEVfUk9PVF9DRVJUKSBhcyBmOgorICAgICAgICB3aXRoIG9wZW4oU0lHTklOR19DQSkgYXMgZjoKICAgICAgICAgICAgIHBlbSA9IGYucmVhZCgpCiAgICAgICAgIGRlciA9IHNzbC5QRU1fY2VydF90b19ERVJfY2VydChwZW0pCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1wZW0pCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWRhdGE9cGVtKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKLSAgICAgICAgICAgICMgc2FtZSB3aXRoIERFUgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1kZXIpCi0gICAgICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKKyAgICAgICAgIyBzYW1lIHdpdGggREVSCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPWRlcikKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQogCiAgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICJudCIsICJDYW4ndCB1c2UgYSBzb2NrZXQgYXMgYSBmaWxlIHVuZGVyIFdpbmRvd3MiKQogICAgIGRlZiB0ZXN0X21ha2VmaWxlX2Nsb3NlKHNlbGYpOgogICAgICAgICAjIElzc3VlICM1MjM4OiBjcmVhdGluZyBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtYWtlZmlsZSgpIHNob3VsZG4ndAogICAgICAgICAjIGRlbGF5IGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgInJlYWwgc29ja2V0IiAoaGVyZSB0ZXN0ZWQgd2l0aCBpdHMKICAgICAgICAgIyBmaWxlIGRlc2NyaXB0b3IsIGhlbmNlIHNraXBwaW5nIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MpLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQotICAgICAgICAgICAgc3MuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBmZCA9IHNzLmZpbGVubygpCi0gICAgICAgICAgICBmID0gc3MubWFrZWZpbGUoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoZSBmZCBpcyBzdGlsbCBvcGVuCisgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBzcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKKyAgICAgICAgZiA9IHNzLm1ha2VmaWxlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgb3MucmVhZChmZCwgMCkKKyAgICAgICAgIyBDbG9zaW5nIHRoZSBTU0wgc29ja2V0IHNob3VsZCBjbG9zZSB0aGUgZmQgdG9vCisgICAgICAgIHNzLmNsb3NlKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgZToKICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KLSAgICAgICAgICAgIHNzLmNsb3NlKCkKLSAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgotICAgICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUJBREYpCiAKICAgICBkZWYgdGVzdF9ub25fYmxvY2tpbmdfaGFuZHNoYWtlKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCi0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKLSAgICAgICAgICAgIGNvdW50ID0gMAotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFJlYWRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5OZWVkZWQgJWQgY2FsbHMgdG8gZG9faGFuZHNoYWtlKCkgdG8gZXN0YWJsaXNoIHNlc3Npb24uXG4iICUgY291bnQpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHMuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NdLCBbXSwgW10pCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuTmVlZGVkICVkIGNhbGxzIHRvIGRvX2hhbmRzaGFrZSgpIHRvIGVzdGFibGlzaCBzZXNzaW9uLlxuIiAlIGNvdW50KQogCiAgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmKToKLSAgICAgICAgZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKLSAgICAgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoaG9zdCk6Ci0gICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIG5vdCBwZW06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgKnNlbGYuc2VydmVyX2FkZHIsIGNlcnQ9U0lHTklOR19DQSkKIAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSkKLSAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIHg6Ci0gICAgICAgICAgICAgICAgICAgICNzaG91bGQgZmFpbAotICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIlc1xuIiAlIHgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJHb3Qgc2VydmVyIGNlcnRpZmljYXRlICVzIGZvciAlczolcyEiICUgKHBlbSwgaG9zdCwgcG9ydCkpCi0KLSAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Y2VydCkKLSAgICAgICAgICAgICAgICBpZiBub3QgcGVtOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCi0KLSAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShSRU1PVEVfSE9TVCwgNDQzLCBSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICBpZiBzdXBwb3J0LklQVjZfRU5BQkxFRDoKLSAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwoc2VsZik6CisgICAgICAgICMgQ29ubmVjdGlvbiBmYWlsdXJlIGNyYXNoZXMgVGhyZWFkZWRFY2hvU2VydmVyLCBzbyBydW4gdGhpcyBpbiBhbgorICAgICAgICAjIGluZGVwZW5kZW50IHRlc3QgbWV0aG9kCisgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAqc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2NpcGhlcnMoc2VsZik6Ci0gICAgICAgIHJlbW90ZSA9IChSRU1PVEVfSE9TVCwgNDQzKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHJlbW90ZVswXSk6Ci0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJBTEwiKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgIyBFcnJvciBjaGVja2luZyBjYW4gaGFwcGVuIGF0IGluc3RhbnRpYXRpb24gb3Igd2hlbiBjb25uZWN0aW5nCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgotICAgICAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKLSAgICAgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKLSAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKLQotICAgIGRlZiB0ZXN0X2FsZ29yaXRobXMoc2VsZik6Ci0gICAgICAgICMgSXNzdWUgIzg0ODQ6IGFsbCBhbGdvcml0aG1zIHNob3VsZCBiZSBhdmFpbGFibGUgd2hlbiB2ZXJpZnlpbmcgYQotICAgICAgICAjIGNlcnRpZmljYXRlLgotICAgICAgICAjIFNIQTI1NiB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuOAotICAgICAgICBpZiBzc2wuT1BFTlNTTF9WRVJTSU9OX0lORk8gPCAoMCwgOSwgOCwgMCwgMTUpOgotICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0hBMjU2IG5vdCBhdmFpbGFibGUgb24gJXIiICUgc3NsLk9QRU5TU0xfVkVSU0lPTikKLSAgICAgICAgIyBzaGEyNTYudGJzLWludGVybmV0LmNvbSBuZWVkcyBTTkkgdG8gdXNlIHRoZSBjb3JyZWN0IGNlcnRpZmljYXRlCi0gICAgICAgIGlmIG5vdCBzc2wuSEFTX1NOSToKLSAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNOSSBuZWVkZWQgZm9yIHRoaXMgdGVzdCIpCi0gICAgICAgICMgaHR0cHM6Ly9zaGEyLmhib2Vjay5kZS8gd2FzIHVzZWQgdW50aWwgMjAxMS0wMS0wOCAobm8gcm91dGUgdG8gaG9zdCkKLSAgICAgICAgcmVtb3RlID0gKCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIsIDQ0MykKLSAgICAgICAgc2hhMjU2X2NlcnQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgInNoYTI1Ni5wZW0iKQotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpOgotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoc2hhMjU2X2NlcnQpCi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9InNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIikKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5DaXBoZXIgd2l0aCAlciBpcyAlclxuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW90ZSwgcy5jaXBoZXIoKSkpCi0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNlcnRpZmljYXRlIGlzOlxuJXNcbiIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHMuZ2V0cGVlcmNlcnQoKSkpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkFMTCIpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAjIEVycm9yIGNoZWNraW5nIGNhbiBoYXBwZW4gYXQgaW5zdGFudGlhdGlvbiBvciB3aGVuIGNvbm5lY3RpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgIk5vIGNpcGhlciBjYW4gYmUgc2VsZWN0ZWQiKToKKyAgICAgICAgICAgIHdpdGggc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkgYXMgc29jazoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iXiQ6LDs/Kidkb3JvdGh5eCIpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9nZXRfY2FfY2VydHNfY2FwYXRoKHNlbGYpOgogICAgICAgICAjIGNhcGF0aCBjZXJ0cyBhcmUgbG9hZGVkIG9uIHJlcXVlc3QKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhcGF0aD1DQVBBVEgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3R4LmdldF9jYV9jZXJ0cygpLCBbXSkKKyAgICAgICAgd2l0aCBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdHguZ2V0X2NhX2NlcnRzKCkpLCAxKQogCiAgICAgQG5lZWRzX3NuaQogICAgIGRlZiB0ZXN0X2NvbnRleHRfc2V0Z2V0KHNlbGYpOgogICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGNvbnRleHQgb2YgYSBjb25uZWN0ZWQgc29ja2V0IGNhbiBiZSByZXBsYWNlZC4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQotICAgICAgICAgICAgY3R4MiA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKLSAgICAgICAgICAgICAgICBzcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDEpCi0gICAgICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLmNvbnRleHQsIGN0eDIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDIpCi0KLQotY2xhc3MgTmV0d29ya2VkQklPVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBjdHgxID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICBjdHgyID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHdpdGggY3R4MS53cmFwX3NvY2tldChzKSBhcyBzczoKKyAgICAgICAgICAgIHNzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgxKQorICAgICAgICAgICAgc3MuY29udGV4dCA9IGN0eDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuX3NzbG9iai5jb250ZXh0LCBjdHgyKQogCiAgICAgZGVmIHNzbF9pb19sb29wKHNlbGYsIHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgIyBBIHNpbXBsZSBJTyBsb29wLiBDYWxsIGZ1bmMoKmFyZ3MpIGRlcGVuZGluZyBvbiB0aGUgZXJyb3Igd2UgZ2V0CkBAIC0xNzM3LDY0ICsxNjU1LDEyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjb3VudCwgZnVuYy5fX25hbWVfXykpCiAgICAgICAgIHJldHVybiByZXQKIAotICAgIGRlZiB0ZXN0X2hhbmRzaGFrZShzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHNvY2suY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgY3R4LmNoZWNrX2hvc3RuYW1lID0gVHJ1ZQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UsIFJFTU9URV9IT1NUKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQotICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmNpcGhlcigpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCi0gICAgICAgICAgICBpZiAndGxzLXVuaXF1ZScgaW4gc3NsLkNIQU5ORUxfQklORElOR19UWVBFUzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnVud3JhcCkKLSAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgotICAgICAgICAgICAgICAgICMgc2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQgcHJvYmFibHkgc2h1dHMgZG93biB0aGUgVENQCi0gICAgICAgICAgICAgICAgIyBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCBhbmQKLSAgICAgICAgICAgICAgICAjIHRoaXMgaXMgcmVwb3J0ZWQgYXMgU1NMX0VSUk9SX1NZU0NBTEwKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzc2wuU1NMRXJyb3IsIHNzbG9iai53cml0ZSwgYidmb28nKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9yZWFkX3dyaXRlX2RhdGEoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCi0gICAgICAgICAgICBzb2NrLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIG91dGdvaW5nID0gc3NsLk1lbW9yeUJJTygpCi0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfTk9ORQotICAgICAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UpCi0gICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKLSAgICAgICAgICAgIHJlcSA9IGInR0VUIC8gSFRUUC8xLjBcclxuXHJcbicKLSAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoud3JpdGUsIHJlcSkKLSAgICAgICAgICAgIGJ1ZiA9IHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoucmVhZCwgMTAyNCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo1XSwgYidIVFRQLycpCisgICAgZGVmIHRlc3RfYmlvX2hhbmRzaGFrZShzZWxmKToKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBzb2NrLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgaW5jb21pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTSUdOSU5HX0NBKQorICAgICAgICBjdHguY2hlY2tfaG9zdG5hbWUgPSBUcnVlCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlLCAnbG9jYWxob3N0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzc2xvYmouX3NzbG9iai5vd25lciwgc3Nsb2JqKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzc2xvYmouZ2V0cGVlcmNlcnQpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5kb19oYW5kc2hha2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouY2lwaGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5zaGFyZWRfY2lwaGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldHBlZXJjZXJ0KCkpCisgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNzbG9iai5nZXRfY2hhbm5lbF9iaW5kaW5nKCd0bHMtdW5pcXVlJykpCisgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoudW53cmFwKQotICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBzc2wuU1NMU3lzY2FsbEVycm9yOgorICAgICAgICAgICAgIyBJZiB0aGUgc2VydmVyIHNodXRzIGRvd24gdGhlIFRDUCBjb25uZWN0aW9uIHdpdGhvdXQgc2VuZGluZyBhCisgICAgICAgICAgICAjIHNlY3VyZSBzaHV0ZG93biBtZXNzYWdlLCB0aGlzIGlzIHJlcG9ydGVkIGFzIFNTTF9FUlJPUl9TWVNDQUxMCisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNzbC5TU0xFcnJvciwgc3Nsb2JqLndyaXRlLCBiJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9iaW9fcmVhZF93cml0ZV9kYXRhKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIHNzbG9iaiA9IGN0eC53cmFwX2JpbyhpbmNvbWluZywgb3V0Z29pbmcsIEZhbHNlKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKKyAgICAgICAgcmVxID0gYidGT09cbicKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai53cml0ZSwgcmVxKQorICAgICAgICBidWYgPSBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnJlYWQsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBiJ2Zvb1xuJykKKyAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai51bndyYXApCiAKIAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBfaGF2ZV90aHJlYWRzID0gRmFsc2UKLWVsc2U6Ci0gICAgX2hhdmVfdGhyZWFkcyA9IFRydWUKK2NsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKKyAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKKyAgICAgICAgICAgIGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUkVNT1RFX0hPU1QgcmVzcG9uZGVkIHRvbyBxdWlja2x5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuSVBWNl9FTkFCTEVELCAnTmVlZHMgSVB2NicpCisgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9pcHY2KHNlbGYpOgorICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCdpcHY2Lmdvb2dsZS5jb20nKToKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZiwgJ2lwdjYuZ29vZ2xlLmNvbScsIDQ0MykKKyAgICAgICAgICAgIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmLCAnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorCisgICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCisgICAgICAgICMgY2VydGlmaWNhdGUuCisgICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44CisgICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQorICAgICAgICAjIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIG5lZWRzIFNOSSB0byB1c2UgdGhlIGNvcnJlY3QgY2VydGlmaWNhdGUKKyAgICAgICAgaWYgbm90IHNzbC5IQVNfU05JOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU05JIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IikKKyAgICAgICAgIyBodHRwczovL3NoYTIuaGJvZWNrLmRlLyB3YXMgdXNlZCB1bnRpbCAyMDExLTAxLTA4IChubyByb3V0ZSB0byBob3N0KQorICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQorICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIik6CisgICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzaGEyNTZfY2VydCkKKyAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT0ic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbkNpcGhlciB3aXRoICVyIGlzICVyXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3RlLCBzLmNpcGhlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ2VydGlmaWNhdGUgaXM6XG4lc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQocy5nZXRwZWVyY2VydCgpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKworZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUodGVzdCwgaG9zdCwgcG9ydCwgY2VydD1Ob25lKToKKyAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCkpCisgICAgaWYgbm90IHBlbToKKyAgICAgICAgdGVzdC5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gJXM6JXMhIiAlIChob3N0LCBwb3J0KSkKKworICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwgY2FfY2VydHM9Y2VydCkKKyAgICBpZiBub3QgcGVtOgorICAgICAgICB0ZXN0LmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQorICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3IgJXM6JXMgaXNcbiVzXG4iICUgKGhvc3QsIHBvcnQgLHBlbSkpCisKK2RlZiBfdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2ZhaWwodGVzdCwgaG9zdCwgcG9ydCk6CisgICAgdHJ5OgorICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksIGNhX2NlcnRzPUNFUlRGSUxFKQorICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgeDoKKyAgICAgICAgI3Nob3VsZCBmYWlsCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzXG4iICUgeCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0LmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yICVzOiVzISIgJSAocGVtLCBob3N0LCBwb3J0KSkKKworCitpZiBfaGF2ZV90aHJlYWRzOgogICAgIGZyb20gdGVzdC5zc2xfc2VydmVycyBpbXBvcnQgbWFrZV9odHRwc19zZXJ2ZXIKIAogICAgIGNsYXNzIFRocmVhZGVkRWNob1NlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKQEAgLTE4ODIsNiArMTg2NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN0cmlwcGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW9mLCBzbyBxdWl0IHRoaXMgaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzZWxmLnNzbGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYW55IHRlc3RzIHNodXQgdGhlIFRDUCBjb25uZWN0aW9uIGRvd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFuIFNTTCBzaHV0ZG93bi4gVGhpcyBjYXVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bndyYXAoKSB0byByYWlzZSBPU0Vycm9yIHdpdGggZXJybm89MCEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc3RyaXBwZWQgPT0gYidvdmVyJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNvbm5lY3Rpb25jaGF0dHk6CkBAIC0yNzE5LDEyICsyNzEwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBhZGRyID0gcy5yZWN2ZnJvbV9pbnRvKGIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiWzpjb3VudF0KIAotICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCisgICAgICAgICAgICAgICAgIyAobmFtZSwgbWV0aG9kLCBleHBlY3Qgc3VjY2Vzcz8sICphcmdzLCByZXR1cm4gdmFsdWUgZnVuYykKICAgICAgICAgICAgICAgICBzZW5kX21ldGhvZHMgPSBbCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZCcsIHMuc2VuZCwgVHJ1ZSwgW10pLAotICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZGFsbCcsIHMuc2VuZGFsbCwgVHJ1ZSwgW10pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmQnLCBzLnNlbmQsIFRydWUsIFtdLCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmR0bycsIHMuc2VuZHRvLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSwgbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSwgbGFtYmRhIHg6IE5vbmUpLAogICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIHdoZXRoZXIgdG8gZXhwZWN0IHN1Y2Nlc3MsICphcmdzKQogICAgICAgICAgICAgICAgIHJlY3ZfbWV0aG9kcyA9IFsKICAgICAgICAgICAgICAgICAgICAgKCdyZWN2Jywgcy5yZWN2LCBUcnVlLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICgncmVjdmZyb20nLCBzLnJlY3Zmcm9tLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCkBAIC0yNzMzLDEwICsyNzI1LDEzIEBACiAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgIGRhdGFfcHJlZml4ID0gIlBSRUZJWF8iCiAKLSAgICAgICAgICAgICAgICBmb3IgbWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzIGluIHNlbmRfbWV0aG9kczoKKyAgICAgICAgICAgICAgICBmb3IgKG1ldGhfbmFtZSwgc2VuZF9tZXRoLCBleHBlY3Rfc3VjY2VzcywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF92YWxfbWV0aCkgaW4gc2VuZF9tZXRob2RzOgogICAgICAgICAgICAgICAgICAgICBpbmRhdGEgPSAoZGF0YV9wcmVmaXggKyBtZXRoX25hbWUpLmVuY29kZSgnYXNjaWknKQogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGgoaW5kYXRhLCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHNlbmRfbWV0aChpbmRhdGEsICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gInNlbmRpbmcgd2l0aCB7fSIuZm9ybWF0KG1ldGhfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCByZXRfdmFsX21ldGgoaW5kYXRhKSwgbXNnPW1zZykKICAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEgPSBzLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCkBAIC0zMzYxLDE4ICszMzU2LDIwIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICBmb3IgZmlsZW5hbWUgaW4gWwotICAgICAgICBDRVJURklMRSwgUkVNT1RFX1JPT1RfQ0VSVCwgQllURVNfQ0VSVEZJTEUsCisgICAgICAgIENFUlRGSUxFLCBCWVRFU19DRVJURklMRSwKICAgICAgICAgT05MWUNFUlQsIE9OTFlLRVksIEJZVEVTX09OTFlDRVJULCBCWVRFU19PTkxZS0VZLAogICAgICAgICBTSUdORURfQ0VSVEZJTEUsIFNJR05FRF9DRVJURklMRTIsIFNJR05JTkdfQ0EsCiAgICAgICAgIEJBRENFUlQsIEJBREtFWSwgRU1QVFlDRVJUXToKICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgIHJhaXNlIHN1cHBvcnQuVGVzdEZhaWxlZCgiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBmaWxlICVyIiAlIGZpbGVuYW1lKQogCi0gICAgdGVzdHMgPSBbQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0c10KKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgQ29udGV4dFRlc3RzLCBCYXNpY1NvY2tldFRlc3RzLCBTU0xFcnJvclRlc3RzLCBNZW1vcnlCSU9UZXN0cywKKyAgICAgICAgU2ltcGxlQmFja2dyb3VuZFRlc3RzLAorICAgIF0KIAogICAgIGlmIHN1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgnbmV0d29yaycpOgogICAgICAgICB0ZXN0cy5hcHBlbmQoTmV0d29ya2VkVGVzdHMpCi0gICAgICAgIHRlc3RzLmFwcGVuZChOZXR3b3JrZWRCSU9UZXN0cykKIAogICAgIGlmIF9oYXZlX3RocmVhZHM6CiAgICAgICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CmluZGV4IDAwODlhZTguLjVkZDUwNDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKQEAgLTY1OSw3ICs2NTksNyBAQAogICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCiAgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PTyBhbmQgYWJvdmUiKQogICAgIGRlZiB0ZXN0X2RvY190ZXN0cyhzZWxmKToKLSAgICAgICAgZmFpbGVkLCB0cmllZCA9IGRvY3Rlc3QudGVzdG1vZChzdGF0aXN0aWNzKQorICAgICAgICBmYWlsZWQsIHRyaWVkID0gZG9jdGVzdC50ZXN0bW9kKHN0YXRpc3RpY3MsIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMpCiAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih0cmllZCwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYWlsZWQsIDApCiAKQEAgLTcwMiw5ICs3MDIsOSBAQAogICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CiAgICAgICAgIEQgPSBEZWNpbWFsCiAgICAgICAgIF9leGFjdF9yYXRpbyA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjAuMTI1IikpLCAoMTI1LCAxMDAwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMTIuMzQ1IikpLCAoMTIzNDUsIDEwMDApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9leGFjdF9yYXRpbyhEKCItMS45OCIpKSwgKC0xOTgsIDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjAuMTI1IikpLCAoMSwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIjEyLjM0NSIpKSwgKDI0NjksIDIwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIi0xLjk4IikpLCAoLTk5LCA1MCkpCiAKICAgICBkZWYgdGVzdF9pbmYoc2VsZik6CiAgICAgICAgIElORiA9IGZsb2F0KCJJTkYiKQpAQCAtNzQzLDE4ICs3NDMsMTggQEAKIAogCiBjbGFzcyBEZWNpbWFsVG9SYXRpb1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVGVzdCBfZGVjaW1hbF90b19yYXRpbyBwcml2YXRlIGZ1bmN0aW9uLgorICAgICMgVGVzdCBfZXhhY3RfcmF0aW8gcHJpdmF0ZSBmdW5jdGlvbi4KIAogICAgIGRlZiB0ZXN0X2luZmluaXR5KHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBJTkZzIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgaW5mID0gRGVjaW1hbCgnSU5GJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKGluZiksIChpbmYsIE5vbmUpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oLWluZiksICgtaW5mLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhpbmYpLCAoaW5mLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0aXN0aWNzLl9leGFjdF9yYXRpbygtaW5mKSwgKC1pbmYsIE5vbmUpKQogCiAgICAgZGVmIHRlc3RfbmFuKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBOQU5zIGFyZSBoYW5kbGVkIGNvcnJlY3RseS4KICAgICAgICAgZm9yIG5hbiBpbiAoRGVjaW1hbCgnTkFOJyksIERlY2ltYWwoJ3NOQU4nKSk6Ci0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8obmFuKQorICAgICAgICAgICAgbnVtLCBkZW4gPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhuYW4pCiAgICAgICAgICAgICAjIEJlY2F1c2UgTkFOcyBhbHdheXMgY29tcGFyZSBub24tZXF1YWwsIHdlIGNhbm5vdCB1c2UgYXNzZXJ0RXF1YWwuCiAgICAgICAgICAgICAjIE5vciBjYW4gd2UgdXNlIGFuIGlkZW50aXR5IHRlc3QsIGFzIHdlIGRvbid0IGd1YXJhbnRlZSBhbnl0aGluZwogICAgICAgICAgICAgIyBhYm91dCB0aGUgb2JqZWN0IGlkZW50aXR5LgpAQCAtNzY3LDMwICs3NjcsMzAgQEAKICAgICAgICAgZm9yIGQgaW4gbnVtYmVyczoKICAgICAgICAgICAgICMgRmlyc3QgdGVzdCBwb3NpdGl2ZSBkZWNpbWFscy4KICAgICAgICAgICAgIGFzc2VydCBkID4gMAotICAgICAgICAgICAgbnVtLCBkZW4gPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKGQpCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKGQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChudW0sIDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZGVuLCAwKQogICAgICAgICAgICAgIyBUaGVuIHRlc3QgbmVnYXRpdmUgZGVjaW1hbHMuCi0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oLWQpCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKC1kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobnVtLCAwKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGRlbiwgMCkKIAogICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2V4cG9uZW50KHNlbGYpOgogICAgICAgICAjIFRlc3QgcmVzdWx0IHdoZW4gdGhlIGV4cG9uZW50IGlzIG5lZ2F0aXZlLgotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIwLjEyMzQiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTIzNCwgMTAwMDApKQorICAgICAgICB0ID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oRGVjaW1hbCgiMC4xMjM0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgKDYxNywgNTAwMCkpCiAKICAgICBkZWYgdGVzdF9wb3NpdGl2ZV9leHBvbmVudChzZWxmKToKICAgICAgICAgIyBUZXN0IHJlc3VsdHMgd2hlbiB0aGUgZXhwb25lbnQgaXMgcG9zaXRpdmUuCi0gICAgICAgIHQgPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjEuMjM0ZTciKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjEuMjM0ZTciKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTIzNDAwMDAsIDEpKQogCiAgICAgZGVmIHRlc3RfcmVncmVzc2lvbl8yMDUzNihzZWxmKToKICAgICAgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlIDIwNTM2LgogICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1MzYKLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMWUyIikpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIxZTIiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTAwLCAxKSkKLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMS40N2U1IikpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIxLjQ3ZTUiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTQ3MDAwLCAxKSkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQppbmRleCA4NTEyNmU2Li44YzhmOTdiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKQEAgLTUsNyArNSw2IEBACiBpbXBvcnQgbG9jYWxlCiBpbXBvcnQgcmUKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlIGFzIGRhdGV0aW1lX2RhdGUKIApAQCAtMTUzLDggKzE1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgdXNpbmcgJyVzJzsgZ3JvdXAgJ2EnID0gJyVzJywgZ3JvdXAgJ2InID0gJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvdW5kLnN0cmluZywgZm91bmQucmUucGF0dGVybiwgZm91bmQuZ3JvdXAoJ2EnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuZ3JvdXAoJ2InKSkpCi0gICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywnQScsJ2InLCdCJywnYycsJ2QnLCdIJywnSScsJ2onLCdtJywnTScsJ3AnLCdTJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLCd3JywnVycsJ3gnLCdYJywneScsJ1knLCdaJywnJScpOgorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsJ0EnLCdiJywnQicsJ2MnLCdkJywnRycsJ0gnLCdJJywnaicsJ20nLCdNJywncCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdTJywndScsJ1UnLCdWJywndycsJ1cnLCd4JywnWCcsJ3knLCdZJywnWicsJyUnKToKICAgICAgICAgICAgIGNvbXBpbGVkID0gc2VsZi50aW1lX3JlLmNvbXBpbGUoIiUiICsgZGlyZWN0aXZlKQogICAgICAgICAgICAgZm91bmQgPSBjb21waWxlZC5tYXRjaCh0aW1lLnN0cmZ0aW1lKCIlIiArIGRpcmVjdGl2ZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsICJNYXRjaGluZyBmYWlsZWQgb24gJyVzJyB1c2luZyAnJXMnIHJlZ2V4IiAlCkBAIC0yMTksNiArMjE4LDI2IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJyVzJyBkaWQgbm90IHJhaXNlIFZhbHVlRXJyb3IiICUgYmFkX2Zvcm1hdCkKIAorICAgICAgICAjIEFtYmlndW91cyBvciBpbmNvbXBsZXRlIGNhc2VzIHVzaW5nIElTTyB5ZWFyL3dlZWsvd2Vla2RheSBkaXJlY3RpdmVzCisgICAgICAgICMgMS4gSVNPIHdlZWsgKCVWKSBpcyBzcGVjaWZpZWQsIGJ1dCB0aGUgeWVhciBpcyBzcGVjaWZpZWQgd2l0aCAlWQorICAgICAgICAjIGluc3RlYWQgb2YgJUcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTAiLCAiJVkgJVYiKQorICAgICAgICAjIDIuIElTTyB5ZWFyICglRykgYW5kIElTTyB3ZWVrICglVikgYXJlIHNwZWNpZmllZCwgYnV0IHdlZWtkYXkgaXMgbm90CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUxIiwgIiVHICVWIikKKyAgICAgICAgIyAzLiBJU08geWVhciAoJUcpIGFuZCB3ZWVrZGF5IGFyZSBzcGVjaWZpZWQsIGJ1dCBJU08gd2VlayAoJVYpIGlzIG5vdAorICAgICAgICBmb3IgdyBpbiAoJ0EnLCAnYScsICd3JywgJ3UnKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MSIsIiVHICV7fSIuZm9ybWF0KHcpKQorICAgICAgICAjIDQuIElTTyB5ZWFyIGlzIHNwZWNpZmllZCBhbG9uZSAoZS5nLiB0aW1lLnN0cnB0aW1lKCcyMDE1JywgJyVHJykpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIyMDE1IiwgIiVHIikKKyAgICAgICAgIyA1LiBKdWxpYW4vb3JkaW5hbCBkYXkgKCVqKSBpcyBzcGVjaWZpZWQgd2l0aCAlRywgYnV0IG5vdCAlWQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSAyNTYiLCAiJUcgJWoiKQorCisKICAgICBkZWYgdGVzdF9zdHJwdGltZV9leGNlcHRpb25fY29udGV4dChzZWxmKToKICAgICAgICAgIyBjaGVjayB0aGF0IHRoaXMgZG9lc24ndCBjaGFpbiBleGNlcHRpb25zIG5lZWRsZXNzbHkgKHNlZSAjMTc1NzIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgZToKQEAgLTI5MCw3ICszMDksNyBAQAogCiAgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKICAgICAgICAgIyBUZXN0IHdlZWtkYXkgZGlyZWN0aXZlcwotICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQScsICdhJywgJ3cnKToKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ0EnLCAnYScsICd3JywgJ3UnKToKICAgICAgICAgICAgIHNlbGYuaGVscGVyKGRpcmVjdGl2ZSw2KQogCiAgICAgZGVmIHRlc3RfanVsaWFuKHNlbGYpOgpAQCAtNDU3LDE2ICs0NzYsMjAgQEAKICAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byBpbmZlciBkYXRlIGlmIGdpdmVuIHllYXIsIHdlZWsgb2YgeWVhciAoJVUgb3IgJVcpCiAgICAgICAgICMgYW5kIGRheSBvZiB0aGUgd2VlawogICAgICAgICBkZWYgdGVzdF9oZWxwZXIoeW1kX3R1cGxlLCB0ZXN0X3JlYXNvbik6Ci0gICAgICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnVycsICdVJyk6Ci0gICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlJVkgJSUlcyAlJXciICUgZGlyZWN0aXZlCi0gICAgICAgICAgICAgICAgZHRfZGF0ZSA9IGRhdGV0aW1lX2RhdGUoKnltZF90dXBsZSkKLSAgICAgICAgICAgICAgICBzdHJwX2lucHV0ID0gZHRfZGF0ZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nKQotICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cnBfaW5wdXQsIGZvcm1hdF9zdHJpbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzozXSA9PSB5bWRfdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXMpIHRlc3QgZmFpbGVkIHcvICclcyc6ICVzICE9ICVzICglcyAhPSAlcykiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdF9yZWFzb24sIGRpcmVjdGl2ZSwgc3RycF9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbOjNdLCB5bWRfdHVwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzddLCBkdF9kYXRlLnRpbWV0dXBsZSgpWzddKSkKKyAgICAgICAgICAgIGZvciB5ZWFyX3dlZWtfZm9ybWF0IGluICgnJVkgJVcnLCAnJVkgJVUnLCAnJUcgJVYnKToKKyAgICAgICAgICAgICAgICBmb3Igd2Vla2RheV9mb3JtYXQgaW4gKCcldycsICcldScsICclYScsICclQScpOgorICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nID0geWVhcl93ZWVrX2Zvcm1hdCArICcgJyArIHdlZWtkYXlfZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRlc3RfcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlPXltZF90dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0PWZvcm1hdF9zdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgZHRfZGF0ZSA9IGRhdGV0aW1lX2RhdGUoKnltZF90dXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfaW5wdXQgPSBkdF9kYXRlLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICIlcjogJXMgIT0gJXMiICUgKHN0cnBfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0X2RhdGUudGltZXR1cGxlKClbN10pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLCBtc2cpCiAgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAzKSwgIndlZWsgMCIpCiAgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCA4KSwgImNvbW1vbiBjYXNlIikKICAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDEzKSwgImRheSBvbiBTdW5kYXkiKQpAQCAtNDk4LDMzICs1MjEsNDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHZhbHVlLCBmb3JtYXQpWzotMV0sIGV4cGVjdGVkKQogICAgICAgICBjaGVjaygnMjAxNSAwIDAnLCAnJVkgJVUgJXcnLCAyMDE0LCAxMiwgMjgsIDAsIDAsIDAsIDYsIDM2MikKICAgICAgICAgY2hlY2soJzIwMTUgMCAwJywgJyVZICVXICV3JywgMjAxNSwgMSwgNCwgMCwgMCwgMCwgNiwgNCkKKyAgICAgICAgY2hlY2soJzIwMTUgMSAxJywgJyVHICVWICV1JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMScsICclWSAlVSAldycsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzYzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDEnLCAnJVkgJVcgJXcnLCAyMDE0LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2MykKKyAgICAgICAgY2hlY2soJzIwMTUgMSAyJywgJyVHICVWICV1JywgMjAxNCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMicsICclWSAlVSAldycsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQogICAgICAgICBjaGVjaygnMjAxNSAwIDInLCAnJVkgJVcgJXcnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NCkKKyAgICAgICAgY2hlY2soJzIwMTUgMSAzJywgJyVHICVWICV1JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMycsICclWSAlVSAldycsIDIwMTQsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY1KQogICAgICAgICBjaGVjaygnMjAxNSAwIDMnLCAnJVkgJVcgJXcnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKKyAgICAgICAgY2hlY2soJzIwMTUgMSA0JywgJyVHICVWICV1JywgMjAxNSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKICAgICAgICAgY2hlY2soJzIwMTUgMCA0JywgJyVZICVVICV3JywgMjAxNSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKICAgICAgICAgY2hlY2soJzIwMTUgMCA0JywgJyVZICVXICV3JywgMjAxNSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKKyAgICAgICAgY2hlY2soJzIwMTUgMSA1JywgJyVHICVWICV1JywgMjAxNSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKICAgICAgICAgY2hlY2soJzIwMTUgMCA1JywgJyVZICVVICV3JywgMjAxNSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKICAgICAgICAgY2hlY2soJzIwMTUgMCA1JywgJyVZICVXICV3JywgMjAxNSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKKyAgICAgICAgY2hlY2soJzIwMTUgMSA2JywgJyVHICVWICV1JywgMjAxNSwgMSwgMywgMCwgMCwgMCwgNSwgMykKICAgICAgICAgY2hlY2soJzIwMTUgMCA2JywgJyVZICVVICV3JywgMjAxNSwgMSwgMywgMCwgMCwgMCwgNSwgMykKICAgICAgICAgY2hlY2soJzIwMTUgMCA2JywgJyVZICVXICV3JywgMjAxNSwgMSwgMywgMCwgMCwgMCwgNSwgMykKKyAgICAgICAgY2hlY2soJzIwMTUgMSA3JywgJyVHICVWICV1JywgMjAxNSwgMSwgNCwgMCwgMCwgMCwgNiwgNCkKIAogICAgICAgICBjaGVjaygnMjAwOSAwIDAnLCAnJVkgJVUgJXcnLCAyMDA4LCAxMiwgMjgsIDAsIDAsIDAsIDYsIDM2MykKICAgICAgICAgY2hlY2soJzIwMDkgMCAwJywgJyVZICVXICV3JywgMjAwOSwgMSwgNCwgMCwgMCwgMCwgNiwgNCkKKyAgICAgICAgY2hlY2soJzIwMDkgMSAxJywgJyVHICVWICV1JywgMjAwOCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMScsICclWSAlVSAldycsIDIwMDgsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzY0KQogICAgICAgICBjaGVjaygnMjAwOSAwIDEnLCAnJVkgJVcgJXcnLCAyMDA4LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2NCkKKyAgICAgICAgY2hlY2soJzIwMDkgMSAyJywgJyVHICVWICV1JywgMjAwOCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMicsICclWSAlVSAldycsIDIwMDgsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY1KQogICAgICAgICBjaGVjaygnMjAwOSAwIDInLCAnJVkgJVcgJXcnLCAyMDA4LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NSkKKyAgICAgICAgY2hlY2soJzIwMDkgMSAzJywgJyVHICVWICV1JywgMjAwOCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjYpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMycsICclWSAlVSAldycsIDIwMDgsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY2KQogICAgICAgICBjaGVjaygnMjAwOSAwIDMnLCAnJVkgJVcgJXcnLCAyMDA4LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NikKKyAgICAgICAgY2hlY2soJzIwMDkgMSA0JywgJyVHICVWICV1JywgMjAwOSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKICAgICAgICAgY2hlY2soJzIwMDkgMCA0JywgJyVZICVVICV3JywgMjAwOSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKICAgICAgICAgY2hlY2soJzIwMDkgMCA0JywgJyVZICVXICV3JywgMjAwOSwgMSwgMSwgMCwgMCwgMCwgMywgMSkKKyAgICAgICAgY2hlY2soJzIwMDkgMSA1JywgJyVHICVWICV1JywgMjAwOSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKICAgICAgICAgY2hlY2soJzIwMDkgMCA1JywgJyVZICVVICV3JywgMjAwOSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKICAgICAgICAgY2hlY2soJzIwMDkgMCA1JywgJyVZICVXICV3JywgMjAwOSwgMSwgMiwgMCwgMCwgMCwgNCwgMikKKyAgICAgICAgY2hlY2soJzIwMDkgMSA2JywgJyVHICVWICV1JywgMjAwOSwgMSwgMywgMCwgMCwgMCwgNSwgMykKICAgICAgICAgY2hlY2soJzIwMDkgMCA2JywgJyVZICVVICV3JywgMjAwOSwgMSwgMywgMCwgMCwgMCwgNSwgMykKICAgICAgICAgY2hlY2soJzIwMDkgMCA2JywgJyVZICVXICV3JywgMjAwOSwgMSwgMywgMCwgMCwgMCwgNSwgMykKKyAgICAgICAgY2hlY2soJzIwMDkgMSA3JywgJyVHICVWICV1JywgMjAwOSwgMSwgNCwgMCwgMCwgMCwgNiwgNCkKKwogCiBjbGFzcyBDYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0IHRoYXQgY2FjaGluZyB3b3JrcyBwcm9wZXJseS4iIiIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQppbmRleCA0NzA0ZDQ5Li5iYTkxYmJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CkBAIC0xLDIwICsxLDE2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBzY3JpcHRfaGVscGVyCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCBzdWJwcm9jZXNzCiBpbXBvcnQgc3lzCiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgaW8KLWltcG9ydCBsb2NhbGUKIGltcG9ydCBvcwogaW1wb3J0IGVycm5vCiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB0aW1lCi1pbXBvcnQgcmUKIGltcG9ydCBzZWxlY3RvcnMKIGltcG9ydCBzeXNjb25maWcKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNodXRpbAogaW1wb3J0IGdjCkBAIC00NDgsOCArNDQ0LDggQEAKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZSgib3JhbmdlIiknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCBiIm9yYW5nZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCBiIm9yYW5nZSIpCiAKICAgICBkZWYgdGVzdF9zdGRvdXRfZmlsZWRlcyhzZWxmKToKICAgICAgICAgIyBzdGRvdXQgaXMgc2V0IHRvIG9wZW4gZmlsZSBkZXNjcmlwdG9yCkBAIC00NzksOCArNDc1LDggQEAKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgic3RyYXdiZXJyeSIpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3RkZXJyLnJlYWQoKSwgYiJzdHJhd2JlcnJ5IikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZGVyci5yZWFkKCksIGIic3RyYXdiZXJyeSIpCiAKICAgICBkZWYgdGVzdF9zdGRlcnJfZmlsZWRlcyhzZWxmKToKICAgICAgICAgIyBzdGRlcnIgaXMgc2V0IHRvIG9wZW4gZmlsZSBkZXNjcmlwdG9yCkBAIC01MzUsOCArNTMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJvcmFuZ2UiKSddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIiYXBwbGVvcmFuZ2UiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJhcHBsZW9yYW5nZSIpCiAKICAgICBkZWYgdGVzdF9zdGRvdXRfc3RkZXJyX2ZpbGUoc2VsZik6CiAgICAgICAgICMgY2FwdHVyZSBzdGRvdXQgYW5kIHN0ZGVyciB0byB0aGUgc2FtZSBvcGVuIGZpbGUKQEAgLTc5NCwxOCArNzkwLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPTEpCi0gICAgICAgIHAuc3RkaW4ud3JpdGUoImxpbmUxXG4iKQotICAgICAgICBwLnN0ZGluLmZsdXNoKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLCAibGluZTFcbiIpCi0gICAgICAgIHAuc3RkaW4ud3JpdGUoImxpbmUzXG4iKQotICAgICAgICBwLnN0ZGluLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWRsaW5lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUyXG4iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUzXG4iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTRcbmxpbmU1XG5saW5lNlxubGluZTdcbmxpbmU4IikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTFcbiIpCisgICAgICAgICAgICBwLnN0ZGluLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZGxpbmUoKSwgImxpbmUxXG4iKQorICAgICAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTNcbiIpCisgICAgICAgICAgICBwLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZGxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUyXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKDYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTNcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmU0XG5saW5lNVxubGluZTZcbmxpbmU3XG5saW5lOCIpCiAKICAgICBkZWYgdGVzdF91bml2ZXJzYWxfbmV3bGluZXNfY29tbXVuaWNhdGUoc2VsZik6CiAgICAgICAgICMgdW5pdmVyc2FsIG5ld2xpbmVzIHRocm91Z2ggY29tbXVuaWNhdGUoKQpAQCAtMTQzMSw2ICsxNDI4LDI3IEBACiAgICAgICAgICAgICBwLndhaXQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1wLnJldHVybmNvZGUsIHNpZ25hbC5TSUdBQlJUKQogCisgICAgZGVmIHRlc3RfQ2FsbGVkUHJvY2Vzc0Vycm9yX3N0cl9zaWduYWwoc2VsZik6CisgICAgICAgIGVyciA9IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKC1pbnQoc2lnbmFsLlNJR0FCUlQpLCAiZmFrZSBjbWQiKQorICAgICAgICBlcnJvcl9zdHJpbmcgPSBzdHIoZXJyKQorICAgICAgICAjIFdlJ3JlIHJlbHlpbmcgb24gdGhlIHJlcHIoKSBvZiB0aGUgc2lnbmFsLlNpZ25hbHMgaW50ZW51bSB0byBwcm92aWRlCisgICAgICAgICMgdGhlIHdvcmQgc2lnbmFsLCB0aGUgc2lnbmFsIG5hbWUgYW5kIHRoZSBudW1lcmljIHZhbHVlLgorICAgICAgICBzZWxmLmFzc2VydEluKCJzaWduYWwiLCBlcnJvcl9zdHJpbmcubG93ZXIoKSkKKyAgICAgICAgIyBXZSdyZSBub3QgYmVpbmcgc3BlY2lmaWMgYWJvdXQgdGhlIHNpZ25hbCBuYW1lIGFzIHNvbWUgc2lnbmFscyBoYXZlCisgICAgICAgICMgbXVsdGlwbGUgbmFtZXMgYW5kIHdoaWNoIG5hbWUgaXMgcmV2ZWFsZWQgY2FuIHZhcnkuCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlNJRyIsIGVycm9yX3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzdHIoc2lnbmFsLlNJR0FCUlQpLCBlcnJvcl9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9DYWxsZWRQcm9jZXNzRXJyb3Jfc3RyX3Vua25vd25fc2lnbmFsKHNlbGYpOgorICAgICAgICBlcnIgPSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcigtOTg3NjU0MywgImZha2UgY21kIikKKyAgICAgICAgZXJyb3Jfc3RyaW5nID0gc3RyKGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigidW5rbm93biBzaWduYWwgOTg3NjU0My4iLCBlcnJvcl9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9DYWxsZWRQcm9jZXNzRXJyb3Jfc3RyX25vbl96ZXJvKHNlbGYpOgorICAgICAgICBlcnIgPSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcigyLCAiZmFrZSBjbWQiKQorICAgICAgICBlcnJvcl9zdHJpbmcgPSBzdHIoZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKCJub24temVybyBleGl0IHN0YXR1cyAyLiIsIGVycm9yX3N0cmluZykKKwogICAgIGRlZiB0ZXN0X3ByZWV4ZWMoc2VsZik6CiAgICAgICAgICMgRElTQ0xBSU1FUjogU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaXMgKm5vdCogYSBnb29kIHVzZQogICAgICAgICAjIG9mIGEgcHJlZXhlY19mbi4gIFRoaXMgaXMgbWVyZWx5IGEgdGVzdC4KQEAgLTE0MzksOCArMTQ1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZShvcy5nZXRlbnYoIkZSVUlUIikpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49bGFtYmRhOiBvcy5wdXRlbnYoIkZSVUlUIiwgImFwcGxlIikpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIiYXBwbGUiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJhcHBsZSIpCiAKICAgICBkZWYgdGVzdF9wcmVleGVjX2V4Y2VwdGlvbihzZWxmKToKICAgICAgICAgZGVmIHJhaXNlX2l0KCk6CkBAIC0xNTg4LDggKzE2MDYsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbImVjaG8gJEZSVUlUIl0sIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoYiIgXHRcclxuXGYiKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQogCiAgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzdHJpbmcpCkBAIC0xNTk4LDggKzE2MTYsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigiZWNobyAkRlJVSVQiLCBzaGVsbD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcChiIiBcdFxyXG5cZiIpLCBiImFwcGxlIikKIAogICAgIGRlZiB0ZXN0X2NhbGxfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCBvbiBVTklYCkBAIC0xNjMxLDggKzE2NDksOCBAQAogICAgICAgICBmb3Igc2ggaW4gc2hlbGxzOgogICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oImVjaG8gJDAiLCBleGVjdXRhYmxlPXNoLCBzaGVsbD1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKLSAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksIGJ5dGVzKHNoLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCBieXRlcyhzaCwgJ2FzY2lpJykpCiAKICAgICBkZWYgX2tpbGxfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKICAgICAgICAgIyBEbyBub3QgaW5oZXJpdCBmaWxlIGhhbmRsZXMgZnJvbSB0aGUgcGFyZW50LgpAQCAtMjI5MCw3ICsyMzA4LDkgQEAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQogICAgICAgICBpZGVudCA9IGlkKHApCiAgICAgICAgIHBpZCA9IHAucGlkCi0gICAgICAgIGRlbCBwCisgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJlc291cmNlV2FybmluZykpOgorICAgICAgICAgICAgcCA9IE5vbmUKKwogICAgICAgICAjIGNoZWNrIHRoYXQgcCBpcyBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQogCkBAIC0yMzA5LDcgKzIzMjksOSBAQAogICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCiAgICAgICAgIGlkZW50ID0gaWQocCkKICAgICAgICAgcGlkID0gcC5waWQKLSAgICAgICAgZGVsIHAKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUmVzb3VyY2VXYXJuaW5nKSk6CisgICAgICAgICAgICBwID0gTm9uZQorCiAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHS0lMTCkKICAgICAgICAgIyBjaGVjayB0aGF0IHAgaXMgaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdAogICAgICAgICBzZWxmLmFzc2VydEluKGlkZW50LCBbaWQobykgZm9yIG8gaW4gc3VicHJvY2Vzcy5fYWN0aXZlXSkKQEAgLTI1MDEsOCArMjUyMyw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsic2V0Il0sIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCiAKICAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHN0cmluZykKQEAgLTI1MTEsOCArMjUzMyw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJzZXQiLCBzaGVsbD0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQogCiAgICAgZGVmIHRlc3RfY2FsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IG9uIFdpbmRvd3MKQEAgLTI1MzEsMTYgKzI1NTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCi0gICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgotICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCi0gICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKLSAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCi0gICAgICAgIHJldHVybmNvZGUgPSBwLndhaXQoKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCisgICAgICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCisgICAgICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCisgICAgICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCisgICAgICAgICAgICByZXR1cm5jb2RlID0gcC53YWl0KCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXR1cm5jb2RlLCAwKQogCiAgICAgZGVmIF9raWxsX2RlYWRfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKQEAgLTI1NTMsMTkgKzI1NzMsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCi0gICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCi0gICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgotICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCi0gICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCi0gICAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICAgICAgIyBUaGlzIHNob3VsZG4ndCByYWlzZSBldmVuIHRob3VnaCB0aGUgY2hpbGQgaXMgbm93IGRlYWQKLSAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQotICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKLSAgICAgICAgcmMgPSBwLndhaXQoKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCisgICAgICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCisgICAgICAgICAgICAjIFRoZSBwcm9jZXNzIHNob3VsZCBlbmQgYWZ0ZXIgdGhpcworICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgIyBUaGlzIHNob3VsZG4ndCByYWlzZSBldmVuIHRob3VnaCB0aGUgY2hpbGQgaXMgbm93IGRlYWQKKyAgICAgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKKyAgICAgICAgICAgIHJjID0gcC53YWl0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDIpCiAKICAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbChzZWxmKToKQEAgLTI2MDgsOCArMjYyNiw3IEBACiAKICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CiAgICAgICAgICIiIkVuc3VyZSB0aGF0IF9fYWxsX18gaXMgcG9wdWxhdGVkIHByb3Blcmx5LiIiIgotICAgICAgICAjIFNUQVJUVVBJTkZPIGFkZGVkIHRvIF9fYWxsX18gaW4gMy42Ci0gICAgICAgIGludGVudGlvbmFsbHlfZXhjbHVkZWQgPSB7Imxpc3QyY21kbGluZSIsICJTVEFSVFVQSU5GTyIsICJIYW5kbGUifQorICAgICAgICBpbnRlbnRpb25hbGx5X2V4Y2x1ZGVkID0geyJsaXN0MmNtZGxpbmUiLCAiSGFuZGxlIn0KICAgICAgICAgZXhwb3J0ZWQgPSBzZXQoc3VicHJvY2Vzcy5fX2FsbF9fKQogICAgICAgICBwb3NzaWJsZV9leHBvcnRzID0gc2V0KCkKICAgICAgICAgaW1wb3J0IHR5cGVzCkBAIC0yNjU0LDExICsyNjcxLDExIEBACiAgICAgZGVmIHdpdGhfc3BhY2VzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIGt3YXJnc1snc3Rkb3V0J10gPSBzdWJwcm9jZXNzLlBJUEUKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oKmFyZ3MsICoqa3dhcmdzKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgcC5zdGRvdXQucmVhZCAoKS5kZWNvZGUoIm1iY3MiKSwKLSAgICAgICAgICAiMiBbJXIsICdhYiBjZCddIiAlIHNlbGYuZm5hbWUKLSAgICAgICAgKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICBwLnN0ZG91dC5yZWFkICgpLmRlY29kZSgibWJjcyIpLAorICAgICAgICAgICAgICAiMiBbJXIsICdhYiBjZCddIiAlIHNlbGYuZm5hbWUKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X3NoZWxsX3N0cmluZ193aXRoX3NwYWNlcyhzZWxmKToKICAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgd2l0aCBzcGFjZXMgb24gV2luZG93cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdW5hdS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VuYXUucHkKaW5kZXggMGY0MTM0ZS4uYmMxZjQ2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5CkBAIC0xLDQgKzEsMyBAQAotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IGF1ZGlvdGVzdHMKIGZyb20gYXVkaW9vcCBpbXBvcnQgYnl0ZXN3YXAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQppbmRleCAyYzAwNDE3Li4yNjlkOWJmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CkBAIC05LDEzICs5LDExIEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogVEVTVEZOID0gc3VwcG9ydC5URVNURk4KLVRFU1RESVJOID0gb3MucGF0aC5iYXNlbmFtZSh0ZW1wZmlsZS5ta2R0ZW1wKGRpcj0nLicpKQogCiAKIGNsYXNzIFRlc3RTdXBwb3J0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHN1cHBvcnQudW5saW5rKFRFU1RGTikKLSAgICAgICAgc3VwcG9ydC5ybXRyZWUoVEVTVERJUk4pCiAgICAgdGVhckRvd24gPSBzZXRVcAogCiAgICAgZGVmIHRlc3RfaW1wb3J0X21vZHVsZShzZWxmKToKQEAgLTQ4LDYgKzQ2LDEwIEBACiAgICAgICAgIHN1cHBvcnQudW5saW5rKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0X3JtdHJlZShzZWxmKToKKyAgICAgICAgVEVTVERJUk4gPSBvcy5wYXRoLmJhc2VuYW1lKHRlbXBmaWxlLm1rZHRlbXAoZGlyPScuJykpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgVEVTVERJUk4pCisgICAgICAgIHN1cHBvcnQucm10cmVlKFRFU1RESVJOKQorCiAgICAgICAgIG9zLm1rZGlyKFRFU1RESVJOKQogICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oVEVTVERJUk4sIFRFU1RESVJOKSkKICAgICAgICAgc3VwcG9ydC5ybXRyZWUoVEVTVERJUk4pCkBAIC0yMjgsNyArMjMwLDggQEAKIAogICAgIGRlZiB0ZXN0X2NoZWNrX3N5bnRheF9lcnJvcihzZWxmKToKICAgICAgICAgc3VwcG9ydC5jaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImRlZiBjbGFzcyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBzdXBwb3J0LmNoZWNrX3N5bnRheF9lcnJvciwgc2VsZiwgIjEiKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIHN1cHBvcnQuY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4PTEiKQogCiAgICAgZGVmIHRlc3RfQ2xlYW5JbXBvcnQoc2VsZik6CiAgICAgICAgIGltcG9ydCBpbXBvcnRsaWIKQEAgLTMxMiw2ICszMTUsMjggQEAKICAgICAgICAgICAgICAgICBzZWxmLk90aGVyQ2xhc3MsIHNlbGYuUmVmQ2xhc3MsIGlnbm9yZT1pZ25vcmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KCksIG1pc3NpbmdfaXRlbXMpCiAKKyAgICBkZWYgdGVzdF9jaGVja19fYWxsX18oc2VsZik6CisgICAgICAgIGV4dHJhID0geyd0ZW1wZGlyJ30KKyAgICAgICAgYmxhY2tsaXN0ID0geyd0ZW1wbGF0ZSd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICAgICBleHRyYSA9IHsnVGV4dFRlc3RSZXN1bHQnLCAnaW5zdGFsbEhhbmRsZXInfQorICAgICAgICBibGFja2xpc3QgPSB7J2xvYWRfdGVzdHMnLCAiVGVzdFByb2dyYW0iLCAiQmFzZVRlc3RTdWl0ZSJ9CisKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidW5pdHRlc3QucmVzdWx0IiwgInVuaXR0ZXN0LmNhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaXR0ZXN0LnN1aXRlIiwgInVuaXR0ZXN0LmxvYWRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3QubWFpbiIsICJ1bml0dGVzdC5ydW5uZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuaXR0ZXN0LnNpZ25hbHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHN1cHBvcnQuY2hlY2tfX2FsbF9fLCBzZWxmLCB1bml0dGVzdCkKKwogICAgICMgWFhYIC1mb2xsb3dzIGEgbGlzdCBvZiB1bnRlc3RlZCBBUEkKICAgICAjIG1ha2VfbGVnYWN5X3B5YwogICAgICMgaXNfcmVzb3VyY2VfZW5hYmxlZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeW1ib2wucHkgYi9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTMwNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW1ib2wucHkKQEAgLTAsMCArMSw1NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN1YnByb2Nlc3MKKworCitTWU1CT0xfRklMRSAgICAgICAgICAgICAgPSBzdXBwb3J0LmZpbmRmaWxlKCdzeW1ib2wucHknKQorR1JBTU1BUl9GSUxFICAgICAgICAgICAgID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4uJywgJy4uJywgJ0luY2x1ZGUnLCAnZ3JhbWluaXQuaCcpCitURVNUX1BZX0ZJTEUgICAgICAgICAgICAgPSAnc3ltYm9sX3Rlc3QucHknCisKKworY2xhc3MgVGVzdFN5bWJvbEdlbmVyYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9jb3B5X2ZpbGVfd2l0aG91dF9nZW5lcmF0ZWRfc3ltYm9scyhzZWxmLCBzb3VyY2VfZmlsZSwgZGVzdF9maWxlKToKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgd2l0aCBvcGVuKGRlc3RfZmlsZSwgJ3cnKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlbGluZXMobGluZXNbOmxpbmVzLmluZGV4KCIjLS1zdGFydCBjb25zdGFudHMtLVxuIikgKyAxXSkKKyAgICAgICAgICAgIGZwLndyaXRlbGluZXMobGluZXNbbGluZXMuaW5kZXgoIiMtLWVuZCBjb25zdGFudHMtLVxuIik6XSkKKworICAgIGRlZiBfZ2VuZXJhdGVfc3ltYm9scyhzZWxmLCBncmFtbWFyX2ZpbGUsIHRhcmdldF9zeW1ib2xfcHlfZmlsZSk6CisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZTUJPTF9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hcl9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3N5bWJvbF9weV9maWxlXSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3RkZXJyID0gcHJvYy5jb21tdW5pY2F0ZSgpWzFdCisgICAgICAgIHJldHVybiBwcm9jLnJldHVybmNvZGUsIHN0ZGVycgorCisgICAgZGVmIGNvbXBhcmVfZmlsZXMoc2VsZiwgZmlsZTEsIGZpbGUyKToKKyAgICAgICAgd2l0aCBvcGVuKGZpbGUxKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzMSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHdpdGggb3BlbihmaWxlMikgYXMgZnA6CisgICAgICAgICAgICBsaW5lczIgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzMSwgbGluZXMyKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3Qgb3MucGF0aC5leGlzdHMoR1JBTU1BUl9GSUxFKSwKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0IG9ubHkgd29ya3MgZnJvbSBzb3VyY2UgYnVpbGQgZGlyZWN0b3J5JykKKyAgICBkZWYgdGVzdF9yZWFsX2dyYW1tYXJfYW5kX3N5bWJvbF9maWxlKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIG91dHB1dCkKKworICAgICAgICBzZWxmLl9jb3B5X2ZpbGVfd2l0aG91dF9nZW5lcmF0ZWRfc3ltYm9scyhTWU1CT0xfRklMRSwgb3V0cHV0KQorCisgICAgICAgIGV4aXRjb2RlLCBzdGRlcnIgPSBzZWxmLl9nZW5lcmF0ZV9zeW1ib2xzKEdSQU1NQVJfRklMRSwgb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4aXRjb2RlKQorCisgICAgICAgIHNlbGYuY29tcGFyZV9maWxlcyhTWU1CT0xfRklMRSwgb3V0cHV0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bnRheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CmluZGV4IDA1NzQ0MWMuLjM4ZmM0MTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5CkBAIC0zNSwxNCArMzUsNiBAQAogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBrZXl3b3JkCiAKLUl0J3MgYSBzeW50YXggZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSB0dXBsZS4gIFdoeSBpc24ndCBpdCBhbgotZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSBsaXN0PyAgSXQgd2lsbCBhbHdheXMgcmFpc2Ugc29tZSBlcnJvciBhdAotcnVudGltZS4KLQotPj4+ICgpID0gMQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byAoKQotCiA+Pj4gZigpID0gMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCkBAIC00OTEsMTAgKzQ4Myw2IEBACiAgICAuLi4KIFN5bnRheEVycm9yOiBrZXl3b3JkIGFyZ3VtZW50IHJlcGVhdGVkCiAKLT4+PiBkZWwgKCkKLVRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLVN5bnRheEVycm9yOiBjYW4ndCBkZWxldGUgKCkKLQogPj4+IHsxLCAyLCAzfSA9IDQyCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGxpdGVyYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKaW5kZXggNTA5YmMzZS4uMjVjNTgzNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKQEAgLTMzOCw4ICszMzgsOCBAQAogCiAgICAgZGVmIHRlc3RfMTRfb25saW5lcl9pZihzZWxmKToKICAgICAgICAgZGVmIG9ubGluZXJzKCk6Ci0gICAgICAgICAgICBpZiBUcnVlOiBGYWxzZQotICAgICAgICAgICAgZWxzZTogVHJ1ZQorICAgICAgICAgICAgaWYgVHJ1ZTogeD1GYWxzZQorICAgICAgICAgICAgZWxzZTogeD1UcnVlCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKICAgICAgICAgICAgIG9ubGluZXJzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGFiZmIzNGQuLmQ3Nzg1Y2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTIwNzQsNiArMjA3NCwyNCBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgdGFyZmlsZS5pdG4oMHgxMDAwMDAwMDAwMCwgNiwgdGFyZmlsZS5HTlVfRk9STUFUKQogCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J3ZlcnNpb24nLCAnZ3JwJywgJ3B3ZCcsICdzeW1saW5rX2V4Y2VwdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAnTlVMJywgJ0JMT0NLU0laRScsICdSRUNPUkRTSVpFJywgJ0dOVV9NQUdJQycsCisgICAgICAgICAgICAgICAgICAgICAnUE9TSVhfTUFHSUMnLCAnTEVOR1RIX05BTUUnLCAnTEVOR1RIX0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0xFTkdUSF9QUkVGSVgnLCAnUkVHVFlQRScsICdBUkVHVFlQRScsICdMTktUWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdTWU1UWVBFJywgJ0NIUlRZUEUnLCAnQkxLVFlQRScsICdESVJUWVBFJywgJ0ZJRk9UWVBFJywKKyAgICAgICAgICAgICAgICAgICAgICdDT05UVFlQRScsICdHTlVUWVBFX0xPTkdOQU1FJywgJ0dOVVRZUEVfTE9OR0xJTksnLAorICAgICAgICAgICAgICAgICAgICAgJ0dOVVRZUEVfU1BBUlNFJywgJ1hIRFRZUEUnLCAnWEdMVFlQRScsICdTT0xBUklTX1hIRFRZUEUnLAorICAgICAgICAgICAgICAgICAgICAgJ1NVUFBPUlRFRF9UWVBFUycsICdSRUdVTEFSX1RZUEVTJywgJ0dOVV9UWVBFUycsCisgICAgICAgICAgICAgICAgICAgICAnUEFYX0ZJRUxEUycsICdQQVhfTkFNRV9GSUVMRFMnLCAnUEFYX05VTUJFUl9GSUVMRFMnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0bicsICdudHMnLCAnbnRpJywgJ2l0bicsICdjYWxjX2Noa3N1bXMnLCAnY29weWZpbGVvYmonLAorICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVtb2RlJywKKyAgICAgICAgICAgICAgICAgICAgICdFbXB0eUhlYWRlckVycm9yJywgJ1RydW5jYXRlZEhlYWRlckVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICdFT0ZIZWFkZXJFcnJvcicsICdJbnZhbGlkSGVhZGVyRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgJ1N1YnNlcXVlbnRIZWFkZXJFcnJvcicsICdFeEZpbGVPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ21haW4nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB0YXJmaWxlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiAKIGNsYXNzIENvbW1hbmRMaW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKaW5kZXggOGUyMTlmNC4uNTFkODJlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKQEAgLTEsNyArMSw2IEBACiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgc2VsZWN0b3JzCiBpbXBvcnQgdGVsbmV0bGliCi1pbXBvcnQgdGltZQogaW1wb3J0IGNvbnRleHRsaWIKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC00Miw2ICs0MSwxMSBAQAogICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKICAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQogCisgICAgZGVmIHRlc3RDb250ZXh0TWFuYWdlcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkgYXMgdG46CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZSh0bi5nZXRfc29ja2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHRuLmdldF9zb2NrZXQoKSkKKwogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CmluZGV4IDFjOWMxZWEuLmE0YWE0OWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC04LDcgKzgsNiBAQAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiAKIGltcG9ydCByYW5kb20KLWltcG9ydCByZQogaW1wb3J0IHN5cwogX3RocmVhZCA9IGltcG9ydF9tb2R1bGUoJ190aHJlYWQnKQogdGhyZWFkaW5nID0gaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKQEAgLTE5LDYgKzE4LDcgQEAKIGltcG9ydCBzdWJwcm9jZXNzCiAKIGZyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogIyBCZXR3ZWVuIGZvcmsoKSBhbmQgZXhlYygpLCBvbmx5IGFzeW5jLXNhZmUgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIChpc3N1ZXMKQEAgLTEwOTksNSArMTA5OSwxMiBAQAogY2xhc3MgQmFycmllclRlc3RzKGxvY2tfdGVzdHMuQmFycmllclRlc3RzKToKICAgICBiYXJyaWVydHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQmFycmllcikKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGV4dHJhID0geyJUaHJlYWRFcnJvciJ9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnY3VycmVudFRocmVhZCcsICdhY3RpdmVDb3VudCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHRocmVhZGluZywgKCd0aHJlYWRpbmcnLCAnX3RocmVhZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCA3NmI4OTRlLi5mODgzYzQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xLDYgKzEsOCBAQAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CitpbXBvcnQgZGVjaW1hbAogaW1wb3J0IGVudW0KIGltcG9ydCBsb2NhbGUKK2ltcG9ydCBtYXRoCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBzeXMKIGltcG9ydCBzeXNjb25maWcKQEAgLTIxLDE3ICsyMywyNyBAQAogVElNRV9NQVhZRUFSID0gKDEgPDwgOCAqIFNJWkVPRl9JTlQgLSAxKSAtIDEKIFRJTUVfTUlOWUVBUiA9IC1USU1FX01BWFlFQVIgLSAxCiAKK1NFQ19UT19VUyA9IDEwICoqIDYKIFVTX1RPX05TID0gMTAgKiogMwogTVNfVE9fTlMgPSAxMCAqKiA2CiBTRUNfVE9fTlMgPSAxMCAqKiA5CitOU19UT19TRUMgPSAxMCAqKiA5CiAKIGNsYXNzIF9QeVRpbWUoZW51bS5JbnRFbnVtKToKICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCiAgICAgUk9VTkRfRkxPT1IgPSAwCiAgICAgIyBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKQogICAgIFJPVU5EX0NFSUxJTkcgPSAxCisgICAgIyBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlcgorICAgIFJPVU5EX0hBTEZfRVZFTiA9IDIKIAotQUxMX1JPVU5ESU5HX01FVEhPRFMgPSAoX1B5VGltZS5ST1VORF9GTE9PUiwgX1B5VGltZS5ST1VORF9DRUlMSU5HKQorIyBSb3VuZGluZyBtb2RlcyBzdXBwb3J0ZWQgYnkgUHlUaW1lCitST1VORElOR19NT0RFUyA9ICgKKyAgICAjIChQeVRpbWUgcm91bmRpbmcgbWV0aG9kLCBkZWNpbWFsIHJvdW5kaW5nIG1ldGhvZCkKKyAgICAoX1B5VGltZS5ST1VORF9GTE9PUiwgZGVjaW1hbC5ST1VORF9GTE9PUiksCisgICAgKF9QeVRpbWUuUk9VTkRfQ0VJTElORywgZGVjaW1hbC5ST1VORF9DRUlMSU5HKSwKKyAgICAoX1B5VGltZS5ST1VORF9IQUxGX0VWRU4sIGRlY2ltYWwuUk9VTkRfSEFMRl9FVkVOKSwKKykKIAogCiBjbGFzcyBUaW1lVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNjA3LDc5ICs2MTksNiBAQAogCiAKIGNsYXNzIFRlc3RQeXRpbWUodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5pbnZhbGlkX3ZhbHVlcyA9ICgKLSAgICAgICAgICAgIC0oMiAqKiAxMDApLCAyICoqIDEwMCwKLSAgICAgICAgICAgIC0oMi4wICoqIDEwMC4wKSwgMi4wICoqIDEwMC4wLAotICAgICAgICApCi0KLSAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKLSAgICBkZWYgdGVzdF90aW1lX3Qoc2VsZik6Ci0gICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdAotICAgICAgICBmb3Igb2JqLCB0aW1lX3QsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIFJvdW5kIHRvd2FyZHMgbWludXMgaW5maW5pdHkgKC1pbmYpCi0gICAgICAgICAgICAoMCwgMCwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEsIC0xLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuOSwgLTIsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMCwgMSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS45LCAxLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAwLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4wLCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS45LCAtMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjAsIDEsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS45LCAyLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRpbWVfb2JqZWN0X3RvX3RpbWVfdChvYmosIHJuZCksIHRpbWVfdCkKLQotICAgICAgICBybmQgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIGZvciBpbnZhbGlkIGluIHNlbGYuaW52YWxpZF92YWx1ZXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0aW1lX29iamVjdF90b190aW1lX3QsIGludmFsaWQsIHJuZCkKLQotICAgIEBzdXBwb3J0LmNweXRob25fb25seQotICAgIGRlZiB0ZXN0X3RpbWVzcGVjKHNlbGYpOgotICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lc3BlYwotICAgICAgICBmb3Igb2JqLCB0aW1lc3BlYywgcm5kIGluICgKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBtaW51cyBpbmZpbml0eSAoLWluZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4wLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDFlLTEwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS05LCAoLTEsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xZS0xMCwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4yLCAoLTIsIDgwMDAwMDAwMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDAuOTk5OTk5OTk5OSwgKDAsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5MCwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc4OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTAsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MSwgKC0yLCA4NzY1NDMyMTApLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBpbmZpbml0eSAoK2luZikKLSAgICAgICAgICAgICgwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMCwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxZS05LCAoMCwgMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMWUtMTAsICgwLCAxKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtOSwgKC0xLCA5OTk5OTk5OTkpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS0xMCwgKDAsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjIsICgtMiwgODAwMDAwMDAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgwLjk5OTk5OTk5OTksICgxLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjEyMzQ1Njc4OTAsICgxLCAxMjM0NTY3OTApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5OSwgKDEsIDEyMzQ1Njc5MCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MCwgKC0yLCA4NzY1NDMyMTEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTEsICgtMiwgODc2NTQzMjExKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXNwZWM9dGltZXNwZWMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aW1lX29iamVjdF90b190aW1lc3BlYyhvYmosIHJuZCksIHRpbWVzcGVjKQotCi0gICAgICAgIHJuZCA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgZm9yIGludmFsaWQgaW4gc2VsZi5pbnZhbGlkX3ZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLCBpbnZhbGlkLCBybmQpCi0KICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aW1lLl9TVFJVQ1RfVE1fSVRFTVMgPT0gMTEsICJuZWVkcyB0bV96b25lIHN1cHBvcnQiKQogICAgIGRlZiB0ZXN0X2xvY2FsdGltZV90aW1lem9uZShzZWxmKToKIApAQCAtNzM0LDI2NiArNjczLDI5MSBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGx0LnRtX3pvbmUsIE5vbmUpCiAKIAotQHVuaXR0ZXN0LnNraXBVbmxlc3MoX3Rlc3RjYXBpIGlzIG5vdCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgJ25lZWQgdGhlIF90ZXN0Y2FwaSBtb2R1bGUnKQotY2xhc3MgVGVzdFB5VGltZV90KHVuaXR0ZXN0LlRlc3RDYXNlKToKK0B1bml0dGVzdC5za2lwSWYoX3Rlc3RjYXBpIGlzIE5vbmUsICduZWVkIHRoZSBfdGVzdGNhcGkgbW9kdWxlJykKK2NsYXNzIENQeVRpbWVUZXN0Q2FzZToKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIHRvIHRlc3QgdGhlIEMgX1B5VGltZV90IEFQSS4KKyAgICAiIiIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgU0laRU9GX1RJTUVfVAorICAgICAgICBiaXRzID0gU0laRU9GX1RJTUVfVCAqIDggLSAxCisgICAgICAgIHNlbGYudGltZV90X21pbiA9IC0yICoqIGJpdHMKKyAgICAgICAgc2VsZi50aW1lX3RfbWF4ID0gMiAqKiBiaXRzIC0gMQorCisgICAgZGVmIHRpbWVfdF9maWx0ZXIoc2VsZiwgc2Vjb25kcyk6CisgICAgICAgIHJldHVybiAoc2VsZi50aW1lX3RfbWluIDw9IHNlY29uZHMgPD0gc2VsZi50aW1lX3RfbWF4KQorCisgICAgZGVmIF9yb3VuZGluZ192YWx1ZXMoc2VsZiwgdXNlX2Zsb2F0KToKKyAgICAgICAgIkJ1aWxkIHRpbWVzdGFtcHMgdXNlZCB0byB0ZXN0IHJvdW5kaW5nLiIKKworICAgICAgICB1bml0cyA9IFsxLCBVU19UT19OUywgTVNfVE9fTlMsIFNFQ19UT19OU10KKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBwaWNvc2Vjb25kcyBhcmUgb25seSB0ZXN0ZWQgdG8gcHl0aW1lX2NvbnZlcnRlciBhY2NlcHRpbmcgZmxvYXRzCisgICAgICAgICAgICB1bml0cy5hcHBlbmQoMWUtMykKKworICAgICAgICB2YWx1ZXMgPSAoCisgICAgICAgICAgICAjIHNtYWxsIHZhbHVlcworICAgICAgICAgICAgMSwgMiwgNSwgNywgMTIzLCA0NTYsIDEyMzQsCisgICAgICAgICAgICAjIDEwXmsgLSAxCisgICAgICAgICAgICA5LAorICAgICAgICAgICAgOTksCisgICAgICAgICAgICA5OTksCisgICAgICAgICAgICA5OTk5LAorICAgICAgICAgICAgOTk5OTksCisgICAgICAgICAgICA5OTk5OTksCisgICAgICAgICAgICAjIHRlc3QgaGFsZiBldmVuIHJvdW5kaW5nIG5lYXIgMC41LCAxLjUsIDIuNSwgMy41LCA0LjUKKyAgICAgICAgICAgIDQ5OSwgNTAwLCA1MDEsCisgICAgICAgICAgICAxNDk5LCAxNTAwLCAxNTAxLAorICAgICAgICAgICAgMjUwMCwKKyAgICAgICAgICAgIDM1MDAsCisgICAgICAgICAgICA0NTAwLAorICAgICAgICApCisKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9IFswXQorICAgICAgICBmb3IgdW5pdCBpbiB1bml0czoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgbnMgPSB2YWx1ZSAqIHVuaXQKKyAgICAgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoLW5zLCBucykpCisgICAgICAgIGZvciBwb3cyIGluICgwLCA1LCAxMCwgMTUsIDIyLCAyMywgMjQsIDMwLCAzMyk6CisgICAgICAgICAgICBucyA9ICgyICoqIHBvdzIpICogU0VDX1RPX05TCisgICAgICAgICAgICBuc190aW1lc3RhbXBzLmV4dGVuZCgoCisgICAgICAgICAgICAgICAgLW5zLTEsIC1ucywgLW5zKzEsCisgICAgICAgICAgICAgICAgbnMtMSwgbnMsIG5zKzEKKyAgICAgICAgICAgICkpCisgICAgICAgIGZvciBzZWNvbmRzIGluIChfdGVzdGNhcGkuSU5UX01JTiwgX3Rlc3RjYXBpLklOVF9NQVgpOgorICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5hcHBlbmQoc2Vjb25kcyAqIFNFQ19UT19OUykKKyAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgIyBudW1iZXJzIHdpdGggYW4gZXh0cmFjdCByZXByZXNlbnRhdGlvbiBpbiBJRUVFIDc1NCAoYmFzZSAyKQorICAgICAgICAgICAgZm9yIHBvdzIgaW4gKDMsIDcsIDEwLCAxNSk6CisgICAgICAgICAgICAgICAgbnMgPSAyLjAgKiogKC1wb3cyKQorICAgICAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgtbnMsIG5zKSkKKworICAgICAgICAjIHNlY29uZHMgY2xvc2UgdG8gX1B5VGltZV90IHR5cGUgbGltaXQKKyAgICAgICAgbnMgPSAoMiAqKiA2MyAvLyBTRUNfVE9fTlMpICogU0VDX1RPX05TCisgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgtbnMsIG5zKSkKKworICAgICAgICByZXR1cm4gbnNfdGltZXN0YW1wcworCisgICAgZGVmIF9jaGVja19yb3VuZGluZyhzZWxmLCBweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2Zsb2F0LCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyPU5vbmUpOgorCisgICAgICAgIGRlZiBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKToKKyAgICAgICAgICAgIGlmIHVzZV9mbG9hdDoKKyAgICAgICAgICAgICAgICB1bml0X3RvX25zID0gU0VDX1RPX05TIC8gZmxvYXQodW5pdF90b19zZWMpCisgICAgICAgICAgICAgICAgdmFsdWVzID0gW25zIC8gdW5pdF90b19ucyBmb3IgbnMgaW4gbnNfdGltZXN0YW1wc10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdW5pdF90b19ucyA9IFNFQ19UT19OUyAvLyB1bml0X3RvX3NlYworICAgICAgICAgICAgICAgIHZhbHVlcyA9IFtucyAvLyB1bml0X3RvX25zIGZvciBucyBpbiBuc190aW1lc3RhbXBzXQorCisgICAgICAgICAgICBpZiB2YWx1ZV9maWx0ZXI6CisgICAgICAgICAgICAgICAgdmFsdWVzID0gZmlsdGVyKHZhbHVlX2ZpbHRlciwgdmFsdWVzKQorCisgICAgICAgICAgICAjIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCBzb3J0CisgICAgICAgICAgICByZXR1cm4gc29ydGVkKHNldCh2YWx1ZXMpKQorCisgICAgICAgICMgdGVzdCByb3VuZGluZworICAgICAgICBuc190aW1lc3RhbXBzID0gc2VsZi5fcm91bmRpbmdfdmFsdWVzKHVzZV9mbG9hdCkKKyAgICAgICAgdmFsaWRfdmFsdWVzID0gY29udmVydF92YWx1ZXMobnNfdGltZXN0YW1wcykKKyAgICAgICAgZm9yIHRpbWVfcm5kLCBkZWNpbWFsX3JuZCBpbiBST1VORElOR19NT0RFUyA6CisgICAgICAgICAgICBjb250ZXh0ID0gZGVjaW1hbC5nZXRjb250ZXh0KCkKKyAgICAgICAgICAgIGNvbnRleHQucm91bmRpbmcgPSBkZWNpbWFsX3JuZAorCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsaWRfdmFsdWVzOgorICAgICAgICAgICAgICAgIGRlYnVnX2luZm8gPSB7J3ZhbHVlJzogdmFsdWUsICdyb3VuZGluZyc6IGRlY2ltYWxfcm5kfQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcHl0aW1lX2NvbnZlcnRlcih2YWx1ZSwgdGltZV9ybmQpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRfZnVuYyh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciBvbiB0aW1lc3RhbXAgY29udmVyc2lvbjogJXMiICUgZGVidWdfaW5mbykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfaW5mbykKKworICAgICAgICAjIHRlc3Qgb3ZlcmZsb3cKKyAgICAgICAgbnMgPSBzZWxmLk9WRVJGTE9XX1NFQ09ORFMgKiBTRUNfVE9fTlMKKyAgICAgICAgbnNfdGltZXN0YW1wcyA9ICgtbnMsIG5zKQorICAgICAgICBvdmVyZmxvd192YWx1ZXMgPSBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKQorICAgICAgICBmb3IgdGltZV9ybmQsIF8gaW4gUk9VTkRJTkdfTU9ERVMgOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIG92ZXJmbG93X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvID0geyd2YWx1ZSc6IHZhbHVlLCAncm91bmRpbmcnOiB0aW1lX3JuZH0KKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1zZz1kZWJ1Z19pbmZvKToKKyAgICAgICAgICAgICAgICAgICAgcHl0aW1lX2NvbnZlcnRlcih2YWx1ZSwgdGltZV9ybmQpCisKKyAgICBkZWYgY2hlY2tfaW50X3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X3RvX3NlYz0xLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NoZWNrX3JvdW5kaW5nKHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyKQorCisgICAgZGVmIGNoZWNrX2Zsb2F0X3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdG9fc2VjPTEsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcm91bmRpbmcocHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSwgdW5pdF90b19zZWMsIHZhbHVlX2ZpbHRlcikKKworICAgIGRlZiBkZWNpbWFsX3JvdW5kKHNlbGYsIHgpOgorICAgICAgICBkID0gZGVjaW1hbC5EZWNpbWFsKHgpCisgICAgICAgIGQgPSBkLnF1YW50aXplKDEpCisgICAgICAgIHJldHVybiBpbnQoZCkKKworCitjbGFzcyBUZXN0Q1B5VGltZShDUHlUaW1lVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHRoZSBDIF9QeVRpbWVfdCBBUEkuCisgICAgIiIiCisgICAgIyBfUHlUaW1lX3QgaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICBPVkVSRkxPV19TRUNPTkRTID0gbWF0aC5jZWlsKCgyKio2MyArIDEpIC8gU0VDX1RPX05TKQorCiAgICAgZGVmIHRlc3RfRnJvbVNlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfRnJvbVNlY29uZHMKLSAgICAgICAgZm9yIHNlY29uZHMgaW4gKDAsIDMsIC00NTYsIF90ZXN0Y2FwaS5JTlRfTUFYLCBfdGVzdGNhcGkuSU5UX01JTik6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzZWNvbmRzPXNlY29uZHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzKHNlY29uZHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyAqIFNFQ19UT19OUykKKworICAgICAgICAjIFB5VGltZV9Gcm9tU2Vjb25kcygpIGV4cGVjdHMgYSBDIGludCwgcmVqZWN0IHZhbHVlcyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgZGVmIGNfaW50X2ZpbHRlcihzZWNzKToKKyAgICAgICAgICAgIHJldHVybiAoX3Rlc3RjYXBpLklOVF9NSU4gPD0gc2VjcyA8PSBfdGVzdGNhcGkuSU5UX01BWCkKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgc2Vjcywgcm5kOiBQeVRpbWVfRnJvbVNlY29uZHMoc2VjcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzICogU0VDX1RPX05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9Y19pbnRfZmlsdGVyKQogCiAgICAgZGVmIHRlc3RfRnJvbVNlY29uZHNPYmplY3Qoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QKIAotICAgICAgICAjIENvbnZlcnNpb24gZ2l2aW5nIHRoZSBzYW1lIHJlc3VsdCBmb3IgYWxsIHJvdW5kaW5nIG1ldGhvZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBvYmosIHRzIGluICgKLSAgICAgICAgICAgICAgICAjIGludGVnZXJzCi0gICAgICAgICAgICAgICAgKDAsIDApLAotICAgICAgICAgICAgICAgICgxLCBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtMywgLTMgKiBTRUNfVE9fTlMpLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZygKKyAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCwKKyAgICAgICAgICAgIGxhbWJkYSBzZWNzOiBzZWNzICogU0VDX1RPX05TKQogCi0gICAgICAgICAgICAgICAgIyBmbG9hdDogc3Vic2Vjb25kcwotICAgICAgICAgICAgICAgICgwLjAsIDApLAotICAgICAgICAgICAgICAgICgxZS05LCAxKSwKLSAgICAgICAgICAgICAgICAoMWUtNiwgMTAgKiogMyksCi0gICAgICAgICAgICAgICAgKDFlLTMsIDEwICoqIDYpLAotCi0gICAgICAgICAgICAgICAgIyBmbG9hdDogc2Vjb25kcwotICAgICAgICAgICAgICAgICgyLjAsIDIgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgxMjMuMCwgMTIzICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTcuMCwgLTcgKiBTRUNfVE9fTlMpLAotCi0gICAgICAgICAgICAgICAgIyBuYW5vc2Vjb25kIGFyZSBrZXB0IGZvciB2YWx1ZSA8PSAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjIgLSAxZS05LCAgNDE5NDMwMzk5OTk5OTk5OSksCi0gICAgICAgICAgICAgICAgKDIqKjIyLCAgICAgICAgIDQxOTQzMDQwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyMiArIDFlLTksICA0MTk0MzA0MDAwMDAwMDAxKSwKLSAgICAgICAgICAgICAgICAoMioqMjMgLSAxZS05LCAgODM4ODYwNzk5OTk5OTk5OSksCi0gICAgICAgICAgICAgICAgKDIqKjIzLCAgICAgICAgIDgzODg2MDgwMDAwMDAwMDApLAotCi0gICAgICAgICAgICAgICAgIyBzdGFydCBsb3NpbmcgcHJlY2lzaW9uIGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyMyArIDFlLTksICA4Mzg4NjA4MDAwMDAwMDAyKSwKLQotICAgICAgICAgICAgICAgICMgbmFub3NlY29uZHMgYXJlIGxvc3QgZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjI0IC0gMWUtOSwgMTY3NzcyMTU5OTk5OTk5OTgpLAotICAgICAgICAgICAgICAgICgyKioyNCwgICAgICAgIDE2Nzc3MjE2MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjQgKyAxZS05LCAxNjc3NzIxNjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1IC0gMWUtOSwgMzM1NTQ0MzIwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSAgICAgICAsIDMzNTU0NDMyMDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgKyAxZS05LCAzMzU1NDQzMjAwMDAwMDAwMCksCi0KLSAgICAgICAgICAgICAgICAjIGNsb3NlIHRvIDJeNjMgbmFub3NlY29uZHMgKF9QeVRpbWVfdCBsaW1pdCkKLSAgICAgICAgICAgICAgICAoOTIyMzM3MjAzNiwgOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKDkyMjMzNzIwMzYuMCwgOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC05MjIzMzcyMDM2LCAtOTIyMzM3MjAzNiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC05MjIzMzcyMDM2LjAsIC05MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob2JqPW9iaiwgcm91bmQ9cm5kLCB0aW1lc3RhbXA9dHMpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdChvYmosIHJuZCksIHRzKQotCi0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChyb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCg5MjIzMzcyMDM3LCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCg5MjIzMzcyMDM3LjAsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KC05MjIzMzcyMDM3LCBybmQpCi0gICAgICAgICAgICAgICAgICAgIFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdCgtOTIyMzM3MjAzNy4wLCBybmQpCi0KLSAgICAgICAgIyBDb252ZXJzaW9uIGdpdmluZyBkaWZmZXJlbnQgcmVzdWx0cyBkZXBlbmRpbmcgb24gdGhlIHJvdW5kaW5nIG1ldGhvZAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3Igb2JqLCB0cywgcm5kIGluICgKLSAgICAgICAgICAgICMgY2xvc2UgdG8gemVybwotICAgICAgICAgICAgKCAxZS0xMCwgIDAsIEZMT09SKSwKLSAgICAgICAgICAgICggMWUtMTAsICAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMWUtMTAsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTFlLTEwLCAgMCwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgdGVzdCByb3VuZGluZyBvZiB0aGUgbGFzdCBuYW5vc2Vjb25kCi0gICAgICAgICAgICAoIDEuMTIzNDU2Nzg5OSwgIDExMjM0NTY3ODksIEZMT09SKSwKLSAgICAgICAgICAgICggMS4xMjM0NTY3ODk5LCAgMTEyMzQ1Njc5MCwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5OSwgLTExMjM0NTY3OTAsIEZMT09SKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODk5LCAtMTEyMzQ1Njc4OSwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgY2xvc2UgdG8gMSBzZWNvbmQKLSAgICAgICAgICAgICggMC45OTk5OTk5OTk5LCAgIDk5OTk5OTk5OSwgRkxPT1IpLAotICAgICAgICAgICAgKCAwLjk5OTk5OTk5OTksICAxMDAwMDAwMDAwLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMC45OTk5OTk5OTk5LCAtMTAwMDAwMDAwMCwgRkxPT1IpLAotICAgICAgICAgICAgKC0wLjk5OTk5OTk5OTksICAtOTk5OTk5OTk5LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9iaj1vYmosIHJvdW5kPXJuZCwgdGltZXN0YW1wPXRzKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdChvYmosIHJuZCksIHRzKQorICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKAorICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0LAorICAgICAgICAgICAgbGFtYmRhIG5zOiBzZWxmLmRlY2ltYWxfcm91bmQobnMgKiBTRUNfVE9fTlMpKQogCiAgICAgZGVmIHRlc3RfQXNTZWNvbmRzRG91YmxlKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzU2Vjb25kc0RvdWJsZQogCi0gICAgICAgIGZvciBuYW5vc2Vjb25kcywgc2Vjb25kcyBpbiAoCi0gICAgICAgICAgICAjIG5lYXIgMSBuYW5vc2Vjb25kCi0gICAgICAgICAgICAoIDAsICAwLjApLAotICAgICAgICAgICAgKCAxLCAgMWUtOSksCi0gICAgICAgICAgICAoLTEsIC0xZS05KSwKKyAgICAgICAgZGVmIGZsb2F0X2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICBpZiBhYnMobnMpICUgU0VDX1RPX05TID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KG5zIC8vIFNFQ19UT19OUykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KG5zKSAvIFNFQ19UT19OUwogCi0gICAgICAgICAgICAjIG5lYXIgMSBzZWNvbmQKLSAgICAgICAgICAgIChTRUNfVE9fTlMgKyAxLCAxLjAgKyAxZS05KSwKLSAgICAgICAgICAgIChTRUNfVE9fTlMsICAgICAxLjApLAotICAgICAgICAgICAgKFNFQ19UT19OUyAtIDEsIDEuMCAtIDFlLTkpLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgbnMsIHJuZDogUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShucyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X2NvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgICAgICAjIGEgZmV3IHNlY29uZHMKLSAgICAgICAgICAgICgxMjMgKiBTRUNfVE9fTlMsIDEyMy4wKSwKLSAgICAgICAgICAgICgtNTY3ICogU0VDX1RPX05TLCAtNTY3LjApLAorICAgIGRlZiBjcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoc2VsZiwgZGVub21pbmF0b3IpOgorICAgICAgICBkZW5vbSA9IGRlY2ltYWwuRGVjaW1hbChkZW5vbWluYXRvcikKIAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kIGFyZSBrZXB0IGZvciB2YWx1ZSA8PSAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICg0MTk0MzAzOTk5OTk5OTk5LCAyKioyMiAtIDFlLTkpLAotICAgICAgICAgICAgKDQxOTQzMDQwMDAwMDAwMDAsIDIqKjIyKSwKLSAgICAgICAgICAgICg0MTk0MzA0MDAwMDAwMDAxLCAyKioyMiArIDFlLTkpLAorICAgICAgICBkZWYgY29udmVydGVyKHZhbHVlKToKKyAgICAgICAgICAgIGQgPSBkZWNpbWFsLkRlY2ltYWwodmFsdWUpIC8gZGVub20KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY2ltYWxfcm91bmQoZCkKIAotICAgICAgICAgICAgIyBzdGFydCBsb3NpbmcgcHJlY2lzaW9uIGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDgzODg2MDgwMDAwMDAwMDIsIDIqKjIzICsgMWUtOSksCisgICAgICAgIHJldHVybiBjb252ZXJ0ZXIKIAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcyBhcmUgbG9zdCBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICgxNjc3NzIxNTk5OTk5OTk5OCwgMioqMjQgLSAxZS05KSwKLSAgICAgICAgICAgICgxNjc3NzIxNTk5OTk5OTk5OSwgMioqMjQgLSAxZS05KSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMCwgMioqMjQgICAgICAgKSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMSwgMioqMjQgICAgICAgKSwKLSAgICAgICAgICAgICgxNjc3NzIxNjAwMDAwMDAwMiwgMioqMjQgKyAyZS05KSwKLQotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDAwLCAyKioyNSAgICAgICApLAotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDAyLCAyKioyNSAgICAgICApLAotICAgICAgICAgICAgKDMzNTU0NDMyMDAwMDAwMDA0LCAyKioyNSArIDRlLTkpLAotCi0gICAgICAgICAgICAjIGNsb3NlIHRvIDJeNjMgbmFub3NlY29uZHMgKF9QeVRpbWVfdCBsaW1pdCkKLSAgICAgICAgICAgICg5MjIzMzcyMDM2ICogU0VDX1RPX05TLCA5MjIzMzcyMDM2LjApLAotICAgICAgICAgICAgKC05MjIzMzcyMDM2ICogU0VDX1RPX05TLCAtOTIyMzM3MjAzNi4wKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5hbm9zZWNvbmRzLCBzZWNvbmRzPXNlY29uZHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzU2Vjb25kc0RvdWJsZShuYW5vc2Vjb25kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzKQotCi0gICAgZGVmIHRlc3RfdGltZXZhbChzZWxmKToKKyAgICBkZWYgdGVzdF9Bc1RpbWV2YWwoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNUaW1ldmFsCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pY3Jvc2Vjb25kcwotICAgICAgICAgICAgICAgICgwLCAoMCwgMCkpLAotICAgICAgICAgICAgICAgICgxMDAwLCAoMCwgMSkpLAotICAgICAgICAgICAgICAgICgtMTAwMCwgKC0xLCA5OTk5OTkpKSwKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAoMiwgMCkpLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgKC0zLCAwKSksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWV2YWwobnMsIHJuZCksIHR2KQorICAgICAgICB1c19jb252ZXJ0ZXIgPSBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihVU19UT19OUykKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIHR2LCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsICgwLCAwKSwgRkxPT1IpLAotICAgICAgICAgICAgKDEsICgwLCAxKSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsICgtMSwgOTk5OTk5KSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAoMCwgMCksIENFSUxJTkcpLAorICAgICAgICBkZWYgdGltZXZhbF9jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgdXMgPSB1c19jb252ZXJ0ZXIobnMpCisgICAgICAgICAgICByZXR1cm4gZGl2bW9kKHVzLCBTRUNfVE9fVVMpCiAKLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNDU2NzAwMSwgKDEsIDIzNDU2NyksIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0NTY3MDAxLCAoMSwgMjM0NTY4KSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQ1NjcwMDEsICgtMiwgNzY1NDMyKSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0NTY3MDAxLCAoLTIsIDc2NTQzMyksIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1ldmFsKG5zLCBybmQpLCB0dikKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgTE9OR19NSU4sIExPTkdfTUFYCisKKyAgICAgICAgICAgICMgT24gV2luZG93cywgdGltZXZhbC50dl9zZWMgdHlwZSBpcyBhIEMgbG9uZworICAgICAgICAgICAgZGVmIHNlY29uZHNfZmlsdGVyKHNlY3MpOgorICAgICAgICAgICAgICAgIHJldHVybiBMT05HX01JTiA8PSBzZWNzIDw9IExPTkdfTUFYCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWNvbmRzX2ZpbHRlciA9IHNlbGYudGltZV90X2ZpbHRlcgorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc1RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV2YWxfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWNvbmRzX2ZpbHRlcikKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoX3Rlc3RjYXBpLCAnUHlUaW1lX0FzVGltZXNwZWMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnbmVlZCBfdGVzdGNhcGkuUHlUaW1lX0FzVGltZXNwZWMnKQotICAgIGRlZiB0ZXN0X3RpbWVzcGVjKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzVGltZXNwZWMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNUaW1lc3BlYwotICAgICAgICBmb3IgbnMsIHRzIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgwLCAoMCwgMCkpLAotICAgICAgICAgICAgKDEsICgwLCAxKSksCi0gICAgICAgICAgICAoLTEsICgtMSwgOTk5OTk5OTk5KSksCiAKLSAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsICgyLCAwKSksCi0gICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsICgtMywgMCkpLAorICAgICAgICBkZWYgdGltZXNwZWNfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIHJldHVybiBkaXZtb2QobnMsIFNFQ19UT19OUykKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0NTY3ODkwLCAoMSwgMjM0NTY3ODkwKSksCi0gICAgICAgICAgICAoLTEyMzQ1Njc4OTAsICgtMiwgNzY1NDMyMTEwKSksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXNwZWM9dHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXNwZWMobnMpLCB0cykKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcobGFtYmRhIG5zLCBybmQ6IFB5VGltZV9Bc1RpbWVzcGVjKG5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXNwZWNfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCiAKLSAgICBkZWYgdGVzdF9taWxsaXNlY29uZHMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNNaWxsaXNlY29uZHMoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNNaWxsaXNlY29uZHMKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWlsbGlzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDEgKiBNU19UT19OUywgMSksCi0gICAgICAgICAgICAgICAgKC0yICogTVNfVE9fTlMsIC0yKSwKIAotICAgICAgICAgICAgICAgICMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyICogU0VDX1RPX05TLCAyMDAwKSwKLSAgICAgICAgICAgICAgICAoLTMgKiBTRUNfVE9fTlMsIC0zMDAwKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWlsbGlzZWNvbmRzKG5zLCBybmQpLCB0dikKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzTWlsbGlzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihNU19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQykKIAotICAgICAgICBGTE9PUiA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgQ0VJTElORyA9IF9QeVRpbWUuUk9VTkRfQ0VJTElORwotICAgICAgICBmb3IgbnMsIG1zLCBybmQgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEsIDAsIEZMT09SKSwKLSAgICAgICAgICAgICgxLCAxLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMSwgMCwgQ0VJTElORyksCi0KLSAgICAgICAgICAgICMgc2Vjb25kcyArIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMTIzNCAqIE1TX1RPX05TICsgMSwgMTIzNCwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQgKiBNU19UT19OUyArIDEsIDEyMzUsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xMjM0ICogTVNfVE9fTlMgLSAxLCAtMTIzNSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xMjM0ICogTVNfVE9fTlMgLSAxLCAtMTIzNCwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgbWlsbGlzZWNvbmRzPW1zLCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzTWlsbGlzZWNvbmRzKG5zLCBybmQpLCBtcykKLQotICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kcyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc01pY3Jvc2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc01pY3Jvc2Vjb25kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWNyb3NlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIFVTX1RPX05TLCAxKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBVU19UT19OUywgLTIpLAogCi0gICAgICAgICAgICAgICAgIyBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIE1TX1RPX05TLCAxMDAwKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBNU19UT19OUywgLTIwMDApLAorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNNaWNyb3NlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKFVTX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsIDIwMDAwMDApLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgLTMwMDAwMDApLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWNyb3NlY29uZHMobnMsIHJuZCksIHR2KQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgbXMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgMCwgRkxPT1IpLAotICAgICAgICAgICAgKDEsIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAwLCBDRUlMSU5HKSwKK2NsYXNzIFRlc3RPbGRQeVRpbWUoQ1B5VGltZVRlc3RDYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgb2xkIEMgX1B5VGltZV90IEFQSTogX1B5VGltZV9PYmplY3RUb1hYWCgpIGZ1bmN0aW9ucy4KKyAgICAiIiIKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0ICogVVNfVE9fTlMgKyAxLCAxMjM0LCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNCAqIFVTX1RPX05TICsgMSwgMTIzNSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQgKiBVU19UT19OUyAtIDEsIC0xMjM1LCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQgKiBVU19UT19OUyAtIDEsIC0xMjM0LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCBtaWxsaXNlY29uZHM9bXMsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWNyb3NlY29uZHMobnMsIHJuZCksIG1zKQorICAgICMgdGltZV90IGlzIGEgMzItYml0IG9yIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgIE9WRVJGTE9XX1NFQ09ORFMgPSAyICoqIDY0CisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZV90KHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1lX3QKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlY2ltYWxfcm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgIGRlZiBjcmVhdGVfY29udmVydGVyKHNlbGYsIHNlY190b191bml0KToKKyAgICAgICAgZGVmIGNvbnZlcnRlcihzZWNzKToKKyAgICAgICAgICAgIGZsb2F0cGFydCwgaW50cGFydCA9IG1hdGgubW9kZihzZWNzKQorICAgICAgICAgICAgaW50cGFydCA9IGludChpbnRwYXJ0KQorICAgICAgICAgICAgZmxvYXRwYXJ0ICo9IHNlY190b191bml0CisgICAgICAgICAgICBmbG9hdHBhcnQgPSBzZWxmLmRlY2ltYWxfcm91bmQoZmxvYXRwYXJ0KQorICAgICAgICAgICAgaWYgZmxvYXRwYXJ0IDwgMDoKKyAgICAgICAgICAgICAgICBmbG9hdHBhcnQgKz0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgICAgICBpbnRwYXJ0IC09IDEKKyAgICAgICAgICAgIGVsaWYgZmxvYXRwYXJ0ID49IHNlY190b191bml0OgorICAgICAgICAgICAgICAgIGZsb2F0cGFydCAtPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgICAgIGludHBhcnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuIChpbnRwYXJ0LCBmbG9hdHBhcnQpCisgICAgICAgIHJldHVybiBjb252ZXJ0ZXIKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1ldmFsKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgcHl0aW1lX29iamVjdF90b190aW1ldmFsCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2VjczogKHNlY3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1ldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2NvbnZlcnRlcihTRUNfVE9fVVMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICBkZWYgdGVzdF9vYmplY3RfdG9fdGltZXNwZWMoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IChzZWNzLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfY29udmVydGVyKFNFQ19UT19OUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKaW5kZXggM2IxN2NhNi4uOTA0MzhlNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CkBAIC0yNCw4ICsyNCw3IEBACiAgICAgICAgICAgICBpZiB0eXBlID09IEVORE1BUktFUjoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgdHlwZSA9IHRva19uYW1lW3R5cGVdCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgJSh0eXBlKS0xMC4xMHMgJSh0b2tlbiktMTMuMTNyICUoc3RhcnQpcyAlKGVuZClzIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FscygpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmIiAgICB7dHlwZToxMH0ge3Rva2VuIXI6MTN9IHtzdGFydH0ge2VuZH0iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBbIiAgICBFTkNPRElORyAgICd1dGYtOCcgICAgICAgKDAsIDApICgwLCAwKSJdICsKICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5yc3RyaXAoKS5zcGxpdGxpbmVzKCkpCkBAIC0xMzIsMTggKzEzMSwxOCBAQAogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJ4ID0gMHhmZmZmZmZmZmZmZiIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCi0gICAgTlVNQkVSICAgICAnMHhmZmZmZmZmZmZmICgxLCA0KSAoMSwgMTcpCisgICAgTlVNQkVSICAgICAnMHhmZmZmZmZmZmZmZicgKDEsIDQpICgxLCAxNykKICAgICAiIiIpCiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAxMjMxNDEyNDIxNTEyNTE2MTYxMTAiLCAiIiJcCiAgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKICAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQotICAgIE5VTUJFUiAgICAgJzEyMzE0MTI0MjE1MSAoMSwgNCkgKDEsIDI1KQorICAgIE5VTUJFUiAgICAgJzEyMzE0MTI0MjE1MTI1MTYxNjExMCcgKDEsIDQpICgxLCAyNSkKICAgICAiIiIpCiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAtMTU5MjE1OTAyMTUwMTI1OTEiLCAiIiJcCiAgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKICAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQogICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgNCkgKDEsIDUpCi0gICAgTlVNQkVSICAgICAnMTU5MjE1OTAyMTUwICgxLCA1KSAoMSwgMjIpCisgICAgTlVNQkVSICAgICAnMTU5MjE1OTAyMTUwMTI1OTEnICgxLCA1KSAoMSwgMjIpCiAgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CkBAIC0zMDcsNiArMzA2LDUwIEBACiAgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyOCkgKDEsIDI5KQogICAgIFNUUklORyAgICAgJ1JCImFiYyInICAgICAoMSwgMzApICgxLCAzNykKICAgICAiIiIpCisgICAgICAgICMgQ2hlY2sgMCwgMSwgYW5kIDIgY2hhcmFjdGVyIHN0cmluZyBwcmVmaXhlcy4KKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJyJhXAorZGVcCitmZyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnImFcXFxcXFxuZGVcXFxcXFxuZmciXCcgKDEsIDApICgzLCAzKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3UiYVwKK2RlIicsICIiIlwKKyAgICBTVFJJTkcgICAgICd1ImFcXFxcXFxuZGUiXCcgICgxLCAwKSAoMiwgMykKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidyYiJhXAorZCInLCAiIiJcCisgICAgU1RSSU5HICAgICAncmIiYVxcXFxcXG5kIlwnICAoMSwgMCkgKDIsIDIpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInIiIiYVwKK2IiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnXCJcIiJhXFxcXFxcbmJcIlwiIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3UiIiJhXAorYiIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICd1XCJcIiJhXFxcXFxcbmJcIlwiIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3JiIiIiYVwKK2JcCitjIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3JiIlwiImFcXFxcXFxuYlxcXFxcXG5jIlwiIicgKDEsIDApICgzLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZiJhYmMiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2YiYWJjIicgICAgICAoMSwgMCkgKDEsIDYpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmUiJhe2J9YyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZlIiYXtifWMiJyAgICgxLCAwKSAoMSwgOSkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2YiIiJhYmMiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZlwiXCJcImFiY1wiXCJcIicgICgxLCAwKSAoMSwgMTApCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInZiJhYmNcCitkZWYiJywgIiIiXAorICAgIFNUUklORyAgICAgJ2YiYWJjXFxcXFxcbmRlZiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidSZiJhYmNcCitkZWYiJywgIiIiXAorICAgIFNUUklORyAgICAgJ1JmImFiY1xcXFxcXG5kZWYiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQogCiAgICAgZGVmIHRlc3RfZnVuY3Rpb24oc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoImRlZiBkMjIoYSwgYiwgYz0yLCBkPTIsICprKTogcGFzcyIsICIiIlwKQEAgLTUwNSw3ICs1NDgsNyBAQAogICAgICAgICAjIE1ldGhvZHMKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgiQHN0YXRpY21ldGhvZFxuZGVmIGZvbyh4LHkpOiBwYXNzIiwgIiIiXAogICAgIE9QICAgICAgICAgJ0AnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCi0gICAgTkFNRSAgICAgICAnc3RhdGljbWV0aG9kICgxLCAxKSAoMSwgMTMpCisgICAgTkFNRSAgICAgICAnc3RhdGljbWV0aG9kJyAoMSwgMSkgKDEsIDEzKQogICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDEsIDEzKSAoMSwgMTQpCiAgICAgTkFNRSAgICAgICAnZGVmJyAgICAgICAgICgyLCAwKSAoMiwgMykKICAgICBOQU1FICAgICAgICdmb28nICAgICAgICAgKDIsIDQpICgyLCA3KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvX19pbml0X18ucHkKaW5kZXggMDRjODcyNi4uNGQwZmNhMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW1wb3J0bGliCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLWZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaAogCiBiYXNlcGF0aCA9IG9zLnBhdGguZGlybmFtZSggICAgICAgICAgICAgICAgICMgPHNyYy9pbnN0YWxsIGRpcj4KICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoICAgICAgICAgICAgICAgICMgTGliCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfZ3Byb2YyaHRtbC5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5CmluZGV4IDBjMjk0ZWMuLjk0ODllZDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5CkBAIC0yLDEyICsyLDExIEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotaW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCiBpbXBvcnQgdGVtcGZpbGUKIAotZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNjcmlwdHNkaXIsIHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKK2Zyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBza2lwX2lmX21pc3NpbmcsIGltcG9ydF90b29sCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9tZDVzdW0ucHkgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfbWQ1c3VtLnB5CmluZGV4IDEzMDUyOTUuLmZiNTY1YjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9tZDVzdW0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weQpAQCAtMSwxMiArMSwxMSBAQAogIiIiVGVzdHMgZm9yIHRoZSBtZDVzdW0gc2NyaXB0IGluIHRoZSBUb29scyBkaXJlY3RvcnkuIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogCi1mcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2RpciwgaW1wb3J0X3Rvb2wsIHNraXBfaWZfbWlzc2luZworZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNjcmlwdHNkaXIsIHNraXBfaWZfbWlzc2luZwogCiBza2lwX2lmX21pc3NpbmcoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfcGRlcHMucHkgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfcGRlcHMucHkKaW5kZXggMDkxZmE2YS4uMjdjYmZlMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3BkZXBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weQpAQCAtMSwxMiArMSwxMCBAQAogIiIiVGVzdHMgZm9yIHRoZSBwZGVwcyBzY3JpcHQgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0ZW1wZmlsZQotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKLWZyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBzY3JpcHRzZGlyLCBza2lwX2lmX21pc3NpbmcsIGltcG9ydF90b29sCitmcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2tpcF9pZl9taXNzaW5nLCBpbXBvcnRfdG9vbAogCiBza2lwX2lmX21pc3NpbmcoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfdW5wYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5CmluZGV4IDczNGJiYzIuLmQ5MWFkZTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5CkBAIC0xMzQsNiArMTM0LDE1IEBACiBjbGFzcyBVbnBhcnNlVGVzdENhc2UoQVNUVGVzdENhc2UpOgogICAgICMgVGVzdHMgZm9yIHNwZWNpZmljIGJ1Z3MgZm91bmQgaW4gZWFybGllciB2ZXJzaW9ucyBvZiB1bnBhcnNlCiAKKyAgICBkZWYgdGVzdF9mc3RyaW5ncyhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgMjUxODAKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2YiezB9IiozfSciIiIpCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHIiIiJmJ3tmInt5fSIqM30nIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7XCd4XCd9IiozfSciIiIpCisKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAocicnJ2Yie3IneCcgZid7XCJzXCJ9J30iJycnKQorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyJycnZiJ7cid4J3JmJ3tcInNcIn0nfSInJycpCisKICAgICBkZWYgdGVzdF9kZWxfc3RhdGVtZW50KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcCgiZGVsIHgsIHksIHoiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQppbmRleCAwM2RmZjg0Li4xZDg5NGFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKQEAgLTEsMTEgKzEsMTEgQEAKIGltcG9ydCBvcwotaW1wb3J0IGlvCiBpbXBvcnQgc3lzCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBybXRyZWUsIHVubGluaywgY2FwdHVyZWRfc3Rkb3V0Citmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKIGltcG9ydCB1bml0dGVzdAogCiBpbXBvcnQgdHJhY2UKLWZyb20gdHJhY2UgaW1wb3J0IENvdmVyYWdlUmVzdWx0cywgVHJhY2UKK2Zyb20gdHJhY2UgaW1wb3J0IFRyYWNlCiAKIGZyb20gdGVzdC50cmFjZWRtb2R1bGVzIGltcG9ydCB0ZXN0bW9kCiAKQEAgLTM2NSw1MSArMzY1LDI3IEBACiAgICAgICAgICMgTWF0Y2hlZCBiZWZvcmUuCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpZ25vcmUubmFtZXMoam4oJ2JhcicsICdiYXoucHknKSwgJ2JheicpKQogCitjbGFzcyBUZXN0Q29tbWFuZExpbmUodW5pdHRlc3QuVGVzdENhc2UpOgogCi1jbGFzcyBUZXN0RGVwcmVjYXRlZE1ldGhvZHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICBfZXJyb3JzID0gKAorICAgICAgICAgICAgKGInZmlsZW5hbWUgaXMgbWlzc2luZzogcmVxdWlyZWQgd2l0aCB0aGUgbWFpbiBvcHRpb25zJywgJy1sJywgJy1UJyksCisgICAgICAgICAgICAoYidjYW5ub3Qgc3BlY2lmeSBib3RoIC0tbGlzdGZ1bmNzIGFuZCAoLS10cmFjZSBvciAtLWNvdW50KScsICctbGMnKSwKKyAgICAgICAgICAgIChiJ2FyZ3VtZW50IC1SLy0tbm8tcmVwb3J0OiBub3QgYWxsb3dlZCB3aXRoIGFyZ3VtZW50IC1yLy0tcmVwb3J0JywgJy1yUicpLAorICAgICAgICAgICAgKGInbXVzdCBzcGVjaWZ5IG9uZSBvZiAtLXRyYWNlLCAtLWNvdW50LCAtLXJlcG9ydCwgLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscycsICctZycpLAorICAgICAgICAgICAgKGInLXIvLS1yZXBvcnQgcmVxdWlyZXMgLWYvLS1maWxlJywgJy1yJyksCisgICAgICAgICAgICAoYictLXN1bW1hcnkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnLCAnLXNUJyksCisgICAgICAgICAgICAoYid1bnJlY29nbml6ZWQgYXJndW1lbnRzOiAteScsICcteScpKQorICAgICAgICBmb3IgbWVzc2FnZSwgKmFyZ3MgaW4gX2Vycm9yczoKKyAgICAgICAgICAgICpfLCBzdGRlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1tJywgJ3RyYWNlJywgKmFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1lc3NhZ2UsIHN0ZGVycikKIAotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfdXNhZ2Uoc2VsZik6Ci0gICAgICAgIHNpbyA9IGlvLlN0cmluZ0lPKCkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS51c2FnZShzaW8pCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1VzYWdlOicsIHNpby5nZXR2YWx1ZSgpKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9JZ25vcmUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UuSWdub3JlKCkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfbW9kbmFtZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJzcGFtIiwgdHJhY2UubW9kbmFtZSgic3BhbSIpKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9mdWxsbW9kbmFtZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJzcGFtIiwgdHJhY2UuZnVsbG1vZG5hbWUoInNwYW0iKSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9saW5lc19mcm9tX2NvZGUoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgZGVmIGZvbygpOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHRyYWNlLmZpbmRfbGluZXNfZnJvbV9jb2RlKGZvby5fX2NvZGVfXywgWyJlZ2dzIl0pCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfbGluZXMoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgZGVmIGZvbygpOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHRyYWNlLmZpbmRfbGluZXMoZm9vLl9fY29kZV9fLCBbImVnZ3MiXSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9zdHJpbmdzKHNlbGYpOgorICAgIGRlZiB0ZXN0X2xpc3RmdW5jc19mbGFnX3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZmQ6CiAgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAodW5saW5rLCBURVNURk4pCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UuZmluZF9zdHJpbmdzKGZkLm5hbWUpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2ZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKHNlbGYpOgotICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGZkOgotICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHVubGluaywgVEVTVEZOKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLmZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKGZkLm5hbWUpCi0KKyAgICAgICAgICAgIGZkLndyaXRlKCJhID0gMVxuIikKKyAgICAgICAgICAgIHN0YXR1cywgc3Rkb3V0LCBzdGRlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctbScsICd0cmFjZScsICctbCcsIFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidmdW5jdGlvbnMgY2FsbGVkOicsIHN0ZG91dCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggNTQ5ZDhkMS4uNzg3NDA5YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTEyOSwxMiArMTI5LDEyIEBACiAgICAgICAgIGRlZiBkb190ZXN0KGZpcnN0bGluZXMsIG1lc3NhZ2UsIGNoYXJzZXQsIGxpbmVubyk6CiAgICAgICAgICAgICAjIFJhaXNlIHRoZSBtZXNzYWdlIGluIGEgc3VicHJvY2VzcywgYW5kIGNhdGNoIHRoZSBvdXRwdXQKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBvcGVuKFRFU1RGTiwgInciLCBlbmNvZGluZz1jaGFyc2V0KQotICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgiIiJ7MH1pZiAxOgotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrOwotICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3sxfScpCi0gICAgICAgICAgICAgICAgICAgICIiIi5mb3JtYXQoZmlyc3RsaW5lcywgbWVzc2FnZSkpCi0gICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCkKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAidyIsIGVuY29kaW5nPWNoYXJzZXQpIGFzIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCIiInswfWlmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd7MX0nKQorICAgICAgICAgICAgICAgICAgICAgICAgIiIiLmZvcm1hdChmaXJzdGxpbmVzLCBtZXNzYWdlKSkKKwogICAgICAgICAgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgVEVTVEZOXSwKICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQogICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCkBAIC0xNzUsOCArMTc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgdGV4dCwgY2hhcnNldCwgNSkKICAgICAgICAgICAgIGRvX3Rlc3QoIiBcdFxmXG4jIGNvZGluZzogezB9XG4iLmZvcm1hdChjaGFyc2V0KSwKICAgICAgICAgICAgICAgICAgICAgdGV4dCwgY2hhcnNldCwgNSkKLSAgICAgICAgIyBJc3N1ZSAjMTg5NjA6IGNvZGluZyBzcGVjIHNob3VsZCBoYXMgbm8gZWZmZWN0Ci0gICAgICAgIGRvX3Rlc3QoIjBcbiMgY29kaW5nOiBHQktcbiIsICJoXHhlOSBobyIsICd1dGYtOCcsIDUpCisgICAgICAgICMgSXNzdWUgIzE4OTYwOiBjb2Rpbmcgc3BlYyBzaG91bGQgaGF2ZSBubyBlZmZlY3QKKyAgICAgICAgZG9fdGVzdCgieD0wXG4jIGNvZGluZzogR0JLXG4iLCAiaFx4ZTkgaG8iLCAndXRmLTgnLCA1KQogCiAgICAgQHN1cHBvcnQucmVxdWlyZXNfdHlwZV9jb2xsZWN0aW5nCiAgICAgZGVmIHRlc3RfcHJpbnRfdHJhY2ViYWNrX2F0X2V4aXQoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weQppbmRleCBkYTg5YTlhLi43OTBhYjdlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkKQEAgLTExLDkgKzExLDE1IEBACiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHRocmVhZGluZyA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgX3Rlc3RjYXBpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3Rlc3RjYXBpID0gTm9uZQorCiAKIEVNUFRZX1NUUklOR19TSVpFID0gc3lzLmdldHNpemVvZihiJycpCiAKKwogZGVmIGdldF9mcmFtZXMobmZyYW1lLCBsaW5lbm9fZGVsdGEpOgogICAgIGZyYW1lcyA9IFtdCiAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCkBAIC0zNywyOCArNDMsMzEgQEAKIGRlZiBjcmVhdGVfc25hcHNob3RzKCk6CiAgICAgdHJhY2ViYWNrX2xpbWl0ID0gMgogCisgICAgIyBfdHJhY2VtYWxsb2MuX2dldF90cmFjZXMoKSByZXR1cm5zIGEgbGlzdCBvZiAoZG9tYWluLCBzaXplLAorICAgICMgdHJhY2ViYWNrX2ZyYW1lcykgdHVwbGVzLiB0cmFjZWJhY2tfZnJhbWVzIGlzIGEgdHVwbGUgb2YgKGZpbGVuYW1lLAorICAgICMgbGluZV9udW1iZXIpIHR1cGxlcy4KICAgICByYXdfdHJhY2VzID0gWwotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICgyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCiAKLSAgICAgICAgKDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAogCi0gICAgICAgICg3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAogICAgIF0KICAgICBzbmFwc2hvdCA9IHRyYWNlbWFsbG9jLlNuYXBzaG90KHJhd190cmFjZXMsIHRyYWNlYmFja19saW1pdCkKIAogICAgIHJhd190cmFjZXMyID0gWwotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAogCi0gICAgICAgICgyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCi0gICAgICAgICg1MDAwLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICgyLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICgyLCA1MDAwLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCiAKLSAgICAgICAgKDQwMCwgKCgnYy5weScsIDU3OCksKSksCisgICAgICAgICg0LCA0MDAsICgoJ2MucHknLCA1NzgpLCkpLAogICAgIF0KICAgICBzbmFwc2hvdDIgPSB0cmFjZW1hbGxvYy5TbmFwc2hvdChyYXdfdHJhY2VzMiwgdHJhY2ViYWNrX2xpbWl0KQogCkBAIC0xMjYsNyArMTM1LDcgQEAKIAogICAgIGRlZiBmaW5kX3RyYWNlKHNlbGYsIHRyYWNlcywgdHJhY2ViYWNrKToKICAgICAgICAgZm9yIHRyYWNlIGluIHRyYWNlczoKLSAgICAgICAgICAgIGlmIHRyYWNlWzFdID09IHRyYWNlYmFjay5fZnJhbWVzOgorICAgICAgICAgICAgaWYgdHJhY2VbMl0gPT0gdHJhY2ViYWNrLl9mcmFtZXM6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNlCiAKICAgICAgICAgc2VsZi5mYWlsKCJ0cmFjZSBub3QgZm91bmQiKQpAQCAtMTQwLDcgKzE0OSw3IEBACiAgICAgICAgIHRyYWNlID0gc2VsZi5maW5kX3RyYWNlKHRyYWNlcywgb2JqX3RyYWNlYmFjaykKIAogICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodHJhY2UsIHR1cGxlKQotICAgICAgICBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlYmFjayA9IHRyYWNlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgb2JqX3NpemUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2ViYWNrLCBvYmpfdHJhY2ViYWNrLl9mcmFtZXMpCiAKQEAgLTE2Nyw5ICsxNzYsOCBAQAogCiAgICAgICAgIHRyYWNlMSA9IHNlbGYuZmluZF90cmFjZSh0cmFjZXMsIG9iajFfdHJhY2ViYWNrKQogICAgICAgICB0cmFjZTIgPSBzZWxmLmZpbmRfdHJhY2UodHJhY2VzLCBvYmoyX3RyYWNlYmFjaykKLSAgICAgICAgc2l6ZTEsIHRyYWNlYmFjazEgPSB0cmFjZTEKLSAgICAgICAgc2l6ZTIsIHRyYWNlYmFjazIgPSB0cmFjZTIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZWJhY2syLCB0cmFjZWJhY2sxKQorICAgICAgICBkb21haW4xLCBzaXplMSwgdHJhY2ViYWNrMSA9IHRyYWNlMQorICAgICAgICBkb21haW4yLCBzaXplMiwgdHJhY2ViYWNrMiA9IHRyYWNlMgogICAgICAgICBzZWxmLmFzc2VydElzKHRyYWNlYmFjazIsIHRyYWNlYmFjazEpCiAKICAgICBkZWYgdGVzdF9nZXRfdHJhY2VkX21lbW9yeShzZWxmKToKQEAgLTI5Miw3ICszMDAsNyBAQAogICAgIG1heERpZmYgPSA0MDAwCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfc25hcHNob3Qoc2VsZik6Ci0gICAgICAgIHJhd190cmFjZXMgPSBbKDUsICgoJ2EucHknLCAyKSwpKV0KKyAgICAgICAgcmF3X3RyYWNlcyA9IFsoMCwgNSwgKCgnYS5weScsIDIpLCkpXQogCiAgICAgICAgIHdpdGggY29udGV4dGxpYi5FeGl0U3RhY2soKSBhcyBzdGFjazoKICAgICAgICAgICAgIHN0YWNrLmVudGVyX2NvbnRleHQocGF0Y2gub2JqZWN0KHRyYWNlbWFsbG9jLCAnaXNfdHJhY2luZycsCkBAIC0zMjIsMTEgKzMzMCwxMSBAQAogICAgICAgICAjIGV4Y2x1ZGUgYi5weQogICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKICAgICAgICAgXSkKIAogICAgICAgICAjIGZpbHRlcl90cmFjZXMoKSBtdXN0IG5vdCB0b3VjaCB0aGUgb3JpZ2luYWwgc25hcHNob3QKQEAgLTMzNSwxMCArMzQzLDEwIEBACiAgICAgICAgICMgb25seSBpbmNsdWRlIHR3byBsaW5lcyBvZiBhLnB5CiAgICAgICAgIHNuYXBzaG90NCA9IHNuYXBzaG90My5maWx0ZXJfdHJhY2VzKChmaWx0ZXIyLCBmaWx0ZXIzKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDQudHJhY2VzLl90cmFjZXMsIFsKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAogICAgICAgICBdKQogCiAgICAgICAgICMgTm8gZmlsdGVyOiBqdXN0IGR1cGxpY2F0ZSB0aGUgc25hcHNob3QKQEAgLTM0OSw2ICszNTcsNTQgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNuYXBzaG90LmZpbHRlcl90cmFjZXMsIGZpbHRlcjEpCiAKKyAgICBkZWYgdGVzdF9maWx0ZXJfdHJhY2VzX2RvbWFpbihzZWxmKToKKyAgICAgICAgc25hcHNob3QsIHNuYXBzaG90MiA9IGNyZWF0ZV9zbmFwc2hvdHMoKQorICAgICAgICBmaWx0ZXIxID0gdHJhY2VtYWxsb2MuRmlsdGVyKEZhbHNlLCAiYS5weSIsIGRvbWFpbj0xKQorICAgICAgICBmaWx0ZXIyID0gdHJhY2VtYWxsb2MuRmlsdGVyKFRydWUsICJhLnB5IiwgZG9tYWluPTEpCisKKyAgICAgICAgb3JpZ2luYWxfdHJhY2VzID0gbGlzdChzbmFwc2hvdC50cmFjZXMuX3RyYWNlcykKKworICAgICAgICAjIGV4Y2x1ZGUgYS5weSBvZiBkb21haW4gMQorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgXSkKKworICAgICAgICAjIGluY2x1ZGUgZG9tYWluIDEKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9maWx0ZXJfdHJhY2VzX2RvbWFpbl9maWx0ZXIoc2VsZik6CisgICAgICAgIHNuYXBzaG90LCBzbmFwc2hvdDIgPSBjcmVhdGVfc25hcHNob3RzKCkKKyAgICAgICAgZmlsdGVyMSA9IHRyYWNlbWFsbG9jLkRvbWFpbkZpbHRlcihGYWxzZSwgZG9tYWluPTMpCisgICAgICAgIGZpbHRlcjIgPSB0cmFjZW1hbGxvYy5Eb21haW5GaWx0ZXIoVHJ1ZSwgZG9tYWluPTMpCisKKyAgICAgICAgIyBleGNsdWRlIGRvbWFpbiAyCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKKyAgICAgICAgXSkKKworICAgICAgICAjIGluY2x1ZGUgZG9tYWluIDIKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICBdKQorCiAgICAgZGVmIHRlc3Rfc25hcHNob3RfZ3JvdXBfYnlfbGluZShzZWxmKToKICAgICAgICAgc25hcHNob3QsIHNuYXBzaG90MiA9IGNyZWF0ZV9zbmFwc2hvdHMoKQogICAgICAgICB0Yl8wID0gdHJhY2ViYWNrX2xpbmVubygnPHVua25vd24+JywgMCkKQEAgLTgxNiwxMiArODcyLDEyMSBAQAogICAgICAgICBhc3NlcnRfcHl0aG9uX29rKCctWCcsICd0cmFjZW1hbGxvYycsICctYycsIGNvZGUpCiAKIAorQHVuaXR0ZXN0LnNraXBJZihfdGVzdGNhcGkgaXMgTm9uZSwgJ25lZWQgX3Rlc3RjYXBpJykKK2NsYXNzIFRlc3RDQVBJKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBtYXhEaWZmID0gODAgKiAyMAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiB0cmFjZW1hbGxvYy5pc190cmFjaW5nKCk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0cmFjZW1hbGxvYyBtdXN0IGJlIHN0b3BwZWQgYmVmb3JlIHRoZSB0ZXN0IikKKworICAgICAgICBzZWxmLmRvbWFpbiA9IDUKKyAgICAgICAgc2VsZi5zaXplID0gMTIzCisgICAgICAgIHNlbGYub2JqID0gYWxsb2NhdGVfYnl0ZXMoc2VsZi5zaXplKVswXQorCisgICAgICAgICMgZm9yIHRoZSB0eXBlICJvYmplY3QiLCBpZChvYmopIGlzIHRoZSBhZGRyZXNzIG9mIGl0cyBtZW1vcnkgYmxvY2suCisgICAgICAgICMgVGhpcyB0eXBlIGlzIG5vdCB0cmFja2VkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3RvcgorICAgICAgICBzZWxmLnB0ciA9IGlkKHNlbGYub2JqKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdG9wKCkKKworICAgIGRlZiBnZXRfdHJhY2ViYWNrKHNlbGYpOgorICAgICAgICBmcmFtZXMgPSBfdGVzdGNhcGkudHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhzZWxmLmRvbWFpbiwgc2VsZi5wdHIpCisgICAgICAgIGlmIGZyYW1lcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB0cmFjZW1hbGxvYy5UcmFjZWJhY2soZnJhbWVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiB0cmFjayhzZWxmLCByZWxlYXNlX2dpbD1GYWxzZSwgbmZyYW1lPTEpOgorICAgICAgICBmcmFtZXMgPSBnZXRfZnJhbWVzKG5mcmFtZSwgMikKKyAgICAgICAgX3Rlc3RjYXBpLnRyYWNlbWFsbG9jX3RyYWNrKHNlbGYuZG9tYWluLCBzZWxmLnB0ciwgc2VsZi5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9naWwpCisgICAgICAgIHJldHVybiBmcmFtZXMKKworICAgIGRlZiB1bnRyYWNrKHNlbGYpOgorICAgICAgICBfdGVzdGNhcGkudHJhY2VtYWxsb2NfdW50cmFjayhzZWxmLmRvbWFpbiwgc2VsZi5wdHIpCisKKyAgICBkZWYgZ2V0X3RyYWNlZF9tZW1vcnkoc2VsZik6CisgICAgICAgICMgR2V0IHRoZSB0cmFjZWQgc2l6ZSBpbiB0aGUgZG9tYWluCisgICAgICAgIHNuYXBzaG90ID0gdHJhY2VtYWxsb2MudGFrZV9zbmFwc2hvdCgpCisgICAgICAgIGRvbWFpbl9maWx0ZXIgPSB0cmFjZW1hbGxvYy5Eb21haW5GaWx0ZXIoVHJ1ZSwgc2VsZi5kb21haW4pCisgICAgICAgIHNuYXBzaG90ID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcyhbZG9tYWluX2ZpbHRlcl0pCisgICAgICAgIHJldHVybiBzdW0odHJhY2Uuc2l6ZSBmb3IgdHJhY2UgaW4gc25hcHNob3QudHJhY2VzKQorCisgICAgZGVmIGNoZWNrX3RyYWNrKHNlbGYsIHJlbGVhc2VfZ2lsKToKKyAgICAgICAgbmZyYW1lID0gNQorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydChuZnJhbWUpCisKKyAgICAgICAgc2l6ZSA9IHRyYWNlbWFsbG9jLmdldF90cmFjZWRfbWVtb3J5KClbMF0KKworICAgICAgICBmcmFtZXMgPSBzZWxmLnRyYWNrKHJlbGVhc2VfZ2lsLCBuZnJhbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2ViYWNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2MuVHJhY2ViYWNrKGZyYW1lcykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF90cmFjZWRfbWVtb3J5KCksIHNlbGYuc2l6ZSkKKworICAgIGRlZiB0ZXN0X3RyYWNrKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3RyYWNrKEZhbHNlKQorCisgICAgZGVmIHRlc3RfdHJhY2tfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBjYWxsaW5nIF9QeVRyYWNlTWFsbG9jX1RyYWNrKCkgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwKKyAgICAgICAgIyB3b3JrcyB0b28KKyAgICAgICAgc2VsZi5jaGVja190cmFjayhUcnVlKQorCisgICAgZGVmIHRlc3RfdHJhY2tfYWxyZWFkeV90cmFja2VkKHNlbGYpOgorICAgICAgICBuZnJhbWUgPSA1CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KG5mcmFtZSkKKworICAgICAgICAjIHRyYWNrIGEgZmlyc3QgdGltZQorICAgICAgICBzZWxmLnRyYWNrKCkKKworICAgICAgICAjIGNhbGxpbmcgX1B5VHJhY2VNYWxsb2NfVHJhY2soKSBtdXN0IHJlbW92ZSB0aGUgb2xkIHRyYWNlIGFuZCBhZGQKKyAgICAgICAgIyBhIG5ldyB0cmFjZSB3aXRoIHRoZSBuZXcgdHJhY2ViYWNrCisgICAgICAgIGZyYW1lcyA9IHNlbGYudHJhY2sobmZyYW1lPW5mcmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF90cmFjZWJhY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZW1hbGxvYy5UcmFjZWJhY2soZnJhbWVzKSkKKworICAgIGRlZiB0ZXN0X3VudHJhY2soc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKworICAgICAgICBzZWxmLnRyYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoc2VsZi5nZXRfdHJhY2ViYWNrKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdHJhY2VkX21lbW9yeSgpLCBzZWxmLnNpemUpCisKKyAgICAgICAgIyB1bnRyYWNrIG11c3QgcmVtb3ZlIHRoZSB0cmFjZQorICAgICAgICBzZWxmLnVudHJhY2soKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmdldF90cmFjZWJhY2soKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF90cmFjZWRfbWVtb3J5KCksIDApCisKKyAgICAgICAgIyBjYWxsaW5nIF9QeVRyYWNlTWFsbG9jX1VudHJhY2soKSBtdWx0aXBsZSB0aW1lcyBtdXN0IG5vdCBjcmFzaAorICAgICAgICBzZWxmLnVudHJhY2soKQorICAgICAgICBzZWxmLnVudHJhY2soKQorCisgICAgZGVmIHRlc3Rfc3RvcF90cmFjayhzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQoKQorICAgICAgICB0cmFjZW1hbGxvYy5zdG9wKCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLnRyYWNrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5nZXRfdHJhY2ViYWNrKCkpCisKKyAgICBkZWYgdGVzdF9zdG9wX3VudHJhY2soc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KCkKKyAgICAgICAgc2VsZi50cmFjaygpCisKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RvcCgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYudW50cmFjaygpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KAogICAgICAgICBUZXN0VHJhY2VtYWxsb2NFbmFibGVkLAogICAgICAgICBUZXN0U25hcHNob3QsCiAgICAgICAgIFRlc3RGaWx0ZXJzLAogICAgICAgICBUZXN0Q29tbWFuZExpbmUsCisgICAgICAgIFRlc3RDQVBJLAogICAgICkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkgYi9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CmluZGV4IDQ5MGU3MjMuLjQ2MjY2NWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQpAQCAtMSw0ICsxLDMgQEAKLWltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkgYi9MaWIvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weQppbmRleCA1NjZmYzlkLi43NTQwYTQzMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkKQEAgLTEsNCArMSwzIEBACi1pbXBvcnQgb3MKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAjIFNraXAgdGhpcyB0ZXN0IGlmIF90a2ludGVyIGRvZXMgbm90IGV4aXN0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bnBhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3VucGFjay5weQppbmRleCBkMWNjYjM4Li4zZmNiMThmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VucGFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VucGFjay5weQpAQCAtMTE3LDYgKzExNywyNyBAQAogICAgICAgLi4uCiAgICAgdGVzdC50ZXN0X3VucGFjay5Cb3pvRXJyb3IKIAorQWxsb3cgdW5wYWNraW5nIGVtcHR5IGl0ZXJhYmxlcworCisgICAgPj4+ICgpID0gW10KKyAgICA+Pj4gW10gPSAoKQorICAgID4+PiBbXSA9IFtdCisgICAgPj4+ICgpID0gKCkKKworVW5wYWNraW5nIG5vbi1pdGVyYWJsZXMgc2hvdWxkIHJhaXNlIFR5cGVFcnJvcgorCisgICAgPj4+ICgpID0gNDIKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6ICdpbnQnIG9iamVjdCBpcyBub3QgaXRlcmFibGUKKworVW5wYWNraW5nIHRvIGFuIGVtcHR5IGl0ZXJhYmxlIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yCisKKyAgICA+Pj4gKCkgPSBbNDJdCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogdG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjayAoZXhwZWN0ZWQgMCkKKwogIiIiCiAKIF9fdGVzdF9fID0geydkb2N0ZXN0cycgOiBkb2N0ZXN0c30KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5wYWNrX2V4LnB5IGIvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKaW5kZXggNzQzNDZiNC4uNmJlOGY1NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkKQEAgLTM1Nyw3ICszNTcsNiBAQAogX190ZXN0X18gPSB7J2RvY3Rlc3RzJyA6IGRvY3Rlc3RzfQogCiBkZWYgdGVzdF9tYWluKHZlcmJvc2U9RmFsc2UpOgotICAgIGltcG9ydCBzeXMKICAgICBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdW5wYWNrX2V4CiAgICAgc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3VucGFja19leCwgdmVyYm9zZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQppbmRleCBjOGIzN2VlLi5lOTU2NGZkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CkBAIC0yODksMTIgKzI4OSwxMiBAQAogICAgICAgICBkZWYgaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgIHJldHVybiBCYXNpY0F1dGhIYW5kbGVyKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBMb29wYmFja0h0dHBTZXJ2ZXJUaHJlYWQoaHR0cF9zZXJ2ZXJfd2l0aF9iYXNpY19hdXRoX2hhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnNlcnZlci5zdG9wKQogICAgICAgICBzZWxmLnNlcnZlcl91cmwgPSAnaHR0cDovLzEyNy4wLjAuMTolcycgJSBzZWxmLnNlcnZlci5wb3J0CiAgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQogICAgICAgICBzdXBlcihCYXNpY0F1dGhUZXN0cywgc2VsZikudGVhckRvd24oKQogCiAgICAgZGVmIHRlc3RfYmFzaWNfYXV0aF9zdWNjZXNzKHNlbGYpOgpAQCAtNDM4LDE3ICs0MzgsMTMgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwZXIoVGVzdFVybG9wZW4sIHNlbGYpLnNldFVwKCkKLSAgICAgICAgIyBJZ25vcmUgcHJveGllcyBmb3IgbG9jYWxob3N0IHRlc3RzLgotICAgICAgICBzZWxmLm9sZF9lbnZpcm9uID0gb3MuZW52aXJvbi5jb3B5KCkKLSAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwotICAgICAgICBzZWxmLnNlcnZlciA9IE5vbmUKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgaWYgc2VsZi5zZXJ2ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKLSAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCi0gICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNlbGYub2xkX2Vudmlyb24pCi0gICAgICAgIHN1cGVyKFRlc3RVcmxvcGVuLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgICMgSWdub3JlIHByb3hpZXMgZm9yIGxvY2FsaG9zdCB0ZXN0cy4KKyAgICAgICAgZGVmIHJlc3RvcmVfZW52aXJvbihvbGRfZW52aXJvbik6CisgICAgICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgICAgIG9zLmVudmlyb24udXBkYXRlKG9sZF9lbnZpcm9uKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9lbnZpcm9uLCBvcy5lbnZpcm9uLmNvcHkoKSkKKyAgICAgICAgb3MuZW52aXJvblsnTk9fUFJPWFknXSA9ICcqJwogCiAgICAgZGVmIHVybG9wZW4oc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgbCA9IFtdCkBAIC00NjksNiArNDY1LDcgQEAKICAgICAgICAgaGFuZGxlciA9IEdldFJlcXVlc3RIYW5kbGVyKHJlc3BvbnNlcykKIAogICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChoYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5zZXJ2ZXIuc3RvcCkKICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQogICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS53YWl0KCkKICAgICAgICAgcG9ydCA9IHNlbGYuc2VydmVyLnBvcnQKQEAgLTU5Miw3ICs1ODksOCBAQAogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQogICAgICAgICByZXEgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KCJodHRwOi8vbG9jYWxob3N0OiVzLyIgJSBoYW5kbGVyLnBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17IlJhbmdlIjogImJ5dGVzPTIwLTM5In0pCi0gICAgICAgIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKQorICAgICAgICB3aXRoIHVybGxpYi5yZXF1ZXN0LnVybG9wZW4ocmVxKToKKyAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWRbIlJhbmdlIl0sICJieXRlcz0yMC0zOSIpCiAKICAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKQEAgLTYwOCwyMiArNjA2LDIxIEBACiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oCisgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgIHdpdGggb3Blbl91cmw6CiAgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2Ugb2YgZW1haWwubWVzc2FnZS5NZXNzYWdlIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAicGxhaW4iKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbmZvX29iaiwgZW1haWwubWVzc2FnZS5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldF9jb250ZW50X3N1YnR5cGUoKSwgInBsYWluIikKIAogICAgIGRlZiB0ZXN0X2dldHVybChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgc2FtZSBVUkwgYXMgb3BlbmVkIGlzIHJldHVybmVkIGJ5IGdldHVybC4KICAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKCkKICAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIucmVxdWVzdC51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKLSAgICAgICAgdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKKyAgICAgICAgd2l0aCBvcGVuX3VybDoKKyAgICAgICAgICAgIHVybCA9IG9wZW5fdXJsLmdldHVybCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsLCAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCiAKICAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IGI4MTE5MzAuLjk0OTcxNmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC00LDcgKzQsNiBAQAogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBzb2NrZXQKIGltcG9ydCB1cmxsaWIucmVxdWVzdAotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgZW1haWwubWVzc2FnZQogaW1wb3J0IHRpbWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CmluZGV4IDgyOTk5N2YuLjkxNjVkNzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtNjA1LDI5ICs2MDUsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKIAotICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgaXMgcmV0dXJuZWQgYXMgTm9uZQorICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgcmFpc2VzIFZhbHVlRXJyb3IKICAgICAgICAgdXJsID0gYiJIVFRQOi8vV1dXLlBZVEhPTi5PUkc6NjU1MzYvZG9jLyNmcmFnIgogICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAib3V0IG9mIHJhbmdlIik6CisgICAgICAgICAgICBwLnBvcnQKIAogICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6Ci0gICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgICMgT25jZSBhZ2FpbiwgcmVwZWF0IG91cnNlbHZlcyB0byB0ZXN0IGJ5dGVzCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQotCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoYiJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIGIid3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogcC5wb3J0KQorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBpbnZhbGlkIHBvcnRzLiIiIgorICAgICAgICBmb3IgYnl0ZXMgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZvciBwYXJzZSBpbiAodXJsbGliLnBhcnNlLnVybHNwbGl0LCB1cmxsaWIucGFyc2UudXJscGFyc2UpOgorICAgICAgICAgICAgICAgIGZvciBwb3J0IGluICgiZm9vIiwgIjEuNSIsICItMSIsICIweDEwIik6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGJ5dGVzPWJ5dGVzLCBwYXJzZT1wYXJzZSwgcG9ydD1wb3J0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvYyA9ICJ3d3cuZXhhbXBsZS5uZXQ6IiArIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICJodHRwOi8vIiArIG5ldGxvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwYXJzZSh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCBuZXRsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc193aXRob3V0X25ldGxvYyhzZWxmKToKICAgICAgICAgIyBUaGlzIGV4YW1wbGUgaXMgc3RyYWlnaHQgZnJvbSBSRkMgMzI2MS4gIEl0IGxvb2tzIGxpa2UgaXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CmluZGV4IDgzNTdmOGIuLjY2MmM3ZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMSw2ICsxLDYgQEAKICMgQ2hlY2sgZXZlcnkgcGF0aCB0aHJvdWdoIGV2ZXJ5IG1ldGhvZCBvZiBVc2VyRGljdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIG1hcHBpbmdfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY29sbGVjdGlvbnMKIApAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KG9uZT0xLCB0d289MiksIGQyKQogICAgICAgICAjIGl0ZW0gc2VxdWVuY2UgY29uc3RydWN0b3IKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9Wygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQogICAgICAgICAjIGJvdGggdG9nZXRoZXIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2xsZWN0aW9ucy5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildLCB0d289MywgdGhyZWU9NSksIGQzKQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWygnZGljdCcsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb2xsZWN0aW9ucy5Vc2VyRGljdCh7fSwgZGljdD1Ob25lKS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgTm9uZSldKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KGRpY3Q9eydhJzogNDJ9KS5pdGVtcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDQyKV0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29sbGVjdGlvbnMuVXNlckRpY3QsIDQyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKaW5kZXggZjkyZTRkMy4uOGRlNmMxNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CkBAIC0xLDcgKzEsNyBAQAogIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJMaXN0CiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJMaXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIGxpc3RfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbGlzdF90ZXN0cwogaW1wb3J0IHVuaXR0ZXN0CiAKIGNsYXNzIFVzZXJMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CmluZGV4IDliYzhlZGQuLjcxNTI4MjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKQEAgLTEsOSArMSw4IEBACiAjIFVzZXJTdHJpbmcgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGJ1aWx0aW4gc3RyaW5nIHR5cGUuCiAjIFVzZXJTdHJpbmcgaW5zdGFuY2VzIHNob3VsZCBiZWhhdmUgc2ltaWxhciB0byBidWlsdGluIHN0cmluZyBvYmplY3RzLgogCi1pbXBvcnQgc3RyaW5nCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN0cmluZ190ZXN0cwogCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyU3RyaW5nCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXUucHkgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CmluZGV4IDI1ZmZmYmYuLmFkMmYyYzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91dS5weQpAQCAtOCw3ICs4LDYgQEAKIAogaW1wb3J0IHN5cywgb3MKIGltcG9ydCB1dQotZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogaW1wb3J0IGlvCiAKIHBsYWludGV4dCA9IGIiVGhlIHNtb290aC1zY2FsZWQgcHl0aG9uIGNyZXB0IG92ZXIgdGhlIHNsZWVwaW5nIGRvZ1xuIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF92ZW52LnB5IGIvTGliL3Rlc3QvdGVzdF92ZW52LnB5CmluZGV4IGQyYzk4NmUuLmEyODQyYjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdmVudi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ZlbnYucHkKQEAgLTE1LDcgKzE1LDYgQEAKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IChjYXB0dXJlZF9zdGRvdXQsIGNhcHR1cmVkX3N0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuX3N5bWxpbmssIEVudmlyb25tZW50VmFyR3VhcmQsIHJtdHJlZSkKLWltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdmVudgogCkBAIC0zMSwxOCArMzAsMTcgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICB0aHJlYWRpbmcgPSBOb25lCiAKK3RyeToKKyAgICBpbXBvcnQgY3R5cGVzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY3R5cGVzID0gTm9uZQorCiBza2lwSW5WZW52ID0gdW5pdHRlc3Quc2tpcElmKHN5cy5wcmVmaXggIT0gc3lzLmJhc2VfcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdCBub3QgYXBwcm9wcmlhdGUgaW4gYSB2ZW52JykKIAotIyBvcy5wYXRoLmV4aXN0cygnbnVsJykgaXMgRmFsc2U6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDU0MQotaWYgb3MuZGV2bnVsbC5sb3dlcigpID09ICdudWwnOgotICAgIGZhaWxzT25XaW5kb3dzID0gdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCi1lbHNlOgotICAgIGRlZiBmYWlsc09uV2luZG93cyhmKToKLSAgICAgICAgcmV0dXJuIGYKLQogY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIHZlbnYgdGVzdHMuIiIiCisgICAgbWF4RGlmZiA9IDgwICogNTAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5lbnZfZGlyID0gb3MucGF0aC5yZWFscGF0aCh0ZW1wZmlsZS5ta2R0ZW1wKCkpCkBAIC01Miw3ICs1MCw3IEBACiAgICAgICAgICAgICBzZWxmLmluY2x1ZGUgPSAnSW5jbHVkZScKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYmluZGlyID0gJ2JpbicKLSAgICAgICAgICAgIHNlbGYubGliID0gKCdsaWInLCAncHl0aG9uJXMnICUgc3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgc2VsZi5saWIgPSAoJ2xpYicsICdweXRob24lZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZSA9ICdpbmNsdWRlJwogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICdfX1BZVkVOVl9MQVVOQ0hFUl9fJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLmVudmlyb25bJ19fUFlWRU5WX0xBVU5DSEVSX18nXQpAQCAtMzEzLDIwICszMTEsMjcgQEAKICAgICAgICAgc2VsZi5ydW5fd2l0aF9jYXB0dXJlKHZlbnYuY3JlYXRlLCBzZWxmLmVudl9kaXIsIHdpdGhfcGlwPUZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydF9waXBfbm90X2luc3RhbGxlZCgpCiAKLSAgICBAZmFpbHNPbldpbmRvd3MKLSAgICBkZWYgdGVzdF9kZXZudWxsX2V4aXN0c19hbmRfaXNfZW1wdHkoc2VsZik6CisgICAgZGVmIHRlc3RfZGV2bnVsbChzZWxmKToKICAgICAgICAgIyBGaXggZm9yIGlzc3VlICMyMDA1MyB1c2VzIG9zLmRldm51bGwgdG8gZm9yY2UgYSBjb25maWcgZmlsZSB0bwogICAgICAgICAjIGFwcGVhciBlbXB0eS4gSG93ZXZlciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjA1NDEgbWVhbnMKICAgICAgICAgIyB0aGF0IGRvZXNuJ3QgY3VycmVudGx5IHdvcmsgcHJvcGVybHkgb24gV2luZG93cy4gT25jZSB0aGF0IGlzCiAgICAgICAgICMgZml4ZWQsIHRoZSAid2luX2xvY2F0aW9uIiBwYXJ0IG9mIHRlc3Rfd2l0aF9waXAgc2hvdWxkIGJlIHJlc3RvcmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5kZXZudWxsKSkKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICJyYiIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIiIpCiAKKyAgICAgICAgIyBJc3N1ZSAjMjA1NDE6IG9zLnBhdGguZXhpc3RzKCdudWwnKSBpcyBGYWxzZSBvbiBXaW5kb3dzCisgICAgICAgIGlmIG9zLmRldm51bGwubG93ZXIoKSA9PSAnbnVsJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MuZGV2bnVsbCkpCisKKwogICAgICMgUmVxdWVzdGluZyBwaXAgZmFpbHMgd2l0aG91dCBTU0wgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxOTc0NCkKICAgICBAdW5pdHRlc3Quc2tpcElmKHNzbCBpcyBOb25lLCBlbnN1cmVwaXAuX01JU1NJTkdfU1NMX01FU1NBR0UpCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnc29tZSBkZXBlbmRlbmNpZXMgb2YgcGlwIGltcG9ydCB0aHJlYWRpbmcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIG1vZHVsZSB1bmNvbmRpdGlvbmFsbHknKQorICAgICMgSXNzdWUgIzI2NjEwOiBwaXAvcGVwNDI1dGFncy5weSByZXF1aXJlcyBjdHlwZXMKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhjdHlwZXMsICdwaXAgcmVxdWlyZXMgY3R5cGVzJykKICAgICBkZWYgdGVzdF93aXRoX3BpcChzZWxmKToKICAgICAgICAgcm10cmVlKHNlbGYuZW52X2RpcikKICAgICAgICAgd2l0aCBFbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52dmFyczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5CmluZGV4IGEzMzQwNGUuLmU3Yjg1ZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weQpAQCAtMiw3ICsyLDkgQEAKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBvcwogZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCByZQogaW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCkBAIC03MDgsNiArNzEwLDE3IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLmdldHZhbHVlKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbih0ZXh0LCByZXN1bHQpCiAKKyAgICBkZWYgdGVzdF9zaG93d2Fybm1zZ19taXNzaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBfc2hvd3dhcm5tc2coKSBtaXNzaW5nIGlzIG9rYXkuCisgICAgICAgIHRleHQgPSAnZGVsIF9zaG93d2Fybm1zZyB0ZXN0JworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuX3Nob3d3YXJubXNnCisgICAgICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGV4dCwgcmVzdWx0KQorCiAgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbm90X2NhbGxhYmxlKHNlbGYpOgogICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CiAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCkBAIC04MDksMTIgKzgyMiw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX29iamVjdCwgZXhwZWN0ZWRfZmlsZV9saW5lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSkKIAorCiBjbGFzcyBDV2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCiAKIGNsYXNzIFB5V2FybmluZ3NEaXNwbGF5VGVzdHMoV2FybmluZ3NEaXNwbGF5VGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBtb2R1bGUgPSBweV93YXJuaW5ncwogCisgICAgZGVmIHRlc3RfdHJhY2VtYWxsb2Moc2VsZik6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUodGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgICAgIGRlZiBmdW5jKCk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKF9fZmlsZV9fKQorICAgICAgICAgICAgICAgICAgICAjIEVtaXQgUmVzb3VyY2VXYXJuaW5nCisgICAgICAgICAgICAgICAgICAgIGYgPSBOb25lCisKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICIiIikpCisKKyAgICAgICAgcmVzID0gYXNzZXJ0X3B5dGhvbl9vaygnLVdkJywgJy1YJywgJ3RyYWNlbWFsbG9jPTInLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzdGRlcnIgPSByZXMuZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisgICAgICAgICMgbm9ybWFsaXplIG5ld2xpbmVzCisgICAgICAgIHN0ZGVyciA9ICdcbicuam9pbihzdGRlcnIuc3BsaXRsaW5lcygpKQorICAgICAgICBzdGRlcnIgPSByZS5zdWIoJzwuKj4nLCAnPC4uLj4nLCBzdGRlcnIpCisgICAgICAgIGV4cGVjdGVkID0gdGV4dHdyYXAuZGVkZW50KCcnJworICAgICAgICAgICAge2ZuYW1lfTo1OiBSZXNvdXJjZVdhcm5pbmc6IHVuY2xvc2VkIGZpbGUgPC4uLj4KKyAgICAgICAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgICAgIE9iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgICAgICAgICBGaWxlICJ7Zm5hbWV9IiwgbGluZW5vIDMKKyAgICAgICAgICAgICAgICBmID0gb3BlbihfX2ZpbGVfXykKKyAgICAgICAgICAgICAgRmlsZSAie2ZuYW1lfSIsIGxpbmVubyA3CisgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICcnJykKKyAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5mb3JtYXQoZm5hbWU9c3VwcG9ydC5URVNURk4pLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsIGV4cGVjdGVkKQorCiAKIGNsYXNzIENhdGNoV2FybmluZ1Rlc3RzKEJhc2VUZXN0KToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5IGIvTGliL3Rlc3QvdGVzdF93YXZlLnB5CmluZGV4IDNlZmY3NzMuLjg2NjZmNzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTEsNiArMSw2IEBACi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGF1ZGlvb3AgaW1wb3J0IGJ5dGVzd2FwCiBpbXBvcnQgc3lzCiBpbXBvcnQgd2F2ZQpAQCAtMTAzLDUgKzEwMywxMSBAQAogICAgICAgICBmcmFtZXMgPSBieXRlc3dhcChmcmFtZXMsIDQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnV0FWRV9GT1JNQVRfUENNJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgd2F2ZSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5CmluZGV4IDljZTY3MmIuLjY5MWI5NWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3NldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkKQEAgLTEsMTMgKzEsNiBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5LCByZWYsIFdlYWtTZXQKLWltcG9ydCBvcGVyYXRvcgotaW1wb3J0IGNvcHkKK2Zyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAogaW1wb3J0IHN0cmluZwotaW1wb3J0IG9zCi1mcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCi1pbXBvcnQgc3lzCi1pbXBvcnQgd2FybmluZ3MKLWltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgVXNlclN0cmluZyBhcyB1c3RyCiBpbXBvcnQgZ2MKIGltcG9ydCBjb250ZXh0bGliCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dpbnJlZy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CmluZGV4IDJjNGFjMDguLmVmNDBlOGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5CkBAIC0zNyw2ICszNyw3IEBACiAKIHRlc3RfZGF0YSA9IFsKICAgICAoIkludCBWYWx1ZSIsICAgICA0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19EV09SRCksCisgICAgKCJRd29yZCBWYWx1ZSIsICAgMHgxMTIyMzM0NDU1NjY3Nzg4LCAgICAgICAgICAgICAgICAgICAgICBSRUdfUVdPUkQpLAogICAgICgiU3RyaW5nIFZhbCIsICAgICJBIHN0cmluZyB2YWx1ZSIsICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1NaKSwKICAgICAoIlN0cmluZ0V4cGFuZCIsICAiVGhlIHBhdGggaXMgJXBhdGglIiwgICAgICAgICAgICAgICAgICAgIFJFR19FWFBBTkRfU1opLAogICAgICgiTXVsdGktc3RyaW5nIiwgIFsiTG90cyIsICJvZiIsICJzdHJpbmciLCAidmFsdWVzIl0sICAgICAgUkVHX01VTFRJX1NaKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQppbmRleCBlOGQ3ODliLi5lMjQ3ZmY2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CkBAIC0xNDAsMTEgKzE0MCw2IEBACiAgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChOb25lKTpcbicKICAgICAgICAgICAgICcgIHBhc3MnKQogCi0gICAgZGVmIHRlc3RBc3NpZ25tZW50VG9FbXB0eVR1cGxlRXJyb3Ioc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCi0gICAgICAgICAgICAnd2l0aCBtb2NrIGFzICgpOlxuJwotICAgICAgICAgICAgJyAgcGFzcycpCi0KICAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb1R1cGxlT25seUNvbnRhaW5pbmdOb25lRXJyb3Ioc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoJ3dpdGggbW9jayBhcyBOb25lLDpcbiAgcGFzcycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCkBAIC00NTQsNyArNDQ5LDcgQEAKICAgICAgICAgICAgIHdpdGggY20oKToKICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQogCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQogCiAgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKQEAgLTQ4Miw3ICs0NzcsNyBAQAogICAgICAgICAgICAgd2l0aCBjbSgpOgogICAgICAgICAgICAgICAgIHJhaXNlIG5leHQoaXRlcihbXSkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCiAKICAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CmluZGV4IDYxYTc1MGMuLjNjNWEyN2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKQEAgLTE2NSwxMCArMTY1LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXQuZW5kc3dpdGgoCiAgICAgICAgICAgICBiIkEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuIgogICAgICAgICApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KAogICAgICAgICAgICAgZXJyLnNwbGl0bGluZXMoKVstMl0sCi0gICAgICAgICAgICAiQXNzZXJ0aW9uRXJyb3I6IEhlYWRlcnMgKCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nKSkgbXVzdCIKLSAgICAgICAgICAgICIgYmUgb2YgdHlwZSBsaXN0OiA8Y2xhc3MgJ3R1cGxlJz4iCisgICAgICAgICAgICByIkFzc2VydGlvbkVycm9yOiBIZWFkZXJzIFwoXCgnQ29udGVudC1UeXBlJywgJ3RleHQvcGxhaW4nXClcKSBtdXN0IgorICAgICAgICAgICAgciIgYmUgb2YgdHlwZSBsaXN0OiA8Y2xhc3MgJ3R1cGxlJyBhdCAweC4rPiIKICAgICAgICAgKQogCiAgICAgZGVmIHRlc3Rfc3RhdHVzX3ZhbGlkYXRpb25fZXJyb3JzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCBiYzFkZDE0Li42ZTU0NjI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtOTEsOCArOTEsNiBAQAogCiAKIGNsYXNzIE1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICMgVE9ETzogdGhpcyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIHdlIGdldCByaWQgb2YgdGhlIGdsb2JhbCBtb2R1bGUgdmFycwotCiAgICAgZGVmIHRlc3Rfc2FuaXR5KHNlbGYpOgogICAgICAgICAjIEltcG9ydCBzYW5pdHkuCiAKQEAgLTEwMCw2ICs5OCwxMCBAQAogICAgICAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKICAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRQYXRoCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIG5hbWVzID0gKCJ4bWwuZXRyZWUuRWxlbWVudFRyZWUiLCAiX2VsZW1lbnR0cmVlIikKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgRVQsIG5hbWVzLCBibGFja2xpc3Q9KCJIVE1MX0VNUFRZIiwpKQorCiAKIGRlZiBzZXJpYWxpemUoZWxlbSwgdG9fc3RyaW5nPVRydWUsIGVuY29kaW5nPSd1bmljb2RlJywgKipvcHRpb25zKToKICAgICBpZiBlbmNvZGluZyAhPSAndW5pY29kZSc6CkBAIC0xODIsMTAgKzE4NCwxMiBAQAogCiAgICAgICAgIGRlZiBjaGVja19lbGVtZW50KGVsZW1lbnQpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEVULmlzZWxlbWVudChlbGVtZW50KSwgbXNnPSJub3QgYW4gZWxlbWVudCIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGFnIiksIG1zZz0ibm8gdGFnIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIiksIG1zZz0ibm8gYXR0cmliIG1lbWJlciIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCAidGV4dCIpLCBtc2c9Im5vIHRleHQgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIiksIG1zZz0ibm8gdGFpbCBtZW1iZXIiKQorICAgICAgICAgICAgZGlyZWxlbSA9IGRpcihlbGVtZW50KQorICAgICAgICAgICAgZm9yIGF0dHIgaW4gJ3RhZycsICdhdHRyaWInLCAndGV4dCcsICd0YWlsJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlbGVtZW50LCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nbm8gJXMgbWVtYmVyJyAlIGF0dHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdHRyLCBkaXJlbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdubyAlcyB2aXNpYmxlIGJ5IGRpcicgJSBhdHRyKQogCiAgICAgICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWcpCiAgICAgICAgICAgICBjaGVja19tYXBwaW5nKGVsZW1lbnQuYXR0cmliKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKaW5kZXggOTZiNDQ2ZS4uODdmM2YyNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CkBAIC0xLDUgKzEsNSBAQAogIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCi1pbXBvcnQgc3lzLCBzdHJ1Y3QKK2ltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9mcmVzaF9tb2R1bGUKIGltcG9ydCB0eXBlcwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5jYWxjc2l6ZSgnOFAnKSkKIAogZGVmIHRlc3RfbWFpbigpOgotICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUsIHRlc3RfeG1sX2V0cmVlX2MKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfeG1sX2V0cmVlCiAKICAgICAjIFJ1biB0aGUgdGVzdHMgc3BlY2lmaWMgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24KICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggMDJkOWY1Yy4uZjJmZGM0NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTksNyArOSw2IEBACiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCBodHRwLCBodHRwLnNlcnZlcgogaW1wb3J0IHNvY2tldAotaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbwogaW1wb3J0IGNvbnRleHRsaWIKQEAgLTc3Niw4ICs3NzUsOCBAQAogICAgICAgICAgICAgIyAgICdtZXRob2QgInRoaXNfaXNfbm90X2V4aXN0cyIgaXMgbm90IHN1cHBvcnRlZCc+fV0KIAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQucmVzdWx0c1swXVsnZmF1bHRDb2RlJ10sIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5yZXN1bHRzWzBdWydmYXVsdFN0cmluZyddLAotICAgICAgICAgICAgICAgICc8Y2xhc3MgXCdFeGNlcHRpb25cJz46bWV0aG9kICJ0aGlzX2lzX25vdF9leGlzdHMiICcKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgocmVzdWx0LnJlc3VsdHNbMF1bJ2ZhdWx0U3RyaW5nJ10sCisgICAgICAgICAgICAgICAgJzxjbGFzcyBcJ0V4Y2VwdGlvblwnIGF0IDB4Lis+Om1ldGhvZCAidGhpc19pc19ub3RfZXhpc3RzIiAnCiAgICAgICAgICAgICAgICAgJ2lzIG5vdCBzdXBwb3J0ZWQnKQogICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBPU0Vycm9yKSBhcyBlOgogICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKQEAgLTExNDcsNyArMTE0Niw2IEBACiAgICAgIiIiQSB2YXJpYXRpb24gb24gc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSB3aGljaCBnaXZlcyBhIHRleHQgc3RyZWFtCiAgICAgaGF2aW5nIGEgYGJ1ZmZlcmAgYXR0cmlidXRlLgogICAgICIiIgotICAgIGltcG9ydCBpbwogICAgIG9yaWdfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgIHN5cy5zdGRvdXQgPSBpby5UZXh0SU9XcmFwcGVyKGlvLkJ5dGVzSU8oKSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5CmluZGV4IGI2MGI4MmYuLmFlMGEyOGUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjX25ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbHJwY19uZXQucHkKQEAgLTEsNyArMSw0IEBACiBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi1pbXBvcnQgZXJybm8KLWltcG9ydCBzb2NrZXQKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQppbmRleCBkMjc4ZTA2Li5lZjNjM2Q4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CkBAIC0xLDggKzEsOCBAQAogaW1wb3J0IGNvbnRleHRsaWIKIGltcG9ydCBpbwogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKK2ltcG9ydCBwb3NpeHBhdGgKIGltcG9ydCB0aW1lCiBpbXBvcnQgc3RydWN0CiBpbXBvcnQgemlwZmlsZQpAQCAtMzgsMTAgKzM4LDYgQEAKICAgICAgICAgeWllbGQgZgogICAgICAgICB0ZXN0LmFzc2VydEZhbHNlKGYuY2xvc2VkKQogCi1kZWYgb3BlblUoemlwZnAsIGZuKToKLSAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnJywgRGVwcmVjYXRpb25XYXJuaW5nKSk6Ci0gICAgICAgIHJldHVybiB6aXBmcC5vcGVuKGZuLCAnclUnKQotCiBjbGFzcyBBYnN0cmFjdFRlc3RzV2l0aFNvdXJjZUZpbGU6CiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKQEAgLTYxLDYgKzU3LDkgQEAKICAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIubmFtZSIpCiAgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKCd3cml0dGVuLW9wZW4tdycsIG1vZGU9J3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUobGluZSkKIAogICAgIGRlZiB6aXBfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CiAgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCkBAIC03Niw3ICs3NSw3IEBACiAgICAgICAgICAgICB6aXBmcC5wcmludGRpcihmaWxlPWZwKQogICAgICAgICAgICAgZGlyZWN0b3J5ID0gZnAuZ2V0dmFsdWUoKQogICAgICAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDUpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0ZpbGUgTmFtZScsIGxpbmVzWzBdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignTW9kaWZpZWQnLCBsaW5lc1swXSkKQEAgLTkwLDIzICs4OSwyNSBAQAogCiAgICAgICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAogICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIndyaXR0ZW4tb3Blbi13IiwgbmFtZXMpCiAKICAgICAgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKICAgICAgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQogICAgICAgICAgICAgbmFtZXMgPSBbaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvc10KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgNCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigid3JpdHRlbi1vcGVuLXciLCBuYW1lcykKICAgICAgICAgICAgIGZvciBpIGluIGluZm9zOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQogCiAgICAgICAgICAgICAjIGNoZWNrIGdldGluZm8KLSAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiLCAid3JpdHRlbi1vcGVuLXciKToKICAgICAgICAgICAgICAgICBpbmZvID0gemlwZnAuZ2V0aW5mbyhubSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZW5hbWUsIG5tKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQpAQCAtMzcyLDE0ICszNzMsMTggQEAKICAgICB0ZXN0X2xvd19jb21wcmVzc2lvbiA9IE5vbmUKIAogICAgIGRlZiB6aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd3JpdGVzdHIgY3JlYXRlcyBmaWxlcyB3aXRoIG1vZGUgMDYwMCwKLSAgICAgICAgIyB3aGVuIGl0IGlzIHBhc3NlZCBhIG5hbWUgcmF0aGVyIHRoYW4gYSBaaXBJbmZvIGluc3RhbmNlLgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdyaXRlc3RyIGFuZCBvcGVuKC4uLiBtb2RlPSd3JykgY3JlYXRlIGZpbGVzIHdpdGgKKyAgICAgICAgIyBtb2RlIDA2MDAsIHdoZW4gdGhleSBhcmUgcGFzc2VkIGEgbmFtZSByYXRoZXIgdGhhbiBhIFppcEluZm8KKyAgICAgICAgIyBpbnN0YW5jZS4KIAogICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgogICAgICAgICAgICAgemluZm8gPSB6aXBmcC5nZXRpbmZvKCdzdHJmaWxlJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemluZm8uZXh0ZXJuYWxfYXR0ciwgMG82MDAgPDwgMTYpCiAKKyAgICAgICAgICAgIHppbmZvMiA9IHppcGZwLmdldGluZm8oJ3dyaXR0ZW4tb3Blbi13JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemluZm8yLmV4dGVybmFsX2F0dHIsIDBvNjAwIDw8IDE2KQorCiAgICAgZGVmIHRlc3Rfd3JpdGVzdHJfcGVybWlzc2lvbnMoc2VsZik6CiAgICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKICAgICAgICAgICAgIHNlbGYuemlwX3Rlc3Rfd3JpdGVzdHJfcGVybWlzc2lvbnMoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQpAQCAtNDUxLDYgKzQ1NiwxMCBAQAogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZnA6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGZwLndyaXRlLCBURVNURk4pCiAKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgbW9kZT0iciIpIGFzIHppcGZwOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgIHppcGZwLm9wZW4oVEVTVEZOLCBtb2RlPSd3JykKKwogICAgIGRlZiB0ZXN0X2FkZF9maWxlX2JlZm9yZV8xOTgwKHNlbGYpOgogICAgICAgICAjIFNldCBhdGltZSBhbmQgbXRpbWUgdG8gMTk3MC0wMS0wMQogICAgICAgICBvcy51dGltZShURVNURk4sICgwLCAwKSkKQEAgLTEwMjIsMzIgKzEwMzEsNiBAQAogICAgICAgICAgICAgICAgIGRhdGEgKz0gemlwZnAucmVhZChpbmZvKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihkYXRhLCB7YiJmb29iYXIiLCBiImJhcmZvbyJ9KQogCi0gICAgZGVmIHRlc3RfdW5pdmVyc2FsX2RlcHJlY2F0aW9uKHNlbGYpOgotICAgICAgICBmID0gaW8uQnl0ZXNJTygpCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IikgYXMgemlwZnA6Ci0gICAgICAgICAgICB6aXBmcC53cml0ZXN0cignc3BhbS50eHQnLCBiJ2FiYWJhZ2FsYW1hZ2EnKQotCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3IgbW9kZSBpbiAnVScsICdyVSc6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICAgICAgICAgIHppcG9wZW4gPSB6aXBmcC5vcGVuKCdzcGFtLnR4dCcsIG1vZGUpCi0gICAgICAgICAgICAgICAgemlwb3Blbi5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF91bml2ZXJzYWxfcmVhZGFoZWFkcyhzZWxmKToKLSAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQotCi0gICAgICAgIGRhdGEgPSBiJ2FcclxuJyAqIDE2ICogMTAyNAotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6Ci0gICAgICAgICAgICB6aXBmcC53cml0ZXN0cihURVNURk4sIGRhdGEpCi0KLSAgICAgICAgZGF0YTIgPSBiJycKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgJ3InKSBhcyB6aXBmcCwgXAotICAgICAgICAgICAgIG9wZW5VKHppcGZwLCBURVNURk4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICBmb3IgbGluZSBpbiB6aXBvcGVuOgotICAgICAgICAgICAgICAgIGRhdGEyICs9IGxpbmUKLQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGRhdGEyLnJlcGxhY2UoYidcbicsIGInXHJcbicpKQotCiAgICAgZGVmIHRlc3Rfd3JpdGVzdHJfZXh0ZW5kZWRfbG9jYWxfaGVhZGVyX2lzc3VlMTIwMihzZWxmKToKICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnKSBhcyBvcmlnX3ppcDoKICAgICAgICAgICAgIGZvciBkYXRhIGluICdhYmNkZWZnaGlqa2xtbm9wJzoKQEAgLTEyNTUsOSArMTIzOCwxMiBAQAogICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKIAogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgotICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCisgICAgICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCiAgICAgICAgICAgICB6aXBmLnJlYWQoImZvby50eHQiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLm9wZW4sICJmb28udHh0IiwgInEiKQorICAgICAgICAgICAgIyB1bml2ZXJzYWwgbmV3bGluZXMgc3VwcG9ydCBpcyByZW1vdmVkCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAiVSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAiclUiKQogCiAgICAgZGVmIHRlc3RfcmVhZDAoc2VsZik6CiAgICAgICAgICIiIkNoZWNrIHRoYXQgY2FsbGluZyByZWFkKDApIG9uIGEgWmlwRXh0RmlsZSBvYmplY3QgcmV0dXJucyBhbiBlbXB0eQpAQCAtMTQyOCw2ICsxNDE0LDM1IEBACiAgICAgICAgICAgICAjIHRlc3R6aXAgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgY29ycnVwdCBmaWxlLCBvciBOb25lCiAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh6aXBmLnRlc3R6aXAoKSkKIAorICAgIGRlZiB0ZXN0X29wZW5fY29uZmxpY3RpbmdfaGFuZGxlcyhzZWxmKToKKyAgICAgICAgIyBJdCdzIG9ubHkgcG9zc2libGUgdG8gb3BlbiBvbmUgd3JpdGFibGUgZmlsZSBoYW5kbGUgYXQgYSB0aW1lCisgICAgICAgIG1zZzEgPSBiIkl0J3MgZnVuIHRvIGNoYXJ0ZXIgYW4gYWNjb3VudGFudCEiCisgICAgICAgIG1zZzIgPSBiIkFuZCBzYWlsIHRoZSB3aWRlIGFjY291bnRhbnQgc2VhIgorICAgICAgICBtc2czID0gYiJUbyBmaW5kLCBleHBsb3JlIHRoZSBmdW5kcyBvZmZzaG9yZSIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignZm9vJywgbW9kZT0ndycpIGFzIHcyOgorICAgICAgICAgICAgICAgIHcyLndyaXRlKG1zZzEpCisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignYmFyJywgbW9kZT0ndycpIGFzIHcxOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5vcGVuKCdoYW5kbGUnLCBtb2RlPSd3JykKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHppcGYub3BlbignZm9vJywgbW9kZT0ncicpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCdzdHInLCAnYWJjZGUnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi53cml0ZShfX2ZpbGVfXywgJ2ZpbGUnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgdzEud3JpdGUobXNnMikKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdiYXonLCBtb2RlPSd3JykgYXMgdzI6CisgICAgICAgICAgICAgICAgdzIud3JpdGUobXNnMykKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnZm9vJyksIG1zZzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnYmFyJyksIG1zZzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnYmF6JyksIG1zZzMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYubmFtZWxpc3QoKSwgWydmb28nLCAnYmFyJywgJ2JheiddKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOKQogICAgICAgICB1bmxpbmsoVEVTVEZOMikKQEAgLTE3NjEsNiArMTc3NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycpIGFzIHpvcGVuOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6b3Blbi5yZWFkKCksIGInMjIyJykKIAorICAgIGRlZiB0ZXN0X29wZW5fd3JpdGUoc2VsZik6CisgICAgICAgIGZvciB3cmFwcGVyIGluIChsYW1iZGEgZjogZiksIFRlbGxhYmxlLCBVbnNlZWthYmxlOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qod3JhcHBlcj13cmFwcGVyKToKKyAgICAgICAgICAgICAgICBmID0gaW8uQnl0ZXNJTygpCisgICAgICAgICAgICAgICAgZi53cml0ZShiJ2FiYycpCisgICAgICAgICAgICAgICAgYmYgPSBpby5CdWZmZXJlZFdyaXRlcihmKQorICAgICAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHdyYXBwZXIoYmYpLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnLCAndycpIGFzIHpvcGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgem9wZW4ud3JpdGUoYicxMTEnKQorICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycsICd3JykgYXMgem9wZW46CisgICAgICAgICAgICAgICAgICAgICAgICB6b3Blbi53cml0ZShiJzIyMicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKClbOjVdLCBiJ2FiY1BLJykKKyAgICAgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmKSBhcyB6aXBmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgnb25lcycpLCBiJzExMScpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCd0d29zJyksIGInMjIyJykKKwogCiBAcmVxdWlyZXNfemxpYgogY2xhc3MgVGVzdHNXaXRoTXVsdGlwbGVPcGVucyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xODcxLDYgKzE5MDIsMTkgQEAKICAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoZi5maWxlbm8oKSwgMTAwKQogCisgICAgZGVmIHRlc3Rfd3JpdGVfd2hpbGVfcmVhZGluZyhzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoJ29uZXMnLCBzZWxmLmRhdGExKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAnYScsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmOgorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnLCAncicpIGFzIHIxOgorICAgICAgICAgICAgICAgIGRhdGExID0gcjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ3R3b3MnLCAndycpIGFzIHcxOgorICAgICAgICAgICAgICAgICAgICB3MS53cml0ZShzZWxmLmRhdGEyKQorICAgICAgICAgICAgICAgIGRhdGExICs9IHIxLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGExLCBzZWxmLmRhdGExKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLnJlYWQoJ3R3b3MnKSwgc2VsZi5kYXRhMikKKwogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgdW5saW5rKFRFU1RGTjIpCiAKQEAgLTE5NDAsMTM3ICsxOTg0LDE5IEBACiAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQogCiAKLWNsYXNzIEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzOgotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5saW5lX2dlbiA9IFtieXRlcygiVGVzdCBvZiB6aXBmaWxlIGxpbmUgJWQuIiAlIGksICJhc2NpaSIpCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShGSVhFRFRFU1RfU0laRSldCi0gICAgICAgIGNscy5zZXBzID0gKGInXHInLCBiJ1xyXG4nLCBiJ1xuJykKLSAgICAgICAgY2xzLmFyY2RhdGEgPSB7fQotICAgICAgICBmb3IgbiwgcyBpbiBlbnVtZXJhdGUoY2xzLnNlcHMpOgotICAgICAgICAgICAgY2xzLmFyY2RhdGFbc10gPSBzLmpvaW4oY2xzLmxpbmVfZ2VuKSArIHMKK2NsYXNzIFppcEluZm9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICB6aSA9IHppcGZpbGUuWmlwSW5mby5mcm9tX2ZpbGUoX19maWxlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmJhc2VuYW1lKHppLmZpbGVuYW1lKSwgJ3Rlc3RfemlwZmlsZS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemkuaXNfZGlyKCkpCiAKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXJjZmlsZXMgPSB7fQotICAgICAgICBmb3IgbiwgcyBpbiBlbnVtZXJhdGUoc2VsZi5zZXBzKToKLSAgICAgICAgICAgIHNlbGYuYXJjZmlsZXNbc10gPSAnJXMtJWQnICUgKFRFU1RGTiwgbikKLSAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmFyY2ZpbGVzW3NdLCAid2IiKSBhcyBmOgotICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5hcmNkYXRhW3NdKQotCi0gICAgZGVmIG1ha2VfdGVzdF9hcmNoaXZlKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYuYXJjZmlsZXMudmFsdWVzKCk6Ci0gICAgICAgICAgICAgICAgemlwZnAud3JpdGUoZm4sIGZuKQotCi0gICAgZGVmIHJlYWRfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAgICAgemlwZGF0YSA9IGZwLnJlYWQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hcmNkYXRhW3NlcF0sIHppcGRhdGEpCi0KLSAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJlYWRfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lX3JlYWRfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyB6aXBvcGVuOgotICAgICAgICAgICAgICAgICAgICBkYXRhID0gYicnCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWFkID0gemlwb3Blbi5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSByZWFkCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWQoNSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKLQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLmFyY2RhdGFbYidcbiddKQotCi0gICAgZGVmIHRlc3RfcmVhZGxpbmVfcmVhZChzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZV9yZWFkX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiByZWFkbGluZV90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lZGF0YSA9IHppcG9wZW4ucmVhZGxpbmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lZGF0YSwgbGluZSArIGInXG4nKQotCi0gICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZGxpbmVfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICB6aXBsaW5lcyA9IGZwLnJlYWRsaW5lcygpCi0gICAgICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIHppcGxpbmVzKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZGxpbmVzX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiBpdGVybGluZXNfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6Ci0gICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCi0KLSAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgotICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgIHdpdGggb3BlblUoemlwZnAsIGZuKSBhcyBmcDoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIGZwKToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArIGInXG4nKQotCi0gICAgZGVmIHRlc3RfaXRlcmxpbmVzKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLml0ZXJsaW5lc190ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgIHVubGluayhmbikKLSAgICAgICAgdW5saW5rKFRFU1RGTikKLSAgICAgICAgdW5saW5rKFRFU1RGTjIpCi0KLQotY2xhc3MgU3RvcmVkVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX1NUT1JFRAotCi1AcmVxdWlyZXNfemxpYgotY2xhc3MgRGVmbGF0ZVVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfREVGTEFURUQKLQotQHJlcXVpcmVzX2J6MgotY2xhc3MgQnppcDJVbml2ZXJzYWxOZXdsaW5lVGVzdHMoQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9CWklQMgotCi1AcmVxdWlyZXNfbHptYQotY2xhc3MgTHptYVVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfTFpNQQorICAgIGRlZiB0ZXN0X2Zyb21fZGlyKHNlbGYpOgorICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCisgICAgICAgIHppID0gemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZShkaXJwYXRoLCAnc3RkbGliX3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5maWxlbmFtZSwgJ3N0ZGxpYl90ZXN0cy8nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemkuaXNfZGlyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuY29tcHJlc3NfdHlwZSwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmZpbGVfc2l6ZSwgMCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKaW5kZXggOGU1ZTEyZC4uMjA0OTFjZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKICAgICAgICAgZmlsZXMgPSB7cGFja2RpciArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCiAgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKLSAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgICJzcGFtIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KIAogICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQogICAgICAgICB0cnk6CkBAIC00MTIsNiArNDEzLDE0IEBACiAgICAgICAgICAgICB6aSA9IHppcGltcG9ydC56aXBpbXBvcnRlcihURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuYXJjaGl2ZSwgVEVNUF9aSVApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UoVEVTVFBBQ0spLCBUcnVlKQorCisgICAgICAgICAgICBmaW5kX21vZCA9IHppLmZpbmRfbW9kdWxlKCdzcGFtJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbmRfbW9kLmlzX3BhY2thZ2UoJ3NwYW0nKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2QubG9hZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX21vZC5nZXRfZmlsZW5hbWUoJ3NwYW0nKSwgbG9hZF9tb2QuX19maWxlX18pCisKICAgICAgICAgICAgIG1vZCA9IHppLmxvYWRfbW9kdWxlKFRFU1RQQUNLKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUoVEVTVFBBQ0spLCBtb2QuX19maWxlX18pCiAKQEAgLTQ3MSw2ICs0ODAsMTYgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgemkuaXNfcGFja2FnZShURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9EKSwgRmFsc2UpCiAKKyAgICAgICAgICAgIHBrZ19wYXRoID0gVEVNUF9aSVAgKyBvcy5zZXAgKyBwYWNrZGlyICsgVEVTVFBBQ0syCisgICAgICAgICAgICB6aTIgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGtnX3BhdGgpCisgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQgPSB6aTIuZmluZF9tb2R1bGUoVEVTVE1PRCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGZpbmRfbW9kX2RvdHRlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaW5kX21vZF9kb3R0ZWQsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemkyLmlzX3BhY2thZ2UoVEVTVE1PRCkpCisgICAgICAgICAgICBsb2FkX21vZCA9IGZpbmRfbW9kX2RvdHRlZC5sb2FkX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBmaW5kX21vZF9kb3R0ZWQuZ2V0X2ZpbGVuYW1lKFRFU1RNT0QpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kX3BhdGggPSBURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9ECiAgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZHVsZV9wYXRoX3RvX2RvdHRlZF9uYW1lKG1vZF9wYXRoKQogICAgICAgICAgICAgbW9kID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobW9kX25hbWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCA1OTEzNjIyLi44NGQ1MjZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTEyLDcgKzEyLDYgQEAKIGltcG9ydCBkb2N0ZXN0CiBpbXBvcnQgaW5zcGVjdAogaW1wb3J0IGxpbmVjYWNoZQotaW1wb3J0IHBkYgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCAoc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbiwgYXNzZXJ0X3B5dGhvbl9vaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3NjcmlwdCwgbWFrZV96aXBfc2NyaXB0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96bGliLnB5IGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CmluZGV4IDc4ZWNhZGUuLmJiOTI5MmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKQEAgLTE2Miw2ICsxNjIsMTIgQEAKICAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyh4KSwgSEFNTEVUX1NDRU5FKQogCisgICAgZGVmIHRlc3Rfa2V5d29yZHMoc2VsZik6CisgICAgICAgIHggPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSwgbGV2ZWw9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIEhBTUxFVF9TQ0VORSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgemxpYi5jb21wcmVzcyhkYXRhPUhBTUxFVF9TQ0VORSwgbGV2ZWw9MykKKwogICAgIGRlZiB0ZXN0X3NwZWVjaDEyOChzZWxmKToKICAgICAgICAgIyBjb21wcmVzcyBtb3JlIGRhdGEKICAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORSAqIDEyOApkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggYzlmOGNiNi4uZDA5ZmNhZSAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC0yMiw5ICsyMiwxMSBAQAogIyB3aXRoIHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLCB3aGljaCBkb2Vzbid0IHByb3ZpZGUgdGhlIG9sZAogIyBKYXZhIGluc3BpcmVkIG5hbWVzLgogCi1fX2FsbF9fID0gWydhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRfdGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCi0gICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsICdCYXJyaWVyJywKLSAgICAgICAgICAgJ1RpbWVyJywgJ1RocmVhZEVycm9yJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCitfX2FsbF9fID0gWydnZXRfaWRlbnQnLCAnYWN0aXZlX2NvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50X3RocmVhZCcsCisgICAgICAgICAgICdlbnVtZXJhdGUnLCAnbWFpbl90aHJlYWQnLCAnVElNRU9VVF9NQVgnLAorICAgICAgICAgICAnRXZlbnQnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdUaHJlYWQnLAorICAgICAgICAgICAnQmFycmllcicsICdCcm9rZW5CYXJyaWVyRXJyb3InLCAnVGltZXInLCAnVGhyZWFkRXJyb3InLAorICAgICAgICAgICAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KIAogIyBSZW5hbWUgc29tZSBzdHVmZiBzbyAiZnJvbSB0aHJlYWRpbmcgaW1wb3J0ICoiIGlzIHNhZmUKIF9zdGFydF9uZXdfdGhyZWFkID0gX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkCmRpZmYgLS1naXQgYS9MaWIvdGltZWl0LnB5IGIvTGliL3RpbWVpdC5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IDJkZTg4ZjcuLjk4Y2IzZWIKLS0tIGEvTGliL3RpbWVpdC5weQorKysgYi9MaWIvdGltZWl0LnB5CkBAIC0zMTcsMjAgKzMxNywyNiBAQAogICAgIHByaW50KCIlZCBsb29wcywiICUgbnVtYmVyLCBlbmQ9JyAnKQogICAgIHVzZWMgPSBiZXN0ICogMWU2IC8gbnVtYmVyCiAgICAgaWYgdGltZV91bml0IGlzIG5vdCBOb25lOgotICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyAlcyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjL3VuaXRzW3RpbWVfdW5pdF0sIHRpbWVfdW5pdCkpCisgICAgICAgIHNjYWxlID0gdW5pdHNbdGltZV91bml0XQogICAgIGVsc2U6Ci0gICAgICAgIGlmIHVzZWMgPCAxMDAwOgotICAgICAgICAgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgdXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sIHVzZWMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbXNlYyA9IHVzZWMgLyAxMDAwCi0gICAgICAgICAgICBpZiBtc2VjIDwgMTAwMDoKLSAgICAgICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyBtc2VjIHBlciBsb29wIiAlIChyZXBlYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCBtc2VjKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VjID0gbXNlYyAvIDEwMDAKLSAgICAgICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyBzZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbiwgc2VjKSkKKyAgICAgICAgc2NhbGVzID0gWyhzY2FsZSwgdW5pdCkgZm9yIHVuaXQsIHNjYWxlIGluIHVuaXRzLml0ZW1zKCldCisgICAgICAgIHNjYWxlcy5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgZm9yIHNjYWxlLCB0aW1lX3VuaXQgaW4gc2NhbGVzOgorICAgICAgICAgICAgaWYgdXNlYyA+PSBzY2FsZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnICVzIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlYy9zY2FsZSwgdGltZV91bml0KSkKKyAgICBiZXN0ID0gbWluKHIpCisgICAgdXNlYyA9IGJlc3QgKiAxZTYgLyBudW1iZXIKKyAgICB3b3JzdCA9IG1heChyKQorICAgIGlmIHdvcnN0ID49IGJlc3QgKiA0OgorICAgICAgICB1c2VjID0gd29yc3QgKiAxZTYgLyBudW1iZXIKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm5fZXhwbGljaXQoCisgICAgICAgICAgICAiVGhlIHRlc3QgcmVzdWx0cyBhcmUgbGlrZWx5IHVucmVsaWFibGUuIFRoZSB3b3JzdFxuIgorICAgICAgICAgICAgInRpbWUgKCUuKmcgJXMpIHdhcyBtb3JlIHRoYW4gZm91ciB0aW1lcyBzbG93ZXIgdGhhbiB0aGUgYmVzdCB0aW1lLiIgJQorICAgICAgICAgICAgKHByZWNpc2lvbiwgdXNlYy9zY2FsZSwgdGltZV91bml0KSwKKyAgICAgICAgICAgICBVc2VyV2FybmluZywgJycsIDApCiAgICAgcmV0dXJuIE5vbmUKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL19faW5pdF9fLnB5IGIvTGliL3RraW50ZXIvX19pbml0X18ucHkKaW5kZXggNTViZmI3Zi4uMzU2NDNlNiAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvX19pbml0X18ucHkKKysrIGIvTGliL3RraW50ZXIvX19pbml0X18ucHkKQEAgLTMwLDYgKzMwLDcgQEAKIHRrLm1haW5sb29wKCkKICIiIgogCitpbXBvcnQgZW51bQogaW1wb3J0IHN5cwogCiBpbXBvcnQgX3RraW50ZXIgIyBJZiB0aGlzIGZhaWxzIHlvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsKQEAgLTEzMiw2ICsxMzMsNTAgQEAKICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKICAgICByZXR1cm4gZGljdAogCisKK2NsYXNzIEV2ZW50VHlwZShzdHIsIGVudW0uRW51bSk6CisgICAgS2V5UHJlc3MgPSAnMicKKyAgICBLZXkgPSBLZXlQcmVzcywKKyAgICBLZXlSZWxlYXNlID0gJzMnCisgICAgQnV0dG9uUHJlc3MgPSAnNCcKKyAgICBCdXR0b24gPSBCdXR0b25QcmVzcywKKyAgICBCdXR0b25SZWxlYXNlID0gJzUnCisgICAgTW90aW9uID0gJzYnCisgICAgRW50ZXIgPSAnNycKKyAgICBMZWF2ZSA9ICc4JworICAgIEZvY3VzSW4gPSAnOScKKyAgICBGb2N1c091dCA9ICcxMCcKKyAgICBLZXltYXAgPSAnMTEnICAgICAgICAgICAjIHVuZG9jdW1lbnRlZAorICAgIEV4cG9zZSA9ICcxMicKKyAgICBHcmFwaGljc0V4cG9zZSA9ICcxMycgICAjIHVuZG9jdW1lbnRlZAorICAgIE5vRXhwb3NlID0gJzE0JyAgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgVmlzaWJpbGl0eSA9ICcxNScKKyAgICBDcmVhdGUgPSAnMTYnCisgICAgRGVzdHJveSA9ICcxNycKKyAgICBVbm1hcCA9ICcxOCcKKyAgICBNYXAgPSAnMTknCisgICAgTWFwUmVxdWVzdCA9ICcyMCcKKyAgICBSZXBhcmVudCA9ICcyMScKKyAgICBDb25maWd1cmUgPSAnMjInCisgICAgQ29uZmlndXJlUmVxdWVzdCA9ICcyMycKKyAgICBHcmF2aXR5ID0gJzI0JworICAgIFJlc2l6ZVJlcXVlc3QgPSAnMjUnCisgICAgQ2lyY3VsYXRlID0gJzI2JworICAgIENpcmN1bGF0ZVJlcXVlc3QgPSAnMjcnCisgICAgUHJvcGVydHkgPSAnMjgnCisgICAgU2VsZWN0aW9uQ2xlYXIgPSAnMjknICAgIyB1bmRvY3VtZW50ZWQKKyAgICBTZWxlY3Rpb25SZXF1ZXN0ID0gJzMwJyAjIHVuZG9jdW1lbnRlZAorICAgIFNlbGVjdGlvbiA9ICczMScgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgQ29sb3JtYXAgPSAnMzInCisgICAgQ2xpZW50TWVzc2FnZSA9ICczMycgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBNYXBwaW5nID0gJzM0JyAgICAgICAgICAjIHVuZG9jdW1lbnRlZAorICAgIFZpcnR1YWxFdmVudCA9ICczNScsICAgICMgdW5kb2N1bWVudGVkCisgICAgQWN0aXZhdGUgPSAnMzYnLAorICAgIERlYWN0aXZhdGUgPSAnMzcnLAorICAgIE1vdXNlV2hlZWwgPSAnMzgnLAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKIGNsYXNzIEV2ZW50OgogICAgICIiIkNvbnRhaW5lciBmb3IgdGhlIHByb3BlcnRpZXMgb2YgYW4gZXZlbnQuCiAKQEAgLTE3NCw3ICsyMTksNDMgQEAKICAgICB3aWRnZXQgLSB3aWRnZXQgaW4gd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkCiAgICAgZGVsdGEgLSBkZWx0YSBvZiB3aGVlbCBtb3ZlbWVudCAoTW91c2VXaGVlbCkKICAgICAiIiIKLSAgICBwYXNzCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhdHRycyA9IHtrOiB2IGZvciBrLCB2IGluIHNlbGYuX19kaWN0X18uaXRlbXMoKSBpZiB2ICE9ICc/Pyd9CisgICAgICAgIGlmIG5vdCBzZWxmLmNoYXI6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ2NoYXInXQorICAgICAgICBlbGlmIHNlbGYuY2hhciAhPSAnPz8nOgorICAgICAgICAgICAgYXR0cnNbJ2NoYXInXSA9IHJlcHIoc2VsZi5jaGFyKQorICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLCAnc2VuZF9ldmVudCcsIFRydWUpOgorICAgICAgICAgICAgZGVsIGF0dHJzWydzZW5kX2V2ZW50J10KKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSAwOgorICAgICAgICAgICAgZGVsIGF0dHJzWydzdGF0ZSddCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLnN0YXRlLCBpbnQpOgorICAgICAgICAgICAgc3RhdGUgPSBzZWxmLnN0YXRlCisgICAgICAgICAgICBtb2RzID0gKCdTaGlmdCcsICdMb2NrJywgJ0NvbnRyb2wnLAorICAgICAgICAgICAgICAgICAgICAnTW9kMScsICdNb2QyJywgJ01vZDMnLCAnTW9kNCcsICdNb2Q1JywKKyAgICAgICAgICAgICAgICAgICAgJ0J1dHRvbjEnLCAnQnV0dG9uMicsICdCdXR0b24zJywgJ0J1dHRvbjQnLCAnQnV0dG9uNScpCisgICAgICAgICAgICBzID0gW10KKyAgICAgICAgICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZShtb2RzKToKKyAgICAgICAgICAgICAgICBpZiBzdGF0ZSAmICgxIDw8IGkpOgorICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZChuKQorICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZSAmIH4oKDE8PCBsZW4obW9kcykpIC0gMSkKKyAgICAgICAgICAgIGlmIHN0YXRlIG9yIG5vdCBzOgorICAgICAgICAgICAgICAgIHMuYXBwZW5kKGhleChzdGF0ZSkpCisgICAgICAgICAgICBhdHRyc1snc3RhdGUnXSA9ICd8Jy5qb2luKHMpCisgICAgICAgIGlmIHNlbGYuZGVsdGEgPT0gMDoKKyAgICAgICAgICAgIGRlbCBhdHRyc1snZGVsdGEnXQorICAgICAgICAjIHdpZGdldCB1c3VhbGx5IGlzIGtub3duCisgICAgICAgICMgc2VyaWFsIGFuZCB0aW1lIGFyZSBub3QgdmVyeSBpbnRlcmVzaW5nCisgICAgICAgICMga2V5c3ltX251bSBkdXBsaWNhdGVzIGtleXN5bQorICAgICAgICAjIHhfcm9vdCBhbmQgeV9yb290IG1vc3RseSBkdXBsaWNhdGUgeCBhbmQgeQorICAgICAgICBrZXlzID0gKCdzZW5kX2V2ZW50JywKKyAgICAgICAgICAgICAgICAnc3RhdGUnLCAna2V5c3ltJywgJ2tleWNvZGUnLCAnY2hhcicsCisgICAgICAgICAgICAgICAgJ251bScsICdkZWx0YScsICdmb2N1cycsCisgICAgICAgICAgICAgICAgJ3gnLCAneScsICd3aWR0aCcsICdoZWlnaHQnKQorICAgICAgICByZXR1cm4gJzwlcyBldmVudCVzPicgJSAoCisgICAgICAgICAgICBzZWxmLnR5cGUsCisgICAgICAgICAgICAnJy5qb2luKCcgJXM9JXMnICUgKGssIGF0dHJzW2tdKSBmb3IgayBpbiBrZXlzIGlmIGsgaW4gYXR0cnMpCisgICAgICAgICkKIAogX3N1cHBvcnRfZGVmYXVsdF9yb290ID0gMQogX2RlZmF1bHRfcm9vdCA9IE5vbmUKQEAgLTI2MiwxNSArMzQzLDggQEAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdmFsdWUgb2YgdmFyaWFibGUuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl90ay5nbG9iYWxnZXR2YXIoc2VsZi5fbmFtZSkKLSAgICBkZWYgdHJhY2VfdmFyaWFibGUoc2VsZiwgbW9kZSwgY2FsbGJhY2spOgotICAgICAgICAiIiJEZWZpbmUgYSB0cmFjZSBjYWxsYmFjayBmb3IgdGhlIHZhcmlhYmxlLgogCi0gICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KLSAgICAgICAgQ0FMTEJBQ0sgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuCi0gICAgICAgIHRoZSB2YXJpYWJsZSBpcyByZWFkLCB3cml0dGVuIG9yIHVuZGVmaW5lZC4KLQotICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgotICAgICAgICAiIiIKKyAgICBkZWYgX3JlZ2lzdGVyKHNlbGYsIGNhbGxiYWNrKToKICAgICAgICAgZiA9IENhbGxXcmFwcGVyKGNhbGxiYWNrLCBOb25lLCBzZWxmLl9yb290KS5fX2NhbGxfXwogICAgICAgICBjYm5hbWUgPSByZXByKGlkKGYpKQogICAgICAgICB0cnk6CkBAIC0yODUsMTggKzM1OSwzMyBAQAogICAgICAgICBpZiBzZWxmLl90Y2xDb21tYW5kcyBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMgPSBbXQogICAgICAgICBzZWxmLl90Y2xDb21tYW5kcy5hcHBlbmQoY2JuYW1lKQotICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2YXJpYWJsZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKICAgICAgICAgcmV0dXJuIGNibmFtZQotICAgIHRyYWNlID0gdHJhY2VfdmFyaWFibGUKLSAgICBkZWYgdHJhY2VfdmRlbGV0ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgorCisgICAgZGVmIHRyYWNlX2FkZChzZWxmLCBtb2RlLCBjYWxsYmFjayk6CisgICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCisKKyAgICAgICAgTW9kZSBpcyBvbmUgb2YgInJlYWQiLCAid3JpdGUiLCAidW5zZXQiLCBvciBhIGxpc3Qgb3IgdHVwbGUgb2YKKyAgICAgICAgc3VjaCBzdHJpbmdzLgorICAgICAgICBDYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIHZhcmlhYmxlIGlzCisgICAgICAgIHJlYWQsIHdyaXR0ZW4gb3IgdW5zZXQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjay4KKyAgICAgICAgIiIiCisgICAgICAgIGNibmFtZSA9IHNlbGYuX3JlZ2lzdGVyKGNhbGxiYWNrKQorICAgICAgICBzZWxmLl90ay5jYWxsKCd0cmFjZScsICdhZGQnLCAndmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25hbWUsIG1vZGUsIChjYm5hbWUsKSkKKyAgICAgICAgcmV0dXJuIGNibmFtZQorCisgICAgZGVmIHRyYWNlX3JlbW92ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgogICAgICAgICAiIiJEZWxldGUgdGhlIHRyYWNlIGNhbGxiYWNrIGZvciBhIHZhcmlhYmxlLgogCi0gICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KLSAgICAgICAgQ0JOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX3ZhcmlhYmxlIG9yIHRyYWNlLgorICAgICAgICBNb2RlIGlzIG9uZSBvZiAicmVhZCIsICJ3cml0ZSIsICJ1bnNldCIgb3IgYSBsaXN0IG9yIHR1cGxlIG9mCisgICAgICAgIHN1Y2ggc3RyaW5ncy4gIE11c3QgYmUgc2FtZSBhcyB3ZXJlIHNwZWNpZmllZCBpbiB0cmFjZV9hZGQoKS4KKyAgICAgICAgY2JuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX2FkZCgpLgogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmRlbGV0ZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKLSAgICAgICAgY2JuYW1lID0gc2VsZi5fdGsuc3BsaXRsaXN0KGNibmFtZSlbMF0KLSAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfdmluZm8oKToKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgndHJhY2UnLCAncmVtb3ZlJywgJ3ZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIGZvciBtLCBjYSBpbiBzZWxmLnRyYWNlX2luZm8oKToKICAgICAgICAgICAgIGlmIHNlbGYuX3RrLnNwbGl0bGlzdChjYSlbMF0gPT0gY2JuYW1lOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGVsc2U6CkBAIC0zMDUsMTAgKzM5NCw2NCBAQAogICAgICAgICAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLnJlbW92ZShjYm5hbWUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgZGVmIHRyYWNlX3ZpbmZvKHNlbGYpOgorCisgICAgZGVmIHRyYWNlX2luZm8oc2VsZik6CiAgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIHNwbGl0bGlzdCA9IHNlbGYuX3RrLnNwbGl0bGlzdAorICAgICAgICByZXR1cm4gWyhzcGxpdGxpc3QoayksIHYpIGZvciBrLCB2IGluIG1hcChzcGxpdGxpc3QsCisgICAgICAgICAgICBzcGxpdGxpc3Qoc2VsZi5fdGsuY2FsbCgndHJhY2UnLCAnaW5mbycsICd2YXJpYWJsZScsIHNlbGYuX25hbWUpKSldCisKKyAgICBkZWYgdHJhY2VfdmFyaWFibGUoc2VsZiwgbW9kZSwgY2FsbGJhY2spOgorICAgICAgICAiIiJEZWZpbmUgYSB0cmFjZSBjYWxsYmFjayBmb3IgdGhlIHZhcmlhYmxlLgorCisgICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KKyAgICAgICAgQ0FMTEJBQ0sgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuCisgICAgICAgIHRoZSB2YXJpYWJsZSBpcyByZWFkLCB3cml0dGVuIG9yIHVuZGVmaW5lZC4KKworICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgorCisgICAgICAgIFRoaXMgZGVwcmVjYXRlZCBtZXRob2Qgd3JhcHMgYSBkZXByZWNhdGVkIFRjbCBtZXRob2QgdGhhdCB3aWxsCisgICAgICAgIGxpa2VseSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBVc2UgdHJhY2VfYWRkKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZhcmlhYmxlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICByZXR1cm4gY2JuYW1lCisKKyAgICB0cmFjZSA9IHRyYWNlX3ZhcmlhYmxlCisKKyAgICBkZWYgdHJhY2VfdmRlbGV0ZShzZWxmLCBtb2RlLCBjYm5hbWUpOgorICAgICAgICAiIiJEZWxldGUgdGhlIHRyYWNlIGNhbGxiYWNrIGZvciBhIHZhcmlhYmxlLgorCisgICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KKyAgICAgICAgQ0JOQU1FIGlzIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjayByZXR1cm5lZCBmcm9tIHRyYWNlX3ZhcmlhYmxlIG9yIHRyYWNlLgorCisgICAgICAgIFRoaXMgZGVwcmVjYXRlZCBtZXRob2Qgd3JhcHMgYSBkZXByZWNhdGVkIFRjbCBtZXRob2QgdGhhdCB3aWxsCisgICAgICAgIGxpa2VseSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBVc2UgdHJhY2VfcmVtb3ZlKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmRlbGV0ZSIsIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fdGsuc3BsaXRsaXN0KGNibmFtZSlbMF0KKyAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfaW5mbygpOgorICAgICAgICAgICAgaWYgc2VsZi5fdGsuc3BsaXRsaXN0KGNhKVswXSA9PSBjYm5hbWU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RrLmRlbGV0ZWNvbW1hbmQoY2JuYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLnJlbW92ZShjYm5hbWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdHJhY2VfdmluZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9pbmZvKCkgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVE9ETzogQWRkIGRlcHJlY2F0aW9uIHdhcm5pbmcKICAgICAgICAgcmV0dXJuIFtzZWxmLl90ay5zcGxpdGxpc3QoeCkgZm9yIHggaW4gc2VsZi5fdGsuc3BsaXRsaXN0KAogICAgICAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmluZm8iLCBzZWxmLl9uYW1lKSldCisKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgIiIiQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKD09KS4KIApAQCAtNDI2LDYgKzU2OSw5IEBACiAKICAgICBCYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgbWV0aG9kcyBjb21tb24gZm9yIGludGVyaW9yIHdpZGdldHMuIiIiCiAKKyAgICAjIHVzZWQgZm9yIGdlbmVyYXRpbmcgY2hpbGQgd2lkZ2V0IG5hbWVzCisgICAgX2xhc3RfY2hpbGRfaWRzID0gTm9uZQorCiAgICAgIyBYWFggZm9udCBjb21tYW5kPwogICAgIF90Y2xDb21tYW5kcyA9IE5vbmUKICAgICBkZWYgZGVzdHJveShzZWxmKToKQEAgLTQ3MywxMiArNjE5LDYgQEAKICAgICAgICAgZGlzYWJsZWRGb3JlZ3JvdW5kLCBpbnNlcnRCYWNrZ3JvdW5kLCB0cm91Z2hDb2xvci4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKCgndGtfc2V0UGFsZXR0ZScsKQogICAgICAgICAgICAgICArIF9mbGF0dGVuKGFyZ3MpICsgX2ZsYXR0ZW4obGlzdChrdy5pdGVtcygpKSkpCi0gICAgZGVmIHRrX21lbnVCYXIoc2VsZiwgKmFyZ3MpOgotICAgICAgICAiIiJEbyBub3QgdXNlLiBOZWVkZWQgaW4gVGsgMy42IGFuZCBlYXJsaWVyLiIiIgotICAgICAgICAjIG9ic29sZXRlIHNpbmNlIFRrIDQuMAotICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3Mud2FybigndGtfbWVudUJhcigpIGRvZXMgbm90aGluZyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuNicsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgZGVmIHdhaXRfdmFyaWFibGUoc2VsZiwgbmFtZT0nUFlfVkFSJyk6CiAgICAgICAgICIiIldhaXQgdW50aWwgdGhlIHZhcmlhYmxlIGlzIG1vZGlmaWVkLgogCkBAIC04NTAsOCArOTkwLDcgQEAKICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaGVpZ2h0Jywgc2VsZi5fdykpCiAgICAgZGVmIHdpbmZvX2lkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gaWRlbnRpZmllciBJRCBmb3IgdGhpcyB3aWRnZXQuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLmdldGludCgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSkKKyAgICAgICAgcmV0dXJuIGludChzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2lkJywgc2VsZi5fdyksIDApCiAgICAgZGVmIHdpbmZvX2ludGVycHMoc2VsZiwgZGlzcGxheW9mPTApOgogICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgYWxsIFRjbCBpbnRlcnByZXRlcnMgZm9yIHRoaXMgZGlzcGxheS4iIiIKICAgICAgICAgYXJncyA9ICgnd2luZm8nLCAnaW50ZXJwcycpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikKQEAgLTk3MSwxOCArMTExMCwxNiBAQAogICAgIGRlZiB3aW5mb192aXN1YWxpZChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBYIGlkZW50aWZpZXIgZm9yIHRoZSB2aXN1YWwgZm9yIHRoaXMgd2lkZ2V0LiIiIgogICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxpZCcsIHNlbGYuX3cpCi0gICAgZGVmIHdpbmZvX3Zpc3VhbHNhdmFpbGFibGUoc2VsZiwgaW5jbHVkZWlkcz0wKToKKyAgICBkZWYgd2luZm9fdmlzdWFsc2F2YWlsYWJsZShzZWxmLCBpbmNsdWRlaWRzPUZhbHNlKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmlzdWFscyBhdmFpbGFibGUgZm9yIHRoZSBzY3JlZW4KICAgICAgICAgb2YgdGhpcyB3aWRnZXQuCiAKICAgICAgICAgRWFjaCBpdGVtIGluIHRoZSBsaXN0IGNvbnNpc3RzIG9mIGEgdmlzdWFsIG5hbWUgKHNlZSB3aW5mb192aXN1YWwpLCBhCi0gICAgICAgIGRlcHRoIGFuZCBpZiBJTkNMVURFSURTPTEgaXMgZ2l2ZW4gYWxzbyB0aGUgWCBpZGVudGlmaWVyLiIiIgotICAgICAgICBkYXRhID0gc2VsZi50ay5zcGxpdCgKLSAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndmlzdWFsc2F2YWlsYWJsZScsIHNlbGYuX3csCi0gICAgICAgICAgICAgICAgICAgICBpbmNsdWRlaWRzIGFuZCAnaW5jbHVkZWlkcycgb3IgTm9uZSkpCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKLSAgICAgICAgICAgIGRhdGEgPSBbc2VsZi50ay5zcGxpdChkYXRhKV0KLSAgICAgICAgcmV0dXJuIFtzZWxmLl9fd2luZm9fcGFyc2VpdGVtKHgpIGZvciB4IGluICBkYXRhXQorICAgICAgICBkZXB0aCBhbmQgaWYgaW5jbHVkZWlkcyBpcyB0cnVlIGlzIGdpdmVuIGFsc28gdGhlIFggaWRlbnRpZmllci4iIiIKKyAgICAgICAgZGF0YSA9IHNlbGYudGsuY2FsbCgnd2luZm8nLCAndmlzdWFsc2F2YWlsYWJsZScsIHNlbGYuX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luY2x1ZGVpZHMnIGlmIGluY2x1ZGVpZHMgZWxzZSBOb25lKQorICAgICAgICBkYXRhID0gW3NlbGYudGsuc3BsaXRsaXN0KHgpIGZvciB4IGluIHNlbGYudGsuc3BsaXRsaXN0KGRhdGEpXQorICAgICAgICByZXR1cm4gW3NlbGYuX193aW5mb19wYXJzZWl0ZW0oeCkgZm9yIHggaW4gZGF0YV0KICAgICBkZWYgX193aW5mb19wYXJzZWl0ZW0oc2VsZiwgdCk6CiAgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgogICAgICAgICByZXR1cm4gdFs6MV0gKyB0dXBsZShtYXAoc2VsZi5fX3dpbmZvX2dldGludCwgdFsxOl0pKQpAQCAtMTI4Myw3ICsxNDIwLDEwIEBACiAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjogcGFzcwogICAgICAgICBlLmtleXN5bSA9IEsKICAgICAgICAgZS5rZXlzeW1fbnVtID0gZ2V0aW50X2V2ZW50KE4pCi0gICAgICAgIGUudHlwZSA9IFQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZS50eXBlID0gRXZlbnRUeXBlKFQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgZS50eXBlID0gVAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBlLndpZGdldCA9IHNlbGYuX25hbWV0b3dpZGdldChXKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC0xODkzLDkgKzIwMzMsNiBAQAogICAgICAgICBpZiB0Y2xfdmVyc2lvbiAhPSBfdGtpbnRlci5UQ0xfVkVSU0lPTjoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidGNsLmggdmVyc2lvbiAoJXMpIGRvZXNuJ3QgbWF0Y2ggbGlidGNsLmEgdmVyc2lvbiAoJXMpIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoX3RraW50ZXIuVENMX1ZFUlNJT04sIHRjbF92ZXJzaW9uKSkKLSAgICAgICAgaWYgVGtWZXJzaW9uIDwgNC4wOgotICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJUayA0LjAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkOyBmb3VuZCBUayAlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cihUa1ZlcnNpb24pKQogICAgICAgICAjIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIHRrZXJyb3IgYW5kIGV4aXQgY29tbWFuZHMKICAgICAgICAgIyBXZSBuZWVkIHRvIGlubGluZSBwYXJ0cyBvZiBfcmVnaXN0ZXIgaGVyZSwgXyByZWdpc3RlcgogICAgICAgICAjIHdvdWxkIHJlZ2lzdGVyIGRpZmZlcmVudGx5LW5hbWVkIGNvbW1hbmRzLgpAQCAtMjExOCw3ICsyMjU1LDE1IEBACiAgICAgICAgICAgICBuYW1lID0gY25mWyduYW1lJ10KICAgICAgICAgICAgIGRlbCBjbmZbJ25hbWUnXQogICAgICAgICBpZiBub3QgbmFtZToKLSAgICAgICAgICAgIG5hbWUgPSByZXByKGlkKHNlbGYpKQorICAgICAgICAgICAgbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKKyAgICAgICAgICAgIGlmIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzID0ge30KKyAgICAgICAgICAgIGNvdW50ID0gbWFzdGVyLl9sYXN0X2NoaWxkX2lkcy5nZXQobmFtZSwgMCkgKyAxCisgICAgICAgICAgICBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzW25hbWVdID0gY291bnQKKyAgICAgICAgICAgIGlmIGNvdW50ID09IDE6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdgJXMnICUgKG5hbWUsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lID0gJ2AlcyVkJyAlIChuYW1lLCBjb3VudCkKICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKICAgICAgICAgaWYgbWFzdGVyLl93PT0nLic6CiAgICAgICAgICAgICBzZWxmLl93ID0gJy4nICsgbmFtZQpAQCAtMjcxNCwxMiArMjg1OSw2IEBACiAgICAgZGVmIHRrX3BvcHVwKHNlbGYsIHgsIHksIGVudHJ5PSIiKToKICAgICAgICAgIiIiUG9zdCB0aGUgbWVudSBhdCBwb3NpdGlvbiBYLFkgd2l0aCBlbnRyeSBFTlRSWS4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKCd0a19wb3B1cCcsIHNlbGYuX3csIHgsIHksIGVudHJ5KQotICAgIGRlZiB0a19iaW5kRm9yVHJhdmVyc2FsKHNlbGYpOgotICAgICAgICAjIG9ic29sZXRlIHNpbmNlIFRrIDQuMAotICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgd2FybmluZ3Mud2FybigndGtfYmluZEZvclRyYXZlcnNhbCgpIGRvZXMgbm90aGluZyBhbmQgJwotICAgICAgICAgICAgICAgICAgICAgICd3aWxsIGJlIHJlbW92ZWQgaW4gMy42JywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICBkZWYgYWN0aXZhdGUoc2VsZiwgaW5kZXgpOgogICAgICAgICAiIiJBY3RpdmF0ZSBlbnRyeSBhdCBJTkRFWC4iIiIKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhY3RpdmF0ZScsIGluZGV4KQpAQCAtMzM0Miw5ICszNDgxLDYgQEAKICAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICBJbWFnZS5fbGFzdF9pZCArPSAxCiAgICAgICAgICAgICBuYW1lID0gInB5aW1hZ2UlciIgJSAoSW1hZ2UuX2xhc3RfaWQsKSAjIHRrIGl0c2VsZiB3b3VsZCB1c2UgaW1hZ2U8eD4KLSAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIHN5c3RlbXMgd2hlcmUgaWQoeCkKLSAgICAgICAgICAgICMgY2FuIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciwgc3VjaCBhcyBMaW51eC9tNjhrOgotICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAnLSc6IG5hbWUgPSAnXycgKyBuYW1lWzE6XQogICAgICAgICBpZiBrdyBhbmQgY25mOiBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQogICAgICAgICBlbGlmIGt3OiBjbmYgPSBrdwogICAgICAgICBvcHRpb25zID0gKCkKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weSBiL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weQppbmRleCBkMjY4OGRiLi4xZTc1Y2FlIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9jb21tb25kaWFsb2cucHkKKysrIGIvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5CkBAIC0xNSwxMSArMTUsNiBAQAogICAgIGNvbW1hbmQgID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKm9wdGlvbnMpOgotCi0gICAgICAgICMgRklYTUU6IHNob3VsZCB0aGlzIGJlIHBsYWNlZCBvbiB0aGUgbW9kdWxlIGxldmVsIGluc3RlYWQ/Ci0gICAgICAgIGlmIFRrVmVyc2lvbiA8IDQuMjoKLSAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yKCJ0aGlzIG1vZHVsZSByZXF1aXJlcyBUayA0LjIgb3IgbmV3ZXIiKQotCiAgICAgICAgIHNlbGYubWFzdGVyICA9IG1hc3RlcgogICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCiAgICAgICAgIGlmIG5vdCBtYXN0ZXIgYW5kIG9wdGlvbnMuZ2V0KCdwYXJlbnQnKToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL2RpYWxvZy5weSBiL0xpYi90a2ludGVyL2RpYWxvZy5weQppbmRleCBiZTA4NWFiLi5mNjFjNWY3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9kaWFsb2cucHkKKysrIGIvTGliL3RraW50ZXIvZGlhbG9nLnB5CkBAIC0zLDEwICszLDcgQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgogZnJvbSB0a2ludGVyIGltcG9ydCBfY25mbWVyZ2UKIAotaWYgVGtWZXJzaW9uIDw9IDMuNjoKLSAgICBESUFMT0dfSUNPTiA9ICd3YXJuaW5nJwotZWxzZToKLSAgICBESUFMT0dfSUNPTiA9ICdxdWVzdGhlYWQnCitESUFMT0dfSUNPTiA9ICdxdWVzdGhlYWQnCiAKIAogY2xhc3MgRGlhbG9nKFdpZGdldCk6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkKaW5kZXggZGJlNWU4OC4uMzNkYzU0YSAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC9ydW50a3Rlc3RzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weQpAQCAtNyw4ICs3LDYgQEAKICIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKLWltcG9ydCB1bml0dGVzdAogaW1wb3J0IGltcG9ydGxpYgogaW1wb3J0IHRlc3Quc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkKaW5kZXggODVlZTJjNy4uOWRjMWUzNyAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9taXNjLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weQpAQCAtMTIsNiArMTIsMTQgQEAKICAgICAgICAgZiA9IHRraW50ZXIuRnJhbWUodCwgbmFtZT0nY2hpbGQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZiksICc8dGtpbnRlci5GcmFtZSBvYmplY3QgLnRvcC5jaGlsZD4nKQogCisgICAgZGVmIHRlc3RfZ2VuZXJhdGVkX25hbWVzKHNlbGYpOgorICAgICAgICB0ID0gdGtpbnRlci5Ub3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIGYgPSB0a2ludGVyLkZyYW1lKHQpCisgICAgICAgIGYyID0gdGtpbnRlci5GcmFtZSh0KQorICAgICAgICBiID0gdGtpbnRlci5CdXR0b24oZjIpCisgICAgICAgIGZvciBuYW1lIGluIHN0cihiKS5zcGxpdCgnLicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuYW1lLmlzaWRlbnRpZmllcigpLCBtc2c9cmVwcihuYW1lKSkKKwogICAgIGRlZiB0ZXN0X3RrX3NldFBhbGV0dGUoc2VsZik6CiAgICAgICAgIHJvb3QgPSBzZWxmLnJvb3QKICAgICAgICAgcm9vdC50a19zZXRQYWxldHRlKCdibGFjaycpCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3ZhcmlhYmxlcy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CmluZGV4IDFmNzQ0NTMuLjQ0ODU4MTcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5CkBAIC04Nyw3ICs4Nyw4IEBACiAgICAgICAgIHYuc2V0KCJ2YWx1ZSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2LnNpZGVfZWZmZWN0KQogCi0gICAgZGVmIHRlc3RfdHJhY2Uoc2VsZik6CisgICAgZGVmIHRlc3RfdHJhY2Vfb2xkKHNlbGYpOgorICAgICAgICAjIE9sZCBpbnRlcmZhY2UKICAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCkKICAgICAgICAgdm5hbWUgPSBzdHIodikKICAgICAgICAgdHJhY2UgPSBbXQpAQCAtMTM2LDYgKzEzNyw1NSBAQAogICAgICAgICBnYy5jb2xsZWN0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd1JyldKQogCisgICAgZGVmIHRlc3RfdHJhY2Uoc2VsZik6CisgICAgICAgIHYgPSBWYXJpYWJsZShzZWxmLnJvb3QpCisgICAgICAgIHZuYW1lID0gc3RyKHYpCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVmIHJlYWRfdHJhY2VyKCphcmdzKToKKyAgICAgICAgICAgIHRyYWNlLmFwcGVuZCgoJ3JlYWQnLCkgKyBhcmdzKQorICAgICAgICBkZWYgd3JpdGVfdHJhY2VyKCphcmdzKToKKyAgICAgICAgICAgIHRyYWNlLmFwcGVuZCgoJ3dyaXRlJywpICsgYXJncykKKyAgICAgICAgdHIxID0gdi50cmFjZV9hZGQoJ3JlYWQnLCByZWFkX3RyYWNlcikKKyAgICAgICAgdHIyID0gdi50cmFjZV9hZGQoWyd3cml0ZScsICd1bnNldCddLCB3cml0ZV90cmFjZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHYudHJhY2VfaW5mbygpKSwgWworICAgICAgICAgICAgICAgICAgICAgICAgICgoJ3JlYWQnLCksIHRyMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgnd3JpdGUnLCAndW5zZXQnKSwgdHIyKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFtdKQorCisgICAgICAgIHYuc2V0KCdzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd3cml0ZScpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIHYuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygncmVhZCcsIHZuYW1lLCAnJywgJ3JlYWQnKV0pCisKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICBpbmZvID0gc29ydGVkKHYudHJhY2VfaW5mbygpKQorICAgICAgICB2LnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB0cjEpICAjIFdyb25nIG1vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBpbmZvKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yKToKKyAgICAgICAgICAgIHYudHJhY2VfcmVtb3ZlKCdyZWFkJywgJ3NwYW0nKSAgIyBXcm9uZyBjb21tYW5kIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBpbmZvKQorICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFsoJ3JlYWQnLCB2bmFtZSwgJycsICdyZWFkJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgdi50cmFjZV9yZW1vdmUoJ3JlYWQnLCB0cjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi50cmFjZV9pbmZvKCksIFsoKCd3cml0ZScsICd1bnNldCcpLCB0cjIpXSkKKyAgICAgICAgdi5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGRlbCB3cml0ZV90cmFjZXIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHYuc2V0KCdlZ2dzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygnd3JpdGUnLCB2bmFtZSwgJycsICd3cml0ZScpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGRlbCB2CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3Vuc2V0JyldKQorCiAKIGNsYXNzIFRlc3RTdHJpbmdWYXIoVGVzdEJhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKaW5kZXggYzkyNGQ1NS4uODFiNTJlYSAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQpAQCAtOTEsOSArOTEsMTAgQEAKICAgICAgICAgd2lkZ2V0ID0gc2VsZi5jcmVhdGUoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldFsndXNlJ10sICcnKQogICAgICAgICBwYXJlbnQgPSBzZWxmLmNyZWF0ZShjb250YWluZXI9VHJ1ZSkKLSAgICAgICAgd2lkID0gcGFyZW50LndpbmZvX2lkKCkKLSAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKHVzZT13aWQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHdpZGdldDJbJ3VzZSddKSwgd2lkKQorICAgICAgICB3aWQgPSBoZXgocGFyZW50LndpbmZvX2lkKCkpCisgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHdpZD13aWQpOgorICAgICAgICAgICAgd2lkZ2V0MiA9IHNlbGYuY3JlYXRlKHVzZT13aWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdpZGdldDJbJ3VzZSddLCB3aWQpCiAKIAogQGFkZF9zdGFuZGFyZF9vcHRpb25zKFN0YW5kYXJkT3B0aW9uc1Rlc3RzKQpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKaW5kZXggYzY4YTY1MC4uYTFiN2NkZiAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQorKysgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CkBAIC0xLDYgKzEsNSBAQAogIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGtpbnRlcgogZnJvbSB0a2ludGVyIGltcG9ydCB0dGsKIAogY2xhc3MgTW9ja1RrQXBwOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCA4YmQyMmQwLi4yNjc2NmE4IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQorKysgYi9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQpAQCAtMTQ4Nyw2ICsxNDg3LDcgQEAKIAogCiAgICAgZGVmIHRlc3Rfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHYuc2VsZWN0aW9uLCAnc3BhbScpCiAgICAgICAgICMgaXRlbSAnbm9uZScgZG9lc24ndCBleGlzdAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0a2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNlbGVjdGlvbl9zZXQsICdub25lJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5zZWxlY3Rpb25fYWRkLCAnbm9uZScpCkBAIC0xNTAwLDI1ICsxNTAxLDMxIEBACiAgICAgICAgIGMzID0gc2VsZi50di5pbnNlcnQoaXRlbTEsICdlbmQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3NldCgoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGMxLCBpdGVtMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMiwpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKGMxLCBpdGVtMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGMyLCBpdGVtMikpCiAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZChpdGVtMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBjMiwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChpdGVtMSwgYzEsIGMyLCBpdGVtMikpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fcmVtb3ZlKChpdGVtMSwgYzMpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoaXRlbTEsIGMzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgYzIsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fcmVtb3ZlKGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQogCi0gICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgoYzEsIGMzKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKGMxLCBjMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywpKQogCiAgICAgICAgIHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgaWQ9J3dpdGggc3BhY2VzJykKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KCd3aXRoIHNwYWNlcycpCkBAIC0xNTM2LDYgKzE1NDMsNDAgQEAKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KGInYnl0ZXNceGUyXHg4Mlx4YWMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgnYnl0ZXNceGUyXHg4Mlx4YWMnLCkpCiAKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoKSkKKworICAgICAgICAjIE9sZCBpbnRlcmZhY2UKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoKGMxLCBpdGVtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKGl0ZW0xLCBjMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgoYzEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCA3KToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnRGVwcmVjYXRlZCBBUEkgb2YgVHJlZXZpZXcuc2VsZWN0aW9uKCkgc2hvdWxkIGJlIHJlbW92ZWQnKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdzZXQnLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbignYWRkJywgKGMxLCBpdGVtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdyZW1vdmUnLCAoaXRlbTEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbigndG9nZ2xlJywgKGMxLCBjMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCBpdGVtMikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZi50di5zZWxlY3Rpb24oTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxlY3Rpb24sIChjMywgaXRlbTIpKQogCiAgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnR2Wydjb2x1bW5zJ10gPSBbJ0EnLCAnQiddCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90aXgucHkgYi9MaWIvdGtpbnRlci90aXgucHkKaW5kZXggZjY2NzkzMy4uM2QzOGU1ZCAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGl4LnB5CisrKyBiL0xpYi90a2ludGVyL3RpeC5weQpAQCAtMjksMTAgKzI5LDYgQEAKIGZyb20gdGtpbnRlciBpbXBvcnQgKgogZnJvbSB0a2ludGVyIGltcG9ydCBfY25mbWVyZ2UsIF9kZWZhdWx0X3Jvb3QKIAotIyBXQVJOSU5HIC0gVGtWZXJzaW9uIGlzIGEgbGltaXRlZCBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyCi1pZiBUa1ZlcnNpb24gPCAzLjk5OToKLSAgICByYWlzZSBJbXBvcnRFcnJvcigiVGhpcyB2ZXJzaW9uIG9mIFRpeC5weSByZXF1aXJlcyBUayA0LjAgb3IgaGlnaGVyIikKLQogaW1wb3J0IF90a2ludGVyICMgSWYgdGhpcyBmYWlscyB5b3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrCiAKICMgU29tZSBtb3JlIGNvbnN0YW50cyAoZm9yIGNvbnNpc3RlbmN5IHdpdGggVGtpbnRlcikKQEAgLTExMTAsNyArMTEwNiw3IEBACiAKICAgICBkZWYgcGFnZXMoc2VsZik6CiAgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKLSAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhZ2VzJykpCiAgICAgICAgIHJldCA9IFtdCiAgICAgICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgICAgICAgcmV0LmFwcGVuZChzZWxmLnN1YndpZGdldCh4KSkKQEAgLTExNTYsNyArMTE1Miw3IEBACiAKICAgICBkZWYgcGFnZXMoc2VsZik6CiAgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKLSAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhZ2VzJykpCiAgICAgICAgIHJldCA9IFtdCiAgICAgICAgIGZvciB4IGluIG5hbWVzOgogICAgICAgICAgICAgcmV0LmFwcGVuZChzZWxmLnN1YndpZGdldCh4KSkKQEAgLTE1NzksOCArMTU3NSw3IEBACiAgICAgICAgICcnJ1JldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdob3NlIHN0YXR1cyBtYXRjaGVzIHN0YXR1cy4gSWYgc3RhdHVzIGlzCiAgICAgIG5vdCBzcGVjaWZpZWQsIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSAib24iIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkLgogICAgICBNb2RlIGNhbiBiZSBvbiwgb2ZmLCBkZWZhdWx0JycnCi0gICAgICAgIGMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0c2VsZWN0aW9uJywgbW9kZSkpCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChjKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRzZWxlY3Rpb24nLCBtb2RlKSkKIAogICAgIGRlZiBnZXRzdGF0dXMoc2VsZiwgZW50cnlwYXRoKToKICAgICAgICAgJycnUmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgZW50cnlQYXRoLicnJwpAQCAtMTkwMSw3ICsxODk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScsICdjb2x1bW4nLCBpbmRleCwKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScsICdjb2x1bW4nLCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoe30sIGt3KSkpCiAKICAgICBkZWYgc2l6ZV9yb3coc2VsZiwgaW5kZXgsICoqa3cpOgpAQCAtMTkyNiw3ICsxOTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCiAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCiAgICAgICAgICAgICAgICAgICAgIHNlbGYsICdzaXplJywgJ3JvdycsIGluZGV4LCAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKIAogICAgIGRlZiB1bnNldChzZWxmLCB4LCB5KToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3R0ay5weSBiL0xpYi90a2ludGVyL3R0ay5weQppbmRleCAwZTU3NTlkLi43MWFjMmE3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90dGsucHkKKysrIGIvTGliL3RraW50ZXIvdHRrLnB5CkBAIC0yOCw2ICsyOCw4IEBACiBpbXBvcnQgdGtpbnRlcgogZnJvbSB0a2ludGVyIGltcG9ydCBfZmxhdHRlbiwgX2pvaW4sIF9zdHJpbmdpZnksIF9zcGxpdGRpY3QKIAorX3NlbnRpbmVsID0gb2JqZWN0KCkKKwogIyBWZXJpZnkgaWYgVGsgaXMgbmV3IGVub3VnaCB0byBub3QgbmVlZCB0aGUgVGlsZSBwYWNrYWdlCiBfUkVRVUlSRV9USUxFID0gVHJ1ZSBpZiB0a2ludGVyLlRrVmVyc2lvbiA8IDguNSBlbHNlIEZhbHNlCiAKQEAgLTM4MSw3ICszODMsOSBAQAogICAgICAgICBhIHNlcXVlbmNlIGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24uIiIiCiAgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIGt3W3F1ZXJ5X29wdF0gPSBOb25lCi0gICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX25hbWUsICJjb25maWd1cmUiLCBzdHlsZSkKKyAgICAgICAgcmVzdWx0ID0gX3ZhbF9vcl9kaWN0KHNlbGYudGssIGt3LCBzZWxmLl9uYW1lLCAiY29uZmlndXJlIiwgc3R5bGUpCisgICAgICAgIGlmIHJlc3VsdCBvciBxdWVyeV9vcHQ6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAKIAogICAgIGRlZiBtYXAoc2VsZiwgc3R5bGUsIHF1ZXJ5X29wdD1Ob25lLCAqKmt3KToKQEAgLTQ2NiwxMiArNDcwLDE0IEBACiAKICAgICBkZWYgZWxlbWVudF9uYW1lcyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHRoZW1lLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikpCisgICAgICAgIHJldHVybiB0dXBsZShuLmxzdHJpcCgnLScpIGZvciBuIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikpKQogCiAKICAgICBkZWYgZWxlbWVudF9vcHRpb25zKHNlbGYsIGVsZW1lbnRuYW1lKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRuYW1lJ3Mgb3B0aW9ucy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpKQorICAgICAgICByZXR1cm4gdHVwbGUoby5sc3RyaXAoJy0nKSBmb3IgbyBpbiBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpKSkKIAogCiAgICAgZGVmIHRoZW1lX2NyZWF0ZShzZWxmLCB0aGVtZW5hbWUsIHBhcmVudD1Ob25lLCBzZXR0aW5ncz1Ob25lKToKQEAgLTEzOTAsMzEgKzEzOTYsNTMgQEAKICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZWUiLCBpdGVtKQogCiAKLSAgICBkZWYgc2VsZWN0aW9uKHNlbGYsIHNlbG9wPU5vbmUsIGl0ZW1zPU5vbmUpOgotICAgICAgICAiIiJJZiBzZWxvcCBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHNlbGVjdGVkIGl0ZW1zLiIiIgotICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zLCAoc3RyLCBieXRlcykpOgotICAgICAgICAgICAgaXRlbXMgPSAoaXRlbXMsKQorICAgIGRlZiBzZWxlY3Rpb24oc2VsZiwgc2Vsb3A9X3NlbnRpbmVsLCBpdGVtcz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgdHVwbGUgb2Ygc2VsZWN0ZWQgaXRlbXMuIiIiCisgICAgICAgIGlmIHNlbG9wIGlzIF9zZW50aW5lbDoKKyAgICAgICAgICAgIHNlbG9wID0gTm9uZQorICAgICAgICBlbGlmIHNlbG9wIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoZSBzZWxvcD1Ob25lIGFyZ3VtZW50IG9mIHNlbGVjdGlvbigpIGlzIGRlcHJlY2F0ZWQgIgorICAgICAgICAgICAgICAgICJhbmQgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjciLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMykKKyAgICAgICAgZWxpZiBzZWxvcCBpbiAoJ3NldCcsICdhZGQnLCAncmVtb3ZlJywgJ3RvZ2dsZScpOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJUaGUgc2Vsb3AgYXJndW1lbnQgb2Ygc2VsZWN0aW9uKCkgaXMgZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgImFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNywgIgorICAgICAgICAgICAgICAgICJ1c2Ugc2VsZWN0aW9uXyVzKCkgaW5zdGVhZCIgJSAoc2Vsb3AsKSwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdGlvbicpCiAgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlbGVjdGlvbiIsIHNlbG9wLCBpdGVtcykpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiaXRlbXMgYmVjb21lcyB0aGUgbmV3IHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInNldCIsIGl0ZW1zKQorICAgIGRlZiBfc2VsZWN0aW9uKHNlbGYsIHNlbG9wLCBpdGVtcyk6CisgICAgICAgIGlmIGxlbihpdGVtcykgPT0gMSBhbmQgaXNpbnN0YW5jZShpdGVtc1swXSwgKHR1cGxlLCBsaXN0KSk6CisgICAgICAgICAgICBpdGVtcyA9IGl0ZW1zWzBdCisKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZWxlY3Rpb24iLCBzZWxvcCwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fYWRkKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIHRoZSBzZWxlY3Rpb24uIiIiCi0gICAgICAgIHNlbGYuc2VsZWN0aW9uKCJhZGQiLCBpdGVtcykKKyAgICBkZWYgc2VsZWN0aW9uX3NldChzZWxmLCAqaXRlbXMpOgorICAgICAgICAiIiJUaGUgc3BlY2lmaWVkIGl0ZW1zIGJlY29tZXMgdGhlIG5ldyBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigic2V0IiwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fcmVtb3ZlKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gdGhlIHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInJlbW92ZSIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fYWRkKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIkFkZCBhbGwgb2YgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc2VsZWN0aW9uLiIiIgorICAgICAgICBzZWxmLl9zZWxlY3Rpb24oImFkZCIsIGl0ZW1zKQogCiAKLSAgICBkZWYgc2VsZWN0aW9uX3RvZ2dsZShzZWxmLCBpdGVtcyk6Ci0gICAgICAgICIiIlRvZ2dsZSB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggaXRlbSBpbiBpdGVtcy4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oInRvZ2dsZSIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fcmVtb3ZlKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlJlbW92ZSBhbGwgb2YgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigicmVtb3ZlIiwgaXRlbXMpCisKKworICAgIGRlZiBzZWxlY3Rpb25fdG9nZ2xlKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlRvZ2dsZSB0aGUgc2VsZWN0aW9uIHN0YXRlIG9mIGVhY2ggc3BlY2lmaWVkIGl0ZW0uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigidG9nZ2xlIiwgaXRlbXMpCiAKIAogICAgIGRlZiBzZXQoc2VsZiwgaXRlbSwgY29sdW1uPU5vbmUsIHZhbHVlPU5vbmUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rva2VuaXplLnB5IGIvTGliL3Rva2VuaXplLnB5CmluZGV4IGIxZDBjODMuLmVjNzllYzggMTAwNjQ0Ci0tLSBhL0xpYi90b2tlbml6ZS5weQorKysgYi9MaWIvdG9rZW5pemUucHkKQEAgLTI5LDYgKzI5LDcgQEAKIGltcG9ydCBjb2xsZWN0aW9ucwogZnJvbSBpbyBpbXBvcnQgVGV4dElPV3JhcHBlcgogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCitpbXBvcnQgaXRlcnRvb2xzIGFzIF9pdGVydG9vbHMKIGltcG9ydCByZQogaW1wb3J0IHN5cwogZnJvbSB0b2tlbiBpbXBvcnQgKgpAQCAtMTMxLDcgKzEzMiwyOCBAQAogSW1hZ251bWJlciA9IGdyb3VwKHInWzAtOV0rW2pKXScsIEZsb2F0bnVtYmVyICsgcidbakpdJykKIE51bWJlciA9IGdyb3VwKEltYWdudW1iZXIsIEZsb2F0bnVtYmVyLCBJbnRudW1iZXIpCiAKLVN0cmluZ1ByZWZpeCA9IHInKD86W2JCXVtyUl0/fFtyUl1bYkJdP3xbdVVdKT8nCisjIFJldHVybiB0aGUgZW1wdHkgc3RyaW5nLCBwbHVzIGFsbCBvZiB0aGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLgorZGVmIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgIyBUaGUgdmFsaWQgc3RyaW5nIHByZWZpeGVzLiBPbmx5IGNvbnRhaW4gdGhlIGxvd2VyIGNhc2UgdmVyc2lvbnMsCisgICAgIyAgYW5kIGRvbid0IGNvbnRhaW4gYW55IHBlcm11YXRpb25zIChpbmNsdWRlICdmcicsIGJ1dCBub3QKKyAgICAjICAncmYnKS4gVGhlIHZhcmlvdXMgcGVybXV0YXRpb25zIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgIF92YWxpZF9zdHJpbmdfcHJlZml4ZXMgPSBbJ2InLCAncicsICd1JywgJ2YnLCAnYnInLCAnZnInXQorICAgICMgaWYgd2UgYWRkIGJpbmFyeSBmLXN0cmluZ3MsIGFkZDogWydmYicsICdmYnInXQorICAgIHJlc3VsdCA9IHNldChbJyddKQorICAgIGZvciBwcmVmaXggaW4gX3ZhbGlkX3N0cmluZ19wcmVmaXhlczoKKyAgICAgICAgZm9yIHQgaW4gX2l0ZXJ0b29scy5wZXJtdXRhdGlvbnMocHJlZml4KToKKyAgICAgICAgICAgICMgY3JlYXRlIGEgbGlzdCB3aXRoIHVwcGVyIGFuZCBsb3dlciB2ZXJzaW9ucyBvZiBlYWNoCisgICAgICAgICAgICAjICBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGZvciB1IGluIF9pdGVydG9vbHMucHJvZHVjdCgqWyhjLCBjLnVwcGVyKCkpIGZvciBjIGluIHRdKToKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKCcnLmpvaW4odSkpCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgX2NvbXBpbGUoZXhwcik6CisgICAgcmV0dXJuIHJlLmNvbXBpbGUoZXhwciwgcmUuVU5JQ09ERSkKKworIyBOb3RlIHRoYXQgc2luY2UgX2FsbF9zdHJpbmdfcHJlZml4ZXMgaW5jbHVkZXMgdGhlIGVtcHR5IHN0cmluZywKKyMgIFN0cmluZ1ByZWZpeCBjYW4gYmUgdGhlIGVtcHR5IHN0cmluZyAobWFraW5nIGl0IG9wdGlvbmFsKS4KK1N0cmluZ1ByZWZpeCA9IGdyb3VwKCpfYWxsX3N0cmluZ19wcmVmaXhlcygpKQogCiAjIFRhaWwgZW5kIG9mICcgc3RyaW5nLgogU2luZ2xlID0gciJbXidcXF0qKD86XFwuW14nXFxdKikqJyIKQEAgLTE2OSw1MCArMTkxLDI1IEBACiBQc2V1ZG9FeHRyYXMgPSBncm91cChyJ1xcXHI/XG58XFonLCBDb21tZW50LCBUcmlwbGUpCiBQc2V1ZG9Ub2tlbiA9IFdoaXRlc3BhY2UgKyBncm91cChQc2V1ZG9FeHRyYXMsIE51bWJlciwgRnVubnksIENvbnRTdHIsIE5hbWUpCiAKLWRlZiBfY29tcGlsZShleHByKToKLSAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorIyBGb3IgYSBnaXZlbiBzdHJpbmcgcHJlZml4IHBsdXMgcXVvdGVzLCBlbmRwYXRzIG1hcHMgaXQgdG8gYSByZWdleAorIyAgdG8gbWF0Y2ggdGhlIHJlbWFpbmRlciBvZiB0aGF0IHN0cmluZy4gX3ByZWZpeCBjYW4gYmUgZW1wdHksIGZvcgorIyAgYSBub3JtYWwgc2luZ2xlIG9yIHRyaXBsZSBxdW90ZWQgc3RyaW5nICh3aXRoIG5vIHByZWZpeCkuCitlbmRwYXRzID0ge30KK2ZvciBfcHJlZml4IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZW5kcGF0c1tfcHJlZml4ICsgIiciXSA9IFNpbmdsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICciJ10gPSBEb3VibGUKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJycnIl0gPSBTaW5nbGUzCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyIiIiddID0gRG91YmxlMwogCi1lbmRwYXRzID0geyInIjogU2luZ2xlLCAnIic6IERvdWJsZSwKLSAgICAgICAgICAgIicnJyI6IFNpbmdsZTMsICciIiInOiBEb3VibGUzLAotICAgICAgICAgICAicicnJyI6IFNpbmdsZTMsICdyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImInJyciOiBTaW5nbGUzLCAnYiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJSJycnIjogU2luZ2xlMywgJ1IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQicnJyI6IFNpbmdsZTMsICdCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJyJycnIjogU2luZ2xlMywgJ2JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgImJSJycnIjogU2luZ2xlMywgJ2JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJyJycnIjogU2luZ2xlMywgJ0JyIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIkJSJycnIjogU2luZ2xlMywgJ0JSIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJiJycnIjogU2luZ2xlMywgJ3JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJiJycnIjogU2luZ2xlMywgJ1JiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInJCJycnIjogU2luZ2xlMywgJ3JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlJCJycnIjogU2luZ2xlMywgJ1JCIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgInUnJyciOiBTaW5nbGUzLCAndSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJVJycnIjogU2luZ2xlMywgJ1UiIiInOiBEb3VibGUzLAotICAgICAgICAgICAncic6IE5vbmUsICdSJzogTm9uZSwgJ2InOiBOb25lLCAnQic6IE5vbmUsCi0gICAgICAgICAgICd1JzogTm9uZSwgJ1UnOiBOb25lfQotCi10cmlwbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJycnIiwgJyIiIicsCi0gICAgICAgICAgInInJyciLCAnciIiIicsICJSJycnIiwgJ1IiIiInLAotICAgICAgICAgICJiJycnIiwgJ2IiIiInLCAiQicnJyIsICdCIiIiJywKLSAgICAgICAgICAiYnInJyciLCAnYnIiIiInLCAiQnInJyciLCAnQnIiIiInLAotICAgICAgICAgICJiUicnJyIsICdiUiIiIicsICJCUicnJyIsICdCUiIiIicsCi0gICAgICAgICAgInJiJycnIiwgJ3JiIiIiJywgInJCJycnIiwgJ3JCIiIiJywKLSAgICAgICAgICAiUmInJyciLCAnUmIiIiInLCAiUkInJyciLCAnUkIiIiInLAotICAgICAgICAgICJ1JycnIiwgJ3UiIiInLCAiVScnJyIsICdVIiIiJywKLSAgICAgICAgICApOgotICAgIHRyaXBsZV9xdW90ZWRbdF0gPSB0Ci1zaW5nbGVfcXVvdGVkID0ge30KLWZvciB0IGluICgiJyIsICciJywKLSAgICAgICAgICAiciciLCAnciInLCAiUiciLCAnUiInLAotICAgICAgICAgICJiJyIsICdiIicsICJCJyIsICdCIicsCi0gICAgICAgICAgImJyJyIsICdiciInLCAiQnInIiwgJ0JyIicsCi0gICAgICAgICAgImJSJyIsICdiUiInLCAiQlInIiwgJ0JSIicgLAotICAgICAgICAgICJyYiciLCAncmIiJywgInJCJyIsICdyQiInLAotICAgICAgICAgICJSYiciLCAnUmIiJywgIlJCJyIsICdSQiInICwKLSAgICAgICAgICAidSciLCAndSInLCAiVSciLCAnVSInLAotICAgICAgICAgICk6Ci0gICAgc2luZ2xlX3F1b3RlZFt0XSA9IHQKKyMgQSBzZXQgb2YgYWxsIG9mIHRoZSBzaW5nbGUgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5nIHByZWZpeGVzLAorIyAgaW5jbHVkaW5nIHRoZSBvcGVuaW5nIHF1b3Rlcy4KK3NpbmdsZV9xdW90ZWQgPSBzZXQoKQordHJpcGxlX3F1b3RlZCA9IHNldCgpCitmb3IgdCBpbiBfYWxsX3N0cmluZ19wcmVmaXhlcygpOgorICAgIGZvciB1IGluICh0ICsgJyInLCB0ICsgIiciKToKKyAgICAgICAgc2luZ2xlX3F1b3RlZC5hZGQodSkKKyAgICBmb3IgdSBpbiAodCArICciIiInLCB0ICsgIicnJyIpOgorICAgICAgICB0cmlwbGVfcXVvdGVkLmFkZCh1KQogCiB0YWJzaXplID0gOAogCkBAIC02MjYsNiArNjIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0YXNoZWQKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXNoZWQgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhDT01NRU5ULCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gaW4gdHJpcGxlX3F1b3RlZDoKICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbdG9rZW5dKQogICAgICAgICAgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSwgcG9zKQpAQCAtNjM4LDE5ICs2MzYsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBsaW5lW3N0YXJ0Ol0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvciBcCi0gICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQ6CisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHVwIHRvIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZSB0b2tlbiB0byBzZWUgaWYKKyAgICAgICAgICAgICAgICAjICB0aGV5J3JlIGluIHRoZSBzaW5nbGVfcXVvdGVkIHNldC4gSWYgc28sIHRoZXkgc3RhcnQKKyAgICAgICAgICAgICAgICAjICBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAjIFdlJ3JlIHVzaW5nIHRoZSBmaXJzdCAzLCBiZWNhdXNlIHdlJ3JlIGxvb2tpbmcgZm9yCisgICAgICAgICAgICAgICAgIyAgInJiJyIgKGZvciBleGFtcGxlKSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRva2VuLiBJZgorICAgICAgICAgICAgICAgICMgIHdlIHN3aXRjaCB0byBsb25nZXIgcHJlZml4ZXMsIHRoaXMgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgICAgICAjICBhZGp1c3RlZC4KKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCBpbml0aWFsID09IHRva2VuWzoxXS4KKyAgICAgICAgICAgICAgICAjIEFsc28gbm90ZSB0aGF0IHNpbmdsZSBxdW90ZSBjaGVja2luZyBtdXN0IGNvbWUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAjICB0cmlwbGUgcXVvdGUgY2hlY2tpbmcgKGFib3ZlKS4KKyAgICAgICAgICAgICAgICBlbGlmIChpbml0aWFsIGluIHNpbmdsZV9xdW90ZWQgb3IKKyAgICAgICAgICAgICAgICAgICAgICB0b2tlbls6Ml0gaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzozXSBpbiBzaW5nbGVfcXVvdGVkKToKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bLTFdID09ICdcbic6ICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCA9IChsbnVtLCBzdGFydCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzW2luaXRpYWxdIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0c1t0b2tlblsxXV0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzJdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQWdhaW4sIHVzaW5nIHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgdG9rZW4uIFRoaXMgaXMgbG9va2luZyBmb3IgdGhlIG1hdGNoaW5nIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgIyAgcmVnZXggZm9yIHRoZSBjb3JyZWN0IHR5cGUgb2YgcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGNoYXJhY3Rlci4gU28gaXQncyByZWFsbHkgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgIGVuZHBhdHNbIiciXSBvciBlbmRwYXRzWyciJ10sIGJ5IHRyeWluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgIyAgc2tpcCBzdHJpbmcgcHJlZml4IGNoYXJhY3RlcnMsIGlmIGFueS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBfY29tcGlsZShlbmRwYXRzLmdldChpbml0aWFsKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzFdKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHMuZ2V0KHRva2VuWzJdKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gbGluZVtzdGFydDpdLCAxCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JkaW5hcnkgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBUb2tlbkluZm8oU1RSSU5HLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKwogICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbC5pc2lkZW50aWZpZXIoKTogICAgICAgICAgICAgICAjIG9yZGluYXJ5IG5hbWUKICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4gaW4gKCdhc3luYycsICdhd2FpdCcpOgogICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXN5bmNfZGVmOgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlLnB5IGIvTGliL3RyYWNlLnB5CmluZGV4IGYxMDgyNjYuLmFlMTU0NjEgMTAwNzU1Ci0tLSBhL0xpYi90cmFjZS5weQorKysgYi9MaWIvdHJhY2UucHkKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBjb3ZlcmRpcj0iL3RtcCIpCiAiIiIKIF9fYWxsX18gPSBbJ1RyYWNlJywgJ0NvdmVyYWdlUmVzdWx0cyddCitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBsaW5lY2FjaGUKIGltcG9ydCBvcwogaW1wb3J0IHJlCkBAIC01OCw3ICs1OSw2IEBACiBpbXBvcnQgZ2MKIGltcG9ydCBkaXMKIGltcG9ydCBwaWNrbGUKLWZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4gYXMgX3dhcm4KIGZyb20gdGltZSBpbXBvcnQgbW9ub3RvbmljIGFzIF90aW1lCiAKIHRyeToKQEAgLTc3LDUxICs3Nyw2IEBACiAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQogICAgICAgICB0aHJlYWRpbmcuc2V0dHJhY2UoTm9uZSkKIAotZGVmIF91c2FnZShvdXRmaWxlKToKLSAgICBvdXRmaWxlLndyaXRlKCIiIlVzYWdlOiAlcyBbT1BUSU9OU10gPGZpbGU+IFtBUkdTXQotCi1NZXRhLW9wdGlvbnM6Ci0tLWhlbHAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgdGhlbiBleGl0LgotLS12ZXJzaW9uICAgICAgICAgICAgIE91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIHRoZW4gZXhpdC4KLQotT3RoZXJ3aXNlLCBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIG9wdGlvbnMgbXVzdCBiZSBnaXZlbjoKLS10LCAtLXRyYWNlICAgICAgICAgICBQcmludCBlYWNoIGxpbmUgdG8gc3lzLnN0ZG91dCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0tYywgLS1jb3VudCAgICAgICAgICAgQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgdGhlIGNvdW50cyB0byA8bW9kdWxlPi5jb3ZlciBmb3IgZWFjaAotICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBleGVjdXRlZCwgaW4gdGhlIG1vZHVsZSdzIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyBgLS1jb3ZlcmRpcicsIGAtLWZpbGUnLCBgLS1uby1yZXBvcnQnIGJlbG93LgotLWwsIC0tbGlzdGZ1bmNzICAgICAgIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBhdCBsZWFzdAotICAgICAgICAgICAgICAgICAgICAgIG9uY2UgYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIHN5cy5zdGRvdXQgYWZ0ZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy4KLS1ULCAtLXRyYWNrY2FsbHMgICAgICBLZWVwIHRyYWNrIG9mIGNhbGxlci9jYWxsZWQgcGFpcnMgYW5kIHdyaXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4KLS1yLCAtLXJlcG9ydCAgICAgICAgICBHZW5lcmF0ZSBhIHJlcG9ydCBmcm9tIGEgY291bnRzIGZpbGU7IGRvIG5vdCBleGVjdXRlCi0gICAgICAgICAgICAgICAgICAgICAgYW55IGNvZGUuICBgLS1maWxlJyBtdXN0IHNwZWNpZnkgdGhlIHJlc3VsdHMgZmlsZSB0bwotICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIHdoaWNoIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4KLSAgICAgICAgICAgICAgICAgICAgICB3aXRoIGAtLWNvdW50IC0tZmlsZT1GSUxFJy4KLQotTW9kaWZpZXJzOgotLWYsIC0tZmlsZT08ZmlsZT4gICAgIEZpbGUgdG8gYWNjdW11bGF0ZSBjb3VudHMgb3ZlciBzZXZlcmFsIHJ1bnMuCi0tUiwgLS1uby1yZXBvcnQgICAgICAgRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuCi0gICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY3VtdWxhdGUgb3ZlciBzZXZlcmFsIHJ1bnMuCi0tQywgLS1jb3ZlcmRpcj08ZGlyPiAgRGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgZmlsZXMuICBUaGUgY292ZXJhZ2UKLSAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgZm9yIDxwYWNrYWdlPi48bW9kdWxlPiBpcyB3cml0dGVuIHRvIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICA8ZGlyPi88cGFja2FnZT4vPG1vZHVsZT4uY292ZXIuCi0tbSwgLS1taXNzaW5nICAgICAgICAgQW5ub3RhdGUgZXhlY3V0YWJsZSBsaW5lcyB0aGF0IHdlcmUgbm90IGV4ZWN1dGVkCi0gICAgICAgICAgICAgICAgICAgICAgd2l0aCAnPj4+Pj4+ICcuCi0tcywgLS1zdW1tYXJ5ICAgICAgICAgV3JpdGUgYSBicmllZiBzdW1tYXJ5IG9uIHN0ZG91dCBmb3IgZWFjaCBmaWxlLgotICAgICAgICAgICAgICAgICAgICAgIChDYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydC4pCi0tZywgLS10aW1pbmcgICAgICAgICAgUHJlZml4IGVhY2ggbGluZSB3aXRoIHRoZSB0aW1lIHNpbmNlIHRoZSBwcm9ncmFtIHN0YXJ0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIHdoaWxlIHRyYWNpbmcuCi0KLUZpbHRlcnMsIG1heSBiZSByZXBlYXRlZCBtdWx0aXBsZSB0aW1lczoKLS0taWdub3JlLW1vZHVsZT08bW9kPiBJZ25vcmUgdGhlIGdpdmVuIG1vZHVsZShzKSBhbmQgaXRzIHN1Ym1vZHVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAoaWYgaXQgaXMgYSBwYWNrYWdlKS4gIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgbGlzdCBvZiBtb2R1bGUgbmFtZXMKLS0taWdub3JlLWRpcj08ZGlyPiAgICBJZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAobXVsdGlwbGUKLSAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjYW4gYmUgam9pbmVkIGJ5IG9zLnBhdGhzZXApLgotIiIiICUgc3lzLmFyZ3ZbMF0pCi0KIFBSQUdNQV9OT0NPVkVSID0gIiNwcmFnbWEgTk8gQ09WRVIiCiAKICMgU2ltcGxlIHJ4IHRvIGZpbmQgbGluZXMgd2l0aCBubyBjb2RlLgpAQCAtMjY1LDcgKzIyMCwxMyBAQAogCiAgICAgZGVmIHdyaXRlX3Jlc3VsdHMoc2VsZiwgc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9RmFsc2UsIGNvdmVyZGlyPU5vbmUpOgogICAgICAgICAiIiIKLSAgICAgICAgQHBhcmFtIGNvdmVyZGlyCisgICAgICAgIFdyaXRlIHRoZSBjb3ZlcmFnZSByZXN1bHRzLgorCisgICAgICAgIDpwYXJhbSBzaG93X21pc3Npbmc6IFNob3cgbGluZXMgdGhhdCBoYWQgbm8gaGl0cy4KKyAgICAgICAgOnBhcmFtIHN1bW1hcnk6IEluY2x1ZGUgY292ZXJhZ2Ugc3VtbWFyeSBwZXIgbW9kdWxlLgorICAgICAgICA6cGFyYW0gY292ZXJkaXI6IElmIE5vbmUsIHRoZSByZXN1bHRzIG9mIGVhY2ggbW9kdWxlIGFyZSBwbGFjZWQgaW4gaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIHNlbGYuY2FsbGVkZnVuY3M6CiAgICAgICAgICAgICBwcmludCgpCkBAIC02NDcsMjEwICs2MDgsMTM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkZnVuY3M9c2VsZi5fY2FsbGVkZnVuY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycz1zZWxmLl9jYWxsZXJzKQogCi1kZWYgX2Vycl9leGl0KG1zZyk6Ci0gICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQotICAgIHN5cy5leGl0KDEpCitkZWYgbWFpbigpOgogCi1kZWYgbWFpbihhcmd2PU5vbmUpOgotICAgIGltcG9ydCBnZXRvcHQKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJzaW9uJywgYWN0aW9uPSd2ZXJzaW9uJywgdmVyc2lvbj0ndHJhY2UgMi4wJykKIAotICAgIGlmIGFyZ3YgaXMgTm9uZToKLSAgICAgICAgYXJndiA9IHN5cy5hcmd2CisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTWFpbiBvcHRpb25zJywKKyAgICAgICAgICAgICdPbmUgb2YgdGhlc2UgKG9yIC0tcmVwb3J0KSBtdXN0IGJlIGdpdmVuJykKKworICAgIGdycC5hZGRfYXJndW1lbnQoJy1jJywgJy0tY291bnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQgYW5kIHdyaXRlICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBjb3VudHMgdG8gPG1vZHVsZT4uY292ZXIgZm9yIGVhY2ggbW9kdWxlIGV4ZWN1dGVkLCBpbiAnCisgICAgICAgICAgICAgICAgICd0aGUgbW9kdWxlXCdzIGRpcmVjdG9yeS4gU2VlIGFsc28gLS1jb3ZlcmRpciwgLS1maWxlLCAnCisgICAgICAgICAgICAgICAgICctLW5vLXJlcG9ydCBiZWxvdy4nKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy10JywgJy0tdHJhY2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nUHJpbnQgZWFjaCBsaW5lIHRvIHN5cy5zdGRvdXQgYmVmb3JlIGl0IGlzIGV4ZWN1dGVkJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctbCcsICctLWxpc3RmdW5jcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdLZWVwIHRyYWNrIG9mIHdoaWNoIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQgYXQgbGVhc3Qgb25jZSAnCisgICAgICAgICAgICAgICAgICdhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4gJworICAgICAgICAgICAgICAgICAnQ2Fubm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgLS10cmFjZSBvciAtLWNvdW50LicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLVQnLCAnLS10cmFja2NhbGxzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0tlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gJworICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4nKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnTW9kaWZpZXJzJykKKworICAgIF9ncnAgPSBncnAuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgX2dycC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmVwb3J0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0dlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG9lcyBub3QgZXhlY3V0ZSBhbnkgJworICAgICAgICAgICAgICAgICAnY29kZS4gLS1maWxlIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvIHJlYWQsIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ211c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4gd2l0aCAtLWNvdW50ICcKKyAgICAgICAgICAgICAgICAgJy0tZmlsZT1GSUxFJykKKyAgICBfZ3JwLmFkZF9hcmd1bWVudCgnLVInLCAnLS1uby1yZXBvcnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuICcKKyAgICAgICAgICAgICAgICAgJ1VzZWZ1bCBpZiB5b3Ugd2FudCB0byBhY2N1bXVsYXRlIG92ZXIgc2V2ZXJhbCBydW5zLicpCisKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZicsICctLWZpbGUnLAorICAgICAgICAgICAgaGVscD0nRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLUMnLCAnLS1jb3ZlcmRpcicsCisgICAgICAgICAgICBoZWxwPSdEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcyBnby4gVGhlIGNvdmVyYWdlIHJlcG9ydCAnCisgICAgICAgICAgICAgICAgICdmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IHdpbGwgYmUgd3JpdHRlbiB0byBmaWxlICcKKyAgICAgICAgICAgICAgICAgJzxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3ZlcicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1taXNzaW5nJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0Fubm90YXRlIGV4ZWN1dGFibGUgbGluZXMgdGhhdCB3ZXJlIG5vdCBleGVjdXRlZCB3aXRoICcKKyAgICAgICAgICAgICAgICAgJyI+Pj4+Pj4gIicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zdW1tYXJ5JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J1dyaXRlIGEgYnJpZWYgc3VtbWFyeSBmb3IgZWFjaCBmaWxlIHRvIHN5cy5zdGRvdXQuICcKKyAgICAgICAgICAgICAgICAgJ0NhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0JykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctZycsICctLXRpbWluZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4gJworICAgICAgICAgICAgICAgICAnT25seSB1c2VkIHdoaWxlIHRyYWNpbmcnKQorCisgICAgZ3JwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnRmlsdGVycycsCisgICAgICAgICAgICAnQ2FuIGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcycpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtbW9kdWxlJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIHRoZSBnaXZlbiBtb2R1bGUocykgYW5kIGl0cyBzdWJtb2R1bGVzJworICAgICAgICAgICAgICAgICAnKGlmIGl0IGlzIGEgcGFja2FnZSkuIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgJworICAgICAgICAgICAgICAgICAnbW9kdWxlIG5hbWVzLicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLS1pZ25vcmUtZGlyJywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgaGVscD0nSWdub3JlIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkgJworICAgICAgICAgICAgICAgICAnKG11bHRpcGxlIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGVuYW1lJywgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgaGVscD0nZmlsZSB0byBydW4gYXMgbWFpbiBwcm9ncmFtJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhcmd1bWVudHMnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgdG8gdGhlIHByb2dyYW0nKQorCisgICAgb3B0cyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdHMuaWdub3JlX2RpcjoKKyAgICAgICAgcmVsX3BhdGggPSAnbGliJywgJ3B5dGhvbnswLm1ham9yfS57MC5taW5vcn0nLmZvcm1hdChzeXMudmVyc2lvbl9pbmZvKQorICAgICAgICBfcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgKnJlbF9wYXRoKQorICAgICAgICBfZXhlY19wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfZXhlY19wcmVmaXgsICpyZWxfcGF0aCkKKworICAgIGRlZiBwYXJzZV9pZ25vcmVfZGlyKHMpOgorICAgICAgICBzID0gb3MucGF0aC5leHBhbmR1c2VyKG9zLnBhdGguZXhwYW5kdmFycyhzKSkKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnJHByZWZpeCcsIF9wcmVmaXgpLnJlcGxhY2UoJyRleGVjX3ByZWZpeCcsIF9leGVjX3ByZWZpeCkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgocykKKworICAgIG9wdHMuaWdub3JlX21vZHVsZSA9IFttb2Quc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBvcHRzLmlnbm9yZV9tb2R1bGUgZm9yIG1vZCBpbiBpLnNwbGl0KCcsJyldCisgICAgb3B0cy5pZ25vcmVfZGlyID0gW3BhcnNlX2lnbm9yZV9kaXIocykKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gb3B0cy5pZ25vcmVfZGlyIGZvciBzIGluIGkuc3BsaXQob3MucGF0aHNlcCldCisKKyAgICBpZiBvcHRzLnJlcG9ydDoKKyAgICAgICAgaWYgbm90IG9wdHMuZmlsZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcignLXIvLS1yZXBvcnQgcmVxdWlyZXMgLWYvLS1maWxlJykKKyAgICAgICAgcmVzdWx0cyA9IENvdmVyYWdlUmVzdWx0cyhpbmZpbGU9b3B0cy5maWxlLCBvdXRmaWxlPW9wdHMuZmlsZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhvcHRzLm1pc3NpbmcsIG9wdHMuc3VtbWFyeSwgb3B0cy5jb3ZlcmRpcikKKworICAgIGlmIG5vdCBhbnkoW29wdHMudHJhY2UsIG9wdHMuY291bnQsIG9wdHMubGlzdGZ1bmNzLCBvcHRzLnRyYWNrY2FsbHNdKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCdtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAnCisgICAgICAgICAgICAgICAgICAgICAnLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscycpCisKKyAgICBpZiBvcHRzLmxpc3RmdW5jcyBhbmQgKG9wdHMuY291bnQgb3Igb3B0cy50cmFjZSk6CisgICAgICAgIHBhcnNlci5lcnJvcignY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCknKQorCisgICAgaWYgb3B0cy5zdW1tYXJ5IGFuZCBub3Qgb3B0cy5jb3VudDoKKyAgICAgICAgcGFyc2VyLmVycm9yKCctLXN1bW1hcnkgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnKQorCisgICAgaWYgb3B0cy5maWxlbmFtZSBpcyBOb25lOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ2ZpbGVuYW1lIGlzIG1pc3Npbmc6IHJlcXVpcmVkIHdpdGggdGhlIG1haW4gb3B0aW9ucycpCisKKyAgICBzeXMuYXJndiA9IG9wdHMuZmlsZW5hbWUsICpvcHRzLmFyZ3VtZW50cworICAgIHN5cy5wYXRoWzBdID0gb3MucGF0aC5kaXJuYW1lKG9wdHMuZmlsZW5hbWUpCisKKyAgICB0ID0gVHJhY2Uob3B0cy5jb3VudCwgb3B0cy50cmFjZSwgY291bnRmdW5jcz1vcHRzLmxpc3RmdW5jcywKKyAgICAgICAgICAgICAgY291bnRjYWxsZXJzPW9wdHMudHJhY2tjYWxscywgaWdub3JlbW9kcz1vcHRzLmlnbm9yZV9tb2R1bGUsCisgICAgICAgICAgICAgIGlnbm9yZWRpcnM9b3B0cy5pZ25vcmVfZGlyLCBpbmZpbGU9b3B0cy5maWxlLAorICAgICAgICAgICAgICBvdXRmaWxlPW9wdHMuZmlsZSwgdGltaW5nPW9wdHMudGltaW5nKQogICAgIHRyeToKLSAgICAgICAgb3B0cywgcHJvZ19hcmd2ID0gZ2V0b3B0LmdldG9wdChhcmd2WzE6XSwgInRjclJmOmQ6bXNDOmxUZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJoZWxwIiwgInZlcnNpb24iLCAidHJhY2UiLCAiY291bnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwb3J0IiwgIm5vLXJlcG9ydCIsICJzdW1tYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGU9IiwgIm1pc3NpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlLW1vZHVsZT0iLCAiaWdub3JlLWRpcj0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY292ZXJkaXI9IiwgImxpc3RmdW5jcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFja2NhbGxzIiwgInRpbWluZyJdKQorICAgICAgICB3aXRoIG9wZW4ob3B0cy5maWxlbmFtZSkgYXMgZnA6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIG9wdHMuZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgIyB0cnkgdG8gZW11bGF0ZSBfX21haW5fXyBuYW1lc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICdfX2ZpbGVfXyc6IG9wdHMuZmlsZW5hbWUsCisgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAorICAgICAgICAgICAgJ19fcGFja2FnZV9fJzogTm9uZSwKKyAgICAgICAgICAgICdfX2NhY2hlZF9fJzogTm9uZSwKKyAgICAgICAgfQorICAgICAgICB0LnJ1bmN0eChjb2RlLCBnbG9icywgZ2xvYnMpCisgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICBzeXMuZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcwogCi0gICAgZXhjZXB0IGdldG9wdC5lcnJvciBhcyBtc2c6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlc1xuIiAlIChzeXMuYXJndlswXSwgbXNnKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVHJ5IGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSBzeXMuYXJndlswXSkKLSAgICAgICAgc3lzLmV4aXQoMSkKKyAgICByZXN1bHRzID0gdC5yZXN1bHRzKCkKIAotICAgIHRyYWNlID0gMAotICAgIGNvdW50ID0gMAotICAgIHJlcG9ydCA9IDAKLSAgICBub19yZXBvcnQgPSAwCi0gICAgY291bnRzX2ZpbGUgPSBOb25lCi0gICAgbWlzc2luZyA9IDAKLSAgICBpZ25vcmVfbW9kdWxlcyA9IFtdCi0gICAgaWdub3JlX2RpcnMgPSBbXQotICAgIGNvdmVyZGlyID0gTm9uZQotICAgIHN1bW1hcnkgPSAwCi0gICAgbGlzdGZ1bmNzID0gRmFsc2UKLSAgICBjb3VudGNhbGxlcnMgPSBGYWxzZQotICAgIHRpbWluZyA9IEZhbHNlCi0KLSAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKLSAgICAgICAgaWYgb3B0ID09ICItLWhlbHAiOgotICAgICAgICAgICAgX3VzYWdlKHN5cy5zdGRvdXQpCi0gICAgICAgICAgICBzeXMuZXhpdCgwKQotCi0gICAgICAgIGlmIG9wdCA9PSAiLS12ZXJzaW9uIjoKLSAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoInRyYWNlIDIuMFxuIikKLSAgICAgICAgICAgIHN5cy5leGl0KDApCi0KLSAgICAgICAgaWYgb3B0ID09ICItVCIgb3Igb3B0ID09ICItLXRyYWNrY2FsbHMiOgotICAgICAgICAgICAgY291bnRjYWxsZXJzID0gVHJ1ZQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1sIiBvciBvcHQgPT0gIi0tbGlzdGZ1bmNzIjoKLSAgICAgICAgICAgIGxpc3RmdW5jcyA9IFRydWUKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItZyIgb3Igb3B0ID09ICItLXRpbWluZyI6Ci0gICAgICAgICAgICB0aW1pbmcgPSBUcnVlCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXQiIG9yIG9wdCA9PSAiLS10cmFjZSI6Ci0gICAgICAgICAgICB0cmFjZSA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItYyIgb3Igb3B0ID09ICItLWNvdW50IjoKLSAgICAgICAgICAgIGNvdW50ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1yIiBvciBvcHQgPT0gIi0tcmVwb3J0IjoKLSAgICAgICAgICAgIHJlcG9ydCA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItUiIgb3Igb3B0ID09ICItLW5vLXJlcG9ydCI6Ci0gICAgICAgICAgICBub19yZXBvcnQgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLWYiIG9yIG9wdCA9PSAiLS1maWxlIjoKLSAgICAgICAgICAgIGNvdW50c19maWxlID0gdmFsCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLW0iIG9yIG9wdCA9PSAiLS1taXNzaW5nIjoKLSAgICAgICAgICAgIG1pc3NpbmcgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLUMiIG9yIG9wdCA9PSAiLS1jb3ZlcmRpciI6Ci0gICAgICAgICAgICBjb3ZlcmRpciA9IHZhbAotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1zIiBvciBvcHQgPT0gIi0tc3VtbWFyeSI6Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLW1vZHVsZSI6Ci0gICAgICAgICAgICBmb3IgbW9kIGluIHZhbC5zcGxpdCgiLCIpOgotICAgICAgICAgICAgICAgIGlnbm9yZV9tb2R1bGVzLmFwcGVuZChtb2Quc3RyaXAoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItLWlnbm9yZS1kaXIiOgotICAgICAgICAgICAgZm9yIHMgaW4gdmFsLnNwbGl0KG9zLnBhdGhzZXApOgotICAgICAgICAgICAgICAgIHMgPSBvcy5wYXRoLmV4cGFuZHZhcnMocykKLSAgICAgICAgICAgICAgICAjIHNob3VsZCBJIGFsc28gY2FsbCBleHBhbmR1c2VyPyAoYWZ0ZXIgYWxsLCBjb3VsZCB1c2UgJEhPTUUpCi0KLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkcHJlZml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzeXMuYmFzZV9wcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKLSAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkZXhlY19wcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5iYXNlX2V4ZWNfcHJlZml4LCAibGliIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSkpCi0gICAgICAgICAgICAgICAgcyA9IG9zLnBhdGgubm9ybXBhdGgocykKLSAgICAgICAgICAgICAgICBpZ25vcmVfZGlycy5hcHBlbmQocykKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgYXNzZXJ0IDAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCi0KLSAgICBpZiBsaXN0ZnVuY3MgYW5kIChjb3VudCBvciB0cmFjZSk6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCkiKQotCi0gICAgaWYgbm90IChjb3VudCBvciB0cmFjZSBvciByZXBvcnQgb3IgbGlzdGZ1bmNzIG9yIGNvdW50Y2FsbGVycyk6Ci0gICAgICAgIF9lcnJfZXhpdCgibXVzdCBzcGVjaWZ5IG9uZSBvZiAtLXRyYWNlLCAtLWNvdW50LCAtLXJlcG9ydCwgIgotICAgICAgICAgICAgICAgICAgIi0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub19yZXBvcnQ6Ci0gICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlcG9ydCBhbmQgLS1uby1yZXBvcnQiKQotCi0gICAgaWYgcmVwb3J0IGFuZCBub3QgY291bnRzX2ZpbGU6Ci0gICAgICAgIF9lcnJfZXhpdCgiLS1yZXBvcnQgcmVxdWlyZXMgYSAtLWZpbGUiKQotCi0gICAgaWYgbm9fcmVwb3J0IGFuZCBsZW4ocHJvZ19hcmd2KSA9PSAwOgotICAgICAgICBfZXJyX2V4aXQoIm1pc3NpbmcgbmFtZSBvZiBmaWxlIHRvIHJ1biIpCi0KLSAgICAjIGV2ZXJ5dGhpbmcgaXMgcmVhZHkKLSAgICBpZiByZXBvcnQ6Ci0gICAgICAgIHJlc3VsdHMgPSBDb3ZlcmFnZVJlc3VsdHMoaW5maWxlPWNvdW50c19maWxlLCBvdXRmaWxlPWNvdW50c19maWxlKQotICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLSAgICBlbHNlOgotICAgICAgICBzeXMuYXJndiA9IHByb2dfYXJndgotICAgICAgICBwcm9nbmFtZSA9IHByb2dfYXJndlswXQotICAgICAgICBzeXMucGF0aFswXSA9IG9zLnBhdGguc3BsaXQocHJvZ25hbWUpWzBdCi0KLSAgICAgICAgdCA9IFRyYWNlKGNvdW50LCB0cmFjZSwgY291bnRmdW5jcz1saXN0ZnVuY3MsCi0gICAgICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9Y291bnRjYWxsZXJzLCBpZ25vcmVtb2RzPWlnbm9yZV9tb2R1bGVzLAotICAgICAgICAgICAgICAgICAgaWdub3JlZGlycz1pZ25vcmVfZGlycywgaW5maWxlPWNvdW50c19maWxlLAotICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1jb3VudHNfZmlsZSwgdGltaW5nPXRpbWluZykKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIHByb2duYW1lLCAnZXhlYycpCi0gICAgICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCi0gICAgICAgICAgICBnbG9icyA9IHsKLSAgICAgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKLSAgICAgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAotICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCi0gICAgICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAotICAgICAgICAgICAgfQotICAgICAgICAgICAgdC5ydW5jdHgoY29kZSwgZ2xvYnMsIGdsb2JzKQotICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6Ci0gICAgICAgICAgICBfZXJyX2V4aXQoIkNhbm5vdCBydW4gZmlsZSAlciBiZWNhdXNlOiAlcyIgJSAoc3lzLmFyZ3ZbMF0sIGVycikpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgotICAgICAgICAgICAgcGFzcwotCi0gICAgICAgIHJlc3VsdHMgPSB0LnJlc3VsdHMoKQotCi0gICAgICAgIGlmIG5vdCBub19yZXBvcnQ6Ci0gICAgICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKLQotIyAgRGVwcmVjYXRlZCBBUEkKLWRlZiB1c2FnZShvdXRmaWxlKToKLSAgICBfd2FybigiVGhlIHRyYWNlLnVzYWdlKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgX3VzYWdlKG91dGZpbGUpCi0KLWNsYXNzIElnbm9yZShfSWdub3JlKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlcz1Ob25lLCBkaXJzPU5vbmUpOgotICAgICAgICBfd2FybigiVGhlIGNsYXNzIHRyYWNlLklnbm9yZSBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgICAgIF9JZ25vcmUuX19pbml0X18oc2VsZiwgbW9kdWxlcywgZGlycykKLQotZGVmIG1vZG5hbWUocGF0aCk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5tb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9tb2RuYW1lKHBhdGgpCi0KLWRlZiBmdWxsbW9kbmFtZShwYXRoKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZ1bGxtb2RuYW1lKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9mdWxsbW9kbmFtZShwYXRoKQotCi1kZWYgZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzX2Zyb21fY29kZSgpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3RycykKLQotZGVmIGZpbmRfbGluZXMoY29kZSwgc3Rycyk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2xpbmVzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2xpbmVzKGNvZGUsIHN0cnMpCi0KLWRlZiBmaW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgotICAgIF93YXJuKCJUaGUgdHJhY2UuZmluZF9zdHJpbmdzKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX3N0cmluZ3MoZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpCi0KLWRlZiBmaW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX2V4ZWN1dGFibGVfbGluZW5vcygpIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgIHJldHVybiBfZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpCisgICAgaWYgbm90IG9wdHMubm9fcmVwb3J0OgorICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMob3B0cy5taXNzaW5nLCBvcHRzLnN1bW1hcnksIG9wdHMuY292ZXJkaXIpCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggYTJlYjUzOS4uM2I0NmMwYiAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC00ODcsMTAgKzQ4Nyw5IEBACiAgICAgICAgICAgICBzZWxmLl9sb2FkX2xpbmVzKCkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBmcm9tX2V4Y2VwdGlvbihzZWxmLCBleGMsICphcmdzLCAqKmt3YXJncyk6CisgICAgZGVmIGZyb21fZXhjZXB0aW9uKGNscywgZXhjLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJDcmVhdGUgYSBUcmFjZWJhY2tFeGNlcHRpb24gZnJvbSBhbiBleGNlcHRpb24uIiIiCi0gICAgICAgIHJldHVybiBUcmFjZWJhY2tFeGNlcHRpb24oCi0gICAgICAgICAgICB0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGNscyh0eXBlKGV4YyksIGV4YywgZXhjLl9fdHJhY2ViYWNrX18sICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiBfbG9hZF9saW5lcyhzZWxmKToKICAgICAgICAgIiIiUHJpdmF0ZSBBUEkuIGZvcmNlIGFsbCBsaW5lcyBpbiB0aGUgc3RhY2sgdG8gYmUgbG9hZGVkLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlbWFsbG9jLnB5IGIvTGliL3RyYWNlbWFsbG9jLnB5CmluZGV4IDYyODhkYTguLjc1YjM5MTggMTAwNjQ0Ci0tLSBhL0xpYi90cmFjZW1hbGxvYy5weQorKysgYi9MaWIvdHJhY2VtYWxsb2MucHkKQEAgLTI0NCwxNyArMjQ0LDIxIEBACiAgICAgX19zbG90c19fID0gKCJfdHJhY2UiLCkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmFjZSk6Ci0gICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKHNpemUsIHRyYWNlYmFjayksIHNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IKLSAgICAgICAgIyBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2ViYWNrIHR1cGxlCisgICAgICAgICMgdHJhY2UgaXMgYSB0dXBsZTogKGRvbWFpbjogaW50LCBzaXplOiBpbnQsIHRyYWNlYmFjazogdHVwbGUpLgorICAgICAgICAjIFNlZSBUcmFjZWJhY2sgY29uc3RydWN0b3IgZm9yIHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNlYmFjayB0dXBsZS4KICAgICAgICAgc2VsZi5fdHJhY2UgPSB0cmFjZQogCiAgICAgQHByb3BlcnR5Ci0gICAgZGVmIHNpemUoc2VsZik6CisgICAgZGVmIGRvbWFpbihzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzBdCiAKICAgICBAcHJvcGVydHkKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNlWzFdCisKKyAgICBAcHJvcGVydHkKICAgICBkZWYgdHJhY2ViYWNrKHNlbGYpOgotICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzFdKQorICAgICAgICByZXR1cm4gVHJhY2ViYWNrKHNlbGYuX3RyYWNlWzJdKQogCiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHJldHVybiAoc2VsZi5fdHJhY2UgPT0gb3RoZXIuX3RyYWNlKQpAQCAtMjY2LDggKzI3MCw4IEBACiAgICAgICAgIHJldHVybiAiJXM6ICVzIiAlIChzZWxmLnRyYWNlYmFjaywgX2Zvcm1hdF9zaXplKHNlbGYuc2l6ZSwgRmFsc2UpKQogCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gKCI8VHJhY2Ugc2l6ZT0lcywgdHJhY2ViYWNrPSVyPiIKLSAgICAgICAgICAgICAgICAlIChfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKKyAgICAgICAgcmV0dXJuICgiPFRyYWNlIGRvbWFpbj0lcyBzaXplPSVzLCB0cmFjZWJhY2s9JXI+IgorICAgICAgICAgICAgICAgICUgKHNlbGYuZG9tYWluLCBfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSksIHNlbGYudHJhY2ViYWNrKSkKIAogCiBjbGFzcyBfVHJhY2VzKFNlcXVlbmNlKToKQEAgLTMwMiwxOSArMzA2LDI5IEBACiAgICAgcmV0dXJuIGZpbGVuYW1lCiAKIAotY2xhc3MgRmlsdGVyOgorY2xhc3MgQmFzZUZpbHRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5jbHVzaXZlKToKKyAgICAgICAgc2VsZi5pbmNsdXNpdmUgPSBpbmNsdXNpdmUKKworICAgIGRlZiBfbWF0Y2goc2VsZiwgdHJhY2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgRmlsdGVyKEJhc2VGaWx0ZXIpOgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmNsdXNpdmUsIGZpbGVuYW1lX3BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIGxpbmVubz1Ob25lLCBhbGxfZnJhbWVzPUZhbHNlKToKKyAgICAgICAgICAgICAgICAgbGluZW5vPU5vbmUsIGFsbF9mcmFtZXM9RmFsc2UsIGRvbWFpbj1Ob25lKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCiAgICAgICAgIHNlbGYuaW5jbHVzaXZlID0gaW5jbHVzaXZlCiAgICAgICAgIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4gPSBfbm9ybWFsaXplX2ZpbGVuYW1lKGZpbGVuYW1lX3BhdHRlcm4pCiAgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCiAgICAgICAgIHNlbGYuYWxsX2ZyYW1lcyA9IGFsbF9mcmFtZXMKKyAgICAgICAgc2VsZi5kb21haW4gPSBkb21haW4KIAogICAgIEBwcm9wZXJ0eQogICAgIGRlZiBmaWxlbmFtZV9wYXR0ZXJuKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWVfcGF0dGVybgogCi0gICAgZGVmIF9fbWF0Y2hfZnJhbWUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgZGVmIF9tYXRjaF9mcmFtZV9pbXBsKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgogICAgICAgICBmaWxlbmFtZSA9IF9ub3JtYWxpemVfZmlsZW5hbWUoZmlsZW5hbWUpCiAgICAgICAgIGlmIG5vdCBmbm1hdGNoLmZubWF0Y2goZmlsZW5hbWUsIHNlbGYuX2ZpbGVuYW1lX3BhdHRlcm4pOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCkBAIC0zMjQsMTEgKzMzOCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIChsaW5lbm8gPT0gc2VsZi5saW5lbm8pCiAKICAgICBkZWYgX21hdGNoX2ZyYW1lKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotICAgICAgICByZXR1cm4gc2VsZi5fX21hdGNoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykgXiAobm90IHNlbGYuaW5jbHVzaXZlKQogCiAgICAgZGVmIF9tYXRjaF90cmFjZWJhY2soc2VsZiwgdHJhY2ViYWNrKToKICAgICAgICAgaWYgc2VsZi5hbGxfZnJhbWVzOgotICAgICAgICAgICAgaWYgYW55KHNlbGYuX19tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgaWYgYW55KHNlbGYuX21hdGNoX2ZyYW1lX2ltcGwoZmlsZW5hbWUsIGxpbmVubykKICAgICAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiB0cmFjZWJhY2spOgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluY2x1c2l2ZQogICAgICAgICAgICAgZWxzZToKQEAgLTMzNyw2ICszNTEsMzAgQEAKICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSB0cmFjZWJhY2tbMF0KICAgICAgICAgICAgIHJldHVybiBzZWxmLl9tYXRjaF9mcmFtZShmaWxlbmFtZSwgbGluZW5vKQogCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmVzID0gc2VsZi5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgaWYgc2VsZi5kb21haW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmluY2x1c2l2ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIGFuZCAoZG9tYWluID09IHNlbGYuZG9tYWluKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzIG9yIChkb21haW4gIT0gc2VsZi5kb21haW4pCisgICAgICAgIHJldHVybiByZXMKKworCitjbGFzcyBEb21haW5GaWx0ZXIoQmFzZUZpbHRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluY2x1c2l2ZSwgZG9tYWluKToKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhpbmNsdXNpdmUpCisgICAgICAgIHNlbGYuX2RvbWFpbiA9IGRvbWFpbgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRvbWFpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvbWFpbgorCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgcmV0dXJuIChkb21haW4gPT0gc2VsZi5kb21haW4pIF4gKG5vdCBzZWxmLmluY2x1c2l2ZSkKKwogCiBjbGFzcyBTbmFwc2hvdDoKICAgICAiIiIKQEAgLTM2NSwxMyArNDAzLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gcGlja2xlLmxvYWQoZnApCiAKICAgICBkZWYgX2ZpbHRlcl90cmFjZShzZWxmLCBpbmNsdWRlX2ZpbHRlcnMsIGV4Y2x1ZGVfZmlsdGVycywgdHJhY2UpOgotICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZVsxXQogICAgICAgICBpZiBpbmNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBub3QgYW55KHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIG5vdCBhbnkodHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRyYWNlX2ZpbHRlciBpbiBpbmNsdWRlX2ZpbHRlcnMpOgogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBpZiBleGNsdWRlX2ZpbHRlcnM6Ci0gICAgICAgICAgICBpZiBhbnkobm90IHRyYWNlX2ZpbHRlci5fbWF0Y2hfdHJhY2ViYWNrKHRyYWNlYmFjaykKKyAgICAgICAgICAgIGlmIGFueShub3QgdHJhY2VfZmlsdGVyLl9tYXRjaCh0cmFjZSkKICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2VfZmlsdGVyIGluIGV4Y2x1ZGVfZmlsdGVycyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCkBAIC0zNzksOCArNDE2LDggQEAKICAgICBkZWYgZmlsdGVyX3RyYWNlcyhzZWxmLCBmaWx0ZXJzKToKICAgICAgICAgIiIiCiAgICAgICAgIENyZWF0ZSBhIG5ldyBTbmFwc2hvdCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgdHJhY2VzIHNlcXVlbmNlLCBmaWx0ZXJzCi0gICAgICAgIGlzIGEgbGlzdCBvZiBGaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eSBsaXN0LCByZXR1cm4gYQotICAgICAgICBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KKyAgICAgICAgaXMgYSBsaXN0IG9mIEZpbHRlciBvciBEb21haW5GaWx0ZXIgaW5zdGFuY2VzLiAgSWYgZmlsdGVycyBpcyBhbiBlbXB0eQorICAgICAgICBsaXN0LCByZXR1cm4gYSBuZXcgU25hcHNob3QgaW5zdGFuY2Ugd2l0aCBhIGNvcHkgb2YgdGhlIHRyYWNlcy4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGZpbHRlcnMsIEl0ZXJhYmxlKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZmlsdGVycyBtdXN0IGJlIGEgbGlzdCBvZiBmaWx0ZXJzLCBub3QgJXMiCkBAIC00MTIsNyArNDQ5LDcgQEAKICAgICAgICAgdHJhY2ViYWNrcyA9IHt9CiAgICAgICAgIGlmIG5vdCBjdW11bGF0aXZlOgogICAgICAgICAgICAgZm9yIHRyYWNlIGluIHNlbGYudHJhY2VzLl90cmFjZXM6Ci0gICAgICAgICAgICAgICAgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKKyAgICAgICAgICAgICAgICBkb21haW4sIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW3RyYWNlX3RyYWNlYmFja10KICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CkBAIC00MzMsNyArNDcwLDcgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgY3VtdWxhdGl2ZSBzdGF0aXN0aWNzCiAgICAgICAgICAgICBmb3IgdHJhY2UgaW4gc2VsZi50cmFjZXMuX3RyYWNlczoKLSAgICAgICAgICAgICAgICBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICAgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKICAgICAgICAgICAgICAgICBmb3IgZnJhbWUgaW4gdHJhY2VfdHJhY2ViYWNrOgogICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tzW2ZyYW1lXQpkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vX19tYWluX18ucHkgYi9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQppbmRleCA3MTFkMGFiLi4wYTU4MzMyIDEwMDY0NAotLS0gYS9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQorKysgYi9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weQpAQCAtODksMTMgKzg5LDEyIEBACiBpbXBvcnQgb3MKIAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuQ29sb3JEZWxlZ2F0b3IgaW1wb3J0IENvbG9yRGVsZWdhdG9yLCBjb2xvcl9jb25maWcKLWZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi1mcm9tIGlkbGVsaWIudGV4dFZpZXcgaW1wb3J0IHZpZXdfdGV4dAorZnJvbSBpZGxlbGliLmNvbG9yaXplciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IsIGNvbG9yX2NvbmZpZworZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKK2Zyb20gaWRsZWxpYi50ZXh0dmlldyBpbXBvcnQgdmlld190ZXh0CiBmcm9tIHR1cnRsZWRlbW8gaW1wb3J0IF9fZG9jX18gYXMgYWJvdXRfdHVydGxlZGVtbwogCiBpbXBvcnQgdHVydGxlCi1pbXBvcnQgdGltZQogCiBkZW1vX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQogZGFyd2luID0gc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nCmRpZmYgLS1naXQgYS9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5IGIvTGliL3R1cnRsZWRlbW8vYnl0ZWRlc2lnbi5weQppbmRleCA2NGIxZDdkLi5iM2IwOTViIDEwMDc1NQotLS0gYS9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5CisrKyBiL0xpYi90dXJ0bGVkZW1vL2J5dGVkZXNpZ24ucHkKQEAgLTIyLDcgKzIyLDYgQEAKIG1vZGUgYXMgZmFzdCBhcyBwb3NzaWJsZS4KICIiIgogCi1pbXBvcnQgbWF0aAogZnJvbSB0dXJ0bGUgaW1wb3J0IFR1cnRsZSwgbWFpbmxvb3AKIGZyb20gdGltZSBpbXBvcnQgY2xvY2sKIApkaWZmIC0tZ2l0IGEvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5IGIvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5CmluZGV4IDI2YWJmZGIuLjAyMWZmOTkgMTAwNzU1Ci0tLSBhL0xpYi90dXJ0bGVkZW1vL3BsYW5ldF9hbmRfbW9vbi5weQorKysgYi9MaWIvdHVydGxlZGVtby9wbGFuZXRfYW5kX21vb24ucHkKQEAgLTE4LDcgKzE4LDYgQEAKIAogIiIiCiBmcm9tIHR1cnRsZSBpbXBvcnQgU2hhcGUsIFR1cnRsZSwgbWFpbmxvb3AsIFZlYzJEIGFzIFZlYwotZnJvbSB0aW1lIGltcG9ydCBzbGVlcAogCiBHID0gOAogCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvbW9jay5weSBiL0xpYi91bml0dGVzdC9tb2NrLnB5CmluZGV4IDFhZGZjZjkuLjZjYzgwOTMgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC9tb2NrLnB5CisrKyBiL0xpYi91bml0dGVzdC9tb2NrLnB5CkBAIC01MjMsNyArNTIzLDcgQEAKICAgICBzaWRlX2VmZmVjdCA9IHByb3BlcnR5KF9fZ2V0X3NpZGVfZWZmZWN0LCBfX3NldF9zaWRlX2VmZmVjdCkKIAogCi0gICAgZGVmIHJlc2V0X21vY2soc2VsZiwgdmlzaXRlZD1Ob25lKToKKyAgICBkZWYgcmVzZXRfbW9jayhzZWxmLCAgdmlzaXRlZD1Ob25lLCosIHJldHVybl92YWx1ZT1GYWxzZSwgc2lkZV9lZmZlY3Q9RmFsc2UpOgogICAgICAgICAiUmVzdG9yZSB0aGUgbW9jayBvYmplY3QgdG8gaXRzIGluaXRpYWwgc3RhdGUuIgogICAgICAgICBpZiB2aXNpdGVkIGlzIE5vbmU6CiAgICAgICAgICAgICB2aXNpdGVkID0gW10KQEAgLTUzOCw2ICs1MzgsMTEgQEAKICAgICAgICAgc2VsZi5jYWxsX2FyZ3NfbGlzdCA9IF9DYWxsTGlzdCgpCiAgICAgICAgIHNlbGYubWV0aG9kX2NhbGxzID0gX0NhbGxMaXN0KCkKIAorICAgICAgICBpZiByZXR1cm5fdmFsdWU6CisgICAgICAgICAgICBzZWxmLl9tb2NrX3JldHVybl92YWx1ZSA9IERFRkFVTFQKKyAgICAgICAgaWYgc2lkZV9lZmZlY3Q6CisgICAgICAgICAgICBzZWxmLl9tb2NrX3NpZGVfZWZmZWN0ID0gTm9uZQorCiAgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9tb2NrX2NoaWxkcmVuLnZhbHVlcygpOgogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgX1NwZWNTdGF0ZSk6CiAgICAgICAgICAgICAgICAgY29udGludWUKQEAgLTc3Miw2ICs3NzcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAoc2VsZi5fbW9ja19uYW1lIG9yICdtb2NrJywgc2VsZi5jYWxsX2NvdW50KSkKICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKIAorICAgIGRlZiBhc3NlcnRfY2FsbGVkKF9tb2NrX3NlbGYpOgorICAgICAgICAiIiJhc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYgPSBfbW9ja19zZWxmCisgICAgICAgIGlmIHNlbGYuY2FsbF9jb3VudCA9PSAwOgorICAgICAgICAgICAgbXNnID0gKCJFeHBlY3RlZCAnJXMnIHRvIGhhdmUgYmVlbiBjYWxsZWQuIiAlCisgICAgICAgICAgICAgICAgICAgc2VsZi5fbW9ja19uYW1lIG9yICdtb2NrJykKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKG1zZykKKworICAgIGRlZiBhc3NlcnRfY2FsbGVkX29uY2UoX21vY2tfc2VsZik6CisgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgb25seSBvbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IF9tb2NrX3NlbGYKKyAgICAgICAgaWYgbm90IHNlbGYuY2FsbF9jb3VudCA9PSAxOgorICAgICAgICAgICAgbXNnID0gKCJFeHBlY3RlZCAnJXMnIHRvIGhhdmUgYmVlbiBjYWxsZWQgb25jZS4gQ2FsbGVkICVzIHRpbWVzLiIgJQorICAgICAgICAgICAgICAgICAgIChzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snLCBzZWxmLmNhbGxfY291bnQpKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQorCiAgICAgZGVmIGFzc2VydF9jYWxsZWRfd2l0aChfbW9ja19zZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAiIiJhc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuCiAKQEAgLTgyMCw3ICs4NDMsNyBAQAogICAgICAgICAgICAgaWYgZXhwZWN0ZWQgbm90IGluIGFsbF9jYWxsczoKICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgJ0NhbGxzIG5vdCBmb3VuZC5cbkV4cGVjdGVkOiAlclxuJwotICAgICAgICAgICAgICAgICAgICAnQWN0dWFsOiAlcicgJSAoY2FsbHMsIHNlbGYubW9ja19jYWxscykKKyAgICAgICAgICAgICAgICAgICAgJ0FjdHVhbDogJXInICUgKF9DYWxsTGlzdChjYWxscyksIHNlbGYubW9ja19jYWxscykKICAgICAgICAgICAgICAgICApIGZyb20gY2F1c2UKICAgICAgICAgICAgIHJldHVybgogCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svc3VwcG9ydC5weQppbmRleCBmNDczODc5Li4yMDU0MzFhIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3N1cHBvcnQucHkKQEAgLTEsNSArMSwzIEBACi1pbXBvcnQgc3lzCi0KIGRlZiBpc19pbnN0YW5jZShvYmosIGtsYXNzKToKICAgICAiIiJWZXJzaW9uIG9mIGlzX2luc3RhbmNlIHRoYXQgZG9lc24ndCBhY2Nlc3MgX19jbGFzc19fIiIiCiAgICAgcmV0dXJuIGlzc3ViY2xhc3ModHlwZShvYmopLCBrbGFzcykKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bWFnaWNtZXRob2RzLnB5CmluZGV4IGJiOWI5NTYuLjI0NTY5YjUgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weQpAQCAtMSw1ICsxLDQgQEAKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGluc3BlY3QKIGltcG9ydCBzeXMKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgTW9jaywgTWFnaWNNb2NrLCBfbWFnaWNzCiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3Rtb2NrLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKaW5kZXggNWY4MmI4Mi4uYjA3YTdjYyAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkKQEAgLTEyMzksNiArMTIzOSwyNyBAQAogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKICAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X25vdF9jYWxsZWQoKQogCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZChzZWxmKToKKyAgICAgICAgbSA9IE1vY2soKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWQoKQorCisgICAgZGVmIHRlc3RfYXNzZXJ0X2NhbGxlZF9vbmNlKHNlbGYpOgorICAgICAgICBtID0gTW9jaygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorICAgICAgICBtLmhlbGxvKCkKKyAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKwogICAgICNJc3N1ZTIxMjU2IHByaW50b3V0IG9mIGtleXdvcmQgYXJncyBzaG91bGQgYmUgaW4gZGV0ZXJtaW5pc3RpYyBvcmRlcgogICAgIGRlZiB0ZXN0X3NvcnRlZF9jYWxsX3NpZ25hdHVyZShzZWxmKToKICAgICAgICAgbSA9IE1vY2soKQpAQCAtMTI1Niw2ICsxMjc3LDI0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tZXRob2RfY2FsbHNbMF0sIGMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tZXRob2RfY2FsbHNbMV0sIGkpCiAKKyAgICBkZWYgdGVzdF9yZXNldF9yZXR1cm5fc2lkZWVmZmVjdChzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHJldHVybl92YWx1ZT1UcnVlLCBzaWRlX2VmZmVjdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXR1cm5fdmFsdWUsIE1vY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaWRlX2VmZmVjdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3Jlc2V0X3JldHVybihzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHJldHVybl92YWx1ZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXR1cm5fdmFsdWUsIE1vY2spCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobS5zaWRlX2VmZmVjdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3Jlc2V0X3NpZGVlZmZlY3Qoc2VsZik6CisgICAgICAgIG0gPSBNb2NrKHJldHVybl92YWx1ZT0xMCwgc2lkZV9lZmZlY3Q9WzIsM10pCisgICAgICAgIG0ucmVzZXRfbW9jayhzaWRlX2VmZmVjdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmV0dXJuX3ZhbHVlLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCiAgICAgZGVmIHRlc3RfbW9ja19hZGRfc3BlYyhzZWxmKToKICAgICAgICAgY2xhc3MgX09uZShvYmplY3QpOgogICAgICAgICAgICAgb25lID0gMQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5IGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5CmluZGV4IGRmY2UzNjkuLjJlMGMwOGYgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RwYXRjaC5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkKQEAgLTEwLDkgKzEwLDkgQEAKIGZyb20gdW5pdHRlc3QudGVzdC50ZXN0bW9jay5zdXBwb3J0IGltcG9ydCBTb21lQ2xhc3MsIGlzX2luc3RhbmNlCiAKIGZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgKAotICAgIE5vbkNhbGxhYmxlTW9jaywgQ2FsbGFibGVNaXhpbiwgcGF0Y2gsIHNlbnRpbmVsLAorICAgIE5vbkNhbGxhYmxlTW9jaywgQ2FsbGFibGVNaXhpbiwgc2VudGluZWwsCiAgICAgTWFnaWNNb2NrLCBNb2NrLCBOb25DYWxsYWJsZU1hZ2ljTW9jaywgcGF0Y2gsIF9wYXRjaCwKLSAgICBERUZBVUxULCBjYWxsLCBfZ2V0X3RhcmdldCwgX3BhdGNoCisgICAgREVGQVVMVCwgY2FsbCwgX2dldF90YXJnZXQKICkKIAogCmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3BhcnNlLnB5IGIvTGliL3VybGxpYi9wYXJzZS5weQppbmRleCA0ZDdmY2VjLi45OWE2OTc3IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3BhcnNlLnB5CisrKyBiL0xpYi91cmxsaWIvcGFyc2UucHkKQEAgLTE1Niw5ICsxNTYsOCBAQAogICAgICAgICBwb3J0ID0gc2VsZi5faG9zdGluZm9bMV0KICAgICAgICAgaWYgcG9ydCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCwgMTApCi0gICAgICAgICAgICAjIFJldHVybiBOb25lIG9uIGFuIGlsbGVnYWwgcG9ydAogICAgICAgICAgICAgaWYgbm90ICggMCA8PSBwb3J0IDw9IDY1NTM1KToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBvcnQgb3V0IG9mIHJhbmdlIDAtNjU1MzUiKQogICAgICAgICByZXR1cm4gcG9ydAogCiAKQEAgLTIyNSw4ICsyMjQsNzEgQEAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKIAogX0RlZnJhZ1Jlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKCdEZWZyYWdSZXN1bHQnLCAndXJsIGZyYWdtZW50JykKLV9TcGxpdFJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKCdTcGxpdFJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcXVlcnkgZnJhZ21lbnQnKQotX1BhcnNlUmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ1BhcnNlUmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBwYXJhbXMgcXVlcnkgZnJhZ21lbnQnKQorX1NwbGl0UmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoCisgICAgJ1NwbGl0UmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBxdWVyeSBmcmFnbWVudCcpCitfUGFyc2VSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgKKyAgICAnUGFyc2VSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHBhcmFtcyBxdWVyeSBmcmFnbWVudCcpCisKK19EZWZyYWdSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK0RlZnJhZ1Jlc3VsdCh1cmwsIGZyYWdtZW50KQorCitBIDItdHVwbGUgdGhhdCBjb250YWlucyB0aGUgdXJsIHdpdGhvdXQgZnJhZ21lbnQgaWRlbnRpZmllciBhbmQgdGhlIGZyYWdtZW50CitpZGVudGlmaWVyIGFzIGEgc2VwYXJhdGUgYXJndW1lbnQuCisiIiIKKworX0RlZnJhZ1Jlc3VsdEJhc2UudXJsLl9fZG9jX18gPSAiIiJUaGUgVVJMIHdpdGggbm8gZnJhZ21lbnQgaWRlbnRpZmllci4iIiIKKworX0RlZnJhZ1Jlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9ICIiIgorRnJhZ21lbnQgaWRlbnRpZmllciBzZXBhcmF0ZWQgZnJvbSBVUkwsIHRoYXQgYWxsb3dzIGluZGlyZWN0IGlkZW50aWZpY2F0aW9uIG9mIGEKK3NlY29uZGFyeSByZXNvdXJjZSBieSByZWZlcmVuY2UgdG8gYSBwcmltYXJ5IHJlc291cmNlIGFuZCBhZGRpdGlvbmFsIGlkZW50aWZ5aW5nCitpbmZvcm1hdGlvbi4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK1NwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpCisKK0EgNS10dXBsZSB0aGF0IGNvbnRhaW5zIHRoZSBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiBhIFVSTC4gU2ltaWxhciB0bworUGFyc2VSZXN1bHQsIGJ1dCBkb2VzIG5vdCBzcGxpdCBwYXJhbXMuCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5zY2hlbWUuX19kb2NfXyA9ICIiIlNwZWNpZmllcyBVUkwgc2NoZW1lIGZvciB0aGUgcmVxdWVzdC4iIiIKKworX1NwbGl0UmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXyA9ICIiIgorTmV0d29yayBsb2NhdGlvbiB3aGVyZSB0aGUgcmVxdWVzdCBpcyBtYWRlIHRvLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UucGF0aC5fX2RvY19fID0gIiIiCitUaGUgaGllcmFyY2hpY2FsIHBhdGgsIHN1Y2ggYXMgdGhlIHBhdGggdG8gYSBmaWxlIHRvIGRvd25sb2FkLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UucXVlcnkuX19kb2NfXyA9ICIiIgorVGhlIHF1ZXJ5IGNvbXBvbmVudCwgdGhhdCBjb250YWlucyBub24taGllcmFyY2hpY2FsIGRhdGEsIHRoYXQgYWxvbmcgd2l0aCBkYXRhCitpbiBwYXRoIGNvbXBvbmVudCwgaWRlbnRpZmllcyBhIHJlc291cmNlIGluIHRoZSBzY29wZSBvZiBVUkkncyBzY2hlbWUgYW5kCituZXR3b3JrIGxvY2F0aW9uLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9ICIiIgorRnJhZ21lbnQgaWRlbnRpZmllciwgdGhhdCBhbGxvd3MgaW5kaXJlY3QgaWRlbnRpZmljYXRpb24gb2YgYSBzZWNvbmRhcnkgcmVzb3VyY2UKK2J5IHJlZmVyZW5jZSB0byBhIHByaW1hcnkgcmVzb3VyY2UgYW5kIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uCisiIiIKKworX1BhcnNlUmVzdWx0QmFzZS5fX2RvY19fID0gIiIiCitQYXJzZVJlc3VsdChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCAgcXVlcnksIGZyYWdtZW50KQorCitBIDYtdHVwbGUgdGhhdCBjb250YWlucyBjb21wb25lbnRzIG9mIGEgcGFyc2VkIFVSTC4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5zY2hlbWUuX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UubmV0bG9jLl9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UucGF0aC5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5wYXRoLl9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UucGFyYW1zLl9fZG9jX18gPSAiIiIKK1BhcmFtZXRlcnMgZm9yIGxhc3QgcGF0aCBlbGVtZW50IHVzZWQgdG8gZGVyZWZlcmVuY2UgdGhlIFVSSSBpbiBvcmRlciB0byBwcm92aWRlCithY2Nlc3MgdG8gcGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvbiB0aGUgcmVzb3VyY2UuCisiIiIKKworX1BhcnNlUmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLmZyYWdtZW50Ll9fZG9jX18KKwogCiAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYWxpYXMgX05ldGxvY1Jlc3VsdE1peGluU3RyCiAjIFJlc3VsdEJhc2UgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIGRvY3VtZW50ZWQgQVBJLCBidXQgaXQgaXMKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIvcmVxdWVzdC5weSBiL0xpYi91cmxsaWIvcmVxdWVzdC5weQppbmRleCAxNzMxZmUzLi42N2U3M2Y5IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3JlcXVlc3QucHkKKysrIGIvTGliL3VybGxpYi9yZXF1ZXN0LnB5CkBAIC0xMzQsMTEgKzEzNCw3NiBAQAogXQogCiAjIHVzZWQgaW4gVXNlci1BZ2VudCBoZWFkZXIgc2VudAotX192ZXJzaW9uX18gPSBzeXMudmVyc2lvbls6M10KK19fdmVyc2lvbl9fID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAKIF9vcGVuZXIgPSBOb25lCiBkZWYgdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAqLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUsIGNhZGVmYXVsdD1GYWxzZSwgY29udGV4dD1Ob25lKToKKyAgICAnJydPcGVuIHRoZSBVUkwgdXJsLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgUmVxdWVzdCBvYmplY3QuCisKKyAgICAqZGF0YSogbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBzcGVjaWZ5aW5nIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzZW50IHRvIHRoZQorICAgIHNlcnZlciwgb3IgTm9uZSBpZiBubyBzdWNoIGRhdGEgaXMgbmVlZGVkLiBkYXRhIG1heSBhbHNvIGJlIGFuIGl0ZXJhYmxlCisgICAgb2JqZWN0IGFuZCBpbiB0aGF0IGNhc2UgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlCisgICAgaGVhZGVycy4gQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgZGF0YTsgdGhlIEhUVFAKKyAgICByZXF1ZXN0IHdpbGwgYmUgYSBQT1NUIGluc3RlYWQgb2YgYSBHRVQgd2hlbiB0aGUgZGF0YSBwYXJhbWV0ZXIgaXMKKyAgICBwcm92aWRlZC4KKworICAgICpkYXRhKiBzaG91bGQgYmUgYSBidWZmZXIgaW4gdGhlIHN0YW5kYXJkIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZAorICAgIGZvcm1hdC4gVGhlIHVybGxpYi5wYXJzZS51cmxlbmNvZGUoKSBmdW5jdGlvbiB0YWtlcyBhIG1hcHBpbmcgb3Igc2VxdWVuY2UKKyAgICBvZiAyLXR1cGxlcyBhbmQgcmV0dXJucyBhbiBBU0NJSSB0ZXh0IHN0cmluZyBpbiB0aGlzIGZvcm1hdC4gSXQgc2hvdWxkIGJlCisgICAgZW5jb2RlZCB0byBieXRlcyBiZWZvcmUgYmVpbmcgdXNlZCBhcyB0aGUgZGF0YSBwYXJhbWV0ZXIuCisKKyAgICB1cmxsaWIucmVxdWVzdCBtb2R1bGUgdXNlcyBIVFRQLzEuMSBhbmQgaW5jbHVkZXMgYSAiQ29ubmVjdGlvbjpjbG9zZSIKKyAgICBoZWFkZXIgaW4gaXRzIEhUVFAgcmVxdWVzdHMuCisKKyAgICBUaGUgb3B0aW9uYWwgKnRpbWVvdXQqIHBhcmFtZXRlciBzcGVjaWZpZXMgYSB0aW1lb3V0IGluIHNlY29uZHMgZm9yCisgICAgYmxvY2tpbmcgb3BlcmF0aW9ucyBsaWtlIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQgKGlmIG5vdCBzcGVjaWZpZWQsIHRoZQorICAgIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZyB3aWxsIGJlIHVzZWQpLiBUaGlzIG9ubHkgd29ya3MgZm9yIEhUVFAsCisgICAgSFRUUFMgYW5kIEZUUCBjb25uZWN0aW9ucy4KKworICAgIElmICpjb250ZXh0KiBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgYSBzc2wuU1NMQ29udGV4dCBpbnN0YW5jZSBkZXNjcmliaW5nCisgICAgdGhlIHZhcmlvdXMgU1NMIG9wdGlvbnMuIFNlZSBIVFRQU0Nvbm5lY3Rpb24gZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFRoZSBvcHRpb25hbCAqY2FmaWxlKiBhbmQgKmNhcGF0aCogcGFyYW1ldGVycyBzcGVjaWZ5IGEgc2V0IG9mIHRydXN0ZWQgQ0EKKyAgICBjZXJ0aWZpY2F0ZXMgZm9yIEhUVFBTIHJlcXVlc3RzLiBjYWZpbGUgc2hvdWxkIHBvaW50IHRvIGEgc2luZ2xlIGZpbGUKKyAgICBjb250YWluaW5nIGEgYnVuZGxlIG9mIENBIGNlcnRpZmljYXRlcywgd2hlcmVhcyBjYXBhdGggc2hvdWxkIHBvaW50IHRvIGEKKyAgICBkaXJlY3Rvcnkgb2YgaGFzaGVkIGNlcnRpZmljYXRlIGZpbGVzLiBNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbgorICAgIHNzbC5TU0xDb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucygpLgorCisgICAgVGhlICpjYWRlZmF1bHQqIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorCisgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggY2FuIHdvcmsgYXMgYSBjb250ZXh0CisgICAgbWFuYWdlciBhbmQgaGFzIG1ldGhvZHMgc3VjaCBhcworCisgICAgKiBnZXR1cmwoKSAtIHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSByZXRyaWV2ZWQsIGNvbW1vbmx5IHVzZWQgdG8KKyAgICAgIGRldGVybWluZSBpZiBhIHJlZGlyZWN0IHdhcyBmb2xsb3dlZAorCisgICAgKiBpbmZvKCkgLSByZXR1cm4gdGhlIG1ldGEtaW5mb3JtYXRpb24gb2YgdGhlIHBhZ2UsIHN1Y2ggYXMgaGVhZGVycywgaW4gdGhlCisgICAgICBmb3JtIG9mIGFuIGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoKSBpbnN0YW5jZSAoc2VlIFF1aWNrIFJlZmVyZW5jZSB0bworICAgICAgSFRUUCBIZWFkZXJzKQorCisgICAgKiBnZXRjb2RlKCkgLSByZXR1cm4gdGhlIEhUVFAgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlLiAgUmFpc2VzIFVSTEVycm9yCisgICAgICBvbiBlcnJvcnMuCisKKyAgICBGb3IgSFRUUCBhbmQgSFRUUFMgVVJMcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgaHR0cC5jbGllbnQuSFRUUFJlc3BvbnNlCisgICAgb2JqZWN0IHNsaWdodGx5IG1vZGlmaWVkLiBJbiBhZGRpdGlvbiB0byB0aGUgdGhyZWUgbmV3IG1ldGhvZHMgYWJvdmUsIHRoZQorICAgIG1zZyBhdHRyaWJ1dGUgY29udGFpbnMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHJlYXNvbiBhdHRyaWJ1dGUgLS0tCisgICAgdGhlIHJlYXNvbiBwaHJhc2UgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciAtLS0gaW5zdGVhZCBvZiB0aGUgcmVzcG9uc2UKKyAgICBoZWFkZXJzIGFzIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgSFRUUFJlc3BvbnNlLgorCisgICAgRm9yIEZUUCwgZmlsZSwgYW5kIGRhdGEgVVJMcyBhbmQgcmVxdWVzdHMgZXhwbGljaXRseSBoYW5kbGVkIGJ5IGxlZ2FjeQorICAgIFVSTG9wZW5lciBhbmQgRmFuY3lVUkxvcGVuZXIgY2xhc3NlcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKKyAgICB1cmxsaWIucmVzcG9uc2UuYWRkaW5mb3VybCBvYmplY3QuCisKKyAgICBOb3RlIHRoYXQgTm9uZSBtYXkgYmUgcmV0dXJuZWQgaWYgbm8gaGFuZGxlciBoYW5kbGVzIHRoZSByZXF1ZXN0ICh0aG91Z2gKKyAgICB0aGUgZGVmYXVsdCBpbnN0YWxsZWQgZ2xvYmFsIE9wZW5lckRpcmVjdG9yIHVzZXMgVW5rbm93bkhhbmRsZXIgdG8gZW5zdXJlCisgICAgdGhpcyBuZXZlciBoYXBwZW5zKS4KKworICAgIEluIGFkZGl0aW9uLCBpZiBwcm94eSBzZXR0aW5ncyBhcmUgZGV0ZWN0ZWQgKGZvciBleGFtcGxlLCB3aGVuIGEgKl9wcm94eQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlIGxpa2UgaHR0cF9wcm94eSBpcyBzZXQpLCBQcm94eUhhbmRsZXIgaXMgZGVmYXVsdAorICAgIGluc3RhbGxlZCBhbmQgbWFrZXMgc3VyZSB0aGUgcmVxdWVzdHMgYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgcHJveHkuCisKKyAgICAnJycKICAgICBnbG9iYWwgX29wZW5lcgogICAgIGlmIGNhZmlsZSBvciBjYXBhdGggb3IgY2FkZWZhdWx0OgogICAgICAgICBpZiBjb250ZXh0IGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weSBiL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKaW5kZXggOGI2OWZkOS4uODVhZGQxNiAxMDA2NDQKLS0tIGEvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQorKysgYi9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CkBAIC0xMCw3ICsxMCw5IEBACiAgICAgaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL25vcm9ib3RzLXJmYy50eHQKICIiIgogCi1pbXBvcnQgdXJsbGliLnBhcnNlLCB1cmxsaWIucmVxdWVzdAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdXJsbGliLnBhcnNlCitpbXBvcnQgdXJsbGliLnJlcXVlc3QKIAogX19hbGxfXyA9IFsiUm9ib3RGaWxlUGFyc2VyIl0KIApAQCAtMTIwLDEwICsxMjIsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJ1bGVsaW5lcy5hcHBlbmQoUnVsZUxpbmUobGluZVsxXSwgVHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gImNyYXdsLWRlbGF5IjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVmb3JlIHRyeWluZyB0byBjb252ZXJ0IHRvIGludCB3ZSBuZWVkIHRvIG1ha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VyZSB0aGF0IHJvYm90cy50eHQgaGFzIHZhbGlkIHN5bnRheCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaXQgd2lsbCBjcmFzaAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVsxXS5zdHJpcCgpLmlzZGlnaXQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5kZWxheSA9IGludChsaW5lWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJyZXF1ZXN0LXJhdGUiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVycyA9IGxpbmVbMV0uc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBhbGwgdmFsdWVzIGFyZSBzYW5lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKG51bWJlcnMpID09IDIgYW5kIG51bWJlcnNbMF0uc3RyaXAoKS5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbnVtYmVyc1sxXS5zdHJpcCgpLmlzZGlnaXQoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3JhdGUgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdyZXFfcmF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXF1ZXN0cyBzZWNvbmRzJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZSA9IHJlcV9yYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucmVxX3JhdGUucmVxdWVzdHMgPSBpbnQobnVtYmVyc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZS5zZWNvbmRzID0gaW50KG51bWJlcnNbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKICAgICAgICAgaWYgc3RhdGUgPT0gMjoKICAgICAgICAgICAgIHNlbGYuX2FkZF9lbnRyeShlbnRyeSkKIAotCiAgICAgZGVmIGNhbl9mZXRjaChzZWxmLCB1c2VyYWdlbnQsIHVybCk6CiAgICAgICAgICIiInVzaW5nIHRoZSBwYXJzZWQgcm9ib3RzLnR4dCBkZWNpZGUgaWYgdXNlcmFnZW50IGNhbiBmZXRjaCB1cmwiIiIKICAgICAgICAgaWYgc2VsZi5kaXNhbGxvd19hbGw6CkBAIC0xNTMsNiArMTc0LDE4IEBACiAgICAgICAgICMgYWdlbnQgbm90IGZvdW5kID09PiBhY2Nlc3MgZ3JhbnRlZAogICAgICAgICByZXR1cm4gVHJ1ZQogCisgICAgZGVmIGNyYXdsX2RlbGF5KHNlbGYsIHVzZXJhZ2VudCk6CisgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CisgICAgICAgICAgICBpZiBlbnRyeS5hcHBsaWVzX3RvKHVzZXJhZ2VudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmRlbGF5CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVxdWVzdF9yYXRlKHNlbGYsIHVzZXJhZ2VudCk6CisgICAgICAgIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXM6CisgICAgICAgICAgICBpZiBlbnRyeS5hcHBsaWVzX3RvKHVzZXJhZ2VudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LnJlcV9yYXRlCisgICAgICAgIHJldHVybiBOb25lCisKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuICcnLmpvaW4oW3N0cihlbnRyeSkgKyAiXG4iIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXNdKQogCkBAIC0xODAsNiArMjEzLDggQEAKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYudXNlcmFnZW50cyA9IFtdCiAgICAgICAgIHNlbGYucnVsZWxpbmVzID0gW10KKyAgICAgICAgc2VsZi5kZWxheSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXFfcmF0ZSA9IE5vbmUKIAogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXQgPSBbXQpkaWZmIC0tZ2l0IGEvTGliL3V1aWQucHkgYi9MaWIvdXVpZC5weQppbmRleCBlOTZlN2UwLi4yMDBjODAwIDEwMDY0NAotLS0gYS9MaWIvdXVpZC5weQorKysgYi9MaWIvdXVpZC5weQpAQCAtNDg3LDcgKzQ4Nyw2IEBACiAgICAgIyBBc3N1bWUgdGhhdCB0aGUgdXVpZF9nZW5lcmF0ZSBmdW5jdGlvbnMgYXJlIGJyb2tlbiBmcm9tIDEwLjUgb253YXJkLAogICAgICMgdGhlIHRlc3QgY2FuIGJlIGFkanVzdGVkIHdoZW4gYSBsYXRlciB2ZXJzaW9uIGlzIGZpeGVkLgogICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgIGlmIGludChvcy51bmFtZSgpLnJlbGVhc2Uuc3BsaXQoJy4nKVswXSkgPj0gOToKICAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3RpbWUgPSBOb25lCiAKZGlmZiAtLWdpdCBhL0xpYi92ZW52L19faW5pdF9fLnB5IGIvTGliL3ZlbnYvX19pbml0X18ucHkKaW5kZXggNzQyNDVhYi4uZmEzZDJhMyAxMDA2NDQKLS0tIGEvTGliL3ZlbnYvX19pbml0X18ucHkKKysrIGIvTGliL3ZlbnYvX19pbml0X18ucHkKQEAgLTMsMjggKzMsNiBAQAogCiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNCBWaW5heSBTYWppcC4KIExpY2Vuc2VkIHRvIHRoZSBQU0YgdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCi0KLXVzYWdlOiBweXRob24gLW0gdmVudiBbLWhdIFstLXN5c3RlbS1zaXRlLXBhY2thZ2VzXSBbLS1zeW1saW5rc10gWy0tY2xlYXJdCi0gICAgICAgICAgICBbLS11cGdyYWRlXQotICAgICAgICAgICAgRU5WX0RJUiBbRU5WX0RJUiAuLi5dCi0KLUNyZWF0ZXMgdmlydHVhbCBQeXRob24gZW52aXJvbm1lbnRzIGluIG9uZSBvciBtb3JlIHRhcmdldCBkaXJlY3Rvcmllcy4KLQotcG9zaXRpb25hbCBhcmd1bWVudHM6Ci0gIEVOVl9ESVIgICAgICAgICAgICAgICBBIGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IGluLgotCi1vcHRpb25hbCBhcmd1bWVudHM6Ci0gIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0Ci0gIC0tc3lzdGVtLXNpdGUtcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIEdpdmUgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQgYWNjZXNzIHRvIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNpdGUtcGFja2FnZXMgZGlyLgotICAtLXN5bWxpbmtzICAgICAgICAgICAgQXR0ZW1wdCB0byBzeW1saW5rIHJhdGhlciB0aGFuIGNvcHkuCi0gIC0tY2xlYXIgICAgICAgICAgICAgICBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCi0gIC0tdXBncmFkZSAgICAgICAgICAgICBVcGdyYWRlIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgdG8gdXNlIHRoaXMgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgb2YgUHl0aG9uLCBhc3N1bWluZyBQeXRob24gaGFzIGJlZW4gdXBncmFkZWQgaW4tcGxhY2UuCi0gIC0td2l0aG91dC1waXAgICAgICAgICBTa2lwcyBpbnN0YWxsaW5nIG9yIHVwZ3JhZGluZyBwaXAgaW4gdGhlIHZpcnR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IChwaXAgaXMgYm9vdHN0cmFwcGVkIGJ5IGRlZmF1bHQpCiAiIiIKIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKQEAgLTM0OSwyMyArMzI3LDcgQEAKIAogZGVmIGNyZWF0ZShlbnZfZGlyLCBzeXN0ZW1fc2l0ZV9wYWNrYWdlcz1GYWxzZSwgY2xlYXI9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzPUZhbHNlLCB3aXRoX3BpcD1GYWxzZSk6Ci0gICAgIiIiCi0gICAgQ3JlYXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpbiBhIGRpcmVjdG9yeS4KLQotICAgIEJ5IGRlZmF1bHQsIG1ha2VzIHRoZSBzeXN0ZW0gKGdsb2JhbCkgc2l0ZS1wYWNrYWdlcyBkaXIgKnVuKmF2YWlsYWJsZSB0bwotICAgIHRoZSBjcmVhdGVkIGVudmlyb25tZW50LCBhbmQgdXNlcyBjb3B5aW5nIHJhdGhlciB0aGFuIHN5bWxpbmtpbmcgZm9yIGZpbGVzCi0gICAgb2J0YWluZWQgZnJvbSB0aGUgc291cmNlIFB5dGhvbiBpbnN0YWxsYXRpb24uCi0KLSAgICA6cGFyYW0gZW52X2RpcjogVGhlIHRhcmdldCBkaXJlY3RvcnkgdG8gY3JlYXRlIGFuIGVudmlyb25tZW50IGluLgotICAgIDpwYXJhbSBzeXN0ZW1fc2l0ZV9wYWNrYWdlczogSWYgVHJ1ZSwgdGhlIHN5c3RlbSAoZ2xvYmFsKSBzaXRlLXBhY2thZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIgaXMgYXZhaWxhYmxlIHRvIHRoZSBlbnZpcm9ubWVudC4KLSAgICA6cGFyYW0gY2xlYXI6IElmIFRydWUsIGRlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSBpZgotICAgICAgICAgICAgICAgICAgaXQgYWxyZWFkeSBleGlzdHMsIGJlZm9yZSBlbnZpcm9ubWVudCBjcmVhdGlvbi4KLSAgICA6cGFyYW0gc3ltbGlua3M6IElmIFRydWUsIGF0dGVtcHQgdG8gc3ltbGluayByYXRoZXIgdGhhbiBjb3B5IGZpbGVzIGludG8KLSAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZW52aXJvbm1lbnQuCi0gICAgOnBhcmFtIHdpdGhfcGlwOiBJZiBUcnVlLCBlbnN1cmUgcGlwIGlzIGluc3RhbGxlZCBpbiB0aGUgdmlydHVhbAotICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQKLSAgICAiIiIKKyAgICAiIiJDcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50IGluIGEgZGlyZWN0b3J5LiIiIgogICAgIGJ1aWxkZXIgPSBFbnZCdWlsZGVyKHN5c3RlbV9zaXRlX3BhY2thZ2VzPXN5c3RlbV9zaXRlX3BhY2thZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyPWNsZWFyLCBzeW1saW5rcz1zeW1saW5rcywgd2l0aF9waXA9d2l0aF9waXApCiAgICAgYnVpbGRlci5jcmVhdGUoZW52X2RpcikKZGlmZiAtLWdpdCBhL0xpYi93YXJuaW5ncy5weSBiL0xpYi93YXJuaW5ncy5weQppbmRleCBjNjYzMWZjLi4yYjQwN2ZmIDEwMDY0NAotLS0gYS9MaWIvd2FybmluZ3MucHkKKysrIGIvTGliL3dhcm5pbmdzLnB5CkBAIC0yLDM5ICsyLDExMiBAQAogCiBpbXBvcnQgc3lzCiAKKwogX19hbGxfXyA9IFsid2FybiIsICJ3YXJuX2V4cGxpY2l0IiwgInNob3d3YXJuaW5nIiwKICAgICAgICAgICAgImZvcm1hdHdhcm5pbmciLCAiZmlsdGVyd2FybmluZ3MiLCAic2ltcGxlZmlsdGVyIiwKICAgICAgICAgICAgInJlc2V0d2FybmluZ3MiLCAiY2F0Y2hfd2FybmluZ3MiXQogCi0KIGRlZiBzaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgogICAgICIiIkhvb2sgdG8gd3JpdGUgYSB3YXJuaW5nIHRvIGEgZmlsZTsgcmVwbGFjZSBpZiB5b3UgbGlrZS4iIiIKLSAgICBpZiBmaWxlIGlzIE5vbmU6Ci0gICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCi0gICAgICAgIGlmIGZpbGUgaXMgTm9uZToKLSAgICAgICAgICAgICMgc3lzLnN0ZGVyciBpcyBOb25lIHdoZW4gcnVuIHdpdGggcHl0aG9udy5leGUgLSB3YXJuaW5ncyBnZXQgbG9zdAotICAgICAgICAgICAgcmV0dXJuCi0gICAgdHJ5OgotICAgICAgICBmaWxlLndyaXRlKGZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUpKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBwYXNzICMgdGhlIGZpbGUgKHByb2JhYmx5IHN0ZGVycikgaXMgaW52YWxpZCAtIHRoaXMgd2FybmluZyBnZXRzIGxvc3QuCisgICAgbXNnID0gV2FybmluZ01lc3NhZ2UobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGUsIGxpbmUpCisgICAgX3Nob3d3YXJubXNnX2ltcGwobXNnKQogCiBkZWYgZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT1Ob25lKToKICAgICAiIiJGdW5jdGlvbiB0byBmb3JtYXQgYSB3YXJuaW5nIHRoZSBzdGFuZGFyZCB3YXkuIiIiCi0gICAgcyA9ICAiJXM6JXM6ICVzOiAlc1xuIiAlIChmaWxlbmFtZSwgbGluZW5vLCBjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSkKLSAgICBpZiBsaW5lIGlzIE5vbmU6CisgICAgbXNnID0gV2FybmluZ01lc3NhZ2UobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIE5vbmUsIGxpbmUpCisgICAgcmV0dXJuIF9mb3JtYXR3YXJubXNnX2ltcGwobXNnKQorCitkZWYgX3Nob3d3YXJubXNnX2ltcGwobXNnKToKKyAgICBmaWxlID0gbXNnLmZpbGUKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgc3lzLnN0ZGVyciBpcyBOb25lIHdoZW4gcnVuIHdpdGggcHl0aG9udy5leGU6CisgICAgICAgICAgICAjIHdhcm5pbmdzIGdldCBsb3N0CisgICAgICAgICAgICByZXR1cm4KKyAgICB0ZXh0ID0gX2Zvcm1hdHdhcm5tc2cobXNnKQorICAgIHRyeToKKyAgICAgICAgZmlsZS53cml0ZSh0ZXh0KQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgorICAgICAgICBwYXNzCisKK2RlZiBfZm9ybWF0d2Fybm1zZ19pbXBsKG1zZyk6CisgICAgcyA9ICAoIiVzOiVzOiAlczogJXNcbiIKKyAgICAgICAgICAlIChtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8sIG1zZy5jYXRlZ29yeS5fX25hbWVfXywKKyAgICAgICAgICAgICBtc2cubWVzc2FnZSkpCisKKyAgICBpZiBtc2cubGluZSBpcyBOb25lOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgbGluZWNhY2hlCi0gICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8pCiAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAjIFdoZW4gYSB3YXJuaW5nIGlzIGxvZ2dlZCBkdXJpbmcgUHl0aG9uIHNodXRkb3duLCBsaW5lY2FjaGUKICAgICAgICAgICAgICMgYW5kIHRoZSBpbXBvcnQgbWFjaGluZXJ5IGRvbid0IHdvcmsgYW55bW9yZQogICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgIGxpbmVjYWNoZSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBsaW5lID0gbXNnLmxpbmUKICAgICBpZiBsaW5lOgogICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgIHMgKz0gIiAgJXNcbiIgJSBsaW5lCisKKyAgICBpZiBtc2cuc291cmNlIGlzIG5vdCBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2VtYWxsb2MKKyAgICAgICAgICAgIHRiID0gdHJhY2VtYWxsb2MuZ2V0X29iamVjdF90cmFjZWJhY2sobXNnLnNvdXJjZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICMgV2hlbiBhIHdhcm5pbmcgaXMgbG9nZ2VkIGR1cmluZyBQeXRob24gc2h1dGRvd24sIHRyYWNlbWFsbG9jCisgICAgICAgICAgICAjIGFuZCB0aGUgaW1wb3J0IG1hY2hpbmVyeSBkb24ndCB3b3JrIGFueW1vcmUKKyAgICAgICAgICAgIHRiID0gTm9uZQorCisgICAgICAgIGlmIHRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcyArPSAnT2JqZWN0IGFsbG9jYXRlZCBhdCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6XG4nCisgICAgICAgICAgICBmb3IgZnJhbWUgaW4gdGI6CisgICAgICAgICAgICAgICAgcyArPSAoJyAgRmlsZSAiJXMiLCBsaW5lbm8gJXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAlIChmcmFtZS5maWxlbmFtZSwgZnJhbWUubGluZW5vKSkKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZWNhY2hlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZyYW1lLmZpbGVuYW1lLCBmcmFtZS5saW5lbm8pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBzICs9ICcgICAgJXNcbicgJSBsaW5lCiAgICAgcmV0dXJuIHMKIAorIyBLZWVwIGEgcmVmZXJlbmNlIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiB3YXMgcmVwbGFjZWQKK19zaG93d2FybmluZyA9IHNob3d3YXJuaW5nCisKK2RlZiBfc2hvd3dhcm5tc2cobXNnKToKKyAgICAiIiJIb29rIHRvIHdyaXRlIGEgd2FybmluZyB0byBhIGZpbGU7IHJlcGxhY2UgaWYgeW91IGxpa2UuIiIiCisgICAgc2hvd3dhcm5pbmcgPSBnbG9iYWxzKCkuZ2V0KCdzaG93d2FybmluZycsIF9zaG93d2FybmluZykKKyAgICBpZiBzaG93d2FybmluZyBpcyBub3QgX3Nob3d3YXJuaW5nOgorICAgICAgICAjIHdhcm5pbmdzLnNob3d3YXJuaW5nKCkgd2FzIHJlcGxhY2VkCisgICAgICAgIGlmIG5vdCBjYWxsYWJsZShzaG93d2FybmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIndhcm5pbmdzLnNob3d3YXJuaW5nKCkgbXVzdCBiZSBzZXQgdG8gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uIG9yIG1ldGhvZCIpCisKKyAgICAgICAgc2hvd3dhcm5pbmcobXNnLm1lc3NhZ2UsIG1zZy5jYXRlZ29yeSwgbXNnLmZpbGVuYW1lLCBtc2cubGluZW5vLAorICAgICAgICAgICAgICAgICAgICBtc2cuZmlsZSwgbXNnLmxpbmUpCisgICAgICAgIHJldHVybgorICAgIF9zaG93d2Fybm1zZ19pbXBsKG1zZykKKworIyBLZWVwIGEgcmVmZXJlbmNlIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiB3YXMgcmVwbGFjZWQKK19mb3JtYXR3YXJuaW5nID0gZm9ybWF0d2FybmluZworCitkZWYgX2Zvcm1hdHdhcm5tc2cobXNnKToKKyAgICAiIiJGdW5jdGlvbiB0byBmb3JtYXQgYSB3YXJuaW5nIHRoZSBzdGFuZGFyZCB3YXkuIiIiCisgICAgZm9ybWF0d2FybmluZyA9IGdsb2JhbHMoKS5nZXQoJ2Zvcm1hdHdhcm5pbmcnLCBfZm9ybWF0d2FybmluZykKKyAgICBpZiBmb3JtYXR3YXJuaW5nIGlzIG5vdCBfZm9ybWF0d2FybmluZzoKKyAgICAgICAgIyB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKCkgd2FzIHJlcGxhY2VkCisgICAgICAgIHJldHVybiBmb3JtYXR3YXJuaW5nKG1zZy5tZXNzYWdlLCBtc2cuY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubywgbGluZT1tc2cubGluZSkKKyAgICByZXR1cm4gX2Zvcm1hdHdhcm5tc2dfaW1wbChtc2cpCisKIGRlZiBmaWx0ZXJ3YXJuaW5ncyhhY3Rpb24sIG1lc3NhZ2U9IiIsIGNhdGVnb3J5PVdhcm5pbmcsIG1vZHVsZT0iIiwgbGluZW5vPTAsCiAgICAgICAgICAgICAgICAgICAgYXBwZW5kPUZhbHNlKToKICAgICAiIiJJbnNlcnQgYW4gZW50cnkgaW50byB0aGUgbGlzdCBvZiB3YXJuaW5ncyBmaWx0ZXJzIChhdCB0aGUgZnJvbnQpLgpAQCAtMTg1LDcgKzI1OCw3IEBACiAKIAogIyBDb2RlIHR5cGljYWxseSByZXBsYWNlZCBieSBfd2FybmluZ3MKLWRlZiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSk6CitkZWYgd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEsIHNvdXJjZT1Ob25lKToKICAgICAiIiJJc3N1ZSBhIHdhcm5pbmcsIG9yIG1heWJlIGlnbm9yZSBpdCBvciByYWlzZSBhbiBleGNlcHRpb24uIiIiCiAgICAgIyBDaGVjayBpZiBtZXNzYWdlIGlzIGFscmVhZHkgYSBXYXJuaW5nIG9iamVjdAogICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgV2FybmluZyk6CkBAIC0yMzUsMTAgKzMwOCwxMSBAQAogICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUKICAgICByZWdpc3RyeSA9IGdsb2JhbHMuc2V0ZGVmYXVsdCgiX193YXJuaW5ncmVnaXN0cnlfXyIsIHt9KQogICAgIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICBnbG9iYWxzKQorICAgICAgICAgICAgICAgICAgZ2xvYmFscywgc291cmNlKQogCiBkZWYgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywKLSAgICAgICAgICAgICAgICAgIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICAgICAgICAgICAgICAgIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lLAorICAgICAgICAgICAgICAgICAgc291cmNlPU5vbmUpOgogICAgIGxpbmVubyA9IGludChsaW5lbm8pCiAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgIG1vZHVsZSA9IGZpbGVuYW1lIG9yICI8dW5rbm93bj4iCkBAIC0zMDMsMjIgKzM3NywxOCBAQAogICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgYWN0aW9uICglcikgaW4gd2FybmluZ3MuZmlsdGVyczpcbiAlcyIgJQogICAgICAgICAgICAgICAoYWN0aW9uLCBpdGVtKSkKLSAgICBpZiBub3QgY2FsbGFibGUoc2hvd3dhcm5pbmcpOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoIndhcm5pbmdzLnNob3d3YXJuaW5nKCkgbXVzdCBiZSBzZXQgdG8gYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3IgbWV0aG9kIikKICAgICAjIFByaW50IG1lc3NhZ2UgYW5kIGNvbnRleHQKLSAgICBzaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubykKKyAgICBtc2cgPSBXYXJuaW5nTWVzc2FnZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgc291cmNlKQorICAgIF9zaG93d2Fybm1zZyhtc2cpCiAKIAogY2xhc3MgV2FybmluZ01lc3NhZ2Uob2JqZWN0KToKIAotICAgICIiIkhvbGRzIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUgc2hvd3dhcm5pbmcoKSBjYWxsLiIiIgotCiAgICAgX1dBUk5JTkdfREVUQUlMUyA9ICgibWVzc2FnZSIsICJjYXRlZ29yeSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLCAiZmlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAibGluZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAibGluZSIsICJzb3VyY2UiKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsCi0gICAgICAgICAgICAgICAgICAgIGxpbmU9Tm9uZSk6CisgICAgICAgICAgICAgICAgIGxpbmU9Tm9uZSwgc291cmNlPU5vbmUpOgogICAgICAgICBsb2NhbF92YWx1ZXMgPSBsb2NhbHMoKQogICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9XQVJOSU5HX0RFVEFJTFM6CiAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGxvY2FsX3ZhbHVlc1thdHRyXSkKQEAgLTM3NiwxMSArNDQ2LDEyIEBACiAgICAgICAgIHNlbGYuX21vZHVsZS5maWx0ZXJzID0gc2VsZi5fZmlsdGVyc1s6XQogICAgICAgICBzZWxmLl9tb2R1bGUuX2ZpbHRlcnNfbXV0YXRlZCgpCiAgICAgICAgIHNlbGYuX3Nob3d3YXJuaW5nID0gc2VsZi5fbW9kdWxlLnNob3d3YXJuaW5nCisgICAgICAgIHNlbGYuX3Nob3d3YXJubXNnID0gc2VsZi5fbW9kdWxlLl9zaG93d2Fybm1zZwogICAgICAgICBpZiBzZWxmLl9yZWNvcmQ6CiAgICAgICAgICAgICBsb2cgPSBbXQotICAgICAgICAgICAgZGVmIHNob3d3YXJuaW5nKCphcmdzLCAqKmt3YXJncyk6Ci0gICAgICAgICAgICAgICAgbG9nLmFwcGVuZChXYXJuaW5nTWVzc2FnZSgqYXJncywgKiprd2FyZ3MpKQotICAgICAgICAgICAgc2VsZi5fbW9kdWxlLnNob3d3YXJuaW5nID0gc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIGRlZiBzaG93YXJubXNnKG1zZyk6CisgICAgICAgICAgICAgICAgbG9nLmFwcGVuZChtc2cpCisgICAgICAgICAgICBzZWxmLl9tb2R1bGUuX3Nob3d3YXJubXNnID0gc2hvd2Fybm1zZwogICAgICAgICAgICAgcmV0dXJuIGxvZwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKQEAgLTM5MSw2ICs0NjIsNyBAQAogICAgICAgICBzZWxmLl9tb2R1bGUuZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnMKICAgICAgICAgc2VsZi5fbW9kdWxlLl9maWx0ZXJzX211dGF0ZWQoKQogICAgICAgICBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcgPSBzZWxmLl9zaG93d2FybmluZworICAgICAgICBzZWxmLl9tb2R1bGUuX3Nob3d3YXJubXNnID0gc2VsZi5fc2hvd3dhcm5tc2cKIAogCiAjIGZpbHRlcnMgY29udGFpbnMgYSBzZXF1ZW5jZSBvZiBmaWx0ZXIgNS10dXBsZXMKZGlmZiAtLWdpdCBhL0xpYi93YXZlLnB5IGIvTGliL3dhdmUucHkKaW5kZXggOGExMDFlMy4uZjcxZjdlNSAxMDA2NDQKLS0tIGEvTGliL3dhdmUucHkKKysrIGIvTGliL3dhdmUucHkKQEAgLTczLDcgKzczLDcgQEAKIAogaW1wb3J0IGJ1aWx0aW5zCiAKLV9fYWxsX18gPSBbIm9wZW4iLCAib3BlbmZwIiwgIkVycm9yIl0KK19fYWxsX18gPSBbIm9wZW4iLCAib3BlbmZwIiwgIkVycm9yIiwgIldhdmVfcmVhZCIsICJXYXZlX3dyaXRlIl0KIAogY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5IGIvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQppbmRleCA3ZmRkYmU4Li5mNzE1NjNhIDEwMDY0NAotLS0gYS9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CisrKyBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKQEAgLTExLDcgKzExLDYgQEAKICIiIgogCiBmcm9tIGh0dHAuc2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCi1mcm9tIGlvIGltcG9ydCBCdWZmZXJlZFdyaXRlcgogaW1wb3J0IHN5cwogaW1wb3J0IHVybGxpYi5wYXJzZQogZnJvbSB3c2dpcmVmLmhhbmRsZXJzIGltcG9ydCBTaW1wbGVIYW5kbGVyCkBAIC0xMjcsMTcgKzEyNiwxMSBAQAogICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZV9yZXF1ZXN0KCk6ICMgQW4gZXJyb3IgY29kZSBoYXMgYmVlbiBzZW50LCBqdXN0IGV4aXQKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgICMgQXZvaWQgcGFzc2luZyB0aGUgcmF3IGZpbGUgb2JqZWN0IHdmaWxlLCB3aGljaCBjYW4gZG8gcGFydGlhbAotICAgICAgICAjIHdyaXRlcyAoSXNzdWUgMjQyOTEpCi0gICAgICAgIHN0ZG91dCA9IEJ1ZmZlcmVkV3JpdGVyKHNlbGYud2ZpbGUpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGhhbmRsZXIgPSBTZXJ2ZXJIYW5kbGVyKAotICAgICAgICAgICAgICAgIHNlbGYucmZpbGUsIHN0ZG91dCwgc2VsZi5nZXRfc3RkZXJyKCksIHNlbGYuZ2V0X2Vudmlyb24oKQotICAgICAgICAgICAgKQotICAgICAgICAgICAgaGFuZGxlci5yZXF1ZXN0X2hhbmRsZXIgPSBzZWxmICAgICAgIyBiYWNrcG9pbnRlciBmb3IgbG9nZ2luZwotICAgICAgICAgICAgaGFuZGxlci5ydW4oc2VsZi5zZXJ2ZXIuZ2V0X2FwcCgpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc3Rkb3V0LmRldGFjaCgpCisgICAgICAgIGhhbmRsZXIgPSBTZXJ2ZXJIYW5kbGVyKAorICAgICAgICAgICAgc2VsZi5yZmlsZSwgc2VsZi53ZmlsZSwgc2VsZi5nZXRfc3RkZXJyKCksIHNlbGYuZ2V0X2Vudmlyb24oKQorICAgICAgICApCisgICAgICAgIGhhbmRsZXIucmVxdWVzdF9oYW5kbGVyID0gc2VsZiAgICAgICMgYmFja3BvaW50ZXIgZm9yIGxvZ2dpbmcKKyAgICAgICAgaGFuZGxlci5ydW4oc2VsZi5zZXJ2ZXIuZ2V0X2FwcCgpKQogCiAKIApAQCAtMTYzLDEwICsxNTYsOSBAQAogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCi0gICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQotICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCi0gICAgaW1wb3J0IHdlYmJyb3dzZXIKLSAgICB3ZWJicm93c2VyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC94eXo/YWJjJykKLSAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKLSAgICBodHRwZC5zZXJ2ZXJfY2xvc2UoKQorICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKSBhcyBodHRwZDoKKyAgICAgICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iKQorICAgICAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgICAgICB3ZWJicm93c2VyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC94eXo/YWJjJykKKyAgICAgICAgaHR0cGQuaGFuZGxlX3JlcXVlc3QoKSAgIyBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0CmRpZmYgLS1naXQgYS9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5IGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQppbmRleCA2ZDFiMGFiLi42N2I3ZjJiIDEwMDY0NAotLS0gYS9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CisrKyBiL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAiVHJlZUJ1aWxkZXIiLAogICAgICJWRVJTSU9OIiwKICAgICAiWE1MIiwgIlhNTElEIiwKLSAgICAiWE1MUGFyc2VyIiwKKyAgICAiWE1MUGFyc2VyIiwgIlhNTFB1bGxQYXJzZXIiLAogICAgICJyZWdpc3Rlcl9uYW1lc3BhY2UiLAogICAgIF0KIApAQCAtOTUsNiArOTUsNyBAQAogaW1wb3J0IHJlCiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBpbworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29udGV4dGxpYgogCiBmcm9tIC4gaW1wb3J0IEVsZW1lbnRQYXRoCkBAIC0xMjAwLDE2ICsxMjAxLDM3IEBACiAgICAgUmV0dXJucyBhbiBpdGVyYXRvciBwcm92aWRpbmcgKGV2ZW50LCBlbGVtKSBwYWlycy4KIAogICAgICIiIgorICAgICMgVXNlIHRoZSBpbnRlcm5hbCwgdW5kb2N1bWVudGVkIF9wYXJzZXIgYXJndW1lbnQgZm9yIG5vdzsgV2hlbiB0aGUKKyAgICAjIHBhcnNlciBhcmd1bWVudCBvZiBpdGVycGFyc2UgaXMgcmVtb3ZlZCwgdGhpcyBjYW4gYmUga2lsbGVkLgorICAgIHB1bGxwYXJzZXIgPSBYTUxQdWxsUGFyc2VyKGV2ZW50cz1ldmVudHMsIF9wYXJzZXI9cGFyc2VyKQorICAgIGRlZiBpdGVyYXRvcigpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gcHVsbHBhcnNlci5yZWFkX2V2ZW50cygpCisgICAgICAgICAgICAgICAgIyBsb2FkIGV2ZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZCgxNiAqIDEwMjQpCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcHVsbHBhcnNlci5mZWVkKGRhdGEpCisgICAgICAgICAgICByb290ID0gcHVsbHBhcnNlci5fY2xvc2VfYW5kX3JldHVybl9yb290KCkKKyAgICAgICAgICAgIHlpZWxkIGZyb20gcHVsbHBhcnNlci5yZWFkX2V2ZW50cygpCisgICAgICAgICAgICBpdC5yb290ID0gcm9vdAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgY2xvc2Vfc291cmNlOgorICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCisKKyAgICBjbGFzcyBJdGVyUGFyc2VJdGVyYXRvcihjb2xsZWN0aW9ucy5JdGVyYXRvcik6CisgICAgICAgIF9fbmV4dF9fID0gaXRlcmF0b3IoKS5fX25leHRfXworICAgIGl0ID0gSXRlclBhcnNlSXRlcmF0b3IoKQorICAgIGl0LnJvb3QgPSBOb25lCisgICAgZGVsIGl0ZXJhdG9yLCBJdGVyUGFyc2VJdGVyYXRvcgorCiAgICAgY2xvc2Vfc291cmNlID0gRmFsc2UKICAgICBpZiBub3QgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CiAgICAgICAgIHNvdXJjZSA9IG9wZW4oc291cmNlLCAicmIiKQogICAgICAgICBjbG9zZV9zb3VyY2UgPSBUcnVlCi0gICAgdHJ5OgotICAgICAgICByZXR1cm4gX0l0ZXJQYXJzZUl0ZXJhdG9yKHNvdXJjZSwgZXZlbnRzLCBwYXJzZXIsIGNsb3NlX3NvdXJjZSkKLSAgICBleGNlcHQ6Ci0gICAgICAgIGlmIGNsb3NlX3NvdXJjZToKLSAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCi0gICAgICAgIHJhaXNlCisKKyAgICByZXR1cm4gaXQKIAogCiBjbGFzcyBYTUxQdWxsUGFyc2VyOgpAQCAtMTIxOSw5ICsxMjQxLDcgQEAKICAgICAgICAgIyB1cG9uIGluIHVzZXIgY29kZS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNzc0MSBmb3IgbW9yZSBkZXRhaWxzLgogCi0gICAgICAgICMgX2VsZW1lbnR0cmVlLmMgZXhwZWN0cyBhIGxpc3QsIG5vdCBhIGRlcXVlCi0gICAgICAgIHNlbGYuX2V2ZW50c19xdWV1ZSA9IFtdCi0gICAgICAgIHNlbGYuX2luZGV4ID0gMAorICAgICAgICBzZWxmLl9ldmVudHNfcXVldWUgPSBjb2xsZWN0aW9ucy5kZXF1ZSgpCiAgICAgICAgIHNlbGYuX3BhcnNlciA9IF9wYXJzZXIgb3IgWE1MUGFyc2VyKHRhcmdldD1UcmVlQnVpbGRlcigpKQogICAgICAgICAjIHdpcmUgdXAgdGhlIHBhcnNlciBmb3IgZXZlbnQgcmVwb3J0aW5nCiAgICAgICAgIGlmIGV2ZW50cyBpcyBOb25lOgpAQCAtMTI1OSw2NCArMTI3OSwxNCBAQAogICAgICAgICByZXRyaWV2ZWQgZnJvbSB0aGUgaXRlcmF0b3IuCiAgICAgICAgICIiIgogICAgICAgICBldmVudHMgPSBzZWxmLl9ldmVudHNfcXVldWUKLSAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgIGluZGV4ID0gc2VsZi5faW5kZXgKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBldmVudCA9IGV2ZW50c1tzZWxmLl9pbmRleF0KLSAgICAgICAgICAgICAgICAjIEF2b2lkIHJldGFpbmluZyByZWZlcmVuY2VzIHRvIHBhc3QgZXZlbnRzCi0gICAgICAgICAgICAgICAgZXZlbnRzW3NlbGYuX2luZGV4XSA9IE5vbmUKLSAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpbmRleCArPSAxCi0gICAgICAgICAgICAjIENvbXBhY3QgdGhlIGxpc3QgaW4gYSBPKDEpIGFtb3J0aXplZCBmYXNoaW9uCi0gICAgICAgICAgICAjIEFzIG5vdGVkIGFib3ZlLCBfZWxlbWVudHJlZS5jIG5lZWRzIGEgbGlzdCwgbm90IGEgZGVxdWUKLSAgICAgICAgICAgIGlmIGluZGV4ICogMiA+PSBsZW4oZXZlbnRzKToKLSAgICAgICAgICAgICAgICBldmVudHNbOmluZGV4XSA9IFtdCi0gICAgICAgICAgICAgICAgc2VsZi5faW5kZXggPSAwCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ID0gaW5kZXgKKyAgICAgICAgd2hpbGUgZXZlbnRzOgorICAgICAgICAgICAgZXZlbnQgPSBldmVudHMucG9wbGVmdCgpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV2ZW50LCBFeGNlcHRpb24pOgogICAgICAgICAgICAgICAgIHJhaXNlIGV2ZW50CiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHlpZWxkIGV2ZW50CiAKIAotY2xhc3MgX0l0ZXJQYXJzZUl0ZXJhdG9yOgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgZXZlbnRzLCBwYXJzZXIsIGNsb3NlX3NvdXJjZT1GYWxzZSk6Ci0gICAgICAgICMgVXNlIHRoZSBpbnRlcm5hbCwgdW5kb2N1bWVudGVkIF9wYXJzZXIgYXJndW1lbnQgZm9yIG5vdzsgV2hlbiB0aGUKLSAgICAgICAgIyBwYXJzZXIgYXJndW1lbnQgb2YgaXRlcnBhcnNlIGlzIHJlbW92ZWQsIHRoaXMgY2FuIGJlIGtpbGxlZC4KLSAgICAgICAgc2VsZi5fcGFyc2VyID0gWE1MUHVsbFBhcnNlcihldmVudHM9ZXZlbnRzLCBfcGFyc2VyPXBhcnNlcikKLSAgICAgICAgc2VsZi5fZmlsZSA9IHNvdXJjZQotICAgICAgICBzZWxmLl9jbG9zZV9maWxlID0gY2xvc2Vfc291cmNlCi0gICAgICAgIHNlbGYucm9vdCA9IHNlbGYuX3Jvb3QgPSBOb25lCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuX3BhcnNlci5yZWFkX2V2ZW50cygpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQKLSAgICAgICAgICAgICAgICBpZiBzZWxmLl9wYXJzZXIuX3BhcnNlciBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICMgbG9hZCBldmVudCBidWZmZXIKLSAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKDE2ICogMTAyNCkKLSAgICAgICAgICAgICAgICBpZiBkYXRhOgotICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZXIuZmVlZChkYXRhKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBzZWxmLl9wYXJzZXIuX2Nsb3NlX2FuZF9yZXR1cm5fcm9vdCgpCi0gICAgICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLl9yb290Ci0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGU6Ci0gICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCi0gICAgICAgICAgICByYWlzZQotICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlOgotICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCi0gICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYKLQotCiBkZWYgWE1MKHRleHQsIHBhcnNlcj1Ob25lKToKICAgICAiIiJQYXJzZSBYTUwgZG9jdW1lbnQgZnJvbSBzdHJpbmcgY29uc3RhbnQuCiAKZGlmZiAtLWdpdCBhL0xpYi94bWxycGMvY2xpZW50LnB5IGIvTGliL3htbHJwYy9jbGllbnQucHkKaW5kZXggYmJmOWVlNi4uNTgxYTNiOSAxMDA2NDQKLS0tIGEvTGliL3htbHJwYy9jbGllbnQucHkKKysrIGIvTGliL3htbHJwYy9jbGllbnQucHkKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIHJldHVybiBzLnJlcGxhY2UoIj4iLCAiJmd0OyIsKQogCiAjIHVzZWQgaW4gVXNlci1BZ2VudCBoZWFkZXIgc2VudAotX192ZXJzaW9uX18gPSBzeXMudmVyc2lvbls6M10KK19fdmVyc2lvbl9fID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAKICMgeG1scnBjIGludGVnZXIgbGltaXRzCiBNQVhJTlQgPSAgMioqMzEtMQpkaWZmIC0tZ2l0IGEvTGliL3htbHJwYy9zZXJ2ZXIucHkgYi9MaWIveG1scnBjL3NlcnZlci5weQppbmRleCA1YjViZjdjLi43ODcyOGYyIDEwMDY0NAotLS0gYS9MaWIveG1scnBjL3NlcnZlci5weQorKysgYi9MaWIveG1scnBjL3NlcnZlci5weQpAQCAtOTcxLDE2ICs5NzEsMTUgQEAKICAgICAgICAgICAgIGRlZiBnZXRDdXJyZW50VGltZSgpOgogICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5kYXRldGltZS5ub3coKQogCi0gICAgc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCi0gICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQotICAgIHByaW50KCdTZXJ2aW5nIFhNTC1SUEMgb24gbG9jYWxob3N0IHBvcnQgODAwMCcpCi0gICAgcHJpbnQoJ0l0IGlzIGFkdmlzYWJsZSB0byBydW4gdGhpcyBleGFtcGxlIHNlcnZlciB3aXRoaW4gYSBzZWN1cmUsIGNsb3NlZCBuZXR3b3JrLicpCi0gICAgdHJ5OgotICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCi0gICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKLSAgICAgICAgc2VydmVyLnNlcnZlcl9jbG9zZSgpCi0gICAgICAgIHN5cy5leGl0KDApCisgICAgd2l0aCBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkgYXMgc2VydmVyOgorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCisgICAgICAgIHByaW50KCdTZXJ2aW5nIFhNTC1SUEMgb24gbG9jYWxob3N0IHBvcnQgODAwMCcpCisgICAgICAgIHByaW50KCdJdCBpcyBhZHZpc2FibGUgdG8gcnVuIHRoaXMgZXhhbXBsZSBzZXJ2ZXIgd2l0aGluIGEgc2VjdXJlLCBjbG9zZWQgbmV0d29yay4nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKZGlmZiAtLWdpdCBhL0xpYi96aXBmaWxlLnB5IGIvTGliL3ppcGZpbGUucHkKaW5kZXggNTZhMjQ3OS4uOGRkMDY0YSAxMDA2NDQKLS0tIGEvTGliL3ppcGZpbGUucHkKKysrIGIvTGliL3ppcGZpbGUucHkKQEAgLTM3MSw3ICszNzEsNyBAQAogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIGZpbGVtb2RlPSVyJyAlIHN0YXQuZmlsZW1vZGUoaGkpKQogICAgICAgICBpZiBsbzoKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyBleHRlcm5hbF9hdHRyPSUjeCcgJSBsbykKLSAgICAgICAgaXNkaXIgPSBzZWxmLmZpbGVuYW1lWy0xOl0gPT0gJy8nCisgICAgICAgIGlzZGlyID0gc2VsZi5pc19kaXIoKQogICAgICAgICBpZiBub3QgaXNkaXIgb3Igc2VsZi5maWxlX3NpemU6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgZmlsZV9zaXplPSVyJyAlIHNlbGYuZmlsZV9zaXplKQogICAgICAgICBpZiAoKG5vdCBpc2RpciBvciBzZWxmLmNvbXByZXNzX3NpemUpIGFuZApAQCAtNDY5LDYgKzQ2OSw0MiBAQAogCiAgICAgICAgICAgICBleHRyYSA9IGV4dHJhW2xuKzQ6XQogCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fZmlsZShjbHMsIGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gYXBwcm9wcmlhdGUgWmlwSW5mbyBmb3IgYSBmaWxlIG9uIHRoZSBmaWxlc3lzdGVtLgorCisgICAgICAgIGZpbGVuYW1lIHNob3VsZCBiZSB0aGUgcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IG9uIHRoZSBmaWxlc3lzdGVtLgorCisgICAgICAgIGFyY25hbWUgaXMgdGhlIG5hbWUgd2hpY2ggaXQgd2lsbCBoYXZlIHdpdGhpbiB0aGUgYXJjaGl2ZSAoYnkgZGVmYXVsdCwKKyAgICAgICAgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIGZpbGVuYW1lLCBidXQgd2l0aG91dCBhIGRyaXZlIGxldHRlciBhbmQgd2l0aAorICAgICAgICBsZWFkaW5nIHBhdGggc2VwYXJhdG9ycyByZW1vdmVkKS4KKyAgICAgICAgIiIiCisgICAgICAgIHN0ID0gb3Muc3RhdChmaWxlbmFtZSkKKyAgICAgICAgaXNkaXIgPSBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSkKKyAgICAgICAgbXRpbWUgPSB0aW1lLmxvY2FsdGltZShzdC5zdF9tdGltZSkKKyAgICAgICAgZGF0ZV90aW1lID0gbXRpbWVbMDo2XQorICAgICAgICAjIENyZWF0ZSBaaXBJbmZvIGluc3RhbmNlIHRvIHN0b3JlIGZpbGUgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgYXJjbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKVsxXSkKKyAgICAgICAgd2hpbGUgYXJjbmFtZVswXSBpbiAob3Muc2VwLCBvcy5hbHRzZXApOgorICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWVbMTpdCisgICAgICAgIGlmIGlzZGlyOgorICAgICAgICAgICAgYXJjbmFtZSArPSAnLycKKyAgICAgICAgemluZm8gPSBjbHMoYXJjbmFtZSwgZGF0ZV90aW1lKQorICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gKHN0LnN0X21vZGUgJiAweEZGRkYpIDw8IDE2ICAjIFVuaXggYXR0cmlidXRlcworICAgICAgICBpZiBpc2RpcjoKKyAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IDAKKyAgICAgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgfD0gMHgxMCAgIyBNUy1ET1MgZGlyZWN0b3J5IGZsYWcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IHN0LnN0X3NpemUKKworICAgICAgICByZXR1cm4gemluZm8KKworICAgIGRlZiBpc19kaXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoaXMgYXJjaGl2ZSBtZW1iZXIgaXMgYSBkaXJlY3RvcnkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lWy0xXSA9PSAnLycKKwogCiBjbGFzcyBfWmlwRGVjcnlwdGVyOgogICAgICIiIkNsYXNzIHRvIGhhbmRsZSBkZWNyeXB0aW9uIG9mIGZpbGVzIHN0b3JlZCB3aXRoaW4gYSBaSVAgYXJjaGl2ZS4KQEAgLTY1MSwxNCArNjg3LDE5IEBACiAKIAogY2xhc3MgX1NoYXJlZEZpbGU6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIHBvcywgY2xvc2UsIGxvY2spOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBwb3MsIGNsb3NlLCBsb2NrLCB3cml0aW5nKToKICAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKICAgICAgICAgc2VsZi5fcG9zID0gcG9zCiAgICAgICAgIHNlbGYuX2Nsb3NlID0gY2xvc2UKICAgICAgICAgc2VsZi5fbG9jayA9IGxvY2sKKyAgICAgICAgc2VsZi5fd3JpdGluZyA9IHdyaXRpbmcKIAogICAgIGRlZiByZWFkKHNlbGYsIG49LTEpOgogICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CisgICAgICAgICAgICBpZiBzZWxmLl93cml0aW5nKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCByZWFkIGZyb20gdGhlIFpJUCBmaWxlIHdoaWxlIHRoZXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpcyBhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhlIHdyaXRpbmcgaGFuZGxlIGJlZm9yZSB0cnlpbmcgdG8gcmVhZC4iKQogICAgICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX3BvcykKICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQobikKICAgICAgICAgICAgIHNlbGYuX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCkBAIC03MDIsOSArNzQzLDYgQEAKICAgICAjIFJlYWQgZnJvbSBjb21wcmVzc2VkIGZpbGVzIGluIDRrIGJsb2Nrcy4KICAgICBNSU5fUkVBRF9TSVpFID0gNDA5NgogCi0gICAgIyBTZWFyY2ggZm9yIHVuaXZlcnNhbCBuZXdsaW5lcyBvciBsaW5lIGNodW5rcy4KLSAgICBQQVRURVJOID0gcmUuY29tcGlsZShicideKD9QPGNodW5rPlteXHJcbl0rKXwoP1A8bmV3bGluZT5cbnxcclxuPyknKQotCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUsIHppcGluZm8sIGRlY3J5cHRlcj1Ob25lLAogICAgICAgICAgICAgICAgICBjbG9zZV9maWxlb2JqPUZhbHNlKToKICAgICAgICAgc2VsZi5fZmlsZW9iaiA9IGZpbGVvYmoKQEAgLTcyMSw3ICs3NTksNiBAQAogICAgICAgICBzZWxmLl9yZWFkYnVmZmVyID0gYicnCiAgICAgICAgIHNlbGYuX29mZnNldCA9IDAKIAotICAgICAgICBzZWxmLl91bml2ZXJzYWwgPSAnVScgaW4gbW9kZQogICAgICAgICBzZWxmLm5ld2xpbmVzID0gTm9uZQogCiAgICAgICAgICMgQWRqdXN0IHJlYWQgc2l6ZSBmb3IgZW5jcnlwdGVkIGZpbGVzIHNpbmNlIHRoZSBmaXJzdCAxMiBieXRlcwpAQCAtNzU4LDcgKzc5NSw3IEBACiAgICAgICAgIElmIGxpbWl0IGlzIHNwZWNpZmllZCwgYXQgbW9zdCBsaW1pdCBieXRlcyB3aWxsIGJlIHJlYWQuCiAgICAgICAgICIiIgogCi0gICAgICAgIGlmIG5vdCBzZWxmLl91bml2ZXJzYWwgYW5kIGxpbWl0IDwgMDoKKyAgICAgICAgaWYgbGltaXQgPCAwOgogICAgICAgICAgICAgIyBTaG9ydGN1dCBjb21tb24gY2FzZSAtIG5ld2xpbmUgZm91bmQgaW4gYnVmZmVyLgogICAgICAgICAgICAgaSA9IHNlbGYuX3JlYWRidWZmZXIuZmluZChiJ1xuJywgc2VsZi5fb2Zmc2V0KSArIDEKICAgICAgICAgICAgIGlmIGkgPiAwOgpAQCAtNzY2LDQxICs4MDMsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCA9IGkKICAgICAgICAgICAgICAgICByZXR1cm4gbGluZQogCi0gICAgICAgIGlmIG5vdCBzZWxmLl91bml2ZXJzYWw6Ci0gICAgICAgICAgICByZXR1cm4gaW8uQnVmZmVyZWRJT0Jhc2UucmVhZGxpbmUoc2VsZiwgbGltaXQpCi0KLSAgICAgICAgbGluZSA9IGInJwotICAgICAgICB3aGlsZSBsaW1pdCA8IDAgb3IgbGVuKGxpbmUpIDwgbGltaXQ6Ci0gICAgICAgICAgICByZWFkYWhlYWQgPSBzZWxmLnBlZWsoMikKLSAgICAgICAgICAgIGlmIHJlYWRhaGVhZCA9PSBiJyc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKLQotICAgICAgICAgICAgIwotICAgICAgICAgICAgIyBTZWFyY2ggZm9yIHVuaXZlcnNhbCBuZXdsaW5lcyBvciBsaW5lIGNodW5rcy4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgVGhlIHBhdHRlcm4gcmV0dXJucyBlaXRoZXIgYSBsaW5lIGNodW5rIG9yIGEgbmV3bGluZSwgYnV0IG5vdAotICAgICAgICAgICAgIyBib3RoLiBDb21iaW5lZCB3aXRoIHBlZWsoMiksIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlIHNlcXVlbmNlCi0gICAgICAgICAgICAjICdcclxuJyBpcyBhbHdheXMgcmV0cmlldmVkIGNvbXBsZXRlbHkgYW5kIG5ldmVyIHNwbGl0IGludG8KLSAgICAgICAgICAgICMgc2VwYXJhdGUgbmV3bGluZXMgLSAnXHInLCAnXG4nIGR1ZSB0byBjb2luY2lkZW50YWwgcmVhZGFoZWFkcy4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgIG1hdGNoID0gc2VsZi5QQVRURVJOLnNlYXJjaChyZWFkYWhlYWQpCi0gICAgICAgICAgICBuZXdsaW5lID0gbWF0Y2guZ3JvdXAoJ25ld2xpbmUnKQotICAgICAgICAgICAgaWYgbmV3bGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBpZiBzZWxmLm5ld2xpbmVzIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZXMgPSBbXQotICAgICAgICAgICAgICAgIGlmIG5ld2xpbmUgbm90IGluIHNlbGYubmV3bGluZXM6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZXMuYXBwZW5kKG5ld2xpbmUpCi0gICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ICs9IGxlbihuZXdsaW5lKQotICAgICAgICAgICAgICAgIHJldHVybiBsaW5lICsgYidcbicKLQotICAgICAgICAgICAgY2h1bmsgPSBtYXRjaC5ncm91cCgnY2h1bmsnKQotICAgICAgICAgICAgaWYgbGltaXQgPj0gMDoKLSAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rWzogbGltaXQgLSBsZW4obGluZSldCi0KLSAgICAgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4oY2h1bmspCi0gICAgICAgICAgICBsaW5lICs9IGNodW5rCi0KLSAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgcmV0dXJuIGlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRsaW5lKHNlbGYsIGxpbWl0KQogCiAgICAgZGVmIHBlZWsoc2VsZiwgbj0xKToKICAgICAgICAgIiIiUmV0dXJucyBidWZmZXJlZCBieXRlcyB3aXRob3V0IGFkdmFuY2luZyB0aGUgcG9zaXRpb24uIiIiCkBAIC05NTgsNiArOTYxLDc2IEBACiAgICAgICAgICAgICBzdXBlcigpLmNsb3NlKCkKIAogCitjbGFzcyBfWmlwV3JpdGVGaWxlKGlvLkJ1ZmZlcmVkSU9CYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgemYsIHppbmZvLCB6aXA2NCk6CisgICAgICAgIHNlbGYuX3ppbmZvID0gemluZm8KKyAgICAgICAgc2VsZi5femlwNjQgPSB6aXA2NAorICAgICAgICBzZWxmLl96aXBmaWxlID0gemYKKyAgICAgICAgc2VsZi5fY29tcHJlc3NvciA9IF9nZXRfY29tcHJlc3Nvcih6aW5mby5jb21wcmVzc190eXBlKQorICAgICAgICBzZWxmLl9maWxlX3NpemUgPSAwCisgICAgICAgIHNlbGYuX2NvbXByZXNzX3NpemUgPSAwCisgICAgICAgIHNlbGYuX2NyYyA9IDAKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfZmlsZW9iaihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGZpbGUuZnAKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgbmJ5dGVzID0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYuX2ZpbGVfc2l6ZSArPSBuYnl0ZXMKKyAgICAgICAgc2VsZi5fY3JjID0gY3JjMzIoZGF0YSwgc2VsZi5fY3JjKQorICAgICAgICBpZiBzZWxmLl9jb21wcmVzc29yOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2NvbXByZXNzb3IuY29tcHJlc3MoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuX2NvbXByZXNzX3NpemUgKz0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYuX2ZpbGVvYmoud3JpdGUoZGF0YSkKKyAgICAgICAgcmV0dXJuIG5ieXRlcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzdXBlcigpLmNsb3NlKCkKKyAgICAgICAgIyBGbHVzaCBhbnkgZGF0YSBmcm9tIHRoZSBjb21wcmVzc29yLCBhbmQgdXBkYXRlIGhlYWRlciBpbmZvCisgICAgICAgIGlmIHNlbGYuX2NvbXByZXNzb3I6CisgICAgICAgICAgICBidWYgPSBzZWxmLl9jb21wcmVzc29yLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX2NvbXByZXNzX3NpemUgKz0gbGVuKGJ1ZikKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmoud3JpdGUoYnVmKQorICAgICAgICAgICAgc2VsZi5femluZm8uY29tcHJlc3Nfc2l6ZSA9IHNlbGYuX2NvbXByZXNzX3NpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3ppbmZvLmNvbXByZXNzX3NpemUgPSBzZWxmLl9maWxlX3NpemUKKyAgICAgICAgc2VsZi5femluZm8uQ1JDID0gc2VsZi5fY3JjCisgICAgICAgIHNlbGYuX3ppbmZvLmZpbGVfc2l6ZSA9IHNlbGYuX2ZpbGVfc2l6ZQorCisgICAgICAgICMgV3JpdGUgdXBkYXRlZCBoZWFkZXIgaW5mbworICAgICAgICBpZiBzZWxmLl96aW5mby5mbGFnX2JpdHMgJiAweDA4OgorICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQorICAgICAgICAgICAgZm10ID0gJzxMUVEnIGlmIHNlbGYuX3ppcDY0IGVsc2UgJzxMTEwnCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgc2VsZi5femluZm8uQ1JDLAorICAgICAgICAgICAgICAgIHNlbGYuX3ppbmZvLmNvbXByZXNzX3NpemUsIHNlbGYuX3ppbmZvLmZpbGVfc2l6ZSkpCisgICAgICAgICAgICBzZWxmLl96aXBmaWxlLnN0YXJ0X2RpciA9IHNlbGYuX2ZpbGVvYmoudGVsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5femlwNjQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZmlsZV9zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignRmlsZSBzaXplIHVuZXhwZWN0ZWRseSBleGNlZWRlZCBaSVA2NCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGltaXQnKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdDb21wcmVzc2VkIHNpemUgdW5leHBlY3RlZGx5IGV4Y2VlZGVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaSVA2NCBsaW1pdCcpCisgICAgICAgICAgICAjIFNlZWsgYmFja3dhcmRzIGFuZCB3cml0ZSBmaWxlIGhlYWRlciAod2hpY2ggd2lsbCBub3cgaW5jbHVkZQorICAgICAgICAgICAgIyBjb3JyZWN0IENSQyBhbmQgZmlsZSBzaXplcykKKworICAgICAgICAgICAgIyBQcmVzZXJ2ZSBjdXJyZW50IHBvc2l0aW9uIGluIGZpbGUKKyAgICAgICAgICAgIHNlbGYuX3ppcGZpbGUuc3RhcnRfZGlyID0gc2VsZi5fZmlsZW9iai50ZWxsKCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmouc2VlayhzZWxmLl96aW5mby5oZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5fZmlsZW9iai53cml0ZShzZWxmLl96aW5mby5GaWxlSGVhZGVyKHNlbGYuX3ppcDY0KSkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmouc2VlayhzZWxmLl96aXBmaWxlLnN0YXJ0X2RpcikKKworICAgICAgICBzZWxmLl96aXBmaWxlLl93cml0aW5nID0gRmFsc2UKKworICAgICAgICAjIFN1Y2Nlc3NmdWxseSB3cml0dGVuOiBBZGQgZmlsZSB0byBvdXIgY2FjaGVzCisgICAgICAgIHNlbGYuX3ppcGZpbGUuZmlsZWxpc3QuYXBwZW5kKHNlbGYuX3ppbmZvKQorICAgICAgICBzZWxmLl96aXBmaWxlLk5hbWVUb0luZm9bc2VsZi5femluZm8uZmlsZW5hbWVdID0gc2VsZi5femluZm8KKwogY2xhc3MgWmlwRmlsZToKICAgICAiIiIgQ2xhc3Mgd2l0aCBtZXRob2RzIHRvIG9wZW4sIHJlYWQsIHdyaXRlLCBjbG9zZSwgbGlzdCB6aXAgZmlsZXMuCiAKQEAgLTEwMjAsNiArMTA5Myw3IEBACiAgICAgICAgIHNlbGYuX2ZpbGVSZWZDbnQgPSAxCiAgICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQogICAgICAgICBzZWxmLl9zZWVrYWJsZSA9IFRydWUKKyAgICAgICAgc2VsZi5fd3JpdGluZyA9IEZhbHNlCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgbW9kZSA9PSAncic6CkBAIC0xMjMyLDMwICsxMzA2LDU1IEBACiAgICAgICAgIHdpdGggc2VsZi5vcGVuKG5hbWUsICJyIiwgcHdkKSBhcyBmcDoKICAgICAgICAgICAgIHJldHVybiBmcC5yZWFkKCkKIAotICAgIGRlZiBvcGVuKHNlbGYsIG5hbWUsIG1vZGU9InIiLCBwd2Q9Tm9uZSk6Ci0gICAgICAgICIiIlJldHVybiBmaWxlLWxpa2Ugb2JqZWN0IGZvciAnbmFtZScuIiIiCi0gICAgICAgIGlmIG1vZGUgbm90IGluICgiciIsICJVIiwgInJVIik6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ29wZW4oKSByZXF1aXJlcyBtb2RlICJyIiwgIlUiLCBvciAiclUiJykKLSAgICAgICAgaWYgJ1UnIGluIG1vZGU6Ci0gICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIidVJyBtb2RlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgZGVmIG9wZW4oc2VsZiwgbmFtZSwgbW9kZT0iciIsIHB3ZD1Ob25lLCAqLCBmb3JjZV96aXA2ND1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBmaWxlLWxpa2Ugb2JqZWN0IGZvciAnbmFtZScuCisKKyAgICAgICAgbmFtZSBpcyBhIHN0cmluZyBmb3IgdGhlIGZpbGUgbmFtZSB3aXRoaW4gdGhlIFpJUCBmaWxlLCBvciBhIFppcEluZm8KKyAgICAgICAgb2JqZWN0LgorCisgICAgICAgIG1vZGUgc2hvdWxkIGJlICdyJyB0byByZWFkIGEgZmlsZSBhbHJlYWR5IGluIHRoZSBaSVAgZmlsZSwgb3IgJ3cnIHRvCisgICAgICAgIHdyaXRlIHRvIGEgZmlsZSBuZXdseSBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KKworICAgICAgICBwd2QgaXMgdGhlIHBhc3N3b3JkIHRvIGRlY3J5cHQgZmlsZXMgKG9ubHkgdXNlZCBmb3IgcmVhZGluZykuCisKKyAgICAgICAgV2hlbiB3cml0aW5nLCBpZiB0aGUgZmlsZSBzaXplIGlzIG5vdCBrbm93biBpbiBhZHZhbmNlIGJ1dCBtYXkgZXhjZWVkCisgICAgICAgIDIgR2lCLCBwYXNzIGZvcmNlX3ppcDY0IHRvIHVzZSB0aGUgWklQNjQgZm9ybWF0LCB3aGljaCBjYW4gaGFuZGxlIGxhcmdlCisgICAgICAgIGZpbGVzLiAgSWYgdGhlIHNpemUgaXMga25vd24gaW4gYWR2YW5jZSwgaXQgaXMgYmVzdCB0byBwYXNzIGEgWmlwSW5mbworICAgICAgICBpbnN0YW5jZSBmb3IgbmFtZSwgd2l0aCB6aW5mby5maWxlX3NpemUgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbW9kZSBub3QgaW4geyJyIiwgIncifToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignb3BlbigpIHJlcXVpcmVzIG1vZGUgInIiIG9yICJ3IicpCiAgICAgICAgIGlmIHB3ZCBhbmQgbm90IGlzaW5zdGFuY2UocHdkLCBieXRlcyk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInB3ZDogZXhwZWN0ZWQgYnl0ZXMsIGdvdCAlcyIgJSB0eXBlKHB3ZCkpCisgICAgICAgIGlmIHB3ZCBhbmQgKG1vZGUgPT0gInciKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInB3ZCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgcmVhZGluZyBmaWxlcyIpCiAgICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAotICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHJlYWQgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQorICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHVzZSBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCiAKICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBpbmZvIG9iamVjdAogICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIFppcEluZm8pOgogICAgICAgICAgICAgIyAnbmFtZScgaXMgYWxyZWFkeSBhbiBpbmZvIG9iamVjdAogICAgICAgICAgICAgemluZm8gPSBuYW1lCisgICAgICAgIGVsaWYgbW9kZSA9PSAndyc6CisgICAgICAgICAgICB6aW5mbyA9IFppcEluZm8obmFtZSkKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAjIEdldCBpbmZvIG9iamVjdCBmb3IgbmFtZQogICAgICAgICAgICAgemluZm8gPSBzZWxmLmdldGluZm8obmFtZSkKIAorICAgICAgICBpZiBtb2RlID09ICd3JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vcGVuX3RvX3dyaXRlKHppbmZvLCBmb3JjZV96aXA2ND1mb3JjZV96aXA2NCkKKworICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCByZWFkIGZyb20gdGhlIFpJUCBmaWxlIHdoaWxlIHRoZXJlICIKKyAgICAgICAgICAgICAgICAgICAgImlzIGFuIG9wZW4gd3JpdGluZyBoYW5kbGUgb24gaXQuICIKKyAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSB3cml0aW5nIGhhbmRsZSBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQuIikKKworICAgICAgICAjIE9wZW4gZm9yIHJlYWRpbmc6CiAgICAgICAgIHNlbGYuX2ZpbGVSZWZDbnQgKz0gMQotICAgICAgICB6ZWZfZmlsZSA9IF9TaGFyZWRGaWxlKHNlbGYuZnAsIHppbmZvLmhlYWRlcl9vZmZzZXQsIHNlbGYuX2ZwY2xvc2UsIHNlbGYuX2xvY2spCisgICAgICAgIHplZl9maWxlID0gX1NoYXJlZEZpbGUoc2VsZi5mcCwgemluZm8uaGVhZGVyX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcGNsb3NlLCBzZWxmLl9sb2NrLCBsYW1iZGE6IHNlbGYuX3dyaXRpbmcpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgICMgU2tpcCB0aGUgZmlsZSBoZWFkZXI6CiAgICAgICAgICAgICBmaGVhZGVyID0gemVmX2ZpbGUucmVhZChzaXplRmlsZUhlYWRlcikKQEAgLTEzMjAsNiArMTQxOSw0OSBAQAogICAgICAgICAgICAgemVmX2ZpbGUuY2xvc2UoKQogICAgICAgICAgICAgcmFpc2UKIAorICAgIGRlZiBfb3Blbl90b193cml0ZShzZWxmLCB6aW5mbywgZm9yY2VfemlwNjQ9RmFsc2UpOgorICAgICAgICBpZiBmb3JjZV96aXA2NCBhbmQgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJmb3JjZV96aXA2NCBpcyBUcnVlLCBidXQgYWxsb3daaXA2NCB3YXMgRmFsc2Ugd2hlbiBvcGVuaW5nICIKKyAgICAgICAgICAgICAgICAidGhlIFpJUCBmaWxlLiIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3Qgd3JpdGUgdG8gdGhlIFpJUCBmaWxlIHdoaWxlIHRoZXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5vdGhlciB3cml0ZSBoYW5kbGUgb3BlbiBvbiBpdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGUgZmlyc3QgaGFuZGxlIGJlZm9yZSBvcGVuaW5nIGFub3RoZXIuIikKKworICAgICAgICAjIFNpemVzIGFuZCBDUkMgYXJlIG92ZXJ3cml0dGVuIHdpdGggY29ycmVjdCBkYXRhIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGZpbGUKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoemluZm8sICdmaWxlX3NpemUnKToKKyAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IDAKKyAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgemluZm8uQ1JDID0gMAorCisgICAgICAgIHppbmZvLmZsYWdfYml0cyA9IDB4MDAKKyAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfTFpNQToKKyAgICAgICAgICAgICMgQ29tcHJlc3NlZCBkYXRhIGluY2x1ZGVzIGFuIGVuZC1vZi1zdHJlYW0gKEVPUykgbWFya2VyCisgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwMgorICAgICAgICBpZiBub3Qgc2VsZi5fc2Vla2FibGU6CisgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwOAorCisgICAgICAgIGlmIG5vdCB6aW5mby5leHRlcm5hbF9hdHRyOgorICAgICAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IDBvNjAwIDw8IDE2ICAjIHBlcm1pc3Npb25zOiA/cnctLS0tLS0tCisKKyAgICAgICAgIyBDb21wcmVzc2VkIHNpemUgY2FuIGJlIGxhcmdlciB0aGFuIHVuY29tcHJlc3NlZCBzaXplCisgICAgICAgIHppcDY0ID0gc2VsZi5fYWxsb3daaXA2NCBhbmQgXAorICAgICAgICAgICAgICAgIChmb3JjZV96aXA2NCBvciB6aW5mby5maWxlX3NpemUgKiAxLjA1ID4gWklQNjRfTElNSVQpCisKKyAgICAgICAgaWYgc2VsZi5fc2Vla2FibGU6CisgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCisgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKQorCisgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKworICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQorCisgICAgICAgIHNlbGYuX3dyaXRpbmcgPSBUcnVlCisgICAgICAgIHJldHVybiBfWmlwV3JpdGVGaWxlKHNlbGYsIHppbmZvLCB6aXA2NCkKKwogICAgIGRlZiBleHRyYWN0KHNlbGYsIG1lbWJlciwgcGF0aD1Ob25lLCBwd2Q9Tm9uZSk6CiAgICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKICAgICAgICAgICAgdXNpbmcgaXRzIGZ1bGwgbmFtZS4gSXRzIGZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIGFjY3VyYXRlbHkKQEAgLTEzODksNyArMTUzMSw3IEBACiAgICAgICAgIGlmIHVwcGVyZGlycyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVwcGVyZGlycyk6CiAgICAgICAgICAgICBvcy5tYWtlZGlycyh1cHBlcmRpcnMpCiAKLSAgICAgICAgaWYgbWVtYmVyLmZpbGVuYW1lWy0xXSA9PSAnLyc6CisgICAgICAgIGlmIG1lbWJlci5pc19kaXIoKToKICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHRhcmdldHBhdGgpOgogICAgICAgICAgICAgICAgIG9zLm1rZGlyKHRhcmdldHBhdGgpCiAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0cGF0aApAQCAtMTQyOSwxMDMgKzE1NzEsNDEgQEAKICAgICAgICAgaWYgbm90IHNlbGYuZnA6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gd3JpdGUgdG8gWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQorICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCB3cml0ZSB0byBaSVAgYXJjaGl2ZSB3aGlsZSBhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIGV4aXN0cyIKKyAgICAgICAgICAgICkKIAotICAgICAgICBzdCA9IG9zLnN0YXQoZmlsZW5hbWUpCi0gICAgICAgIGlzZGlyID0gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCi0gICAgICAgIG10aW1lID0gdGltZS5sb2NhbHRpbWUoc3Quc3RfbXRpbWUpCi0gICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KLSAgICAgICAgIyBDcmVhdGUgWmlwSW5mbyBpbnN0YW5jZSB0byBzdG9yZSBmaWxlIGluZm9ybWF0aW9uCi0gICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGFyY25hbWUgPSBmaWxlbmFtZQotICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSlbMV0pCi0gICAgICAgIHdoaWxlIGFyY25hbWVbMF0gaW4gKG9zLnNlcCwgb3MuYWx0c2VwKToKLSAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQotICAgICAgICBpZiBpc2RpcjoKLSAgICAgICAgICAgIGFyY25hbWUgKz0gJy8nCi0gICAgICAgIHppbmZvID0gWmlwSW5mbyhhcmNuYW1lLCBkYXRlX3RpbWUpCi0gICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAoc3RbMF0gJiAweEZGRkYpIDw8IDE2ICAgICAgIyBVbml4IGF0dHJpYnV0ZXMKLSAgICAgICAgaWYgaXNkaXI6Ci0gICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gWklQX1NUT1JFRAotICAgICAgICBlbGlmIGNvbXByZXNzX3R5cGUgaXMgTm9uZToKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCisgICAgICAgIHppbmZvID0gWmlwSW5mby5mcm9tX2ZpbGUoZmlsZW5hbWUsIGFyY25hbWUpCisKKyAgICAgICAgaWYgemluZm8uaXNfZGlyKCk6CisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAorICAgICAgICAgICAgemluZm8uQ1JDID0gMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKKyAgICAgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KIAotICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCi0gICAgICAgIHppbmZvLmZsYWdfYml0cyA9IDB4MDAKLSAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgotICAgICAgICAgICAgaWYgc2VsZi5fc2Vla2FibGU6Ci0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQotICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCi0gICAgICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9MWk1BOgorICAgICAgICBpZiB6aW5mby5pc19kaXIoKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQorICAgICAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgICAgICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9MWk1BOgogICAgICAgICAgICAgICAgICMgQ29tcHJlc3NlZCBkYXRhIGluY2x1ZGVzIGFuIGVuZC1vZi1zdHJlYW0gKEVPUykgbWFya2VyCi0gICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDIKKyAgICAgICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDIKIAotICAgICAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKLSAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQorICAgICAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKIAotICAgICAgICAgICAgaWYgaXNkaXI6Ci0gICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gMAotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSAwCi0gICAgICAgICAgICAgICAgemluZm8uQ1JDID0gMAotICAgICAgICAgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgfD0gMHgxMCAgIyBNUy1ET1MgZGlyZWN0b3J5IGZsYWcKICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKICAgICAgICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoRmFsc2UpKQogICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gc2VsZi5mcC50ZWxsKCkKLSAgICAgICAgICAgICAgICByZXR1cm4KLQotICAgICAgICAgICAgY21wciA9IF9nZXRfY29tcHJlc3Nvcih6aW5mby5jb21wcmVzc190eXBlKQotICAgICAgICAgICAgaWYgbm90IHNlbGYuX3NlZWthYmxlOgotICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDA4Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGZwOgotICAgICAgICAgICAgICAgICMgTXVzdCBvdmVyd3JpdGUgQ1JDIGFuZCBzaXplcyB3aXRoIGNvcnJlY3QgZGF0YSBsYXRlcgotICAgICAgICAgICAgICAgIHppbmZvLkNSQyA9IENSQyA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICAjIENvbXByZXNzZWQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkIHNpemUKLSAgICAgICAgICAgICAgICB6aXA2NCA9IHNlbGYuX2FsbG93WmlwNjQgYW5kIFwKLSAgICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplICogMS4wNSA+IFpJUDY0X0xJTUlUCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKLSAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSAwCi0gICAgICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZCgxMDI0ICogOCkKLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IGZpbGVfc2l6ZSArIGxlbihidWYpCi0gICAgICAgICAgICAgICAgICAgIENSQyA9IGNyYzMyKGJ1ZiwgQ1JDKQotICAgICAgICAgICAgICAgICAgICBpZiBjbXByOgotICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gY21wci5jb21wcmVzcyhidWYpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSArIGxlbihidWYpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoYnVmKQotICAgICAgICAgICAgaWYgY21wcjoKLSAgICAgICAgICAgICAgICBidWYgPSBjbXByLmZsdXNoKCkKLSAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSArIGxlbihidWYpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShidWYpCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGZpbGVfc2l6ZQotICAgICAgICAgICAgemluZm8uQ1JDID0gQ1JDCi0gICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSBmaWxlX3NpemUKLSAgICAgICAgICAgIGlmIHppbmZvLmZsYWdfYml0cyAmIDB4MDg6Ci0gICAgICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQotICAgICAgICAgICAgICAgIGZtdCA9ICc8TFFRJyBpZiB6aXA2NCBlbHNlICc8TExMJwotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoc3RydWN0LnBhY2soZm10LCB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUpKQotICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gc2VsZi5mcC50ZWxsKCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgbm90IHppcDY0IGFuZCBzZWxmLl9hbGxvd1ppcDY0OgotICAgICAgICAgICAgICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignRmlsZSBzaXplIGhhcyBpbmNyZWFzZWQgZHVyaW5nIGNvbXByZXNzaW5nJykKLSAgICAgICAgICAgICAgICAgICAgaWYgY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdDb21wcmVzc2VkIHNpemUgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkIHNpemUnKQotICAgICAgICAgICAgICAgICMgU2VlayBiYWNrd2FyZHMgYW5kIHdyaXRlIGZpbGUgaGVhZGVyICh3aGljaCB3aWxsIG5vdyBpbmNsdWRlCi0gICAgICAgICAgICAgICAgIyBjb3JyZWN0IENSQyBhbmQgZmlsZSBzaXplcykKLSAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpICMgUHJlc2VydmUgY3VycmVudCBwb3NpdGlvbiBpbiBmaWxlCi0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHppbmZvLmhlYWRlcl9vZmZzZXQpCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKLSAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCi0gICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKLSAgICAgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t6aW5mby5maWxlbmFtZV0gPSB6aW5mbworICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBzcmMsIHNlbGYub3Blbih6aW5mbywgJ3cnKSBhcyBkZXN0OgorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzcmMsIGRlc3QsIDEwMjQqOCkKIAogICAgIGRlZiB3cml0ZXN0cihzZWxmLCB6aW5mb19vcl9hcmNuYW1lLCBkYXRhLCBjb21wcmVzc190eXBlPU5vbmUpOgogICAgICAgICAiIiJXcml0ZSBhIGZpbGUgaW50byB0aGUgYXJjaGl2ZS4gIFRoZSBjb250ZW50cyBpcyAnZGF0YScsIHdoaWNoCkBAIC0xNTUwLDQ1ICsxNjMwLDE4IEBACiAgICAgICAgIGlmIG5vdCBzZWxmLmZwOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHRvIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3Qgd3JpdGUgdG8gWklQIGFyY2hpdmUgd2hpbGUgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBleGlzdHMuIgorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQogCiAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGxlbihkYXRhKSAgICAgICAgICAgICMgVW5jb21wcmVzc2VkIHNpemUKICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgotICAgICAgICAgICAgaWYgc2VsZi5fc2Vla2FibGU6Ci0gICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyKQotICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGRhdGEKLSAgICAgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKLSAgICAgICAgICAgIHppbmZvLmhlYWRlcl9vZmZzZXQgPSBzZWxmLmZwLnRlbGwoKSAgICAjIFN0YXJ0IG9mIGhlYWRlciBkYXRhCi0gICAgICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCi0gICAgICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9MWk1BOgotICAgICAgICAgICAgICAgICMgQ29tcHJlc3NlZCBkYXRhIGluY2x1ZGVzIGFuIGVuZC1vZi1zdHJlYW0gKEVPUykgbWFya2VyCi0gICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDIKLQotICAgICAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKLSAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKLSAgICAgICAgICAgIHppbmZvLkNSQyA9IGNyYzMyKGRhdGEpICAgICAgICMgQ1JDLTMyIGNoZWNrc3VtCi0gICAgICAgICAgICBjbyA9IF9nZXRfY29tcHJlc3Nvcih6aW5mby5jb21wcmVzc190eXBlKQotICAgICAgICAgICAgaWYgY286Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGNvLmNvbXByZXNzKGRhdGEpICsgY28uZmx1c2goKQotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBsZW4oZGF0YSkgICAgIyBDb21wcmVzc2VkIHNpemUKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQotICAgICAgICAgICAgemlwNjQgPSB6aW5mby5maWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBcCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUCi0gICAgICAgICAgICBpZiB6aXA2NCBhbmQgbm90IHNlbGYuX2FsbG93WmlwNjQ6Ci0gICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZGF0YSkKLSAgICAgICAgICAgIGlmIHppbmZvLmZsYWdfYml0cyAmIDB4MDg6Ci0gICAgICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQotICAgICAgICAgICAgICAgIGZtdCA9ICc8TFFRJyBpZiB6aXA2NCBlbHNlICc8TExMJwotICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoc3RydWN0LnBhY2soZm10LCB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUpKQotICAgICAgICAgICAgc2VsZi5mcC5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLnN0YXJ0X2RpciA9IHNlbGYuZnAudGVsbCgpCi0gICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh6aW5mbykKLSAgICAgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t6aW5mby5maWxlbmFtZV0gPSB6aW5mbworICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oemluZm8sIG1vZGU9J3cnKSBhcyBkZXN0OgorICAgICAgICAgICAgICAgIGRlc3Qud3JpdGUoZGF0YSkKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAiIiJDYWxsIHRoZSAiY2xvc2UoKSIgbWV0aG9kIGluIGNhc2UgdGhlIHVzZXIgZm9yZ290LiIiIgpAQCAtMTYwMCw2ICsxNjUzLDExIEBACiAgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgogCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbid0IGNsb3NlIHRoZSBaSVAgZmlsZSB3aGlsZSB0aGVyZSBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIG9wZW4gd3JpdGluZyBoYW5kbGUgb24gaXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhlIHdyaXRpbmcgaGFuZGxlIGJlZm9yZSBjbG9zaW5nIHRoZSB6aXAuIikKKwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpZiBzZWxmLm1vZGUgaW4gKCd3JywgJ3gnLCAnYScpIGFuZCBzZWxmLl9kaWRNb2RpZnk6ICMgd3JpdGUgZW5kaW5nIHJlY29yZHMKICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS5ydGYgYi9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS5ydGYKaW5kZXggNjVlM2YxNC4uMWFmMjQ1MSAxMDA2NDQKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmCisrKyBiL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnJ0ZgpAQCAtMSwyOSArMSwyNSBAQAote1xydGYxXGFuc2lcYW5zaWNwZzEyNTJcY29jb2FydGYxMzQ4XGNvY29hc3VicnRmMTcwCit7XHJ0ZjFcYW5zaVxhbnNpY3BnMTI1Mlxjb2NvYXJ0ZjE0MDRcY29jb2FzdWJydGY0NjAKIHtcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQwIEhlbHZldGljYTtcZjFcZm1vZGVyblxmY2hhcnNldDAgQ291cmllck5ld1BTTVQ7fQoge1xjb2xvcnRibDtccmVkMjU1XGdyZWVuMjU1XGJsdWUyNTU7fQogXG1hcmdsMTQ0MFxtYXJncjE0NDBcdmlld3cxMzM4MFx2aWV3aDE0NjAwXHZpZXdraW5kMAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsCitccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWxccGFydGlnaHRlbmZhY3RvcjAKIAogXGYwXGZzMjQgXGNmMCBUaGlzIHBhY2thZ2Ugd2lsbCBpbnN0YWxsIFB5dGhvbiAkRlVMTF9WRVJTSU9OIGZvciBNYWMgT1MgWCAkTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIGZvciB0aGUgZm9sbG93aW5nIGFyY2hpdGVjdHVyZShzKTogJEFSQ0hJVEVDVFVSRVMuXAogXAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsCitccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWxccGFydGlnaHRlbmZhY3RvcjAKIAogXGIgXGNmMCBcdWwgXHVsYzAgV2hpY2ggaW5zdGFsbGVyIHZhcmlhbnQgc2hvdWxkIEkgdXNlPwogXGIwIFx1bG5vbmUgXAogXAotUHl0aG9uLm9yZyBwcm92aWRlcyB0d28gaW5zdGFsbGVyIHZhcmlhbnRzIGZvciBkb3dubG9hZDogb25lIHRoYXQgaW5zdGFsbHMgYSAKK0ZvciB0aGUgaW5pdGlhbCBhbHBoYSByZWxlYXNlcyBvZiBQeXRob24gMy42LCBQeXRob24ub3JnIHByb3ZpZGVzIG9ubHkgb25lIGluc3RhbGxlciB2YXJpYW50IGZvciBkb3dubG9hZDogb25lIHRoYXQgaW5zdGFsbHMgYSAKIFxpIDY0LWJpdC8zMi1iaXQgSW50ZWwKIFxpMCAgUHl0aG9uIGNhcGFibGUgb2YgcnVubmluZyBvbiAKIFxpIE1hYyBPUyBYIDEwLjYgKFNub3cgTGVvcGFyZCkKLVxpMCAgb3IgbGF0ZXI7IGFuZCBvbmUgdGhhdCBpbnN0YWxscyBhIAotXGkgMzItYml0LW9ubHkgKEludGVsIGFuZCBQUEMpCi1caTAgIFB5dGhvbiBjYXBhYmxlIG9mIHJ1bm5pbmcgb24gCi1caSBNYWMgT1MgWCAxMC41IChMZW9wYXJkKQotXGkwICBvciBsYXRlci4gIFRoaXMgUmVhZE1lIHdhcyBpbnN0YWxsZWQgd2l0aCB0aGUgCitcaTAgIG9yIGxhdGVyLiAgVGhpcyB3aWxsIGNoYW5nZSBwcmlvciB0byB0aGUgYmV0YSByZWxlYXNlcyBvZiAzLjYuMC4gIFRoaXMgUmVhZE1lIHdhcyBpbnN0YWxsZWQgd2l0aCB0aGUgCiBcaSAkTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUCi1caTAgIHZhcmlhbnQuICBVbmxlc3MgeW91IGFyZSBpbnN0YWxsaW5nIHRvIGFuIDEwLjUgc3lzdGVtIG9yIHlvdSBuZWVkIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IGNhbiBydW4gb24gMTAuNSBzeXN0ZW1zLCB1c2UgdGhlIDEwLjYgdmFyaWFudCBpZiBwb3NzaWJsZS4gIFRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBmdW5jdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkIHN0YXJ0aW5nIHdpdGggMTAuNiBhbmQgeW91IG1heSBzZWUgYmV0dGVyIHBlcmZvcm1hbmNlIHVzaW5nIDY0LWJpdCBtb2RlLiAgQnkgZGVmYXVsdCwgUHl0aG9uIHdpbGwgYXV0b21hdGljYWxseSBydW4gaW4gNjQtYml0IG1vZGUgaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgaXQuICBBbHNvIHNlZSAKK1xpMCAgdmFyaWFudC4gIEJ5IGRlZmF1bHQsIFB5dGhvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcnVuIGluIDY0LWJpdCBtb2RlIGlmIHlvdXIgc3lzdGVtIHN1cHBvcnRzIGl0LiAgQWxzbyBzZWUgCiBcaSBDZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIE9wZW5TU0wKLVxpMCAgYmVsb3cuICBUaGUgUHl0aG9ucyBpbnN0YWxsZWQgYnkgdGhlc2UgaW5zdGFsbGVycyBhcmUgYnVpbHQgd2l0aCBwcml2YXRlIGNvcGllcyBvZiBzb21lIHRoaXJkLXBhcnR5IGxpYnJhcmllcyBub3QgaW5jbHVkZWQgd2l0aCBvciBuZXdlciB0aGFuIHRob3NlIGluIE9TIFggaXRzZWxmLiAgVGhlIGxpc3Qgb2YgdGhlc2UgbGlicmFyaWVzIHZhcmllcyBieSBpbnN0YWxsZXIgdmFyaWFudCBhbmQgaXMgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiB0aGUgTGljZW5zZS5ydGYgZmlsZS4KK1xpMCAgYmVsb3cuICBUaGUgUHl0aG9ucyBpbnN0YWxsZWQgYnkgdGhpcyBpbnN0YWxsZXIgaXMgYnVpbHQgd2l0aCBwcml2YXRlIGNvcGllcyBvZiBzb21lIHRoaXJkLXBhcnR5IGxpYnJhcmllcyBub3QgaW5jbHVkZWQgd2l0aCBvciBuZXdlciB0aGFuIHRob3NlIGluIE9TIFggaXRzZWxmLiAgVGhlIGxpc3Qgb2YgdGhlc2UgbGlicmFyaWVzIHZhcmllcyBieSBpbnN0YWxsZXIgdmFyaWFudCBhbmQgaXMgaW5jbHVkZWQgYXQgdGhlIGVuZCBvZiB0aGUgTGljZW5zZS5ydGYgZmlsZS4KIFxiIFx1bCBcCiBcCiBVcGRhdGUgeW91ciB2ZXJzaW9uIG9mIFRjbC9UayB0byB1c2UgSURMRSBvciBvdGhlciBUayBhcHBsaWNhdGlvbnMKQEAgLTMzLDEzICsyOSwxMyBAQAogXGkgVGNsL1RrCiBcaTAgIGZyYW1ld29ya3MuICBWaXNpdCB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy90Y2x0ay8ifX17XGZsZHJzbHQgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9tYWMvdGNsdGsvfX0gZm9yIGN1cnJlbnQgaW5mb3JtYXRpb24gYWJvdXQgc3VwcG9ydGVkIGFuZCByZWNvbW1lbmRlZCB2ZXJzaW9ucyBvZiAKIFxpIFRjbC9UawotXGkwICBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbiBhbmQgb2YgTWFjIE9TIFguXAorXGkwICBmb3IgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbiBhbmQgb2YgTWFjIE9TIFguICBGb3IgdGhlIGluaXRpYWwgYWxwaGEgcmVsZWFzZXMgb2YgUHl0aG9uIDMuNiwgdGhlIGluc3RhbGxlciBpcyBsaW5rZWQgd2l0aCBUY2wvVGsgOC41OyB0aGlzIHdpbGwgY2hhbmdlIHByaW9yIHRvIHRoZSBiZXRhIHJlbGVhc2VzIG9mIDMuNi4wLlwKIAogXGIgXHVsIFwKIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgT3BlblNTTFwKIAogXGIwIFx1bG5vbmUgXAotUHl0aG9uIDMuNSBpbmNsdWRlcyBhIG51bWJlciBvZiBuZXR3b3JrIHNlY3VyaXR5IGVuaGFuY2VtZW50cyB0aGF0IHdlcmUgcmVsZWFzZWQgaW4gUHl0aG9uIDMuNC4zIGFuZCBQeXRob24gMi43LjEwLiAge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3Ni8ifX17XGZsZHJzbHQgUEVQIDQ3Nn19IGNoYW5nZXMgc2V2ZXJhbCBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZXMsIGxpa2UgCitQeXRob24gMy42IGluY2x1ZGVzIGEgbnVtYmVyIG9mIG5ldHdvcmsgc2VjdXJpdHkgZW5oYW5jZW1lbnRzIHRoYXQgd2VyZSByZWxlYXNlZCBpbiBQeXRob24gMy40LjMgYW5kIFB5dGhvbiAyLjcuMTAuICB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDc2LyJ9fXtcZmxkcnNsdCBQRVAgNDc2fX0gY2hhbmdlcyBzZXZlcmFsIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlcywgbGlrZSAKIFxpIGh0dHBsaWIKIFxpMCAsIAogXGkgdXJsbGliCkBAIC01MSw1NiArNDcsMzMgQEAKIFxpIHNlY3VyaXR5CiBcaTAgIGNvbW1hbmQgbGluZSB1dGlsaXR5LlwKIFwKLUZvciBPUyBYIDEwLjUsIEFwcGxlIHByb3ZpZGVzIAotXGkgT3BlblNTTCAwLjkuNwotXGkwICBsaWJyYXJpZXMuICBUaGlzIHZlcnNpb24gb2YgQXBwbGUncyBPcGVuU1NMIAotXGIgZG9lcyBub3QKLVxiMCAgdXNlIHRoZSBjZXJ0aWZpY2F0ZXMgZnJvbSB0aGUgc3lzdGVtIHNlY3VyaXR5IGZyYW1ld29yaywgZXZlbiB3aGVuIHVzZWQgb24gbmV3ZXIgdmVyc2lvbnMgb2YgT1MgWC4gIEluc3RlYWQgaXQgY29uc3VsdHMgYSB0cmFkaXRpb25hbCBPcGVuU1NMIGNvbmNhdGVuYXRlZCBjZXJ0aWZpY2F0ZSBmaWxlICgKLVxpIGNhZmlsZQotXGkwICkgb3IgY2VydGlmaWNhdGUgZGlyZWN0b3J5ICgKLVxpIGNhcGF0aAotXGkwICksIGxvY2F0ZWQgaW4gCi1cZjEgL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wKLVxmMCAuICBUaGVzZSBkaXJlY3RvcmllcyBhcmUgdHlwaWNhbGx5IGVtcHR5IGFuZCBub3QgbWFuYWdlZCBieSBPUyBYOyB5b3UgbXVzdCBtYW5hZ2UgdGhlbSB5b3Vyc2VsZiBvciBzdXBwbHkgeW91ciBvd24gU1NMIGNvbnRleHRzLiAgT3BlblNTTCAwLjkuNyBpcyBvYnNvbGV0ZSBieSBjdXJyZW50IHNlY3VyaXR5IHN0YW5kYXJkcywgbGFja2luZyBhIG51bWJlciBvZiBpbXBvcnRhbnQgZmVhdHVyZXMgZm91bmQgaW4gbGF0ZXIgdmVyc2lvbnMuICBBbW9uZyB0aGUgcHJvYmxlbXMgdGhpcyBjYXVzZXMgaXMgdGhlIGluYWJpbGl0eSB0byB2ZXJpZnkgaGlnaGVyLXNlY3VyaXR5IGNlcnRpZmljYXRlcyBub3cgdXNlZCBieSBweXRob24ub3JnIHNlcnZpY2VzLCBpbmNsdWRpbmcgCi1caSB0e1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaSJ9fXtcZmxkcnNsdCBoZSBQeXRob24gUGFja2FnZSBJbmRleCwgUHlQSX19Ci1caTAgLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgCi1caSAxMC41KyAzMi1iaXQtb25seSBweXRob24ub3JnIHZhcmlhbnQKLVxpMCAgaXMgbGlua2VkIHdpdGggYSBwcml2YXRlIGNvcHkgb2YgCi1caSBPcGVuU1NMIDEuMC4yCi1caTAgOyBpdCBjb25zdWx0cyB0aGUgc2FtZSBkZWZhdWx0IGNlcnRpZmljYXRlIGRpcmVjdG9yeSwgCi1cZjEgL1N5c3RlbS9MaWJyYXJ5L09wZW5TU0wKLVxmMCAuICAgQXMgYmVmb3JlLCBpdCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gbWFuYWdlIGNlcnRpZmljYXRlcyB5b3Vyc2VsZiB3aGVuIHlvdSB1c2UgdGhpcyBQeXRob24gdmFyaWFudCBhbmQsIHdpdGggY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG5vdyBlbmFibGVkIGJ5IGRlZmF1bHQsIHlvdSBtYXkgbm93IG5lZWQgdG8gdGFrZSBhZGRpdGlvbmFsIHN0ZXBzIHRvIGVuc3VyZSB5b3VyIFB5dGhvbiBwcm9ncmFtcyBoYXZlIGFjY2VzcyB0byBDQSBjZXJ0aWZpY2F0ZXMgeW91IHRydXN0LiAgSWYgeW91IHVzZSB0aGlzIFB5dGhvbiB2YXJpYW50IHRvIGJ1aWxkIHN0YW5kYWxvbmUgYXBwbGljYXRpb25zIHdpdGggdGhpcmQtcGFydHkgdG9vbHMgbGlrZSB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3B5MmFwcC8ifX17XGZsZHJzbHQgCi1cZjEgcHkyYXBwfX0sIHlvdSBtYXkgbm93IG5lZWQgdG8gYnVuZGxlIENBIGNlcnRpZmljYXRlcyBpbiB0aGVtIG9yIG90aGVyd2lzZSBzdXBwbHkgbm9uLWRlZmF1bHQgU1NMIGNvbnRleHRzLlwKLVwKIEZvciBPUyBYIDEwLjYrLCBBcHBsZSBhbHNvIHByb3ZpZGVzIAogXGkgT3BlblNTTAogXGkwICAKIFxpIDAuOS44IGxpYnJhcmllcwogXGkwIC4gIEFwcGxlJ3MgMC45LjggdmVyc2lvbiBpbmNsdWRlcyBhbiBpbXBvcnRhbnQgYWRkaXRpb25hbCBmZWF0dXJlOiBpZiBhIGNlcnRpZmljYXRlIGNhbm5vdCBiZSB2ZXJpZmllZCB1c2luZyB0aGUgbWFudWFsbHkgYWRtaW5pc3RlcmVkIGNlcnRpZmljYXRlcyBpbiAKIFxmMSAvU3lzdGVtL0xpYnJhcnkvT3BlblNTTAotXGYwICwgdGhlIGNlcnRpZmljYXRlcyBtYW5hZ2VkIGJ5IHRoZSBzeXN0ZW0gc2VjdXJpdHkgZnJhbWV3b3JrIEluIHRoZSB1c2VyIGFuZCBzeXN0ZW0ga2V5Y2hhaW5zIGFyZSBhbHNvIGNvbnN1bHRlZCAodXNpbmcgQXBwbGUgcHJpdmF0ZSBBUElzKS4gIEZvciB0aGlzIHJlYXNvbiwgdGhlIAorXGYwICwgdGhlIGNlcnRpZmljYXRlcyBtYW5hZ2VkIGJ5IHRoZSBzeXN0ZW0gc2VjdXJpdHkgZnJhbWV3b3JrIEluIHRoZSB1c2VyIGFuZCBzeXN0ZW0ga2V5Y2hhaW5zIGFyZSBhbHNvIGNvbnN1bHRlZCAodXNpbmcgQXBwbGUgcHJpdmF0ZSBBUElzKS4gIEZvciB0aGUgaW5pdGlhbCBhbHBoYSByZWxlYXNlcyBvZiBQeXRob24gMy42LCB0aGUgCiBcaSA2NC1iaXQvMzItYml0IDEwLjYrIHB5dGhvbi5vcmcgdmFyaWFudAotXGkwICBjb250aW51ZXMgdG8gYmUgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggQXBwbGUncyBPcGVuU1NMIDAuOS44IHNpbmNlIGl0IHdhcyBmZWx0IHRoYXQgdGhlIGxvc3Mgb2YgdGhlIHN5c3RlbS1wcm92aWRlZCBjZXJ0aWZpY2F0ZXMgYW5kIG1hbmFnZW1lbnQgdG9vbHMgb3V0d2VpZ2hzIHRoZSBhZGRpdGlvbmFsIHNlY3VyaXR5IGZlYXR1cmVzIHByb3ZpZGVkIGJ5IG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wuICBUaGlzIHdpbGwgbGlrZWx5IGNoYW5nZSBpbiBmdXR1cmUgcmVsZWFzZXMgb2YgdGhlIHB5dGhvbi5vcmcgaW5zdGFsbGVycyBhcyBBcHBsZSBoYXMgZGVwcmVjYXRlZCB1c2Ugb2YgdGhlIHN5c3RlbS1zdXBwbGllZCBPcGVuU1NMIGxpYnJhcmllcy4gIElmIHlvdSBkbyBuZWVkIGZlYXR1cmVzIGZyb20gbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTCwgdGhlcmUgYXJlIHRoaXJkLXBhcnR5IE9wZW5TU0wgd3JhcHBlciBwYWNrYWdlcyBhdmFpbGFibGUgdGhyb3VnaCAKK1xpMCAgY29udGludWVzIHRvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZCB3aXRoIEFwcGxlJ3MgT3BlblNTTCAwLjkuOCBzaW5jZSBpdCB3YXMgZmVsdCB0aGF0IHRoZSBsb3NzIG9mIHRoZSBzeXN0ZW0tcHJvdmlkZWQgY2VydGlmaWNhdGVzIGFuZCBtYW5hZ2VtZW50IHRvb2xzIG91dHdlaWdocyB0aGUgYWRkaXRpb25hbCBzZWN1cml0eSBmZWF0dXJlcyBwcm92aWRlZCBieSBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLiAgVGhpcyB3aWxsIGNoYW5nZSBwcmlvciB0byB0aGUgYmV0YSByZWxlYXNlcyBvZiAzLjYuMCBhcyBBcHBsZSBoYXMgZGVwcmVjYXRlZCB1c2Ugb2YgdGhlIHN5c3RlbS1zdXBwbGllZCBPcGVuU1NMIGxpYnJhcmllcy4gIElmIHlvdSBkbyBuZWVkIGZlYXR1cmVzIGZyb20gbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTCwgdGhlcmUgYXJlIHRoaXJkLXBhcnR5IE9wZW5TU0wgd3JhcHBlciBwYWNrYWdlcyBhdmFpbGFibGUgdGhyb3VnaCAKIFxpIFB5UEkKIFxpMCAuXAogXAogVGhlIGJ1bmRsZWQgCiBcZjEgcGlwCi1cZjAgIGluY2x1ZGVkIHdpdGggdGhlIFB5dGhvbiAzLjUgaW5zdGFsbGVycyBoYXMgaXRzIG93biBkZWZhdWx0IGNlcnRpZmljYXRlIHN0b3JlIGZvciB2ZXJpZnlpbmcgZG93bmxvYWQgY29ubmVjdGlvbnMuXAorXGYwICBpbmNsdWRlZCB3aXRoIHRoZSBQeXRob24gMy42IGluc3RhbGxlcnMgaGFzIGl0cyBvd24gZGVmYXVsdCBjZXJ0aWZpY2F0ZSBzdG9yZSBmb3IgdmVyaWZ5aW5nIGRvd25sb2FkIGNvbm5lY3Rpb25zLlwKIFwKIAogXGIgXHVsIE90aGVyIGNoYW5nZXNcCiAKIFxiMCBcdWxub25lIFwKLVxwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbAotXGNmMCBGb3Igb3RoZXIgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UsIHNlZSB0aGUgCitGb3Igb3RoZXIgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UsIHNlZSB0aGUgCiBcaSBXaGF0J3MgbmV3CiBcaTAgIHNlY3Rpb24gaW4gdGhlIHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG9jLyJ9fXtcZmxkcnNsdCBEb2N1bWVudGF0aW9uIFNldH19IGZvciB0aGlzIHJlbGVhc2UgYW5kIGl0cyAKIFxpIFJlbGVhc2UgTm90ZXMKIFxpMCAgbGluayBhdCB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy8ifX17XGZsZHJzbHQgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZHMvfX0uXAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsCiAKLVxiIFxjZjAgXHVsIFwKK1xiIFx1bCBcCiBQeXRob24gMyBhbmQgUHl0aG9uIDIgQ28tZXhpc3RlbmNlXAogCiBcYjAgXHVsbm9uZSBcCmRpZmYgLS1naXQgYS9NYWMvSURMRS9JRExFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvaWRsZW1haW4ucHkgYi9NYWMvSURMRS9JRExFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvaWRsZW1haW4ucHkKaW5kZXggOTg2NzYwZC4uNTk5NGMxOCAxMDA2NDQKLS0tIGEvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5CisrKyBiL01hYy9JRExFL0lETEUuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9pZGxlbWFpbi5weQpAQCAtNjgsNiArNjgsNiBAQAogICAgICAgICBicmVhawogCiAjIE5vdyBpdCBpcyBzYWZlIHRvIGltcG9ydCBpZGxlbGliLgotZnJvbSBpZGxlbGliLlB5U2hlbGwgaW1wb3J0IG1haW4KK2Zyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBtYWluCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUucHJlLmluIGIvTWFrZWZpbGUucHJlLmluCmluZGV4IDg3NTI4YTAuLjJiYzkxZDcgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlLnByZS5pbgorKysgYi9NYWtlZmlsZS5wcmUuaW4KQEAgLTEwOSw2ICsxMDksNyBAQAogCiAjIE11bHRpYXJjaCBkaXJlY3RvcnkgKG1heSBiZSBlbXB0eSkKIE1VTFRJQVJDSD0JQE1VTFRJQVJDSEAKK01VTFRJQVJDSF9DUFBGTEFHUyA9IEBNVUxUSUFSQ0hfQ1BQRkxBR1NACiAKICMgSW5zdGFsbCBwcmVmaXggZm9yIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcwogcHJlZml4PQkJQHByZWZpeEAKQEAgLTU3MSw3ICs1NzIsNyBAQAogCSQoTElOS0NDKSAkKFBZX0xERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgLW8gJEAgUHJvZ3JhbXMvcHl0aG9uLm8gJChCTERMSUJSQVJZKSAkKExJQlMpICQoTU9ETElCUykgJChTWVNMSUJTKSAkKExETEFTVCkKIAogcGxhdGZvcm06ICQoQlVJTERQWVRIT04pIHB5YnVpbGRkaXIudHh0Ci0JJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLWMgJ2ltcG9ydCBzeXMgOyBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtIDsgcHJpbnQoZ2V0X3BsYXRmb3JtKCkrIi0iK3N5cy52ZXJzaW9uWzA6M10pJyA+cGxhdGZvcm0KKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCgiJXMtJWQuJWQiICUgKGdldF9wbGF0Zm9ybSgpLCAqc3lzLnZlcnNpb25faW5mb1s6Ml0pKScgPnBsYXRmb3JtCiAKICMgQ3JlYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIHN5c2NvbmZpZyBidWlsZC10aW1lIGRhdGEgdGhlcmUuCiAjIHB5YnVpbGRkaXIudHh0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBkaXIgYW5kIGlzIHVzZWQgZm9yCkBAIC03ODQsNiArNzg1LDcgQEAKIFB5dGhvbi9zeXNtb2R1bGUubzogJChzcmNkaXIpL1B5dGhvbi9zeXNtb2R1bGUuYyBNYWtlZmlsZQogCSQoQ0MpIC1jICQoUFlfQ09SRV9DRkxBR1MpIFwKIAkJLURBQklGTEFHUz0nIiQoQUJJRkxBR1MpIicgXAorCQkkKE1VTFRJQVJDSF9DUFBGTEFHUykgXAogCQktbyAkQCAkKHNyY2RpcikvUHl0aG9uL3N5c21vZHVsZS5jCiAKICQoSU9fT0JKUyk6ICQoSU9fSCkKQEAgLTk0Myw2ICs5NDUsNyBAQAogCQkkKHNyY2RpcikvSW5jbHVkZS9vYmppbXBsLmggXAogCQkkKE9QQ09ERV9IKSBcCiAJCSQoc3JjZGlyKS9JbmNsdWRlL29zZGVmcy5oIFwKKwkJJChzcmNkaXIpL0luY2x1ZGUvb3Ntb2R1bGUuaCBcCiAJCSQoc3JjZGlyKS9JbmNsdWRlL3BhdGNobGV2ZWwuaCBcCiAJCSQoc3JjZGlyKS9JbmNsdWRlL3BnZW4uaCBcCiAJCSQoc3JjZGlyKS9JbmNsdWRlL3BnZW5oZWFkZXJzLmggXApAQCAtOTkyLDcgKzk5NSw3IEBACiBURVNUT1BUUz0JJChFWFRSQVRFU1RPUFRTKQogVEVTVFBZVEhPTj0JJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgJChURVNUUFlUSE9OT1BUUykKIFRFU1RSVU5ORVI9CSQoVEVTVFBZVEhPTikgJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvcnVuX3Rlc3RzLnB5Ci1URVNUVElNRU9VVD0JMzYwMAorVEVTVFRJTUVPVVQ9CTkwMAogCiAjIFJ1biBhIGJhc2ljIHNldCBvZiByZWdyZXNzaW9uIHRlc3RzLgogIyBUaGlzIGV4Y2x1ZGVzIHNvbWUgdGVzdHMgdGhhdCBhcmUgcGFydGljdWxhcmx5IHJlc291cmNlLWludGVuc2l2ZS4KQEAgLTExOTMsNiArMTE5Niw3IEBACiAJCXRlc3QvY2prZW5jb2RpbmdzIHRlc3QvZGVjaW1hbHRlc3RkYXRhIHRlc3QveG1sdGVzdGRhdGEgXAogCQl0ZXN0L2VpbnRyZGF0YSBcCiAJCXRlc3QvaW1naGRyZGF0YSBcCisJCXRlc3QvbGlicmVncnRlc3QgXAogCQl0ZXN0L3N1YnByb2Nlc3NkYXRhIHRlc3Qvc25kaGRyZGF0YSB0ZXN0L3N1cHBvcnQgXAogCQl0ZXN0L3RyYWNlZG1vZHVsZXMgdGVzdC9lbmNvZGVkX21vZHVsZXMgXAogCQl0ZXN0L3Rlc3RfaW1wb3J0IFwKQEAgLTEyNjEsNyArMTI2NSw3IEBACiAJCWVsc2UJdHJ1ZTsgXAogCQlmaTsgXAogCWRvbmUKLQlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5IGBjYXQgcHlidWlsZGRpci50eHRgL19zeXNjb25maWdkYXRhLnB5OyBcCisJQGZvciBpIGluICQoc3JjZGlyKS9MaWIvKi5weTsgXAogCWRvIFwKIAkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAogCQkJJChJTlNUQUxMX1NDUklQVCkgJCRpICQoREVTVERJUikkKExJQkRFU1QpOyBcCkBAIC0xMjk2LDYgKzEzMDAsMTAgQEAKIAkJCWVzYWM7IFwKIAkJZG9uZTsgXAogCWRvbmUKKwkkKElOU1RBTExfREFUQSkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkgXAorCQkkKERFU1RESVIpJChMSUJERVNUKS8kKFBMQVRESVIpOyBcCisJZWNobyAkKElOU1RBTExfREFUQSkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkgXAorCQkkKExJQkRFU1QpLyQoUExBVERJUikKIAkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL0xJQ0VOU0UgJChERVNURElSKSQoTElCREVTVCkvTElDRU5TRS50eHQKIAlpZiB0ZXN0IC1kICQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0czsgdGhlbiBcCiAJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTW9kdWxlcy94eG1vZHVsZS5jIFwKQEAgLTEzMzQsMTMgKzEzNDIsMTkgQEAKIAkJJChQWVRIT05fRk9SX0JVSUxEKSAtbSBsaWIydG8zLnBnZW4yLmRyaXZlciAkKERFU1RESVIpJChMSUJERVNUKS9saWIydG8zL1BhdHRlcm5HcmFtbWFyLnR4dAogCiAjIENyZWF0ZSB0aGUgUExBVERJUiBzb3VyY2UgZGlyZWN0b3J5LCBpZiBvbmUgd2Fzbid0IGRpc3RyaWJ1dGVkLi4KKyMgRm9yIG11bHRpYXJjaCB0YXJnZXRzLCB1c2UgdGhlIHBsYXQtbGludXgvcmVnZW4gc2NyaXB0LgogJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpOgogCW1rZGlyICQoc3JjZGlyKS9MaWIvJChQTEFURElSKQotCWNwICQoc3JjZGlyKS9MaWIvcGxhdC1nZW5lcmljL3JlZ2VuICQoc3JjZGlyKS9MaWIvJChQTEFURElSKS9yZWdlbgorCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBcCisJICBjcCAkKHNyY2RpcikvTGliL3BsYXQtbGludXgvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuOyBcCisJZWxzZSBcCisJICBjcCAkKHNyY2RpcikvTGliL3BsYXQtZ2VuZXJpYy9yZWdlbiAkKHNyY2RpcikvTGliLyQoUExBVERJUikvcmVnZW47IFwKKwlmaTsgXAogCWV4cG9ydCBQQVRIOyBQQVRIPSJgcHdkYDokJFBBVEgiOyBcCiAJZXhwb3J0IFBZVEhPTlBBVEg7IFBZVEhPTlBBVEg9ImBwd2RgL0xpYiI7IFwKIAlleHBvcnQgRFlMRF9GUkFNRVdPUktfUEFUSDsgRFlMRF9GUkFNRVdPUktfUEFUSD0iYHB3ZGAiOyBcCiAJZXhwb3J0IEVYRTsgRVhFPSIkKEJVSUxERVhFKSI7IFwKKwlleHBvcnQgQ0M7IENDPSIkKENDKSI7IFwKIAlpZiBbIC1uICIkKE1VTFRJQVJDSCkiIF07IHRoZW4gZXhwb3J0IE1VTFRJQVJDSDsgTVVMVElBUkNIPSQoTVVMVElBUkNIKTsgZmk7IFwKIAlleHBvcnQgUFlUSE9OX0ZPUl9CVUlMRDsgXAogCWlmIFsgIiQoQlVJTERfR05VX1RZUEUpIiA9ICIkKEhPU1RfR05VX1RZUEUpIiBdOyB0aGVuIFwKQEAgLTEzNDgsNiArMTM2Miw3IEBACiAJZWxzZSBcCiAJICBQWVRIT05fRk9SX0JVSUxEPSIkKFBZVEhPTl9GT1JfQlVJTEQpIjsgXAogCWZpOyBcCisJZXhwb3J0IEgyUFk7IEgyUFk9IiQkUFlUSE9OX0ZPUl9CVUlMRCAkKGFic19zcmNkaXIpL1Rvb2xzL3NjcmlwdHMvaDJweS5weSI7IFwKIAljZCAkKHNyY2RpcikvTGliLyQoUExBVERJUik7ICQoUlVOU0hBUkVEKSAuL3JlZ2VuCiAKIHB5dGhvbi1jb25maWc6ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gTWlzYy9weXRob24tY29uZmlnLnNoCkBAIC0xNDQ2LDcgKzE0NjEsNyBAQAogCQktLWluc3RhbGwtc2NyaXB0cz0kKEJJTkRJUikgXAogCQktLWluc3RhbGwtcGxhdGxpYj0kKERFU1RTSEFSRUQpIFwKIAkJLS1yb290PSQoREVTVERJUikvCi0JLXJtICQoREVTVERJUikkKERFU1RTSEFSRUQpL19zeXNjb25maWdkYXRhLnB5CisJLXJtICQoREVTVERJUikkKERFU1RTSEFSRUQpL19zeXNjb25maWdkYXRhXyQoQUJJRkxBR1MpLnB5CiAJLXJtIC1yICQoREVTVERJUikkKERFU1RTSEFSRUQpL19fcHljYWNoZV9fCiAKICMgSGVyZSBhcmUgYSBjb3VwbGUgb2YgdGFyZ2V0cyBmb3IgTWFjT1NYIGFnYWluLCB0byBpbnN0YWxsIGEgZnVsbApAQCAtMTQ5MiwxMCArMTUwNywxMCBAQAogIyBJbnN0YWxsIGEgbnVtYmVyIG9mIHN5bWxpbmtzIHRvIGtlZXAgc29mdHdhcmUgdGhhdCBleHBlY3RzIGEgbm9ybWFsIHVuaXgKICMgaW5zdGFsbCAod2hpY2ggaW5jbHVkZXMgcHl0aG9uLWNvbmZpZykgaGFwcHkuCiBmcmFtZXdvcmtpbnN0YWxsbWFjbGliOgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5hIgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKLQkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikvY29uZmlnLSQoTERWRVJTSU9OKS9saWJweXRob24kKFZFUlNJT04pLmEiCi0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKExEVkVSU0lPTikuYSIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKExEVkVSU0lPTikuZHlsaWIiCisJJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChMSUJQTCkvbGlicHl0aG9uJChWRVJTSU9OKS5hIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCiAJJChMTikgLWZzICIuLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9saWJweXRob24kKExEVkVSU0lPTikuZHlsaWIiCiAJJChMTikgLWZzICIuLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9saWJweXRob24kKFZFUlNJT04pLmR5bGliIgogCkBAIC0xNjI1LDYgKzE2NDAsOSBAQAogCS1ybSAtcmYgYnVpbGQgcGxhdGZvcm0KIAktcm0gLXJmICQoUFlUSE9ORlJBTUVXT1JLRElSKQogCS1ybSAtZiBweXRob24tY29uZmlnLnB5IHB5dGhvbi1jb25maWcKKwlpZiBbIC1uICIkKE1VTFRJQVJDSCkiIF07IHRoZW4gXAorCSAgcm0gLXJmICQoc3JjZGlyKS9MaWIvJChQTEFURElSKTsgXAorCWZpCiAKICMgTWFrZSB0aGluZ3MgZXh0cmEgY2xlYW4sIGJlZm9yZSBtYWtpbmcgYSBkaXN0cmlidXRpb246CiAjIHJlbW92ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzLCBldmVuIE1ha2VmaWxlWy5wcmVdCmRpZmYgLS1naXQgYS9NaXNjL0FDS1MgYi9NaXNjL0FDS1MKaW5kZXggMjdiZDY5MS4uOTQ5NDQwNiAxMDA2NDQKLS0tIGEvTWlzYy9BQ0tTCisrKyBiL01pc2MvQUNLUwpAQCAtMTU0LDYgKzE1NCw3IEBACiBQYXVsIEJvZGRpZQogTWF0dGhldyBCb2VkaWNrZXIKIFJvYmluIEJvZXJkaWprCitOaWtvbGF5IEJvZ295Y2hldgogRGF2aWQgQm9sZW4KIFdvdXRlciBCb2xzdGVybGVlCiBHYXdhaW4gQm9sdG9uCkBAIC0yMzksNiArMjQwLDcgQEAKIE1pY2hhZWwgQ2V0cnVsbwogRGF2ZSBDaGFtYmVycwogUGFzY2FsIENoYW1ib24KK05pY2hvbGFzIENoYW1tYXMKIEpvaG4gQ2hhbmRsZXIKIEh5ZS1TaGlrIENoYW5nCiBKZWZmcmV5IENoYW5nCkBAIC0zMDksOSArMzExLDExIEBACiBDaHJpc3RvcGhlciBBLiBDcmFpZwogSmVyZW15IENyYXZlbgogTGF1cmEgQ3JlaWdodG9uCitUeWxlciBDcm9tcHRvbgogU2ltb24gQ3Jvc3MKIEZlbGlwZSBDcnV6CiBEcmV3IENzaWxsYWcKK0FsZXNzYW5kcm8gQ3VjY2kKIEpvYXF1aW4gQ3VlbmNhIEFiZWxhCiBKb2huIEN1Z2luaQogVG9tIEN1bGxpdG9uCkBAIC0zNTUsNiArMzU5LDcgQEAKIFl2ZXMgRGlvbm5lCiBEYW5pZWwgRGl0dG1hcgogSm9zaXAgRGpvbG9uZ2EKK1dhbHRlciBEw7Zyd2FsZAogSmFyb21pciBEb2xlY2VrCiBJc21haWwgRG9ubWV6CiBSb2JlcnQgRG9ub2h1ZQpAQCAtMzgyLDcgKzM4Nyw2IEBACiBLYXJtZW4gRHlrc3RyYQogSm9zaXAgRHpvbG9uZ2EKIE1heGltIER6dW1hbmVua28KLVdhbHRlciBEw7Zyd2FsZAogSGFucyBFY2thcmR0CiBSb2RvbHBobyBFY2toYXJkdAogVWxyaWNoIEVja2hhcmR0CkBAIC01NDAsNiArNTQ0LDcgQEAKIExhcnMgR3VzdMOkYmVsCiBUaG9tYXMgR8O8dHRsZXIKIEpvbmFzIEguCitKb3NlcGggSGFja21hbgogQmFycnkgSGFkZG93CiBQaGlsaXBwIEhhZ2VtZWlzdGVyCiBQYXVsIHRlbiBIYWdlbgpAQCAtNzc3LDYgKzc4Miw3IEBACiBNYXJrbyBLb2h0YWxhCiBWYWpyYXNreSBLb2sKIEd1aWRvIEtvbGxlcmllCitKYWNlayBLb8WCb2R6aWVqCiBKYWNlayBLb25pZWN6bnkKIEFya2FkeSBLb3BseWFyb3YKIFBldGVyIEEuIEtvcmVuCkBAIC04MjAsNiArODI2LDcgQEAKIFRpbm8gTGFuZ2UKIEdsZW5uIExhbmdmb3JkCiBBbmRyZXcgTGFuZ21lYWQKK1dvbGZnYW5nIExhbmduZXIKIERldGxlZiBMYW5uZXJ0CiBTb3JlbiBMYXJzZW4KIEFtb3MgTGF0dGVpZXIKQEAgLTg4MSwyNCArODg4LDI3IEBACiBHcmVnb3IgTGluZ2wKIEV2ZXJldHQgTGlwbWFuCiBNaXJrbyBMaXNzCitBbGV4YW5kZXIgTGl1CiBOaWNrIExvY2t3b29kCiBTdGVwaGFuaWUgTG9ja3dvb2QKK01hcnRpbiB2b24gTMO2d2lzCiBIdWdvIExvcGVzIFRhdmFyZXMKIEd1aWxsZXJtbyBMw7NwZXotQW5nbGFkYQogQW5uZSBMb3JkCitBbGV4IExvcmRUaG9yc2VuCiBUb20gTG9yZWRvCiBKdXN0aW4gTG92ZQogTmVkIEphY2tzb24gTG92ZWx5CiBQZXRlciBMb3ZldHQKIENoYWxtZXIgTG93ZQogSmFzb24gTG93ZQotTWFydGluIHZvbiBMw7Z3aXMKIFRvbnkgTG93bmRzCiBSYXkgTG95emFnYQogS2FuZy1IYW8gKEtlbm55KSBMdQogTHVrYXMgTHVlZwogTG9yZW4gTHVrZQogRnJlZHJpayBMdW5kaAorTWlrZSBMdW5keQogWmhvbmd5dWUgTHVvCiBNYXJrIEx1dHoKIFRhcmFzIEx5YXB1bgpAQCAtMTEzNiw2ICsxMTQ2LDcgQEAKIEdlb2ZmIFBoaWxicmljawogR2F2cmllIFBoaWxpcHNvbgogQWRyaWFuIFBoaWxsaXBzCitEdXN0eSBQaGlsbGlwcwogQ2hyaXN0b3BoZXIgSi4gUGhvZW5peAogSmFtZXMgUGlja2VyaW5nCiBOZWFsZSBQaWNrZXR0CkBAIC0xMjM5LDYgKzEyNTAsNyBAQAogS2V2aW4gUm9kZ2VycwogU2VhbiBSb2RtYW4KIEdpYW1wYW9sbyBSb2RvbGEKK01hdXJvIFMuIE0uIFJvZHJpZ3VlcwogRWxzb24gUm9kcmlndWV6CiBBZGkgUm9pYmFuCiBMdWlzIFJvamFzCkBAIC0xMjgwLDYgKzEyOTIsNyBAQAogQ29uc3RhbnRpbmEgUy4KIFBhdHJpY2sgU2FiaW4KIFPDqWJhc3RpZW4gU2FibMOpCitBbWl0IFNhaGEKIFN1bWFuIFNhaGEKIEhhamltZSBTYWl0b3UKIEdlb3JnZSBTYWtraXMKQEAgLTEzODUsNiArMTM5OCw3IEBACiBSb3kgU21pdGgKIFJ5YW4gU21pdGgtUm9iZXJ0cwogUmFmYWwgU21vdHJ6eWsKK0pvc2ggU25pZGVyCiBFcmljIFNub3cKIERpcmsgU29lZGUKIE5pciBTb2ZmZXIKQEAgLTE0MTcsNiArMTQzMSw3IEBACiBSaWNoYXJkIFN0b2FrbGV5CiBQZXRlciBTdG9laHIKIENhc3BlciBTdG9lbAorRGFuaWVsIFN0b2tlcwogTWljaGFlbCBTdG9uZQogU2VyaGl5IFN0b3JjaGFrYQogS2VuIFN0b3gKQEAgLTE0NDEsNiArMTQ1Niw3IEBACiBKb2huIFN6YWttZWlzdGVyCiBBbWlyIFN6ZWtlbHkKIE1hY2llaiBTenVsaWsKK0pvZWwgVGFkZGVpCiBBcmZyZXZlciBGcmVodGVzIFRhaWZlcnNhciBBcmFoZXNpcwogSGlkZWFraSBUYWthaGFzaGkKIFRha2FzZSBBcmloaXJvCkBAIC0xNDUyLDYgKzE0NjgsNyBAQAogQ2hyaXN0aWFuIFRhbnplcgogU3RldmVuIFRhc2NodWsKIEFteSBUYXlsb3IKK0p1bGlhbiBUYXlsb3IKIE1vbnR5IFRheWxvcgogQW5hdG9seSBUZWNodG9uaWsKIEd1c3Rhdm8gVGVtcGxlCkBAIC0xNjMzLDYgKzE2NTAsNyBAQAogQXJub24gWWFhcmkKIEhpcm9rYXp1IFlhbWFtb3RvCiBLYS1QaW5nIFllZQorQ2hpIEhzdWFuIFllbgogSmFzb24gWWVvCiBFdW5nSnVuIFlpCiBCb2IgWW9kbG93c2tpCmRpZmYgLS1naXQgYS9NaXNjL05FV1MgYi9NaXNjL05FV1MKaW5kZXggYTA0MjEyYy4uYzlhNzhkMCAxMDA2NDQKLS0tIGEvTWlzYy9ORVdTCisrKyBiL01pc2MvTkVXUwpAQCAtMiwzNiArMiw3MiBAQAogUHl0aG9uIE5ld3MKICsrKysrKysrKysrCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4zIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZWxlYXNlIGRhdGU6IFRCQQorKlJlbGVhc2UgZGF0ZTogWFhYWC1YWC1YWCoKIAogQ29yZSBhbmQgQnVpbHRpbnMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKKy0gSXNzdWUgIzIzMDM0OiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIENPVU5UX0FMTE9DUywKKyAgU0hPV19BTExPQ19DT1VOVCBvciBTSE9XX1RSQUNLX0NPVU5UIG1hY3JvcyBpcyBub3cgb2ZmIGJ5ICBkZWZhdWx0LiAgSXQgY2FuCisgIGJlIHJlLWVuYWJsZWQgdXNpbmcgdGhlICItWCBzaG93YWxsb2Njb3VudCIgb3B0aW9uLiAgSXQgbm93IG91dHB1dHMgdG8gc3RkZXJyCisgIGluc3RlYWQgb2Ygc3Rkb3V0LgorCiAtIElzc3VlICMyNzQ0MzogX19sZW5ndGhfaGludF9fKCkgb2YgYnl0ZWFycmF5IGl0ZWFyYXRvciBubyBsb25nZXIgcmV0dXJuCiAgIG5lZ2F0aXZlIGludGVnZXIgZm9yIHJlc2l6ZWQgYnl0ZWFycmF5LgogCistIElzc3VlICMyNzAwNzogVGhlIGZyb21oZXgoKSBjbGFzcyBtZXRob2RzIG9mIGJ5dGVzIGFuZCBieXRlYXJyYXkgc3ViY2xhc3NlcworICBub3cgcmV0dXJuIGFuIGluc3RhbmNlIG9mIGNvcnJlc3BvbmRpbmcgc3ViY2xhc3MuCisKIExpYnJhcnkKIC0tLS0tLS0KIAotLSBJc3N1ZSAjMjY2NjQ6IEZpeCBhY3RpdmF0ZS5maXNoIGJ5IHJlbW92aW5nIG1pcy11c2Ugb2YgYGAkYGAuCistIElzc3VlICMyNjcyMTogQ2hhbmdlIHRoZSBzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGUgYXR0cmlidXRlCisgIHRvIGltcGxlbWVudCBCdWZmZXJlZElPQmFzZS4gSW4gcGFydGljdWxhciwgdGhlIHdyaXRlKCkgbWV0aG9kIG5vIGxvbmdlcgorICBkb2VzIHBhcnRpYWwgd3JpdGVzLgogCi0tIElzc3VlICMyMjExNTogRml4ZWQgdHJhY2luZyBUa2ludGVyIHZhcmlhYmxlczogdHJhY2VfdmRlbGV0ZSgpIHdpdGggd3JvbmcKLSAgbW9kZSBubyBsb25nZXIgYnJlYWsgdHJhY2luZywgdHJhY2VfdmluZm8oKSBub3cgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mCi0gIHBhaXJzIG9mIHN0cmluZ3MsIHRyYWNpbmcgaW4gdGhlICJ1IiBtb2RlIG5vdyB3b3Jrcy4KKy0gSXNzdWUgIzIyMTE1OiBBZGRlZCBtZXRob2RzIHRyYWNlX2FkZCwgdHJhY2VfcmVtb3ZlIGFuZCB0cmFjZV9pbmZvIGluIHRoZQorICB0a2ludGVyLlZhcmlhYmxlIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzIHRyYWNlX3ZhcmlhYmxlLCB0cmFjZSwKKyAgdHJhY2VfdmRlbGV0ZSBhbmQgdHJhY2VfdmluZm8gdGhhdCB1c2Ugb2Jzb2xldGUgVGNsIGNvbW1hbmRzIGFuZCBtaWdodAorICBub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLiAgRml4ZWQgb2xkIHRyYWNpbmcgbWV0aG9kczoKKyAgdHJhY2VfdmRlbGV0ZSgpIHdpdGggd3JvbmcgbW9kZSBubyBsb25nZXIgYnJlYWsgdHJhY2luZywgdHJhY2VfdmluZm8oKSBub3cKKyAgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mIHBhaXJzIG9mIHN0cmluZ3MsIHRyYWNpbmcgaW4gdGhlICJ1IiBtb2RlIG5vdyB3b3Jrcy4KIAotLSBGaXggYSBzY29waW5nIGlzc3VlIGluIGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXIgd2hpY2ggdHJpZ2dlcmVkIGFuCi0gIFVuYm91bmRMb2NhbEVycm9yIHdoZW4gbGF6eS1sb2FkaW5nIGEgbW9kdWxlIHRoYXQgd2FzIGFscmVhZHkgcHV0IGludG8KLSAgc3lzLm1vZHVsZXMuCistIElzc3VlICMyNjI0MzogT25seSB0aGUgbGV2ZWwgYXJndW1lbnQgdG8gemxpYi5jb21wcmVzcygpIGlzIGtleXdvcmQgYXJndW1lbnQKKyAgbm93LiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHBvc2l0aW9uYWwtb25seS4KKworLSBJc3N1ZSAjMjcwMzg6IEV4cG9zZSB0aGUgRGlyRW50cnkgdHlwZSBhcyBvcy5EaXJFbnRyeS4gQ29kZSBwYXRjaCBieQorICBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjcxODY6IFVwZGF0ZSBvcy5mc3BhdGgoKS9QeU9TX0ZTUGF0aCgpIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgX19mc3BhdGhfXygpIHRvIGJlIGVpdGhlciBzdHIgb3IgYnl0ZXMuCisKKy0gSXNzdWUgIzE4NzI2OiBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBvZiB0aGUgZHVtcCgpLCBkdW1wcygpLAorICBsb2FkKCkgYW5kIGxvYWRzKCkgZnVuY3Rpb25zIGFuZCBKU09ORW5jb2RlciBhbmQgSlNPTkRlY29kZXIgY2xhc3MKKyAgY29uc3RydWN0b3JzIGluIHRoZSBqc29uIG1vZHVsZSBhcmUgbm93IGtleXdvcmQtb25seS4KKworLSBJc3N1ZSAjMjczMTk6IE1ldGhvZHMgc2VsZWN0aW9uX3NldCgpLCBzZWxlY3Rpb25fYWRkKCksIHNlbGVjdGlvbl9yZW1vdmUoKQorICBhbmQgc2VsZWN0aW9uX3RvZ2dsZSgpIG9mIHR0ay5UcmVlVmlldyBub3cgYWxsb3cgcGFzc2luZyBtdWx0aXBsZSBpdGVtcyBhcworICBtdWx0aXBsZSBhcmd1bWVudHMgaW5zdGVhZCBvZiBwYXNzaW5nIHRoZW0gYXMgYSB0dXBsZS4gIERlcHJlY2F0ZWQKKyAgdW5kb2N1bWVudGVkIGFiaWxpdHkgb2YgY2FsbGluZyB0aGUgc2VsZWN0aW9uKCkgbWV0aG9kIHdpdGggYXJndW1lbnRzLgogCiAtIElzc3VlICMyNzA3OTogRml4ZWQgY3Vyc2VzLmFzY2lpIGZ1bmN0aW9ucyBpc2JsYW5rKCksIGlzY250cmwoKSBhbmQgaXNwdW5jdCgpLgogCistIElzc3VlICMyNzI5NDogTnVtZXJpY2FsIHN0YXRlIGluIHRoZSByZXByIGZvciBUa2ludGVyIGV2ZW50IG9iamVjdHMgaXMgbm93CisgIHJlcHJlc2VudGVkIGFzIGEgY29tcGluYXRpb24gb2Yga25vd24gZmxhZ3MuCisKKy0gSXNzdWUgIzI3MTc3OiBNYXRjaCBvYmplY3RzIGluIHRoZSByZSBtb2R1bGUgbm93IHN1cHBvcnQgaW5kZXgtbGlrZSBvYmplY3RzCisgIGFzIGdyb3VwIGluZGljZXMuICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEplcm9lbiBEZW1leWVyIGFuZCBYaWFuZyBaaGFuZy4KKwogLSBJc3N1ZSAjMjY3NTQ6IFNvbWUgZnVuY3Rpb25zIChjb21waWxlKCkgZXRjKSBhY2NlcHRlZCBhIGZpbGVuYW1lIGFyZ3VtZW50CiAgIGVuY29kZWQgYXMgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGUtbGlrZSBvYmplY3RzCiAgIGFyZSBhY2NlcHRlZC4KIAorLSBJc3N1ZSAjMjY1MzY6IHNvY2tldC5pb2N0bCBub3cgc3VwcG9ydHMgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSC4gUGF0Y2ggYnkKKyAgRGFuaWVsIFN0b2tlcy4KKwogLSBJc3N1ZSAjMjcwNDg6IFByZXZlbnRzIGRpc3R1dGlscyBmYWlsaW5nIG9uIFdpbmRvd3Mgd2hlbiBlbnZpcm9ubWVudAogICB2YXJpYWJsZXMgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycwogCkBAIC01MCw5ICs4NiwxNSBAQAogICBUcnVuY2F0ZSBzaXplIHRvIElOVF9NQVggYW5kIGxvb3AgdW50aWwgd2UgY29sbGVjdGVkIGVub3VnaCByYW5kb20gYnl0ZXMsCiAgIGluc3RlYWQgb2YgY2FzdGluZyBhIGRpcmVjdGx5IFB5X3NzaXplX3QgdG8gaW50LgogCistIElzc3VlICMxNjg2NDogc3FsaXRlMy5DdXJzb3IubGFzdHJvd2lkIG5vdyBzdXBwb3J0cyBSRVBMQUNFIHN0YXRlbWVudC4KKyAgSW5pdGlhbCBwYXRjaCBieSBBbGV4IExvcmRUaG9yc2VuLgorCiAtIElzc3VlICMyNjM4NjogRml4ZWQgdHRrLlRyZWVWaWV3IHNlbGVjdGlvbiBvcGVyYXRpb25zIHdpdGggaXRlbSBpZCdzCiAgIGNvbnRhaW5pbmcgc3BhY2VzLgogCistIElzc3VlICM4NjM3OiBIb25vciBhIHBhZ2VyIHNldCBieSB0aGUgZW52IHZhciBNQU5QQUdFUiAoaW4gcHJlZmVyZW5jZSB0bworICBvbmUgc2V0IGJ5IHRoZSBlbnYgdmFyIFBBR0VSKS4KKwogLSBJc3N1ZSAjMjI2MzY6IEF2b2lkIHNoZWxsIGluamVjdGlvbiBwcm9ibGVtcyB3aXRoCiAgIGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeSgpLgogCkBAIC02MCwyMiArMTAyLDQyIEBACiAgIGxvY2FsZSBlbmNvZGluZywgYW5kIGZpeCBnZXRfYmVnaWR4KCkgYW5kIGdldF9lbmRpZHgoKSB0byByZXR1cm4gY29kZSBwb2ludAogICBpbmRleGVzLgogCi0tIElzc3VlICMyNjkzMDogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIHRvIHVzZSBPcGVuU1NMIDEuMC4yaC4KLQogSURMRQogLS0tLQogCistIElzc3VlICMyNzM3MjogVGVzdF9pZGxlIG5vIGxvbmdlciBjaGFuZ2VzIHRoZSBsb2NhbGUuCisKIC0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgY2hhcnMgaW4gSURMRSBORVdTLnR4dCwgZm9yIGNvbnRyaWJ1dG9yIG5hbWVzLgogCiAtIElzc3VlICMyNzI0NTogSURMRTogQ2xlYW5seSBkZWxldGUgY3VzdG9tIHRoZW1lcyBhbmQga2V5IGJpbmRpbmdzLgogICBQcmV2aW91c2x5LCB3aGVuIElETEUgd2FzIHN0YXJ0ZWQgZnJvbSBhIGNvbnNvbGUgb3IgYnkgaW1wb3J0LCBhIGNhc2NhZGUKICAgb2Ygd2FybmluZ3Mgd2FzIGVtaXR0ZWQuICBQYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgogCistIElzc3VlICMyNDEzNzogUnVuIElETEUsIHRlc3RfaWRsZSwgYW5kIGh0ZXN0IHdpdGggdGtpbnRlciBkZWZhdWx0IHJvb3QgZGlzYWJsZWQuCisgIEZpeCBjb2RlIGFuZCB0ZXN0cyB0aGF0IGZhaWwgd2l0aCB0aGlzIHJlc3RyaWN0aW9uLgorICBGaXggaHRlc3RzIHRvIG5vdCBjcmVhdGUgYSBzZWNvbmQgYW5kIHJlZHVuZGFudCByb290IGFuZCBtYWlubG9vcC4KKworLSBJc3N1ZSAjMjczMTA6IEZpeCBJRExFLmFwcCBmYWlsdXJlIHRvIGxhdW5jaCBvbiBPUyBYIGR1ZSB0byB2ZXN0aWdpYWwgaW1wb3J0LgorCiBDIEFQSQogLS0tLS0KIAogLSBJc3N1ZSAjMjY3NTQ6IFB5VW5pY29kZV9GU0RlY29kZXIoKSBhY2NlcHRlZCBhIGZpbGVuYW1lIGFyZ3VtZW50IGVuY29kZWQgYXMKLSAgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGVzLWxpa2Ugb2JqZWN0cyBhcmUgYWNjZXB0ZWQuCisgIGFuIGl0ZXJhYmxlIG9mIGludGVnZXJzLiBOb3cgb25seSBzdHJpbmdzIGFuZCBieXRlLWxpa2Ugb2JqZWN0cyBhcmUgYWNjZXB0ZWQuCisKK0J1aWxkCistLS0tLQorCistIElzc3VlICMyNjkzMDogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIHRvIHVzZSBPcGVuU1NMIDEuMC4yaC4KKworLSBJc3N1ZSAjMjM5Njg6IFJlbmFtZSB0aGUgcGxhdGZvcm0gZGlyZWN0b3J5IGZyb20gcGxhdC0kKE1BQ0hERVApIHRvCisgIHBsYXQtJChQTEFURk9STV9UUklQTEVUKS4KKyAgUmVuYW1lIHRoZSBjb25maWcgZGlyZWN0b3J5IChMSUJQTCkgZnJvbSBjb25maWctJChMRFZFUlNJT04pIHRvCisgIGNvbmZpZy0kKExEVkVSU0lPTiktJChQTEFURk9STV9UUklQTEVUKS4KKyAgSW5zdGFsbCB0aGUgcGxhdGZvcm0gc3BlY2lmYyBfc3lzY29uZmlnZGF0YSBtb2R1bGUgaW50byB0aGUgcGxhdGZvcm0KKyAgZGlyZWN0b3J5IGFuZCByZW5hbWUgaXQgdG8gaW5jbHVkZSB0aGUgQUJJRkxBR1MuCisKKy0gRG9uJ3QgdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGZvciBHTlUvSHVyZC4KIAogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCkBAIC04MywzOCArMTQ1LDMxMCBAQAogLSBJc3N1ZSAjMjc0MTg6IEZpeGVkIFRvb2xzL2ltcG9ydGJlbmNoL2ltcG9ydGJlbmNoLnB5LgogCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBhbHBoYSAyCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlbGVhc2UgZGF0ZTogMjAxNi0wNi0yNgorKlJlbGVhc2UgZGF0ZTogMjAxNi0wNi0xMyoKIAogQ29yZSBhbmQgQnVpbHRpbnMKIC0tLS0tLS0tLS0tLS0tLS0tCiAKLS0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJoLgorLSBJc3N1ZSAjMjcwOTU6IFNpbXBsaWZpZWQgTUFLRV9GVU5DVElPTiBhbmQgcmVtb3ZlZCBNQUtFX0NMT1NVUkUgb3Bjb2Rlcy4KKyAgUGF0Y2ggYnkgRGVtdXIgUnVtZWQuCiAKLVRlc3RzCi0tLS0tLQorLSBJc3N1ZSAjMjcxOTA6IFJhaXNlIE5vdFN1cHBvcnRlZEVycm9yIGlmIHNxbGl0ZTMgaXMgb2xkZXIgdGhhbiAzLjMuMS4KKyAgUGF0Y2ggYnkgRGF2ZSBTYXd5ZXIuCiAKLS0gSXNzdWUgIzI2ODY3OiBVYnVudHUncyBvcGVuc3NsIE9QX05PX1NTTHYzIGlzIGZvcmNlZCBvbiBieSBkZWZhdWx0OyBmaXggdGVzdC4KKy0gSXNzdWUgIzI3Mjg2OiBGaXhlZCBjb21waWxpbmcgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlLiAgQ2FsbGluZworICBmdW5jdGlvbiB3aXRoIGdlbmVyYWxpemVkIHVucGFja2luZyAoUEVQIDQ0OCkgYW5kIGNvbmZsaWN0aW5nIGtleXdvcmQgbmFtZXMKKyAgY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorCistIElzc3VlICMyNzE0MDogQWRkZWQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcGVuKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKKy0gSXNzdWUgIzI3MDY2OiBGaXhlZCBTeXN0ZW1FcnJvciBpZiBhIGN1c3RvbSBvcGVuZXIgKGZvciBvcGVuKCkpIHJldHVybnMgYQorICBuZWdhdGl2ZSBudW1iZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbi4KKworLSBJc3N1ZSAjMjY5ODM6IGZsb2F0KCkgbm93IGFsd2F5cyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZXhhY3QgZmxvYXQuCisgIFRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGVtaXR0ZWQgaWYgX19mbG9hdF9fIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKKyAgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQuICBJbiBhIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gdGhpcyBjYW4KKyAgYmUgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzI3MDk3OiBQeXRob24gaW50ZXJwcmV0ZXIgaXMgbm93IGFib3V0IDclIGZhc3RlciBkdWUgdG8gb3B0aW1pemVkCisgIGluc3RydWN0aW9uIGRlY29kaW5nLiAgQmFzZWQgb24gcGF0Y2ggYnkgRGVtdXIgUnVtZWQuCisKKy0gSXNzdWUgIzI2NjQ3OiBQeXRob24gaW50ZXJwcmV0ZXIgbm93IHVzZXMgMTYtYml0IHdvcmRjb2RlIGluc3RlYWQgb2YgYnl0ZWNvZGUuCisgIFBhdGNoIGJ5IERlbXVyIFJ1bWVkLgorCistIElzc3VlICMyMzI3NTogQWxsb3cgYXNzaWduaW5nIHRvIGFuIGVtcHR5IHRhcmdldCBsaXN0IGluIHJvdW5kIGJyYWNrZXRzOgorICAoKSA9IGl0ZXJhYmxlLgorCistIElzc3VlICMyNzI0MzogVXBkYXRlIHRoZSBfX2FpdGVyX18gcHJvdG9jb2w6IGluc3RlYWQgb2YgcmV0dXJuaW5nCisgIGFuIGF3YWl0YWJsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvciwgdGhlIGFzeW5jaHJvbm91cworICBpdGVyYXRvciBzaG91bGQgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBEb2luZyB0aGUgZm9ybWVyIHdpbGwgdHJpZ2dlciBhCisgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcuCisKKworTGlicmFyeQorLS0tLS0tLQorCistIENvbW1lbnQgb3V0IHNvY2tldCAoU09fUkVVU0VQT1JUKSBhbmQgcG9zaXggKE9fU0hMT0NLLCBPX0VYTE9DSykgY29uc3RhbnRzCisgIGV4cG9zZWQgb24gdGhlIEFQSSB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIG9uIEdOVS9IdXJkLiBUaGV5IHdvdWxkIG5vdAorICB3b3JrIGF0IHJ1bnRpbWUgYW55d2F5LgorCistIElzc3VlICMyNTQ1NTogRml4ZWQgY3Jhc2hlcyBpbiByZXByIG9mIHJlY3Vyc2l2ZSBFbGVtZW50VHJlZS5FbGVtZW50IGFuZAorICBmdW5jdG9vbHMucGFydGlhbCBvYmplY3RzLgorCistIElzc3VlICMyNzI5NDogSW1wcm92ZWQgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzLgorCistIElzc3VlICMyMDUwODogSW1wcm92ZSBleGNlcHRpb24gbWVzc2FnZSBvZiBJUHZ7NCw2fU5ldHdvcmsuX19nZXRpdGVtX18uCisgIFBhdGNoIGJ5IEdhcmV0aCBSZWVzLgorCistIElzc3VlICMyNjU1NjogVXBkYXRlIGV4cGF0IHRvIDIuMS4xLCBmaXhlcyBDVkUtMjAxNS0xMjgzLgorCistIEZpeCBUTFMgc3RyaXBwaW5nIHZ1bG5lcmFiaWxpdHkgaW4gc210cGxpYiwgQ1ZFLTIwMTYtMDc3Mi4gIFJlcG9ydGVkIGJ5IFRlYW0KKyAgT3N0c3Ryb20KKworLSBJc3N1ZSAjMjEzODY6IEltcGxlbWVudCBtaXNzaW5nIElQdjRBZGRyZXNzLmlzX2dsb2JhbCBwcm9wZXJ0eS4gIEl0IHdhcworICBkb2N1bWVudGVkIHNpbmNlIDA3YTU2MTBiYWU5ZC4gIEluaXRpYWwgcGF0Y2ggYnkgUm9nZXIgTHVldGhpLgorCistIElzc3VlICMyNzAyOTogUmVtb3ZlZCBkZXByZWNhdGVkIHN1cHBvcnQgb2YgdW5pdmVyc2FsIG5ld2xpbmVzIG1vZGUgZnJvbQorICBaaXBGaWxlLm9wZW4oKS4KKworLSBJc3N1ZSAjMjcwMzA6IFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIGFuIEFTQ0lJIGxldHRlciBpbgorICByZWd1bGFyIGV4cHJlc3Npb25zIG5vdyBhcmUgZXJyb3JzLiAgVGhlIHJlLkxPQ0FMRSBmbGFnIG5vdyBjYW4gYmUgdXNlZAorICBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgb3MuUGF0aExpa2Ugc3VwcG9ydCB0byBEaXJFbnRyeSAocGFydCBvZiBQRVAgNTE5KS4KKyAgSW5pdGlhbCBwYXRjaCBieSBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjA5MDA6IGRpc3R1dGlscyByZWdpc3RlciBjb21tYW5kIG5vdyBkZWNvZGVzIEhUVFAgcmVzcG9uc2VzCisgIGNvcnJlY3RseS4gIEluaXRpYWwgcGF0Y2ggYnkgaW5ncmlkLgorCistIElzc3VlICMyNzE4NjogQWRkIG9zLlBhdGhMaWtlIHN1cHBvcnQgdG8gcGF0aGxpYiwgcmVtb3ZpbmcgaXRzIHByb3Zpc2lvbmFsCisgIHN0YXR1cyAocGFydCBvZiBQRVAgNTE5KS4gSW5pdGlhbCBwYXRjaCBieSBEdXN0eSBQaGlsbGlwcy4KKworLSBJc3N1ZSAjMjcxODY6IEFkZCBzdXBwb3J0IGZvciBvcy5QYXRoTGlrZSBvYmplY3RzIHRvIG9zLmZzZW5jb2RlKCkgYW5kCisgIG9zLmZzZGVjb2RlKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKKy0gSXNzdWUgIzI3MTg2OiBJbnRyb2R1Y2Ugb3MuUGF0aExpa2UgYW5kIG9zLmZzcGF0aCgpIChwYXJ0IG9mIFBFUCA1MTkpLgorCistIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IHByb3ZpZGVzIHNldmVyYWwgbmV3IGNsYXNzZXMgYW5kCisgIGZlYXR1cmVzOiBAb3ZlcmxvYWQgb3V0c2lkZSBzdHVicywgUmV2ZXJzaWJsZSwgRGVmYXVsdERpY3QsIFRleHQsCisgIENvbnRleHRNYW5hZ2VyLCBUeXBlW10sIE5ld1R5cGUoKSwgVFlQRV9DSEVDS0lORywgYW5kIG51bWVyb3VzIGJ1ZworICBmaXhlcyAobm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBpbgorICBteXB5IG9yIG90aGVyIHN0YXRpYyBhbmFseXplcnMpLiAgQWxzbyBjbGFzc2VzIGZvciBQRVAgNDkyCisgIChBd2FpdGFibGUsIEFzeW5jSXRlcmFibGUsIEFzeW5jSXRlcmF0b3IpIGhhdmUgYmVlbiBhZGRlZCAoaW4gZmFjdAorICB0aGV5IG1hZGUgaXQgaW50byAzLjUuMSBidXQgd2VyZSBuZXZlciBtZW50aW9uZWQpLgorCistIElzc3VlICMyNTczODogU3RvcCBodHRwLnNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfZXJyb3IoKSBmcm9tCisgIHNlbmRpbmcgYSBtZXNzYWdlIGJvZHkgZm9yIDIwNSBSZXNldCBDb250ZW50LiAgQWxzbywgZG9uJ3Qgc2VuZCBDb250ZW50CisgIGhlYWRlciBmaWVsZHMgaW4gcmVzcG9uc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHkuICBQYXRjaCBieSBTdXN1bXUKKyAgS29zaGliYS4KKworLSBJc3N1ZSAjMjEzMTM6IEZpeCB0aGUgInBsYXRmb3JtIiBtb2R1bGUgdG8gdG9sZXJhdGUgd2hlbiBzeXMudmVyc2lvbgorICBjb250YWlucyB0cnVuY2F0ZWQgYnVpbGQgaW5mb3JtYXRpb24uCisKKy0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscyBgYGdldHJhbmRvbSgpYGAgd2l0aAorICBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZyBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tCisgIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaCB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KKworLSBJc3N1ZSAjMjM4ODM6IEFkZGVkIG1pc3NpbmcgQVBJcyB0byBfX2FsbF9fIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXMKKyAgZm9yIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogY2dpLCBtYWlsYm94LCBtaW1ldHlwZXMsIHBsaXN0bGliIGFuZCBzbXRwZC4KKyAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLgorCistIElzc3VlICMyNzE2NDogSW4gdGhlIHpsaWIgbW9kdWxlLCBhbGxvdyBkZWNvbXByZXNzaW5nIHJhdyBEZWZsYXRlIHN0cmVhbXMKKyAgd2l0aCBhIHByZWRlZmluZWQgemRpY3QuICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjQyOTE6IEZpeCB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIuV1NHSVJlcXVlc3RIYW5kbGVyIHRvIGNvbXBsZXRlbHkKKyAgd3JpdGUgZGF0YSB0byB0aGUgY2xpZW50LiAgUHJldmlvdXNseSBpdCBjb3VsZCBkbyBwYXJ0aWFsIHdyaXRlcyBhbmQKKyAgdHJ1bmNhdGUgZGF0YS4gIEFsc28sIHdzZ2lyZWYuaGFuZGxlci5TZXJ2ZXJIYW5kbGVyIGNhbiBub3cgaGFuZGxlIHN0ZG91dAorICBkb2luZyBwYXJ0aWFsIHdyaXRlcywgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjEyNzI6IFVzZSBfc3lzY29uZmlnZGF0YS5weSB0byBpbml0aWFsaXplIGRpc3R1dGlscy5zeXNjb25maWcuCisKKy0gSXNzdWUgIzE5NjExOiA6bW9kOmBpbnNwZWN0YCBub3cgcmVwb3J0cyB0aGUgaW1wbGljaXQgYGAuMGBgIHBhcmFtZXRlcnMKKyAgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgY29tcHJlaGVuc2lvbiBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gc2NvcGVzCisgIGFzIGlmIHRoZXkgd2VyZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyBjYWxsZWQgYGBpbXBsaWNpdDBgYC4KKyAgUGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcworICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQorICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KKworLSBzaWduYWwsIHNvY2tldCwgYW5kIHNzbCBtb2R1bGUgSW50RW51bSBjb25zdGFudCBuYW1lIGxvb2t1cHMgbm93IHJldHVybiBhCisgIGNvbnNpc3RlbnQgbmFtZSBmb3IgdmFsdWVzIGhhdmluZyBtdWx0aXBsZSBuYW1lcy4gIEV4OiBzaWduYWwuU2lnbmFscyg2KQorICBub3cgcmVmZXJzIHRvIGl0c2VsZiBhcyBzaWduYWwuU0lHQUxSTSByYXRoZXIgdGhhbiBmbGlwcGluZyBiZXR3ZWVuIHRoYXQKKyAgYW5kIHNpZ25hbC5TSUdJT1QgYmFzZWQgb24gdGhlIGludGVycHJldGVyJ3MgaGFzaCByYW5kb21pemF0aW9uIHNlZWQuCisKKy0gSXNzdWUgIzI3MTY3OiBDbGFyaWZ5IHRoZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBlcnJvciBtZXNzYWdlIHRleHQKKyAgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVkIGR1ZSB0byBhIHNpZ25hbC4KKworLSBJc3N1ZSAjMjU5MzE6IERvbid0IGRlZmluZSBzb2NrZXRzZXJ2ZXIuRm9ya2luZyogbmFtZXMgb24gcGxhdGZvcm1zIHN1Y2gKKyAgYXMgV2luZG93cyB0aGF0IGRvIG5vdCBzdXBwb3J0IG9zLmZvcmsoKS4KKworLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KKyAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzI2NTI2OiBSZXBsYWNlIGN1c3RvbSBwYXJzZSB0cmVlIHZhbGlkYXRpb24gaW4gdGhlIHBhcnNlcgorICBtb2R1bGUgd2l0aCBhIHNpbXBsZSBERkEgdmFsaWRhdG9yLgorCistIElzc3VlICMyNzExNDogRml4IFNTTENvbnRleHQuX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyB3aXRoCisgIFBlcm1pc3Npb25FcnJvcgorCistIElzc3VlICMxODM4MzogQXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIGZpbHRlcnMgd2hlbiB1c2luZyBmaWx0ZXJ3YXJuaW5ncworICBhbmQgc2ltcGxlZmlsdGVyLiAgQmFzZWQgb24gcGF0Y2ggYnkgQWxleCBTaGtvcC4KKworLSBJc3N1ZSAjMjMwMjY6IHdpbnJlZy5RdWVyeVZhbHVlRXgoKSBub3cgcmV0dXJuIGFuIGludGVnZXIgZm9yIFJFR19RV09SRCB0eXBlLgorCistIElzc3VlICMyNjc0MTogc3VicHJvY2Vzcy5Qb3BlbiBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisKKy0gSXNzdWUgIzI3MDU2OiBPcHRpbWl6ZSBwaWNrbGUubG9hZCgpIGFuZCBwaWNrbGUubG9hZHMoKSwgdXAgdG8gMTAlIGZhc3RlcgorICB0byBkZXNlcmlhbGl6ZSBhIGxvdCBvZiBzbWFsbCBvYmplY3RzLgorCistIElzc3VlICMyMTI3MTogTmV3IGtleXdvcmQgb25seSBwYXJhbWV0ZXJzIGluIHJlc2V0X21vY2sgY2FsbC4KKworLSBJc3N1ZSAjMjU1NDg6IFNob3dpbmcgbWVtb3J5IGFkZHJlc3Mgb2YgY2xhc3Mgb2JqZWN0cyBpbiByZXBsLgogCiBJRExFCiAtLS0tCiAKLS0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgaW4gaWRsZWxpYi9ORVdTLnR4dCAtIG1pbmltYWwgcGFydCBmb3IgMy41LjIuCistIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgorICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKKyAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ3NTA6IFN3aXRjaCBhbGwgc2Nyb2xsYmFycyBpbiBJRExFIHRvIHR0ayB2ZXJzaW9ucy4KKyAgV2hlcmUgbmVlZGVkLCBtaW5pbWFsIHRlc3RzIGFyZSBhZGRlZCB0byBjb3ZlciBjaGFuZ2VzLgorCistIElzc3VlICMyNDc1OTogSURMRSByZXF1aXJlcyB0ayA4LjUgYW5kIGF2YWlsYWJpbGl0eSB0dGsgd2lkZ2V0cy4KKyAgRGVsZXRlIG5vdyB1bm5lZWRlZCB0ayB2ZXJzaW9uIHRlc3RzIGFuZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucy4KKyAgQWRkIHRlc3QgZm9yIElETEUgc3ludGF4IGNvbG9yaXpvZXIuCisKKy0gSXNzdWUgIzI3MjM5OiBpZGxlbGliLm1hY29zeC5pc1h5elRrIGZ1bmN0aW9ucyBpbml0aWFsaXplIGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMjcyNjI6IG1vdmUgQXF1YSB1bmJpbmRpbmcgY29kZSwgd2hpY2ggZW5hYmxlIGNvbnRleHQgbWVudXMsIHRvIG1heG9zeC4KKworLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5CisgIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgorICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KKyAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgorICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dAorCistIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCisgIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCisKKy0gSXNzdWUgIzI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiDigJhgaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTmDigJkgaXMgdGhlIHNhbWUgYXMKKyAg4oCYYGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldYOKAmQorICAzLiBBZnRlciDigJhgb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncylg4oCZLAorICDigJhgb2Iua2V5cygpID09IGxpc3Qob2Iub2JqZWN0LmtleXMpYOKAmS4KKyAgNC4gSW4gbWFjb3NjLCBydW5uaW5nQXNPU1hBUFAgPT0gaXNBcXVhVGs7IGlkQ2FyYm9uQXF1YVRrID09IGlzQ2FyYm9uVGsKKworLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KKyAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI0MjI1OiBSZW5hbWUgbWFueSBgaWRsZWxpYi8qLnB5YCBhbmQgYGlkbGVfdGVzdC90ZXN0XyoucHlgIGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCistIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KKyAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KKworLSBJc3N1ZSAjMjE5Mzk6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcGVyY29sYXRvci4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMyMTY3NjogQWRkIHRlc3QgZm9yIElETEUncyByZXBsYWNlIGRpYWxvZy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgorICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KKworLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciB1bmRvIGRlbGVnYXRvci4gIFBhdGNoIG1vc3RseSBieQorICBTYWltYWRoYXYgSGVibGlrYXIgLgorCistIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KKworLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTY0ODQ6IENoYW5nZSB0aGUgZGVmYXVsdCBQWVRIT05ET0NTIFVSTCB0byAiaHR0cHM6IiwgYW5kIGZpeCB0aGUKKyAgcmVzdWx0aW5nIGxpbmtzIHRvIHVzZSBsb3dlcmNhc2UuICBQYXRjaCBieSBTZWFuIFJvZG1hbiwgdGVzdCBieSBLYXVzaGlrCisgIE5hZGlrdWRpdGkuCisKKy0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCisKKy0gSXNzdWUgIzIyNTU4OiBBZGQgcmVtYWluaW5nIGRvYyBsaW5rcyB0byBzb3VyY2UgY29kZSBmb3IgUHl0aG9uLWNvZGVkIG1vZHVsZXMuCisgIFBhdGNoIGJ5IFlvbmkgTGF2aS4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1Mjg1OiByZWdydGVzdCBub3cgdXNlcyBzdWJwcm9jZXNzZXMgd2hlbiB0aGUgLWoxIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgaXMgdXNlZDogZWFjaCB0ZXN0IGZpbGUgcnVucyBpbiBhIGZyZXNoIGNoaWxkIHByb2Nlc3MuIEJlZm9yZSwgdGhlIC1qMSBvcHRpb24KKyAgd2FzIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI1Mjg1OiBUb29scy9idWlsZGJvdC90ZXN0LmJhdCBzY3JpcHQgbm93IHVzZXMgLWoxIGJ5IGRlZmF1bHQgdG8gcnVuCisgIGVhY2ggdGVzdCBmaWxlIGluIGZyZXNoIGNoaWxkIHByb2Nlc3MuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjcwNjQ6IFRoZSBweS5leGUgbGF1bmNoZXIgbm93IGRlZmF1bHRzIHRvIFB5dGhvbiAzLgorICBUaGUgV2luZG93cyBsYXVuY2hlciBgYHB5LmV4ZWBgIG5vIGxvbmdlciBwcmVmZXJzIGFuIGluc3RhbGxlZAorICBQeXRob24gMiB2ZXJzaW9uIG92ZXIgUHl0aG9uIDMgYnkgZGVmYXVsdCB3aGVuIHVzZWQgaW50ZXJhY3RpdmVseS4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKKyAgYnkgWGF2aWVyIGRlIEdheWUuCisKKy0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKKyAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yaC4KKworTWlzYworLS0tLQorCistIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQorICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjcxODY6IEFkZCB0aGUgUHlPU19GU1BhdGgoKSBmdW5jdGlvbiAocGFydCBvZiBQRVAgNTE5KS4KKworLSBJc3N1ZSAjMjYyODI6IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBzdXBwb3J0cyBwb3NpdGlvbmFsLW9ubHkKKyAgcGFyYW1ldGVycy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI2MjgyOiBBcmd1bWVudCBDbGluaWMgbm93IHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBhbmQga2V5d29yZAorICBwYXJhbWV0ZXJzIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgogCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlbGVhc2UgZGF0ZTogMjAxNi0wNi0xMgorUmVsZWFzZSBkYXRlOiAyMDE2LTA1LTE2CiAKIENvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCi0tIElzc3VlICMyNzA2NjogRml4ZWQgU3lzdGVtRXJyb3IgaWYgYSBjdXN0b20gb3BlbmVyIChmb3Igb3BlbigpKSByZXR1cm5zIGEKLSAgbmVnYXRpdmUgbnVtYmVyIHdpdGhvdXQgc2V0dGluZyBhbiBleGNlcHRpb24uCi0KIC0gSXNzdWUgIzIwMDQxOiBGaXhlZCBUeXBlRXJyb3Igd2hlbiBmcmFtZS5mX3RyYWNlIGlzIHNldCB0byBOb25lLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIApAQCAtMTIzLDExICs0NTcsMTcgQEAKIAogLSBJc3N1ZSAjMjY5OTE6IEZpeCBwb3NzaWJsZSByZWZsZWFrIHdoZW4gY3JlYXRpbmcgYSBmdW5jdGlvbiB3aXRoIGFubm90YXRpb25zLgogCi0tIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIFBhdGNoIGJ5Ci0gIEpvZSBKZXZuaWsuCistIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIEJhc2VkIG9uCisgIHBhdGNoIGJ5IEpvZSBKZXZuaWsuCiAKIC0gSXNzdWUgIzIzNjQwOiBpbnQuZnJvbV9ieXRlcygpIG5vIGxvbmdlciBieXBhc3NlcyBjb25zdHJ1Y3RvcnMgZm9yIHN1YmNsYXNzZXMuCiAKKy0gSXNzdWUgIzI3MDA1OiBPcHRpbWl6ZWQgdGhlIGZsb2F0LmZyb21oZXgoKSBjbGFzcyBtZXRob2QgZm9yIGV4YWN0IGZsb2F0LgorICBJdCBpcyBub3cgMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzE4NTMxOiBTaW5nbGUgdmFyLWtleXdvcmQgYXJndW1lbnQgb2YgZGljdCBzdWJ0eXBlIHdhcyBwYXNzZWQKKyAgdW5zY2F0aGVkIHRvIHRoZSBDLWRlZmluZWQgZnVuY3Rpb24uICBOb3cgaXQgaXMgY29udmVydGVkIHRvIGV4YWN0IGRpY3QuCisKIC0gSXNzdWUgIzI2ODExOiBnYy5nZXRfb2JqZWN0cygpIG5vIGxvbmdlciBjb250YWlucyBhIGJyb2tlbiB0dXBsZSB3aXRoIE5VTEwKICAgcG9pbnRlci4KIApAQCAtMTM3LDExICs0NzcsMjYgQEAKICAgaW50ZXJwb2xhdGlvbiBpbiAucHlwaXJjIGZpbGVzLCBtYXRjaGluZyBiZWhhdmlvciBpbiBQeXRob24KICAgMi43IGFuZCBTZXR1cHRvb2xzIDE5LjAuCiAKKy0gSXNzdWUgIzI2MjQ5OiBNZW1vcnkgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGRvbWFpbgorICAoOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWApIG5vdyB1c2UgdGhlIDpyZWY6YHB5bWFsbG9jIGFsbG9jYXRvciA8cHltYWxsb2M+YAorICByYXRoZXIgdGhhbiBzeXN0ZW0gOmM6ZnVuYzpgbWFsbG9jYC4gQXBwbGljYXRpb25zIGNhbGxpbmcKKyAgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCBjYW4gbm93IGNyYXNoOiB1c2UKKyAgYGBQWVRIT05NQUxMT0M9ZGVidWdgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB2YWxpZGF0ZSB0aGUgdXNhZ2Ugb2YgbWVtb3J5CisgIGFsbG9jYXRvcnMgaW4geW91ciBhcHBsaWNhdGlvbi4KKworLSBJc3N1ZSAjMjY4MDI6IE9wdGltaXplIGZ1bmN0aW9uIGNhbGxzIG9ubHkgdXNpbmcgdW5wYWNraW5nIGxpa2UKKyAgYGBmdW5jKCp0dXBsZSlgYCAobm8gb3RoZXIgcG9zaXRpb25hbCBhcmd1bWVudCwgbm8ga2V5d29yZCk6IGF2b2lkIGNvcHlpbmcKKyAgdGhlIHR1cGxlLiBQYXRjaCB3cml0dGVuIGJ5IEpvZSBKZXZuaWsuCisKIC0gSXNzdWUgIzI2NjU5OiBNYWtlIHRoZSBidWlsdGluIHNsaWNlIHR5cGUgc3VwcG9ydCBjeWNsZSBjb2xsZWN0aW9uLgogCiAtIElzc3VlICMyNjcxODogc3VwZXIuX19pbml0X18gbm8gbG9uZ2VyIGxlYWtzIG1lbW9yeSBpZiBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCiAgIE5PVEU6IEEgZGlyZWN0IGNhbGwgb2Ygc3VwZXIuX19pbml0X18gaXMgbm90IGVuZG9yc2VkIQogCistIElzc3VlICMyNzEzODogRml4IHRoZSBkb2MgY29tbWVudCBmb3IgRmlsZUZpbmRlci5maW5kX3NwZWMoKS4KKworLSBJc3N1ZSAjMjcxNDc6IE1lbnRpb24gUEVQIDQyMCBpbiB0aGUgaW1wb3J0bGliIGRvY3MuCisKIC0gSXNzdWUgIzI1MzM5OiBQWVRIT05JT0VOQ09ESU5HIG5vdyBoYXMgcHJpb3JpdHkgb3ZlciBsb2NhbGUgaW4gc2V0dGluZyB0aGUKICAgZXJyb3IgaGFuZGxlciBmb3Igc3RkaW4gYW5kIHN0ZG91dC4KIApAQCAtMTUwLDkgKzUwNSw0MSBAQAogICBieXRlYXJyYXksIGxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgT3JkZXJlZERpY3QsIGNvcnJlc3BvbmRpbmcKICAgdmlld3MgYW5kIG9zLnNjYW5kaXIoKSBpdGVyYXRvci4KIAorLSBJc3N1ZSAjMjY1NzQ6IE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kCisgIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgLiBQYXRjaCB3cml0dGVuIGJ5IEpvc2ggU25pZGVyLgorCiAtIElzc3VlICMyNjU4MTogSWYgY29kaW5nIGNvb2tpZSBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMgb24gYSBsaW5lIGluCiAgIFB5dGhvbiBzb3VyY2UgY29kZSBmaWxlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgdGFrZW4gdG8gYWNjb3VudC4KIAorLSBJc3N1ZSAjMTk3MTE6IEFkZCB0ZXN0cyBmb3IgcmVsb2FkaW5nIG5hbWVzcGFjZSBwYWNrYWdlcy4KKworLSBJc3N1ZSAjMjEwOTk6IFN3aXRjaCBhcHBsaWNhYmxlIGltcG9ydGxpYiB0ZXN0cyB0byB1c2UgUEVQIDQ1MSBBUEkuCisKKy0gSXNzdWUgIzI2NTYzOiBEZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHJhaXNlIGEgZmF0YWwKKyAgZXJyb3IgaWYgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGZhbWlseSBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjU2NDogT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZQorICB0aGUgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMKKyAgYWxsb2NhdGVkLgorCistIElzc3VlICMyNjU1ODogVGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yCisgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2Agbm93IGRldGVjdCB3aGVuIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjUxNjogQWRkIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZQorICBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKKy0gSXNzdWUgIzI2NTE2OiBUaGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBjYW4gbm93IGFsc28gYmUKKyAgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorCistIElzc3VlICMyNjUxNjogVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gbm93CisgIGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLiBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZgorICBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCistIElzc3VlICMyNjUxNjogSW4gZGVidWcgbW9kZSwgZGVidWcgaG9va3MgYXJlIG5vdyBhbHNvIGluc3RhbGxlZCBvbiBQeXRob24KKyAgbWVtb3J5IGFsbG9jYXRvcnMgd2hlbiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IHB5bWFsbG9jLgorCiAtIElzc3VlICMyNjQ2NDogRml4IHN0ci50cmFuc2xhdGUoKSB3aGVuIHN0cmluZyBpcyBBU0NJSSBhbmQgZmlyc3QgcmVwbGFjZW1lbnRzCiAgIHJlbW92ZXMgY2hhcmFjdGVyLCBidXQgbmV4dCByZXBsYWNlbWVudCB1c2VzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhCiAgIHN0cmluZyBsb25nZXIgdGhhbiAxIGNoYXJhY3Rlci4gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjUuMC4KQEAgLTE2NSwxMSArNTUyLDM3IEBACiAtIElzc3VlICMyNjMwMjogQ29ycmVjdCBiZWhhdmlvciB0byByZWplY3QgY29tbWEgYXMgYSBsZWdhbCBjaGFyYWN0ZXIgZm9yCiAgIGNvb2tpZSBuYW1lcy4KIAorLSBJc3N1ZSAjMjYxMzY6IFVwZ3JhZGUgdGhlIHdhcm5pbmcgd2hlbiBhIGdlbmVyYXRvciByYWlzZXMgU3RvcEl0ZXJhdGlvbgorICBmcm9tIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgdG8gRGVwcmVjYXRpb25XYXJuaW5nLiAgUGF0Y2ggYnkgQW5pc2gKKyAgU2hhaC4KKworLSBJc3N1ZSAjMjYyMDQ6IFRoZSBjb21waWxlciBub3cgaWdub3JlcyBhbGwgY29uc3RhbnQgc3RhdGVtZW50czogYnl0ZXMsIHN0ciwKKyAgaW50LCBmbG9hdCwgY29tcGxleCwgbmFtZSBjb25zdGFudHMgKE5vbmUsIEZhbHNlLCBUcnVlKSwgRWxsaXBzaXMKKyAgYW5kIGFzdC5Db25zdGFudDsgbm90IG9ubHkgc3RyIGFuZCBpbnQuIEZvciBleGFtcGxlLCBgYDEuMGBgIGlzIG5vdyBpZ25vcmVkCisgIGluIGBgZGVmIGYoKTogMS4wYGAuCisKIC0gSXNzdWUgIzQ4MDY6IEF2b2lkIG1hc2tpbmcgdGhlIG9yaWdpbmFsIFR5cGVFcnJvciBleGNlcHRpb24gd2hlbiB1c2luZyBzdGFyCiAgICgqKSB1bnBhY2tpbmcgaW4gZnVuY3Rpb24gY2FsbHMuICBCYXNlZCBvbiBwYXRjaCBieSBIYWdlbiBGw7xyc3RlbmF1IGFuZAogICBEYW5pZWwgVXJiYW4uCiAKLS0gSXNzdWUgIzI3MTM4OiBGaXggdGhlIGRvYyBjb21tZW50IGZvciBGaWxlRmluZGVyLmZpbmRfc3BlYygpLgorLSBJc3N1ZSAjMjYxNDY6IEFkZCBhIG5ldyBraW5kIG9mIEFTVCBub2RlOiBgYGFzdC5Db25zdGFudGBgLiBJdCBjYW4gYmUgdXNlZAorICBieSBleHRlcm5hbCBBU1Qgb3B0aW1pemVycywgYnV0IHRoZSBjb21waWxlciBkb2VzIG5vdCBlbWl0IGRpcmVjdGx5IHN1Y2gKKyAgbm9kZS4KKworLSBJc3N1ZSAjMjM2MDE6ICBTcGVkLXVwIGFsbG9jYXRpb24gb2YgZGljdCBrZXkgb2JqZWN0cyBieSB1c2luZyBQeXRob24ncworICBzbWFsbCBvYmplY3QgYWxsb2NhdG9yLiAgKENvbnRyaWJ1dGVkIGJ5IEp1bGlhbiBUYXlsb3IuKQorCistIElzc3VlICMxODAxODogSW1wb3J0IHJhaXNlcyBJbXBvcnRFcnJvciBpbnN0ZWFkIG9mIFN5c3RlbUVycm9yIGlmIGEgcmVsYXRpdmUKKyAgaW1wb3J0IGlzIGF0dGVtcHRlZCB3aXRob3V0IGEga25vd24gcGFyZW50IHBhY2thZ2UuCisKKy0gSXNzdWUgIzI1ODQzOiBXaGVuIGNvbXBpbGluZyBjb2RlLCBkb24ndCBtZXJnZSBjb25zdGFudHMgaWYgdGhleSBhcmUgZXF1YWwKKyAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBgYGYxLCBmMiA9IGxhbWJkYTogMSwgbGFtYmRhOiAxLjBgYAorICBpcyBub3cgY29ycmVjdGx5IGNvbXBpbGVkIHRvIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zOiBgYGYxKClgYCByZXR1cm5zIGBgMWBgCisgIChgYGludGBgKSBhbmQgYGBmMigpYGAgcmV0dXJucyBgYDEuMGBgIChgYGZsb2F0YGApLCBldmVuIGlmIGBgMWBgIGFuZCBgYDEuMGBgCisgIGFyZSBlcXVhbC4KKworLSBJc3N1ZSAjMjYxMDc6IFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cworICBjaGFuZ2VzIHRvIHN1cHBvcnQgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuCiAKIC0gSXNzdWUgIzI2MTU0OiBBZGQgYSBuZXcgcHJpdmF0ZSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBmdW5jdGlvbiB0byBnZXQKICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZSwgYnV0IGRvbid0IGlzc3VlIGEgZmF0YWwgZXJyb3IgaWYgaXQgaXMgTlVMTC4KQEAgLTE3OCwxNSArNTkxLDggQEAKICAgUHl0aG9uIDMuNS4xIHRvIGhpZGUgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIGF0b21pYyBDIHR5cGVzLCB0byBhdm9pZAogICBjb21waWxlciBpc3N1ZXMuCiAKLS0gSXNzdWUgIzI2MTk0OiAgRGVxdWUuaW5zZXJ0KCkgZ2F2ZSBvZGQgcmVzdWx0cyBmb3IgYm91bmRlZCBkZXF1ZXMgdGhhdCBoYWQKLSAgcmVhY2hlZCB0aGVpciBtYXhpbXVtIHNpemUuICBOb3cgYW4gSW5kZXhFcnJvciB3aWxsIGJlIHJhaXNlZCB3aGVuIGF0dGVtcHRpbmcKLSAgdG8gaW5zZXJ0IGludG8gYSBmdWxsIGRlcXVlLgotCi0tIElzc3VlICMyNTg0MzogV2hlbiBjb21waWxpbmcgY29kZSwgZG9uJ3QgbWVyZ2UgY29uc3RhbnRzIGlmIHRoZXkgYXJlIGVxdWFsCi0gIGJ1dCBoYXZlIGEgZGlmZmVyZW50IHR5cGVzLiBGb3IgZXhhbXBsZSwgYGBmMSwgZjIgPSBsYW1iZGE6IDEsIGxhbWJkYTogMS4wYGAKLSAgaXMgbm93IGNvcnJlY3RseSBjb21waWxlZCB0byB0d28gZGlmZmVyZW50IGZ1bmN0aW9uczogYGBmMSgpYGAgcmV0dXJucyBgYDFgYAotICAoYGBpbnRgYCkgYW5kIGBgZjIoKWBgIHJldHVybnMgYGAxLjBgYCAoYGBpbnRgYCksIGV2ZW4gaWYgYGAxYGAgYW5kIGBgMS4wYGAKLSAgYXJlIGVxdWFsLgorLSBJc3N1ZSAjMjU3OTE6IElmIF9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudCBvciBpZiBuZWl0aGVyIF9fcGFja2FnZV9fIG9yCisgIF9fc3BlY19fIGFyZSBkZWZpbmVkIHRoZW4gSW1wb3J0V2FybmluZyBpcyByYWlzZWQuCiAKIC0gSXNzdWUgIzIyOTk1OiBbVVBEQVRFXSBDb21tZW50IG91dCB0aGUgb25lIG9mIHRoZSBwaWNrbGVhYmlsaXR5IHRlc3RzIGluCiAgIF9QeU9iamVjdF9HZXRTdGF0ZSgpIGR1ZSB0byByZWdyZXNzaW9ucyBvYnNlcnZlZCBpbiBDeXRob24tYmFzZWQgcHJvamVjdHMuCkBAIC0yMTIsNyArNjE4LDEwIEBACiAKIC0gSXNzdWUgIzI1NzA5OiBGaXhlZCBwcm9ibGVtIHdpdGggaW4tcGxhY2Ugc3RyaW5nIGNvbmNhdGVuYXRpb24gYW5kIHV0Zi04IGNhY2hlLgogCi0tIElzc3VlICMyNzE0NzogTWVudGlvbiBQRVAgNDIwIGluIHRoZSBpbXBvcnRsaWIgZG9jcy4KKy0gSXNzdWUgIzUzMTk6IE5ldyBQeV9GaW5hbGl6ZUV4KCkgQVBJIGFsbG93aW5nIFB5dGhvbiB0byBzZXQgYW4gZXhpdCBzdGF0dXMKKyAgb2YgMTIwIG9uIGZhaWx1cmUgdG8gZmx1c2ggYnVmZmVyZWQgc3RyZWFtcy4KKworLSBJc3N1ZSAjMjU0ODU6IHRlbG5ldGxpYi5UZWxuZXQgaXMgbm93IGEgY29udGV4dCBtYW5hZ2VyLgogCiAtIElzc3VlICMyNDA5NzogRml4ZWQgY3Jhc2ggaW4gb2JqZWN0Ll9fcmVkdWNlX18oKSBpZiBzbG90IG5hbWUgaXMgZnJlZWQgaW5zaWRlCiAgIF9fZ2V0YXR0cl9fLgpAQCAtMjIxLDYgKzYzMCw4OCBAQAogICBfX2J5dGVzX18sIF9fdHJ1bmNfXywgYW5kIF9fZmxvYXRfXyByZXR1cm5pbmcgaW5zdGFuY2VzIG9mIHN1YmNsYXNzZXMgb2YKICAgYnl0ZXMsIGludCwgYW5kIGZsb2F0IHRvIHN1YmNsYXNzZXMgb2YgYnl0ZXMsIGludCwgYW5kIGZsb2F0IGNvcnJlc3BvbmRpbmdseS4KIAorLSBJc3N1ZSAjMjU2MzA6IEZpeCBhIHBvc3NpYmxlIHNlZ2ZhdWx0IGR1cmluZyBhcmd1bWVudCBwYXJzaW5nIGluIGZ1bmN0aW9ucworICB0aGF0IGFjY2VwdCBmaWxlc3lzdGVtIHBhdGhzLgorCistIElzc3VlICMyMzU2NDogRml4ZWQgYSBwYXJ0aWFsbHkgYnJva2VuIHNhbml0eSBjaGVjayBpbiB0aGUgX3Bvc2l4c3VicHJvY2VzcworICBpbnRlcm5hbHMgcmVnYXJkaW5nIGhvdyBmZHNfdG9fcGFzcyB3ZXJlIHBhc3NlZCB0byB0aGUgY2hpbGQuICBUaGUgYnVnIGhhZAorICBubyBhY3R1YWwgaW1wYWN0IGFzIHN1YnByb2Nlc3MucHkgYWxyZWFkeSBhdm9pZGVkIGl0LgorCistIElzc3VlICMyNTM4ODogRml4ZWQgdG9rZW5pemVyIGNyYXNoIHdoZW4gcHJvY2Vzc2luZyB1bmRlY29kYWJsZSBzb3VyY2UgY29kZQorICB3aXRoIGEgbnVsbCBieXRlLgorCistIElzc3VlICMyNTQ2MjogVGhlIGhhc2ggb2YgdGhlIGtleSBub3cgaXMgY2FsY3VsYXRlZCBvbmx5IG9uY2UgaW4gbW9zdAorICBvcGVyYXRpb25zIGluIEMgaW1wbGVtZW50YXRpb24gb2YgT3JkZXJlZERpY3QuCisKKy0gSXNzdWUgIzIyOTk1OiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIF9fcmVkdWNlX18gYW5kIF9fcmVkdWNlX2V4X18gbm93CisgIHJlamVjdHMgYnVpbHRpbiB0eXBlcyB3aXRoIG5vdCBkZWZpbmVkIF9fbmV3X18uCisKKy0gSXNzdWUgIzI0ODAyOiBBdm9pZCBidWZmZXIgb3ZlcnJlYWRzIHdoZW4gaW50KCksIGZsb2F0KCksIGNvbXBpbGUoKSwgZXhlYygpCisgIGFuZCBldmFsKCkgYXJlIHBhc3NlZCBieXRlcy1saWtlIG9iamVjdHMuICBUaGVzZSBvYmplY3RzIGFyZSBub3QKKyAgbmVjZXNzYXJpbHkgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZSwgYnV0IHRoZSBmdW5jdGlvbnMgYXNzdW1lZCB0aGV5IHdlcmUuCisKKy0gSXNzdWUgIzI1NTU1OiBGaXggcGFyc2VyIGFuZCBBU1Q6IGZpbGwgbGluZW5vIGFuZCBjb2xfb2Zmc2V0IG9mICJhcmciIG5vZGUKKyAgd2hlbiBjb21waWxpbmcgQVNUIGZyb20gUHl0aG9uIG9iamVjdHMuCisKKy0gSXNzdWUgIzI0NzI2OiBGaXhlZCBhIGNyYXNoIGFuZCBsZWFraW5nIE5VTEwgaW4gcmVwcigpIG9mIE9yZGVyZWREaWN0IHRoYXQKKyAgd2FzIG11dGF0ZWQgYnkgZGlyZWN0IGNhbGxzIG9mIGRpY3QgbWV0aG9kcy4KKworLSBJc3N1ZSAjMjU0NDk6IEl0ZXJhdGluZyBPcmRlcmVkRGljdCB3aXRoIGtleXMgd2l0aCB1bnN0YWJsZSBoYXNoIG5vdyByYWlzZXMKKyAgS2V5RXJyb3IgaW4gQyBpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCBhcyBpbiBQeXRob24gaW1wbGVtZW50YXRpb24uCisKKy0gSXNzdWUgIzI1Mzk1OiBGaXhlZCBjcmFzaCB3aGVuIGhpZ2hseSBuZXN0ZWQgT3JkZXJlZERpY3Qgc3RydWN0dXJlcyB3ZXJlCisgIGdhcmJhZ2UgY29sbGVjdGVkLgorCistIElzc3VlICMyNTQwMTogT3B0aW1pemUgYnl0ZXMuZnJvbWhleCgpIGFuZCBieXRlYXJyYXkuZnJvbWhleCgpOiB0aGV5IGFyZSBub3cKKyAgYmV0d2VlbiAyeCBhbmQgMy41eCBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1Mzk5OiBPcHRpbWl6ZSBieXRlYXJyYXkgJSBhcmdzIHVzaW5nIHRoZSBuZXcgcHJpdmF0ZSBfUHlCeXRlc1dyaXRlcgorICBBUEkuIEZvcm1hdHRpbmcgaXMgbm93IGJldHdlZW4gMi41IGFuZCA1IHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjUyNzQ6IHN5cy5zZXRyZWN1cnNpb25saW1pdCgpIG5vdyByYWlzZXMgYSBSZWN1cnNpb25FcnJvciBpZiB0aGUgbmV3CisgIHJlY3Vyc2lvbiBsaW1pdCBpcyB0b28gbG93IGRlcGVuZGluZyBhdCB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguIE1vZGlmeQorICBhbHNvIHRoZSAibG93ZXItd2F0ZXIgbWFyayIgZm9ybXVsYSB0byBtYWtlIGl0IG1vbm90b25pYy4gVGhpcyBtYXJrIGlzIHVzZWQKKyAgdG8gZGVjaWRlIHdoZW4gdGhlIG92ZXJmbG93ZWQgZmxhZyBvZiB0aGUgdGhyZWFkIHN0YXRlIGlzIHJlc2V0LgorCistIElzc3VlICMyNDQwMjogRml4IGlucHV0KCkgdG8gcHJvbXB0IHRvIHRoZSByZWRpcmVjdGVkIHN0ZG91dCB3aGVuCisgIHN5cy5zdGRvdXQuZmlsZW5vKCkgZmFpbHMuCisKKy0gSXNzdWUgIzI1MzQ5OiBPcHRpbWl6ZSBieXRlcyAlIGFyZ3MgdXNpbmcgdGhlIG5ldyBwcml2YXRlIF9QeUJ5dGVzV3JpdGVyIEFQSS4KKyAgRm9ybWF0dGluZyBpcyBub3cgdXAgdG8gMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI0ODA2OiBQcmV2ZW50IGJ1aWx0aW4gdHlwZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgc3ViY2xhc3NlZCBmcm9tCisgIGJlaW5nIHN1YmNsYXNzZWQgdGhyb3VnaCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKworLSBJc3N1ZSAjMjUzMDE6IFRoZSBVVEYtOCBkZWNvZGVyIGlzIG5vdyB1cCB0byAxNSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvcgorICBoYW5kbGVyczogYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAuCisKKy0gSXNzdWUgIzI0ODQ4OiBGaXhlZCBhIG51bWJlciBvZiBidWdzIGluIFVURi03IGRlY29kaW5nIG9mIG1pc2Zvcm1lZCBkYXRhLgorCistIElzc3VlICMyNTI2NzogVGhlIFVURi04IGVuY29kZXIgaXMgbm93IHVwIHRvIDc1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yCisgIGhhbmRsZXJzOiBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAuCisgIFBhdGNoIGNvLXdyaXR0ZW4gd2l0aCBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNTI4MDogSW1wb3J0IHRyYWNlIG1lc3NhZ2VzIGVtaXR0ZWQgaW4gdmVyYm9zZSAoLXYpIG1vZGUgYXJlIG5vCisgIGxvbmdlciBmb3JtYXR0ZWQgdHdpY2UuCisKKy0gSXNzdWUgIzI1MjI3OiBPcHRpbWl6ZSBBU0NJSSBhbmQgbGF0aW4xIGVuY29kZXJzIHdpdGggdGhlIGBgc3Vycm9nYXRlZXNjYXBlYGAKKyAgZXJyb3IgaGFuZGxlcjogdGhlIGVuY29kZXJzIGFyZSBub3cgdXAgdG8gMyB0aW1lcyBhcyBmYXN0LiBJbml0aWFsIHBhdGNoCisgIHdyaXR0ZW4gYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjUwMDM6IE9uIFNvbGFyaXMgMTEuMyBvciBuZXdlciwgb3MudXJhbmRvbSgpIG5vdyB1c2VzIHRoZQorICBnZXRyYW5kb20oKSBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBnZXRlbnRyb3B5KCkgZnVuY3Rpb24uIFRoZSBnZXRlbnRyb3B5KCkKKyAgZnVuY3Rpb24gaXMgYmxvY2tpbmcgdG8gZ2VuZXJhdGUgdmVyeSBnb29kIHF1YWxpdHkgZW50cm9weSwgb3MudXJhbmRvbSgpCisgIGRvZXNuJ3QgbmVlZCBzdWNoIGhpZ2gtcXVhbGl0eSBlbnRyb3B5LgorCistIElzc3VlICM5MjMyOiBNb2RpZnkgUHl0aG9uJ3MgZ3JhbW1hciB0byBhbGxvdyB0cmFpbGluZyBjb21tYXMgaW4gdGhlCisgIGFyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gIEZvciBleGFtcGxlLCAiZGVmIGYoXCosIGEgPQorICAzLCk6IHBhc3MiIGlzIG5vdyBsZWdhbC4gUGF0Y2ggZnJvbSBNYXJrIERpY2tpbnNvbi4KKworLSBJc3N1ZSAjMjQ5NjU6IEltcGxlbWVudCBQRVAgNDk4ICJMaXRlcmFsIFN0cmluZyBJbnRlcnBvbGF0aW9uIi4gVGhpcworICBhbGxvd3MgeW91IHRvIGVtYmVkIGV4cHJlc3Npb25zIGluc2lkZSBmLXN0cmluZ3MsIHdoaWNoIGFyZQorICBjb252ZXJ0ZWQgdG8gbm9ybWFsIHN0cmluZ3MgYXQgcnVuIHRpbWUuIEdpdmVuIHg9MywgdGhlbgorICBmJ3ZhbHVlPXt4fScgPT0gJ3ZhbHVlPTMnLiBQYXRjaCBieSBFcmljIFYuIFNtaXRoLgorCiAtIElzc3VlICMyNjQ3ODogRml4IHNlbWFudGljIGJ1Z3Mgd2hlbiB1c2luZyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggZGljdGlvbmFyeQogICB2aWV3cyBhbmQgdHVwbGVzLgogCkBAIC0yMjksNzggKzcyMCwyNyBAQAogCiAtIElzc3VlICMyNTY2MDogRml4IFRBQiBrZXkgYmVoYXZpb3VyIGluIFJFUEwgd2l0aCByZWFkbGluZS4KIAorLSBJc3N1ZSAjMjYyODg6IE9wdGltaXplIFB5TG9uZ19Bc0RvdWJsZS4KKworLSBJc3N1ZXMgIzI2Mjg5IGFuZCAjMjYzMTU6IE9wdGltaXplIGZsb29yIGFuZCBtb2R1bG8gZGl2aXNpb24gZm9yCisgIHNpbmdsZS1kaWdpdCBsb25ncy4gIE1pY3JvYmVuY2htYXJrcyBzaG93IDItMi41eCBpbXByb3ZlbWVudC4gIEJ1aWx0LWluCisgICdkaXZtb2QnIGZ1bmN0aW9uIGlzIG5vdyBhbHNvIH4xMCUgZmFzdGVyLgorCiAtIElzc3VlICMyNTg4NzogUmFpc2UgYSBSdW50aW1lRXJyb3Igd2hlbiBhIGNvcm91dGluZSBvYmplY3QgaXMgYXdhaXRlZAogICBtb3JlIHRoYW4gb25jZS4KIAotLSBJc3N1ZSAjMjcyNDM6IFVwZGF0ZSB0aGUgX19haXRlcl9fIHByb3RvY29sOiBpbnN0ZWFkIG9mIHJldHVybmluZwotICBhbiBhd2FpdGFibGUgdGhhdCByZXNvbHZlcyB0byBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IsIHRoZSBhc3luY2hyb25vdXMKLSAgaXRlcmF0b3Igc2hvdWxkIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgRG9pbmcgdGhlIGZvcm1lciB3aWxsIHRyaWdnZXIgYQotICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLgotCi0KIExpYnJhcnkKIC0tLS0tLS0KIAotLSBJc3N1ZSAjMjY1NTY6IFVwZGF0ZSBleHBhdCB0byAyLjEuMSwgZml4ZXMgQ1ZFLTIwMTUtMTI4My4KLQotLSBGaXggVExTIHN0cmlwcGluZyB2dWxuZXJhYmlsaXR5IGluIHNtdHBsaWIsIENWRS0yMDE2LTA3NzIuICBSZXBvcnRlZCBieSBUZWFtCi0gIE9zdHN0cm9tCi0KLS0gSXNzdWUgIzIxMzg2OiBJbXBsZW1lbnQgbWlzc2luZyBJUHY0QWRkcmVzcy5pc19nbG9iYWwgcHJvcGVydHkuICBJdCB3YXMKLSAgZG9jdW1lbnRlZCBzaW5jZSAwN2E1NjEwYmFlOWQuICBJbml0aWFsIHBhdGNoIGJ5IFJvZ2VyIEx1ZXRoaS4KLQotLSBJc3N1ZSAjMjA5MDA6IGRpc3R1dGlscyByZWdpc3RlciBjb21tYW5kIG5vdyBkZWNvZGVzIEhUVFAgcmVzcG9uc2VzCi0gIGNvcnJlY3RseS4gIEluaXRpYWwgcGF0Y2ggYnkgaW5ncmlkLgotCi0tIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IHByb3ZpZGVzIHNldmVyYWwgbmV3IGNsYXNzZXMgYW5kCi0gIGZlYXR1cmVzOiBAb3ZlcmxvYWQgb3V0c2lkZSBzdHVicywgUmV2ZXJzaWJsZSwgRGVmYXVsdERpY3QsIFRleHQsCi0gIENvbnRleHRNYW5hZ2VyLCBUeXBlW10sIE5ld1R5cGUoKSwgVFlQRV9DSEVDS0lORywgYW5kIG51bWVyb3VzIGJ1ZwotICBmaXhlcyAobm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBpbgotICBteXB5IG9yIG90aGVyIHN0YXRpYyBhbmFseXplcnMpLiAgQWxzbyBjbGFzc2VzIGZvciBQRVAgNDkyCi0gIChBd2FpdGFibGUsIEFzeW5jSXRlcmFibGUsIEFzeW5jSXRlcmF0b3IpIGhhdmUgYmVlbiBhZGRlZCAoaW4gZmFjdAotICB0aGV5IG1hZGUgaXQgaW50byAzLjUuMSBidXQgd2VyZSBuZXZlciBtZW50aW9uZWQpLgotCi0tIElzc3VlICMyNTczODogU3RvcCBodHRwLnNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfZXJyb3IoKSBmcm9tCi0gIHNlbmRpbmcgYSBtZXNzYWdlIGJvZHkgZm9yIDIwNSBSZXNldCBDb250ZW50LiAgQWxzbywgZG9uJ3Qgc2VuZCBDb250ZW50Ci0gIGhlYWRlciBmaWVsZHMgaW4gcmVzcG9uc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHkuICBQYXRjaCBieSBTdXN1bXUKLSAgS29zaGliYS4KLQotLSBJc3N1ZSAjMjEzMTM6IEZpeCB0aGUgInBsYXRmb3JtIiBtb2R1bGUgdG8gdG9sZXJhdGUgd2hlbiBzeXMudmVyc2lvbgotICBjb250YWlucyB0cnVuY2F0ZWQgYnVpbGQgaW5mb3JtYXRpb24uCi0KLS0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscyBgYGdldHJhbmRvbSgpYGAgd2l0aAotICBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZyBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tCi0gIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaCB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KLQotLSBJc3N1ZSAjMjcxNjQ6IEluIHRoZSB6bGliIG1vZHVsZSwgYWxsb3cgZGVjb21wcmVzc2luZyByYXcgRGVmbGF0ZSBzdHJlYW1zCi0gIHdpdGggYSBwcmVkZWZpbmVkIHpkaWN0LiAgQmFzZWQgb24gcGF0Y2ggYnkgWGlhbmcgWmhhbmcuCi0KLS0gSXNzdWUgIzI0MjkxOiBGaXggd3NnaXJlZi5zaW1wbGVfc2VydmVyLldTR0lSZXF1ZXN0SGFuZGxlciB0byBjb21wbGV0ZWx5Ci0gIHdyaXRlIGRhdGEgdG8gdGhlIGNsaWVudC4gIFByZXZpb3VzbHkgaXQgY291bGQgZG8gcGFydGlhbCB3cml0ZXMgYW5kCi0gIHRydW5jYXRlIGRhdGEuICBBbHNvLCB3c2dpcmVmLmhhbmRsZXIuU2VydmVySGFuZGxlciBjYW4gbm93IGhhbmRsZSBzdGRvdXQKLSAgZG9pbmcgcGFydGlhbCB3cml0ZXMsIGJ1dCB0aGlzIGlzIGRlcHJlY2F0ZWQuCi0KLS0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCi0KLS0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcwotICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQotICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KLQotLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KLSAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCi0KLS0gSXNzdWUgIzI3MTE0OiBGaXggU1NMQ29udGV4dC5fbG9hZF93aW5kb3dzX3N0b3JlX2NlcnRzIGZhaWxzIHdpdGgKLSAgUGVybWlzc2lvbkVycm9yCi0KLS0gSXNzdWUgIzE4MzgzOiBBdm9pZCBjcmVhdGluZyBkdXBsaWNhdGUgZmlsdGVycyB3aGVuIHVzaW5nIGZpbHRlcndhcm5pbmdzCi0gIGFuZCBzaW1wbGVmaWx0ZXIuICBCYXNlZCBvbiBwYXRjaCBieSBBbGV4IFNoa29wLgotCiAtIElzc3VlICMyNzA1NzogRml4IG9zLnNldF9pbmhlcml0YWJsZSgpIG9uIEFuZHJvaWQsIGlvY3RsKCkgaXMgYmxvY2tlZCBieQogICBTRUxpbnV4IGFuZCBmYWlscyB3aXRoIEVBQ0NFU1MuIFRoZSBmdW5jdGlvbiBub3cgZmFsbHMgYmFjayB0byBmY250bCgpLgogICBQYXRjaCB3cml0dGVuIGJ5IE1pY2hhxYIgQmVkbmFyc2tpLgogCiAtIElzc3VlICMyNzAxNDogRml4IGluZmluaXRlIHJlY3Vyc2lvbiB1c2luZyB0eXBpbmcucHkuICBUaGFua3MgdG8gS2FsbGUgVHV1cmUhCiAKKy0gSXNzdWUgIzI3MDMxOiBSZW1vdmVkIGR1bW15IG1ldGhvZHMgaW4gVGtpbnRlciB3aWRnZXQgY2xhc3NlczogdGtfbWVudUJhcigpCisgIGFuZCB0a19iaW5kRm9yVHJhdmVyc2FsKCkuCisKIC0gSXNzdWUgIzE0MTMyOiBGaXggdXJsbGliLnJlcXVlc3QgcmVkaXJlY3QgaGFuZGxpbmcgd2hlbiB0aGUgdGFyZ2V0IG9ubHkgaGFzCiAgIGEgcXVlcnkgc3RyaW5nLiAgT3JpZ2luYWwgZml4IGJ5IErDoW4gSmFuZWNoLgogCkBAIC0zMTAsNiArNzUwLDE4IEBACiAgIHRvIGJlIEFTQ0lJLWVuY29kYWJsZSwgb3RoZXJ3aXNlIGEgVW5pY29kZUVuY29kZUVycm9yIGlzIHJhaXNlZC4gIEJhc2VkIG9uCiAgIHBhdGNoIGJ5IENocmlzdGlhbiBIZWltZXMuCiAKKy0gSXNzdWUgIzI3MDMzOiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZGVjb2RlX2RhdGEgcGFyYW1ldGVyIGZvcgorICBzbXRwZC5TTVRQQ2hhbm5lbCBhbmQgc210cGQuU01UUFNlcnZlciBjb25zdHJ1Y3RvcnMgaXMgY2hhbmdlZCB0byBGYWxzZS4KKworLSBJc3N1ZSAjMjcwMzQ6IFJlbW92ZWQgZGVwcmVjYXRlZCBjbGFzcyBhc3luY2hhdC5maWZvLgorCistIElzc3VlICMyNjg3MDogQWRkZWQgcmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeSgpLCB3aGljaCBjYW4gc3RvcCBlbnRyaWVzCisgIGJlaW5nIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4gIEJhc2VkIG9uIHBhdGNoIGJ5IFR5bGVyCisgIENyb21wdG9uLgorCistIElzc3VlICMyNjAzOTogemlwZmlsZS5aaXBGaWxlLm9wZW4oKSBjYW4gbm93IGJlIHVzZWQgdG8gd3JpdGUgZGF0YSBpbnRvIGEgWklQCisgIGZpbGUsIGFzIHdlbGwgYXMgZm9yIGV4dHJhY3RpbmcgZGF0YS4gIFBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgorCiAtIElzc3VlICMyNjg5MjogSG9ub3IgZGVidWdsZXZlbCBmbGFnIGluIHVybGxpYi5yZXF1ZXN0LkhUVFBIYW5kbGVyLiBQYXRjaAogICBjb250cmlidXRlZCBieSBDaGkgSHN1YW4gWWVuLgogCkBAIC0zMjQsNiArNzc2LDE0IEBACiAtIElzc3VlICMyNjk3NzogUmVtb3ZlZCB1bm5lY2Vzc2FyeSwgYW5kIGlnbm9yZWQsIGNhbGwgdG8gc3VtIG9mIHNxdWFyZXMgaGVscGVyCiAgIGluIHN0YXRpc3RpY3MucHZhcmlhbmNlLgogCistIElzc3VlICMyNjAwMjogVXNlIGJpc2VjdCBpbiBzdGF0aXN0aWNzLm1lZGlhbiBpbnN0ZWFkIG9mIGEgbGluZWFyIHNlYXJjaC4KKyAgUGF0Y2ggYnkgVXBlbmRyYSBLdW1hLgorCistIElzc3VlICMyNTk3NDogTWFrZSB1c2Ugb2YgbmV3IERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpIG1ldGhvZCBpbiBzdGF0aXN0aWNzCisgIG1vZHVsZS4gUGF0Y2ggYnkgU3RlZmFuIEtyYWguCisKKy0gSXNzdWUgIzI2OTk2OiBBZGQgc2VjcmV0cyBtb2R1bGUgYXMgZGVzY3JpYmVkIGluIFBFUCA1MDYuCisKIC0gSXNzdWUgIzI2ODgxOiBUaGUgbW9kdWxlZmluZGVyIG1vZHVsZSBub3cgc3VwcG9ydHMgZXh0ZW5kZWQgb3Bjb2RlIGFyZ3VtZW50cy4KIAogLSBJc3N1ZSAjMjM4MTU6IEZpeGVkIGNyYXNoZXMgcmVsYXRlZCB0byBkaXJlY3RseSBjcmVhdGVkIGluc3RhbmNlcyBvZiB0eXBlcyBpbgpAQCAtMzM1LDYgKzc5NSwxMSBAQAogLSBJc3N1ZSAjMjY4NzM6IHhtbHJwYyBub3cgcmFpc2VzIFJlc3BvbnNlRXJyb3Igb24gdW5zdXBwb3J0ZWQgdHlwZSB0YWdzCiAgIGluc3RlYWQgb2Ygc2lsZW50bHkgcmV0dXJuIGluY29ycmVjdCByZXN1bHQuCiAKKy0gSXNzdWUgIzI2OTE1OiAgVGhlIF9fY29udGFpbnNfXyBtZXRob2RzIGluIHRoZSBjb2xsZWN0aW9ucyBBQkNzIG5vdyBjaGVjaworICBmb3IgaWRlbnRpdHkgYmVmb3JlIGNoZWNraW5nIGVxdWFsaXR5LiAgVGhpcyBiZXR0ZXIgbWF0Y2hlcyB0aGUgYmVoYXZpb3IKKyAgb2YgdGhlIGNvbmNyZXRlIGNsYXNzZXMsIGFsbG93cyBzZW5zaWJsZSBoYW5kbGluZyBvZiBOYU5zLCBhbmQgbWFrZXMgaXQKKyAgZWFzaWVyIHRvIHJlYXNvbiBhYm91dCBjb250YWluZXIgaW52YXJpYW50cy4KKwogLSBJc3N1ZSAjMjY3MTE6IEZpeGVkIHRoZSBjb21wYXJpc29uIG9mIHBsaXN0bGliLkRhdGEgd2l0aCBvdGhlciB0eXBlcy4KIAogLSBJc3N1ZSAjMjQxMTQ6IEZpeCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIGBjdHlwZXMudXRpbGAuCkBAIC0zNDgsNiArODEzLDEyIEBACiAgIG5hbWVzIHRoYXQgaGFwcGVuIHRvIGhhdmUgYSBieXBhc3NlZCBob3N0bmFtZSBhcyBhIHN1ZmZpeC4gIFBhdGNoIGJ5IFhpYW5nCiAgIFpoYW5nLgogCistIElzc3VlICMyNDkwMjogUHJpbnQgc2VydmVyIFVSTCBvbiBodHRwLnNlcnZlciBzdGFydHVwLiAgSW5pdGlhbCBwYXRjaCBieQorICBGZWxpeCBLYWlzZXIuCisKKy0gSXNzdWUgIzI1Nzg4OiBmaWxlaW5wdXQuaG9va19lbmNvZGVkKCkgbm93IHN1cHBvcnRzIGFuICJlcnJvcnMiIGFyZ3VtZW50CisgIGZvciBwYXNzaW5nIHRvIG9wZW4uICBPcmlnaW5hbCBwYXRjaCBieSBKb3NlcGggSGFja21hbi4KKwogLSBJc3N1ZSAjMjY2MzQ6IHJlY3Vyc2l2ZV9yZXByKCkgbm93IHNldHMgX19xdWFsbmFtZV9fIG9mIHdyYXBwZXIuICBQYXRjaCBieQogICBYaWFuZyBaaGFuZy4KIApAQCAtMzgzLDI2ICs4NTQsNTQgQEAKIC0gSXNzdWUgIzI2NzE3OiBTdG9wIGVuY29kaW5nIExhdGluLTEtaXplZCBXU0dJIHBhdGhzIHdpdGggVVRGLTguICBQYXRjaCBieQogICBBbnRob255IFNvdHRpbGUuCiAKKy0gSXNzdWUgIzI2NzgyOiBBZGQgU1RBUlRVUElORk8gdG8gc3VicHJvY2Vzcy5fX2FsbF9fIG9uIFdpbmRvd3MuCisKKy0gSXNzdWUgIzI2NDA0OiBBZGQgY29udGV4dCBtYW5hZ2VyIHRvIHNvY2tldHNlcnZlci4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NzM1OiBGaXggOmZ1bmM6YG9zLnVyYW5kb21gIG9uIFNvbGFyaXMgMTEuMyBhbmQgbmV3ZXIgd2hlbiByZWFkaW5nCiAgIG1vcmUgdGhhbiAxLDAyNCBieXRlczogY2FsbCBgYGdldHJhbmRvbSgpYGAgbXVsdGlwbGUgdGltZXMgd2l0aCBhIGxpbWl0IG9mCiAgIDEwMjQgYnl0ZXMgcGVyIGNhbGwuCiAKKy0gSXNzdWUgIzI2NTg1OiBFbGltaW5hdGUgaHR0cC5zZXJ2ZXIuX3F1b3RlX2h0bWwoKSBhbmQgdXNlCisgIGh0bWwuZXNjYXBlKHF1b3RlPUZhbHNlKS4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNjY4NTogUmFpc2UgT1NFcnJvciBpZiBjbG9zaW5nIGEgc29ja2V0IGZhaWxzLgorCiAtIElzc3VlICMxNjMyOTogQWRkIC53ZWJtIHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHaWFtcGFvbG8gUm9kb2xhJy4KIAogLSBJc3N1ZSAjMTM5NTI6IEFkZCAuY3N2IHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHZW9mZiBXaWxzb24uCiAKKy0gSXNzdWUgIzI2NTg3OiB0aGUgc2l0ZSBtb2R1bGUgbm93IGFsbG93cyAucHRoIGZpbGVzIHRvIHNwZWNpZnkgZmlsZXMgdG8gYmUKKyAgYWRkZWQgdG8gc3lzLnBhdGggKGUuZy4gemlwIGZpbGVzKS4KKworLSBJc3N1ZSAjMjU2MDk6IEludHJvZHVjZSBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXIgYW5kCisgIHR5cGluZy5Db250ZXh0TWFuYWdlci4KKwogLSBJc3N1ZSAjMjY3MDk6IEZpeGVkIFkyMDM4IHByb2JsZW0gaW4gbG9hZGluZyBiaW5hcnkgUExpc3RzLgogCiAtIElzc3VlICMyMzczNTogSGFuZGxlIHRlcm1pbmFsIHJlc2l6aW5nIHdpdGggUmVhZGxpbmUgNi4zKyBieSBpbnN0YWxsaW5nIG91cgogICBvd24gU0lHV0lOQ0ggaGFuZGxlci4gIFBhdGNoIGJ5IEVyaWMgUHJpY2UuCiAKKy0gSXNzdWUgIzI1OTUxOiBDaGFuZ2UgU1NMU29ja2V0LnNlbmRhbGwoKSB0byByZXR1cm4gTm9uZSwgYXMgZXhwbGljaXRseQorICBkb2N1bWVudGVkIGZvciBwbGFpbiBzb2NrZXQgb2JqZWN0cy4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NTg2OiBJbiBodHRwLnNlcnZlciwgcmVzcG9uZCB3aXRoICI0MTMgUmVxdWVzdCBoZWFkZXIgZmllbGRzIHRvbwogICBsYXJnZSIgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGhlYWRlciBmaWVsZHMgdG8gcGFyc2UsIHJhdGhlciB0aGFuIGtpbGxpbmcKICAgdGhlIGNvbm5lY3Rpb24gYW5kIHJhaXNpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgogCistIElzc3VlICMyNjY3NjogQWRkZWQgbWlzc2luZyBYTUxQdWxsUGFyc2VyIHRvIEVsZW1lbnRUcmVlLl9fYWxsX18uCisKIC0gSXNzdWUgIzIyODU0OiBDaGFuZ2UgQnVmZmVyZWRSZWFkZXIud3JpdGFibGUoKSBhbmQKICAgQnVmZmVyZWRXcml0ZXIucmVhZGFibGUoKSB0byBhbHdheXMgcmV0dXJuIEZhbHNlLgogCistIElzc3VlICMyNjQ5MjogRXhoYXVzdGVkIGl0ZXJhdG9yIG9mIGFycmF5LmFycmF5IG5vdyBjb25mb3JtcyB3aXRoIHRoZSBiZWhhdmlvcgorICBvZiBpdGVyYXRvcnMgb2Ygb3RoZXIgbXV0YWJsZSBzZXF1ZW5jZXM6IGl0IGxlZnRzIGV4aGF1c3RlZCBldmVuIGlmIGl0ZXJhdGVkCisgIGFycmF5IGlzIGV4dGVuZGVkLgorCistIElzc3VlICMyNjY0MTogZG9jdGVzdC5Eb2NGaWxlVGVzdCBhbmQgZG9jdGVzdC50ZXN0ZmlsZSgpIG5vdyBzdXBwb3J0CisgIHBhY2thZ2VzIChtb2R1bGUgc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBkaXJlY3RvcmllcykgZm9yIHRoZSBwYWNrYWdlCisgIHBhcmFtZXRlci4KKwogLSBJc3N1ZSAjMjUxOTU6IEZpeCBhIHJlZ3Jlc3Npb24gaW4gbW9jay5NYWdpY01vY2suIF9DYWxsIGlzIGEgc3ViY2xhc3Mgb2YKICAgdHVwbGUgKGNoYW5nZXNldCAzNjAzYmFlNjNjMTMgb25seSB3b3JrcyBmb3IgY2xhc3Nlcykgc28gd2UgbmVlZCB0bwogICBpbXBsZW1lbnQgX19uZV9fIG91cnNlbHZlcy4gIFBhdGNoIGJ5IEFuZHJldyBQbHVtbWVyLgpAQCAtNDE1LDE2ICs5MTQsNDUgQEAKIAogLSBJc3N1ZSAjMjY2MTY6IEZpeGVkIGEgYnVnIGluIGRhdGV0aW1lLmFzdGltZXpvbmUoKSBtZXRob2QuCiAKLS0gSXNzdWUgIzIxOTI1OiA6ZnVuYzpgd2FybmluZ3MuZm9ybWF0d2FybmluZ2Agbm93IGNhdGNoZXMgZXhjZXB0aW9ucyBvbgotICBgYGxpbmVjYWNoZS5nZXRsaW5lKC4uLilgYCB0byBiZSBhYmxlIHRvIGxvZyA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGVtaXR0ZWQKLSAgbGF0ZSBkdXJpbmcgdGhlIFB5dGhvbiBzaHV0ZG93biBwcm9jZXNzLgorLSBJc3N1ZSAjMjY2Mzc6IFRoZSA6bW9kOmBpbXBvcnRsaWJgIG1vZHVsZSBub3cgZW1pdHMgYW4gOmV4YzpgSW1wb3J0RXJyb3JgCisgIHJhdGhlciB0aGFuIGEgOmV4YzpgVHlwZUVycm9yYCBpZiA6ZnVuYzpgX19pbXBvcnRfX2AgaXMgdHJpZWQgZHVyaW5nIHRoZQorICBQeXRob24gc2h1dGRvd24gcHJvY2VzcyBidXQgOmRhdGE6YHN5cy5wYXRoYCBpcyBhbHJlYWR5IGNsZWFyZWQgKHNldCB0bworICBgYE5vbmVgYCkuCisKKy0gSXNzdWUgIzIxOTI1OiA6ZnVuYzpgd2FybmluZ3MuZm9ybWF0d2FybmluZ2Agbm93IGNhdGNoZXMgZXhjZXB0aW9ucyB3aGVuCisgIGNhbGxpbmcgOmZ1bmM6YGxpbmVjYWNoZS5nZXRsaW5lYCBhbmQKKyAgOmZ1bmM6YHRyYWNlbWFsbG9jLmdldF9vYmplY3RfdHJhY2ViYWNrYCB0byBiZSBhYmxlIHRvIGxvZworICA6ZXhjOmBSZXNvdXJjZVdhcm5pbmdgIGVtaXR0ZWQgbGF0ZSBkdXJpbmcgdGhlIFB5dGhvbiBzaHV0ZG93biBwcm9jZXNzLgorCistIElzc3VlICMyMzg0ODogT24gV2luZG93cywgZmF1bHRoYW5kbGVyLmVuYWJsZSgpIG5vdyBhbHNvIGluc3RhbGxzIGFuCisgIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGR1bXAgdGhlIHRyYWNlYmFjayBvZiBhbGwgUHl0aG9uIHRocmVhZHMgb24gYW55IFdpbmRvd3MKKyAgZXhjZXB0aW9uLCBub3Qgb25seSBvbiBVTklYIHNpZ25hbHMgKFNJR1NFR1YsIFNJR0ZQRSwgU0lHQUJSVCkuCisKKy0gSXNzdWUgIzI2NTMwOiBBZGQgQyBmdW5jdGlvbnMgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfVHJhY2tgIGFuZAorICA6YzpmdW5jOmBfUHlUcmFjZU1hbGxvY19VbnRyYWNrYCB0byB0cmFjayBtZW1vcnkgYmxvY2tzIHVzaW5nIHRoZQorICA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlLiBBZGQgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrYCB0byBnZXQKKyAgdGhlIHRyYWNlYmFjayBvZiBhbiBvYmplY3QuCisKKy0gSXNzdWUgIzI2NTg4OiBUaGUgX3RyYWNlbWFsbG9jIG5vdyBzdXBwb3J0cyB0cmFjaW5nIG1lbW9yeSBhbGxvY2F0aW9ucyBvZgorICBtdWx0aXBsZSBhZGRyZXNzIHNwYWNlcyAoZG9tYWlucykuCiAKIC0gSXNzdWUgIzI0MjY2OiBDdHJsK0MgZHVyaW5nIFJlYWRsaW5lIGhpc3Rvcnkgc2VhcmNoIG5vdyBjYW5jZWxzIHRoZSBzZWFyY2gKICAgbW9kZSB3aGVuIGNvbXBpbGVkIHdpdGggUmVhZGxpbmUgNy4KIAorLSBJc3N1ZSAjMjY1OTA6IEltcGxlbWVudCBhIHNhZmUgZmluYWxpemVyIGZvciB0aGUgX3NvY2tldC5zb2NrZXQgdHlwZS4gSXQgbm93CisgIHJlbGVhc2VzIHRoZSBHSUwgdG8gY2xvc2UgdGhlIHNvY2tldC4KKworLSBJc3N1ZSAjMTg3ODc6IHNwd2QuZ2V0c3BuYW0oKSBub3cgcmFpc2VzIGEgUGVybWlzc2lvbkVycm9yIGlmIHRoZSB1c2VyCisgIGRvZXNuJ3QgaGF2ZSBwcml2aWxlZ2VzLgorCiAtIElzc3VlICMyNjU2MDogQXZvaWQgcG90ZW50aWFsIFZhbHVlRXJyb3IgaW4gQmFzZUhhbmRsZXIuc3RhcnRfcmVzcG9uc2UuCiAgIEluaXRpYWwgcGF0Y2ggYnkgUGV0ZXIgSW5nbGVzYnkuCiAKKy0gSXNzdWUgIzI2NTY3OiBBZGQgYSBuZXcgZnVuY3Rpb24gOmM6ZnVuYzpgUHlFcnJfUmVzb3VyY2VXYXJuaW5nYCBmdW5jdGlvbiB0bworICBwYXNzIHRoZSBkZXN0cm95ZWQgb2JqZWN0LiBBZGQgYSAqc291cmNlKiBhdHRyaWJ1dGUgdG8KKyAgOmNsYXNzOmB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZWAuIEFkZCB3YXJuaW5ncy5fc2hvd3dhcm5tc2coKSB3aGljaCB1c2VzCisgIHRyYWNlbWFsbG9jIHRvIGdldCB0aGUgdHJhY2ViYWNrIHdoZXJlIHNvdXJjZSBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KKwogLSBJc3N1ZSAjMjYzMTM6IHNzbC5weSBfbG9hZF93aW5kb3dzX3N0b3JlX2NlcnRzIGZhaWxzIGlmIHdpbmRvd3MgY2VydCBzdG9yZQogICBpcyBlbXB0eS4gUGF0Y2ggYnkgQmFqaS4KIApAQCAtNDQ2LDIzICs5NzQsMzggQEAKIC0gSXNzdWUgIzIzNzE4OiBGaXhlZCBwYXJzaW5nIHRpbWUgaW4gd2VlayAwIGJlZm9yZSBKYW4gMS4gIE9yaWdpbmFsIHBhdGNoIGJ5CiAgIFRhbcOhcyBCZW5jZSBHZWRhaS4KIAorLSBJc3N1ZSAjMjYzMjM6IEFkZCBNb2NrLmFzc2VydF9jYWxsZWQoKSBhbmQgTW9jay5hc3NlcnRfY2FsbGVkX29uY2UoKQorICBtZXRob2RzIHRvIHVuaXR0ZXN0Lm1vY2suIFBhdGNoIHdyaXR0ZW4gYnkgQW1pdCBTYWhhLgorCiAtIElzc3VlICMyMDU4OTogSW52b2tpbmcgUGF0aC5vd25lcigpIGFuZCBQYXRoLmdyb3VwKCkgb24gV2luZG93cyBub3cgcmFpc2UKICAgTm90SW1wbGVtZW50ZWRFcnJvciBpbnN0ZWFkIG9mIEltcG9ydEVycm9yLgogCiAtIElzc3VlICMyNjE3NzogRml4ZWQgdGhlIGtleXMoKSBtZXRob2QgZm9yIENhbnZhcyBhbmQgU2Nyb2xsYmFyIHdpZGdldHMuCiAKLS0gSXNzdWUgIzE1MDY4OiBHb3QgcmlkIG9mIGV4Y2Vzc2l2ZSBidWZmZXJpbmcgaW4gdGhlIGZpbGVpbnB1dCBtb2R1bGUuCi0gIFRoZSBidWZzaXplIHBhcmFtZXRlciBpcyBubyBsb25nZXIgdXNlZC4KKy0gSXNzdWUgIzE1MDY4OiBHb3QgcmlkIG9mIGV4Y2Vzc2l2ZSBidWZmZXJpbmcgaW4gZmlsZWlucHV0LgorICBUaGUgYnVmc2l6ZSBwYXJhbWV0ZXIgaXMgbm93IGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQuCisKKy0gSXNzdWUgIzE5NDc1OiBBZGRlZCBhbiBvcHRpb25hbCBhcmd1bWVudCB0aW1lc3BlYyB0byB0aGUgZGF0ZXRpbWUKKyAgaXNvZm9ybWF0KCkgbWV0aG9kIHRvIGNob29zZSB0aGUgcHJlY2lzaW9uIG9mIHRoZSB0aW1lIGNvbXBvbmVudC4KIAogLSBJc3N1ZSAjMjIwMjogRml4IFVuYm91bmRMb2NhbEVycm9yIGluCiAgIEFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIuZ2V0X2FsZ29yaXRobV9pbXBscy4gIEluaXRpYWwgcGF0Y2ggYnkgTWF0aGlldSBEdXB1eS4KIAorLSBJc3N1ZSAjMjYxNjc6IE1pbmltaXplZCBvdmVyaGVhZCBpbiBjb3B5LmNvcHkoKSBhbmQgY29weS5kZWVwY29weSgpLgorICBPcHRpbWl6ZWQgY29weWluZyBhbmQgZGVlcGNvcHlpbmcgYnl0ZWFycmF5cywgTm90SW1wbGVtZW50ZWQsIHNsaWNlcywKKyAgc2hvcnQgbGlzdHMsIHR1cGxlcywgZGljdHMsIHNldHMuCisKIC0gSXNzdWUgIzI1NzE4OiBGaXhlZCBwaWNrbGluZyBhbmQgY29weWluZyB0aGUgYWNjdW11bGF0ZSgpIGl0ZXJhdG9yIHdpdGgKICAgdG90YWwgaXMgTm9uZS4KIAogLSBJc3N1ZSAjMjY0NzU6IEZpeGVkIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgd2l0aCB0aGUgKD94KQogICBmbGFnLgogCistIElzc3VlICMyNjQ4MjogQWxsb3dlZCBwaWNrbGluZyByZWN1cnNpdmUgZGVxdWV1ZXMuCisKKy0gSXNzdWUgIzI2MzM1OiBNYWtlIG1tYXAud3JpdGUoKSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGxpa2UKKyAgb3RoZXIgd3JpdGUgbWV0aG9kcy4gIFBhdGNoIGJ5IEpha3ViIFN0YXNpYWsuCisKIC0gSXNzdWUgIzI2NDU3OiBGaXhlZCB0aGUgc3VibmV0cygpIG1ldGhvZHMgaW4gSVAgbmV0d29yayBjbGFzc2VzIGZvciB0aGUgY2FzZQogICB3aGVuIHJlc3VsdGluZyBwcmVmaXggbGVuZ3RoIGlzIGVxdWFsIHRvIG1heGltYWwgcHJlZml4IGxlbmd0aC4KICAgQmFzZWQgb24gcGF0Y2ggYnkgWGlhbmcgWmhhbmcuCkBAIC00NzksNyArMTAyMiw3IEBACiAKIC0gSXNzdWUgIzI2MTg2OiBSZW1vdmUgYW4gaW52YWxpZCB0eXBlIGNoZWNrIGluIGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXIuCiAKLS0gSXNzdWUgIzI2MzY3OiBpbXBvcnRsaWIuX19pbXBvcnRfXygpIHJhaXNlcyBTeXN0ZW1FcnJvciBsaWtlCistIElzc3VlICMyNjM2NzogaW1wb3J0bGliLl9faW1wb3J0X18oKSByYWlzZXMgSW1wb3J0RXJyb3IgbGlrZQogICBidWlsdGlucy5fX2ltcG9ydF9fKCkgd2hlbiBgYGxldmVsYGAgaXMgc3BlY2lmaWVkIGJ1dCB3aXRob3V0IGFuIGFjY29tcGFueWluZwogICBwYWNrYWdlIHNwZWNpZmllZC4KIApAQCAtNDg3LDE4ICsxMDMwLDM4IEBACiAgIHRoZSBjb25uZWN0ZWQgc29ja2V0KSB3aGVuIHZlcmlmeV9yZXF1ZXN0KCkgcmV0dXJucyBmYWxzZS4gIFBhdGNoIGJ5IEF2aXYKICAgUGFsaXZvZGEuCiAKKy0gSXNzdWUgIzIzNDMwOiBDaGFuZ2UgdGhlIHNvY2tldHNlcnZlciBtb2R1bGUgdG8gb25seSBjYXRjaCBleGNlcHRpb25zCisgIHJhaXNlZCBmcm9tIGEgcmVxdWVzdCBoYW5kbGVyIHRoYXQgYXJlIGRlcml2ZWQgZnJvbSBFeGNlcHRpb24gKGluc3RlYWQgb2YKKyAgQmFzZUV4Y2VwdGlvbikuICBUaGVyZWZvcmUgU3lzdGVtRXhpdCBhbmQgS2V5Ym9hcmRJbnRlcnJ1cHQgbm8gbG9uZ2VyCisgIHRyaWdnZXIgdGhlIGhhbmRsZV9lcnJvcigpIG1ldGhvZCwgYW5kIHdpbGwgbm93IHRvIHN0b3AgYSBzaW5nbGUtdGhyZWFkZWQKKyAgc2VydmVyLgorCiAtIElzc3VlICMyNTkzOTogT24gV2luZG93cyBvcGVuIHRoZSBjZXJ0IHN0b3JlIHJlYWRvbmx5IGluIHNzbC5lbnVtX2NlcnRpZmljYXRlcy4KIAogLSBJc3N1ZSAjMjU5OTU6IG9zLndhbGsoKSBubyBsb25nZXIgdXNlcyBGRHMgcHJvcG9ydGlvbmFsIHRvIHRoZSB0cmVlIGRlcHRoLgogCistIElzc3VlICMyNTk5NDogQWRkZWQgdGhlIGNsb3NlKCkgbWV0aG9kIGFuZCB0aGUgc3VwcG9ydCBvZiB0aGUgY29udGV4dCBtYW5hZ2VyCisgIHByb3RvY29sIGZvciB0aGUgb3Muc2NhbmRpcigpIGl0ZXJhdG9yLgorCistIElzc3VlICMyMzk5MjogbXVsdGlwcm9jZXNzaW5nOiBtYWtlIE1hcFJlc3VsdCBub3QgZmFpbC1mYXN0IHVwb24gZXhjZXB0aW9uLgorCistIElzc3VlICMyNjI0MzogU3VwcG9ydCBrZXl3b3JkIGFyZ3VtZW50cyB0byB6bGliLmNvbXByZXNzKCkuICBQYXRjaCBieSBBdml2CisgIFBhbGl2b2RhLgorCiAtIElzc3VlICMyNjExNzogVGhlIG9zLnNjYW5kaXIoKSBpdGVyYXRvciBub3cgY2xvc2VzIGZpbGUgZGVzY3JpcHRvciBub3Qgb25seQogICB3aGVuIHRoZSBpdGVyYXRpb24gaXMgZmluaXNoZWQsIGJ1dCB3aGVuIGl0IHdhcyBmYWlsZWQgd2l0aCBlcnJvci4KIAorLSBJc3N1ZSAjMjU5NDk6IF9fZGljdF9fIGZvciBhbiBPcmRlcmVkRGljdCBpbnN0YW5jZSBpcyBub3cgY3JlYXRlZCBvbmx5IHdoZW4KKyAgbmVlZGVkLgorCiAtIElzc3VlICMyNTkxMTogUmVzdG9yZWQgc3VwcG9ydCBvZiBieXRlcyBwYXRocyBpbiBvcy53YWxrKCkgb24gV2luZG93cy4KIAogLSBJc3N1ZSAjMjYwNDU6IEFkZCBVVEYtOCBzdWdnZXN0aW9uIHRvIGVycm9yIG1lc3NhZ2Ugd2hlbiBwb3N0aW5nIGEKICAgbm9uLUxhdGluLTEgc3RyaW5nIHdpdGggaHR0cC5jbGllbnQuCiAKKy0gSXNzdWUgIzI2MDM5OiBBZGRlZCB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKCkgYW5kIHppcGluZm8uWmlwSW5mby5pc19kaXIoKS4KKyAgUGF0Y2ggYnkgVGhvbWFzIEtsdXl2ZXIuCisKIC0gSXNzdWUgIzEyOTIzOiBSZXNldCBGYW5jeVVSTG9wZW5lcidzIHJlZGlyZWN0IGNvdW50ZXIgZXZlbiBpZiB0aGVyZSBpcyBhbgogICBleGNlcHRpb24uICBCYXNlZCBvbiBwYXRjaGVzIGJ5IEJyaWFuIEJyYXppbCBhbmQgRGFuaWVsIFJvY2NvLgogCkBAIC01MTksNiArMTA4MiwxMCBAQAogICBnZXRob3N0YnluYW1lX2V4KCkgZnVuY3Rpb25zIG9mIHRoZSBzb2NrZXQgbW9kdWxlIG5vdyBkZWNvZGUgdGhlIGhvc3RuYW1lCiAgIGZyb20gdGhlIEFOU0kgY29kZSBwYWdlIHJhdGhlciB0aGFuIFVURi04LgogCistIElzc3VlICMyNjA5OTogVGhlIHNpdGUgbW9kdWxlIG5vdyB3cml0ZXMgYW4gZXJyb3IgaW50byBzdGRlcnIgaWYKKyAgc2l0ZWN1c3RvbWl6ZSBtb2R1bGUgY2FuIGJlIGltcG9ydGVkIGJ1dCBleGVjdXRpbmcgdGhlIG1vZHVsZSByYWlzZSBhbgorICBJbXBvcnRFcnJvci4gU2FtZSBjaGFuZ2UgZm9yIHVzZXJjdXN0b21pemUuCisKIC0gSXNzdWUgIzI2MTQ3OiB4bWxycGMgbm93IHdvcmtzIHdpdGggc3RyaW5ncyBub3QgZW5jb2RhYmxlIHdpdGggdXNlZAogICBub24tVVRGLTggZW5jb2RpbmcuCiAKQEAgLTUyOSwxMyArMTA5NiwyMSBAQAogLSBJc3N1ZSAjMjYwMTM6IEFkZGVkIGNvbXBhdGliaWxpdHkgd2l0aCBicm9rZW4gcHJvdG9jb2wgMiBwaWNrbGVzIGNyZWF0ZWQKICAgaW4gb2xkIFB5dGhvbiAzIHZlcnNpb25zICgzLjQuMyBhbmQgbG93ZXIpLgogCistIElzc3VlICMyNjEyOTogRGVwcmVjYXRlZCBhY2NlcHRpbmcgbm9uLWludGVnZXJzIGluIGdycC5nZXRncmdpZCgpLgorCiAtIElzc3VlICMyNTg1MDogVXNlIGNyb3NzLWNvbXBpbGF0aW9uIGJ5IGRlZmF1bHQgZm9yIDY0LWJpdCBXaW5kb3dzLgogCi0tIElzc3VlICMxNzYzMzogSW1wcm92ZSB6aXBpbXBvcnQncyBzdXBwb3J0IGZvciBuYW1lc3BhY2UgcGFja2FnZXMuCistIElzc3VlICMyNTgyMjogQWRkIGRvY3N0cmluZ3MgdG8gdGhlIGZpZWxkcyBvZiB1cmxsaWIucGFyc2UgcmVzdWx0cy4KKyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU3dhdGkgSmFpc3dhbC4KKworLSBJc3N1ZSAjMjI2NDI6IENvbnZlcnQgdHJhY2UgbW9kdWxlIG9wdGlvbiBwYXJzaW5nIG1lY2hhbmlzbSB0byBhcmdwYXJzZS4KKyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2lsZW50R2hvc3QuCiAKIC0gSXNzdWUgIzI0NzA1OiBGaXggc3lzY29uZmlnLl9wYXJzZV9tYWtlZmlsZSBub3QgZXhwYW5kaW5nICR7fSB2YXJzCiAgIGFwcGVhcmluZyBiZWZvcmUgJCgpIHZhcnMuCiAKKy0gSXNzdWUgIzI2MDY5OiBSZW1vdmUgdGhlIGRlcHJlY2F0ZWQgYXBpcyBpbiB0aGUgdHJhY2UgbW9kdWxlLgorCiAtIElzc3VlICMyMjEzODogRml4IG1vY2sucGF0Y2ggYmVoYXZpb3Igd2hlbiBwYXRjaGluZyBkZXNjcmlwdG9ycy4gUmVzdG9yZQogICBvcmlnaW5hbCB2YWx1ZXMgYWZ0ZXIgcGF0Y2hpbmcuIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNlYW4gTWNDdWxseS4KIApAQCAtNTQ4LDEzICsxMTIzLDI4IEBACiAtIElzc3VlICMyNDEyMDogSWdub3JlIFBlcm1pc3Npb25FcnJvciB3aGVuIHRyYXZlcnNpbmcgYSB0cmVlIHdpdGgKICAgcGF0aGxpYi5QYXRoLltyXWdsb2IoKS4gIFBhdGNoIGJ5IFVscmljaCBQZXRyaS4KIAorLSBJc3N1ZSAjMjE4MTU6IEFjY2VwdCBdIGNoYXJhY3RlcnMgaW4gdGhlIGRhdGEgcG9ydGlvbiBvZiBpbWFwIHJlc3BvbnNlcywKKyAgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBmbGFncyB3aXRoIHNxdWFyZSBicmFja2V0cyBhY2NlcHRlZCBhbmQgcHJvZHVjZWQKKyAgYnkgc2VydmVycyBzdWNoIGFzIGdtYWlsLgorCiAtIElzc3VlICMyNTQ0NzogZmlsZWlucHV0IG5vdyB1c2VzIHN5cy5zdGRpbiBhcy1pcyBpZiBpdCBkb2VzIG5vdCBoYXZlIGEKICAgYnVmZmVyIGF0dHJpYnV0ZSAocmVzdG9yZXMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCiAKKy0gSXNzdWUgIzI1OTcxOiBPcHRpbWl6ZWQgY3JlYXRpbmcgRnJhY3Rpb25zIGZyb20gZmxvYXRzIGJ5IDIgdGltZXMgYW5kIGZyb20KKyAgRGVjaW1hbHMgYnkgMyB0aW1lcy4KKworLSBJc3N1ZSAjMjU4MDI6IERvY3VtZW50IGFzIGRlcHJlY2F0ZWQgdGhlIHJlbWFpbmluZyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGUoKS4KKworLSBJc3N1ZSAjMjU5Mjg6IEFkZCBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8oKS4KKwogLSBJc3N1ZSAjMjU0NDc6IENvcHlpbmcgdGhlIGxydV9jYWNoZSgpIHdyYXBwZXIgb2JqZWN0IG5vdyBhbHdheXMgd29ya3MsCi0gIGluZGVwZW5kZWRseSBmcm9tIHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG9iamVjdCAoYnkgcmV0dXJuaW5nIHRoZSBvcmlnaW5hbAorICBpbmRlcGVuZGVudGx5IGZyb20gdGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsCiAgIG9iamVjdCB1bmNoYW5nZWQpLgogCistIElzc3VlICMyNTc2ODogSGF2ZSB0aGUgZnVuY3Rpb25zIGluIGNvbXBpbGVhbGwgcmV0dXJuIGJvb2xlYW5zIGluc3RlYWQgb2YKKyAgaW50cyBhbmQgYWRkIHByb3BlciBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0cyBmb3IgdGhlIHJldHVybiB2YWx1ZXMuCisKIC0gSXNzdWUgIzI0MTAzOiBGaXhlZCBwb3NzaWJsZSB1c2UgYWZ0ZXIgZnJlZSBpbiBFbGVtZW50VHJlZS5YTUxQdWxsUGFyc2VyLgogCiAtIElzc3VlICMyNTg2MDogb3MuZndhbGsoKSBubyBsb25nZXIgc2tpcHMgcmVtYWluaW5nIGRpcmVjdG9yaWVzIHdoZW4gZXJyb3IKQEAgLTU2Miw4ICsxMTUyLDIyIEBACiAKIC0gSXNzdWUgIzI1OTE0OiBGaXhlZCBhbmQgc2ltcGxpZmllZCBPcmRlcmVkRGljdC5fX3NpemVvZl9fLgogCistIElzc3VlICMyNTg2OTogT3B0aW1pemVkIGRlZXBjb3B5aW5nIEVsZW1lbnRUcmVlOyBpdCBpcyBub3cgMjAgdGltZXMgZmFzdGVyLgorCistIElzc3VlICMyNTg3MzogT3B0aW1pemVkIGl0ZXJhdGluZyBFbGVtZW50VHJlZS4gIEl0ZXJhdGluZyBlbGVtZW50cworICBFbGVtZW50Lml0ZXIoKSBpcyBub3cgNDAlIGZhc3RlciwgaXRlcmF0aW5nIHRleHQgRWxlbWVudC5pdGVydGV4dCgpCisgIGlzIG5vdyB1cCB0byAyLjUgdGltZXMgZmFzdGVyLgorCiAtIElzc3VlICMyNTkwMjogRml4ZWQgdmFyaW91cyByZWZjb3VudCBpc3N1ZXMgaW4gRWxlbWVudFRyZWUgaXRlcmF0aW9uLgogCistIElzc3VlICMyMjIyNzogVGhlIFRhckZpbGUgaXRlcmF0b3IgaXMgcmVpbXBsZW1lbnRlZCB1c2luZyBnZW5lcmF0b3IuCisgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgc2ltcGxlciB0aGF0IHVzaW5nIGNsYXNzLgorCistIElzc3VlICMyNTYzODogT3B0aW1pemVkIEVsZW1lbnRUcmVlLml0ZXJwYXJzZSgpOyBpdCBpcyBub3cgMnggZmFzdGVyLgorICBPcHRpbWl6ZWQgRWxlbWVudFRyZWUgcGFyc2luZzsgaXQgaXMgbm93IDEwJSBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1NzYxOiBJbXByb3ZlZCBkZXRlY3RpbmcgZXJyb3JzIGluIGJyb2tlbiBwaWNrbGUgZGF0YS4KKwogLSBJc3N1ZSAjMjU3MTc6IFJlc3RvcmUgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZiB0b2xlcmF0aW5nIG1vc3QgZnN0YXQoKQogICBlcnJvcnMgd2hlbiBvcGVuaW5nIGZpbGVzLiAgVGhpcyB3YXMgYSByZWdyZXNzaW9uIGluIDMuNWExLCBhbmQgc3RvcHBlZAogICBhbm9ueW1vdXMgdGVtcG9yYXJ5IGZpbGVzIGZyb20gd29ya2luZyBpbiBzcGVjaWFsIGNhc2VzLgpAQCAtNTc1LDYgKzExNzksOSBAQAogLSBJc3N1ZSAjMjU3NjQ6IEluIHRoZSBzdWJwcm9jZXNzIG1vZHVsZSwgcHJlc2VydmUgYW55IGV4Y2VwdGlvbiBjYXVzZWQgYnkKICAgZm9yaygpIGZhaWx1cmUgd2hlbiBwcmVleGVjX2ZuIGlzIHVzZWQuCiAKKy0gSXNzdWUgIzI1NzcxOiBUd2VhayB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgZm9yIGltcG9ydGxpYi51dGlsLnJlc29sdmVfbmFtZSgpCisgIHdoZW4gJ3BhY2thZ2UnIGlzbid0IHNwZWNpZmllZCBidXQgbmVjZXNzYXJ5LgorCiAtIElzc3VlICM2NDc4OiBfc3RycHRpbWUncyByZWdleHAgY2FjaGUgbm93IGlzIHJlc2V0IGFmdGVyIGNoYW5naW5nIHRpbWV6b25lCiAgIHdpdGggdGltZS50enNldCgpLgogCkBAIC01OTYsNiArMTIwMyw5IEBACiAtIElzc3VlICMxMDEzMTogRml4ZWQgZGVlcCBjb3B5aW5nIG9mIG1pbmlkb20gZG9jdW1lbnRzLiAgQmFzZWQgb24gcGF0Y2gKICAgYnkgTWFyaWFuIEdhbmlzaW4uCiAKKy0gSXNzdWUgIzc5OTA6IGRpcigpIG9uIEVsZW1lbnRUcmVlLkVsZW1lbnQgbm93IGxpc3RzIHByb3BlcnRpZXM6ICJ0YWciLAorICAidGV4dCIsICJ0YWlsIiBhbmQgImF0dHJpYiIuICBPcmlnaW5hbCBwYXRjaCBieSBTYW50b3NvIFdpamF5YS4KKwogLSBJc3N1ZSAjMjU3MjU6IEZpeGVkIGEgcmVmZXJlbmNlIGxlYWsgaW4gcGlja2xlLmxvYWRzKCkgd2hlbiB1bnBpY2tsaW5nCiAgIGludmFsaWQgZGF0YSBpbmNsdWRpbmcgdHVwbGUgaW5zdHJ1Y3Rpb25zLgogCkBAIC02MTEsNiArMTIyMSwyMDIgQEAKIC0gSXNzdWUgIzI1NjI0OiBaaXBGaWxlIG5vdyBhbHdheXMgd3JpdGVzIGEgWklQX1NUT1JFRCBoZWFkZXIgZm9yIGRpcmVjdG9yeQogICBlbnRyaWVzLiAgUGF0Y2ggYnkgRGluZ3l1YW4gV2FuZy4KIAorLSBJc3N1ZSAjMjU2MjY6IENoYW5nZSB0aHJlZSB6bGliIGZ1bmN0aW9ucyB0byBhY2NlcHQgc2l6ZXMgdGhhdCBmaXQgaW4KKyAgUHlfc3NpemVfdCwgYnV0IGludGVybmFsbHkgY2FwIHRob3NlIHNpemVzIHRvIFVJTlRfTUFYLiAgVGhpcyByZXNvbHZlcyBhCisgIHJlZ3Jlc3Npb24gaW4gMy41IHdoZXJlIEd6aXBGaWxlLnJlYWQoKSBmYWlsZWQgdG8gcmVhZCBjaHVua3MgbGFyZ2VyIHRoYW4gMgorICBvciA0IEdpQi4gIFRoZSBjaGFuZ2UgYWZmZWN0cyB0aGUgemxpYi5EZWNvbXByZXNzLmRlY29tcHJlc3MoKSBtYXhfbGVuZ3RoCisgIHBhcmFtZXRlciwgdGhlIHpsaWIuZGVjb21wcmVzcygpIGJ1ZnNpemUgcGFyYW1ldGVyLCBhbmQgdGhlCisgIHpsaWIuRGVjb21wcmVzcy5mbHVzaCgpIGxlbmd0aCBwYXJhbWV0ZXIuCisKKy0gSXNzdWUgIzI1NTgzOiBBdm9pZCBpbmNvcnJlY3QgZXJyb3JzIHJhaXNlZCBieSBvcy5tYWtlZGlycyhleGlzdF9vaz1UcnVlKQorICB3aGVuIHRoZSBPUyBnaXZlcyBwcmlvcml0eSB0byBlcnJvcnMgc3VjaCBhcyBFQUNDRVMgb3ZlciBFRVhJU1QuCisKKy0gSXNzdWUgIzI1NTkzOiBDaGFuZ2Ugc2VtYW50aWNzIG9mIEV2ZW50TG9vcC5zdG9wKCkgaW4gYXN5bmNpby4KKworLSBJc3N1ZSAjNjk3MzogV2hlbiB3ZSBrbm93IGEgc3VicHJvY2Vzcy5Qb3BlbiBwcm9jZXNzIGhhcyBkaWVkLCBkbworICBub3QgYWxsb3cgdGhlIHNlbmRfc2lnbmFsKCksIHRlcm1pbmF0ZSgpLCBvciBraWxsKCkgbWV0aG9kcyB0byBkbworICBhbnl0aGluZyBhcyB0aGV5IGNvdWxkIHBvdGVudGlhbGx5IHNpZ25hbCBhIGRpZmZlcmVudCBwcm9jZXNzLgorCistIElzc3VlICMyMzg4MzogQWRkZWQgbWlzc2luZyBBUElzIHRvIF9fYWxsX18gdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJcworICBmb3IgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiBjYWxlbmRhciwgY3N2LCBlbnVtLCBmaWxlaW5wdXQsIGZ0cGxpYiwgbG9nZ2luZywKKyAgb3B0cGFyc2UsIHRhcmZpbGUsIHRocmVhZGluZyBhbmQgd2F2ZS4gIEFsc28gYWRkZWQgYQorICB0ZXN0LnN1cHBvcnQuY2hlY2tfX2FsbF9fKCkgaGVscGVyLiAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLCBNYXVybworICBTLiBNLiBSb2RyaWd1ZXMgYW5kIEpvZWwgVGFkZGVpLgorCistIElzc3VlICMyNTU5MDogSW4gdGhlIFJlYWRsaW5lIGNvbXBsZXRlciwgb25seSBjYWxsIGdldGF0dHIoKSBvbmNlIHBlcgorICBhdHRyaWJ1dGUuICBBbHNvIGNvbXBsZXRlIG5hbWVzIG9mIGF0dHJpYnV0ZXMgc3VjaCBhcyBwcm9wZXJ0aWVzIGFuZCBzbG90cworICB3aGljaCBhcmUgbGlzdGVkIGJ5IGRpcigpIGJ1dCBub3QgeWV0IGNyZWF0ZWQgb24gYW4gaW5zdGFuY2UuCisKKy0gSXNzdWUgIzI1NDk4OiBGaXggYSBjcmFzaCB3aGVuIGdhcmJhZ2UtY29sbGVjdGluZyBjdHlwZXMgb2JqZWN0cyBjcmVhdGVkCisgIGJ5IHdyYXBwaW5nIGEgbWVtb3J5dmlldy4gIFRoaXMgd2FzIGEgcmVncmVzc2lvbiBtYWRlIGluIDMuNWExLiAgQmFzZWQKKyAgb24gcGF0Y2ggYnkgRXJ5a3N1bi4KKworLSBJc3N1ZSAjMjU1ODQ6IEFkZGVkICJlc2NhcGUiIHRvIHRoZSBfX2FsbF9fIGxpc3QgaW4gdGhlIGdsb2IgbW9kdWxlLgorCistIElzc3VlICMyNTU4NDogRml4ZWQgcmVjdXJzaXZlIGdsb2IoKSB3aXRoIHBhdHRlcm5zIHN0YXJ0aW5nIHdpdGggJ1wqXConLgorCistIElzc3VlICMyNTQ0NjogRml4IHJlZ3Jlc3Npb24gaW4gc210cGxpYidzIEFVVEggTE9HSU4gc3VwcG9ydC4KKworLSBJc3N1ZSAjMTgwMTA6IEZpeCB0aGUgcHlkb2Mgd2ViIHNlcnZlcidzIG1vZHVsZSBzZWFyY2ggZnVuY3Rpb24gdG8gaGFuZGxlCisgIGV4Y2VwdGlvbnMgZnJvbSBpbXBvcnRpbmcgcGFja2FnZXMuCisKKy0gSXNzdWUgIzI1NTU0OiBHb3QgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMgaW4gcmVndWxhciBleHByZXNzaW9uIHBhcnNpbmcuCisKKy0gSXNzdWUgIzE4OTczOiBDb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9mIHRoZSBjYWxlbmRhciBtb2R1bGUgbm93IHVzZXMgYXJncGFyc2UKKyAgaW5zdGVhZCBvZiBvcHRwYXJzZS4KKworLSBJc3N1ZSAjMjU1MTA6IGZpbGVpbnB1dC5GaWxlSW5wdXQucmVhZGxpbmUoKSBub3cgcmV0dXJucyBiJycgaW5zdGVhZCBvZiAnJworICBhdCB0aGUgZW5kIGlmIHRoZSBGaWxlSW5wdXQgd2FzIG9wZW5lZCB3aXRoIGJpbmFyeSBtb2RlLgorICBQYXRjaCBieSBSeW9zdWtlIEl0by4KKworLSBJc3N1ZSAjMjU1MDM6IEZpeGVkIGluc3BlY3QuZ2V0ZG9jKCkgZm9yIGluaGVyaXRlZCBkb2NzdHJpbmdzIG9mIHByb3BlcnRpZXMuCisgIE9yaWdpbmFsIHBhdGNoIGJ5IEpvaG4gTWFyayBWYW5kZW5iZXJnLgorCistIElzc3VlICMyNTUxNTogQWx3YXlzIHVzZSBvcy51cmFuZG9tIGFzIGEgc291cmNlIG9mIHJhbmRvbW5lc3MgaW4gdXVpZC51dWlkNC4KKworLSBJc3N1ZSAjMjE4Mjc6IEZpeGVkIHRleHR3cmFwLmRlZGVudCgpIGZvciB0aGUgY2FzZSB3aGVuIGxhcmdlc3QgY29tbW9uCisgIHdoaXRlc3BhY2UgaXMgYSBzdWJzdHJpbmcgb2Ygc21hbGxlc3QgbGVhZGluZyB3aGl0ZXNwYWNlLgorICBCYXNlZCBvbiBwYXRjaCBieSBSb2JlcnQgTGkuCisKKy0gSXNzdWUgIzI1NDQ3OiBUaGUgbHJ1X2NhY2hlKCkgd3JhcHBlciBvYmplY3RzIG5vdyBjYW4gYmUgY29waWVkIGFuZCBwaWNrbGVkCisgIChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIG9iamVjdCB1bmNoYW5nZWQpLgorCistIElzc3VlICMyNTM5MDogdHlwaW5nOiBEb24ndCBjcmFzaCBvbiBVbmlvbltzdHIsIFBhdHRlcm5dLgorCistIElzc3VlICMyNTQ0MTogYXN5bmNpbzogUmFpc2UgZXJyb3IgZnJvbSBkcmFpbigpIHdoZW4gc29ja2V0IGlzIGNsb3NlZC4KKworLSBJc3N1ZSAjMjU0MTA6IENsZWFuZWQgdXAgYW5kIGZpeGVkIG1pbm9yIGJ1Z3MgaW4gQyBpbXBsZW1lbnRhdGlvbiBvZgorICBPcmRlcmVkRGljdC4KKworLSBJc3N1ZSAjMjU0MTE6IEltcHJvdmVkIFVuaWNvZGUgc3VwcG9ydCBpbiBTTVRQSGFuZGxlciB0aHJvdWdoIGJldHRlciB1c2Ugb2YKKyAgdGhlIGVtYWlsIHBhY2thZ2UuIFRoYW5rcyB0byB1c2VyIHNpbW9uMDQgZm9yIHRoZSBwYXRjaC4KKworLSBNb3ZlIHRoZSBpbXAgbW9kdWxlIGZyb20gYSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIHRvIERlcHJlY2F0aW9uV2FybmluZy4KKworLSBJc3N1ZSAjMjU0MDc6IFJlbW92ZSBtZW50aW9ucyBvZiB0aGUgZm9ybWF0dGVyIG1vZHVsZSBiZWluZyByZW1vdmVkIGluCisgIFB5dGhvbiAzLjYuCisKKy0gSXNzdWUgIzI1NDA2OiBGaXhlZCBhIGJ1ZyBpbiBDIGltcGxlbWVudGF0aW9uIG9mIE9yZGVyZWREaWN0Lm1vdmVfdG9fZW5kKCkKKyAgdGhhdCBjYXVzZWQgc2VnbWVudGF0aW9uIGZhdWx0IG9yIGhhbmcgaW4gaXRlcmF0aW5nIGFmdGVyIG1vdmluZyBzZXZlcmFsCisgIGl0ZW1zIHRvIHRoZSBzdGFydCBvZiBvcmRlcmVkIGRpY3QuCisKKy0gSXNzdWUgIzI1MzgyOiBwaWNrbGV0b29scy5kaXMoKSBub3cgb3V0cHV0cyBpbXBsaWNpdCBtZW1vIGluZGV4IGZvciB0aGUKKyAgTUVNT0laRSBvcGNvZGUuCisKKy0gSXNzdWUgIzI1MzU3OiBBZGQgYW4gb3B0aW9uYWwgbmV3bGluZSBwYXJhbWVyIHRvIGJpbmFzY2lpLmIyYV9iYXNlNjQoKS4KKyAgYmFzZTY0LmI2NGVuY29kZSgpIHVzZXMgaXQgdG8gYXZvaWQgYSBtZW1vcnkgY29weS4KKworLSBJc3N1ZSAjMjQxNjQ6IE9iamVjdHMgdGhhdCBuZWVkIGNhbGxpbmcgYGBfX25ld19fYGAgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cywKKyAgY2FuIG5vdyBiZSBwaWNrbGVkIHVzaW5nIHBpY2tsZSBwcm90b2NvbHMgb2xkZXIgdGhhbiBwcm90b2NvbCB2ZXJzaW9uIDQuCisKKy0gSXNzdWUgIzI1MzY0OiB6aXBmaWxlIG5vdyB3b3JrcyBpbiB0aHJlYWRzIGRpc2FibGVkIGJ1aWxkcy4KKworLSBJc3N1ZSAjMjUzMjg6IHNtdHBkJ3MgU01UUENoYW5uZWwgbm93IGNvcnJlY3RseSByYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGJvdGgKKyAgZGVjb2RlX2RhdGEgYW5kIGVuYWJsZV9TTVRQVVRGOCBhcmUgc2V0IHRvIHRydWUuCisKKy0gSXNzdWUgIzE2MDk5OiBSb2JvdEZpbGVQYXJzZXIgbm93IHN1cHBvcnRzIENyYXdsLWRlbGF5IGFuZCBSZXF1ZXN0LXJhdGUKKyAgZXh0ZW5zaW9ucy4gIFBhdGNoIGJ5IE5pa29sYXkgQm9nb3ljaGV2LgorCistIElzc3VlICMyNTMxNjogZGlzdHV0aWxzIHJhaXNlcyBPU0Vycm9yIGluc3RlYWQgb2YgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorICB3aGVuIE1TVkMgaXMgbm90IGluc3RhbGxlZC4KKworLSBJc3N1ZSAjMjUzODA6IEZpeGVkIHByb3RvY29sIGZvciB0aGUgU1RBQ0tfR0xPQkFMIG9wY29kZSBpbgorICBwaWNrbGV0b29scy5vcGNvZGVzLgorCistIElzc3VlICMyMzk3MjogVXBkYXRlcyBhc3luY2lvIGRhdGFncmFtIGNyZWF0ZSBtZXRob2QgYWxsb3dpbmcgcmV1c2Vwb3J0CisgIGFuZCByZXVzZWFkZHIgc29ja2V0IG9wdGlvbnMgdG8gYmUgc2V0IHByaW9yIHRvIGJpbmRpbmcgdGhlIHNvY2tldC4KKyAgTWlycm9yaW5nIHRoZSBleGlzdGluZyBhc3luY2lvIGNyZWF0ZV9zZXJ2ZXIgbWV0aG9kIHRoZSByZXVzZWFkZHIgb3B0aW9uCisgIGZvciBkYXRhZ3JhbSBzb2NrZXRzIGRlZmF1bHRzIHRvIFRydWUgaWYgdGhlIE8vUyBpcyAncG9zaXgnIChleGNlcHQgaWYgdGhlCisgIHBsYXRmb3JtIGlzIEN5Z3dpbikuIFBhdGNoIGJ5IENocmlzIExhd3MuCisKKy0gSXNzdWUgIzI1MzA0OiBBZGQgYXN5bmNpby5ydW5fY29yb3V0aW5lX3RocmVhZHNhZmUoKS4gIFRoaXMgbGV0cyB5b3UKKyAgc3VibWl0IGEgY29yb3V0aW5lIHRvIGEgbG9vcCBmcm9tIGFub3RoZXIgdGhyZWFkLCByZXR1cm5pbmcgYQorICBjb25jdXJyZW50LmZ1dHVyZXMuRnV0dXJlLiAgQnkgVmluY2VudCBNaWNoZWwuCisKKy0gSXNzdWUgIzI1MjMyOiBGaXggQ0dJUmVxdWVzdEhhbmRsZXIgdG8gc3BsaXQgdGhlIHF1ZXJ5IGZyb20gdGhlIFVSTCBhdCB0aGUKKyAgZmlyc3QgcXVlc3Rpb24gbWFyayAoPykgcmF0aGVyIHRoYW4gdGhlIGxhc3QuIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI0NjU3OiBQcmV2ZW50IENHSVJlcXVlc3RIYW5kbGVyIGZyb20gY29sbGFwc2luZyBzbGFzaGVzIGluIHRoZQorICBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwgYXMgaWYgaXQgd2VyZSBhIHBhdGguIFBhdGNoIGZyb20gWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzI1Mjg3OiBEb24ndCBhZGQgY3J5cHQuTUVUSE9EX0NSWVBUIHRvIGNyeXB0Lm1ldGhvZHMgaWYgaXQncyBub3QKKyAgc3VwcG9ydGVkLiBDaGVjayBpZiBpdCBpcyBzdXBwb3J0ZWQsIGl0IG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIE9wZW5CU0QgZm9yCisgIGV4YW1wbGUuCisKKy0gSXNzdWUgIzIzNjAwOiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby5mcm9tdXRjKCkgd2FzIHJldHVybmluZworICB3cm9uZyByZXN1bHRzIGluIHNvbWUgY2FzZXMuCisKKy0gSXNzdWUgIzI1MjAzOiBGYWlsZWQgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcl9kZWxpbXMoKSBubyBsb25nZXIgbGVmdCB0aGUKKyAgbW9kdWxlIGluIGluY29uc2lzdGVudCBzdGF0ZS4KKworLSBJc3N1ZSAjMjUwMTE6IHJsY29tcGxldGVyIG5vdyBvbWl0cyBwcml2YXRlIGFuZCBzcGVjaWFsIGF0dHJpYnV0ZSBuYW1lcyB1bmxlc3MKKyAgdGhlIHByZWZpeCBzdGFydHMgd2l0aCB1bmRlcnNjb3Jlcy4KKworLSBJc3N1ZSAjMjUyMDk6IHJsY29tcGxldGVyIG5vdyBjYW4gYWRkIGEgc3BhY2Ugb3IgYSBjb2xvbiBhZnRlciBjb21wbGV0ZWQga2V5d29yZC4KKworLSBJc3N1ZSAjMjIyNDE6IHRpbWV6b25lLnV0YyBuYW1lIGlzIG5vdyBwbGFpbiAnVVRDJywgbm90ICdVVEMtMDA6MDAnLgorCistIElzc3VlICMyMzUxNzogZnJvbXRpbWVzdGFtcCgpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgbWV0aG9kcyBvZgorICBkYXRldGltZS5kYXRldGltZSBub3cgcm91bmQgbWljcm9zZWNvbmRzIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvCisgIG5lYXJlc3QgZXZlbiBpbnRlZ2VyIChST1VORF9IQUxGX0VWRU4pLCBhcyByb3VuZChmbG9hdCksIGluc3RlYWQgb2Ygcm91bmRpbmcKKyAgdG93YXJkcyAtSW5maW5pdHkgKFJPVU5EX0ZMT09SKS4KKworLSBJc3N1ZSAjMjM1NTI6IFRpbWVpdCBub3cgd2FybnMgd2hlbiB0aGVyZSBpcyBzdWJzdGFudGlhbCAoNHgpIHZhcmlhbmNlCisgIGJldHdlZW4gYmVzdCBhbmQgd29yc3QgdGltZXMuIFBhdGNoIGZyb20gU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ2MzM6IHNpdGUtcGFja2FnZXMvUkVBRE1FIC0+IFJFQURNRS50eHQuCisKKy0gSXNzdWUgIzI0ODc5OiBoZWxwKCkgYW5kIHB5ZG9jIGNhbiBub3cgbGlzdCBuYW1lZCB0dXBsZSBmaWVsZHMgaW4gdGhlCisgIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIHJhdGhlciB0aGFuIGFscGhhYmV0aWNhbGx5LiAgVGhlIG9yZGVyaW5nIGlzCisgIGRldGVybWluZWQgYnkgdGhlIF9maWVsZHMgYXR0cmlidXRlIGlmIHByZXNlbnQuCisKKy0gSXNzdWUgIzI0ODc0OiBJbXByb3ZlIHNwZWVkIG9mIGl0ZXJ0b29scy5jeWNsZSgpIGFuZCBtYWtlIGl0cworICBwaWNrbGUgbW9yZSBjb21wYWN0LgorCistIEZpeCBjcmFzaCBpbiBpdGVydG9vbHMuY3ljbGUuX19zZXRzdGF0ZV9fKCkgd2hlbiB0aGUgZmlyc3QgYXJndW1lbnQgd2Fzbid0CisgIGEgbGlzdC4KKworLSBJc3N1ZSAjMjAwNTk6IHVybGxpYi5wYXJzZSByYWlzZXMgVmFsdWVFcnJvciBvbiBhbGwgaW52YWxpZCBwb3J0cy4KKyAgUGF0Y2ggYnkgTWFydGluIFBhbnRlci4KKworLSBJc3N1ZSAjMjQzNjA6IEltcHJvdmUgX19yZXByX18gb2YgYXJncGFyc2UuTmFtZXNwYWNlKCkgZm9yIGludmFsaWQKKyAgaWRlbnRpZmllcnMuICBQYXRjaCBieSBNYXR0aGlhcyBCdXNzb25uaWVyLgorCistIElzc3VlICMyMzQyNjogcnVuX3NldHVwIHdhcyBicm9rZW4gaW4gZGlzdHV0aWxzLgorICBQYXRjaCBmcm9tIEFsZXhhbmRlciBCZWxvcG9sc2t5LgorCistIElzc3VlICMxMzkzODogMnRvMyBjb252ZXJ0cyBTdHJpbmdUeXBlcyB0byBhIHR1cGxlLiBQYXRjaCBmcm9tIE1hcmsgSGFtbW9uZC4KKworLSBJc3N1ZSAjMjA5MTogb3BlbigpIGFjY2VwdGVkIGEgJ1UnIG1vZGUgc3RyaW5nIGNvbnRhaW5pbmcgJysnLCBidXQgJ1UnIGNhbgorICBvbmx5IGJlIHVzZWQgd2l0aCAncicuIFBhdGNoIGZyb20gSmVmZiBCYWxvZ2ggYW5kIEpvaG4gTydDb25ub3IuCisKKy0gSXNzdWUgIzg1ODU6IGltcHJvdmVkIHRlc3RzIGZvciB6aXBpbXBvcnRlcjIuIFBhdGNoIGZyb20gTWFyayBMYXdyZW5jZS4KKworLSBJc3N1ZSAjMTg2MjI6IHVuaXR0ZXN0Lm1vY2subW9ja19vcGVuKCkucmVzZXRfbW9jayB3b3VsZCByZWN1cnNlIGluZmluaXRlbHkuCisgIFBhdGNoIGZyb20gTmljb2xhIFBhbHVtYm8gYW5kIExhdXJlbnQgRGUgQnV5c3QuCisKKy0gSXNzdWUgIzI0NDI2OiBGYXN0IHNlYXJjaGluZyBvcHRpbWl6YXRpb24gaW4gcmVndWxhciBleHByZXNzaW9ucyBub3cgd29ya3MKKyAgZm9yIHBhdHRlcm5zIHRoYXQgc3RhcnRzIHdpdGggY2FwdHVyaW5nIGdyb3Vwcy4gIEZhc3Qgc2VhcmNoaW5nIG9wdGltaXphdGlvbgorICBub3cgY2FuJ3QgYmUgZGlzYWJsZWQgYXQgY29tcGlsZSB0aW1lLgorCistIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCisgIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCisKKy0gSXNzdWUgIzEzMjQ4OiBSZW1vdmUgZGVwcmVjYXRlZCBpbnNwZWN0LmdldG1vZHVsZWluZm8gZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI1NTc4OiBGaXggKGFub3RoZXIpIG1lbW9yeSBsZWFrIGluIFNTTFNvY2tldC5nZXRwZWVyY2VyKCkuCisKKy0gSXNzdWUgIzI1NTMwOiBEaXNhYmxlIHRoZSB2dWxuZXJhYmxlIFNTTHYzIHByb3RvY29sIGJ5IGRlZmF1bHQgd2hlbiBjcmVhdGluZworICBzc2wuU1NMQ29udGV4dC4KKworLSBJc3N1ZSAjMjU1Njk6IEZpeCBtZW1vcnkgbGVhayBpbiBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKS4KKworLSBJc3N1ZSAjMjU0NzE6IFNvY2tldHMgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKSBzaG91bGRuJ3QgYXBwZWFyIHRvIGJlCisgIG5vbmJsb2NraW5nLgorCistIElzc3VlICMyNTMxOTogV2hlbiB0aHJlYWRpbmcuRXZlbnQgaXMgcmVpbml0aWFsaXplZCwgdGhlIHVuZGVybHlpbmcgY29uZGl0aW9uCisgIHNob3VsZCB1c2UgYSByZWd1bGFyIGxvY2sgcmF0aGVyIHRoYW4gYSByZWN1cnNpdmUgbG9jay4KKwogLSBTa2lwIGdldGFkZHJpbmZvIGlmIGhvc3QgaXMgYWxyZWFkeSByZXNvbHZlZC4KICAgUGF0Y2ggYnkgQS4gSmVzc2UgSmlyeXUgRGF2aXMuCiAKQEAgLTYzMCw1MyArMTQzNiw5IEBACiAKIC0gSXNzdWUgIzI3MDQxOiBhc3luY2lvOiBBZGQgbG9vcC5jcmVhdGVfZnV0dXJlIG1ldGhvZAogCi0tIElzc3VlICMyNzIyMzogYXN5bmNpbzogRml4IF9yZWFkX3JlYWR5IGFuZCBfd3JpdGVfcmVhZHkgdG8gcmVzcGVjdAotICBfY29ubl9sb3N0LgotICBQYXRjaCBieSDFgXVrYXN6IExhbmdhLgotCi0tIElzc3VlICMyMjk3MDogYXN5bmNpbzogRml4IGluY29uc2lzdGVuY3kgY2FuY2VsbGluZyBDb25kaXRpb24ud2FpdC4KLSAgUGF0Y2ggYnkgRGF2aWQgQ29sZXMuCi0KIElETEUKIC0tLS0KIAotLSBJc3N1ZSAjNTEyNDogUGFzdGUgd2l0aCB0ZXh0IHNlbGVjdGVkIG5vdyByZXBsYWNlcyB0aGUgc2VsZWN0aW9uIG9uIFgxMS4KLSAgVGhpcyBtYXRjaGVzIGhvdyBwYXN0ZSB3b3JrcyBvbiBXaW5kb3dzLCBNYWMsIG1vc3QgbW9kZXJuIExpbnV4IGFwcHMsCi0gIGFuZCB0dGsgd2lkZ2V0cy4gIE9yaWdpbmFsIHBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCi0KLS0gSXNzdWUgIzI0NzU5OiBNYWtlIGNsZWFyIGluIGlkbGVsaWIuaWRsZV90ZXN0Ll9faW5pdF9fIHRoYXQgdGhlIGRpcmVjdG9yeQotICBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdC50ZXN0X2lkbGUgYW5kIHRvb2wgZm9yIG1haW50YWluZXJzLgotCi0tIElzc3VlICMyNzE5NjogU3RvcCAnVGhlbWVDaGFuZ2VkJyB3YXJuaW5ncyB3aGVuIHJ1bm5pbmcgSURMRSB0ZXN0cy4KLSAgVGhlc2UgcGVyc2lzdGVkIGFmdGVyIG90aGVyIHdhcm5pbmdzIHdlcmUgc3VwcHJlc3NlZCBpbiAjMjA1NjcuCi0gIEFwcGx5IFNlcmhpeSBTdG9yY2hha2EncyB1cGRhdGVfaWRsZXRhc2tzIHNvbHV0aW9uIHRvIGZvdXIgdGVzdCBmaWxlcy4KLSAgUmVjb3JkIHRoaXMgYWRkaXRpb25hbCBhZHZpY2UgaW4gaWRsZV90ZXN0L1JFQURNRS50eHQKLQotLSBJc3N1ZSAjMjA1Njc6IFJldmlzZSBpZGxlX3Rlc3QvUkVBRE1FLnR4dCB3aXRoIGFkdmljZSBhYm91dCBhdm9pZGluZwotICB0ayB3YXJuaW5nIG1lc3NhZ2VzIGZyb20gdGVzdHMuICBBcHBseSBhZHZpY2UgdG8gc2V2ZXJhbCBJRExFIHRlc3RzLgotCi0tIElzc3VlICMyNzExNzogTWFrZSBjb2xvcml6ZXIgaHRlc3QgYW5kIHR1cnRsZWRlbW8gd29yayB3aXRoIGRhcmsgdGhlbWVzLgotICBNb3ZlIGNvZGUgZm9yIGNvbmZpZ3VyaW5nIHRleHQgd2lkZ2V0IGNvbG9ycyB0byBhIG5ldyBmdW5jdGlvbi4KLQotLSBJc3N1ZSAjMjY2NzM6IFdoZW4gdGsgcmVwb3J0cyBmb250IHNpemUgYXMgMCwgY2hhbmdlIHRvIHNpemUgMTAuCi0gIFN1Y2ggZm9udHMgb24gTGludXggcHJldmVudGVkIHRoZSBjb25maWd1cmF0aW9uIGRpYWxvZyBmcm9tIG9wZW5pbmcuCi0KLS0gSXNzdWUgIzIxOTM5OiBBZGQgdGVzdCBmb3IgSURMRSdzIHBlcmNvbGF0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KLQotLSBJc3N1ZSAjMjE2NzY6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcmVwbGFjZSBkaWFsb2cuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KLQotLSBJc3N1ZSAjMTg0MTA6IEFkZCB0ZXN0IGZvciBJRExFJ3Mgc2VhcmNoIGRpYWxvZy4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgV2VzdGxleSBNYXJ0w61uZXouCi0KLS0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgSURMRSdzIHVuZG8gZGVsZWdhdG9yLgotICBPcmlnaW5hbCBwYXRjaCBieSBTYWltYWRoYXYgSGVibGlrYXIgLgotCi0tIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KLQotLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCi0KIC0gSXNzdWUgIzIwNjQwOiBBZGQgdGVzdHMgZm9yIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQuCiAgIFBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthci4KIApAQCAtNjkwLDExICsxNDUyLDEwMyBAQAogICBNQVJLIGluIFJFQURNRS50eHQgYW5kIG9wZW4gdGhpcyBhbmQgTkVXUy50eHQgd2l0aCAnYXNjaWknLgogICBSZS1lbmNvZGUgQ1JFRElUUy50eHQgdG8gdXRmLTggYW5kIG9wZW4gaXQgd2l0aCAndXRmLTgnLgogCistIElzc3VlICMxNTM0ODogU3RvcCB0aGUgZGVidWdnZXIgZW5naW5lIChub3JtYWxseSBpbiBhIHVzZXIgcHJvY2VzcykKKyAgYmVmb3JlIGNsb3NpbmcgdGhlIGRlYnVnZ2VyIHdpbmRvdyAocnVubmluZyBpbiB0aGUgSURMRSBwcm9jZXNzKS4KKyAgVGhpcyBwcmV2ZW50cyB0aGUgUnVudGltZUVycm9ycyB0aGF0IHdlcmUgYmVpbmcgY2F1Z2h0IGFuZCBpZ25vcmVkLgorCistIElzc3VlICMyNDQ1NTogUHJldmVudCBJRExFIGZyb20gaGFuZ2luZyB3aGVuIGEpIGNsb3NpbmcgdGhlIHNoZWxsIHdoaWxlIHRoZQorICBkZWJ1Z2dlciBpcyBhY3RpdmUgKDE1MzQ3KTsgYikgY2xvc2luZyB0aGUgZGVidWdnZXIgd2l0aCB0aGUgW1hdIGJ1dHRvbgorICAoMTUzNDgpOyBhbmQgYykgYWN0aXZhdGluZyB0aGUgZGVidWdnZXIgd2hlbiBhbHJlYWR5IGFjdGl2ZSAoMjQ0NTUpLgorICBUaGUgcGF0Y2ggYnkgTWFyayBSb3NlbWFuIGRvZXMgdGhpcyBieSBtYWtpbmcgdHdvIGNoYW5nZXMuCisgIDEuIFN1c3BlbmQgYW5kIHJlc3VtZSB0aGUgZ3VpLmludGVyYWN0aW9uIG1ldGhvZCB3aXRoIHRoZSB0Y2wgdndhaXQKKyAgbWVjaGFuaXNtIGludGVuZGVkIGZvciB0aGlzIHB1cnBvc2UgKGluc3RlYWQgb2Ygcm9vdC5tYWlubG9vcCAmIC5xdWl0KS4KKyAgMi4gSW4gZ3VpLnJ1biwgYWxsb3cgYW55IGV4aXN0aW5nIGludGVyYWN0aW9uIHRvIHRlcm1pbmF0ZSBmaXJzdC4KKworLSBDaGFuZ2UgJ1RoZSBwcm9ncmFtJyB0byAnWW91ciBwcm9ncmFtJyBpbiBhbiBJRExFICdraWxsIHByb2dyYW0/JyBtZXNzYWdlCisgIHRvIG1ha2UgaXQgY2xlYXJlciB0aGF0IHRoZSBwcm9ncmFtIHJlZmVycmVkIHRvIGlzIHRoZSBjdXJyZW50bHkgcnVubmluZworICB1c2VyIHByb2dyYW0sIG5vdCBJRExFIGl0c2VsZi4KKworLSBJc3N1ZSAjMjQ3NTA6IEltcHJvdmUgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIElETEUgZWRpdG9yIHdpbmRvdyBzdGF0dXMgYmFyLgorICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MzEzOiBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIG5ldyBidWlsdC1pbiB0ZXh0IGNvbG9yIHRoZW1lcyB0byBiZXR0ZXIKKyAgYWRkcmVzcyB0aGUgY29tcGF0aWJpbGl0eSBwcm9ibGVtIGludHJvZHVjZWQgYnkgdGhlIGFkZGl0aW9uIG9mIElETEUgRGFyay4KKyAgQ29uc2lzdGVudGx5IHVzZSB0aGUgcmV2aXNlZCBpZGxlQ29uZi5DdXJyZW50VGhlbWUgZXZlcnl3aGVyZSBpbiBpZGxlbGliLgorCistIElzc3VlICMyNDc4MjogRXh0ZW5zaW9uIGNvbmZpZ3VyYXRpb24gaXMgbm93IGEgdGFiIGluIHRoZSBJRExFIFByZWZlcmVuY2VzCisgIGRpYWxvZyByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGRpYWxvZy4gIFRoZSBmb3JtZXIgdGFicyBhcmUgbm93IGEgc29ydGVkCisgIGxpc3QuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzIyNzI2OiBSZS1hY3RpdmF0ZSB0aGUgY29uZmlnIGRpYWxvZyBoZWxwIGJ1dHRvbiB3aXRoIHNvbWUgY29udGVudAorICBhYm91dCB0aGUgb3RoZXIgYnV0dG9ucyBhbmQgdGhlIG5ldyBJRExFIERhcmsgdGhlbWUuCisKKy0gSXNzdWUgIzI0ODIwOiBJRExFIG5vdyBoYXMgYW4gJ0lETEUgRGFyaycgYnVpbHQtaW4gdGV4dCBjb2xvciB0aGVtZS4KKyAgSXQgaXMgbW9yZSBvciBsZXNzIElETEUgQ2xhc3NpYyBpbnZlcnRlZCwgd2l0aCBhIGNvYmFsdCBibHVlIGJhY2tncm91bmQuCisgIFN0cmluZ3MsIGNvbW1lbnRzLCBrZXl3b3JkcywgLi4uIGFyZSBzdGlsbCBncmVlbiwgcmVkLCBvcmFuZ2UsIC4uLiAuCisgIFRvIHVzZSBpdCB3aXRoIElETEVzIHJlbGVhc2VkIGJlZm9yZSBOb3ZlbWJlciAyMDE1LCBoaXQgdGhlCisgICdTYXZlIGFzIE5ldyBDdXN0b20gVGhlbWUnIGJ1dHRvbiBhbmQgZW50ZXIgYSBuZXcgbmFtZSwKKyAgc3VjaCBhcyAnQ3VzdG9tIERhcmsnLiAgVGhlIGN1c3RvbSB0aGVtZSB3aWxsIHdvcmsgd2l0aCBhbnkgSURMRQorICByZWxlYXNlLCBhbmQgY2FuIGJlIG1vZGlmaWVkLgorCistIElzc3VlICMyNTIyNDogUkVBRE1FLnR4dCBpcyBub3cgYW4gaWRsZWxpYiBpbmRleCBmb3IgSURMRSBkZXZlbG9wZXJzIGFuZAorICBjdXJpb3VzIHVzZXJzLiAgVGhlIHByZXZpb3VzIHVzZXIgY29udGVudCBpcyBub3cgaW4gdGhlIElETEUgZG9jIGNoYXB0ZXIuCisgICdJRExFJyBub3cgbWVhbnMgJ0ludGVncmF0ZWQgRGV2ZWxvcG1lbnQgYW5kIExlYXJuaW5nIEVudmlyb25tZW50Jy4KKworLSBJc3N1ZSAjMjQ4MjA6IFVzZXJzIGNhbiBub3cgc2V0IGJyZWFrcG9pbnQgY29sb3JzIGluCisgIFNldHRpbmdzIC0+IEN1c3RvbSBIaWdobGlnaHRpbmcuICBPcmlnaW5hbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0OTcyOiBJbmFjdGl2ZSBzZWxlY3Rpb24gYmFja2dyb3VuZCBub3cgbWF0Y2hlcyBhY3RpdmUgc2VsZWN0aW9uCisgIGJhY2tncm91bmQsIGFzIGNvbmZpZ3VyZWQgYnkgdXNlcnMsIG9uIGFsbCBzeXN0ZW1zLiAgRm91bmQgaXRlbXMgYXJlIG5vdworICBhbHdheXMgaGlnaGxpZ2h0ZWQgb24gV2luZG93cy4gIEluaXRpYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDU3MDogSWRsZTogbWFrZSBjYWxsdGlwIGFuZCBjb21wbGV0aW9uIGJveGVzIGFwcGVhciBvbiBNYWNzCisgIGFmZmVjdGVkIGJ5IGEgdGsgcmVncmVzc2lvbi4gIEluaXRpYWwgcGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNDk4ODogSWRsZSBTY3JvbGxlZExpc3QgY29udGV4dCBtZW51cyAodXNlZCBpbiBkZWJ1Z2dlcikKKyAgbm93IHdvcmsgb24gTWFjIEFxdWEuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0ODAxOiBNYWtlIHJpZ2h0LWNsaWNrIGZvciBjb250ZXh0IG1lbnUgd29yayBvbiBNYWMgQXF1YS4KKyAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTE3MzogQXNzb2NpYXRlIHRraW50ZXIgbWVzc2FnZWJveGVzIHdpdGggYSBzcGVjaWZpYyB3aWRnZXQuCisgIEZvciBNYWMgT1NYLCBtYWtlIHRoZW0gYSAnc2hlZXQnLiAgUGF0Y2ggYnkgTWFyayBSb3NlbWFuLgorCistIElzc3VlICMyNTE5ODogRW5oYW5jZSB0aGUgaW5pdGlhbCBodG1sIHZpZXdlciBub3cgdXNlZCBmb3IgSWRsZSBIZWxwLgorICAqIFByb3Blcmx5IGluZGVudCBmaXhlZC1waXRjaCB0ZXh0IChwYXRjaCBieSBNYXJrIFJvc2VtYW4pLgorICAqIEdpdmUgY29kZSBzbmlwcGV0IGEgdmVyeSBTcGhpbngtbGlrZSBsaWdodCBibHVlaXNoLWdyYXkgYmFja2dyb3VuZC4KKyAgKiBSZS11c2UgaW5pdGlhbCB3aWR0aCBhbmQgaGVpZ2h0IHNldCBieSB1c2VycyBmb3Igc2hlbGwgYW5kIGVkaXRvci4KKyAgKiBXaGVuIHRoZSBUYWJsZSBvZiBDb250ZW50cyAoVE9DKSBtZW51IGlzIHVzZWQsIHB1dCB0aGUgc2VjdGlvbiBoZWFkZXIKKyAgYXQgdGhlIHRvcCBvZiB0aGUgc2NyZWVuLgorCistIElzc3VlICMyNTIyNTogQ29uZGVuc2UgYW5kIHJld3JpdGUgSWRsZSBkb2Mgc2VjdGlvbiBvbiB0ZXh0IGNvbG9ycy4KKworLSBJc3N1ZSAjMjE5OTU6IEV4cGxhaW4gc29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElETEUgYW5kIGNvbnNvbGUgUHl0aG9uLgorCistIElzc3VlICMyMjgyMDogRXhwbGFpbiBuZWVkIGZvciAqcHJpbnQqIHdoZW4gcnVubmluZyBmaWxlIGZyb20gSWRsZSBlZGl0b3IuCisKKy0gSXNzdWUgIzI1MjI0OiBEb2M6IGF1Z21lbnQgSWRsZSBmZWF0dXJlIGxpc3QgYW5kIG5vLXN1YnByb2Nlc3Mgc2VjdGlvbi4KKworLSBJc3N1ZSAjMjUyMTk6IFVwZGF0ZSBkb2MgZm9yIElkbGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgIFNvbWUgd2VyZSBtaXNzaW5nIGFuZCBub3RlcyB3ZXJlIG5vdCBjb3JyZWN0LgorCistIElzc3VlICMyNDg2MTogTW9zdCBvZiBpZGxlbGliIGlzIHByaXZhdGUgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgorICBVc2UgaWRsZWliLmlkbGUuKiB0byBzdGFydCBJZGxlLiBTZWUgaWRsZWxpYi5fX2luaXRfXy5fX2RvY19fLgorCistIElzc3VlICMyNTE5OTogSWRsZTogYWRkIHN5bmNocm9uaXphdGlvbiBjb21tZW50cyBmb3IgZnV0dXJlIG1haW50YWluZXJzLgorCistIElzc3VlICMxNjg5MzogUmVwbGFjZSBoZWxwLnR4dCB3aXRoIGhlbHAuaHRtbCBmb3IgSWRsZSBkb2MgZGlzcGxheS4KKyAgVGhlIG5ldyBpZGxlbGliL2hlbHAuaHRtbCBpcyByc3RyaXBwZWQgRG9jL2J1aWxkL2h0bWwvbGlicmFyeS9pZGxlLmh0bWwuCisgIEl0IGxvb2tzIGJldHRlciB0aGFuIGhlbHAudHh0IGFuZCB3aWxsIGJldHRlciBkb2N1bWVudCBJZGxlIGFzIHJlbGVhc2VkLgorICBUaGUgdGtpbnRlciBodG1sIHZpZXdlciB0aGF0IHdvcmtzIGZvciB0aGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgUm9zZSBSb3NlbWFuLgorICBUaGUgbm93IHVudXNlZCBFZGl0b3JXaW5kb3cuSGVscERpYWxvZyBjbGFzcyBhbmQgaGVsdC50eHQgZmlsZSBhcmUgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjQxOTk6IERlcHJlY2F0ZSB1bnVzZWQgaWRsZWxpYi5pZGxldmVyIHdpdGggcG9zc2libGUgcmVtb3ZhbCBpbiAzLjYuCisKKy0gSXNzdWUgIzI0NzkwOiBSZW1vdmUgZXh0cmFuZW91cyBjb2RlICh3aGljaCBhbHNvIGNyZWF0ZSAyICYgMyBjb25mbGljdHMpLgorCiBEb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tCiAKLS0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCi0KIC0gSXNzdWUgIzI2NzM2OiBVc2VkIEhUVFBTIGZvciBleHRlcm5hbCBsaW5rcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpZiBwb3NzaWJsZS4KIAogLSBJc3N1ZSAjNjk1MzogUmV3b3JrIHRoZSBSZWFkbGluZSBtb2R1bGUgZG9jdW1lbnRhdGlvbiB0byBncm91cCByZWxhdGVkCkBAIC03MDMsOCArMTU1Nyw4IEBACiAKIC0gSXNzdWUgIzIzNjA2OiBBZGRzIG5vdGUgdG8gY3R5cGVzIGRvY3VtZW50YXRpb24gcmVnYXJkaW5nIGNkbGwubXN2Y3J0LgogCi0tIElzc3VlICMyNTUwMDogRml4IGRvY3VtZW50YXRpb24gdG8gbm90IGNsYWltIHRoYXQgX19pbXBvcnRfXyBpcyBzZWFyY2hlZCBmb3IKLSAgaW4gdGhlIGdsb2JhbCBzY29wZS4KKy0gSXNzdWUgIzI0OTUyOiBDbGFyaWZ5IHRoZSBkZWZhdWx0IHNpemUgYXJndW1lbnQgb2Ygc3RhY2tfc2l6ZSgpIGluCisgIHRoZSAidGhyZWFkaW5nIiBhbmQgIl90aHJlYWQiIG1vZHVsZXMuIFBhdGNoIGZyb20gTWF0dGlwLgogCiAtIElzc3VlICMyNjAxNDogVXBkYXRlIDMueCBwYWNrYWdpbmcgZG9jdW1lbnRhdGlvbjoKICAgKiAiU2VlIGFsc28iIGxpbmtzIHRvIHRoZSBuZXcgZG9jcyBhcmUgbm93IHByb3ZpZGVkIGluIHRoZSBsZWdhY3kgcGFnZXMKQEAgLTcxNiw2ICsxNTcwLDkgQEAKIC0gSXNzdWUgIzIxOTE2OiBBZGRlZCB0ZXN0cyBmb3IgdGhlIHR1cnRsZSBtb2R1bGUuICBQYXRjaCBieSBpbmdyaWQsCiAgIEdyZWdvcnkgTG95c2UgYW5kIEplbGxlIFppamxzdHJhLgogCistIElzc3VlICMyNjI5NTogV2hlbiB1c2luZyAicHl0aG9uMyAtbSB0ZXN0IC0tdGVzdGRpcj1URVNURElSIiwgcmVncnRlc3QKKyAgZG9lc24ndCBhZGQgInRlc3QuIiBwcmVmaXggdG8gdGVzdCBtb2R1bGUgbmFtZXMuCisKIC0gSXNzdWUgIzI2NTIzOiBUaGUgbXVsdGlwcm9jZXNzaW5nIHRocmVhZCBwb29sIChtdWx0aXByb2Nlc3NpbmcuZHVtbXkuUG9vbCkKICAgd2FzIHVudGVzdGVkLgogCkBAIC03MjQsMzEgKzE1ODEsNTAgQEAKIC0gSXNzdWUgIzI2MzI1OiBBZGRlZCB0ZXN0LnN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZygpIHRvIGNoZWNrIHRoYXQKICAgbm8gUmVzb3VyY2VXYXJuaW5nIGlzIGVtaXR0ZWQuCiAKLS0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldC4gIFRoaXMKKy0gSXNzdWUgIzI1OTQwOiBDaGFuZ2VkIHRlc3Rfc3NsIHRvIHVzZSBpdHMgaW50ZXJuYWwgbG9jYWwgc2VydmVyIG1vcmUuICBUaGlzCiAgIGF2b2lkcyByZWx5aW5nIG9uIHN2bi5weXRob24ub3JnLCB3aGljaCByZWNlbnRseSBjaGFuZ2VkIHJvb3QgY2VydGlmaWNhdGUuCiAKIC0gSXNzdWUgIzI1NjE2OiBUZXN0cyBmb3IgT3JkZXJlZERpY3QgYXJlIGV4dHJhY3RlZCBmcm9tIHRlc3RfY29sbGVjdGlvbnMKICAgaW50byBzZXBhcmF0ZSBmaWxlIHRlc3Rfb3JkZXJlZF9kaWN0LgogCistIElzc3VlICMyNTQ0OTogQWRkZWQgdGVzdHMgZm9yIE9yZGVyZWREaWN0IHN1YmNsYXNzZXMuCisKKy0gSXNzdWUgIzI1MTg4OiBBZGQgLVAvLS1wZ28gdG8gdGVzdC5yZWdydGVzdCB0byBzdXBwcmVzcyBlcnJvciBvdXRwdXQgd2hlbgorICBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlIGZvciB0aGUgcHVycG9zZXMgb2YgYSBQR08gYnVpbGQuIEluaXRpYWwgcGF0Y2ggYnkKKyAgQWxlY3NhbmRydSBQYXRyYXNjdS4KKworLSBJc3N1ZSAjMjI4MDY6IEFkZCBgYHB5dGhvbiAtbSB0ZXN0IC0tbGlzdC10ZXN0c2BgIGNvbW1hbmQgdG8gbGlzdCB0ZXN0cy4KKworLSBJc3N1ZSAjMTgxNzQ6IGBgcHl0aG9uIC1tIHRlc3QgLS1odW50cmxlYWtzIC4uLmBgIG5vdyBhbHNvIGNoZWNrcyBmb3IgbGVhayBvZgorICBmaWxlIGRlc2NyaXB0b3JzLiBQYXRjaCB3cml0dGVuIGJ5IFJpY2hhcmQgT3Vka2Vyay4KKworLSBJc3N1ZSAjMjUyNjA6IEZpeCBgYHB5dGhvbiAtbSB0ZXN0IC0tY292ZXJhZ2VgYCBvbiBXaW5kb3dzLiBSZW1vdmUgdGhlCisgIGxpc3Qgb2YgaWdub3JlZCBkaXJlY3Rvcmllcy4KKworLSBgYFBDYnVpbGRccnQuYmF0YGAgbm93IGFjY2VwdHMgYW4gdW5saW1pdGVkIG51bWJlciBvZiBhcmd1bWVudHMgdG8gcGFzcyBhbG9uZworICB0byByZWdydGVzdC5weS4gIFByZXZpb3VzbHkgdGhlcmUgd2FzIGEgbGltaXQgb2YgOS4KKwogLSBJc3N1ZSAjMjY1ODM6IFNraXAgdGVzdF90aW1lc3RhbXBfb3ZlcmZsb3cgaW4gdGVzdF9pbXBvcnQgaWYgYnl0ZWNvZGUKICAgZmlsZXMgY2Fubm90IGJlIHdyaXR0ZW4uCiAKIEJ1aWxkCiAtLS0tLQogCistIElzc3VlICMyMTI3NzogRG9uJ3QgdHJ5IHRvIGxpbmsgX2N0eXBlcyB3aXRoIGEgZmZpX2NvbnZlbmllbmNlIGxpYnJhcnkuCisKIC0gSXNzdWUgIzI2ODg0OiBGaXggbGlua2luZyBleHRlbnNpb24gbW9kdWxlcyBmb3IgY3Jvc3MgYnVpbGRzLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIAorLSBJc3N1ZSAjMjY5MzI6IEZpeGVkIHN1cHBvcnQgb2YgUlRMRF8qIGNvbnN0YW50cyBkZWZpbmVkIGFzIGVudW0gdmFsdWVzLAorICBub3QgdmlhIG1hY3JvcyAoaW4gcGFydGljdWxhciBvbiBBbmRyb2lkKS4gIFBhdGNoIGJ5IENoaSBIc3VhbiBZZW4uCisKIC0gSXNzdWUgIzIyMzU5OiBEaXNhYmxlIHRoZSBydWxlcyBmb3IgcnVubmluZyBfZnJlZXplX2ltcG9ydGxpYiBhbmQgcGdlbiB3aGVuCiAgIGNyb3NzLWNvbXBpbGluZy4gIFRoZSBvdXRwdXQgb2YgdGhlc2UgcHJvZ3JhbXMgaXMgbm9ybWFsbHkgc2F2ZWQgd2l0aCB0aGUKICAgc291cmNlIGNvZGUgYW55d2F5LCBhbmQgaXMgc3RpbGwgcmVnZW5lcmF0ZWQgd2hlbiBkb2luZyBhIG5hdGl2ZSBidWlsZC4KICAgUGF0Y2ggYnkgWGF2aWVyIGRlIEdheWUuCiAKLS0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKLSAgYnkgWGF2aWVyIGRlIEdheWUuCi0KIC0gSXNzdWUgIzIxNjY4OiBMaW5rIGF1ZGlvb3AsIF9kYXRldGltZSwgX2N0eXBlc190ZXN0IG1vZHVsZXMgdG8gbGlibSwKLSAgZXhjZXB0IG9uIE1hYyBPUyBYLiBQYXRjaCB3cml0dGVuIGJ5IFhhdmllciBkZSBHYXllLgorICBleGNlcHQgb24gTWFjIE9TIFguIFBhdGNoIHdyaXR0ZW4gYnkgQ2hpIEhzdWFuIFllbi4KIAogLSBJc3N1ZSAjMjU3MDI6IEEgLS13aXRoLWx0byBjb25maWd1cmUgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRoYXQgd2lsbAogICBlbmFibGUgbGluayB0aW1lIG9wdGltaXphdGlvbnMgYXQgYnVpbGQgdGltZSBkdXJpbmcgYSBtYWtlIHByb2ZpbGUtb3B0LgpAQCAtNzY3LDIyICsxNjQzLDI0IEBACiAKIC0gSXNzdWUgIzI2NDY1OiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJnLgogCi0tIElzc3VlICMyNDQyMTogQ29tcGlsZSBNb2R1bGVzL19tYXRoLmMgb25jZSwgYmVmb3JlIGJ1aWxkaW5nIGV4dGVuc2lvbnMuCi0gIFByZXZpb3VzbHkgaXQgY291bGQgZmFpbCB0byBjb21waWxlIHByb3Blcmx5IGlmIHRoZSBtYXRoIGFuZCBjbWF0aCBidWlsZHMKLSAgd2VyZSBjb25jdXJyZW50LgotCiAtIElzc3VlICMyNTM0ODogQWRkZWQgYGAtLXBnb2BgIGFuZCBgYC0tcGdvLWpvYmBgIGFyZ3VtZW50cyB0bwogICBgYFBDYnVpbGRcYnVpbGQuYmF0YGAgZm9yIGJ1aWxkaW5nIHdpdGggUHJvZmlsZS1HdWlkZWQgT3B0aW1pemF0aW9uLiAgVGhlCi0gIG9sZCBgYFBDYnVpbGRcYnVpbGRfcGdvLmJhdGBgIHNjcmlwdCBpcyBub3cgZGVwcmVjYXRlZCwgYW5kIHNpbXBseSBjYWxscwotICBgYFBDYnVpbGRcYnVpbGQuYmF0IC0tcGdvICUqYGAuCisgIG9sZCBgYFBDYnVpbGRcYnVpbGRfcGdvLmJhdGBgIHNjcmlwdCBpcyByZW1vdmVkLgogCiAtIElzc3VlICMyNTgyNzogQWRkIHN1cHBvcnQgZm9yIGJ1aWxkaW5nIHdpdGggSUNDIHRvIGBgY29uZmlndXJlYGAsIGluY2x1ZGluZwogICBhIG5ldyBgYC0td2l0aC1pY2NgYCBmbGFnLgogCiAtIElzc3VlICMyNTY5NjogRml4IGluc3RhbGxhdGlvbiBvZiBQeXRob24gb24gVU5JWCB3aXRoIG1ha2UgLWo5LgogCi0tIElzc3VlICMyNjkzMDogVXBkYXRlIE9TIFggMTAuNSsgMzItYml0LW9ubHkgaW5zdGFsbGVyIHRvIGJ1aWxkCi0gIGFuZCBsaW5rIHdpdGggT3BlblNTTCAxLjAuMmguCistIElzc3VlICMyNDk4NjogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGJ1aWxkIFB5dGhvbiBvbiBXaW5kb3dzIHdpdGhvdXQgZXJyb3JzCisgIHdoZW4gZXh0ZXJuYWwgbGlicmFyaWVzIGFyZSBub3QgYXZhaWxhYmxlLgorCistIElzc3VlICMyNDQyMTogQ29tcGlsZSBNb2R1bGVzL19tYXRoLmMgb25jZSwgYmVmb3JlIGJ1aWxkaW5nIGV4dGVuc2lvbnMuCisgIFByZXZpb3VzbHkgaXQgY291bGQgZmFpbCB0byBjb21waWxlIHByb3Blcmx5IGlmIHRoZSBtYXRoIGFuZCBjbWF0aCBidWlsZHMKKyAgd2VyZSBjb25jdXJyZW50LgorCistIElzc3VlICMyNjQ2NTogVXBkYXRlIE9TIFggMTAuNSsgMzItYml0LW9ubHkgaW5zdGFsbGVyIHRvIGJ1aWxkCisgIGFuZCBsaW5rIHdpdGggT3BlblNTTCAxLjAuMmcuCiAKIC0gSXNzdWUgIzI2MjY4OiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJmLgogCkBAIC04MDksNiArMTY4Nyw4IEBACiAtIElzc3VlICMyNjA2NTogRXhjbHVkZXMgdmVudiBmcm9tIGxpYnJhcnkgd2hlbiBnZW5lcmF0aW5nIGVtYmVkZGFibGUKICAgZGlzdHJvLgogCistIElzc3VlICMyNTAyMjogUmVtb3ZlZCB2ZXJ5IG91dGRhdGVkIFBDL2V4YW1wbGVfbnQvIGRpcmVjdG9yeS4KKwogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCiAKQEAgLTgyNSwxMSArMTcwNSwyMSBAQAogCiAtIElzc3VlICMyNjMxNjogRml4IHZhcmlhYmxlIG5hbWUgdHlwbyBpbiBBcmd1bWVudCBDbGluaWMuCiAKLU1pc2MKLS0tLS0KKy0gSXNzdWUgIzI1NDQwOiBGaXggb3V0cHV0IG9mIHB5dGhvbi1jb25maWcgLS1leHRlbnNpb24tc3VmZml4LgogCi0tIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQotICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorLSBJc3N1ZSAjMjUxNTQ6IFRoZSBweXZlbnYgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mCisgIGBweXRob24zIC1tIHZlbnZgLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjYzMTI6IFN5c3RlbUVycm9yIGlzIG5vdyByYWlzZWQgaW4gYWxsIHByb2dyYW1taW5nIGJ1Z3Mgd2l0aCB1c2luZworICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoKS4gIFJ1bnRpbWVFcnJvciBkaWQgcmFpc2VkIGJlZm9yZSBpbiBzb21lCisgIHByb2dyYW1taW5nIGJ1Z3MuCisKKy0gSXNzdWUgIzI2MTk4OiBWYWx1ZUVycm9yIGlzIG5vdyByYWlzZWQgaW5zdGVhZCBvZiBUeXBlRXJyb3Igb24gYnVmZmVyCisgIG92ZXJmbG93IGluIHBhcnNpbmcgImVzIyIgYW5kICJldCMiIGZvcm1hdCB1bml0cy4gIFN5c3RlbUVycm9yIGlzIG5vdyByYWlzZWQKKyAgaW5zdGVhZCBvZiBUeXBlRXJyb3Igb24gcHJvZ3JhbW1pY2FsIGVycm9yIGluIHBhcnNpbmcgZm9ybWF0IHN0cmluZy4KIAogCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMSBmaW5hbD8KQEAgLTEyNTEsOSArMjE0MSw2IEBACiBEb2N1bWVudGF0aW9uCiAtLS0tLS0tLS0tLS0tCiAKLS0gSXNzdWUgIzIyNTU4OiBBZGQgcmVtYWluaW5nIGRvYyBsaW5rcyB0byBzb3VyY2UgY29kZSBmb3IgUHl0aG9uLWNvZGVkIG1vZHVsZXMuCi0gIFBhdGNoIGJ5IFlvbmkgTGF2aS4KLQogLSBJc3N1ZSAjMTIwNjc6IFJld3JpdGUgQ29tcGFyaXNvbnMgc2VjdGlvbiBpbiB0aGUgRXhwcmVzc2lvbnMgY2hhcHRlciBvZiB0aGUKICAgbGFuZ3VhZ2UgcmVmZXJlbmNlLiBTb21lIG9mIHRoZSBkZXRhaWxzIG9mIGNvbXBhcmluZyBtaXhlZCB0eXBlcyB3ZXJlCiAgIGluY29ycmVjdCBvciBhbWJpZ3VvdXMuIE5vdEltcGxlbWVudGVkIGlzIG9ubHkgcmVsZXZhbnQgYXQgYSBsb3dlciBsZXZlbApAQCAtMTU4MywxMiArMjQ3MCw2IEBACiAKIC0gSXNzdWUgIzI0NjMxOiBGaXhlZCByZWdyZXNzaW9uIGluIHRoZSB0aW1laXQgbW9kdWxlIHdpdGggbXVsdGlsaW5lIHNldHVwLgogCi0tIElzc3VlICMxODYyMjogdW5pdHRlc3QubW9jay5tb2NrX29wZW4oKS5yZXNldF9tb2NrIHdvdWxkIHJlY3Vyc2UgaW5maW5pdGVseS4KLSAgUGF0Y2ggZnJvbSBOaWNvbGEgUGFsdW1ibyBhbmQgTGF1cmVudCBEZSBCdXlzdC4KLQotLSBJc3N1ZSAjMjM2NjE6IHVuaXR0ZXN0Lm1vY2sgc2lkZV9lZmZlY3RzIGNhbiBub3cgYmUgZXhjZXB0aW9ucyBhZ2Fpbi4gVGhpcwotICB3YXMgYSByZWdyZXNzaW9uIHZzIFB5dGhvbiAzLjQuIFBhdGNoIGZyb20gSWduYWNpbyBSb3NzaQotCiAtIElzc3VlICMyNDYwODogY2h1bmsuQ2h1bmsucmVhZCgpIG5vdyBhbHdheXMgcmV0dXJucyBieXRlcywgbm90IHN0ci4KIAogLSBJc3N1ZSAjMTg2ODQ6IEZpeGVkIHJlYWRpbmcgb3V0IG9mIHRoZSBidWZmZXIgaW4gdGhlIHJlIG1vZHVsZS4KQEAgLTE1OTksNiArMjQ4MCw5IEBACiAtIElzc3VlICMxNTAxNDogU01UUC5hdXRoKCkgYW5kIFNNVFAubG9naW4oKSBub3cgc3VwcG9ydCBSRkMgNDk1NCdzIG9wdGlvbmFsCiAgIGluaXRpYWwtcmVzcG9uc2UgYXJndW1lbnQgdG8gdGhlIFNNVFAgQVVUSCBjb21tYW5kLgogCistIElzc3VlICM2NTQ5OiBSZW1vdmUgaHlwaGVuIGZyb20gdHRrLlN0eWxlKCkuZWxlbWVudCBvcHRpb25zLiAgT25seSByZXR1cm4gcmVzdWx0CisgIGZyb20gdHRrLlN0eWxlKCkuY29uZmlndXJlIGlmIGEgcmVzdWx0IHdhcyBnZW5lcmF0ZWQgb3IgYSBxdWVyeSBzdWJtaXR0ZWQuCisKIC0gSXNzdWUgIzI0NjY5OiBGaXggaW5zcGVjdC5nZXRzb3VyY2UoKSBmb3IgJ2FzeW5jIGRlZicgZnVuY3Rpb25zLgogICBQYXRjaCBieSBLYWkgR3JvbmVyLgogCkBAIC0xNjEwLDcgKzI0OTQsNiBAQAogLSBJc3N1ZSAjMjQ2MDM6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyBhbmQgT1MgWCAxMC41IGluc3RhbGxlciB0byB1c2UgT3BlblNTTAogICAxLjAuMmQuCiAKLQogV2hhdCdzIE5ldyBpbiBQeXRob24gMy41LjAgYmV0YSAzPwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNzcxLDYgKzI2NTQsOSBAQAogLSBJc3N1ZSAjMjQyNjg6IFBFUCA0ODk6IE11bHRpLXBoYXNlIGV4dGVuc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24uCiAgIFBhdGNoIGJ5IFBldHIgVmlrdG9yaW4uCiAKKy0gSXNzdWUgIzIzMzU5OiBPcHRpbWl6ZSBzZXQgb2JqZWN0IGludGVybmFscyBieSBzcGVjaWFsaXppbmcgdGhlCisgIGhhc2ggdGFibGUgc2VhcmNoIGludG8gYSBsb29rdXAgZnVuY3Rpb24gYW5kIGFuIGluc2VydCBmdW5jdGlvbi4KKwogLSBJc3N1ZSAjMjM5NTU6IEFkZCBweXZlbnYuY2ZnIG9wdGlvbiB0byBzdXBwcmVzcyByZWdpc3RyeS9lbnZpcm9ubWVudAogICBsb29rdXAgZm9yIGdlbmVyYXRpbmcgc3lzLnBhdGggb24gV2luZG93cy4KIApAQCAtMjMxMyw4ICszMTk5LDggQEAKICAgd3JpdGVyIGZhaWxlZCBpbiBCdWZmZXJlZFJXUGFpci5jbG9zZSgpLgogCiAtIElzc3VlICMyMzYyMjogVW5rbm93biBlc2NhcGVzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBjb25zaXN0IG9mIGBgJ1wnYGAKLSAgYW5kIEFTQ0lJIGxldHRlciBub3cgcmFpc2UgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGFuZCB3aWxsIGJlIGZvcmJpZGRlbiBpbgotICBQeXRob24gMy42LgorICBhbmQgYW4gQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuCisgIGluIFB5dGhvbiAzLjYuCiAKIC0gSXNzdWUgIzIzNjcxOiBzdHJpbmcuVGVtcGxhdGUgbm93IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSAic2VsZiIgcGFyYW1ldGVyIGFzCiAgIGEga2V5d29yZCBhcmd1bWVudC4gIHN0cmluZy5Gb3JtYXR0ZXIgbm93IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSAic2VsZiIgYW5kCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRS52YWxncmluZCBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCmluZGV4IGI1YTlhMzIuLjkwOGYxMzcgMTAwNjQ0Ci0tLSBhL01pc2MvUkVBRE1FLnZhbGdyaW5kCisrKyBiL01pc2MvUkVBRE1FLnZhbGdyaW5kCkBAIC0yLDYgKzIsOSBAQAogUHl0aG9uLiAgVmFsZ3JpbmQgaXMgdXNlZCBwZXJpb2RpY2FsbHkgYnkgUHl0aG9uIGRldmVsb3BlcnMgdG8gdHJ5CiB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIG1lbW9yeSBsZWFrcyBvciBpbnZhbGlkIG1lbW9yeSByZWFkcy93cml0ZXMuCiAKK1VQREFURTogUHl0aG9uIDMuNiBub3cgc3VwcG9ydHMgUFlUSE9OTUFMTE9DPW1hbGxvYyBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGljaAorY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHVzYWdlIG9mIHRoZSBtYWxsb2MoKSBhbGxvY2F0b3Igb2YgdGhlIEMgbGlicmFyeS4KKwogSWYgeW91IGRvbid0IHdhbnQgdG8gcmVhZCBhYm91dCB0aGUgZGV0YWlscyBvZiB1c2luZyBWYWxncmluZCwgdGhlcmUKIGFyZSBzdGlsbCB0d28gdGhpbmdzIHlvdSBtdXN0IGRvIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5ncy4gIEZpcnN0LAogeW91IG11c3QgdXNlIGEgc3VwcHJlc3Npb25zIGZpbGUuICBPbmUgaXMgc3VwcGxpZWQgaW4KZGlmZiAtLWdpdCBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CmluZGV4IDMwMDQxNzQuLjRiNjczZmQgMTAwNjQ0Ci0tLSBhL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKKysrIGIvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dApAQCAtNjUsOSArNjUsOSBAQAogICAgIHNpbXBseSBieSB2aXJ0dWUgb2YgYmVpbmcgaW4gdGhlIGxpc3QuCiAKIGVudnZhciBQWVRIT05EVU1QUkVGUwotICAgIElmIHRoaXMgZW52dmFyIGV4aXN0cywgUHlfRmluYWxpemUoKSBhcnJhbmdlcyB0byBwcmludCBhIGxpc3Qgb2YgYWxsCisgICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBQeV9GaW5hbGl6ZUV4KCkgYXJyYW5nZXMgdG8gcHJpbnQgYSBsaXN0IG9mIGFsbAogICAgIHN0aWxsLWxpdmUgaGVhcCBvYmplY3RzLiAgVGhpcyBpcyBwcmludGVkIHR3aWNlLCBpbiBkaWZmZXJlbnQgZm9ybWF0cywKLSAgICBiZWZvcmUgYW5kIGFmdGVyIFB5X0ZpbmFsaXplIGhhcyBjbGVhbmVkIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuIGNsZWFuIHVwLiAgVGhlCisgICAgYmVmb3JlIGFuZCBhZnRlciBQeV9GaW5hbGl6ZUV4IGhhcyBjbGVhbmVkIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuIGNsZWFuIHVwLiAgVGhlCiAgICAgZmlyc3Qgb3V0cHV0IGJsb2NrIHByb2R1Y2VzIHRoZSByZXByKCkgb2YgZWFjaCBvYmplY3Qgc28gaXMgbW9yZQogICAgIGluZm9ybWF0aXZlOyBob3dldmVyLCBhIGxvdCBvZiBzdHVmZiBkZXN0aW5lZCB0byBkaWUgaXMgc3RpbGwgYWxpdmUgdGhlbi4KICAgICBUaGUgc2Vjb25kIG91dHB1dCBibG9jayBpcyBtdWNoIGhhcmRlciB0byB3b3JrIHdpdGggKHJlcHIoKSBjYW4ndCBiZSBpbnZva2VkCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAogZW52dmFyIFBZVEhPTk1BTExPQ1NUQVRTCiAgICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBhIHJlcG9ydCBvZiBweW1hbGxvYyBzdW1tYXJ5IHN0YXRpc3RpY3MgaXMgcHJpbnRlZCB0bwotICAgIHN0ZGVyciB3aGVuZXZlciBhIG5ldyBhcmVuYSBpcyBhbGxvY2F0ZWQsIGFuZCBhbHNvIGJ5IFB5X0ZpbmFsaXplKCkuCisgICAgc3RkZXJyIHdoZW5ldmVyIGEgbmV3IGFyZW5hIGlzIGFsbG9jYXRlZCwgYW5kIGFsc28gYnkgUHlfRmluYWxpemVFeCgpLgogCiBDaGFuZ2VkIGluIDIuNTogIFRoZSBudW1iZXIgb2YgZXh0cmEgYnl0ZXMgYWxsb2NhdGVkIGlzIDQqc2l6ZW9mKHNpemVfdCkuCiBCZWZvcmUgaXQgd2FzIDE2IG9uIGFsbCBib3hlcywgcmVmbGVjdGluZyB0aGF0IFB5dGhvbiBjb3VsZG4ndCBtYWtlIHVzZSBvZgpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgICovCiAgICAgaW50IHRwX21heGFsbG9jOwogCi1BbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gY29kZSBrZWVwcyB0aGVzZSBjb3VudHMgdXAgdG8gZGF0ZS4gIFB5X0ZpbmFsaXplKCkKK0FsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBjb2RlIGtlZXBzIHRoZXNlIGNvdW50cyB1cCB0byBkYXRlLiAgUHlfRmluYWxpemVFeCgpCiBkaXNwbGF5cyBhIHN1bW1hcnkgb2YgdGhlIGluZm8gcmV0dXJuZWQgYnkgc3lzLmdldGNvdW50cygpIChzZWUgYmVsb3cpLCBhbG9uZwogd2l0aCBhc3NvcnRlZCBvdGhlciBzcGVjaWFsIGFsbG9jYXRpb24gY291bnRzIChsaWtlIHRoZSBudW1iZXIgb2YgdHVwbGUKIGFsbG9jYXRpb25zIHNhdGlzZmllZCBieSBhIHR1cGxlIGZyZWUtbGlzdCwgdGhlIG51bWJlciBvZiAxLWNoYXJhY3RlciBzdHJpbmdzCmRpZmYgLS1naXQgYS9NaXNjL2NvdmVyaXR5X21vZGVsLmMgYi9NaXNjL2NvdmVyaXR5X21vZGVsLmMKaW5kZXggNDkzZTdjMS4uZjc3NmQ3NiAxMDA2NDQKLS0tIGEvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCisrKyBiL01pc2MvY292ZXJpdHlfbW9kZWwuYwpAQCAtOTQsNyArOTQsNyBAQAogfQogCiAvKiBQYXJzZXIvcGdlbm1haW4uYyAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSkKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgZ3JhbW1hciAqZzsKICAgICBfX2NvdmVyaXR5X3RhaW50ZWRfZGF0YV9zaW5rX18oZmlsZW5hbWUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fYmlzZWN0bW9kdWxlLmMgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwppbmRleCAwMmI1NWQxLi4yMmRkYmYyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYwpAQCAtMTIsNyArMTIsOCBAQAogaW50ZXJuYWxfYmlzZWN0X3JpZ2h0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CkBAIC0xMTUsNyArMTE2LDggQEAKIGludGVybmFsX2Jpc2VjdF9sZWZ0KFB5T2JqZWN0ICpsaXN0LCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBsbywgUHlfc3NpemVfdCBoaSkKIHsKICAgICBQeU9iamVjdCAqbGl0ZW07Ci0gICAgUHlfc3NpemVfdCBtaWQsIHJlczsKKyAgICBQeV9zc2l6ZV90IG1pZDsKKyAgICBpbnQgcmVzOwogCiAgICAgaWYgKGxvIDwgMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImxvIG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19iejJtb2R1bGUuYyBiL01vZHVsZXMvX2J6Mm1vZHVsZS5jCmluZGV4IGUzZTBlYjEuLmY0MDc3ZmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2J6Mm1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2J6Mm1vZHVsZS5jCkBAIC01OTIsNyArNTkyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9iejIuQloyRGVjb21wcmVzc29yLmRlY29tcHJlc3MKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQloyRGVjb21wcmVzc29yICoiKQogICAgIGRhdGE6IFB5X2J1ZmZlcgogICAgIG1heF9sZW5ndGg6IFB5X3NzaXplX3Q9LTEKIApAQCAtNjE1LDcgKzYxNCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2J6Ml9CWjJEZWNvbXByZXNzb3JfZGVjb21wcmVzc19pbXBsKEJaMkRlY29tcHJlc3NvciAqc2VsZiwgUHlfYnVmZmVyICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yM2U0MTA0NWRlYjI0MGEzIGlucHV0PTk1NThiNDI0YzhiMDA1MTZdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yM2U0MTA0NWRlYjI0MGEzIGlucHV0PTUyZTFmZmM2NmE4ZWE2MjRdKi8KIHsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwppbmRleCA3NTc1NzczLi42MTFjYTgyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwpAQCAtMjAsMTAgKzIwLDYgQEAKICAgICAgPGVuY29kaW5nPl9kZWNvZGUoY2hhcl9idWZmZXJfb2JqWyxlcnJvcnM9J3N0cmljdCddKSAtPgogICAgICAgICAoVW5pY29kZSBvYmplY3QsIGJ5dGVzIGNvbnN1bWVkKQogCi0gICA8ZW5jb2Rpbmc+X2VuY29kZSgpIGludGVyZmFjZXMgYWxzbyBhY2NlcHQgbm9uLVVuaWNvZGUgb2JqZWN0IGFzCi0gICBpbnB1dC4gVGhlIG9iamVjdHMgYXJlIHRoZW4gY29udmVydGVkIHRvIFVuaWNvZGUgdXNpbmcKLSAgIFB5VW5pY29kZV9Gcm9tT2JqZWN0KCkgcHJpb3IgdG8gYXBwbHlpbmcgdGhlIGNvbnZlcnNpb24uCi0KICAgIFRoZXNlIDxlbmNvZGluZz5zIGFyZSBhdmFpbGFibGU6IHV0Zl84LCB1bmljb2RlX2VzY2FwZSwKICAgIHJhd191bmljb2RlX2VzY2FwZSwgdW5pY29kZV9pbnRlcm5hbCwgbGF0aW5fMSwgYXNjaWkgKDctYml0KSwKICAgIG1iY3MgKG9uIHdpbjMyKS4KQEAgLTcxOCw3ICs3MTQsNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl83X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtNzI2LDI0ICs3MjIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl83X2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hN2FjY2M0OTZhMzJiNzU5IGlucHV0PWZkOTFhNzhmMTAzYjA0MjFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hN2FjY2M0OTZhMzJiNzU5IGlucHV0PWQxYTQ3NTc5ZTc5Y2JlMTVdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEY3KHN0ciwgMCwgMCwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGNyhzdHIsIDAsIDAsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl84X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtNzUxLDE5ICs3MzgsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl84X2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYzgzMWQ4MGU3YWVkZWRlIGlucHV0PTJjMjJkNDA1MzJmMDcxZjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lYzgzMWQ4MGU3YWVkZWRlIGlucHV0PTQyZTNiYTczYzQzOTJlZWZdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhzdHIsICJ1dGYtOCIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzVVRGOFN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBieXRlb3JkZXIgcGFyYW1ldGVyIG9mIHRoZQpAQCAtNzc1LDcgKzc1Myw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgYnl0ZW9yZGVyOiBpbnQgPSAwCiAgICAgLwpAQCAtNzg0LDI0ICs3NjIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgYnl0ZW9yZGVyKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkzYWM1OGU5NjBhOWVlNGQgaW5wdXQ9MzkzNWE0ODliMmQ1Mzg1ZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkzYWM1OGU5NjBhOWVlNGQgaW5wdXQ9ZmY0NjQxNmIwNGVkYjk0NF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2xlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODA5LDI0ICs3NzgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9sZV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQyMmJlZGI4ZGEzNGZiNjYgaW5wdXQ9YmMyN2RmMDVkMWQyMGRmZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQyMmJlZGI4ZGEzNGZiNjYgaW5wdXQ9Y2IzODU0NTVlYThmMmZlMF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCAtMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTgzNCwxOSArNzk0LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMTZfYmVfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zYWE3ZWU5NTAyYWNkZDc3IGlucHV0PTVhNjlkNDExMjc2MzQ2MmJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zYWE3ZWU5NTAyYWNkZDc3IGlucHV0PTkxMTk5OTcwNjZiZGFlZmRdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgKzEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYxNihzdHIsIGVycm9ycywgKzEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLyogVGhpcyB2ZXJzaW9uIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgYnl0ZW9yZGVyIHBhcmFtZXRlciBvZiB0aGUKQEAgLTg1OCw3ICs4MDksNyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIGJ5dGVvcmRlcjogaW50ID0gMAogICAgIC8KQEAgLTg2NywyNCArODE4LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywgaW50IGJ5dGVvcmRlcikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zZTdkNWEwMDNiMDJiYWVkIGlucHV0PTQzNGExZWZhNDkyYjhkNThdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zZTdkNWEwMDNiMDJiYWVkIGlucHV0PWM1ZTc3ZGE4MmZiZTVjMmFdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTg5MiwyNCArODM0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfbGVfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZGRhNjQxY2QzM2RiZmMyIGlucHV0PWRmYTJkN2RjNzhiOTk0MjJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZGRhNjQxY2QzM2RiZmMyIGlucHV0PTk5OTNiMjVmZTA4Nzc4NDhdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgLTEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMzJfYmVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05MTcsMjQgKzg1MCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzMyX2JlX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Y2NjYThiNDRkOTFhN2M3YSBpbnB1dD00NTk1NjE3YjE4MTY5MDAyXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Y2NjYThiNDRkOTFhN2M3YSBpbnB1dD1kM2UwY2NhYTAyOTIwNDMxXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsICsxKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMzIoc3RyLCBlcnJvcnMsICsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05NDIsMjQgKzg2NiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM4OWYyM2QyYjhmOGQ4MGIgaW5wdXQ9ODI3MzUwNmYxNDA3NjkxMl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM4OWYyM2QyYjhmOGQ4MGIgaW5wdXQ9NjVkOWVlZmNhNjViNDU1YV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTk2NywyNCArODgyLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZWM0ZTM5ZDZlYzM3YTYyIGlucHV0PTE4MTc1NWQ1ZGZhY2VmM2NdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZWM0ZTM5ZDZlYzM3YTYyIGlucHV0PTVhYTMzZTRhMTMzMzkxYWJdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhzdHIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5sYXRpbl8xX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTkyLDI0ICs4OTgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2xhdGluXzFfZW5jb2RlX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWNmMDBlYjhlNDhjODg5YyBpbnB1dD1mMDNmNmRjZjFkODRiZWU0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWNmMDBlYjhlNDhjODg5YyBpbnB1dD0zMGIxMWM5ZTQ5YTY1MTUwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcoc3RyLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmFzY2lpX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTAxNywyNCArOTE0LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19hc2NpaV9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTlkMThmYzZiNmI5MWNmYiBpbnB1dD1kODdlMjVhMTBhNTkzZmVlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTlkMThmYzZiNmI5MWNmYiBpbnB1dD04NDNhMWQyNjhlNmRmYThlXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcoc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5jaGFybWFwX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgbWFwcGluZzogb2JqZWN0ID0gTlVMTAogICAgIC8KQEAgLTEwNDMsMjIgKzkzMSwxMyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfY2hhcm1hcF9lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywgUHlPYmplY3QgKm1hcHBpbmcpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTRjYTQyYjgzODUzYzY0MyBpbnB1dD04NWY0MTcyNjYxZThkYWQ5XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTRjYTQyYjgzODUzYzY0MyBpbnB1dD0wNzUyY2RlMDdhNmQ2ZDAwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KICAgICBpZiAobWFwcGluZyA9PSBQeV9Ob25lKQogICAgICAgICBtYXBwaW5nID0gTlVMTDsKIAotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0xMDc4LDcgKzk1Nyw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MubWJjc19lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTEwODYsMjUgKzk2NSwxNiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfbWJjc19lbmNvZGVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMWEwMTNiYzY4Nzk4YmQ3IGlucHV0PTY1YzA5ZWUxZTQyMDMyNjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMWEwMTNiYzY4Nzk4YmQ3IGlucHV0PWRlNDcxZTA4MTU5NDc1NTNdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX0FDUCwgc3RyLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKENQX0FDUCwgc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy5jb2RlX3BhZ2VfZW5jb2RlCiAgICAgY29kZV9wYWdlOiBpbnQKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTExMTIsMjEgKzk4MiwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfY29kZV9wYWdlX2VuY29kZV9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIGludCBjb2RlX3BhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RyLCBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2I0MDY2MThkYmZiY2UyNSBpbnB1dD1jODU2MmVjNDYwYzJlMzA5XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2I0MDY2MThkYmZiY2UyNSBpbnB1dD03ODY0MjFhZTYxN2Q2ODBiXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9FbmNvZGVDb2RlUGFnZShjb2RlX3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKGNvZGVfcGFnZSwgc3RyLCBlcnJvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogI2VuZGlmIC8qIEhBVkVfTUJDUyAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKaW5kZXggMTBmYmNmZS4uMzQxMGRmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCkBAIC04MSw3ICs4MSw3IEBACiAgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXg7ICAgICAgIC8qIDAgPD0gbGVmdGluZGV4IDwgQkxPQ0tMRU4gKi8KICAgICBQeV9zc2l6ZV90IHJpZ2h0aW5kZXg7ICAgICAgLyogMCA8PSByaWdodGluZGV4IDwgQkxPQ0tMRU4gKi8KICAgICBzaXplX3Qgc3RhdGU7ICAgICAgICAgICAgICAgLyogaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGluZGljZXMgbW92ZSAqLwotICAgIFB5X3NzaXplX3QgbWF4bGVuOworICAgIFB5X3NzaXplX3QgbWF4bGVuOyAgICAgICAgICAvKiBtYXhsZW4gaXMgLTEgZm9yIHVuYm91bmRlZCBkZXF1ZXMgKi8KICAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CiB9IGRlcXVlb2JqZWN0OwogCkBAIC0xMDgsMjkgKzEwOCwxOCBAQAogI2RlZmluZSBDSEVDS19OT1RfRU5EKGxpbmspCiAjZW5kaWYKIAotLyogVG8gcHJldmVudCBsZW4gZnJvbSBvdmVyZmxvd2luZyBQWV9TU0laRV9UX01BWCwgd2UgcmVmdXNlIHRvCi0gICBhbGxvY2F0ZSBuZXcgYmxvY2tzIGlmIHRoZSBjdXJyZW50IGxlbiBpcyBuZWFyaW5nIG92ZXJmbG93LgotKi8KLQotI2RlZmluZSBNQVhfREVRVUVfTEVOIChQWV9TU0laRV9UX01BWCAtIDMqQkxPQ0tMRU4pCi0KIC8qIEEgc2ltcGxlIGZyZWVsaXN0aW5nIHNjaGVtZSBpcyB1c2VkIHRvIG1pbmltaXplIGNhbGxzIHRvIHRoZSBtZW1vcnkKICAgIGFsbG9jYXRvci4gIEl0IGFjY29tbW9kYXRlcyBjb21tb24gdXNlIGNhc2VzIHdoZXJlIG5ldyBibG9ja3MgYXJlIGJlaW5nCiAgICBhZGRlZCBhdCBhYm91dCB0aGUgc2FtZSByYXRlIGFzIG9sZCBibG9ja3MgYXJlIGJlaW5nIGZyZWVkLgogICovCiAKLSNkZWZpbmUgTUFYRlJFRUJMT0NLUyAxMAorI2RlZmluZSBNQVhGUkVFQkxPQ0tTIDE2CiBzdGF0aWMgUHlfc3NpemVfdCBudW1mcmVlYmxvY2tzID0gMDsKIHN0YXRpYyBibG9jayAqZnJlZWJsb2Nrc1tNQVhGUkVFQkxPQ0tTXTsKIAogc3RhdGljIGJsb2NrICoKLW5ld2Jsb2NrKFB5X3NzaXplX3QgbGVuKSB7CituZXdibG9jayh2b2lkKSB7CiAgICAgYmxvY2sgKmI7Ci0gICAgaWYgKGxlbiA+PSBNQVhfREVRVUVfTEVOKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBhZGQgbW9yZSBibG9ja3MgdG8gdGhlIGRlcXVlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KICAgICBpZiAobnVtZnJlZWJsb2NrcykgewogICAgICAgICBudW1mcmVlYmxvY2tzLS07CiAgICAgICAgIHJldHVybiBmcmVlYmxvY2tzW251bWZyZWVibG9ja3NdOwpAQCAtMTU0LDEyICsxNDMsNiBAQAogICAgIH0KIH0KIAotLyogWFhYIFRvZG86Ci0gICBJZiBhbGlnbmVkIG1lbW9yeSBhbGxvY2F0aW9ucyBiZWNvbWUgYXZhaWxhYmxlLCBtYWtlIHRoZQotICAgZGVxdWUgb2JqZWN0IDY0IGJ5dGUgYWxpZ25lZCBzbyB0aGF0IGFsbCBvZiB0aGUgZmllbGRzCi0gICBjYW4gYmUgcmV0cmlldmVkIG9yIHVwZGF0ZWQgaW4gYSBzaW5nbGUgY2FjaGUgbGluZS4KLSovCi0KIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC0xNzEsNyArMTU0LDcgQEAKICAgICBpZiAoZGVxdWUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBiID0gbmV3YmxvY2soMCk7CisgICAgYiA9IG5ld2Jsb2NrKCk7CiAgICAgaWYgKGIgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoZGVxdWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIwNyw3ICsxOTAsNyBAQAogICAgIFB5X1NJWkUoZGVxdWUpLS07CiAgICAgZGVxdWUtPnN0YXRlKys7CiAKLSAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPCAwKSB7CiAgICAgICAgIGlmIChQeV9TSVpFKGRlcXVlKSkgewogICAgICAgICAgICAgcHJldmJsb2NrID0gZGVxdWUtPnJpZ2h0YmxvY2stPmxlZnRsaW5rOwogICAgICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgIT0gZGVxdWUtPnJpZ2h0YmxvY2spOwpAQCAtMjcwLDQyICsyNTMsMjQgQEAKIC8qIFRoZSBkZXF1ZSdzIHNpemUgbGltaXQgaXMgZC5tYXhsZW4uICBUaGUgbGltaXQgY2FuIGJlIHplcm8gb3IgcG9zaXRpdmUuCiAgKiBJZiB0aGVyZSBpcyBubyBsaW1pdCwgdGhlbiBkLm1heGxlbiA9PSAtMS4KICAqCi0gKiBBZnRlciBhbiBpdGVtIGlzIGFkZGVkIHRvIGEgZGVxdWUsIHdlIGNoZWNrIHRvIHNlZSBpZiB0aGUgc2l6ZSBoYXMgZ3Jvd24gcGFzdAotICogdGhlIGxpbWl0LiBJZiBpdCBoYXMsIHdlIGdldCB0aGUgc2l6ZSBiYWNrIGRvd24gdG8gdGhlIGxpbWl0IGJ5IHBvcHBpbmcgYW4KLSAqIGl0ZW0gb2ZmIG9mIHRoZSBvcHBvc2l0ZSBlbmQuICBUaGUgbWV0aG9kcyB0aGF0IGNhbiB0cmlnZ2VyIHRoaXMgYXJlIGFwcGVuZCgpLAotICogYXBwZW5kbGVmdCgpLCBleHRlbmQoKSwgYW5kIGV4dGVuZGxlZnQoKS4KKyAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcworICogZ3Jvd24gcGFzdCB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQKKyAqIGJ5IHBvcHBpbmcgYW4gaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuCisgKiB0cmlnZ2VyIHRoaXMgYXJlIGFwcGVuZCgpLCBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgorICoKKyAqIFRoZSBtYWNybyB0byBjaGVjayB3aGV0aGVyIGEgZGVxdWUgbmVlZHMgdG8gYmUgdHJpbW1lZCB1c2VzIGEgc2luZ2xlCisgKiB1bnNpZ25lZCB0ZXN0IHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIDAgPD0gbWF4bGVuIDwgUHlfU0laRShkZXF1ZSkuCiAgKi8KIAotc3RhdGljIHZvaWQKLWRlcXVlX3RyaW1fcmlnaHQoZGVxdWVvYmplY3QgKmRlcXVlKQotewotICAgIGlmIChkZXF1ZS0+bWF4bGVuICE9IC0xICYmIFB5X1NJWkUoZGVxdWUpID4gZGVxdWUtPm1heGxlbikgewotICAgICAgICBQeU9iamVjdCAqcnYgPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOwotICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCk7Ci0gICAgICAgIGFzc2VydChQeV9TSVpFKGRlcXVlKSA8PSBkZXF1ZS0+bWF4bGVuKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICB9Ci19CisjZGVmaW5lIE5FRURTX1RSSU0oZGVxdWUsIG1heGxlbikgKChzaXplX3QpKG1heGxlbikgPCAoc2l6ZV90KShQeV9TSVpFKGRlcXVlKSkpCiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV90cmltX2xlZnQoZGVxdWVvYmplY3QgKmRlcXVlKQorc3RhdGljIGludAorZGVxdWVfYXBwZW5kX2ludGVybmFsKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0sIFB5X3NzaXplX3QgbWF4bGVuKQogewotICAgIGlmIChkZXF1ZS0+bWF4bGVuICE9IC0xICYmIFB5X1NJWkUoZGVxdWUpID4gZGVxdWUtPm1heGxlbikgewotICAgICAgICBQeU9iamVjdCAqcnYgPSBkZXF1ZV9wb3BsZWZ0KGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KHJ2ICE9IE5VTEwpOwotICAgICAgICBhc3NlcnQoUHlfU0laRShkZXF1ZSkgPD0gZGVxdWUtPm1heGxlbik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgfQotfQotCi1zdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfYXBwZW5kKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCi17Ci0gICAgZGVxdWUtPnN0YXRlKys7CiAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgewotICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKKyAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jaygpOwogICAgICAgICBpZiAoYiA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIGItPmxlZnRsaW5rID0gZGVxdWUtPnJpZ2h0YmxvY2s7CiAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rKTsKICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CkBAIC0zMTMsMjQgKzI3OCwzNiBAQAogICAgICAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOwogICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOwogICAgIH0KLSAgICBQeV9JTkNSRUYoaXRlbSk7CiAgICAgUHlfU0laRShkZXF1ZSkrKzsKICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOwogICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgZGVxdWVfdHJpbV9sZWZ0KGRlcXVlKTsKKyAgICBpZiAoTkVFRFNfVFJJTShkZXF1ZSwgbWF4bGVuKSkgeworICAgICAgICBQeU9iamVjdCAqb2xkaXRlbSA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfYXBwZW5kKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCit7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGlmIChkZXF1ZV9hcHBlbmRfaW50ZXJuYWwoZGVxdWUsIGl0ZW0sIGRlcXVlLT5tYXhsZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihhcHBlbmRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlcXVlLiIpOwogCi1zdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfYXBwZW5kbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQorc3RhdGljIGludAorZGVxdWVfYXBwZW5kbGVmdF9pbnRlcm5hbChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IG1heGxlbikKIHsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKICAgICBpZiAoZGVxdWUtPmxlZnRpbmRleCA9PSAwKSB7Ci0gICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgIGlmIChiID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYi0+cmlnaHRsaW5rID0gZGVxdWUtPmxlZnRibG9jazsKICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rKTsKICAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmsgPSBiOwpAQCAtMzM4LDM3ICszMTUsNjUgQEAKICAgICAgICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwogICAgICAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQkxPQ0tMRU47CiAgICAgfQotICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICBQeV9TSVpFKGRlcXVlKSsrOwogICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX3JpZ2h0KGRlcXVlKTsKKyAgICBpZiAoTkVFRFNfVFJJTShkZXF1ZSwgZGVxdWUtPm1heGxlbikpIHsKKyAgICAgICAgUHlPYmplY3QgKm9sZGl0ZW0gPSBkZXF1ZV9wb3AoZGVxdWUsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYob2xkaXRlbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVxdWUtPnN0YXRlKys7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfYXBwZW5kbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVtKQoreworICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICBpZiAoZGVxdWVfYXBwZW5kbGVmdF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgZGVxdWUtPm1heGxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZGxlZnRfZG9jLCAiQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CiAKK3N0YXRpYyBQeU9iamVjdCoKK2ZpbmFsaXplX2l0ZXJhdG9yKFB5T2JqZWN0ICppdCkKK3sKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CiAKIC8qIFJ1biBhbiBpdGVyYXRvciB0byBleGhhdXN0aW9uLiAgU2hvcnRjdXQgZm9yCiAgICB0aGUgZXh0ZW5kL2V4dGVuZGxlZnQgbWV0aG9kcyB3aGVuIG1heGxlbiA9PSAwLiAqLwogc3RhdGljIFB5T2JqZWN0KgogY29uc3VtZV9pdGVyYXRvcihQeU9iamVjdCAqaXQpCiB7CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOwogICAgIFB5T2JqZWN0ICppdGVtOwogCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgfQotICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9leHRlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlcmFibGUpCiB7CiAgICAgUHlPYmplY3QgKml0LCAqaXRlbTsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CisgICAgUHlfc3NpemVfdCBtYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwogCiAgICAgLyogSGFuZGxlIGNhc2Ugd2hlcmUgaWQoZGVxdWUpID09IGlkKGl0ZXJhYmxlKSAqLwogICAgIGlmICgoUHlPYmplY3QgKilkZXF1ZSA9PSBpdGVyYWJsZSkgewpAQCAtMzgxLDYgKzM4NiwxMyBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7CisgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKG1heGxlbiA9PSAwKQorICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7CisKICAgICAvKiBTcGFjZSBzYXZpbmcgaGV1cmlzdGljLiAgU3RhcnQgZmlsbGluZyBmcm9tIHRoZSBsZWZ0ICovCiAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApIHsKICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwpAQCAtMzg5LDQwICs0MDEsMTUgQEAKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAwOwogICAgIH0KIAotICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcihpdGVyYWJsZSk7Ci0gICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOwotCi0gICAgd2hpbGUgKChpdGVtID0gUHlJdGVyX05leHQoaXQpKSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlcXVlLT5zdGF0ZSsrOwotICAgICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7Ci0gICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKFB5X1NJWkUoZGVxdWUpKTsKLSAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGItPmxlZnRsaW5rID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0gICAgICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKLSAgICAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgbWF4bGVuKSA8IDApIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBQeV9TSVpFKGRlcXVlKSsrOwotICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOwotICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOwotICAgICAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOwogICAgIH0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gZmluYWxpemVfaXRlcmF0b3IoaXQpOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kX2RvYywKQEAgLTQzMiw2ICs0MTksOCBAQAogZGVxdWVfZXh0ZW5kbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeV9zc2l6ZV90IG1heGxlbiA9IGRlcXVlLT5tYXhsZW47CiAKICAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCiAgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CkBAIC00NDQsNiArNDMzLDEzIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobWF4bGVuID09IDApCisgICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKKwogICAgIC8qIFNwYWNlIHNhdmluZyBoZXVyaXN0aWMuICBTdGFydCBmaWxsaW5nIGZyb20gdGhlIHJpZ2h0ICovCiAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApIHsKICAgICAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0YmxvY2sgPT0gZGVxdWUtPnJpZ2h0YmxvY2spOwpAQCAtNDUyLDQwICs0NDgsMTUgQEAKICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBCTE9DS0xFTiAtIDI7CiAgICAgfQogCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7Ci0KLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgZGVxdWUtPnN0YXRlKys7Ci0gICAgICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLSAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOwotICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYi0+cmlnaHRsaW5rID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayk7Ci0gICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7Ci0gICAgICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLSAgICAgICAgICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CisgICAgICAgIGlmIChkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlLCBpdGVtLCBtYXhsZW4pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5X1NJWkUoZGVxdWUpKys7Ci0gICAgICAgIGRlcXVlLT5sZWZ0aW5kZXgtLTsKLSAgICAgICAgZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIGRlcXVlX3RyaW1fcmlnaHQoZGVxdWUpOwogICAgIH0KLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICByZXR1cm4gZmluYWxpemVfaXRlcmF0b3IoaXQpOwogfQogCiBQeURvY19TVFJWQVIoZXh0ZW5kbGVmdF9kb2MsCkBAIC01MDQsNyArNDc1LDQwIEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogfQogCi1zdGF0aWMgUHlPYmplY3QgKmRlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKTsKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9jb3B5KFB5T2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBkZXF1ZW9iamVjdCAqb2xkX2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWU7CisgICAgaWYgKFB5X1RZUEUoZGVxdWUpID09ICZkZXF1ZV90eXBlKSB7CisgICAgICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7CisgICAgICAgIFB5T2JqZWN0ICpydjsKKworICAgICAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9uZXcoJmRlcXVlX3R5cGUsIChQeU9iamVjdCAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwpOworICAgICAgICBpZiAobmV3X2RlcXVlID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3X2RlcXVlLT5tYXhsZW4gPSBvbGRfZGVxdWUtPm1heGxlbjsKKyAgICAgICAgLyogRmFzdCBwYXRoIGZvciB0aGUgZGVxdWVfcmVwZWF0KCkgY29tbW9uIGNhc2Ugd2hlcmUgbGVuKGRlcXVlKSA9PSAxICovCisgICAgICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAxKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IG9sZF9kZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW29sZF9kZXF1ZS0+bGVmdGluZGV4XTsKKyAgICAgICAgICAgIHJ2ID0gZGVxdWVfYXBwZW5kKG5ld19kZXF1ZSwgaXRlbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydiA9IGRlcXVlX2V4dGVuZChuZXdfZGVxdWUsIGRlcXVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdfZGVxdWU7CisgICAgICAgIH0KKyAgICAgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAob2xkX2RlcXVlLT5tYXhsZW4gPCAwKQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPIiwgZGVxdWUsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiT2kiLAorICAgICAgICAgICAgZGVxdWUsIG9sZF9kZXF1ZS0+bWF4bGVuLCBOVUxMKTsKK30KKworUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9jb25jYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqb3RoZXIpCkBAIC01MzQsMzggKzUzOCwxMDIgQEAKICAgICByZXR1cm4gbmV3X2RlcXVlOwogfQogCi1zdGF0aWMgdm9pZCBkZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpOworc3RhdGljIHZvaWQKK2RlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSkKK3sKKyAgICBibG9jayAqYjsKKyAgICBibG9jayAqcHJldmJsb2NrOworICAgIGJsb2NrICpsZWZ0YmxvY2s7CisgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXg7CisgICAgUHlfc3NpemVfdCBuLCBtOworICAgIFB5T2JqZWN0ICppdGVtOworICAgIFB5T2JqZWN0ICoqaXRlbXB0ciwgKipsaW1pdDsKKworICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCisgICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCisgICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCisgICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQorICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKKworICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCisgICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgorICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKKyAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgorICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgorICAgICovCisKKyAgICBiID0gbmV3YmxvY2soKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGdvdG8gYWx0ZXJuYXRlX21ldGhvZDsKKyAgICB9CisKKyAgICAvKiBSZW1lbWJlciB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCAqLworICAgIG4gPSBQeV9TSVpFKGRlcXVlKTsKKyAgICBsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOworICAgIGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CisKKyAgICAvKiBTZXQgdGhlIGRlcXVlIHRvIGJlIGVtcHR5IHVzaW5nIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KKyAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CisgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKKyAgICBQeV9TSVpFKGRlcXVlKSA9IDA7CisgICAgZGVxdWUtPmxlZnRibG9jayA9IGI7CisgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBDRU5URVIgKyAxOworICAgIGRlcXVlLT5yaWdodGluZGV4ID0gQ0VOVEVSOworICAgIGRlcXVlLT5zdGF0ZSsrOworCisgICAgLyogTm93IHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4IGFyZSBkaXNjb25uZWN0ZWQgZnJvbQorICAgICAgIHRoZSBlbXB0eSBkZXF1ZSBhbmQgd2UgY2FuIHVzZSB0aGVtIHRvIGRlY3JlZiB0aGUgcG9pbnRlcnMuCisgICAgKi8KKyAgICBtID0gKEJMT0NLTEVOIC0gbGVmdGluZGV4ID4gbikgPyBuIDogQkxPQ0tMRU4gLSBsZWZ0aW5kZXg7CisgICAgaXRlbXB0ciA9ICZsZWZ0YmxvY2stPmRhdGFbbGVmdGluZGV4XTsKKyAgICBsaW1pdCA9IGl0ZW1wdHIgKyBtOworICAgIG4gLT0gbTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoaXRlbXB0ciA9PSBsaW1pdCkgeworICAgICAgICAgICAgaWYgKG4gPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOworICAgICAgICAgICAgcHJldmJsb2NrID0gbGVmdGJsb2NrOworICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7CisgICAgICAgICAgICBtID0gKG4gPiBCTE9DS0xFTikgPyBCTE9DS0xFTiA6IG47CisgICAgICAgICAgICBpdGVtcHRyID0gbGVmdGJsb2NrLT5kYXRhOworICAgICAgICAgICAgbGltaXQgPSBpdGVtcHRyICsgbTsKKyAgICAgICAgICAgIG4gLT0gbTsKKyAgICAgICAgICAgIGZyZWVibG9jayhwcmV2YmxvY2spOworICAgICAgICB9CisgICAgICAgIGl0ZW0gPSAqKGl0ZW1wdHIrKyk7CisgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKKyAgICB9CisgICAgQ0hFQ0tfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKKyAgICBmcmVlYmxvY2sobGVmdGJsb2NrKTsKKyAgICByZXR1cm47CisKKyAgYWx0ZXJuYXRlX21ldGhvZDoKKyAgICB3aGlsZSAoUHlfU0laRShkZXF1ZSkpIHsKKyAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KK30KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKK2RlcXVlX2NsZWFybWV0aG9kKGRlcXVlb2JqZWN0ICpkZXF1ZSkKIHsKLSAgICBkZXF1ZW9iamVjdCAqbmV3X2RlcXVlOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBYWFggYWRkIGEgc3BlY2lhbCBjYXNlIGZvciB3aGVuIG1heGxlbiBpcyBkZWZpbmVkICovCi0gICAgaWYgKG4gPCAwKQotICAgICAgICBuID0gMDsKLSAgICBlbHNlIGlmIChuID4gMCAmJiBQeV9TSVpFKGRlcXVlKSA+IE1BWF9ERVFVRV9MRU4gLyBuKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQotICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX25ldygmZGVxdWVfdHlwZSwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7Ci0gICAgbmV3X2RlcXVlLT5tYXhsZW4gPSBkZXF1ZS0+bWF4bGVuOwotCi0gICAgZm9yICggOyBuIDsgbi0tKSB7Ci0gICAgICAgIHJlc3VsdCA9IGRlcXVlX2V4dGVuZChuZXdfZGVxdWUsIChQeU9iamVjdCAqKWRlcXVlKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gKFB5T2JqZWN0ICopbmV3X2RlcXVlOworICAgIGRlcXVlX2NsZWFyKGRlcXVlKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAorUHlEb2NfU1RSVkFSKGNsZWFyX2RvYywgIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgZGVxdWUuIik7CisKIHN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9pbnBsYWNlX3JlcGVhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5X3NzaXplX3QgbikKIHsKLSAgICBQeV9zc2l6ZV90IGksIHNpemU7CisgICAgUHlfc3NpemVfdCBpLCBtLCBzaXplOwogICAgIFB5T2JqZWN0ICpzZXE7CiAgICAgUHlPYmplY3QgKnJ2OwogCkBAIC01ODEsMjcgKzY0OSw0NyBAQAogICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiAgICAgfQogCi0gICAgaWYgKHNpemUgPiBNQVhfREVRVUVfTEVOIC8gbikgewotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICB9Ci0KICAgICBpZiAoc2l6ZSA9PSAxKSB7CiAgICAgICAgIC8qIGNvbW1vbiBjYXNlLCByZXBlYXRpbmcgYSBzaW5nbGUgZWxlbWVudCAqLwogICAgICAgICBQeU9iamVjdCAqaXRlbSA9IGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF07CiAKLSAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgbiA+IGRlcXVlLT5tYXhsZW4pCisgICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID49IDAgJiYgbiA+IGRlcXVlLT5tYXhsZW4pCiAgICAgICAgICAgICBuID0gZGVxdWUtPm1heGxlbjsKIAotICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IG4tMSA7IGkrKykgewotICAgICAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmQoZGVxdWUsIGl0ZW0pOwotICAgICAgICAgICAgaWYgKHJ2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICAgICAgZm9yIChpID0gMCA7IGkgPCBuLTEgOyApIHsKKyAgICAgICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKKyAgICAgICAgICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9TSVpFKGRlcXVlKSArPSBpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKKyAgICAgICAgICAgICAgICBDSEVDS19FTkQoZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPnJpZ2h0bGluayA9IGI7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOworICAgICAgICAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CisgICAgICAgICAgICAgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0gPSBuIC0gMSAtIGk7CisgICAgICAgICAgICBpZiAobSA+IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4KQorICAgICAgICAgICAgICAgIG0gPSBCTE9DS0xFTiAtIDEgLSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICAgICAgICAgIGkgKz0gbTsKKyAgICAgICAgICAgIHdoaWxlIChtLS0pIHsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCsrOworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdGVtKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+ZGF0YVtkZXF1ZS0+cmlnaHRpbmRleF0gPSBpdGVtOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIFB5X1NJWkUoZGVxdWUpICs9IGk7CiAgICAgICAgIFB5X0lOQ1JFRihkZXF1ZSk7CiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKICAgICB9CiAKKyAgICBpZiAoKHNpemVfdClzaXplID4gUFlfU1NJWkVfVF9NQVggLyAoc2l6ZV90KW4pIHsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgfQorCiAgICAgc2VxID0gUHlTZXF1ZW5jZV9MaXN0KChQeU9iamVjdCAqKWRlcXVlKTsKICAgICBpZiAoc2VxID09IE5VTEwpCiAgICAgICAgIHJldHVybiBzZXE7CkBAIC02MTksNiArNzA3LDIwIEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorZGVxdWVfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQoreworICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7CisgICAgUHlPYmplY3QgKnJ2OworCisgICAgbmV3X2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWVfY29weSgoUHlPYmplY3QgKikgZGVxdWUpOworICAgIGlmIChuZXdfZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBkZXF1ZV9pbnBsYWNlX3JlcGVhdChuZXdfZGVxdWUsIG4pOworICAgIFB5X0RFQ1JFRihuZXdfZGVxdWUpOworICAgIHJldHVybiBydjsKK30KKwogLyogVGhlIHJvdGF0ZSgpIG1ldGhvZCBpcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBpcyB1c2VkIGludGVybmFsbHkKIGFzIGEgcHJpbWl0aXZlIGZvciBvdGhlciBtZXRob2RzLgogCkBAIC02NzEsNyArNzczLDcgQEAKICAgICB3aGlsZSAobiA+IDApIHsKICAgICAgICAgaWYgKGxlZnRpbmRleCA9PSAwKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKGxlbik7CisgICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfQpAQCAtNzAyLDcgKzgwNCw3IEBACiAgICAgICAgICAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CiAgICAgICAgICAgICB9IHdoaWxlICgtLW0pOwogICAgICAgICB9Ci0gICAgICAgIGlmIChyaWdodGluZGV4ID09IC0xKSB7CisgICAgICAgIGlmIChyaWdodGluZGV4IDwgMCkgewogICAgICAgICAgICAgYXNzZXJ0KGxlZnRibG9jayAhPSByaWdodGJsb2NrKTsKICAgICAgICAgICAgIGFzc2VydChiID09IE5VTEwpOwogICAgICAgICAgICAgYiA9IHJpZ2h0YmxvY2s7CkBAIC03MTUsNyArODE3LDcgQEAKICAgICB3aGlsZSAobiA8IDApIHsKICAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7CiAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKGxlbik7CisgICAgICAgICAgICAgICAgYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgfQpAQCAtNzkwLDExICs4OTIsMTEgQEAKICAgICBibG9jayAqcmlnaHRibG9jayA9IGRlcXVlLT5yaWdodGJsb2NrOwogICAgIFB5X3NzaXplX3QgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IHJpZ2h0aW5kZXggPSBkZXF1ZS0+cmlnaHRpbmRleDsKLSAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKSAvIDI7Ci0gICAgUHlfc3NpemVfdCBpOworICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpID4+IDE7CiAgICAgUHlPYmplY3QgKnRtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgbisrOworICAgIHdoaWxlICgtLW4pIHsKICAgICAgICAgLyogVmFsaWRhdGUgdGhhdCBwb2ludGVycyBoYXZlbid0IG1ldCBpbiB0aGUgbWlkZGxlICovCiAgICAgICAgIGFzc2VydChsZWZ0YmxvY2sgIT0gcmlnaHRibG9jayB8fCBsZWZ0aW5kZXggPCByaWdodGluZGV4KTsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2spOwpAQCAtODE0LDcgKzkxNiw3IEBACiAKICAgICAgICAgLyogU3RlcCBiYWNrd2FyZHMgd2l0aCB0aGUgcmlnaHQgYmxvY2svaW5kZXggcGFpciAqLwogICAgICAgICByaWdodGluZGV4LS07Ci0gICAgICAgIGlmIChyaWdodGluZGV4ID09IC0xKSB7CisgICAgICAgIGlmIChyaWdodGluZGV4IDwgMCkgewogICAgICAgICAgICAgcmlnaHRibG9jayA9IHJpZ2h0YmxvY2stPmxlZnRsaW5rOwogICAgICAgICAgICAgcmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMTsKICAgICAgICAgfQpAQCAtODMxLDIwICs5MzMsMTkgQEAKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSk7Ci0gICAgUHlfc3NpemVfdCBpOwogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKICAgICBQeU9iamVjdCAqaXRlbTsKICAgICBpbnQgY21wOwogCi0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICBuKys7CisgICAgd2hpbGUgKC0tbikgewogICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7Ci0gICAgICAgIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgZWxzZSBpZiAoY21wIDwgMCkKKyAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgY291bnQgKz0gY21wOwogCiAgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCkBAIC04NzEsMTIgKzk3MiwxMiBAQAogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKTsKLSAgICBQeV9zc2l6ZV90IGk7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIGludCBjbXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIG4rKzsKKyAgICB3aGlsZSAoLS1uKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoYik7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKQEAgLTkwNiwxMSArMTAwNywxMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2luZGV4KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoZGVxdWUpOworICAgIFB5X3NzaXplX3QgaSwgbiwgc3RhcnQ9MCwgc3RvcD1QeV9TSVpFKGRlcXVlKTsKICAgICBQeU9iamVjdCAqdiwgKml0ZW07CiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIHNpemVfdCBzdGFydF9zdGF0ZSA9IGRlcXVlLT5zdGF0ZTsKKyAgICBpbnQgY21wOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6aW5kZXgiLCAmdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsCkBAIC05MjgsMjIgKzEwMzAsMzIgQEAKICAgICB9CiAgICAgaWYgKHN0b3AgPiBQeV9TSVpFKGRlcXVlKSkKICAgICAgICAgc3RvcCA9IFB5X1NJWkUoZGVxdWUpOworICAgIGlmIChzdGFydCA+IHN0b3ApCisgICAgICAgIHN0YXJ0ID0gc3RvcDsKKyAgICBhc3NlcnQoMCA8PSBzdGFydCAmJiBzdGFydCA8PSBzdG9wICYmIHN0b3AgPD0gUHlfU0laRShkZXF1ZSkpOwogCi0gICAgZm9yIChpPTAgOyBpPHN0b3AgOyBpKyspIHsKLSAgICAgICAgaWYgKGkgPj0gc3RhcnQpIHsKLSAgICAgICAgICAgIGludCBjbXA7Ci0gICAgICAgICAgICBDSEVDS19OT1RfRU5EKGIpOwotICAgICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwotICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKLSAgICAgICAgICAgIGlmIChjbXAgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QoaSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICAvKiBYWFggUmVwbGFjZSB0aGlzIGxvb3Agd2l0aCBmYXN0ZXIgY29kZSBmcm9tIGRlcXVlX2l0ZW0oKSAqLworICAgIGZvciAoaT0wIDsgaTxzdGFydCA7IGkrKykgeworICAgICAgICBpbmRleCsrOworICAgICAgICBpZiAoaW5kZXggPT0gQkxPQ0tMRU4pIHsKKyAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CisgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gc3RvcCAtIGkgKyAxOworICAgIHdoaWxlICgtLW4pIHsKKyAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKKyAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOworICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOworICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3Qoc3RvcCAtIG4pOworICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXF1ZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIGlmIChpbmRleCA9PSBCTE9DS0xFTikgewpAQCAtMTAzNyw4NCArMTE0OSwxMCBAQAogUHlEb2NfU1RSVkFSKHJlbW92ZV9kb2MsCiAiRC5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLiIpOwogCi1zdGF0aWMgdm9pZAotZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKQotewotICAgIGJsb2NrICpiOwotICAgIGJsb2NrICpwcmV2YmxvY2s7Ci0gICAgYmxvY2sgKmxlZnRibG9jazsKLSAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsKLSAgICBQeV9zc2l6ZV90IG47Ci0gICAgUHlPYmplY3QgKml0ZW07Ci0KLSAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogRHVyaW5nIHRoZSBwcm9jZXNzIG9mIGNsZWFyaW5nIGEgZGVxdWUsIGRlY3JlZnMgY2FuIGNhdXNlIHRoZQotICAgICAgIGRlcXVlIHRvIG11dGF0ZS4gIFRvIGF2b2lkIGZhdGFsIGNvbmZ1c2lvbiwgd2UgaGF2ZSB0byBtYWtlIHRoZQotICAgICAgIGRlcXVlIGVtcHR5IGJlZm9yZSBjbGVhcmluZyB0aGUgYmxvY2tzIGFuZCBuZXZlciByZWZlciB0bwotICAgICAgIGFueXRoaW5nIHZpYSBkZXF1ZS0+cmVmIHdoaWxlIGNsZWFyaW5nLiAgKFRoaXMgaXMgdGhlIHNhbWUKLSAgICAgICB0ZWNobmlxdWUgdXNlZCBmb3IgY2xlYXJpbmcgbGlzdHMsIHNldHMsIGFuZCBkaWN0cy4pCi0KLSAgICAgICBNYWtpbmcgdGhlIGRlcXVlIGVtcHR5IHJlcXVpcmVzIGFsbG9jYXRpbmcgYSBuZXcgZW1wdHkgYmxvY2suICBJbgotICAgICAgIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IG1lbW9yeSBpcyBmdWxsLCB3ZSBmYWxsIGJhY2sgdG8gYW4KLSAgICAgICBhbHRlcm5hdGUgbWV0aG9kIHRoYXQgZG9lc24ndCByZXF1aXJlIGEgbmV3IGJsb2NrLiAgUmVwZWF0aW5nCi0gICAgICAgcG9wcyBpbiBhIHdoaWxlLWxvb3AgaXMgc2xvd2VyLCBwb3NzaWJseSByZS1lbnRyYW50IChhbmQgYSBjbGV2ZXIKLSAgICAgICBhZHZlcnNhcnkgY291bGQgY2F1c2UgaXQgdG8gbmV2ZXIgdGVybWluYXRlKS4KLSAgICAqLwotCi0gICAgYiA9IG5ld2Jsb2NrKDApOwotICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgZ290byBhbHRlcm5hdGVfbWV0aG9kOwotICAgIH0KLQotICAgIC8qIFJlbWVtYmVyIHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4ICovCi0gICAgbGVmdGJsb2NrID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwotICAgIG4gPSBQeV9TSVpFKGRlcXVlKTsKLQotICAgIC8qIFNldCB0aGUgZGVxdWUgdG8gYmUgZW1wdHkgdXNpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLwotICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKLSAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOwotICAgIFB5X1NJWkUoZGVxdWUpID0gMDsKLSAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKLSAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7Ci0gICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7Ci0gICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7Ci0gICAgZGVxdWUtPnN0YXRlKys7Ci0KLSAgICAvKiBOb3cgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggYXJlIGRpc2Nvbm5lY3RlZCBmcm9tCi0gICAgICAgdGhlIGVtcHR5IGRlcXVlIGFuZCB3ZSBjYW4gdXNlIHRoZW0gdG8gZGVjcmVmIHRoZSBwb2ludGVycy4KLSAgICAqLwotICAgIHdoaWxlIChuLS0pIHsKLSAgICAgICAgaXRlbSA9IGxlZnRibG9jay0+ZGF0YVtsZWZ0aW5kZXhdOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgICAgIGxlZnRpbmRleCsrOwotICAgICAgICBpZiAobGVmdGluZGV4ID09IEJMT0NLTEVOICYmIG4pIHsKLSAgICAgICAgICAgIENIRUNLX05PVF9FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOwotICAgICAgICAgICAgcHJldmJsb2NrID0gbGVmdGJsb2NrOwotICAgICAgICAgICAgbGVmdGJsb2NrID0gbGVmdGJsb2NrLT5yaWdodGxpbms7Ci0gICAgICAgICAgICBsZWZ0aW5kZXggPSAwOwotICAgICAgICAgICAgZnJlZWJsb2NrKHByZXZibG9jayk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQ0hFQ0tfRU5EKGxlZnRibG9jay0+cmlnaHRsaW5rKTsKLSAgICBmcmVlYmxvY2sobGVmdGJsb2NrKTsKLSAgICByZXR1cm47Ci0KLSAgYWx0ZXJuYXRlX21ldGhvZDoKLSAgICB3aGlsZSAoUHlfU0laRShkZXF1ZSkpIHsKLSAgICAgICAgaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydCAoaXRlbSAhPSBOVUxMKTsKLSAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgIH0KLX0KLQogc3RhdGljIGludAogdmFsaWRfaW5kZXgoUHlfc3NpemVfdCBpLCBQeV9zc2l6ZV90IGxpbWl0KQogewotICAgIC8qIFRoZSBjYXN0IHRvIHNpemVfdCBsZXQgdXMgdXNlIGp1c3QgYSBzaW5nbGUgY29tcGFyaXNvbgorICAgIC8qIFRoZSBjYXN0IHRvIHNpemVfdCBsZXRzIHVzIHVzZSBqdXN0IGEgc2luZ2xlIGNvbXBhcmlzb24KICAgICAgICB0byBjaGVjayB3aGV0aGVyIGkgaXMgaW4gdGhlIHJhbmdlOiAwIDw9IGkgPCBsaW1pdCAqLwogICAgIHJldHVybiAoc2l6ZV90KSBpIDwgKHNpemVfdCkgbGltaXQ7CiB9CkBAIC0xMTQzLDE0ICsxMTgxLDE2IEBACiAgICAgICAgIGkgPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAlIEJMT0NLTEVOKTsKICAgICAgICAgaWYgKGluZGV4IDwgKFB5X1NJWkUoZGVxdWUpID4+IDEpKSB7CiAgICAgICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuID0gKFB5X3NzaXplX3QpKAogICAgICAgICAgICAgICAgICAgICAoKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkpCiAgICAgICAgICAgICAgICAgICAgIC8gQkxPQ0tMRU4gLSBuKTsKICAgICAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgICAgICBuKys7CisgICAgICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKICAgICAgICAgfQogICAgIH0KQEAgLTExOTQsMTQgKzEyMzQsMTYgQEAKICAgICBpID0gKFB5X3NzaXplX3QpKChzaXplX3QpIGkgJSBCTE9DS0xFTik7CiAgICAgaWYgKGluZGV4IDw9IGhhbGZsZW4pIHsKICAgICAgICAgYiA9IGRlcXVlLT5sZWZ0YmxvY2s7Ci0gICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgIG4rKzsKKyAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgIGIgPSBiLT5yaWdodGxpbms7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbiA9IChQeV9zc2l6ZV90KSgKICAgICAgICAgICAgICAgICAoKHNpemVfdCkoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSkpCiAgICAgICAgICAgICAgICAgLyBCTE9DS0xFTiAtIG4pOwogICAgICAgICBiID0gZGVxdWUtPnJpZ2h0YmxvY2s7Ci0gICAgICAgIHdoaWxlIChuLS0pCisgICAgICAgIG4rKzsKKyAgICAgICAgd2hpbGUgKC0tbikKICAgICAgICAgICAgIGIgPSBiLT5sZWZ0bGluazsKICAgICB9CiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtMTIxMSwxNSArMTI1Myw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9jbGVhcm1ldGhvZChkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgZGVxdWVfY2xlYXIoZGVxdWUpOwotICAgIFB5X1JFVFVSTl9OT05FOwotfQotCi1QeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKLQogc3RhdGljIHZvaWQKIGRlcXVlX2RlYWxsb2MoZGVxdWVvYmplY3QgKmRlcXVlKQogewpAQCAtMTI0Myw2ICsxMjc2LDcgQEAKICAgICBQeU9iamVjdCAqaXRlbTsKICAgICBQeV9zc2l6ZV90IGluZGV4OwogICAgIFB5X3NzaXplX3QgaW5kZXhsbyA9IGRlcXVlLT5sZWZ0aW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleGhpZ2g7CiAKICAgICBmb3IgKGIgPSBkZXF1ZS0+bGVmdGJsb2NrOyBiICE9IGRlcXVlLT5yaWdodGJsb2NrOyBiID0gYi0+cmlnaHRsaW5rKSB7CiAgICAgICAgIGZvciAoaW5kZXggPSBpbmRleGxvOyBpbmRleCA8IEJMT0NLTEVOIDsgaW5kZXgrKykgewpAQCAtMTI1MSw3ICsxMjg1LDggQEAKICAgICAgICAgfQogICAgICAgICBpbmRleGxvID0gMDsKICAgICB9Ci0gICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDw9IGRlcXVlLT5yaWdodGluZGV4OyBpbmRleCsrKSB7CisgICAgaW5kZXhoaWdoID0gZGVxdWUtPnJpZ2h0aW5kZXg7CisgICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDw9IGluZGV4aGlnaDsgaW5kZXgrKykgewogICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CiAgICAgICAgIFB5X1ZJU0lUKGl0ZW0pOwogICAgIH0KQEAgLTEyNTksNDUgKzEyOTQsMzMgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKQotewotICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gPT0gLTEpCi0gICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk8iLCBkZXF1ZSwgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPaSIsCi0gICAgICAgICAgICBkZXF1ZSwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuLCBOVUxMKTsKLX0KLQotUHlEb2NfU1RSVkFSKGNvcHlfZG9jLCAiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgZGVxdWUuIik7Ci0KLXN0YXRpYyBQeU9iamVjdCAqCiBkZXF1ZV9yZWR1Y2UoZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIFB5T2JqZWN0ICpkaWN0LCAqcmVzdWx0LCAqYXNsaXN0OworICAgIFB5T2JqZWN0ICpkaWN0LCAqaXQ7CiAgICAgX1B5X0lERU5USUZJRVIoX19kaWN0X18pOwogCiAgICAgZGljdCA9IF9QeU9iamVjdF9HZXRBdHRySWQoKFB5T2JqZWN0ICopZGVxdWUsICZQeUlkX19fZGljdF9fKTsKLSAgICBpZiAoZGljdCA9PSBOVUxMKQorICAgIGlmIChkaWN0ID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0F0dHJpYnV0ZUVycm9yKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICBhc2xpc3QgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopZGVxdWUpOwotICAgIGlmIChhc2xpc3QgPT0gTlVMTCkgewotICAgICAgICBQeV9YREVDUkVGKGRpY3QpOworICAgICAgICBkaWN0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGRpY3QpOworICAgIH0KKworICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcigoUHlPYmplY3QgKilkZXF1ZSk7CisgICAgaWYgKGl0ID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKGRpY3QpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKGRpY3QgPT0gTlVMTCkgewotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oTykiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPbikiLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBkZXF1ZS0+bWF4bGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAtMSkKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT08pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIFB5X05vbmUsIGRpY3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKU8iLCBQeV9UWVBFKGRlcXVlKSwgYXNsaXN0LCBkZXF1ZS0+bWF4bGVuLCBkaWN0KTsKKworICAgIGlmIChkZXF1ZS0+bWF4bGVuIDwgMCkgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTygpTk4iLCBQeV9UWVBFKGRlcXVlKSwgZGljdCwgaXQpOwogICAgIH0KLSAgICBQeV9YREVDUkVGKGRpY3QpOwotICAgIFB5X0RFQ1JFRihhc2xpc3QpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKCgpbilOTiIsIFB5X1RZUEUoZGVxdWUpLCBkZXF1ZS0+bWF4bGVuLCBkaWN0LCBpdCk7CisgICAgfQogfQogCiBQeURvY19TVFJWQVIocmVkdWNlX2RvYywgIlJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuIik7CkBAIC0xMzIwLDcgKzEzNDMsNyBAQAogICAgICAgICBQeV9SZXByTGVhdmUoZGVxdWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiAhPSAtMSkKKyAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuID49IDApCiAgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCJkZXF1ZSglUiwgbWF4bGVuPSV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xpc3QsICgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbik7CiAgICAgZWxzZQpAQCAtMTM4MSw3ICsxNDA0LDcgQEAKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoeCk7CiAgICAgICAgIFB5X0RFQ1JFRih5KTsKLSAgICAgICAgaWYgKGIgPT0gLTEpCisgICAgICAgIGlmIChiIDwgMCkKICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAgICAgLyogV2UgcmVhY2hlZCB0aGUgZW5kIG9mIG9uZSBkZXF1ZSBvciBib3RoICovCkBAIC0xNDE2LDggKzE0MzksMTQgQEAKICAgICBQeV9zc2l6ZV90IG1heGxlbiA9IC0xOwogICAgIGNoYXIgKmt3bGlzdFtdID0geyJpdGVyYWJsZSIsICJtYXhsZW4iLCAwfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoa3dkYXJncyA9PSBOVUxMKSB7CisgICAgICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlcXVlKCkiLCAwLCAyLCAmaXRlcmFibGUsICZtYXhsZW5vYmopKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZGFyZ3MsICJ8T086ZGVxdWUiLCBrd2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQogICAgIGlmIChtYXhsZW5vYmogIT0gTlVMTCAmJiBtYXhsZW5vYmogIT0gUHlfTm9uZSkgewogICAgICAgICBtYXhsZW4gPSBQeUxvbmdfQXNTc2l6ZV90KG1heGxlbm9iaik7CiAgICAgICAgIGlmIChtYXhsZW4gPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTE0NDYsNyArMTQ3NSw3IEBACiAgICAgUHlfc3NpemVfdCBibG9ja3M7CiAKICAgICByZXMgPSBfUHlPYmplY3RfU0laRShQeV9UWVBFKGRlcXVlKSk7Ci0gICAgYmxvY2tzID0gKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSArIEJMT0NLTEVOIC0gMSkgLyBCTE9DS0xFTjsKKyAgICBibG9ja3MgPSAoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgKyBCTE9DS0xFTiAtIDEpIC8gQkxPQ0tMRU47CiAgICAgYXNzZXJ0KGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSAtIDEgPT0KICAgICAgICAgICAgKGJsb2NrcyAtIDEpICogQkxPQ0tMRU4gKyBkZXF1ZS0+cmlnaHRpbmRleCk7CiAgICAgcmVzICs9IGJsb2NrcyAqIHNpemVvZihibG9jayk7CkBAIC0xNDY1LDcgKzE0OTQsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2dldF9tYXhsZW4oZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQorICAgIGlmIChkZXF1ZS0+bWF4bGVuIDwgMCkKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChkZXF1ZS0+bWF4bGVuKTsKIH0KQEAgLTE4MDYsNyArMTgzNSw3IEBACiAgICAgaXRlbSA9IGl0LT5iLT5kYXRhW2l0LT5pbmRleF07CiAgICAgaXQtPmluZGV4LS07CiAgICAgaXQtPmNvdW50ZXItLTsKLSAgICBpZiAoaXQtPmluZGV4ID09IC0xICYmIGl0LT5jb3VudGVyID4gMCkgeworICAgIGlmIChpdC0+aW5kZXggPCAwICYmIGl0LT5jb3VudGVyID4gMCkgewogICAgICAgICBDSEVDS19OT1RfRU5EKGl0LT5iLT5sZWZ0bGluayk7CiAgICAgICAgIGl0LT5iID0gaXQtPmItPmxlZnRsaW5rOwogICAgICAgICBpdC0+aW5kZXggPSBCTE9DS0xFTiAtIDE7CkBAIC0yMjM1LDEzICsyMjY0LDEzIEBACiAKICAgICAgICAgICAgIG9sZHZhbCA9IF9QeURpY3RfR2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBoYXNoKTsKICAgICAgICAgICAgIGlmIChvbGR2YWwgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgb25lLCBoYXNoKSA9PSAtMSkKKyAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG9uZSwgaGFzaCkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG5ld3ZhbCA9IFB5TnVtYmVyX0FkZChvbGR2YWwsIG9uZSk7CiAgICAgICAgICAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBuZXd2YWwsIGhhc2gpID09IC0xKQorICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgbmV3dmFsLCBoYXNoKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgICAgICBQeV9DTEVBUihuZXd2YWwpOwogICAgICAgICAgICAgfQpAQCAtMjI2Nyw3ICsyMjk2LDcgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRihvbGR2YWwpOwogICAgICAgICAgICAgaWYgKG5ld3ZhbCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0obWFwcGluZywga2V5LCBuZXd2YWwpID09IC0xKQorICAgICAgICAgICAgaWYgKFB5T2JqZWN0X1NldEl0ZW0obWFwcGluZywga2V5LCBuZXd2YWwpIDwgMCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIFB5X0NMRUFSKG5ld3ZhbCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2Nzdi5jIGIvTW9kdWxlcy9fY3N2LmMKaW5kZXggMTAxZjQ0OS4uNDI4NDQ3NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3N2LmMKKysrIGIvTW9kdWxlcy9fY3N2LmMKQEAgLTYwLDEwICs2MCwxMCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUXVvdGVTdHlsZSBzdHlsZTsKLSAgICBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CiB9IFN0eWxlRGVzYzsKIAotc3RhdGljIFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBTdHlsZURlc2MgcXVvdGVfc3R5bGVzW10gPSB7CiAgICAgeyBRVU9URV9NSU5JTUFMLCAgICAiUVVPVEVfTUlOSU1BTCIgfSwKICAgICB7IFFVT1RFX0FMTCwgICAgICAgICJRVU9URV9BTEwiIH0sCiAgICAgeyBRVU9URV9OT05OVU1FUklDLCAiUVVPVEVfTk9OTlVNRVJJQyIgfSwKQEAgLTI4Niw3ICsyODYsNyBAQAogc3RhdGljIGludAogZGlhbGVjdF9jaGVja19xdW90aW5nKGludCBxdW90aW5nKQogewotICAgIFN0eWxlRGVzYyAqcXM7CisgICAgY29uc3QgU3R5bGVEZXNjICpxczsKIAogICAgIGZvciAocXMgPSBxdW90ZV9zdHlsZXM7IHFzLT5uYW1lOyBxcysrKSB7CiAgICAgICAgIGlmICgoaW50KXFzLT5zdHlsZSA9PSBxdW90aW5nKQpAQCAtMTYzMyw3ICsxNjMzLDcgQEAKIFB5SW5pdF9fY3N2KHZvaWQpCiB7CiAgICAgUHlPYmplY3QgKm1vZHVsZTsKLSAgICBTdHlsZURlc2MgKnN0eWxlOworICAgIGNvbnN0IFN0eWxlRGVzYyAqc3R5bGU7CiAKICAgICBpZiAoUHlUeXBlX1JlYWR5KCZEaWFsZWN0X1R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwppbmRleCBhN2E4MTA1Li4zMzEzNDNiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogICAgIHJldHVybiBTdHJ1Y3RVbmlvblR5cGVfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMsIDApOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2FkZHJlc3NfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9hZGRyZXNzX2RvY1tdID0KICJDLmZyb21fYWRkcmVzcyhpbnRlZ2VyKSAtPiBDIGluc3RhbmNlXG5hY2Nlc3MgYSBDIGluc3RhbmNlIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NTMsNyArNDUzLDcgQEAKICAgICByZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYnVmKTsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9idWZmZXJfZG9jW10gPQogIkMuZnJvbV9idWZmZXIob2JqZWN0LCBvZmZzZXQ9MCkgLT4gQyBpbnN0YW5jZVxuY3JlYXRlIGEgQyBpbnN0YW5jZSBmcm9tIGEgd3JpdGVhYmxlIGJ1ZmZlciI7CiAKIHN0YXRpYyBpbnQKQEAgLTUyNCw3ICs1MjQsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYnVmZmVyX2NvcHlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9idWZmZXJfY29weV9kb2NbXSA9CiAiQy5mcm9tX2J1ZmZlcl9jb3B5KG9iamVjdCwgb2Zmc2V0PTApIC0+IEMgaW5zdGFuY2VcbmNyZWF0ZSBhIEMgaW5zdGFuY2UgZnJvbSBhIHJlYWRhYmxlIGJ1ZmZlciI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC01NjYsNyArNTY2LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgY2hhciBpbl9kbGxfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgaW5fZGxsX2RvY1tdID0KICJDLmluX2RsbChkbGwsIG5hbWUpIC0+IEMgaW5zdGFuY2VcbmFjY2VzcyBhIEMgaW5zdGFuY2UgaW4gYSBkbGwiOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNjIzLDcgKzYyMyw3IEBACiAgICAgcmV0dXJuIFB5Q0RhdGFfQXRBZGRyZXNzKHR5cGUsIGFkZHJlc3MpOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX3BhcmFtX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQogIkNvbnZlcnQgYSBQeXRob24gb2JqZWN0IGludG8gYSBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlci4iOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTQ4Nyw3ICsxNDg3LDcgQEAKIAogKi8KIAotc3RhdGljIGNoYXIgKlNJTVBMRV9UWVBFX0NIQVJTID0gImNiQmhIaUlsTGRmdXpacVFQWE92P2ciOworc3RhdGljIGNvbnN0IGNoYXIgU0lNUExFX1RZUEVfQ0hBUlNbXSA9ICJjYkJoSGlJbExkZnV6WnFRUFhPdj9nIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGNfd2NoYXJfcF9mcm9tX3BhcmFtKFB5T2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqdmFsdWUpCkBAIC0yNDEyLDcgKzI0MTIsNyBAQAogICAgIGNoYXIgKmNwID0gc3RyaW5nOwogICAgIHNpemVfdCBieXRlc19sZWZ0OwogCi0gICAgYXNzZXJ0KHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKICAgICBjcCArPSBzcHJpbnRmKGNwLCAiJXgiLCBQeV9TQUZFX0RPV05DQVNUKGluZGV4LCBQeV9zc2l6ZV90LCBpbnQpKTsKICAgICB3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKICAgICAgICAgYnl0ZXNfbGVmdCA9IHNpemVvZihzdHJpbmcpIC0gKGNwIC0gc3RyaW5nKSAtIDE7CkBAIC0zMjA3LDcgKzMyMDcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1fZ2V0X25hbWUoUHlPYmplY3QgKm9iaiwgY2hhciAqKnBuYW1lKQorX2dldF9uYW1lKFB5T2JqZWN0ICpvYmosIGNvbnN0IGNoYXIgKipwbmFtZSkKIHsKICNpZmRlZiBNU19XSU4zMgogICAgIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgewpAQCAtMzIzNSw3ICszMjM1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUNGdW5jUHRyX0Zyb21EbGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOwogICAgIGludCAoKiBhZGRyZXNzKSh2b2lkKTsKICAgICBQeU9iamVjdCAqZnR1cGxlOwogICAgIFB5T2JqZWN0ICpkbGw7CkBAIC01MTI1LDI5ICs1MTI1LDI4IEBACiAKICNpZmRlZiBNU19XSU4zMgogCi1zdGF0aWMgY2hhciBjb21lcnJvcl9kb2NbXSA9ICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIjsKK3N0YXRpYyBjb25zdCBjaGFyIGNvbWVycm9yX2RvY1tdID0gIlJhaXNlZCB3aGVuIGEgQ09NIG1ldGhvZCBjYWxsIGZhaWxlZC4iOwogCiBpbnQKIGNvbWVycm9yX2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBQeU9iamVjdCAqaHJlc3VsdCwgKnRleHQsICpkZXRhaWxzOwotICAgIFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqYnNlbGY7CiAgICAgUHlPYmplY3QgKmE7CiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghX1B5QXJnX05vS2V5d29yZHMoUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwga3dkcykpCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PTzpDT01FcnJvciIsICZocmVzdWx0LCAmdGV4dCwgJmRldGFpbHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBhID0gUHlTZXF1ZW5jZV9HZXRTbGljZShhcmdzLCAxLCBQeVNlcXVlbmNlX1NpemUoYXJncykpOwogICAgIGlmICghYSkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKICAgICBzdGF0dXMgPSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKHNlbGYsICJhcmdzIiwgYSk7CiAgICAgUHlfREVDUkVGKGEpOwogICAgIGlmIChzdGF0dXMgPCAwKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImhyZXN1bHQiLCBocmVzdWx0KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTUxNTgsOSArNTE1Nyw4IEBACiAgICAgaWYgKFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImRldGFpbHMiLCBkZXRhaWxzKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGJzZWxmID0gKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGY7CiAgICAgUHlfSU5DUkVGKGFyZ3MpOwotICAgIFB5X1NFVFJFRihic2VsZi0+YXJncywgYXJncyk7CisgICAgUHlfU0VUUkVGKCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmFyZ3MsIGFyZ3MpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC01NDkwLDE0ICs1NDg4LDE0IEBACiAjZW5kaWYKIAogLyogSWYgUlRMRF9MT0NBTCBpcyBub3QgZGVmaW5lZCAoV2luZG93cyEpLCBzZXQgaXQgdG8gemVyby4gKi8KLSNpZm5kZWYgUlRMRF9MT0NBTAorI2lmICFIQVZFX0RFQ0xfUlRMRF9MT0NBTAogI2RlZmluZSBSVExEX0xPQ0FMIDAKICNlbmRpZgogCiAvKiBJZiBSVExEX0dMT0JBTCBpcyBub3QgZGVmaW5lZCAoY3lnd2luKSwgc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGFzCiAgICBSVExEX0xPQ0FMLgogKi8KLSNpZm5kZWYgUlRMRF9HTE9CQUwKKyNpZiAhSEFWRV9ERUNMX1JUTERfR0xPQkFMCiAjZGVmaW5lIFJUTERfR0xPQkFMIFJUTERfTE9DQUwKICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKaW5kZXggN2NkNjE2NC4uMDBlOGU2NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwpAQCAtNzcsNyArNzcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotUHJpbnRFcnJvcihjaGFyICptc2csIC4uLikKK1ByaW50RXJyb3IoY29uc3QgY2hhciAqbXNnLCAuLi4pCiB7CiAgICAgY2hhciBidWZbNTEyXTsKICAgICBQeU9iamVjdCAqZiA9IFB5U3lzX0dldE9iamVjdCgic3RkZXJyIik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCmluZGV4IDMwZTNhOTYuLmEyNzZmY2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCkBAIC0zODIsNyArMzgyLDcgQEAKICAgICAgICAgICAgd2hvc2Ugb3BlcmF0aW9uIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50CiAgICAgICAgICAgIG1hY2hpbmUgbW9kZS4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX09TRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBwcml2aWxlZGdlZCBpbnN0cnVjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbjogcHJpdmlsZWdlZCBpbnN0cnVjdGlvbiIpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTjoKQEAgLTkzMCw3ICs5MzAsNyBAQAogICogUmFpc2UgYSBuZXcgZXhjZXB0aW9uICdleGNfY2xhc3MnLCBhZGRpbmcgYWRkaXRpb25hbCB0ZXh0IHRvIHRoZSBvcmlnaW5hbAogICogZXhjZXB0aW9uIHN0cmluZy4KICAqLwotdm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjaGFyICpmbXQsIC4uLikKK3ZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAgICAgdmFfbGlzdCB2YXJnczsKICAgICBQeU9iamVjdCAqdHAsICp2LCAqdGIsICpzLCAqY2xzX3N0ciwgKm1zZ19zdHI7CkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogCiAjaWZkZWYgTVNfV0lOMzIKIAotc3RhdGljIGNoYXIgZm9ybWF0X2Vycm9yX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGZvcm1hdF9lcnJvcl9kb2NbXSA9CiAiRm9ybWF0RXJyb3IoW2ludGVnZXJdKSAtPiBzdHJpbmdcblwKIFxuXAogQ29udmVydCBhIHdpbjMyIGVycm9yIGNvZGUgaW50byBhIHN0cmluZy4gSWYgdGhlIGVycm9yIGNvZGUgaXMgbm90XG5cCkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGxvYWRfbGlicmFyeV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBsb2FkX2xpYnJhcnlfZG9jW10gPQogIkxvYWRMaWJyYXJ5KG5hbWUpIC0+IGhhbmRsZVxuXAogXG5cCiBMb2FkIGFuIGV4ZWN1dGFibGUgKHVzdWFsbHkgYSBETEwpLCBhbmQgcmV0dXJuIGEgaGFuZGxlIHRvIGl0LlxuXApAQCAtMTI1Niw3ICsxMjU2LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgY2hhciBmcmVlX2xpYnJhcnlfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJlZV9saWJyYXJ5X2RvY1tdID0KICJGcmVlTGlicmFyeShoYW5kbGUpIC0+IHZvaWRcblwKIFxuXAogRnJlZSB0aGUgaGFuZGxlIG9mIGFuIGV4ZWN1dGFibGUgcHJldmlvdXNseSBsb2FkZWQgYnkgTG9hZExpYnJhcnkuXG4iOwpAQCAtMTI3MSw3ICsxMjcxLDcgQEAKICAgICByZXR1cm4gUHlfTm9uZTsKIH0KIAotc3RhdGljIGNoYXIgY29weV9jb21fcG9pbnRlcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb3B5X2NvbV9wb2ludGVyX2RvY1tdID0KICJDb3B5Q29tUG9pbnRlcihzcmMsIGRzdCkgLT4gSFJFU1VMVCB2YWx1ZVxuIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzMDksNyArMTMwOSw3IEBACiAgICAgUHlPYmplY3QgKm5hbWUsICpuYW1lMjsKICAgICBjaGFyICpuYW1lX3N0cjsKICAgICB2b2lkICogaGFuZGxlOwotI2lmZGVmIFJUTERfTE9DQUwKKyNpZiBIQVZFX0RFQ0xfUlRMRF9MT0NBTAogICAgIGludCBtb2RlID0gUlRMRF9OT1cgfCBSVExEX0xPQ0FMOwogI2Vsc2UKICAgICAvKiBjeWd3aW4gZG9lc24ndCBkZWZpbmUgUlRMRF9MT0NBTCAqLwpAQCAtMTQ0MSw3ICsxNDQxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZnVuY3Rpb25zCiAgKi8KLXN0YXRpYyBjaGFyIHNpemVvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBzaXplb2ZfZG9jW10gPQogInNpemVvZihDIHR5cGUpIC0+IGludGVnZXJcbiIKICJzaXplb2YoQyBpbnN0YW5jZSkgLT4gaW50ZWdlclxuIgogIlJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIEMgaW5zdGFuY2UiOwpAQCAtMTQ2Miw3ICsxNDYyLDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIgYWxpZ25tZW50X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFsaWdubWVudF9kb2NbXSA9CiAiYWxpZ25tZW50KEMgdHlwZSkgLT4gaW50ZWdlclxuIgogImFsaWdubWVudChDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIG9mIGEgQyBpbnN0YW5jZSI7CkBAIC0xNDg1LDcgKzE0ODUsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY2hhciBieXJlZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBieXJlZl9kb2NbXSA9CiAiYnlyZWYoQyBpbnN0YW5jZVssIG9mZnNldD0wXSkgLT4gYnlyZWYtb2JqZWN0XG4iCiAiUmV0dXJuIGEgcG9pbnRlciBsb29rYWxpa2UgdG8gYSBDIGluc3RhbmNlLCBvbmx5IHVzYWJsZVxuIgogImFzIGZ1bmN0aW9uIGFyZ3VtZW50IjsKQEAgLTE1MjksNyArMTUyOSw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXBhcmc7CiB9CiAKLXN0YXRpYyBjaGFyIGFkZHJlc3NvZl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhZGRyZXNzb2ZfZG9jW10gPQogImFkZHJlc3NvZihDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBDIGluc3RhbmNlIGludGVybmFsIGJ1ZmZlciI7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAppbmRleCAwZDNmNzI0Li5iMDZiYThhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCkBAIC0zMjcsNyArMzI3LDcgQEAKIFB5Q0RhdGFfc2V0KFB5T2JqZWN0ICpkc3QsIFB5T2JqZWN0ICp0eXBlLCBTRVRGVU5DIHNldGZ1bmMsIFB5T2JqZWN0ICp2YWx1ZSwKICAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LCBQeV9zc2l6ZV90IHNpemUsIGNoYXIgKnB0cik7CiAKLWV4dGVybiB2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKTsKK2V4dGVybiB2b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAogc3RydWN0IGJhc2VzcGVjIHsKICAgICBDRGF0YU9iamVjdCAqYmFzZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N1cnNlc19wYW5lbC5jIGIvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKaW5kZXggMjI4ZjQ5Ny4uMThlZjMzNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKKysrIGIvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMKQEAgLTYsNyArNiw3IEBACiAKIC8qIFJlbGVhc2UgTnVtYmVyICovCiAKLXN0YXRpYyBjaGFyICpQeUN1cnNlc1ZlcnNpb24gPSAiMi4xIjsKK3N0YXRpYyBjb25zdCBjaGFyIFB5Q3Vyc2VzVmVyc2lvbltdID0gIjIuMSI7CiAKIC8qIEluY2x1ZGVzICovCiAKQEAgLTU2LDcgKzU2LDcgQEAKICAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotUHlDdXJzZXNDaGVja0VSUihpbnQgY29kZSwgY2hhciAqZm5hbWUpCitQeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjb25zdCBjaGFyICpmbmFtZSkKIHsKICAgICBpZiAoY29kZSAhPSBFUlIpIHsKICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKaW5kZXggZjQxOWNiMi4uNjFiNjZhNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCkBAIC0xODQsMTIgKzE4NCwxMiBAQAogICogYW5kIHRoZSBudW1iZXIgb2YgZGF5cyBiZWZvcmUgdGhhdCBtb250aCBpbiB0aGUgc2FtZSB5ZWFyLiAgVGhlc2UKICAqIGFyZSBjb3JyZWN0IGZvciBub24tbGVhcCB5ZWFycyBvbmx5LgogICovCi1zdGF0aWMgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2luX21vbnRoW10gPSB7CiAgICAgMCwgLyogdW51c2VkOyB0aGlzIHZlY3RvciB1c2VzIDEtYmFzZWQgaW5kZXhpbmcgKi8KICAgICAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCiB9OwogCi1zdGF0aWMgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0geworc3RhdGljIGNvbnN0IGludCBfZGF5c19iZWZvcmVfbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0CiB9OwpAQCAtODczLDcgKzg3Myw3IEBACiAgKiB0aGlzIHJldHVybnMgTlVMTC4gIEVsc2UgcmVzdWx0IGlzIHJldHVybmVkLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF90emluZm9fbWV0aG9kKFB5T2JqZWN0ICp0emluZm8sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp0emluZm9hcmcpCitjYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKIHsKICAgICBQeU9iamVjdCAqb2Zmc2V0OwogCkBAIC0xMDA5LDEwICsxMDA5LDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZm9ybWF0X2N0aW1lKFB5RGF0ZVRpbWVfRGF0ZSAqZGF0ZSwgaW50IGhvdXJzLCBpbnQgbWludXRlcywgaW50IHNlY29uZHMpCiB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKkRheU5hbWVzW10gPSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBEYXlOYW1lc1tdID0gewogICAgICAgICAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIgogICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKk1vbnRoTmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IE1vbnRoTmFtZXNbXSA9IHsKICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIgogICAgIH07CkBAIC0xMDU3LDEwICsxMDU3LDggQEAKICAgICB9CiAgICAgLyogT2Zmc2V0IGlzIG5vcm1hbGl6ZWQsIHNvIGl0IGlzIG5lZ2F0aXZlIGlmIGRheXMgPCAwICovCiAgICAgaWYgKEdFVF9URF9EQVlTKG9mZnNldCkgPCAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gb2Zmc2V0OwogICAgICAgICBzaWduID0gJy0nOwotICAgICAgICBvZmZzZXQgPSBkZWx0YV9uZWdhdGl2ZSgoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCk7Ci0gICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgUHlfU0VUUkVGKG9mZnNldCwgZGVsdGFfbmVnYXRpdmUoKFB5RGF0ZVRpbWVfRGVsdGEgKilvZmZzZXQpKTsKICAgICAgICAgaWYgKG9mZnNldCA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTIzMDcsNyArMjMwNSw3IEBACiAgICAge05VTEwsICAgICAgTlVMTH0sCiB9OwogCi1zdGF0aWMgY2hhciBkZWx0YV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkZWx0YV9kb2NbXSA9CiBQeURvY19TVFIoIkRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZGF0ZXRpbWUgdmFsdWVzLiIpOwogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGRlbHRhX2FzX251bWJlciA9IHsKQEAgLTI4ODYsNyArMjg4NCw3IEBACiAgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIGRhdGVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGF0ZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGUoeWVhciwgbW9udGgsIGRheSkgLS0+IGRhdGUgb2JqZWN0Iik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGF0ZV9hc19udW1iZXIgPSB7CkBAIC0zMDQ3LDEwICszMDQ1LDggQEAKICAgICBpZiAoZHN0ID09IFB5X05vbmUpCiAgICAgICAgIGdvdG8gSW5jb25zaXN0ZW50OwogICAgIGlmIChkZWx0YV9ib29sKChQeURhdGVUaW1lX0RlbHRhICopZHN0KSAhPSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OwotICAgICAgICByZXN1bHQgPSBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopZHN0LCAxKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBhZGRfZGF0ZXRpbWVfdGltZWRlbHRhKChQeURhdGVUaW1lX0RhdGVUaW1lICopcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURhdGVUaW1lX0RlbHRhICopZHN0LCAxKSk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gRmFpbDsKICAgICB9CkBAIC0zMTU1LDcgKzMxNTEsNyBAQAogICAgIHtOVUxMLCBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdHppbmZvX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHR6aW5mb19kb2NbXSA9CiBQeURvY19TVFIoIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHRpbWUgem9uZSBpbmZvIG9iamVjdHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgUHlEYXRlVGltZV9UWkluZm9UeXBlID0gewpAQCAtMzI4Nyw2ICszMjgzLDExIEBACiAgICAgICAgIFB5X0lOQ1JFRihzZWxmLT5uYW1lKTsKICAgICAgICAgcmV0dXJuIHNlbGYtPm5hbWU7CiAgICAgfQorICAgIGlmICgoUHlPYmplY3QgKilzZWxmID09IFB5RGF0ZVRpbWVfVGltZVpvbmVfVVRDIHx8CisgICAgICAgICAgIChHRVRfVERfREFZUyhzZWxmLT5vZmZzZXQpID09IDAgJiYKKyAgICAgICAgICAgIEdFVF9URF9TRUNPTkRTKHNlbGYtPm9mZnNldCkgPT0gMCAmJgorICAgICAgICAgICAgR0VUX1REX01JQ1JPU0VDT05EUyhzZWxmLT5vZmZzZXQpID09IDApKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcoIlVUQyIpOwogICAgIC8qIE9mZnNldCBpcyBub3JtYWxpemVkLCBzbyBpdCBpcyBuZWdhdGl2ZSBpZiBkYXlzIDwgMCAqLwogICAgIGlmIChHRVRfVERfREFZUyhzZWxmLT5vZmZzZXQpIDwgMCkgewogICAgICAgICBzaWduID0gJy0nOwpAQCAtMzM4Miw3ICszMzgzLDcgQEAKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHRpbWV6b25lX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHRpbWV6b25lX2RvY1tdID0KIFB5RG9jX1NUUigiRml4ZWQgb2Zmc2V0IGZyb20gVVRDIGltcGxlbWVudGF0aW9uIG9mIHR6aW5mby4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RpbWVab25lVHlwZSA9IHsKQEAgLTM2MDcsMjMgKzM2MDgsNTYgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXRpbWVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKK3RpbWVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfVGltZSAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBjaGFyIGJ1ZlsxMDBdOworICAgIGNoYXIgKnRpbWVzcGVjID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsidGltZXNwZWMiLCBOVUxMfTsKICAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIGludCB1cyA9IFRJTUVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIHN0YXRpYyBjaGFyICpzcGVjc1tdWzJdID0geworICAgICAgICB7ImhvdXJzIiwgIiUwMmQifSwKKyAgICAgICAgeyJtaW51dGVzIiwgIiUwMmQ6JTAyZCJ9LAorICAgICAgICB7InNlY29uZHMiLCAiJTAyZDolMDJkOiUwMmQifSwKKyAgICAgICAgeyJtaWxsaXNlY29uZHMiLCAiJTAyZDolMDJkOiUwMmQuJTAzZCJ9LAorICAgICAgICB7Im1pY3Jvc2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZC4lMDZkIn0sCisgICAgfTsKKyAgICBzaXplX3QgZ2l2ZW5fc3BlYzsKIAotICAgIGlmICh1cykKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwMmQ6JTAyZDolMDJkLiUwNmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXMpOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwMmQ6JTAyZDolMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfSE9VUihzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfTUlOVVRFKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9TRUNPTkQoc2VsZikpOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAifHM6aXNvZm9ybWF0Iiwga2V5d29yZHMsICZ0aW1lc3BlYykpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHRpbWVzcGVjID09IE5VTEwgfHwgc3RyY21wKHRpbWVzcGVjLCAiYXV0byIpID09IDApIHsKKyAgICAgICAgaWYgKHVzID09IDApIHsKKyAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChnaXZlbl9zcGVjID0gMDsgZ2l2ZW5fc3BlYyA8IFB5X0FSUkFZX0xFTkdUSChzcGVjcyk7IGdpdmVuX3NwZWMrKykgeworICAgICAgICAgICAgaWYgKHN0cmNtcCh0aW1lc3BlYywgc3BlY3NbZ2l2ZW5fc3BlY11bMF0pID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2l2ZW5fc3BlYyA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG1pbGxpc2Vjb25kcyAqLworICAgICAgICAgICAgICAgICAgICB1cyA9IHVzIC8gMTAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2l2ZW5fc3BlYyA9PSBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biB0aW1lc3BlYyB2YWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KHNwZWNzW2dpdmVuX3NwZWNdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLCBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSwgdXMpOworICAgIH0KIAogICAgIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhSEFTVFpJTkZPKHNlbGYpIHx8IHNlbGYtPnR6aW5mbyA9PSBQeV9Ob25lKQogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMzg0NCw5ICszODc4LDEwIEBACiAKIHN0YXRpYyBQeU1ldGhvZERlZiB0aW1lX21ldGhvZHNbXSA9IHsKIAotICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pdGltZV9pc29mb3JtYXQsICAgICAgICBNRVRIX05PQVJHUywKLSAgICAgUHlEb2NfU1RSKCJSZXR1cm4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgSEg6TU06U1NbLm1tbW1tbV0iCi0gICAgICAgICAgICAgICAiWytISDpNTV0uIil9LAorICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pdGltZV9pc29mb3JtYXQsICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAorICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBbSEhbOk1NWzpTU1subW1tW3V1dV1dXV1dIgorICAgICAgICAgICAgICAgIlsrSEg6TU1dLlxuXG4iCisgICAgICAgICAgICAgICAidGltZXNwZWMgc3BlY2lmaWVzIHdoYXQgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlLlxuIil9LAogCiAgICAgeyJzdHJmdGltZSIsICAgICAgICAoUHlDRnVuY3Rpb24pdGltZV9zdHJmdGltZSwgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiZm9ybWF0IC0+IHN0cmZ0aW1lKCkgc3R5bGUgc3RyaW5nLiIpfSwKQEAgLTM4NzIsNyArMzkwNyw3IEBACiAgICAge05VTEwsICAgICAgTlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIHRpbWVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdGltZV9kb2NbXSA9CiBQeURvY19TVFIoInRpbWUoW2hvdXJbLCBtaW51dGVbLCBzZWNvbmRbLCBtaWNyb3NlY29uZFssIHR6aW5mb11dXV1dKSAtLT4gYSB0aW1lIG9iamVjdFxuXAogXG5cCiBBbGwgYXJndW1lbnRzIGFyZSBvcHRpb25hbC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhbiBpbnN0YW5jZSBvZlxuXApAQCAtNDA4Myw0NCArNDExOCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOwogfQogCi1zdGF0aWMgdGltZV90Ci1fUHlUaW1lX0RvdWJsZVRvVGltZXQoZG91YmxlIHgpCi17Ci0gICAgdGltZV90IHJlc3VsdDsKLSAgICBkb3VibGUgZGlmZjsKLQotICAgIHJlc3VsdCA9ICh0aW1lX3QpeDsKLSAgICAvKiBIb3cgbXVjaCBpbmZvIGRpZCB3ZSBsb3NlPyAgdGltZV90IG1heSBiZSBhbiBpbnRlZ3JhbCBvcgotICAgICAqIGZsb2F0aW5nIHR5cGUsIGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoLiAgSWYgaXQncyBpbnRlZ3JhbCwKLSAgICAgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgQyB0cnVuY2F0ZXMsIHJvdW5kcywgcmV0dXJucyB0aGUgZmxvb3IsCi0gICAgICogZXRjLiAgSWYgd2UgbG9zdCBhIHNlY29uZCBvciBtb3JlLCB0aGUgQyByb3VuZGluZyBpcwotICAgICAqIHVucmVhc29uYWJsZSwgb3IgdGhlIGlucHV0IGp1c3QgZG9lc24ndCBmaXQgaW4gYSB0aW1lX3Q7Ci0gICAgICogY2FsbCBpdCBhbiBlcnJvciByZWdhcmRsZXNzLiAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCBjYXN0IHRvCi0gICAgICogdGltZV90IGNhbiBjYXVzZSBhIEMgZXJyb3IgdG9vLCBidXQgbm90aGluZyB3ZSBjYW4gZG8gdG8KLSAgICAgKiB3b3JtIGFyb3VuZCB0aGF0LgotICAgICAqLwotICAgIGRpZmYgPSB4IC0gKGRvdWJsZSlyZXN1bHQ7Ci0gICAgaWYgKGRpZmYgPD0gLTEuMCB8fCBkaWZmID49IDEuMCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgb3V0IG9mIHJhbmdlIGZvciBwbGF0Zm9ybSB0aW1lX3QiKTsKLSAgICAgICAgcmVzdWx0ID0gKHRpbWVfdCktMTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogUm91bmQgYSBkb3VibGUgdG8gdGhlIG5lYXJlc3QgbG9uZy4gIHx4fCBtdXN0IGJlIHNtYWxsIGVub3VnaCB0byBmaXQKLSAqIGluIGEgQyBsb25nOyB0aGlzIGlzIG5vdCBjaGVja2VkLgotICovCi1zdGF0aWMgZG91YmxlCi1fUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZG91YmxlIHgpCi17Ci0gICAgZG91YmxlIHJvdW5kZWQgPSByb3VuZCh4KTsKLSAgICBpZiAoZmFicyh4LXJvdW5kZWQpID09IDAuNSkKLSAgICAgICAgLyogaGFsZndheSBjYXNlOiByb3VuZCB0byBldmVuICovCi0gICAgICAgIHJvdW5kZWQgPSAyLjAqcm91bmQoeC8yLjApOwotICAgIHJldHVybiByb3VuZGVkOwotfQotCiAvKiBJbnRlcm5hbCBoZWxwZXIuCiAgKiBCdWlsZCBkYXRldGltZSBmcm9tIGEgUHl0aG9uIHRpbWVzdGFtcC4gIFBhc3MgbG9jYWx0aW1lIG9yIGdtdGltZSBmb3IgZiwKICAqIHRvIGNvbnRyb2wgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSB0aW1lc3RhbXAuICBTaW5jZSBhIGRvdWJsZSBkb2Vzbid0CkBAIC00MTI5LDMyICs0MTI2LDE3IEBACiAgKiB0byBnZXQgdGhhdCBtdWNoIHByZWNpc2lvbiAoZS5nLiwgQyB0aW1lKCkgaXNuJ3QgZ29vZCBlbm91Z2gpLgogICovCiBzdGF0aWMgUHlPYmplY3QgKgotZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBkb3VibGUgdGltZXN0YW1wLAorZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoUHlPYmplY3QgKmNscywgVE1fRlVOQyBmLCBQeU9iamVjdCAqdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnR6aW5mbykKIHsKICAgICB0aW1lX3QgdGltZXQ7Ci0gICAgZG91YmxlIGZyYWN0aW9uOwotICAgIGludCB1czsKKyAgICBsb25nIHVzOwogCi0gICAgdGltZXQgPSBfUHlUaW1lX0RvdWJsZVRvVGltZXQodGltZXN0YW1wKTsKLSAgICBpZiAodGltZXQgPT0gKHRpbWVfdCktMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmIChfUHlUaW1lX09iamVjdFRvVGltZXZhbCh0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1ldCwgJnVzLCBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGZyYWN0aW9uID0gdGltZXN0YW1wIC0gKGRvdWJsZSl0aW1ldDsKLSAgICB1cyA9IChpbnQpX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGZyYWN0aW9uICogMWU2KTsKLSAgICBpZiAodXMgPCAwKSB7Ci0gICAgICAgIC8qIFRydW5jYXRpb24gdG93YXJkcyB6ZXJvIGlzIG5vdCB3aGF0IHdlIHdhbnRlZAotICAgICAgICAgICBmb3IgbmVnYXRpdmUgbnVtYmVycyAoUHl0aG9uJ3MgbW9kIHNlbWFudGljcykgKi8KLSAgICAgICAgdGltZXQgLT0gMTsKLSAgICAgICAgdXMgKz0gMTAwMDAwMDsKLSAgICB9Ci0gICAgLyogSWYgdGltZXN0YW1wIGlzIGxlc3MgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGEKLSAgICAgKiBmdWxsIHNlY29uZCwgcm91bmQgdXAuIE90aGVyd2lzZSwgVmFsdWVFcnJvcnMgYXJlIHJhaXNlZAotICAgICAqIGZvciBzb21lIGZsb2F0cy4gKi8KLSAgICBpZiAodXMgPT0gMTAwMDAwMCkgewotICAgICAgICB0aW1ldCArPSAxOwotICAgICAgICB1cyA9IDA7Ci0gICAgfQotICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCB1cywgdHppbmZvKTsKKworICAgIHJldHVybiBkYXRldGltZV9mcm9tX3RpbWV0X2FuZF91cyhjbHMsIGYsIHRpbWV0LCAoaW50KXVzLCB0emluZm8pOwogfQogCiAvKiBJbnRlcm5hbCBoZWxwZXIuCkBAIC00MjA1LDEwICs0MTg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eik7CiAgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0eiAhPSBQeV9Ob25lKSB7CiAgICAgICAgIC8qIENvbnZlcnQgVVRDIHRvIHR6aW5mbydzIHpvbmUuICovCi0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZjsKLQotICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0eiwgJlB5SWRfZnJvbXV0YywgIk8iLCBzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0eiwgJlB5SWRfZnJvbXV0YywgIk4iLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00MjI3LDExICs0MjA2LDExIEBACiBkYXRldGltZV9mcm9tdGltZXN0YW1wKFB5T2JqZWN0ICpjbHMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgUHlPYmplY3QgKnNlbGY7Ci0gICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqdGltZXN0YW1wOwogICAgIFB5T2JqZWN0ICp0emluZm8gPSBQeV9Ob25lOwogICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0aW1lc3RhbXAiLCAidHoiLCBOVUxMfTsKIAotICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgImR8Tzpmcm9tdGltZXN0YW1wIiwKKyAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPfE86ZnJvbXRpbWVzdGFtcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzLCAmdGltZXN0YW1wLCAmdHppbmZvKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGNoZWNrX3R6aW5mb19zdWJjbGFzcyh0emluZm8pIDwgMCkKQEAgLTQyNDMsMTAgKzQyMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm8pOwogICAgIGlmIChzZWxmICE9IE5VTEwgJiYgdHppbmZvICE9IFB5X05vbmUpIHsKICAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCi0gICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6aW5mbywgJlB5SWRfZnJvbXV0YywgIk8iLCBzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBzZWxmID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZCh0emluZm8sICZQeUlkX2Zyb211dGMsICJOIiwgc2VsZik7CiAgICAgfQogICAgIHJldHVybiBzZWxmOwogfQpAQCAtNDI1NSwxMCArNDIzMSwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGRhdGV0aW1lX3V0Y2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgZG91YmxlIHRpbWVzdGFtcDsKKyAgICBQeU9iamVjdCAqdGltZXN0YW1wOwogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCi0gICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgImQ6dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQorICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOnV0Y2Zyb210aW1lc3RhbXAiLCAmdGltZXN0YW1wKSkKICAgICAgICAgcmVzdWx0ID0gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAoY2xzLCBnbXRpbWUsIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ0NjksOSArNDQ0NSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAgICAgICAgIGlmIChvZmZkaWZmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWx0YV9zdWJ0cmFjdChyZXN1bHQsIG9mZmRpZmYpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0ZW1wKTsKKyAgICAgICAgICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBkZWx0YV9zdWJ0cmFjdChyZXN1bHQsIG9mZmRpZmYpKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2ZmZGlmZik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ1MzYsMjUgKzQ1MTAsNTUgQEAKIGRhdGV0aW1lX2lzb2Zvcm1hdChQeURhdGVUaW1lX0RhdGVUaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIGludCBzZXAgPSAnVCc7Ci0gICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InNlcCIsIE5VTEx9OworICAgIGNoYXIgKnRpbWVzcGVjID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsic2VwIiwgInRpbWVzcGVjIiwgTlVMTH07CiAgICAgY2hhciBidWZmZXJbMTAwXTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogICAgIGludCB1cyA9IERBVEVfR0VUX01JQ1JPU0VDT05EKHNlbGYpOworICAgIHN0YXRpYyBjaGFyICpzcGVjc1tdWzJdID0geworICAgICAgICB7ImhvdXJzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkIn0sCisgICAgICAgIHsibWludXRlcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkIn0sCisgICAgICAgIHsic2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQifSwKKyAgICAgICAgeyJtaWxsaXNlY29uZHMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwM2QifSwKKyAgICAgICAgeyJtaWNyb3NlY29uZHMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwNmQifSwKKyAgICB9OworICAgIHNpemVfdCBnaXZlbl9zcGVjOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Qzppc29mb3JtYXQiLCBrZXl3b3JkcywgJnNlcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8Q3M6aXNvZm9ybWF0Iiwga2V5d29yZHMsICZzZXAsICZ0aW1lc3BlYykpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICh1cykKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZC4lMDZkIiwKKworICAgIGlmICh0aW1lc3BlYyA9PSBOVUxMIHx8IHN0cmNtcCh0aW1lc3BlYywgImF1dG8iKSA9PSAwKSB7CisgICAgICAgIGlmICh1cyA9PSAwKSB7CisgICAgICAgICAgICAvKiBzZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIG1pY3Jvc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoZ2l2ZW5fc3BlYyA9IDA7IGdpdmVuX3NwZWMgPCBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpOyBnaXZlbl9zcGVjKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAodGltZXNwZWMsIHNwZWNzW2dpdmVuX3NwZWNdWzBdKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGdpdmVuX3NwZWMgPT0gMykgeworICAgICAgICAgICAgICAgICAgICB1cyA9IHVzIC8gMTAwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2l2ZW5fc3BlYyA9PSBQeV9BUlJBWV9MRU5HVEgoc3BlY3MpKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biB0aW1lc3BlYyB2YWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KHNwZWNzW2dpdmVuX3NwZWNdWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLCAoaW50KXNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZiksIHVzKTsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfWUVBUihzZWxmKSwgR0VUX01PTlRIKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfREFZKHNlbGYpLCAoaW50KXNlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFURV9HRVRfSE9VUihzZWxmKSwgREFURV9HRVRfTUlOVVRFKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9TRUNPTkQoc2VsZikpOworICAgIH0KIAogICAgIGlmICghcmVzdWx0IHx8ICFIQVNUWklORk8oc2VsZikpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC00NzY2LDcgKzQ3NzAsNyBAQAogICAgIGlmIChzZWNvbmRzID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgUHlfREVDUkVGKGRlbHRhKTsKLSAgICB0aW1lc3RhbXAgPSBQeUxvbmdfQXNMb25nKHNlY29uZHMpOworICAgIHRpbWVzdGFtcCA9IF9QeUxvbmdfQXNUaW1lX3Qoc2Vjb25kcyk7CiAgICAgUHlfREVDUkVGKHNlY29uZHMpOwogICAgIGlmICh0aW1lc3RhbXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01MDkzLDkgKzUwOTcsMTIgQEAKIAogICAgIHsiaXNvZm9ybWF0IiwgICAoUHlDRnVuY3Rpb24pZGF0ZXRpbWVfaXNvZm9ybWF0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICBQeURvY19TVFIoIltzZXBdIC0+IHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsICIKLSAgICAgICAgICAgICAgICJZWVlZLU1NLUREVEhIOk1NOlNTWy5tbW1tbW1dWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJZWVlZLU1NLUREVFtISFs6TU1bOlNTWy5tbW1bdXV1XV1dXV1bK0hIOk1NXS5cbiIKICAgICAgICAgICAgICAgICJzZXAgaXMgdXNlZCB0byBzZXBhcmF0ZSB0aGUgeWVhciBmcm9tIHRoZSB0aW1lLCBhbmQgIgotICAgICAgICAgICAgICAgImRlZmF1bHRzIHRvICdUJy4iKX0sCisgICAgICAgICAgICAgICAiZGVmYXVsdHMgdG8gJ1QnLlxuIgorICAgICAgICAgICAgICAgInRpbWVzcGVjIHNwZWNpZmllcyB3aGF0IGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSIKKyAgICAgICAgICAgICAgICIgKGFsbG93ZWQgdmFsdWVzIGFyZSAnYXV0bycsICdob3VycycsICdtaW51dGVzJywgJ3NlY29uZHMnLCIKKyAgICAgICAgICAgICAgICIgJ21pbGxpc2Vjb25kcycsIGFuZCAnbWljcm9zZWNvbmRzJykuXG4iKX0sCiAKICAgICB7InV0Y29mZnNldCIsICAgICAgIChQeUNGdW5jdGlvbilkYXRldGltZV91dGNvZmZzZXQsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIlJldHVybiBzZWxmLnR6aW5mby51dGNvZmZzZXQoc2VsZikuIil9LApAQCAtNTExOCw3ICs1MTI1LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgZGF0ZXRpbWVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZGF0ZXRpbWVfZG9jW10gPQogUHlEb2NfU1RSKCJkYXRldGltZSh5ZWFyLCBtb250aCwgZGF5WywgaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWyx0emluZm9dXV1dXSlcblwKIFxuXAogVGhlIHllYXIsIG1vbnRoIGFuZCBkYXkgYXJndW1lbnRzIGFyZSByZXF1aXJlZC4gdHppbmZvIG1heSBiZSBOb25lLCBvciBhblxuXApAQCAtNTM4MiwxOSArNTM4OSwxOSBAQAogICAgIC8qIEEgNC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZCBnZXQgZnJvbQogICAgICAqIHBhc3RpbmcgdG9nZXRoZXIgNCBzaW5nbGUgeWVhcnMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJNFkgPT0gNCAqIDM2NSArIDEpOworICAgIFB5X0JVSUxEX0FTU0VSVChESTRZID09IDQgKiAzNjUgKyAxKTsKICAgICBhc3NlcnQoREk0WSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQrMSkpOwogCiAgICAgLyogU2ltaWxhcmx5LCBhIDQwMC15ZWFyIGN5Y2xlIGhhcyBhbiBleHRyYSBsZWFwIGRheSBvdmVyIHdoYXQgd2UnZAogICAgICAqIGdldCBmcm9tIHBhc3RpbmcgdG9nZXRoZXIgNCAxMDAteWVhciBjeWNsZXMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJNDAwWSA9PSA0ICogREkxMDBZICsgMSk7CiAgICAgYXNzZXJ0KERJNDAwWSA9PSBkYXlzX2JlZm9yZV95ZWFyKDQwMCsxKSk7CiAKICAgICAvKiBPVE9ILCBhIDEwMC15ZWFyIGN5Y2xlIGhhcyBvbmUgZmV3ZXIgbGVhcCBkYXkgdGhhbiB3ZSdkIGdldCBmcm9tCiAgICAgICogcGFzdGluZyB0b2dldGhlciAyNSA0LXllYXIgY3ljbGVzLgogICAgICAqLwotICAgIGFzc2VydChESTEwMFkgPT0gMjUgKiBESTRZIC0gMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKICAgICBhc3NlcnQoREkxMDBZID09IGRheXNfYmVmb3JlX3llYXIoMTAwKzEpKTsKIAogICAgIG9uZSA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RibW1vZHVsZS5jIGIvTW9kdWxlcy9fZGJtbW9kdWxlLmMKaW5kZXggMDI4OTllNC4uNWU3ZWMxYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGJtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZGJtbW9kdWxlLmMKQEAgLTE0LDE2ICsxNCwxNiBAQAogICovCiAjaWYgZGVmaW5lZChIQVZFX05EQk1fSCkKICNpbmNsdWRlIDxuZGJtLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkdOVSBnZGJtIjsgIC8qIEVNWCBwb3J0IG9mIEdEQk0gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkdOVSBnZGJtIjsgIC8qIEVNWCBwb3J0IG9mIEdEQk0gKi8KICNlbGlmIGRlZmluZWQoSEFWRV9HREJNX05EQk1fSCkKICNpbmNsdWRlIDxnZGJtL25kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOwogI2VsaWYgZGVmaW5lZChIQVZFX0dEQk1fREFTSF9OREJNX0gpCiAjaW5jbHVkZSA8Z2RibS1uZGJtLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkdOVSBnZGJtIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkdOVSBnZGJtIjsKICNlbGlmIGRlZmluZWQoSEFWRV9CRVJLREJfSCkKICNpbmNsdWRlIDxkYi5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJCZXJrZWxleSBEQiI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJCZXJrZWxleSBEQiI7CiAjZWxzZQogI2Vycm9yICJObyBuZGJtLmggYXZhaWxhYmxlISIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCmluZGV4IDIyMDUzYjQuLmRkMzNmOTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKQEAgLTM2LDcgKzM2LDYgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgImRvY3N0cmluZ3MuaCIKLSNpbmNsdWRlICJtZW1vcnkuaCIKIAogCiAjaWYgIWRlZmluZWQoTVBEX1ZFUlNJT05fSEVYKSB8fCBNUERfVkVSU0lPTl9IRVggPCAweDAyMDQwMTAwCkBAIC0zMzg2LDYgKzMzODUsMTA2IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKSBweWxvbmc7CiB9CiAKKy8qIENvbnZlcnQgYSBEZWNpbWFsIHRvIGl0cyBleGFjdCBpbnRlZ2VyIHJhdGlvIHJlcHJlc2VudGF0aW9uLiAqLworc3RhdGljIFB5T2JqZWN0ICoKK2RlY19hc19pbnRlZ2VyX3JhdGlvKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncyBVTlVTRUQpCit7CisgICAgUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXhwb25lbnQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICp0bXA7CisgICAgbXBkX3NzaXplX3QgZXhwOworICAgIFB5T2JqZWN0ICpjb250ZXh0OworICAgIHVpbnQzMl90IHN0YXR1cyA9IDA7CisgICAgUHlOdW1iZXJNZXRob2RzICpsb25nX21ldGhvZHMgPSBQeUxvbmdfVHlwZS50cF9hc19udW1iZXI7CisKKyAgICBpZiAobXBkX2lzc3BlY2lhbChNUEQoc2VsZikpKSB7CisgICAgICAgIGlmIChtcGRfaXNuYW4oTVBEKHNlbGYpKSkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIENVUlJFTlRfQ09OVEVYVChjb250ZXh0KTsKKworICAgIHRtcCA9IGRlY19hbGxvYygpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIW1wZF9xY29weShNUEQodG1wKSwgTVBEKHNlbGYpLCAmc3RhdHVzKSkgeworICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXhwID0gbXBkX2lzemVybyhNUEQodG1wKSkgPyAwIDogTVBEKHRtcCktPmV4cDsKKyAgICBNUEQodG1wKS0+ZXhwID0gMDsKKworICAgIC8qIGNvbnRleHQgYW5kIHJvdW5kaW5nIGFyZSB1bnVzZWQgaGVyZTogdGhlIGNvbnZlcnNpb24gaXMgZXhhY3QgKi8KKyAgICBudW1lcmF0b3IgPSBkZWNfYXNfbG9uZyh0bXAsIGNvbnRleHQsIE1QRF9ST1VORF9GTE9PUik7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZXhwb25lbnQgPSBQeUxvbmdfRnJvbVNzaXplX3QoZXhwIDwgMCA/IC1leHAgOiBleHApOworICAgIGlmIChleHBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgdG1wID0gUHlMb25nX0Zyb21Mb25nKDEwKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBQeV9TRVRSRUYoZXhwb25lbnQsIGxvbmdfbWV0aG9kcy0+bmJfcG93ZXIodG1wLCBleHBvbmVudCwgUHlfTm9uZSkpOworICAgIFB5X0RFQ1JFRih0bXApOworICAgIGlmIChleHBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGV4cCA+PSAwKSB7CisgICAgICAgIFB5X1NFVFJFRihudW1lcmF0b3IsIGxvbmdfbWV0aG9kcy0+bmJfbXVsdGlwbHkobnVtZXJhdG9yLCBleHBvbmVudCkpOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgICAgIGlmIChkZW5vbWluYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZW5vbWluYXRvciA9IGV4cG9uZW50OworICAgICAgICBleHBvbmVudCA9IE5VTEw7CisgICAgICAgIHRtcCA9IF9QeUxvbmdfR0NEKG51bWVyYXRvciwgZGVub21pbmF0b3IpOworICAgICAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwgbG9uZ19tZXRob2RzLT5uYl9mbG9vcl9kaXZpZGUobnVtZXJhdG9yLCB0bXApKTsKKyAgICAgICAgUHlfU0VUUkVGKGRlbm9taW5hdG9yLCBsb25nX21ldGhvZHMtPm5iX2Zsb29yX2RpdmlkZShkZW5vbWluYXRvciwgdG1wKSk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwgfHwgZGVub21pbmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IFB5VHVwbGVfUGFjaygyLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGV4cG9uZW50KTsKKyAgICBQeV9YREVDUkVGKGRlbm9taW5hdG9yKTsKKyAgICBQeV9YREVDUkVGKG51bWVyYXRvcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIFB5RGVjX1RvSW50ZWdyYWxWYWx1ZShQeU9iamVjdCAqZGVjLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CkBAIC00Njk0LDYgKzQ3OTMsNyBAQAogICAvKiBNaXNjZWxsYW5lb3VzICovCiAgIHsgImZyb21fZmxvYXQiLCBkZWNfZnJvbV9mbG9hdCwgTUVUSF9PfE1FVEhfQ0xBU1MsIGRvY19mcm9tX2Zsb2F0IH0sCiAgIHsgImFzX3R1cGxlIiwgUHlEZWNfQXNUdXBsZSwgTUVUSF9OT0FSR1MsIGRvY19hc190dXBsZSB9LAorICB7ICJhc19pbnRlZ2VyX3JhdGlvIiwgZGVjX2FzX2ludGVnZXJfcmF0aW8sIE1FVEhfTk9BUkdTLCBkb2NfYXNfaW50ZWdlcl9yYXRpbyB9LAogCiAgIC8qIFNwZWNpYWwgbWV0aG9kcyAqLwogICB7ICJfX2NvcHlfXyIsIGRlY19jb3B5LCBNRVRIX05PQVJHUywgTlVMTCB9LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9kb2NzdHJpbmdzLmggYi9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaAppbmRleCA3MTAyOWE5Li5mN2ZkNmU3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaAorKysgYi9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaApAQCAtNzAsNiArNzAsMTUgQEAKIFJldHVybiBhIHR1cGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXIuXG5cCiBcbiIpOwogCitQeURvY19TVFJWQVIoZG9jX2FzX2ludGVnZXJfcmF0aW8sCisiYXNfaW50ZWdlcl9yYXRpbygkc2VsZiwgLylcbi0tXG5cblwKK0RlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpIC0+IChpbnQsIGludClcblwKK1xuXAorUmV0dXJuIGEgcGFpciBvZiBpbnRlZ2Vycywgd2hvc2UgcmF0aW8gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgb3JpZ2luYWxcblwKK0RlY2ltYWwgYW5kIHdpdGggYSBwb3NpdGl2ZSBkZW5vbWluYXRvci4gVGhlIHJhdGlvIGlzIGluIGxvd2VzdCB0ZXJtcy5cblwKK1JhaXNlIE92ZXJmbG93RXJyb3Igb24gaW5maW5pdGllcyBhbmQgYSBWYWx1ZUVycm9yIG9uIE5hTnMuXG5cCitcbiIpOworCiBQeURvY19TVFJWQVIoZG9jX2Nhbm9uaWNhbCwKICJjYW5vbmljYWwoJHNlbGYsIC8pXG4tLVxuXG5cCiBSZXR1cm4gdGhlIGNhbm9uaWNhbCBlbmNvZGluZyBvZiB0aGUgYXJndW1lbnQuICBDdXJyZW50bHksIHRoZSBlbmNvZGluZ1xuXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvYmFzZWFyaXRoLmMKaW5kZXggMzVkZTZiOC4uZGZlMTUyMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAiYmFzZWFyaXRoLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYwppbmRleCBhNDVhNDI5Li4zYWFkZmIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2lvLmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jCkBAIC0zNyw3ICszNyw2IEBACiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAjaW5jbHVkZSAiYml0cy5oIgogI2luY2x1ZGUgImNvbnN0YW50cy5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgogI2luY2x1ZGUgImlvLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5jCmluZGV4IDBmNDFmZTUuLmE4NTRlMDkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYwpAQCAtMzAsNyArMzAsMTIgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgorI2luY2x1ZGUgIm1wYWxsb2MuaCIKKworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MjMyKQorI2VuZGlmCiAKIAogLyogR3VhcmFudGVlZCBtaW5pbXVtIGFsbG9jYXRpb24gZm9yIGEgY29lZmZpY2llbnQuIE1heSBiZSBjaGFuZ2VkIG9uY2UKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmggYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wYWxsb2MuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBNb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5oCnJlbmFtZSB0byBNb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wYWxsb2MuaAppbmRleCA5Yzk4ZDFhLi5lZmQ3MTE5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCkBAIC0yNiw4ICsyNiw4IEBACiAgKi8KIAogCi0jaWZuZGVmIE1FTU9SWV9ICi0jZGVmaW5lIE1FTU9SWV9ICisjaWZuZGVmIE1QQUxMT0NfSAorI2RlZmluZSBNUEFMTE9DX0gKIAogCiAjaW5jbHVkZSAibXBkZWNpbWFsLmgiCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuYwppbmRleCA1OTNmOWY1Li4zMjhhYjkyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJiaXRzLmgiCiAjaW5jbHVkZSAiY29udm9sdXRlLmgiCiAjaW5jbHVkZSAiY3J0LmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAibXBhbGxvYy5oIgogI2luY2x1ZGUgInR5cGVhcml0aC5oIgogI2luY2x1ZGUgInVtb2Rhcml0aC5oIgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaAppbmRleCA1Y2E3NDEzLi41NmU0ODg3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgKQEAgLTEwOCw5ICsxMDgsOSBAQAogCiAjZGVmaW5lIE1QRF9NQUpPUl9WRVJTSU9OIDIKICNkZWZpbmUgTVBEX01JTk9SX1ZFUlNJT04gNAotI2RlZmluZSBNUERfTUlDUk9fVkVSU0lPTiAxCisjZGVmaW5lIE1QRF9NSUNST19WRVJTSU9OIDIKIAotI2RlZmluZSBNUERfVkVSU0lPTiAiMi40LjEiCisjZGVmaW5lIE1QRF9WRVJTSU9OICIyLjQuMiIKIAogI2RlZmluZSBNUERfVkVSU0lPTl9IRVggKChNUERfTUFKT1JfVkVSU0lPTiA8PCAyNCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKE1QRF9NSU5PUl9WRVJTSU9OIDw8IDE2KSB8IFwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkgYi9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CmluZGV4IGFiN2Q1YmQuLmY5MDc1MzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQpAQCAtNTAsOCArNTAsOCBAQAogICAgICAgICAnX19hYnNfXycsICdfX2Jvb2xfXycsICdfX2NlaWxfXycsICdfX2NvbXBsZXhfXycsICdfX2NvcHlfXycsCiAgICAgICAgICdfX2Zsb29yX18nLCAnX19mbG9hdF9fJywgJ19faGFzaF9fJywgJ19faW50X18nLCAnX19uZWdfXycsCiAgICAgICAgICdfX3Bvc19fJywgJ19fcmVkdWNlX18nLCAnX19yZXByX18nLCAnX19zdHJfXycsICdfX3RydW5jX18nLAotICAgICAgICAnYWRqdXN0ZWQnLCAnYXNfdHVwbGUnLCAnY2Fub25pY2FsJywgJ2Nvbmp1Z2F0ZScsICdjb3B5X2FicycsCi0gICAgICAgICdjb3B5X25lZ2F0ZScsICdpc19jYW5vbmljYWwnLCAnaXNfZmluaXRlJywgJ2lzX2luZmluaXRlJywKKyAgICAgICAgJ2FkanVzdGVkJywgJ2FzX2ludGVnZXJfcmF0aW8nLCAnYXNfdHVwbGUnLCAnY2Fub25pY2FsJywgJ2Nvbmp1Z2F0ZScsCisgICAgICAgICdjb3B5X2FicycsICdjb3B5X25lZ2F0ZScsICdpc19jYW5vbmljYWwnLCAnaXNfZmluaXRlJywgJ2lzX2luZmluaXRlJywKICAgICAgICAgJ2lzX25hbicsICdpc19xbmFuJywgJ2lzX3NpZ25lZCcsICdpc19zbmFuJywgJ2lzX3plcm8nLCAncmFkaXgnCiAgICAgKSwKICAgICAjIFVuYXJ5IHdpdGggb3B0aW9uYWwgY29udGV4dDoKQEAgLTEyOCw3ICsxMjgsNyBAQAogIyBGdW5jdGlvbnMgdGhhdCByZXF1aXJlIGEgcmVzdHJpY3RlZCBleHBvbmVudCByYW5nZSBmb3IgcmVhc29uYWJsZSBydW50aW1lcy4KIFVuYXJ5UmVzdHJpY3RlZCA9IFsKICAgJ19fY2VpbF9fJywgJ19fZmxvb3JfXycsICdfX2ludF9fJywgJ19fdHJ1bmNfXycsCi0gICd0b19pbnRlZ3JhbCcsICd0b19pbnRlZ3JhbF92YWx1ZScKKyAgJ2FzX2ludGVnZXJfcmF0aW8nLCAndG9faW50ZWdyYWwnLCAndG9faW50ZWdyYWxfdmFsdWUnCiBdCiAKIEJpbmFyeVJlc3RyaWN0ZWQgPSBbJ19fcm91bmRfXyddCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwppbmRleCA4NWZmY2EyLi5iMzJmMmFkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCisrKyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKQEAgLTEyOSwzMCArMTI5LDYgQEAKIC8qIGhlbHBlcnMgKi8KIAogTE9DQUwoUHlPYmplY3QqKQotZGVlcGNvcHkoUHlPYmplY3QqIG9iamVjdCwgUHlPYmplY3QqIG1lbW8pCi17Ci0gICAgLyogZG8gYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIG9iamVjdCAqLwotICAgIFB5T2JqZWN0KiBhcmdzOwotICAgIFB5T2JqZWN0KiByZXN1bHQ7Ci0gICAgZWxlbWVudHRyZWVzdGF0ZSAqc3QgPSBFVF9TVEFURV9HTE9CQUw7Ci0KLSAgICBpZiAoIXN0LT5kZWVwY29weV9vYmopIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKAotICAgICAgICAgICAgUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgImRlZXBjb3B5IGhlbHBlciBub3QgZm91bmQiCi0gICAgICAgICAgICApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDIsIG9iamVjdCwgbWVtbyk7Ci0gICAgaWYgKCFhcmdzKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KHN0LT5kZWVwY29weV9vYmosIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1MT0NBTChQeU9iamVjdCopCiBsaXN0X2pvaW4oUHlPYmplY3QqIGxpc3QpCiB7CiAgICAgLyogam9pbiBsaXN0IGVsZW1lbnRzIChkZXN0cm95aW5nIHRoZSBsaXN0IGluIHRoZSBwcm9jZXNzKSAqLwpAQCAtNDIwLDEwICszOTYsOCBAQAogICAgIFB5X1hERUNSRUYoYXR0cmliKTsKIAogICAgIC8qIFJlcGxhY2UgdGhlIG9iamVjdHMgYWxyZWFkeSBwb2ludGVkIHRvIGJ5IHRhZywgdGV4dCBhbmQgdGFpbC4gKi8KLSAgICB0bXAgPSBzZWxmX2VsZW0tPnRhZzsKICAgICBQeV9JTkNSRUYodGFnKTsKLSAgICBzZWxmX2VsZW0tPnRhZyA9IHRhZzsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKHNlbGZfZWxlbS0+dGFnLCB0YWcpOwogCiAgICAgdG1wID0gc2VsZl9lbGVtLT50ZXh0OwogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKQEAgLTc0OCw2ICs3MjIsOSBAQAogICAgIHJldHVybiAoUHlPYmplY3QqKSBlbGVtZW50OwogfQogCisvKiBIZWxwZXIgZm9yIGEgZGVlcCBjb3B5LiAqLworTE9DQUwoUHlPYmplY3QgKikgZGVlcGNvcHkoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKIC8qW2NsaW5pYyBpbnB1dF0KIF9lbGVtZW50dHJlZS5FbGVtZW50Ll9fZGVlcGNvcHlfXwogCkBAIC04MzgsNiArODE1LDU3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK0xPQ0FMKFB5T2JqZWN0ICopCitkZWVwY29weShQeU9iamVjdCAqb2JqZWN0LCBQeU9iamVjdCAqbWVtbykKK3sKKyAgICAvKiBkbyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICovCisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBlbGVtZW50dHJlZXN0YXRlICpzdDsKKworICAgIC8qIEZhc3QgcGF0aHMgKi8KKyAgICBpZiAob2JqZWN0ID09IFB5X05vbmUgfHwgUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICBQeV9JTkNSRUYob2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIG9iamVjdDsKKyAgICB9CisKKyAgICBpZiAoUHlfUkVGQ05UKG9iamVjdCkgPT0gMSkgeworICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICAgICAgUHlPYmplY3QgKmtleSwgKnZhbHVlOworICAgICAgICAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgICAgICAgICAgaW50IHNpbXBsZSA9IDE7CisgICAgICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQob2JqZWN0LCAmcG9zLCAma2V5LCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8ICFQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2ltcGxlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbXBsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlEaWN0X0NvcHkob2JqZWN0KTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCB0byBnZW5lcmFsIGNhc2UgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChFbGVtZW50X0NoZWNrRXhhY3Qob2JqZWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIF9lbGVtZW50dHJlZV9FbGVtZW50X19fZGVlcGNvcHlfXygoRWxlbWVudE9iamVjdCAqKW9iamVjdCwgbWVtbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZW5lcmFsIGNhc2UgKi8KKyAgICBzdCA9IEVUX1NUQVRFX0dMT0JBTDsKKyAgICBpZiAoIXN0LT5kZWVwY29weV9vYmopIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWVwY29weSBoZWxwZXIgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgb2JqZWN0LCBtZW1vKTsKKyAgICBpZiAoIWFyZ3MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3QtPmRlZXBjb3B5X29iaiwgYXJncyk7CisgICAgUHlfREVDUkVGKGFyZ3MpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLkVsZW1lbnQuX19zaXplb2ZfXyAtPiBQeV9zc2l6ZV90CiAKQEAgLTE4OTIsOTIgKzE5MjAsOTAgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotZWxlbWVudF9nZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaikKK2VsZW1lbnRfdGFnX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIFB5T2JqZWN0KiByZXM7Ci0gICAgY2hhciAqbmFtZSA9ICIiOwotCi0gICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lb2JqKSkKLSAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZW9iaik7Ci0KLSAgICBpZiAobmFtZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIGhhbmRsZSBjb21tb24gYXR0cmlidXRlcyBmaXJzdCAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhZyIpID09IDApIHsKLSAgICAgICAgcmVzID0gc2VsZi0+dGFnOwotICAgICAgICBQeV9JTkNSRUYocmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKLSAgICAgICAgUHlfWElOQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIC8qIG1ldGhvZHMgKi8KLSAgICByZXMgPSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cigoUHlPYmplY3QqKSBzZWxmLCBuYW1lb2JqKTsKLSAgICBpZiAocmVzKQotICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgLyogbGVzcyBjb21tb24gYXR0cmlidXRlcyAqLwotICAgIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJlcyA9IGVsZW1lbnRfZ2V0X3RhaWwoc2VsZik7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImF0dHJpYiIpID09IDApIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKCFzZWxmLT5leHRyYSkgewotICAgICAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfYXR0cmliKHNlbGYpOwotICAgIH0KLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLQorICAgIFB5T2JqZWN0ICpyZXMgPSBzZWxmLT50YWc7CiAgICAgUHlfSU5DUkVGKHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludAotZWxlbWVudF9zZXRhdHRybyhFbGVtZW50T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZW9iaiwgUHlPYmplY3QqIHZhbHVlKQorc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF90ZXh0X2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQogewotICAgIGNoYXIgKm5hbWUgPSAiIjsKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGV4dChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KIAotICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJjYW4ndCBkZWxldGUgYXR0cmlidXRlIik7Ci0gICAgICAgIHJldHVybiAtMTsKK3N0YXRpYyBQeU9iamVjdCoKK2VsZW1lbnRfdGFpbF9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBQeU9iamVjdCAqcmVzID0gZWxlbWVudF9nZXRfdGFpbChzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF9hdHRyaWJfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgUHlPYmplY3QgKnJlczsKKyAgICBpZiAoIXNlbGYtPmV4dHJhKSB7CisgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZW9iaikpCi0gICAgICAgIG5hbWUgPSBfUHlVbmljb2RlX0FzU3RyaW5nKG5hbWVvYmopOwotICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICByZXMgPSBlbGVtZW50X2dldF9hdHRyaWIoc2VsZik7CisgICAgUHlfWElOQ1JFRihyZXMpOworICAgIHJldHVybiByZXM7Cit9CiAKLSAgICBpZiAoc3RyY21wKG5hbWUsICJ0YWciKSA9PSAwKSB7Ci0gICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgIFB5X1NFVFJFRihzZWxmLT50YWcsIHZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGV4dCIpID09IDApIHsKLSAgICAgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRleHQpKTsKLSAgICAgICAgc2VsZi0+dGV4dCA9IHZhbHVlOwotICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dGV4dCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgInRhaWwiKSA9PSAwKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50YWlsKSk7Ci0gICAgICAgIHNlbGYtPnRhaWwgPSB2YWx1ZTsKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYtPnRhaWwpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJhdHRyaWIiKSA9PSAwKSB7Ci0gICAgICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKLSAgICAgICAgICAgIGlmIChjcmVhdGVfZXh0cmEoc2VsZiwgTlVMTCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgICAgICBQeV9TRVRSRUYoc2VsZi0+ZXh0cmEtPmF0dHJpYiwgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICJDYW4ndCBzZXQgYXJiaXRyYXJ5IGF0dHJpYnV0ZXMgb24gRWxlbWVudCIpOwotICAgICAgICByZXR1cm4gLTE7CisvKiBtYWNybyBmb3Igc2V0dGVyIHZhbGlkYXRpb24gKi8KKyNkZWZpbmUgX1ZBTElEQVRFX0FUVFJfVkFMVUUoVikgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChWKSA9PSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeUVycl9TZXRTdHJpbmcoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5RXhjX0F0dHJpYnV0ZUVycm9yLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiY2FuJ3QgZGVsZXRlIGVsZW1lbnQgYXR0cmlidXRlIik7ICAgICAgXAorICAgICAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGFnX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPnRhZywgdmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X3RleHRfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGV4dCkpOworICAgIHNlbGYtPnRleHQgPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF90YWlsX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRhaWwpKTsKKyAgICBzZWxmLT50YWlsID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfYXR0cmliX3NldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNsb3N1cmUpCit7CisgICAgX1ZBTElEQVRFX0FUVFJfVkFMVUUodmFsdWUpOworICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKKyAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIFB5X0lOQ1JFRih2YWx1ZSk7CisgICAgUHlfU0VUUkVGKHNlbGYtPmV4dHJhLT5hdHRyaWIsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTk5NywyMiArMjAyMywyMiBAQAogICogcHJlLW9yZGVyIHRyYXZlcnNhbC4gVG8ga2VlcCB0cmFjayBvZiB3aGljaCBzdWItZWxlbWVudCBzaG91bGQgYmUgcmV0dXJuZWQKICAqIG5leHQsIGEgc3RhY2sgb2YgcGFyZW50cyBpcyBtYWludGFpbmVkLiBUaGlzIGlzIGEgc3RhbmRhcmQgc3RhY2stYmFzZWQKICAqIGl0ZXJhdGl2ZSBwcmUtb3JkZXIgdHJhdmVyc2FsIG9mIGEgdHJlZS4KLSAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgc2luZ2xlLWxpbmtlZCBsaXN0IHN0YXJ0aW5nIGF0IHBhcmVudF9zdGFjay4KLSAqIEVhY2ggc3RhY2sgbm9kZSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKKyAqIFRoZSBzdGFjayBpcyBtYW5hZ2VkIHVzaW5nIGEgY29udGludW91cyBhcnJheS4KKyAqIEVhY2ggc3RhY2sgaXRlbSBjb250YWlucyB0aGUgc2F2ZWQgcGFyZW50IHRvIHdoaWNoIHdlIHNob3VsZCByZXR1cm4gYWZ0ZXIKICAqIHRoZSBjdXJyZW50IG9uZSBpcyBleGhhdXN0ZWQsIGFuZCB0aGUgbmV4dCBjaGlsZCB0byBleGFtaW5lIGluIHRoYXQgcGFyZW50LgogICovCiB0eXBlZGVmIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgewogICAgIEVsZW1lbnRPYmplY3QgKnBhcmVudDsKICAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4OwotICAgIHN0cnVjdCBQYXJlbnRMb2NhdG9yX3QgKm5leHQ7CiB9IFBhcmVudExvY2F0b3I7CiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUGFyZW50TG9jYXRvciAqcGFyZW50X3N0YWNrOworICAgIFB5X3NzaXplX3QgcGFyZW50X3N0YWNrX3VzZWQ7CisgICAgUHlfc3NpemVfdCBwYXJlbnRfc3RhY2tfc2l6ZTsKICAgICBFbGVtZW50T2JqZWN0ICpyb290X2VsZW1lbnQ7CiAgICAgUHlPYmplY3QgKnNvdWdodF90YWc7Ci0gICAgaW50IHJvb3RfZG9uZTsKICAgICBpbnQgZ2V0dGV4dDsKIH0gRWxlbWVudEl0ZXJPYmplY3Q7CiAKQEAgLTIwMjAsMTMgKzIwNDYsMTEgQEAKIHN0YXRpYyB2b2lkCiBlbGVtZW50aXRlcl9kZWFsbG9jKEVsZW1lbnRJdGVyT2JqZWN0ICppdCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpwID0gaXQtPnBhcmVudF9zdGFjazsKLSAgICB3aGlsZSAocCkgewotICAgICAgICBQYXJlbnRMb2NhdG9yICp0ZW1wID0gcDsKLSAgICAgICAgUHlfWERFQ1JFRihwLT5wYXJlbnQpOwotICAgICAgICBwID0gcC0+bmV4dDsKLSAgICAgICAgUHlPYmplY3RfRnJlZSh0ZW1wKTsKLSAgICB9CisgICAgUHlfc3NpemVfdCBpID0gaXQtPnBhcmVudF9zdGFja191c2VkOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgd2hpbGUgKGktLSkKKyAgICAgICAgUHlfWERFQ1JFRihpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CisgICAgUHlNZW1fRnJlZShpdC0+cGFyZW50X3N0YWNrKTsKIAogICAgIFB5X1hERUNSRUYoaXQtPnNvdWdodF90YWcpOwogICAgIFB5X1hERUNSRUYoaXQtPnJvb3RfZWxlbWVudCk7CkBAIC0yMDM4LDExICsyMDYyLDkgQEAKIHN0YXRpYyBpbnQKIGVsZW1lbnRpdGVyX3RyYXZlcnNlKEVsZW1lbnRJdGVyT2JqZWN0ICppdCwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgUGFyZW50TG9jYXRvciAqcCA9IGl0LT5wYXJlbnRfc3RhY2s7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgUHlfVklTSVQocC0+cGFyZW50KTsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQorICAgIFB5X3NzaXplX3QgaSA9IGl0LT5wYXJlbnRfc3RhY2tfdXNlZDsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBQeV9WSVNJVChpdC0+cGFyZW50X3N0YWNrW2ldLnBhcmVudCk7CiAKICAgICBQeV9WSVNJVChpdC0+cm9vdF9lbGVtZW50KTsKICAgICBQeV9WSVNJVChpdC0+c291Z2h0X3RhZyk7CkBAIC0yMDUxLDE3ICsyMDczLDI1IEBACiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgZWxlbWVudGl0ZXJfbmV4dC4gQWRkIGEgbmV3IHBhcmVudCB0byB0aGUgcGFyZW50IHN0YWNrLgogICovCi1zdGF0aWMgUGFyZW50TG9jYXRvciAqCi1wYXJlbnRfc3RhY2tfcHVzaF9uZXcoUGFyZW50TG9jYXRvciAqc3RhY2ssIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKK3N0YXRpYyBpbnQKK3BhcmVudF9zdGFja19wdXNoX25ldyhFbGVtZW50SXRlck9iamVjdCAqaXQsIEVsZW1lbnRPYmplY3QgKnBhcmVudCkKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpuZXdfbm9kZSA9IFB5T2JqZWN0X01hbGxvYyhzaXplb2YoUGFyZW50TG9jYXRvcikpOwotICAgIGlmIChuZXdfbm9kZSkgewotICAgICAgICBuZXdfbm9kZS0+cGFyZW50ID0gcGFyZW50OwotICAgICAgICBQeV9JTkNSRUYocGFyZW50KTsKLSAgICAgICAgbmV3X25vZGUtPmNoaWxkX2luZGV4ID0gMDsKLSAgICAgICAgbmV3X25vZGUtPm5leHQgPSBzdGFjazsKKyAgICBQYXJlbnRMb2NhdG9yICppdGVtOworCisgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA+PSBpdC0+cGFyZW50X3N0YWNrX3NpemUpIHsKKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSAqIDI7ICAvKiBuZXZlciBvdmVyZmxvdyAqLworICAgICAgICBQYXJlbnRMb2NhdG9yICpwYXJlbnRfc3RhY2sgPSBpdC0+cGFyZW50X3N0YWNrOworICAgICAgICBQeU1lbV9SZXNpemUocGFyZW50X3N0YWNrLCBQYXJlbnRMb2NhdG9yLCBuZXdfc2l6ZSk7CisgICAgICAgIGlmIChwYXJlbnRfc3RhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFjazsKKyAgICAgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gbmV3X3NpemU7CiAgICAgfQotICAgIHJldHVybiBuZXdfbm9kZTsKKyAgICBpdGVtID0gaXQtPnBhcmVudF9zdGFjayArIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCsrOworICAgIFB5X0lOQ1JFRihwYXJlbnQpOworICAgIGl0ZW0tPnBhcmVudCA9IHBhcmVudDsKKyAgICBpdGVtLT5jaGlsZF9pbmRleCA9IDA7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0yMDc4LDE1MSArMjEwOCw5MSBAQAogICAgICAqICAgLSBpdGVydGV4dCgpIGFsc28gaGFzIHRvIGhhbmRsZSB0YWlsLCBhZnRlciBmaW5pc2hpbmcgd2l0aCBhbGwgdGhlCiAgICAgICogICAgIGNoaWxkcmVuIG9mIGEgbm9kZS4KICAgICAgKi8KLSAgICBFbGVtZW50T2JqZWN0ICpjdXJfcGFyZW50OwotICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXg7CiAgICAgaW50IHJjOwogICAgIEVsZW1lbnRPYmplY3QgKmVsZW07CisgICAgUHlPYmplY3QgKnRleHQ7CiAKICAgICB3aGlsZSAoMSkgewogICAgICAgICAvKiBIYW5kbGUgdGhlIGNhc2UgcmVhY2hlZCBpbiB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgaXRlcmF0aW9uLCB3aGVyZQotICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBUaGUgcm9vdF9kb25lIGZsYWcgZ2l2ZXMgdXMgaW5kaWNhdGlvbgotICAgICAgICAgKiB3aGV0aGVyIHdlJ3ZlIGp1c3Qgc3RhcnRlZCBpdGVyYXRpbmcgKHNvIHJvb3RfZG9uZSBpcyAwKSwgaW4gd2hpY2gKLSAgICAgICAgICogY2FzZSB0aGUgcm9vdCBpcyByZXR1cm5lZC4gSWYgcm9vdF9kb25lIGlzIDEgYW5kIHdlJ3JlIGhlcmUsIHRoZQorICAgICAgICAgKiB0aGUgcGFyZW50IHN0YWNrIGlzIGVtcHR5LiBJZiByb290X2VsZW1lbnQgaXMgTlVMTCBhbmQgd2UncmUgaGVyZSwgdGhlCiAgICAgICAgICAqIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZC4KICAgICAgICAgICovCi0gICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICBpZiAoaXQtPnJvb3RfZG9uZSkgeworICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2tfdXNlZCkgeworICAgICAgICAgICAgaWYgKCFpdC0+cm9vdF9lbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19TdG9wSXRlcmF0aW9uKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZWxlbSA9IGl0LT5yb290X2VsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFja19wdXNoX25ldyhpdC0+cGFyZW50X3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICBpdC0+cm9vdF9kb25lID0gMTsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnRleHQgPSBlbGVtZW50X2dldF90ZXh0KGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKLSAgICAgICAgICogeWVzLCB2aXNpdCB0aGUgbmV4dCBjaGlsZC4gSWYgbm90LCBwb3AgdGhlIHN0YWNrIGFuZCB0cnkgYWdhaW4uCi0gICAgICAgICAqLwotICAgICAgICBjdXJfcGFyZW50ID0gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50OwotICAgICAgICBjaGlsZF9pbmRleCA9IGl0LT5wYXJlbnRfc3RhY2stPmNoaWxkX2luZGV4OwotICAgICAgICBpZiAoY3VyX3BhcmVudC0+ZXh0cmEgJiYgY2hpbGRfaW5kZXggPCBjdXJfcGFyZW50LT5leHRyYS0+bGVuZ3RoKSB7Ci0gICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKiljdXJfcGFyZW50LT5leHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXgrKzsKLSAgICAgICAgICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQtPnBhcmVudF9zdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSk7Ci0gICAgICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2spIHsKLSAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRleHQpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByYyA9IChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBlbGVtID0gaXQtPnJvb3RfZWxlbWVudDsgIC8qIHN0ZWFscyBhIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgaXQtPnJvb3RfZWxlbWVudCA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdGFpbDsKLSAgICAgICAgICAgIFBhcmVudExvY2F0b3IgKm5leHQ7Ci0gICAgICAgICAgICBpZiAoaXQtPmdldHRleHQpIHsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IGVsZW1lbnRfZ2V0X3RhaWwoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0YWlsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0YWlsKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY3VyX3BhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWlsID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGFpbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXh0ID0gaXQtPnBhcmVudF9zdGFjay0+bmV4dDsKLSAgICAgICAgICAgIGN1cl9wYXJlbnQgPSBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQ7Ci0gICAgICAgICAgICBQeU9iamVjdF9GcmVlKGl0LT5wYXJlbnRfc3RhY2spOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IG5leHQ7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKGN1cl9wYXJlbnQpOwotCi0gICAgICAgICAgICAvKiBOb3RlIHRoYXQgZXh0cmEgY29uZGl0aW9uIG9uIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCBoZXJlOwotICAgICAgICAgICAgICogdGhpcyBpcyBiZWNhdXNlIGl0ZXJ0ZXh0KCkgaXMgc3VwcG9zZWQgdG8gb25seSByZXR1cm4gKmlubmVyKgotICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgLyogU2VlIGlmIHRoZXJlIGFyZSBjaGlsZHJlbiBsZWZ0IHRvIHRyYXZlcnNlIGluIHRoZSBjdXJyZW50IHBhcmVudC4gSWYKKyAgICAgICAgICAgICAqIHllcywgdmlzaXQgdGhlIG5leHQgY2hpbGQuIElmIG5vdCwgcG9wIHRoZSBzdGFjayBhbmQgdHJ5IGFnYWluLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoaXQtPnBhcmVudF9zdGFjay0+cGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9Jc1RydWUodGFpbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjID4gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWw7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgICAgIGlmIChyYyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgUGFyZW50TG9jYXRvciAqaXRlbSA9ICZpdC0+cGFyZW50X3N0YWNrW2l0LT5wYXJlbnRfc3RhY2tfdXNlZCAtIDFdOworICAgICAgICAgICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleCA9IGl0ZW0tPmNoaWxkX2luZGV4OworICAgICAgICAgICAgRWxlbWVudE9iamVjdEV4dHJhICpleHRyYTsKKyAgICAgICAgICAgIGVsZW0gPSBpdGVtLT5wYXJlbnQ7CisgICAgICAgICAgICBleHRyYSA9IGVsZW0tPmV4dHJhOworICAgICAgICAgICAgaWYgKCFleHRyYSB8fCBjaGlsZF9pbmRleCA+PSBleHRyYS0+bGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFja191c2VkLS07CisgICAgICAgICAgICAgICAgLyogTm90ZSB0aGF0IGV4dHJhIGNvbmRpdGlvbiBvbiBpdC0+cGFyZW50X3N0YWNrX3VzZWQgaGVyZTsKKyAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGJlY2F1c2UgaXRlcnRleHQoKSBpcyBzdXBwb3NlZCB0byBvbmx5IHJldHVybiAqaW5uZXIqCisgICAgICAgICAgICAgICAgICogdGV4dCwgbm90IHRleHQgZm9sbG93aW5nIHRoZSBlbGVtZW50IGl0IGJlZ2FuIGl0ZXJhdGlvbiB3aXRoLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCAmJiBpdC0+cGFyZW50X3N0YWNrX3VzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RhaWwoZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2V0dGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRhaWwpOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlbGVtID0gKEVsZW1lbnRPYmplY3QgKilleHRyYS0+Y2hpbGRyZW5bY2hpbGRfaW5kZXhdOworICAgICAgICAgICAgaXRlbS0+Y2hpbGRfaW5kZXgrKzsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJlbnRfc3RhY2tfcHVzaF9uZXcoaXQsIGVsZW0pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgeworICAgICAgICAgICAgdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7CisgICAgICAgICAgICBnb3RvIGdldHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXQtPnNvdWdodF90YWcgPT0gUHlfTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIHJjID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGVsZW0tPnRhZywgaXQtPnNvdWdodF90YWcsIFB5X0VRKTsKKyAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKillbGVtOworCisgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgaWYgKHJjIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb250aW51ZTsKKworZ2V0dGV4dDoKKyAgICAgICAgaWYgKCF0ZXh0KSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodGV4dCA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZXh0KTsKKyAgICAgICAgICAgIGlmIChyYyA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgICAgICBQeV9ERUNSRUYodGV4dCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjc0LDYgKzIyNDQsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiB9OwogCisjZGVmaW5lIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUgOAogCiBzdGF0aWMgUHlPYmplY3QgKgogY3JlYXRlX2VsZW1lbnRpdGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWcsIGludCBnZXR0ZXh0KQpAQCAtMjI4NiwyMiArMjI1NywyMCBAQAogCiAgICAgUHlfSU5DUkVGKHRhZyk7CiAgICAgaXQtPnNvdWdodF90YWcgPSB0YWc7Ci0gICAgaXQtPnJvb3RfZG9uZSA9IDA7CiAgICAgaXQtPmdldHRleHQgPSBnZXR0ZXh0OwogICAgIFB5X0lOQ1JFRihzZWxmKTsKICAgICBpdC0+cm9vdF9lbGVtZW50ID0gc2VsZjsKIAogICAgIFB5T2JqZWN0X0dDX1RyYWNrKGl0KTsKIAotICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKFBhcmVudExvY2F0b3IpKTsKKyAgICBpdC0+cGFyZW50X3N0YWNrID0gUHlNZW1fTmV3KFBhcmVudExvY2F0b3IsIElOSVRfUEFSRU5UX1NUQUNLX1NJWkUpOwogICAgIGlmIChpdC0+cGFyZW50X3N0YWNrID09IE5VTEwpIHsKICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudCA9IE5VTEw7Ci0gICAgaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXggPSAwOwotICAgIGl0LT5wYXJlbnRfc3RhY2stPm5leHQgPSBOVUxMOworICAgIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCA9IDA7CisgICAgaXQtPnBhcmVudF9zdGFja19zaXplID0gSU5JVF9QQVJFTlRfU1RBQ0tfU0laRTsKIAogICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KQEAgLTIzMjYsNyArMjI5NSw3IEBACiAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeTsKIAogICAgIC8qIGVsZW1lbnQgdHJhY2luZyAqLwotICAgIFB5T2JqZWN0ICpldmVudHM7IC8qIGxpc3Qgb2YgZXZlbnRzLCBvciBOVUxMIGlmIG5vdCBjb2xsZWN0aW5nICovCisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQ7IC8qIHRoZSBhcHBlbmQgbWV0aG9kIG9mIHRoZSBsaXN0IG9mIGV2ZW50cywgb3IgTlVMTCAqLwogICAgIFB5T2JqZWN0ICpzdGFydF9ldmVudF9vYmo7IC8qIGV2ZW50IG9iamVjdHMgKE5VTEwgdG8gaWdub3JlKSAqLwogICAgIFB5T2JqZWN0ICplbmRfZXZlbnRfb2JqOwogICAgIFB5T2JqZWN0ICpzdGFydF9uc19ldmVudF9vYmo7CkBAIC0yMzYxLDcgKzIzMzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHQtPmluZGV4ID0gMDsKIAotICAgICAgICB0LT5ldmVudHMgPSBOVUxMOworICAgICAgICB0LT5ldmVudHNfYXBwZW5kID0gTlVMTDsKICAgICAgICAgdC0+c3RhcnRfZXZlbnRfb2JqID0gdC0+ZW5kX2V2ZW50X29iaiA9IE5VTEw7CiAgICAgICAgIHQtPnN0YXJ0X25zX2V2ZW50X29iaiA9IHQtPmVuZF9uc19ldmVudF9vYmogPSBOVUxMOwogICAgIH0KQEAgLTIzODAsMTMgKzIzNDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05MWNmYTc1NTg5NzBlZTk2IGlucHV0PTFiNDI0ZWVlZmMzNTI0OWNdKi8KIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKGVsZW1lbnRfZmFjdG9yeSkgewogICAgICAgICBQeV9JTkNSRUYoZWxlbWVudF9mYWN0b3J5KTsKLSAgICAgICAgdG1wID0gc2VsZi0+ZWxlbWVudF9mYWN0b3J5OwotICAgICAgICBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgPSBlbGVtZW50X2ZhY3Rvcnk7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgUHlfWFNFVFJFRihzZWxmLT5lbGVtZW50X2ZhY3RvcnksIGVsZW1lbnRfZmFjdG9yeSk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yNDExLDcgKzIzNzYsNyBAQAogICAgIFB5X0NMRUFSKHNlbGYtPnN0YXJ0X25zX2V2ZW50X29iaik7CiAgICAgUHlfQ0xFQVIoc2VsZi0+ZW5kX2V2ZW50X29iaik7CiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhcnRfZXZlbnRfb2JqKTsKLSAgICBQeV9DTEVBUihzZWxmLT5ldmVudHMpOworICAgIFB5X0NMRUFSKHNlbGYtPmV2ZW50c19hcHBlbmQpOwogICAgIFB5X0NMRUFSKHNlbGYtPnN0YWNrKTsKICAgICBQeV9DTEVBUihzZWxmLT5kYXRhKTsKICAgICBQeV9DTEVBUihzZWxmLT5sYXN0KTsKQEAgLTI0OTIsMTMgKzI0NTcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbm9kZSkKIHsKICAgICBpZiAoYWN0aW9uICE9IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QgKnJlcyA9IFB5VHVwbGVfUGFjaygyLCBhY3Rpb24sIG5vZGUpOworICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICBQeU9iamVjdCAqZXZlbnQgPSBQeVR1cGxlX1BhY2soMiwgYWN0aW9uLCBub2RlKTsKKyAgICAgICAgaWYgKGV2ZW50ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2VsZi0+ZXZlbnRzX2FwcGVuZCwgZXZlbnQsIE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoZXZlbnQpOwogICAgICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChQeUxpc3RfQXBwZW5kKHNlbGYtPmV2ZW50cywgcmVzKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTI1MjcsMTAgKzI0OTMsMTcgQEAKICAgICAgICAgc2VsZi0+ZGF0YSA9IE5VTEw7CiAgICAgfQogCi0gICAgaWYgKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSAmJiBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgIT0gUHlfTm9uZSkgewotICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFzZWxmLT5lbGVtZW50X2ZhY3RvcnkgfHwgc2VsZi0+ZWxlbWVudF9mYWN0b3J5ID09IFB5X05vbmUpIHsKICAgICAgICAgbm9kZSA9IGNyZWF0ZV9uZXdfZWxlbWVudCh0YWcsIGF0dHJpYik7CisgICAgfSBlbHNlIGlmIChhdHRyaWIgPT0gUHlfTm9uZSkgeworICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmICghYXR0cmliKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7CisgICAgICAgIFB5X0RFQ1JFRihhdHRyaWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKICAgICB9CiAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjk4OSwxMiArMjk2Miw4IEBACiAgICAgICAgICAgICBhdHRyaWJfaW4gKz0gMjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBhc3MgYW4gZW1wdHkgZGljdGlvbmFyeSBvbiAqLwotICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgIGlmICghYXR0cmliKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodGFnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIGF0dHJpYiA9IFB5X05vbmU7CiAgICAgfQogCiAgICAgaWYgKFRyZWVCdWlsZGVyX0NoZWNrRXhhY3Qoc2VsZi0+dGFyZ2V0KSkgewpAQCAtMzAwMyw2ICsyOTcyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIGF0dHJpYik7CiAgICAgfQogICAgIGVsc2UgaWYgKHNlbGYtPmhhbmRsZV9zdGFydCkgeworICAgICAgICBpZiAoYXR0cmliID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihhdHRyaWIpOworICAgICAgICAgICAgYXR0cmliID0gUHlEaWN0X05ldygpOworICAgICAgICAgICAgaWYgKCFhdHRyaWIpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmhhbmRsZV9zdGFydCwgIk9PIiwgdGFnLCBhdHRyaWIpOwogICAgIH0gZWxzZQogICAgICAgICByZXMgPSBOVUxMOwpAQCAtMzA3Niw3ICszMDUzLDcgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCF0YXJnZXQtPmV2ZW50cyB8fCAhdGFyZ2V0LT5zdGFydF9uc19ldmVudF9vYmopCisgICAgaWYgKCF0YXJnZXQtPmV2ZW50c19hcHBlbmQgfHwgIXRhcmdldC0+c3RhcnRfbnNfZXZlbnRfb2JqKQogICAgICAgICByZXR1cm47CiAKICAgICBpZiAoIXVyaSkKQEAgLTMwOTksNyArMzA3Niw3IEBACiAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmICghdGFyZ2V0LT5ldmVudHMpCisgICAgaWYgKCF0YXJnZXQtPmV2ZW50c19hcHBlbmQpCiAgICAgICAgIHJldHVybjsKIAogICAgIHRyZWVidWlsZGVyX2FwcGVuZF9ldmVudCh0YXJnZXQsIHRhcmdldC0+ZW5kX25zX2V2ZW50X29iaiwgUHlfTm9uZSk7CkBAIC0zNTg4LDcgKzM1NjUsNyBAQAogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLlhNTFBhcnNlci5fc2V0ZXZlbnRzCiAKLSAgICBldmVudHNfcXVldWU6IG9iamVjdChzdWJjbGFzc19vZj0nJlB5TGlzdF9UeXBlJykKKyAgICBldmVudHNfcXVldWU6IG9iamVjdAogICAgIGV2ZW50c190b19yZXBvcnQ6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTM1OTgsMTIgKzM1NzUsMTIgQEAKIF9lbGVtZW50dHJlZV9YTUxQYXJzZXJfX3NldGV2ZW50c19pbXBsKFhNTFBhcnNlck9iamVjdCAqc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpldmVudHNfcXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZXZlbnRzX3RvX3JlcG9ydCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNDQwMDkyOTIyYjEzZWQxIGlucHV0PTU5ZGI5NzQyOTEwYzYxNzRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xNDQwMDkyOTIyYjEzZWQxIGlucHV0PWFiZjkwODMwYTFjM2IwZmNdKi8KIHsKICAgICAvKiBhY3RpdmF0ZSBlbGVtZW50IGV2ZW50IHJlcG9ydGluZyAqLwogICAgIFB5X3NzaXplX3QgaTsKICAgICBUcmVlQnVpbGRlck9iamVjdCAqdGFyZ2V0OwotICAgIFB5T2JqZWN0ICpldmVudHNfc2VxOworICAgIFB5T2JqZWN0ICpldmVudHNfYXBwZW5kLCAqZXZlbnRzX3NlcTsKIAogICAgIGlmICghVHJlZUJ1aWxkZXJfQ2hlY2tFeGFjdChzZWxmLT50YXJnZXQpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZygKQEAgLTM2MTYsOCArMzU5MywxMCBAQAogCiAgICAgdGFyZ2V0ID0gKFRyZWVCdWlsZGVyT2JqZWN0Kikgc2VsZi0+dGFyZ2V0OwogCi0gICAgUHlfSU5DUkVGKGV2ZW50c19xdWV1ZSk7Ci0gICAgUHlfWFNFVFJFRih0YXJnZXQtPmV2ZW50cywgZXZlbnRzX3F1ZXVlKTsKKyAgICBldmVudHNfYXBwZW5kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhldmVudHNfcXVldWUsICJhcHBlbmQiKTsKKyAgICBpZiAoZXZlbnRzX2FwcGVuZCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9YU0VUUkVGKHRhcmdldC0+ZXZlbnRzX2FwcGVuZCwgZXZlbnRzX2FwcGVuZCk7CiAKICAgICAvKiBjbGVhciBvdXQgZXhpc3RpbmcgZXZlbnRzICovCiAgICAgUHlfQ0xFQVIodGFyZ2V0LT5zdGFydF9ldmVudF9vYmopOwpAQCAtMzc1MCw2ICszNzI5LDI2IEBACiAgICAgKG9iam9iamFyZ3Byb2MpIGVsZW1lbnRfYXNzX3N1YnNjciwKIH07CiAKK3N0YXRpYyBQeUdldFNldERlZiBlbGVtZW50X2dldHNldGxpc3RbXSA9IHsKKyAgICB7InRhZyIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90YWdfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGFnX3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhIHRoaXMgZWxlbWVudCByZXByZXNlbnRzIn0sCisgICAgeyJ0ZXh0IiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RleHRfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfdGV4dF9zZXR0ZXIsCisgICAgICAgICJBIHN0cmluZyBvZiB0ZXh0IGRpcmVjdGx5IGFmdGVyIHRoZSBzdGFydCB0YWcsIG9yIE5vbmUifSwKKyAgICB7InRhaWwiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGFpbF9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90YWlsX3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIG9mIHRleHQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGVuZCB0YWcsIG9yIE5vbmUifSwKKyAgICB7ImF0dHJpYiIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF9hdHRyaWJfZ2V0dGVyLAorICAgICAgICAoc2V0dGVyKWVsZW1lbnRfYXR0cmliX3NldHRlciwKKyAgICAgICAgIkEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyJ9LAorICAgIHtOVUxMfSwKK307CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgRWxlbWVudF9UeXBlID0gewogICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQogICAgICJ4bWwuZXRyZWUuRWxlbWVudFRyZWUuRWxlbWVudCIsIHNpemVvZihFbGVtZW50T2JqZWN0KSwgMCwKQEAgLTM3NjYsOCArMzc2NSw4IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLSAgICAoZ2V0YXR0cm9mdW5jKWVsZW1lbnRfZ2V0YXR0cm8sICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwotICAgIChzZXRhdHRyb2Z1bmMpZWxlbWVudF9zZXRhdHRybywgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUgfCBQeV9UUEZMQUdTX0hBVkVfR0MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KQEAgLTM3ODAsNyArMzc3OSw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBlbGVtZW50X21ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgIGVsZW1lbnRfZ2V0c2V0bGlzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19nZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKaW5kZXggZjA3MGExNC4uYmY3YjAzNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2dkYm1tb2R1bGUuYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAgICAgcmV0dXJuIG5ld2RibW9iamVjdChuYW1lLCBpZmxhZ3MsIG1vZGUpOwogfQogCi1zdGF0aWMgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCitzdGF0aWMgY29uc3QgY2hhciBkYm1tb2R1bGVfb3Blbl9mbGFnc1tdID0gInJ3Y24iCiAjaWZkZWYgR0RCTV9GQVNUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCmluZGV4IDEzNmFiZjUuLmI0OTllMWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faGVhcHFtb2R1bGUuYwpAQCAtNjYsNyArNjYsNyBAQAogCiAgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwogICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7Ci0gICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KKyAgICBsaW1pdCA9IGVuZHBvcyA+PiAxOyAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLwogICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgewogICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCkBAIC03OCw2ICs3OCw3IEBACiAgICAgICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBjaGlsZHBvcyArPSAoKHVuc2lnbmVkKWNtcCBeIDEpOyAgIC8qIGluY3JlbWVudCB3aGVuIGNtcD09MCAqLworICAgICAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsgICAgICAgICAvKiBhcnIgbWF5IGhhdmUgY2hhbmdlZCAqLwogICAgICAgICAgICAgaWYgKGVuZHBvcyAhPSBQeUxpc3RfR0VUX1NJWkUoaGVhcCkpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBjaGFuZ2VkIHNpemUgZHVyaW5nIGl0ZXJhdGlvbiIpOwpAQCAtODUsNyArODYsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0gICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7CiAgICAgICAgIHRtcDEgPSBhcnJbY2hpbGRwb3NdOwogICAgICAgICB0bXAyID0gYXJyW3Bvc107CiAgICAgICAgIGFycltjaGlsZHBvc10gPSB0bXAyOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAgICAgICAgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LAogICAgICAgIGFuZCB0aGF0J3MgYWdhaW4gbi8vMi0xLgogICAgICovCi0gICAgZm9yIChpID0gbi8yIC0gMSA7IGkgPj0gMCA7IGktLSkKKyAgICBmb3IgKGkgPSAobiA+PiAxKSAtIDEgOyBpID49IDAgOyBpLS0pCiAgICAgICAgIGlmIChzaWZ0dXBfZnVuYygoUHlMaXN0T2JqZWN0ICopaGVhcCwgaSkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKQEAgLTQyMCw3ICs0MjAsNyBAQAogCiAgICAgLyogQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLiAqLwogICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7Ci0gICAgbGltaXQgPSBlbmRwb3MgLyAyOyAgICAgICAgICAvKiBzbWFsbGVzdCBwb3MgdGhhdCBoYXMgbm8gY2hpbGQgKi8KKyAgICBsaW1pdCA9IGVuZHBvcyA+PiAxOyAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLwogICAgIHdoaWxlIChwb3MgPCBsaW1pdCkgewogICAgICAgICAvKiBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4gICAqLwogICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMTsgICAgLyogbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24gICovCkBAIC00MzIsNiArNDMyLDcgQEAKICAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIGNoaWxkcG9zICs9ICgodW5zaWduZWQpY21wIF4gMSk7ICAgLyogaW5jcmVtZW50IHdoZW4gY21wPT0wICovCisgICAgICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOyAgICAgICAgIC8qIGFyciBtYXkgaGF2ZSBjaGFuZ2VkICovCiAgICAgICAgICAgICBpZiAoZW5kcG9zICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CkBAIC00MzksNyArNDQwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLiAqLwotICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOwogICAgICAgICB0bXAxID0gYXJyW2NoaWxkcG9zXTsKICAgICAgICAgdG1wMiA9IGFycltwb3NdOwogICAgICAgICBhcnJbY2hpbGRwb3NdID0gdG1wMjsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5jIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKaW5kZXggZWM2ODE3MC4uODViMTgxMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMKQEAgLTIzOCwyMCArMjM4LDMzIEBACiAgICAgaW50IHRleHQgPSAwLCBiaW5hcnkgPSAwLCB1bml2ZXJzYWwgPSAwOwogCiAgICAgY2hhciByYXdtb2RlWzZdLCAqbTsKLSAgICBpbnQgbGluZV9idWZmZXJpbmcsIGlzYXR0eTsKKyAgICBpbnQgbGluZV9idWZmZXJpbmcsIGlzX251bWJlcjsKKyAgICBsb25nIGlzYXR0eTsKIAotICAgIFB5T2JqZWN0ICpyYXcsICptb2Rlb2JqID0gTlVMTCwgKmJ1ZmZlciwgKndyYXBwZXIsICpyZXN1bHQgPSBOVUxMOworICAgIFB5T2JqZWN0ICpyYXcsICptb2Rlb2JqID0gTlVMTCwgKmJ1ZmZlciwgKndyYXBwZXIsICpyZXN1bHQgPSBOVUxMLCAqcGF0aF9vcl9mZCA9IE5VTEw7CiAKICAgICBfUHlfSURFTlRJRklFUihfYmxrc2l6ZSk7CiAgICAgX1B5X0lERU5USUZJRVIoaXNhdHR5KTsKICAgICBfUHlfSURFTlRJRklFUihtb2RlKTsKICAgICBfUHlfSURFTlRJRklFUihjbG9zZSk7CiAKLSAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhmaWxlKSAmJgotCSFQeUJ5dGVzX0NoZWNrKGZpbGUpICYmCi0JIVB5TnVtYmVyX0NoZWNrKGZpbGUpKSB7CisgICAgaXNfbnVtYmVyID0gUHlOdW1iZXJfQ2hlY2soZmlsZSk7CisKKyAgICBpZiAoaXNfbnVtYmVyKSB7CisgICAgICAgIHBhdGhfb3JfZmQgPSBmaWxlOworICAgICAgICBQeV9JTkNSRUYocGF0aF9vcl9mZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGF0aF9vcl9mZCA9IFB5T1NfRlNQYXRoKGZpbGUpOworICAgICAgICBpZiAocGF0aF9vcl9mZCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaXNfbnVtYmVyICYmCisgICAgICAgICFQeVVuaWNvZGVfQ2hlY2socGF0aF9vcl9mZCkgJiYKKyAgICAgICAgIVB5Qnl0ZXNfQ2hlY2socGF0aF9vcl9mZCkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImludmFsaWQgZmlsZTogJVIiLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgLyogRGVjb2RlIG1vZGUgKi8KQEAgLTI5Miw3ICszMDUsNyBAQAogICAgICAgICBpZiAoc3RyY2hyKG1vZGUraSsxLCBjKSkgewogICAgICAgICAgIGludmFsaWRfbW9kZToKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBtb2RlOiAnJXMnIiwgbW9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KIAogICAgIH0KQEAgLTMwNyw1NCArMzIwLDU3IEBACiAKICAgICAvKiBQYXJhbWV0ZXJzIHZhbGlkYXRpb24gKi8KICAgICBpZiAodW5pdmVyc2FsKSB7Ci0gICAgICAgIGlmICh3cml0aW5nIHx8IGFwcGVuZGluZykgeworICAgICAgICBpZiAoY3JlYXRpbmcgfHwgd3JpdGluZyB8fCBhcHBlbmRpbmcgfHwgdXBkYXRpbmcpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlIFUgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggeCcsICd3JywgJ2EnLCBvciAnKyciKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIidVJyBtb2RlIGlzIGRlcHJlY2F0ZWQiLCAxKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIHJlYWRpbmcgPSAxOwogICAgIH0KIAogICAgIGlmICh0ZXh0ICYmIGJpbmFyeSkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBoYXZlIHRleHQgYW5kIGJpbmFyeSBtb2RlIGF0IG9uY2UiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGNyZWF0aW5nICsgcmVhZGluZyArIHdyaXRpbmcgKyBhcHBlbmRpbmcgPiAxKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgaGF2ZSBleGFjdGx5IG9uZSBvZiBjcmVhdGUvcmVhZC93cml0ZS9hcHBlbmQgbW9kZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBpZiAoYmluYXJ5ICYmIGVuY29kaW5nICE9IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGFuIGVuY29kaW5nIGFyZ3VtZW50Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChiaW5hcnkgJiYgZXJyb3JzICE9IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGFuIGVycm9ycyBhcmd1bWVudCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBpZiAoYmluYXJ5ICYmIG5ld2xpbmUgIT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYSBuZXdsaW5lIGFyZ3VtZW50Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIC8qIENyZWF0ZSB0aGUgUmF3IGZpbGUgc3RyZWFtICovCiAgICAgcmF3ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKSZQeUZpbGVJT19UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3NpTyIsIGZpbGUsIHJhd21vZGUsIGNsb3NlZmQsIG9wZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPc2lPIiwgcGF0aF9vcl9mZCwgcmF3bW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKICAgICBpZiAocmF3ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIHJlc3VsdCA9IHJhdzsKIAorICAgIFB5X0RFQ1JFRihwYXRoX29yX2ZkKTsKKyAgICBwYXRoX29yX2ZkID0gTlVMTDsKKwogICAgIG1vZGVvYmogPSBQeVVuaWNvZGVfRnJvbVN0cmluZyhtb2RlKTsKICAgICBpZiAobW9kZW9iaiA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwpAQCAtNDM3LDEwICs0NTMsMTAgQEAKIAogICAgIC8qIHdyYXBzIGludG8gYSBUZXh0SU9XcmFwcGVyICovCiAgICAgd3JhcHBlciA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikmUHlUZXh0SU9XcmFwcGVyX1R5cGUsCi0JCQkJICAgICJPc3NzaSIsCi0JCQkJICAgIGJ1ZmZlciwKLQkJCQkgICAgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwKLQkJCQkgICAgbGluZV9idWZmZXJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9zc3NpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2J1ZmZlcmluZyk7CiAgICAgaWYgKHdyYXBwZXIgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICByZXN1bHQgPSB3cmFwcGVyOwpAQCAtNDYwLDYgKzQ3Niw3IEBACiAgICAgICAgIFB5X1hERUNSRUYoY2xvc2VfcmVzdWx0KTsKICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgfQorICAgIFB5X1hERUNSRUYocGF0aF9vcl9mZCk7CiAgICAgUHlfWERFQ1JFRihtb2Rlb2JqKTsKICAgICByZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL19pb21vZHVsZS5oIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKaW5kZXggMGM2ZWFlMi4uM2M0OGZmMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKKysrIGIvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmgKQEAgLTYwLDcgKzYwLDcgQEAKICAgICogT3RoZXJ3aXNlLCB0aGUgbGluZSBlbmRpbmcgaXMgc3BlY2lmaWVkIGJ5IHJlYWRubCwgYSBzdHIgb2JqZWN0ICovCiBleHRlcm4gUHlfc3NpemVfdCBfUHlJT19maW5kX2xpbmVfZW5kaW5nKAogICAgIGludCB0cmFuc2xhdGVkLCBpbnQgdW5pdmVyc2FsLCBQeU9iamVjdCAqcmVhZG5sLAotICAgIGludCBraW5kLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCk7CisgICAgaW50IGtpbmQsIGNvbnN0IGNoYXIgKnN0YXJ0LCBjb25zdCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKTsKIAogLyogUmV0dXJuIDEgaWYgYW4gRW52aXJvbm1lbnRFcnJvciB3aXRoIGVycm5vID09IEVJTlRSIGlzIHNldCAoYW5kIHRoZW4KICAgIGNsZWFycyB0aGUgZXJyb3IgaW5kaWNhdG9yKSwgMCBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMgYi9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKaW5kZXggNmQ2Nzc1MS4uY2JlNzQyNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCisrKyBiL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYwpAQCAtNjU5LDcgKzY1OSw3IEBACiAKIC8qIFNldHMgdGhlIGN1cnJlbnQgZXJyb3IgdG8gQmxvY2tpbmdJT0Vycm9yICovCiBzdGF0aWMgdm9pZAotX3NldF9CbG9ja2luZ0lPRXJyb3IoY2hhciAqbXNnLCBQeV9zc2l6ZV90IHdyaXR0ZW4pCitfc2V0X0Jsb2NraW5nSU9FcnJvcihjb25zdCBjaGFyICptc2csIFB5X3NzaXplX3Qgd3JpdHRlbikKIHsKICAgICBQeU9iamVjdCAqZXJyOwogICAgIFB5RXJyX0NsZWFyKCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9ieXRlc2lvLmMgYi9Nb2R1bGVzL19pby9ieXRlc2lvLmMKaW5kZXggOWU1ZDc4Yi4uYTFiYTEyMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vYnl0ZXNpby5jCisrKyBiL01vZHVsZXMvX2lvL2J5dGVzaW8uYwpAQCAtODcsNyArODcsNyBAQAogc3RhdGljIGludAogdW5zaGFyZV9idWZmZXIoYnl0ZXNpbyAqc2VsZiwgc2l6ZV90IHNpemUpCiB7Ci0gICAgUHlPYmplY3QgKm5ld19idWYsICpvbGRfYnVmOworICAgIFB5T2JqZWN0ICpuZXdfYnVmOwogICAgIGFzc2VydChTSEFSRURfQlVGKHNlbGYpKTsKICAgICBhc3NlcnQoc2VsZi0+ZXhwb3J0cyA9PSAwKTsKICAgICBhc3NlcnQoc2l6ZSA+PSAoc2l6ZV90KXNlbGYtPnN0cmluZ19zaXplKTsKQEAgLTk2LDkgKzk2LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIG1lbWNweShQeUJ5dGVzX0FTX1NUUklORyhuZXdfYnVmKSwgUHlCeXRlc19BU19TVFJJTkcoc2VsZi0+YnVmKSwKICAgICAgICAgICAgc2VsZi0+c3RyaW5nX3NpemUpOwotICAgIG9sZF9idWYgPSBzZWxmLT5idWY7Ci0gICAgc2VsZi0+YnVmID0gbmV3X2J1ZjsKLSAgICBQeV9ERUNSRUYob2xkX2J1Zik7CisgICAgUHlfU0VUUkVGKHNlbGYtPmJ1ZiwgbmV3X2J1Zik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9faW9tb2R1bGUuYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL19pb21vZHVsZS5jLmgKaW5kZXggYTNhYmI5My4uNmRjZmMwOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL19pb21vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL19pb21vZHVsZS5jLmgKQEAgLTE0OSwxMSArMTQ5LDEyIEBACiAgICAgUHlPYmplY3QgKm9wZW5lciA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNpenp6aU86b3BlbiIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZpbGUsICZtb2RlLCAmYnVmZmVyaW5nLCAmZW5jb2RpbmcsICZlcnJvcnMsICZuZXdsaW5lLCAmY2xvc2VmZCwgJm9wZW5lcikpCisgICAgICAgICZmaWxlLCAmbW9kZSwgJmJ1ZmZlcmluZywgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmNsb3NlZmQsICZvcGVuZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX29wZW5faW1wbChtb2R1bGUsIGZpbGUsIG1vZGUsIGJ1ZmZlcmluZywgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk3Y2RjMDliZjY4YTgwNjQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA3OWY1OTdlNzFlOWYwYzYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oCmluZGV4IDQzN2UyNzUuLmM0ZGZjMTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9idWZmZXJlZGlvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvYnVmZmVyZWRpby5jLmgKQEAgLTE5LDE0ICsxOSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZElPQmFzZV9yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDgsMTQgKzUwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50bzEiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRJT0Jhc2VfcmVhZGludG8xX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC05OSw4ICsxMDMsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBlZWsiLAotICAgICAgICAmc2l6ZSkpCisgICAgICAgICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcGVla19pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMTI1LDggKzEzMCw5IEBACiAgICAgUHlfc3NpemVfdCBuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMTUwLDggKzE1Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnJlYWQxIiwgJm4pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibjpyZWFkMSIsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZDFfaW1wbChzZWxmLCBuKTsKIAogZXhpdDoKQEAgLTE3NSwxNCArMTgyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMDQsMTQgKzIxMywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvMSIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRpbnRvMV9pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjM0LDggKzI0NSw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpCisgICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3JlYWRsaW5lX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNjEsOCArMjczLDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmdGFyZ2V0b2JqLCAmd2hlbmNlKSkKKyAgICAgICAgJnRhcmdldG9iaiwgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3NlZWtfaW1wbChzZWxmLCB0YXJnZXRvYmosIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yODgsOCArMzAxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvcykpCisgICAgICAgICZwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC0zMTUsOCArMzI5LDkgQEAKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bjpCdWZmZXJlZFJlYWRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkKKyAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CdWZmZXJlZFJlYWRlcl9fX2luaXRfX19pbXBsKChidWZmZXJlZCAqKXNlbGYsIHJhdywgYnVmZmVyX3NpemUpOwogCiBleGl0OgpAQCAtMzQ2LDggKzM2MSw5IEBACiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG46QnVmZmVyZWRXcml0ZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpCisgICAgICAgICZyYXcsICZidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRXcml0ZXJfX19pbml0X19faW1wbCgoYnVmZmVyZWQgKilzZWxmLCByYXcsIGJ1ZmZlcl9zaXplKTsKIAogZXhpdDoKQEAgLTM3MSwxNCArMzg3LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnVmZmVyZWRXcml0ZXJfd3JpdGVfaW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQxMCwxMSArNDI4LDEzIEBACiAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IERFRkFVTFRfQlVGRkVSX1NJWkU7CiAKICAgICBpZiAoKFB5X1RZUEUoc2VsZikgPT0gJlB5QnVmZmVyZWRSV1BhaXJfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJCdWZmZXJlZFJXUGFpciIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQnVmZmVyZWRSV1BhaXIiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOkJ1ZmZlcmVkUldQYWlyIiwKLSAgICAgICAgJnJlYWRlciwgJndyaXRlciwgJmJ1ZmZlcl9zaXplKSkKKyAgICAgICAgJnJlYWRlciwgJndyaXRlciwgJmJ1ZmZlcl9zaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CdWZmZXJlZFJXUGFpcl9fX2luaXRfX19pbXBsKChyd3BhaXIgKilzZWxmLCByZWFkZXIsIHdyaXRlciwgYnVmZmVyX3NpemUpOwogCiBleGl0OgpAQCAtNDQ0LDExICs0NjQsMTIgQEAKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bjpCdWZmZXJlZFJhbmRvbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkKKyAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CdWZmZXJlZFJhbmRvbV9fX2luaXRfX19pbXBsKChidWZmZXJlZCAqKXNlbGYsIHJhdywgYnVmZmVyX3NpemUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmJiYjVlMjM5YjRmZmU2ZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGY2MTk2Yzc1NmI4ODBjOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvYnl0ZXNpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvYnl0ZXNpby5jLmgKaW5kZXggNWYyYWJiMC4uMWY3MzZmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9ieXRlc2lvLmMuaApAQCAtMTcxLDggKzE3MSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fcmVhZF9pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC0yMTUsOCArMjE2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fcmVhZGxpbmVfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMjQ3LDggKzI0OSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZXMiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19yZWFkbGluZXNfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMjc2LDE0ICsyNzksMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMTEsOCArMzE2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fdHJ1bmNhdGVfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMzQ1LDggKzM1MSw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwKLSAgICAgICAgJnBvcywgJndoZW5jZSkpCisgICAgICAgICZwb3MsICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fc2Vla19pbXBsKHNlbGYsIHBvcywgd2hlbmNlKTsKIAogZXhpdDoKQEAgLTQxMiwxMSArNDE5LDEyIEBACiAgICAgUHlPYmplY3QgKmluaXR2YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpCeXRlc0lPIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5pdHZhbHVlKSkKKyAgICAgICAgJmluaXR2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19fX2luaXRfX19pbXBsKChieXRlc2lvICopc2VsZiwgaW5pdHZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTYwY2UyYzYyNzI3MTg0MzEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNmZGI2MmYzZTNiMDU0NGQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2ZpbGVpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvZmlsZWlvLmMuaAppbmRleCAxMDQyMDA4Li4wMzg4MzZhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvZmlsZWlvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvZmlsZWlvLmMuaApAQCAtNTYsOCArNTYsOSBAQAogICAgIFB5T2JqZWN0ICpvcGVuZXIgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzaU86RmlsZUlPIiwgX2tleXdvcmRzLAotICAgICAgICAmbmFtZW9iaiwgJm1vZGUsICZjbG9zZWZkLCAmb3BlbmVyKSkKKyAgICAgICAgJm5hbWVvYmosICZtb2RlLCAmY2xvc2VmZCwgJm9wZW5lcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX19faW5pdF9fX2ltcGwoKGZpbGVpbyAqKXNlbGYsIG5hbWVvYmosIG1vZGUsIGNsb3NlZmQsIG9wZW5lcik7CiAKIGV4aXQ6CkBAIC0xNTQsMTQgKzE1NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT19yZWFkaW50b19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjEwLDggKzIxMyw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZzaXplKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fcmVhZF9pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMjQwLDE0ICsyNDQsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYiA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fd3JpdGVfaW1wbChzZWxmLCAmYik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYiAqLwotICAgIGlmIChiLm9iaikKKyAgICBpZiAoYi5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZiKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjgwLDggKzI4Niw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwKLSAgICAgICAgJnBvcywgJndoZW5jZSkpCisgICAgICAgICZwb3MsICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT19zZWVrX2ltcGwoc2VsZiwgcG9zLCB3aGVuY2UpOwogCiBleGl0OgpAQCAtMzMzLDggKzM0MCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ0cnVuY2F0ZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZwb3NvYmopKQorICAgICAgICAmcG9zb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fdHJ1bmNhdGVfaW1wbChzZWxmLCBwb3NvYmopOwogCiBleGl0OgpAQCAtMzY0LDQgKzM3Miw0IEBACiAjaWZuZGVmIF9JT19GSUxFSU9fVFJVTkNBVEVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfSU9fRklMRUlPX1RSVU5DQVRFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9JT19GSUxFSU9fVFJVTkNBVEVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRjYmMzOWI0NjY1OTg0OTIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJmNGI0YmQ2Yjk3NjM0NmQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL2lvYmFzZS5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaAppbmRleCA5NzYyZjExLi5lZGJmNzNhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaApAQCAtMTg2LDggKzE4Niw5IEBACiAgICAgUHlfc3NpemVfdCBsaW1pdCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8TyY6cmVhZGxpbmUiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmxpbWl0KSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZsaW1pdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0lPQmFzZV9yZWFkbGluZV9pbXBsKHNlbGYsIGxpbWl0KTsKIAogZXhpdDoKQEAgLTIxNyw4ICsyMTgsOSBAQAogICAgIFB5X3NzaXplX3QgaGludCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8TyY6cmVhZGxpbmVzIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZoaW50KSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZoaW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fSU9CYXNlX3JlYWRsaW5lc19pbXBsKHNlbGYsIGhpbnQpOwogCiBleGl0OgpAQCAtMjUxLDggKzI1Myw5IEBACiAgICAgUHlfc3NpemVfdCBuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWQiLAotICAgICAgICAmbikpCisgICAgICAgICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fUmF3SU9CYXNlX3JlYWRfaW1wbChzZWxmLCBuKTsKIAogZXhpdDoKQEAgLTI3Niw0ICsyNzksNCBAQAogewogICAgIHJldHVybiBfaW9fX1Jhd0lPQmFzZV9yZWFkYWxsX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Yjg3NDk1MmY1Y2MyNDhhNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGY1M2ZlZDkyOGQ4ZTAyZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvc3RyaW5naW8uYy5oIGIvTW9kdWxlcy9faW8vY2xpbmljL3N0cmluZ2lvLmMuaAppbmRleCBhOGUzMmEzLi5jZTlmNDZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvc3RyaW5naW8uYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmgKQEAgLTYxLDggKzYxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fU3RyaW5nSU9fcmVhZF9pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC05MSw4ICs5Miw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19yZWFkbGluZV9pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC0xMjMsOCArMTI1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3RydW5jYXRlX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTE1Nyw4ICsxNjAsOSBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGk6c2VlayIsCi0gICAgICAgICZwb3MsICZ3aGVuY2UpKQorICAgICAgICAmcG9zLCAmd2hlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19zZWVrX2ltcGwoc2VsZiwgcG9zLCB3aGVuY2UpOwogCiBleGl0OgpAQCAtMjIyLDggKzIyNiw5IEBACiAgICAgUHlPYmplY3QgKm5ld2xpbmVfb2JqID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPTzpTdHJpbmdJTyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnZhbHVlLCAmbmV3bGluZV9vYmopKQorICAgICAgICAmdmFsdWUsICZuZXdsaW5lX29iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fU3RyaW5nSU9fX19pbml0X19faW1wbCgoc3RyaW5naW8gKilzZWxmLCB2YWx1ZSwgbmV3bGluZV9vYmopOwogCiBleGl0OgpAQCAtMjgzLDQgKzI4OCw0IEBACiB7CiAgICAgcmV0dXJuIF9pb19TdHJpbmdJT19zZWVrYWJsZV9pbXBsKHNlbGYpOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWYwNjFjZjNhMjBjZDE0ZWQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA1MTMyMTk1ODFjYmU5NTIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL3RleHRpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvdGV4dGlvLmMuaAppbmRleCBkYzdlOGM3Li5mMTE1MzI2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvdGV4dGlvLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvdGV4dGlvLmMuaApAQCAtMzAsOCArMzAsOSBAQAogICAgIFB5T2JqZWN0ICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT2l8TzpJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZGVjb2RlciwgJnRyYW5zbGF0ZSwgJmVycm9ycykpCisgICAgICAgICZkZWNvZGVyLCAmdHJhbnNsYXRlLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19JbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyX19faW5pdF9fX2ltcGwoKG5sZGVjb2Rlcl9vYmplY3QgKilzZWxmLCBkZWNvZGVyLCB0cmFuc2xhdGUsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC01OSw4ICs2MCw5IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmZpbmFsKSkKKyAgICAgICAgJmlucHV0LCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfZGVjb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGZpbmFsKTsKIAogZXhpdDoKQEAgLTE2Miw4ICsxNjQsOSBAQAogICAgIGludCB3cml0ZV90aHJvdWdoID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98enp6aWk6VGV4dElPV3JhcHBlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmJ1ZmZlciwgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmxpbmVfYnVmZmVyaW5nLCAmd3JpdGVfdGhyb3VnaCkpCisgICAgICAgICZidWZmZXIsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZsaW5lX2J1ZmZlcmluZywgJndyaXRlX3Rocm91Z2gpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfX19pbml0X19faW1wbCgodGV4dGlvICopc2VsZiwgYnVmZmVyLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZywgd3JpdGVfdGhyb3VnaCk7CiAKIGV4aXQ6CkBAIC0yMDQsOCArMjA3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqdGV4dDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTp3cml0ZSIsICZ0ZXh0KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6d3JpdGUiLCAmdGV4dCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl93cml0ZV9pbXBsKHNlbGYsIHRleHQpOwogCiBleGl0OgpAQCAtMjMwLDggKzIzNCw5IEBACiAgICAgUHlfc3NpemVfdCBuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19UZXh0SU9XcmFwcGVyX3JlYWRfaW1wbChzZWxmLCBuKTsKIAogZXhpdDoKQEAgLTI1Niw4ICsyNjEsOSBAQAogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpyZWFkbGluZSIsCi0gICAgICAgICZzaXplKSkKKyAgICAgICAgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfcmVhZGxpbmVfaW1wbChzZWxmLCBzaXplKTsKIAogZXhpdDoKQEAgLTI4Myw4ICsyODksOSBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsCi0gICAgICAgICZjb29raWVPYmosICZ3aGVuY2UpKQorICAgICAgICAmY29va2llT2JqLCAmd2hlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19UZXh0SU9XcmFwcGVyX3NlZWtfaW1wbChzZWxmLCBjb29raWVPYmosIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0zMjcsOCArMzM0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvcykpCisgICAgICAgICZwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfdHJ1bmNhdGVfaW1wbChzZWxmLCBwb3MpOwogCiBleGl0OgpAQCAtNDUzLDQgKzQ2MSw0IEBACiB7CiAgICAgcmV0dXJuIF9pb19UZXh0SU9XcmFwcGVyX2Nsb3NlX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjkwNjA4Zjg1YWFiOGJhNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzFhMzliYmJlMDdhZTRlNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9maWxlaW8uYyBiL01vZHVsZXMvX2lvL2ZpbGVpby5jCmluZGV4IDkxOWNmNTAuLjEyZTUxNTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2ZpbGVpby5jCisrKyBiL01vZHVsZXMvX2lvL2ZpbGVpby5jCkBAIC05Miw4ICs5Miw3IEBACiAgICAgaWYgKHNlbGYtPmZkID49IDAgJiYgc2VsZi0+Y2xvc2VmZCkgewogICAgICAgICBQeU9iamVjdCAqZXhjLCAqdmFsLCAqdGI7CiAgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7Ci0gICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX1Jlc291cmNlV2FybmluZywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuY2xvc2VkIGZpbGUgJVIiLCBzb3VyY2UpKSB7CisgICAgICAgIGlmIChQeUVycl9SZXNvdXJjZVdhcm5pbmcoc291cmNlLCAxLCAidW5jbG9zZWQgZmlsZSAlUiIsIHNvdXJjZSkpIHsKICAgICAgICAgICAgIC8qIFNwdXJpb3VzIGVycm9ycyBjYW4gYXBwZWFyIGF0IHNodXRkb3duICovCiAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19XYXJuaW5nKSkKICAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopIHNlbGYpOwpAQCAtNTQ2LDcgKzU0NSw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1lcnJfbW9kZShjaGFyICphY3Rpb24pCitlcnJfbW9kZShjb25zdCBjaGFyICphY3Rpb24pCiB7CiAgICAgX1B5SU9fU3RhdGUgKnN0YXRlID0gSU9fU1RBVEUoKTsKICAgICBpZiAoc3RhdGUgIT0gTlVMTCkKQEAgLTEwNDksNyArMTA0OCw3IEBACiB9CiAjZW5kaWYgLyogSEFWRV9GVFJVTkNBVEUgKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogbW9kZV9zdHJpbmcoZmlsZWlvICpzZWxmKQogewogICAgIGlmIChzZWxmLT5jcmVhdGVkKSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9pb2Jhc2UuYyBiL01vZHVsZXMvX2lvL2lvYmFzZS5jCmluZGV4IDIxMmIwZGQuLmYwN2EwY2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2lvYmFzZS5jCisrKyBiL01vZHVsZXMvX2lvL2lvYmFzZS5jCkBAIC04MjgsNyArODI4LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCi0gICAgKGRlc3RydWN0b3IpaW9iYXNlX2ZpbmFsaXplLCAvKiB0cF9maW5hbGl6ZSAqLworICAgIGlvYmFzZV9maW5hbGl6ZSwgICAgICAgICAgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9zdHJpbmdpby5jIGIvTW9kdWxlcy9faW8vc3RyaW5naW8uYwppbmRleCAwNmI0MTQ0Li5lY2Y2ZGMxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9zdHJpbmdpby5jCisrKyBiL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUlPX3N0cl9yZWFkbGluZSwgTlVMTCk7CiAgICAgICAgIGlmIChsaW5lICYmICFQeVVuaWNvZGVfQ2hlY2sobGluZSkpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIHN0ciBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHN0ciBvYmplY3QsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICclLjIwMHMnIiwgUHlfVFlQRShsaW5lKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3RleHRpby5jIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKaW5kZXggMDYzY2FhNi4uOTZjOGU3YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vdGV4dGlvLmMKKysrIGIvTW9kdWxlcy9faW8vdGV4dGlvLmMKQEAgLTc3Miw3ICs3NzIsNyBAQAogICAgIGVuY29kZWZ1bmNfdCBlbmNvZGVmdW5jOwogfSBlbmNvZGVmdW5jZW50cnk7CiAKLXN0YXRpYyBlbmNvZGVmdW5jZW50cnkgZW5jb2RlZnVuY3NbXSA9IHsKK3N0YXRpYyBjb25zdCBlbmNvZGVmdW5jZW50cnkgZW5jb2RlZnVuY3NbXSA9IHsKICAgICB7ImFzY2lpIiwgICAgICAgKGVuY29kZWZ1bmNfdCkgYXNjaWlfZW5jb2RlfSwKICAgICB7Imlzbzg4NTktMSIsICAgKGVuY29kZWZ1bmNfdCkgbGF0aW4xX2VuY29kZX0sCiAgICAgeyJ1dGYtOCIsICAgICAgIChlbmNvZGVmdW5jX3QpIHV0ZjhfZW5jb2RlfSwKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socmVzKSkgewotICAgICAgICAgICAgZW5jb2RlZnVuY2VudHJ5ICplID0gZW5jb2RlZnVuY3M7CisgICAgICAgICAgICBjb25zdCBlbmNvZGVmdW5jZW50cnkgKmUgPSBlbmNvZGVmdW5jczsKICAgICAgICAgICAgIHdoaWxlIChlLT5uYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKHJlcywgZS0+bmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2VsZi0+ZW5jb2RlZnVuYyA9IGUtPmVuY29kZWZ1bmM7CkBAIC0xNjQ0LDggKzE2NDQsOCBAQAogLyogTk9URTogYGVuZGAgbXVzdCBwb2ludCB0byB0aGUgcmVhbCBlbmQgb2YgdGhlIFB5X1VDUzQgc3RvcmFnZSwKICAgIHRoYXQgaXMgdG8gdGhlIE5VTCBjaGFyYWN0ZXIuIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gd2lsbCBwcm9kdWNlCiAgICBpbmNvcnJlY3QgcmVzdWx0cy4gKi8KLXN0YXRpYyBjaGFyICoKLWZpbmRfY29udHJvbF9jaGFyKGludCBraW5kLCBjaGFyICpzLCBjaGFyICplbmQsIFB5X1VDUzQgY2gpCitzdGF0aWMgY29uc3QgY2hhciAqCitmaW5kX2NvbnRyb2xfY2hhcihpbnQga2luZCwgY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZW5kLCBQeV9VQ1M0IGNoKQogewogICAgIGlmIChraW5kID09IFB5VW5pY29kZV8xQllURV9LSU5EKSB7CiAgICAgICAgIGFzc2VydChjaCA8IDI1Nik7CkBAIC0xNjY1LDEzICsxNjY1LDEzIEBACiBQeV9zc2l6ZV90CiBfUHlJT19maW5kX2xpbmVfZW5kaW5nKAogICAgIGludCB0cmFuc2xhdGVkLCBpbnQgdW5pdmVyc2FsLCBQeU9iamVjdCAqcmVhZG5sLAotICAgIGludCBraW5kLCBjaGFyICpzdGFydCwgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKKyAgICBpbnQga2luZCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpCiB7CiAgICAgUHlfc3NpemVfdCBsZW4gPSAoKGNoYXIqKWVuZCAtIChjaGFyKilzdGFydCkva2luZDsKIAogICAgIGlmICh0cmFuc2xhdGVkKSB7CiAgICAgICAgIC8qIE5ld2xpbmVzIGFyZSBhbHJlYWR5IHRyYW5zbGF0ZWQsIG9ubHkgc2VhcmNoIGZvciBcbiAqLwotICAgICAgICBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCAnXG4nKTsKKyAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgJ1xuJyk7CiAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAocG9zIC0gc3RhcnQpL2tpbmQgKyAxOwogICAgICAgICBlbHNlIHsKQEAgLTE2ODMsNyArMTY4Myw3IEBACiAgICAgICAgIC8qIFVuaXZlcnNhbCBuZXdsaW5lIHNlYXJjaC4gRmluZCBhbnkgb2YgXHIsIFxyXG4sIFxuCiAgICAgICAgICAqIFRoZSBkZWNvZGVyIGVuc3VyZXMgdGhhdCBcclxuIGFyZSBub3Qgc3BsaXQgaW4gdHdvIHBpZWNlcwogICAgICAgICAgKi8KLSAgICAgICAgY2hhciAqcyA9IHN0YXJ0OworICAgICAgICBjb25zdCBjaGFyICpzID0gc3RhcnQ7CiAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgIFB5X1VDUzQgY2g7CiAgICAgICAgICAgICAvKiBGYXN0IHBhdGggZm9yIG5vbi1jb250cm9sIGNoYXJzLiBUaGUgbG9vcCBhbHdheXMgZW5kcwpAQCAtMTcxMywyMSArMTcxMywyMSBAQAogICAgICAgICAvKiBBc3N1bWUgdGhhdCByZWFkbmwgaXMgYW4gQVNDSUkgY2hhcmFjdGVyLiAqLwogICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVhZG5sKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CiAgICAgICAgIGlmIChyZWFkbmxfbGVuID09IDEpIHsKLSAgICAgICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsIG5sWzBdKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsIG5sWzBdKTsKICAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gKHBvcyAtIHN0YXJ0KS9raW5kICsgMTsKICAgICAgICAgICAgICpjb25zdW1lZCA9IGxlbjsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgKnMgPSBzdGFydDsKLSAgICAgICAgICAgIGNoYXIgKmUgPSBlbmQgLSAocmVhZG5sX2xlbiAtIDEpKmtpbmQ7Ci0gICAgICAgICAgICBjaGFyICpwb3M7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gc3RhcnQ7CisgICAgICAgICAgICBjb25zdCBjaGFyICplID0gZW5kIC0gKHJlYWRubF9sZW4gLSAxKSpraW5kOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zOwogICAgICAgICAgICAgaWYgKGUgPCBzKQogICAgICAgICAgICAgICAgIGUgPSBzOwogICAgICAgICAgICAgd2hpbGUgKHMgPCBlKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICAgICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHMsIGVuZCwgbmxbMF0pOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHMsIGVuZCwgbmxbMF0pOwogICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gTlVMTCB8fCBwb3MgPj0gZSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHJlYWRubF9sZW47IGkrKykgewpAQCAtMjY4OSw3ICsyNjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlJT19zdHJfcmVhZGxpbmUsIE5VTEwpOwogICAgICAgICBpZiAobGluZSAmJiAhUHlVbmljb2RlX0NoZWNrKGxpbmUpKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSU9FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBzdHIgb2JqZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBzdHIgb2JqZWN0LCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAnJS4yMDBzJyIsIFB5X1RZUEUobGluZSktPnRwX25hbWUpOwogICAgICAgICAgICAgUHlfREVDUkVGKGxpbmUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19qc29uLmMgYi9Nb2R1bGVzL19qc29uLmMKaW5kZXggZjgyYWYzNC4uZDNkYmY5OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fanNvbi5jCisrKyBiL01vZHVsZXMvX2pzb24uYwpAQCAtMTEyLDcgKzExMiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2VuY29kZWRfY29uc3QoUHlPYmplY3QgKm9iaik7CiBzdGF0aWMgdm9pZAotcmFpc2VfZXJybXNnKGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKTsKK3JhaXNlX2Vycm1zZyhjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCk7CiBzdGF0aWMgUHlPYmplY3QgKgogZW5jb2Rlcl9lbmNvZGVfc3RyaW5nKFB5RW5jb2Rlck9iamVjdCAqcywgUHlPYmplY3QgKm9iaik7CiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMzIxLDcgKzMyMSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1yYWlzZV9lcnJtc2coY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpCityYWlzZV9lcnJtc2coY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpCiB7CiAgICAgLyogVXNlIEpTT05EZWNvZGVFcnJvciBleGNlcHRpb24gdG8gcmFpc2UgYSBuaWNlIGxvb2tpbmcgVmFsdWVFcnJvciBzdWJjbGFzcyAqLwogICAgIHN0YXRpYyBQeU9iamVjdCAqSlNPTkRlY29kZUVycm9yID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKaW5kZXggYjFkNmFkZC4uYTkyZmIxMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogLyogdGhlIGdyb3VwaW5nIGlzIHRlcm1pbmF0ZWQgYnkgZWl0aGVyIDAgb3IgQ0hBUl9NQVggKi8KIHN0YXRpYyBQeU9iamVjdCoKLWNvcHlfZ3JvdXBpbmcoY2hhciogcykKK2NvcHlfZ3JvdXBpbmcoY29uc3QgY2hhciogcykKIHsKICAgICBpbnQgaTsKICAgICBQeU9iamVjdCAqcmVzdWx0LCAqdmFsID0gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2xzcHJvZi5jIGIvTW9kdWxlcy9fbHNwcm9mLmMKaW5kZXggNjZlNTM0Zi4uY2NmYjUxMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbHNwcm9mLmMKKysrIGIvTW9kdWxlcy9fbHNwcm9mLmMKQEAgLTc2Miw3ICs3NjIsNiBAQAogc3RhdGljIGludAogcHJvZmlsZXJfaW5pdChQcm9maWxlck9iamVjdCAqcE9iaiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKLSAgICBQeU9iamVjdCAqbzsKICAgICBQeU9iamVjdCAqdGltZXIgPSBOVUxMOwogICAgIGRvdWJsZSB0aW1ldW5pdCA9IDAuMDsKICAgICBpbnQgc3ViY2FsbHMgPSAxOwpAQCAtNzc3LDExICs3NzYsOSBAQAogCiAgICAgaWYgKHNldFN1YmNhbGxzKHBPYmosIHN1YmNhbGxzKSA8IDAgfHwgc2V0QnVpbHRpbnMocE9iaiwgYnVpbHRpbnMpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIG8gPSBwT2JqLT5leHRlcm5hbFRpbWVyOwotICAgIHBPYmotPmV4dGVybmFsVGltZXIgPSB0aW1lcjsKLSAgICBQeV9YSU5DUkVGKHRpbWVyKTsKLSAgICBQeV9YREVDUkVGKG8pOwogICAgIHBPYmotPmV4dGVybmFsVGltZXJVbml0ID0gdGltZXVuaXQ7CisgICAgUHlfWElOQ1JFRih0aW1lcik7CisgICAgUHlfWFNFVFJFRihwT2JqLT5leHRlcm5hbFRpbWVyLCB0aW1lcik7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2x6bWFtb2R1bGUuYyBiL01vZHVsZXMvX2x6bWFtb2R1bGUuYwppbmRleCA4NDZkYzBlLi41MjZkY2VmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sem1hbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fbHptYW1vZHVsZS5jCkBAIC01NTMsNyArNTUzLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFDb21wcmVzc29yLmNvbXByZXNzCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkNvbXByZXNzb3IgKiIpCiAgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgLwogCkBAIC01NjcsNyArNTY2LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF9sem1hX0xaTUFDb21wcmVzc29yX2NvbXByZXNzX2ltcGwoQ29tcHJlc3NvciAqc2VsZiwgUHlfYnVmZmVyICpkYXRhKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTMxZjYxNTEzNjk2M2UwMGYgaW5wdXQ9OGI2MGNiMTNlMGNlNjQyMF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTMxZjYxNTEzNjk2M2UwMGYgaW5wdXQ9NjQwMTllYWM3ZjJjYzhkMF0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCkBAIC01ODMsOCArNTgyLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFDb21wcmVzc29yLmZsdXNoCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkNvbXByZXNzb3IgKiIpCi0KIEZpbmlzaCB0aGUgY29tcHJlc3Npb24gcHJvY2Vzcy4KIAogUmV0dXJucyB0aGUgY29tcHJlc3NlZCBkYXRhIGxlZnQgaW4gaW50ZXJuYWwgYnVmZmVycy4KQEAgLTU5NCw3ICs1OTEsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQUNvbXByZXNzb3JfZmx1c2hfaW1wbChDb21wcmVzc29yICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlYzIxZjNlMjI1MDRmNTAgaW5wdXQ9MzA2MGZiMjZmOWI0MDQyY10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlYzIxZjNlMjI1MDRmNTAgaW5wdXQ9NmIzNjkzMDNmNjdhZDBhOF0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCkBAIC02OTgsNyArNjk1LDYgQEAKIC8qWy1jbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BQ29tcHJlc3Nvci5fX2luaXRfXwogCi0gICAgc2VsZjogc2VsZih0eXBlPSJDb21wcmVzc29yICoiKQogICAgIGZvcm1hdDogaW50KGNfZGVmYXVsdD0iRk9STUFUX1haIikgPSBGT1JNQVRfWFoKICAgICAgICAgVGhlIGNvbnRhaW5lciBmb3JtYXQgdG8gdXNlIGZvciB0aGUgb3V0cHV0LiAgVGhpcyBjYW4KICAgICAgICAgYmUgRk9STUFUX1haIChkZWZhdWx0KSwgRk9STUFUX0FMT05FLCBvciBGT1JNQVRfUkFXLgpAQCAtMTA2Myw3ICsxMDU5LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFEZWNvbXByZXNzb3IuZGVjb21wcmVzcwogCi0gICAgc2VsZjogc2VsZih0eXBlPSJEZWNvbXByZXNzb3IgKiIpCiAgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgbWF4X2xlbmd0aDogUHlfc3NpemVfdD0tMQogCkBAIC0xMDg2LDcgKzEwODEsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfZGVjb21wcmVzc19pbXBsKERlY29tcHJlc3NvciAqc2VsZiwgUHlfYnVmZmVyICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhfbGVuZ3RoKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVmNGUyMGVjNzEyMjI0MWQgaW5wdXQ9ZjJiYjkwMmNjMWNhZjIwM10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVmNGUyMGVjNzEyMjI0MWQgaW5wdXQ9NjBjMWYxMzU4MjBlMzA5ZF0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCkBAIC0xMTI2LDcgKzExMjEsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQURlY29tcHJlc3Nvci5fX2luaXRfXwogCi0gICAgc2VsZjogc2VsZih0eXBlPSJEZWNvbXByZXNzb3IgKiIpCiAgICAgZm9ybWF0OiBpbnQoY19kZWZhdWx0PSJGT1JNQVRfQVVUTyIpID0gRk9STUFUX0FVVE8KICAgICAgICAgU3BlY2lmaWVzIHRoZSBjb250YWluZXIgZm9ybWF0IG9mIHRoZSBpbnB1dCBzdHJlYW0uICBJZiB0aGlzIGlzCiAgICAgICAgIEZPUk1BVF9BVVRPICh0aGUgZGVmYXVsdCksIHRoZSBkZWNvbXByZXNzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGRldGVjdApAQCAtMTE1Miw3ICsxMTQ2LDcgQEAKIHN0YXRpYyBpbnQKIF9sem1hX0xaTUFEZWNvbXByZXNzb3JfX19pbml0X19faW1wbChEZWNvbXByZXNzb3IgKnNlbGYsIGludCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm1lbWxpbWl0LCBQeU9iamVjdCAqZmlsdGVycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zZTE4MjFmOGFhMzY1NjRjIGlucHV0PTQ1OGNhNjEzMmVmMjk4MDFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zZTE4MjFmOGFhMzY1NjRjIGlucHV0PTgxZmU2ODRhNmMyZjhhMjddKi8KIHsKICAgICBjb25zdCB1aW50MzJfdCBkZWNvZGVyX2ZsYWdzID0gTFpNQV9URUxMX0FOWV9DSEVDSyB8IExaTUFfVEVMTF9OT19DSEVDSzsKICAgICB1aW50NjRfdCBtZW1saW1pdF8gPSBVSU5UNjRfTUFYOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jIGIvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCmluZGV4IDRhZTYzOGUuLmQ5MmE4YmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYworKysgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgIHsicmVjdiIsIG11bHRpcHJvY2Vzc2luZ19yZWN2LCBNRVRIX1ZBUkFSR1MsICIifSwKICAgICB7InNlbmQiLCBtdWx0aXByb2Nlc3Npbmdfc2VuZCwgTUVUSF9WQVJBUkdTLCAiIn0sCiAjZW5kaWYKLSNpZm5kZWYgUE9TSVhfU0VNQVBIT1JFU19OT1RfRU5BQkxFRAorI2lmICFkZWZpbmVkKFBPU0lYX1NFTUFQSE9SRVNfTk9UX0VOQUJMRUQpICYmICFkZWZpbmVkKF9fQU5EUk9JRF9fKQogICAgIHsic2VtX3VubGluayIsIF9QeU1wX3NlbV91bmxpbmssIE1FVEhfVkFSQVJHUywgIiJ9LAogI2VuZGlmCiAgICAge05VTEx9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19waWNrbGUuYyBiL01vZHVsZXMvX3BpY2tsZS5jCmluZGV4IGU1MmRhMzcuLjcxMjFhYzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3BpY2tsZS5jCisrKyBiL01vZHVsZXMvX3BpY2tsZS5jCkBAIC0xNTMsNiArMTUzLDkgQEAKICAgICBQeU9iamVjdCAqY29kZWNzX2VuY29kZTsKICAgICAvKiBidWlsdGlucy5nZXRhdHRyLCB1c2VkIGZvciBzYXZpbmcgbmVzdGVkIG5hbWVzIHdpdGggcHJvdG9jb2wgPCA0ICovCiAgICAgUHlPYmplY3QgKmdldGF0dHI7CisgICAgLyogZnVuY3Rvb2xzLnBhcnRpYWwsIHVzZWQgZm9yIGltcGxlbWVudGluZyBfX25ld29ial9leF9fIHdpdGggcHJvdG9jb2xzCisgICAgICAgMiBhbmQgMyAqLworICAgIFB5T2JqZWN0ICpwYXJ0aWFsOwogfSBQaWNrbGVTdGF0ZTsKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiB0aGUgX3BpY2tsZSBtb2R1bGUgZGVmaW5pdGlvbi4gKi8KQEAgLTE5MCw2ICsxOTMsNyBAQAogICAgIFB5X0NMRUFSKHN0LT5pbXBvcnRfbWFwcGluZ18zdG8yKTsKICAgICBQeV9DTEVBUihzdC0+Y29kZWNzX2VuY29kZSk7CiAgICAgUHlfQ0xFQVIoc3QtPmdldGF0dHIpOworICAgIFB5X0NMRUFSKHN0LT5wYXJ0aWFsKTsKIH0KIAogLyogSW5pdGlhbGl6ZSB0aGUgZ2l2ZW4gcGlja2xlIG1vZHVsZSBzdGF0ZS4gKi8KQEAgLTIwMCw2ICsyMDQsNyBAQAogICAgIFB5T2JqZWN0ICpjb3B5cmVnID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29tcGF0X3BpY2tsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmNvZGVjcyA9IE5VTEw7CisgICAgUHlPYmplY3QgKmZ1bmN0b29scyA9IE5VTEw7CiAKICAgICBidWlsdGlucyA9IFB5RXZhbF9HZXRCdWlsdGlucygpOwogICAgIGlmIChidWlsdGlucyA9PSBOVUxMKQpAQCAtMzE0LDEyICszMTksMjEgQEAKICAgICB9CiAgICAgUHlfQ0xFQVIoY29kZWNzKTsKIAorICAgIGZ1bmN0b29scyA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZnVuY3Rvb2xzIik7CisgICAgaWYgKCFmdW5jdG9vbHMpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgc3QtPnBhcnRpYWwgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGZ1bmN0b29scywgInBhcnRpYWwiKTsKKyAgICBpZiAoIXN0LT5wYXJ0aWFsKQorICAgICAgICBnb3RvIGVycm9yOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CisKICAgICByZXR1cm4gMDsKIAogICBlcnJvcjoKICAgICBQeV9DTEVBUihjb3B5cmVnKTsKICAgICBQeV9DTEVBUihjb21wYXRfcGlja2xlKTsKICAgICBQeV9DTEVBUihjb2RlY3MpOworICAgIFB5X0NMRUFSKGZ1bmN0b29scyk7CiAgICAgX1BpY2tsZV9DbGVhclN0YXRlKHN0KTsKICAgICByZXR1cm4gLTE7CiB9CkBAIC0zNTYsMTggKzM3MCwxMiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludAotc3RhY2tfdW5kZXJmbG93KHZvaWQpCi17Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qIEludGVybmFsIGRhdGEgdHlwZSB1c2VkIGFzIHRoZSB1bnBpY2tsaW5nIHN0YWNrLiAqLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgUHlPYmplY3QgKipkYXRhOworICAgIGludCBtYXJrX3NldDsgICAgICAgICAgLyogaXMgTUFSSyBzZXQ/ICovCisgICAgUHlfc3NpemVfdCBmZW5jZTsgICAgICAvKiBwb3NpdGlvbiBvZiB0b3AgTUFSSyBvciAwICovCiAgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7ICAvKiBudW1iZXIgb2Ygc2xvdHMgaW4gZGF0YSBhbGxvY2F0ZWQgKi8KIH0gUGRhdGE7CiAKQEAgLTM5OCw2ICs0MDYsOCBAQAogICAgIGlmICghKHNlbGYgPSBQeU9iamVjdF9OZXcoUGRhdGEsICZQZGF0YV9UeXBlKSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1NJWkUoc2VsZikgPSAwOworICAgIHNlbGYtPm1hcmtfc2V0ID0gMDsKKyAgICBzZWxmLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+YWxsb2NhdGVkID0gODsKICAgICBzZWxmLT5kYXRhID0gUHlNZW1fTUFMTE9DKHNlbGYtPmFsbG9jYXRlZCAqIHNpemVvZihQeU9iamVjdCAqKSk7CiAgICAgaWYgKHNlbGYtPmRhdGEpCkBAIC00MTUsOCArNDI1LDcgQEAKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBQeV9TSVpFKHNlbGYpOwogCi0gICAgaWYgKGNsZWFydG8gPCAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgYXNzZXJ0KGNsZWFydG8gPj0gc2VsZi0+ZmVuY2UpOwogICAgIGlmIChjbGVhcnRvID49IGkpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC00NTIsNiArNDYxLDE3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW50CitQZGF0YV9zdGFja191bmRlcmZsb3coUGRhdGEgKnNlbGYpCit7CisgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLT5tYXJrX3NldCA/CisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIE1BUksgZm91bmQiIDoKKyAgICAgICAgICAgICAgICAgICAgInVucGlja2xpbmcgc3RhY2sgdW5kZXJmbG93Iik7CisgICAgcmV0dXJuIC0xOworfQorCiAvKiBEIGlzIGEgUGRhdGEqLiAgUG9wIHRoZSB0b3Btb3N0IGVsZW1lbnQgYW5kIHN0b3JlIGl0IGludG8gViwgd2hpY2gKICAqIG11c3QgYmUgYW4gbHZhbHVlIGhvbGRpbmcgUHlPYmplY3QqLiAgT24gc3RhY2sgdW5kZXJmbG93LCBVbnBpY2tsaW5nRXJyb3IKICAqIGlzIHJhaXNlZCBhbmQgViBpcyBzZXQgdG8gTlVMTC4KQEAgLTQ1OSw5ICs0NzksOCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFBkYXRhX3BvcChQZGF0YSAqc2VsZikKIHsKLSAgICBpZiAoUHlfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJiYWQgcGlja2xlIGRhdGEiKTsKKyAgICBpZiAoUHlfU0laRShzZWxmKSA8PSBzZWxmLT5mZW5jZSkgeworICAgICAgICBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gc2VsZi0+ZGF0YVstLVB5X1NJWkUoc2VsZildOwpAQCAtNDkzLDYgKzUxMiwxMCBAQAogICAgIFB5T2JqZWN0ICp0dXBsZTsKICAgICBQeV9zc2l6ZV90IGxlbiwgaSwgajsKIAorICAgIGlmIChzdGFydCA8IHNlbGYtPmZlbmNlKSB7CisgICAgICAgIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGxlbiA9IFB5X1NJWkUoc2VsZikgLSBzdGFydDsKICAgICB0dXBsZSA9IFB5VHVwbGVfTmV3KGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC04NjAsNyArODgzLDcgQEAKIHsKICAgICBzaXplX3QgaTsKIAotICAgIGFzc2VydChzaXplb2Yoc2l6ZV90KSA8PSA4KTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKHNpemVfdCkgPD0gOCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNpemVfdCk7IGkrKykgewogICAgICAgICBvdXRbaV0gPSAodW5zaWduZWQgY2hhcikoKHZhbHVlID4+ICg4ICogaSkpICYgMHhmZik7CkBAIC0xMTc0LDIxICsxMTk3LDkgQEAKICAgICByZXR1cm4gcmVhZF9zaXplOwogfQogCi0vKiBSZWFkIGBuYCBieXRlcyBmcm9tIHRoZSB1bnBpY2tsZXIncyBkYXRhIHNvdXJjZSwgc3RvcmluZyB0aGUgcmVzdWx0IGluIGAqc2AuCi0KLSAgIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIGFsbCBkYXRhIHJlYWRzLCByYXRoZXIgdGhhbiBhY2Nlc3NpbmcgdGhlIHVucGlja2xlcidzCi0gICBpbnB1dCBidWZmZXIgZGlyZWN0bHkuIFRoaXMgbWV0aG9kIGRlYWxzIGNvcnJlY3RseSB3aXRoIHJlYWRpbmcgZnJvbSBpbnB1dAotICAgc3RyZWFtcywgd2hpY2ggdGhlIGlucHV0IGJ1ZmZlciBkb2Vzbid0IGRlYWwgd2l0aC4KLQotICAgTm90ZSB0aGF0IHdoZW4gcmVhZGluZyBmcm9tIGEgZmlsZS1saWtlIG9iamVjdCwgc2VsZi0+bmV4dF9yZWFkX2lkeCB3b24ndAotICAgYmUgdXBkYXRlZCAoaXQgc2hvdWxkIHJlbWFpbiBhdCAwIGZvciB0aGUgZW50aXJlIHVucGlja2xpbmcgcHJvY2VzcykuIFlvdQotICAgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uJ3MgcmV0dXJuIHZhbHVlIHRvIGtub3cgaG93IG1hbnkgYnl0ZXMgeW91IGNhbgotICAgY29uc3VtZS4KLQotICAgUmV0dXJucyAtMSAod2l0aCBhbiBleGNlcHRpb24gc2V0KSBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCByZXR1cm4gdGhlCi0gICBudW1iZXIgb2YgY2hhcnMgcmVhZC4gKi8KKy8qIERvbid0IGNhbGwgaXQgZGlyZWN0bHk6IHVzZSBfVW5waWNrbGVyX1JlYWQoKSAqLwogc3RhdGljIFB5X3NzaXplX3QKLV9VbnBpY2tsZXJfUmVhZChVbnBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKipzLCBQeV9zc2l6ZV90IG4pCitfVW5waWNrbGVyX1JlYWRJbXBsKFVucGlja2xlck9iamVjdCAqc2VsZiwgY2hhciAqKnMsIFB5X3NzaXplX3QgbikKIHsKICAgICBQeV9zc2l6ZV90IG51bV9yZWFkOwogCkBAIC0xMTk5LDExICsxMjEwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZCB3b3VsZCBvdmVyZmxvdyAoaW52YWxpZCBieXRlY29kZSkiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoc2VsZi0+bmV4dF9yZWFkX2lkeCArIG4gPD0gc2VsZi0+aW5wdXRfbGVuKSB7Ci0gICAgICAgICpzID0gc2VsZi0+aW5wdXRfYnVmZmVyICsgc2VsZi0+bmV4dF9yZWFkX2lkeDsKLSAgICAgICAgc2VsZi0+bmV4dF9yZWFkX2lkeCArPSBuOwotICAgICAgICByZXR1cm4gbjsKLSAgICB9CisKKyAgICAvKiBUaGlzIGNhc2UgaXMgaGFuZGxlZCBieSB0aGUgX1VucGlja2xlcl9SZWFkKCkgbWFjcm8gZm9yIGVmZmljaWVuY3kgKi8KKyAgICBhc3NlcnQoc2VsZi0+bmV4dF9yZWFkX2lkeCArIG4gPiBzZWxmLT5pbnB1dF9sZW4pOworCiAgICAgaWYgKCFzZWxmLT5yZWFkKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19FT0ZFcnJvciwgIlJhbiBvdXQgb2YgaW5wdXQiKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTIyMCw2ICsxMjMwLDI2IEBACiAgICAgcmV0dXJuIG47CiB9CiAKKy8qIFJlYWQgYG5gIGJ5dGVzIGZyb20gdGhlIHVucGlja2xlcidzIGRhdGEgc291cmNlLCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gYCpzYC4KKworICAgVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGRhdGEgcmVhZHMsIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgdW5waWNrbGVyJ3MKKyAgIGlucHV0IGJ1ZmZlciBkaXJlY3RseS4gVGhpcyBtZXRob2QgZGVhbHMgY29ycmVjdGx5IHdpdGggcmVhZGluZyBmcm9tIGlucHV0CisgICBzdHJlYW1zLCB3aGljaCB0aGUgaW5wdXQgYnVmZmVyIGRvZXNuJ3QgZGVhbCB3aXRoLgorCisgICBOb3RlIHRoYXQgd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlLWxpa2Ugb2JqZWN0LCBzZWxmLT5uZXh0X3JlYWRfaWR4IHdvbid0CisgICBiZSB1cGRhdGVkIChpdCBzaG91bGQgcmVtYWluIGF0IDAgZm9yIHRoZSBlbnRpcmUgdW5waWNrbGluZyBwcm9jZXNzKS4gWW91CisgICBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgdG8ga25vdyBob3cgbWFueSBieXRlcyB5b3UgY2FuCisgICBjb25zdW1lLgorCisgICBSZXR1cm5zIC0xICh3aXRoIGFuIGV4Y2VwdGlvbiBzZXQpIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHJldHVybiB0aGUKKyAgIG51bWJlciBvZiBjaGFycyByZWFkLiAqLworI2RlZmluZSBfVW5waWNrbGVyX1JlYWQoc2VsZiwgcywgbikgXAorICAgICgoKG4pIDw9IChzZWxmKS0+aW5wdXRfbGVuIC0gKHNlbGYpLT5uZXh0X3JlYWRfaWR4KSAgICAgIFwKKyAgICAgPyAoKihzKSA9IChzZWxmKS0+aW5wdXRfYnVmZmVyICsgKHNlbGYpLT5uZXh0X3JlYWRfaWR4LCBcCisgICAgICAgIChzZWxmKS0+bmV4dF9yZWFkX2lkeCArPSAobiksICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAobikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgOiBfVW5waWNrbGVyX1JlYWRJbXBsKHNlbGYsIChzKSwgKG4pKSkKKwogc3RhdGljIFB5X3NzaXplX3QKIF9VbnBpY2tsZXJfQ29weUxpbmUoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICpsaW5lLCBQeV9zc2l6ZV90IGxlbiwKICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnJlc3VsdCkKQEAgLTIwOTYsMzggKzIxMjYsMzUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiByYXdfdW5pY29kZV9lc2NhcGUoUHlPYmplY3QgKm9iaikKIHsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwogICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKLSAgICBzaXplX3QgZXhwYW5kc2l6ZTsKICAgICB2b2lkICpkYXRhOwogICAgIHVuc2lnbmVkIGludCBraW5kOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkob2JqKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCiAgICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKG9iaik7CiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKG9iaik7Ci0gICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzRCWVRFX0tJTkQpCi0gICAgICAgIGV4cGFuZHNpemUgPSAxMDsKLSAgICBlbHNlCi0gICAgICAgIGV4cGFuZHNpemUgPSA2OwogCi0gICAgaWYgKChzaXplX3Qpc2l6ZSA+IChzaXplX3QpUFlfU1NJWkVfVF9NQVggLyBleHBhbmRzaXplKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICByZXByID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBleHBhbmRzaXplICogc2l6ZSk7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIHJlcHI7Ci0gICAgYXNzZXJ0KFB5X1JFRkNOVChyZXByKSA9PSAxKTsKKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgc2l6ZSk7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAotICAgIHAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKICAgICBmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CiAgICAgICAgIC8qIE1hcCAzMi1iaXQgY2hhcmFjdGVycyB0byAnXFV4eHh4eHh4eCcgKi8KICAgICAgICAgaWYgKGNoID49IDB4MTAwMDApIHsKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMTAtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdVJzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4Zl07CkBAIC0yMTM5LDggKzIxNjYsMTMgQEAKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDQpICYgMHhmXTsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbY2ggJiAxNV07CiAgICAgICAgIH0KLSAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCisgICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycywgJ1xcJyBhbmQgJ1xuJyB0byAnXHV4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAyNTYgfHwgY2ggPT0gJ1xcJyB8fCBjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4Zl07CkBAIC0yMTUyLDE0ICsyMTg0LDE2IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgfQotICAgIHNpemUgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgc2l6ZSkgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVwcjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQKLXdyaXRlX3V0ZjgoUGlja2xlck9iamVjdCAqc2VsZiwgY2hhciAqZGF0YSwgUHlfc3NpemVfdCBzaXplKQord3JpdGVfdXRmOChQaWNrbGVyT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IHNpemUpCiB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAgICAgUHlfc3NpemVfdCBsZW47CkBAIC0zNTMxLDExICszNTY1LDkgQEAKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWUpKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZi0+cHJvdG8gPj0gNCkgewotICAgICAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOwotICAgICAgICAgICAgICAgIHVzZV9uZXdvYmpfZXggPSBQeVVuaWNvZGVfQ29tcGFyZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fbmV3b2JqX2V4X18pKSA9PSAwOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfZXhfXyk7CisgICAgICAgICAgICB1c2VfbmV3b2JqX2V4ID0gUHlVbmljb2RlX0NvbXBhcmUoCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIF9QeVVuaWNvZGVfRnJvbUlkKCZQeUlkX19fbmV3b2JqX2V4X18pKSA9PSAwOwogICAgICAgICAgICAgaWYgKCF1c2VfbmV3b2JqX2V4KSB7CiAgICAgICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfXyk7CiAgICAgICAgICAgICAgICAgdXNlX25ld29iaiA9IFB5VW5pY29kZV9Db21wYXJlKApAQCAtMzU3OSwxMSArMzYxMSw1OCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2xzLCAwKSA8IDAgfHwKLSAgICAgICAgICAgIHNhdmUoc2VsZiwgYXJncywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBzYXZlKHNlbGYsIGt3YXJncywgMCkgPCAwIHx8Ci0gICAgICAgICAgICBfUGlja2xlcl9Xcml0ZShzZWxmLCAmbmV3b2JqX2V4X29wLCAxKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHNlbGYtPnByb3RvID49IDQpIHsKKyAgICAgICAgICAgIGlmIChzYXZlKHNlbGYsIGNscywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBhcmdzLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIGt3YXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJm5ld29ial9leF9vcCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUHlPYmplY3QgKm5ld2FyZ3M7CisgICAgICAgICAgICBQeU9iamVjdCAqY2xzX25ldzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3X18pOworCisgICAgICAgICAgICBuZXdhcmdzID0gUHlUdXBsZV9OZXcoUHlfU0laRShhcmdzKSArIDIpOworICAgICAgICAgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIGNsc19uZXcgPSBfUHlPYmplY3RfR2V0QXR0cklkKGNscywgJlB5SWRfX19uZXdfXyk7CisgICAgICAgICAgICBpZiAoY2xzX25ldyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMCwgY2xzX25ldyk7CisgICAgICAgICAgICBQeV9JTkNSRUYoY2xzKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgMSwgY2xzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKGFyZ3MpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0obmV3YXJncywgaSArIDIsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYWxsYWJsZSA9IFB5T2JqZWN0X0NhbGwoc3QtPnBhcnRpYWwsIG5ld2FyZ3MsIGt3YXJncyk7CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgICAgICBpZiAoY2FsbGFibGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgICAgIGlmIChuZXdhcmdzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2FsbGFibGUsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwgbmV3YXJncywgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgX1BpY2tsZXJfV3JpdGUoc2VsZiwgJnJlZHVjZV9vcCwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKG5ld2FyZ3MpOworICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmICh1c2VfbmV3b2JqKSB7CkBAIC00MzkzLDcgKzQ0NzIsNyBAQAogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInbWVtbycgYXR0cmlidXRlIG11c3QgYmUgYW4gUGlja2xlck1lbW9Qcm94eSBvYmplY3QiCisgICAgICAgICAgICAgICAgICAgICAiJ21lbW8nIGF0dHJpYnV0ZSBtdXN0IGJlIGEgUGlja2xlck1lbW9Qcm94eSBvYmplY3QiCiAgICAgICAgICAgICAgICAgICAgICAib3IgZGljdCwgbm90ICUuMjAwcyIsIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC00NDIyLDggKzQ1MDEsNiBAQAogc3RhdGljIGludAogUGlja2xlcl9zZXRfcGVyc2lkKFBpY2tsZXJPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwotCiAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCIpOwpAQCAtNDQzNSwxMCArNDUxMiw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB0bXAgPSBzZWxmLT5wZXJzX2Z1bmM7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBzZWxmLT5wZXJzX2Z1bmMgPSB2YWx1ZTsKLSAgICBQeV9YREVDUkVGKHRtcCk7ICAgICAgLyogc2VsZi0+cGVyc19mdW5jIGNhbiBiZSBOVUxMLCBzbyBiZSBjYXJlZnVsLiAqLworICAgIFB5X1hTRVRSRUYoc2VsZi0+cGVyc19mdW5jLCB2YWx1ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ1MjAsMTMgKzQ1OTUsMTkgQEAKIHN0YXRpYyBQeV9zc2l6ZV90CiBtYXJrZXIoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewotICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICBQeV9zc2l6ZV90IG1hcms7CisKICAgICBpZiAoc2VsZi0+bnVtX21hcmtzIDwgMSkgeworICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAiY291bGQgbm90IGZpbmQgTUFSSyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlbGYtPm1hcmtzWy0tc2VsZi0+bnVtX21hcmtzXTsKKyAgICBtYXJrID0gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IHNlbGYtPm51bV9tYXJrcyAhPSAwOworICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IHNlbGYtPm51bV9tYXJrcyA/CisgICAgICAgICAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA6IDA7CisgICAgcmV0dXJuIG1hcms7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ5ODcsNyArNTA2OCw3IEBACiAgICAgUHlPYmplY3QgKnR1cGxlOwogCiAgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDwgbGVuKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogCiAgICAgdHVwbGUgPSBQZGF0YV9wb3B0dXBsZShzZWxmLT5zdGFjaywgUHlfU0laRShzZWxmLT5zdGFjaykgLSBsZW4pOwogICAgIGlmICh0dXBsZSA9PSBOVUxMKQpAQCAtNTA2OSw2ICs1MTUwLDEzIEBACiAgICAgaWYgKChkaWN0ID0gUHlEaWN0X05ldygpKSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gLTE7CiAKKyAgICBpZiAoKGogLSBpKSAlIDIgIT0gMCkgeworICAgICAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhzdC0+VW5waWNrbGluZ0Vycm9yLCAib2RkIG51bWJlciBvZiBpdGVtcyBmb3IgRElDVCIpOworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICBmb3IgKGsgPSBpICsgMTsgayA8IGo7IGsgKz0gMikgewogICAgICAgICBrZXkgPSBzZWxmLT5zdGFjay0+ZGF0YVtrIC0gMV07CiAgICAgICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFba107CkBAIC01MTM2LDcgKzUyMjQsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgLSBpIDwgMSkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKIAogICAgIGFyZ3MgPSBQZGF0YV9wb3B0dXBsZShzZWxmLT5zdGFjaywgaSArIDEpOwogICAgIGlmIChhcmdzID09IE5VTEwpCkBAIC01NDUzLDEyICs1NTQxLDE1IEBACiAgICAgICovCiAgICAgaWYgKHNlbGYtPm51bV9tYXJrcyA+IDAgJiYgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzIC0gMV0gPT0gbGVuKSB7CiAgICAgICAgIHNlbGYtPm51bV9tYXJrcy0tOwotICAgIH0gZWxzZSBpZiAobGVuID4gMCkgeworICAgICAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSBzZWxmLT5udW1fbWFya3MgIT0gMDsKKyAgICAgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gc2VsZi0+bnVtX21hcmtzID8KKyAgICAgICAgICAgICAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA6IDA7CisgICAgfSBlbHNlIGlmIChsZW4gPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKKyAgICBlbHNlIHsKICAgICAgICAgbGVuLS07CiAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5zdGFjay0+ZGF0YVtsZW5dKTsKICAgICAgICAgUHlfU0laRShzZWxmLT5zdGFjaykgPSBsZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTU0ODAsMTAgKzU1NzEsMTAgQEAKIGxvYWRfZHVwKFVucGlja2xlck9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqbGFzdDsKLSAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBQeV9zc2l6ZV90IGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwogCi0gICAgaWYgKChsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKSkgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChsZW4gPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBsYXN0ID0gc2VsZi0+c3RhY2stPmRhdGFbbGVuIC0gMV07CiAgICAgUERBVEFfQVBQRU5EKHNlbGYtPnN0YWNrLCBsYXN0LCAtMSk7CiAgICAgcmV0dXJuIDA7CkBAIC01NjY2LDggKzU3NTcsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYgKGxlbiA8IDIpCiAgICAgICAgIHJldHVybiBiYWRfcmVhZGxpbmUoKTsKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFbUHlfU0laRShzZWxmLT5zdGFjaykgLSAxXTsKIAogICAgIGtleSA9IFB5TG9uZ19Gcm9tU3RyaW5nKHMsIE5VTEwsIDEwKTsKQEAgLTU2OTUsOCArNTc4Niw4IEBACiAgICAgaWYgKF9VbnBpY2tsZXJfUmVhZChzZWxmLCAmcywgMSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFbUHlfU0laRShzZWxmLT5zdGFjaykgLSAxXTsKIAogICAgIGlkeCA9IFB5X0NIQVJNQVNLKHNbMF0pOwpAQCAtNTcxNCw4ICs1ODA1LDggQEAKICAgICBpZiAoX1VucGlja2xlcl9SZWFkKHNlbGYsICZzLCA0KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgaWR4ID0gY2FsY19iaW5zaXplKHMsIDQpOwpAQCAtNTczMyw4ICs1ODI0LDggQEAKIHsKICAgICBQeU9iamVjdCAqdmFsdWU7CiAKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIHZhbHVlID0gc2VsZi0+c3RhY2stPmRhdGFbUHlfU0laRShzZWxmLT5zdGFjaykgLSAxXTsKIAogICAgIHJldHVybiBfVW5waWNrbGVyX01lbW9QdXQoc2VsZiwgc2VsZi0+bWVtb19sZW4sIHZhbHVlKTsKQEAgLTU3NDgsOCArNTgzOSw4IEBACiAgICAgUHlfc3NpemVfdCBsZW4sIGk7CiAKICAgICBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKLSAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgaWYgKGxlbiA9PSB4KSAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gMDsKIApAQCAtNTc5OCw4ICs1ODg5LDggQEAKIHN0YXRpYyBpbnQKIGxvYWRfYXBwZW5kKFVucGlja2xlck9iamVjdCAqc2VsZikKIHsKLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgLSAxIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgLSAxIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgcmV0dXJuIGRvX2FwcGVuZChzZWxmLCBQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEpOwogfQogCkBAIC01ODIxLDggKzU5MTIsOCBAQAogICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7Ci0gICAgaWYgKHggPiBsZW4gfHwgeCA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKHggPiBsZW4gfHwgeCA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGlmIChsZW4gPT0geCkgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKChsZW4gLSB4KSAlIDIgIT0gMCkgewpAQCAtNTg3NSw4ICs1OTY2LDggQEAKICAgICBpZiAobWFyayA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKLSAgICBpZiAobWFyayA+IGxlbiB8fCBtYXJrIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAobWFyayA+IGxlbiB8fCBtYXJrIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgaWYgKGxlbiA9PSBtYXJrKSAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gMDsKIApAQCAtNTkzMSw4ICs2MDIyLDggQEAKICAgICAvKiBTdGFjayBpcyAuLi4gaW5zdGFuY2UsIHN0YXRlLiAgV2Ugd2FudCB0byBsZWF2ZSBpbnN0YW5jZSBhdAogICAgICAqIHRoZSBzdGFjayB0b3AsIHBvc3NpYmx5IG11dGF0ZWQgdmlhIGluc3RhbmNlLl9fc2V0c3RhdGVfXyhzdGF0ZSkuCiAgICAgICovCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDwgMikKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDIgPCBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogCiAgICAgUERBVEFfUE9QKHNlbGYtPnN0YWNrLCBzdGF0ZSk7CiAgICAgaWYgKHN0YXRlID09IE5VTEwpCkBAIC02MDY4LDcgKzYxNTksOCBAQAogICAgICAgICBzZWxmLT5tYXJrc19zaXplID0gKFB5X3NzaXplX3QpYWxsb2M7CiAgICAgfQogCi0gICAgc2VsZi0+bWFya3Nbc2VsZi0+bnVtX21hcmtzKytdID0gUHlfU0laRShzZWxmLT5zdGFjayk7CisgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gMTsKKyAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBzZWxmLT5zdGFjay0+ZmVuY2UgPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNjE1MSw2ICs2MjQzLDggQEAKICAgICBjaGFyICpzID0gTlVMTDsKIAogICAgIHNlbGYtPm51bV9tYXJrcyA9IDA7CisgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gMDsKKyAgICBzZWxmLT5zdGFjay0+ZmVuY2UgPSAwOwogICAgIHNlbGYtPnByb3RvID0gMDsKICAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykpCiAgICAgICAgIFBkYXRhX2NsZWFyKHNlbGYtPnN0YWNrLCAwKTsKQEAgLTY4NTUsOCArNjk0OSw2IEBACiBzdGF0aWMgaW50CiBVbnBpY2tsZXJfc2V0X3BlcnNsb2FkKFVucGlja2xlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC02ODY5LDEwICs2OTYxLDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHRtcCA9IHNlbGYtPnBlcnNfZnVuYzsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsgICAgICAvKiBzZWxmLT5wZXJzX2Z1bmMgY2FuIGJlIE5VTEwsIHNvIGJlIGNhcmVmdWwuICovCisgICAgUHlfWFNFVFJFRihzZWxmLT5wZXJzX2Z1bmMsIHZhbHVlKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcG9zaXhzdWJwcm9jZXNzLmMgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwppbmRleCA4YmVkYWI1Li4wY2EwYWE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYworKysgYi9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYwpAQCAtMjEsOCArMjEsNyBAQAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiAhZGVmaW5lZChTWVNfZ2V0ZGVudHM2NCkKLS8qIEFuZHJvaWQgZG9lc24ndCBleHBvc2Ugc3lzY2FsbHMsIGFkZCB0aGUgZGVmaW5pdGlvbiBtYW51YWxseS4gKi8KKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAyMSAmJiAhZGVmaW5lZChTWVNfZ2V0ZGVudHM2NCkKICMgaW5jbHVkZSA8c3lzL2xpbnV4LXN5c2NhbGxzLmg+CiAjIGRlZmluZSBTWVNfZ2V0ZGVudHM2NCAgX19OUl9nZXRkZW50czY0CiAjZW5kaWYKQEAgLTcyLDcgKzcxLDcgQEAKIAogLyogQ29udmVydCBBU0NJSSB0byBhIHBvc2l0aXZlIGludCwgbm8gbGliYyBjYWxsLiBubyBvdmVyZmxvdy4gLTEgb24gZXJyb3IuICovCiBzdGF0aWMgaW50Ci1fcG9zX2ludF9mcm9tX2FzY2lpKGNoYXIgKm5hbWUpCitfcG9zX2ludF9mcm9tX2FzY2lpKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgaW50IG51bSA9IDA7CiAgICAgd2hpbGUgKCpuYW1lID49ICcwJyAmJiAqbmFtZSA8PSAnOScpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3JhbmRvbW1vZHVsZS5jIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKaW5kZXggOTVhZDRhNC4uZmQ2YjIzMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMKQEAgLTk5LDcgKzk5LDcgQEAKIGdlbnJhbmRfaW50MzIoUmFuZG9tT2JqZWN0ICpzZWxmKQogewogICAgIFBZX1VJTlQzMl9UIHk7Ci0gICAgc3RhdGljIFBZX1VJTlQzMl9UIG1hZzAxWzJdPXsweDBVLCBNQVRSSVhfQX07CisgICAgc3RhdGljIGNvbnN0IFBZX1VJTlQzMl9UIG1hZzAxWzJdID0gezB4MFUsIE1BVFJJWF9BfTsKICAgICAvKiBtYWcwMVt4XSA9IHggKiBNQVRSSVhfQSAgZm9yIHg9MCwxICovCiAgICAgUFlfVUlOVDMyX1QgKm10OwogCkBAIC0xMzYsNyArMTM2LDcgQEAKICAqIG9wdGltaXplIHRoZSBkaXZpc2lvbiBhd2F5IGF0IGNvbXBpbGUtdGltZS4gIDY3MTA4ODY0IGlzIDIqKjI2LiAgSW4KICAqIGVmZmVjdCwgYSBjb250YWlucyAyNyByYW5kb20gYml0cyBzaGlmdGVkIGxlZnQgMjYsIGFuZCBiIGZpbGxzIGluIHRoZQogICogbG93ZXIgMjYgYml0cyBvZiB0aGUgNTMtYml0IG51bWVyYXRvci4KLSAqIFRoZSBvcmdpbmFsIGNvZGUgY3JlZGl0ZWQgSXNha3UgV2FkYSBmb3IgdGhpcyBhbGdvcml0aG0sIDIwMDIvMDEvMDkuCisgKiBUaGUgb3JpZ2luYWwgY29kZSBjcmVkaXRlZCBJc2FrdSBXYWRhIGZvciB0aGlzIGFsZ29yaXRobSwgMjAwMi8wMS8wOS4KICAqLwogc3RhdGljIFB5T2JqZWN0ICoKIHJhbmRvbV9yYW5kb20oUmFuZG9tT2JqZWN0ICpzZWxmKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc2Nwcm94eS5jIGIvTW9kdWxlcy9fc2Nwcm94eS5jCmluZGV4IDY2YjZlMzQuLjY4YmU0NTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NjcHJveHkuYworKysgYi9Nb2R1bGVzL19zY3Byb3h5LmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAorc2V0X3Byb3h5KFB5T2JqZWN0KiBwcm94aWVzLCBjb25zdCBjaGFyKiBwcm90bywgQ0ZEaWN0aW9uYXJ5UmVmIHByb3h5RGljdCwKICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiBlbmFibGVkS2V5LAogICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGhvc3RLZXksIENGU3RyaW5nUmVmIHBvcnRLZXkpCiB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvY2FjaGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCmluZGV4IDM2ODlhNGUuLjYyYzU4OTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jCkBAIC0yNDQsOCArMjQ0LDcgQEAKICAgICAgICAgcHRyID0gcHRyLT5uZXh0OwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNhY2hlX21ldGhvZHNbXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCmluZGV4IDZhYTQ3NjQuLjUzNDkyOTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYwpAQCAtMzUyLDggKzM1Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIC8qCkBAIC04NjEsOCArODYwLDcgQEAKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBmdW5jLCBQeV9Ob25lKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIH0KIApAQCAtODkzLDggKzg5MSw3IEBACiAgICAgICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5mdW5jdGlvbl9waW5ib2FyZCwgYWdncmVnYXRlX2NsYXNzLCBQeV9Ob25lKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIH0KIApAQCAtMTAyOSw4ICsxMDI2LDcgQEAKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhdXRob3JpemVyX2NiLCBQeV9Ob25lKSA9PSAtMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIH0KIApAQCAtMTA1OSw4ICsxMDU1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogc3RhdGljIFB5T2JqZWN0KiBweXNxbGl0ZV9jb25uZWN0aW9uX3NldF90cmFjZV9jYWxsYmFjayhweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKQEAgLTEwODcsOCArMTA4Miw3IEBACiAgICAgICAgIHNxbGl0ZTNfdHJhY2Uoc2VsZi0+ZGIsIF90cmFjZV9jYWxsYmFjaywgdHJhY2VfY2FsbGJhY2spOwogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogI2lmZGVmIEhBVkVfTE9BRF9FWFRFTlNJT04KQEAgLTExMTEsOCArMTEwNSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiRXJyb3IgZW5hYmxpbmcgbG9hZCBleHRlbnNpb24iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMTM1LDggKzExMjgsNyBAQAogICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfT3BlcmF0aW9uYWxFcnJvciwgZXJybXNnKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogI2VuZGlmCkBAIC0xNjI2LDcgKzE2MTgsNyBAQAogICAgIFB5X1JFVFVSTl9GQUxTRTsKIH0KIAotc3RhdGljIGNoYXIgY29ubmVjdGlvbl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGNvbm5lY3Rpb24gb2JqZWN0LiIpOwogCiBzdGF0aWMgUHlHZXRTZXREZWYgY29ubmVjdGlvbl9nZXRzZXRbXSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYyBiL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYwppbmRleCAzMDBkYTI4Li45YjIwNjc4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQocHlzcWxpdGVfQ3Vyc29yKiBzZWxmKTsKIAotc3RhdGljIGNoYXIqIGVycm1zZ19mZXRjaF9hY3Jvc3Nfcm9sbGJhY2sgPSAiQ3Vyc29yIG5lZWRlZCB0byBiZSByZXNldCBiZWNhdXNlIG9mIGNvbW1pdC9yb2xsYmFjayBhbmQgY2FuIG5vIGxvbmdlciBiZSBmZXRjaGVkIGZyb20uIjsKK3N0YXRpYyBjb25zdCBjaGFyIGVycm1zZ19mZXRjaF9hY3Jvc3Nfcm9sbGJhY2tbXSA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOwogCiBzdGF0aWMgcHlzcWxpdGVfU3RhdGVtZW50S2luZCBkZXRlY3Rfc3RhdGVtZW50X3R5cGUoY29uc3QgY2hhciogc3RhdGVtZW50KQogewpAQCAtMjQyLDggKzI0Miw3IEBACiAgICAgY29uc3QgY2hhciogcG9zOwogCiAgICAgaWYgKCFjb2xuYW1lKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIAogICAgIGZvciAocG9zID0gY29sbmFtZTs7IHBvcysrKSB7CkBAIC02OTksNyArNjk4LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIFB5X0RFQ1JFRihzZWxmLT5sYXN0cm93aWQpOwotICAgICAgICBpZiAoIW11bHRpcGxlICYmIHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQpIHsKKyAgICAgICAgaWYgKCFtdWx0aXBsZSAmJgorICAgICAgICAgICAgLyogUkVQTEFDRSBpcyBhbiBhbGlhcyBmb3IgSU5TRVJUIE9SIFJFUExBQ0UgKi8KKyAgICAgICAgICAgIChzdGF0ZW1lbnRfdHlwZSA9PSBTVEFURU1FTlRfSU5TRVJUIHx8IHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9SRVBMQUNFKSkgewogICAgICAgICAgICAgc3FsaXRlX2ludDY0IGxhc3Ryb3dpZDsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICAgICAgIGxhc3Ryb3dpZCA9IHNxbGl0ZTNfbGFzdF9pbnNlcnRfcm93aWQoc2VsZi0+Y29ubmVjdGlvbi0+ZGIpOwpAQCAtOTE0LDggKzkxNSw3IEBACiAKICAgICByb3cgPSBweXNxbGl0ZV9jdXJzb3JfaXRlcm5leHQoc2VsZik7CiAgICAgaWYgKCFyb3cgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogCiAgICAgcmV0dXJuIHJvdzsKQEAgLTk5Niw4ICs5OTYsNyBAQAogUHlPYmplY3QqIHB5c3FsaXRlX25vb3AocHlzcWxpdGVfQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgLyogZG9uJ3QgY2FyZSwgcmV0dXJuIE5vbmUgKi8KLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5T2JqZWN0KiBweXNxbGl0ZV9jdXJzb3JfY2xvc2UocHlzcWxpdGVfQ3Vyc29yKiBzZWxmLCBQeU9iamVjdCogYXJncykKQEAgLTEwMTMsOCArMTAxMiw3IEBACiAKICAgICBzZWxmLT5jbG9zZWQgPSAxOwogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY3Vyc29yX21ldGhvZHNbXSA9IHsKQEAgLTEwNTAsNyArMTA0OCw3IEBACiAgICAge05VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBjdXJzb3JfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgY3Vyc29yX2RvY1tdID0KIFB5RG9jX1NUUigiU1FMaXRlIGRhdGFiYXNlIGN1cnNvciBjbGFzcy4iKTsKIAogUHlUeXBlT2JqZWN0IHB5c3FsaXRlX0N1cnNvclR5cGUgPSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKaW5kZXggN2E3ZTg2MC4uN2NkNmQyYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwpAQCAtMTM5LDggKzEzOSw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCAiQ2hhbmdpbmcgdGhlIHNoYXJlZF9jYWNoZSBmbGFnIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTE3Miw4ICsxNzEsNyBAQAogICAgIGlmIChyYyA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihtb2R1bGVfcmVnaXN0ZXJfYWRhcHRlcl9kb2MsCkBAIC0yMjEsOCArMjE5LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3NfZG9jLApAQCAtMjYxLDEzICsyNTgsMTMgQEAKIH07CiAKIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIHsKLSAgICBjaGFyKiBjb25zdGFudF9uYW1lOworICAgIGNvbnN0IGNoYXIgKmNvbnN0YW50X25hbWU7CiAgICAgaW50IGNvbnN0YW50X3ZhbHVlOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgX0ludENvbnN0YW50UGFpciBJbnRDb25zdGFudFBhaXI7CiAKLXN0YXRpYyBJbnRDb25zdGFudFBhaXIgX2ludF9jb25zdGFudHNbXSA9IHsKK3N0YXRpYyBjb25zdCBJbnRDb25zdGFudFBhaXIgX2ludF9jb25zdGFudHNbXSA9IHsKICAgICB7IlBBUlNFX0RFQ0xUWVBFUyIsIFBBUlNFX0RFQ0xUWVBFU30sCiAgICAgeyJQQVJTRV9DT0xOQU1FUyIsIFBBUlNFX0NPTE5BTUVTfSwKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3JlLmMgYi9Nb2R1bGVzL19zcmUuYwppbmRleCAxNTAyMjlkLi5kMzc5MzYzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcmUuYworKysgYi9Nb2R1bGVzL19zcmUuYwpAQCAtMzUsNyArMzUsNyBAQAogICogb3RoZXIgY29tcGF0aWJpbGl0eSB3b3JrLgogICovCiAKLXN0YXRpYyBjaGFyIGNvcHlyaWdodFtdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0KICAgICAiIFNSRSAyLjIuMiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMiBieSBTZWNyZXQgTGFicyBBQiAiOwogCiAjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KQEAgLTYyLDkgKzYyLDYgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBvcHRpb25hbCBmZWF0dXJlcyAqLwogCi0vKiBlbmFibGVzIGZhc3Qgc2VhcmNoaW5nICovCi0jZGVmaW5lIFVTRV9GQVNUX1NFQVJDSAotCiAvKiBlbmFibGVzIGNvcHkvZGVlcGNvcHkgaGFuZGxpbmcgKHdvcmsgaW4gcHJvZ3Jlc3MpICovCiAjdW5kZWYgVVNFX0JVSUxUSU5fQ09QWQogCkBAIC03MTcsNyArNzE0LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotY2FsbChjaGFyKiBtb2R1bGUsIGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogYXJncykKK2NhbGwoY29uc3QgY2hhciogbW9kdWxlLCBjb25zdCBjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgUHlPYmplY3QqIG5hbWU7CiAgICAgUHlPYmplY3QqIG1vZDsKQEAgLTIwNTIsOCArMjA0OSw5IEBACiAgICAgICAgIC8qIERlZmF1bHQgdmFsdWUgKi8KICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoUHlMb25nX0NoZWNrKGluZGV4KSkKLSAgICAgICAgcmV0dXJuIFB5TG9uZ19Bc1NzaXplX3QoaW5kZXgpOworICAgIGlmIChQeUluZGV4X0NoZWNrKGluZGV4KSkgeworICAgICAgICByZXR1cm4gUHlOdW1iZXJfQXNTc2l6ZV90KGluZGV4LCBOVUxMKTsKKyAgICB9CiAKICAgICBpID0gLTE7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NzbC5jIGIvTW9kdWxlcy9fc3NsLmMKaW5kZXggMTExN2I1NS4uZWFkNWIwZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3NsLmMKKysrIGIvTW9kdWxlcy9fc3NsLmMKQEAgLTM3OCw3ICszNzgsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotUHlTU0xfU2V0RXJyb3IoUHlTU0xTb2NrZXQgKm9iaiwgaW50IHJldCwgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pCitQeVNTTF9TZXRFcnJvcihQeVNTTFNvY2tldCAqb2JqLCBpbnQgcmV0LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKIHsKICAgICBQeU9iamVjdCAqdHlwZSA9IFB5U1NMRXJyb3JPYmplY3Q7CiAgICAgY2hhciAqZXJyc3RyID0gTlVMTDsKQEAgLTQ2MCw3ICs0NjAsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotX3NldFNTTEVycm9yIChjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgeworX3NldFNTTEVycm9yIChjb25zdCBjaGFyICplcnJzdHIsIGludCBlcnJjb2RlLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykgewogCiAgICAgaWYgKGVycnN0ciA9PSBOVUxMKQogICAgICAgICBlcnJjb2RlID0gRVJSX3BlZWtfbGFzdF9lcnJvcigpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBmOTY1NTQxLi5kZjgxOTAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtNzIzLDcgKzcyMyw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3QgZm9ybWF0ZGVmIG5hdGl2ZV90YWJsZVtdID0gewogICAgIHsneCcsICAgICAgIHNpemVvZihjaGFyKSwgICAwLCAgICAgICAgICAgICAgTlVMTH0sCiAgICAgeydiJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV9ieXRlLCAgICAgICAgbnBfYnl0ZX0sCiAgICAgeydCJywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBudV91Ynl0ZSwgICAgICAgbnBfdWJ5dGV9LApAQCAtMTE4OSw3ICsxMTg5LDcgQEAKIAogCiBzdGF0aWMgY29uc3QgZm9ybWF0ZGVmICoKLXdoaWNodGFibGUoY2hhciAqKnBmbXQpCit3aGljaHRhYmxlKGNvbnN0IGNoYXIgKipwZm10KQogewogICAgIGNvbnN0IGNoYXIgKmZtdCA9ICgqcGZtdCkrKzsgLyogTWF5IGJlIGJhY2tlZCBvdXQgb2YgbGF0ZXIgKi8KICAgICBzd2l0Y2ggKCpmbXQpIHsKQEAgLTEyNjgsNyArMTI2OCw3IEBACiAKICAgICBmbXQgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmLT5zX2Zvcm1hdCk7CiAKLSAgICBmID0gd2hpY2h0YWJsZSgoY2hhciAqKikmZm10KTsKKyAgICBmID0gd2hpY2h0YWJsZSgmZm10KTsKIAogICAgIHMgPSBmbXQ7CiAgICAgc2l6ZSA9IDA7CkBAIC0xNDU2LDcgKzE0NTYsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotc191bnBhY2tfaW50ZXJuYWwoUHlTdHJ1Y3RPYmplY3QgKnNvc2VsZiwgY2hhciAqc3RhcnRmcm9tKSB7CitzX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjb25zdCBjaGFyICpzdGFydGZyb20pIHsKICAgICBmb3JtYXRjb2RlICpjb2RlOwogICAgIFB5X3NzaXplX3QgaSA9IDA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IFB5VHVwbGVfTmV3KHNvc2VsZi0+c19sZW4pOwpAQCAtMjI3OSw3ICsyMjc5LDcgQEAKIAogICAgIC8qIENoZWNrIGVuZGlhbiBhbmQgc3dhcCBpbiBmYXN0ZXIgZnVuY3Rpb25zICovCiAgICAgewotICAgICAgICBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKKyAgICAgICAgY29uc3QgZm9ybWF0ZGVmICpuYXRpdmUgPSBuYXRpdmVfdGFibGU7CiAgICAgICAgIGZvcm1hdGRlZiAqb3RoZXIsICpwdHI7CiAjaWYgUFlfTElUVExFX0VORElBTgogICAgICAgICBvdGhlciA9IGxpbGVuZGlhbl90YWJsZTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RidWZmZXIuYyBiL01vZHVsZXMvX3Rlc3RidWZmZXIuYwppbmRleCA0M2RiOGE4Li4xM2QzY2NjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKKysrIGIvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCkBAIC0xMyw3ICsxMyw3IEBACiBQeU9iamVjdCAqY2FsY3NpemUgPSBOVUxMOwogCiAvKiBjYWNoZSBzaW1wbGUgZm9ybWF0IHN0cmluZyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKnNpbXBsZV9mbXQgPSAiQiI7CitzdGF0aWMgY29uc3QgY2hhciBzaW1wbGVfZm10W10gPSAiQiI7CiBQeU9iamVjdCAqc2ltcGxlX2Zvcm1hdCA9IE5VTEw7CiAjZGVmaW5lIFNJTVBMRV9GT1JNQVQoZm10KSAoZm10ID09IE5VTEwgfHwgc3RyY21wKGZtdCwgIkIiKSA9PSAwKQogI2RlZmluZSBGSVhfRk9STUFUKGZtdCkgKGZtdCA9PSBOVUxMID8gIkIiIDogZm10KQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKaW5kZXggMzgxMGU5NC4uNWQ2NjFmNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYworKysgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogZ2V0YXJnc19rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7ImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLCJhcmc1IiwgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdD0iKGlpKWl8KGkoaWkpKShpaWkpaSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiKGlpKWl8KGkoaWkpKShpaWkpaSI7CiAgICAgaW50IGludF9hcmdzWzEwXT17LTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTF9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCBmbXQsIGtleXdvcmRzLApAQCAtMTAyOCw2ICsxMDI4LDIxIEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHJlcXVpcmVkLCBvcHRpb25hbCwga2V5d29yZF9vbmx5KTsKIH0KIAorLyogdGVzdCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMgcG9zaXRpb25hbC1vbmx5IGFyZ3VtZW50cyAqLworc3RhdGljIFB5T2JqZWN0ICoKK2dldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7IiIsICIiLCAia2V5d29yZCIsIE5VTEx9OworICAgIGludCByZXF1aXJlZCA9IC0xOworICAgIGludCBvcHRpb25hbCA9IC0xOworICAgIGludCBrZXl3b3JkID0gLTE7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpfGlpIiwga2V5d29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcXVpcmVkLCAmb3B0aW9uYWwsICZrZXl3b3JkKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImlpaSIsIHJlcXVpcmVkLCBvcHRpb25hbCwga2V5d29yZCk7Cit9CisKIC8qIEZ1bmN0aW9ucyB0byBjYWxsIFB5QXJnX1BhcnNlVHVwbGUgd2l0aCBpbnRlZ2VyIGZvcm1hdCBjb2RlcywKICAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KICovCkBAIC0xMTYxLDcgKzExNzYsNyBAQAogICAgIHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhudW0pOwogICAgIGlmICh2YWx1ZSAhPSBVTE9OR19NQVgpCiAgICAgICAgIHJldHVybiByYWlzZVRlc3RFcnJvcigidGVzdF9rX2NvZGUiLAotICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CisgICAgICAgICAgICAiUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaygpIHJldHVybmVkIHdyb25nIHZhbHVlIGZvciBsb25nIDB4RkZGLi4uRkZGIik7CiAKICAgICBQeVR1cGxlX1NFVF9JVEVNKHR1cGxlLCAwLCBudW0pOwogCkBAIC0xMTgwLDcgKzExOTUsNyBAQAogICAgIHZhbHVlID0gUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhudW0pOwogICAgIGlmICh2YWx1ZSAhPSAodW5zaWduZWQgbG9uZyktMHg0MikKICAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0gICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAogICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKQEAgLTI5MDQsNyArMjkxOSw5IEBACiBzdGF0aWMgaW50CiBjaGVja190aW1lX3JvdW5kaW5nKGludCByb3VuZCkKIHsKLSAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUiAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpIHsKKyAgICBpZiAocm91bmQgIT0gX1B5VGltZV9ST1VORF9GTE9PUgorICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcKKyAgICAgICAgJiYgcm91bmQgIT0gX1B5VGltZV9ST1VORF9IQUxGX0VWRU4pIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIHJvdW5kaW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zNzg1LDYgKzM4MDIsMTM3IEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh0c3RhdGUtPnJlY3Vyc2lvbl9kZXB0aCAtIDEpOwogfQogCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9idWZmZXJfb3ZlcmZsb3coUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVmZmVyIG92ZXJmbG93IHRvIGNoZWNrIHRoYXQgUHlNZW1fRnJlZSgpIGRldGVjdHMKKyAgICAgICB0aGUgb3ZlcmZsb3cgd2hlbiBkZWJ1ZyBob29rcyBhcmUgaW5zdGFsbGVkLiAqLworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYygxNik7CisgICAgYnVmZmVyWzE2XSA9ICd4JzsKKyAgICBQeU1lbV9GcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorcHltZW1fYXBpX21pc3VzZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBtaXN1c2FnZSBvZiBQeXRob24gYWxsb2NhdG9yczoKKyAgICAgICBhbGxvY29jYXRlIHdpdGggUHlNZW0gYnV0IHJlbGVhc2Ugd2l0aCBQeU1lbV9SYXcuICovCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDE2KTsKKyAgICBQeU1lbV9SYXdGcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0KgorcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIGJ1ZyB0byB0ZXN0IGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yczoKKyAgICAgICBjYWxsIFB5TWVtX01hbGxvYygpIHdpdGhvdXQgaG9sZGluZyB0aGUgR0lMICovCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIGJ1ZmZlciA9IFB5TWVtX01hbGxvYygxMCk7CisgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKworICAgIFB5TWVtX0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVnIHRvIHRlc3QgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzOgorICAgICAgIGNhbGwgUHlPYmplY3RfTWFsbG9jKCkgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYnVmZmVyID0gUHlPYmplY3RfTWFsbG9jKDEwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgUHlPYmplY3RfRnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit0cmFjZW1hbGxvY190cmFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICBQeU9iamVjdCAqcHRyX29iajsKKyAgICB2b2lkICpwdHI7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIGludCByZWxlYXNlX2dpbCA9IDA7CisgICAgaW50IHJlczsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiSU9ufGkiLCAmZG9tYWluLCAmcHRyX29iaiwgJnNpemUsICZyZWxlYXNlX2dpbCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHB0ciA9IFB5TG9uZ19Bc1ZvaWRQdHIocHRyX29iaik7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHJlbGVhc2VfZ2lsKSB7CisgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICAgICAgcmVzID0gX1B5VHJhY2VNYWxsb2NfVHJhY2soZG9tYWluLCAoUHlfdWludHB0cl90KXB0ciwgc2l6ZSk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19UcmFjayhkb21haW4sIChQeV91aW50cHRyX3QpcHRyLCBzaXplKTsKKyAgICB9CisKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiX1B5VHJhY2VNYWxsb2NfVHJhY2sgZXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCit0cmFjZW1hbGxvY191bnRyYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluOworICAgIFB5T2JqZWN0ICpwdHJfb2JqOworICAgIHZvaWQgKnB0cjsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJTyIsICZkb21haW4sICZwdHJfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKGRvbWFpbiwgKFB5X3VpbnRwdHJfdClwdHIpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJfUHlUcmFjZU1hbGxvY19UcmFjayBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBkb21haW47CisgICAgUHlPYmplY3QgKnB0cl9vYmo7CisgICAgdm9pZCAqcHRyOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJTyIsICZkb21haW4sICZwdHJfb2JqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrKGRvbWFpbiwgKFB5X3VpbnRwdHJfdClwdHIpOworfQorCiAKIHN0YXRpYyBQeU1ldGhvZERlZiBUZXN0TWV0aG9kc1tdID0gewogICAgIHsicmFpc2VfZXhjZXB0aW9uIiwgICAgICAgICByYWlzZV9leGNlcHRpb24sICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1N9LApAQCAtMzgzMCw2ICszOTc4LDkgQEAKICAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKICAgICB7ImdldGFyZ3Nfa2V5d29yZF9vbmx5IiwgKFB5Q0Z1bmN0aW9uKWdldGFyZ3Nfa2V5d29yZF9vbmx5LAogICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAorICAgIHsiZ2V0YXJnc19wb3NpdGlvbmFsX29ubHlfYW5kX2tleXdvcmRzIiwKKyAgICAgIChQeUNGdW5jdGlvbilnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMsCisgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCiAgICAgeyJnZXRhcmdzX2IiLCAgICAgICAgICAgICAgIGdldGFyZ3NfYiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRhcmdzX0IiLCAgICAgICAgICAgICAgIGdldGFyZ3NfQiwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRhcmdzX2giLCAgICAgICAgICAgICAgIGdldGFyZ3NfaCwgICAgICAgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCkBAIC0zOTc2LDYgKzQxMjcsMTMgQEAKICAgICB7IlB5VGltZV9Bc01pbGxpc2Vjb25kcyIsIHRlc3RfUHlUaW1lX0FzTWlsbGlzZWNvbmRzLCBNRVRIX1ZBUkFSR1N9LAogICAgIHsiUHlUaW1lX0FzTWljcm9zZWNvbmRzIiwgdGVzdF9QeVRpbWVfQXNNaWNyb3NlY29uZHMsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJnZXRfcmVjdXJzaW9uX2RlcHRoIiwgZ2V0X3JlY3Vyc2lvbl9kZXB0aCwgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fYnVmZmVyX292ZXJmbG93IiwgcHltZW1fYnVmZmVyX292ZXJmbG93LCBNRVRIX05PQVJHU30sCisgICAgeyJweW1lbV9hcGlfbWlzdXNlIiwgcHltZW1fYXBpX21pc3VzZSwgTUVUSF9OT0FSR1N9LAorICAgIHsicHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsIiwgcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsLCBNRVRIX05PQVJHU30sCisgICAgeyJweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwiLCBweW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwsIE1FVEhfTk9BUkdTfSwKKyAgICB7InRyYWNlbWFsbG9jX3RyYWNrIiwgdHJhY2VtYWxsb2NfdHJhY2ssIE1FVEhfVkFSQVJHU30sCisgICAgeyJ0cmFjZW1hbGxvY191bnRyYWNrIiwgdHJhY2VtYWxsb2NfdW50cmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2siLCB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrLCBNRVRIX1ZBUkFSR1N9LAogICAgIHtOVUxMLCBOVUxMfSAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtNDAzOSw3ICs0MTk3LDcgQEAKICAgICAgICAgIlRfTE9OR0xPTkciLCAiVF9VTE9OR0xPTkciLAogI2VuZGlmCiAgICAgICAgIE5VTEx9OwotICAgIHN0YXRpYyBjaGFyICpmbXQgPSAifGJiQmhIaUlsa25mZHMjIgorICAgIHN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gInxiYkJoSGlJbGtuZmRzIyIKICNpZmRlZiBIQVZFX0xPTkdfTE9ORwogICAgICAgICAiTEsiCiAjZW5kaWYKQEAgLTQzOTQsNiArNDU1Miw3IEBACiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01BWCIsIFB5TG9uZ19Gcm9tU3NpemVfdChQWV9TU0laRV9UX01BWCkpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiUFlfU1NJWkVfVF9NSU4iLCBQeUxvbmdfRnJvbVNzaXplX3QoUFlfU1NJWkVfVF9NSU4pKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9QWUdDX0hFQUQiLCBQeUxvbmdfRnJvbVNzaXplX3Qoc2l6ZW9mKFB5R0NfSGVhZCkpKTsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlNJWkVPRl9USU1FX1QiLCBQeUxvbmdfRnJvbVNzaXplX3Qoc2l6ZW9mKHRpbWVfdCkpKTsKICAgICBQeV9JTkNSRUYoJlB5SW5zdGFuY2VNZXRob2RfVHlwZSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJpbnN0YW5jZW1ldGhvZCIsIChQeU9iamVjdCAqKSZQeUluc3RhbmNlTWV0aG9kX1R5cGUpOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jIGIvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYwppbmRleCAyMDA1MjA1Li4wM2VkYTI3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKQEAgLTYxLDcgKzYxLDcgQEAKIH0KIAogc3RhdGljIGludAotRXhhbXBsZV9zZXRhdHRyKEV4YW1wbGVPYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQorRXhhbXBsZV9zZXRhdHRyKEV4YW1wbGVPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190a2ludGVyLmMgYi9Nb2R1bGVzL190a2ludGVyLmMKaW5kZXggY2Y1NmZhOC4uNzYxZWMwZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGtpbnRlci5jCisrKyBiL01vZHVsZXMvX3RraW50ZXIuYwpAQCAtNDYyLDcgKzQ2Miw3IEBACiAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0odiwgaSwgdyk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHcpOwogICAgICAgICB9CiAgICAgfQogICAgIFRjbF9GcmVlKEZSRUVDQVNUIGFyZ3YpOwpAQCAtNDgwLDEzICs0ODAsMTMgQEAKICAgICAgICAgUHlfc3NpemVfdCBpLCBzaXplOwogICAgICAgICBQeU9iamVjdCAqZWxlbSwgKm5ld2VsZW0sICpyZXN1bHQ7CiAKLSAgICAgICAgc2l6ZSA9IFB5VHVwbGVfU2l6ZShhcmcpOworICAgICAgICBzaXplID0gUHlUdXBsZV9HRVRfU0laRShhcmcpOwogICAgICAgICByZXN1bHQgPSBOVUxMOwogICAgICAgICAvKiBSZWN1cnNpdmVseSBpbnZva2UgU3BsaXRPYmogZm9yIGFsbCB0dXBsZSBpdGVtcy4KICAgICAgICAgICAgSWYgdGhpcyBkb2VzIG5vdCByZXR1cm4gYSBuZXcgb2JqZWN0LCBubyBhY3Rpb24gaXMKICAgICAgICAgICAgbmVlZGVkLiAqLwogICAgICAgICBmb3IoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJnLCBpKTsKKyAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgaSk7CiAgICAgICAgICAgICBuZXdlbGVtID0gU3BsaXRPYmooZWxlbSk7CiAgICAgICAgICAgICBpZiAoIW5ld2VsZW0pIHsKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CkBAIC01MDIsMTIgKzUwMiwxMiBAQAogICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGspOworICAgICAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmcsIGspOwogICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGssIGVsZW0pOworICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaywgZWxlbSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHJlc3VsdCwgaSwgbmV3ZWxlbSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC01MjksNyArNTI5LDcgQEAKICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTU1MSw3ICs1NTEsNyBAQAogICAgIGVsc2UgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSkgewogICAgICAgICBpbnQgYXJnYzsKICAgICAgICAgY29uc3QgY2hhciAqKmFyZ3Y7Ci0gICAgICAgIGNoYXIgKmxpc3QgPSBQeUJ5dGVzX0FzU3RyaW5nKGFyZyk7CisgICAgICAgIGNoYXIgKmxpc3QgPSBQeUJ5dGVzX0FTX1NUUklORyhhcmcpOwogCiAgICAgICAgIGlmIChUY2xfU3BsaXRMaXN0KChUY2xfSW50ZXJwICopTlVMTCwgbGlzdCwgJmFyZ2MsICZhcmd2KSAhPSBUQ0xfT0spIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRihhcmcpOwpAQCAtNTU5LDcgKzU1OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7CiAgICAgICAgIGlmIChhcmdjID4gMSkKLSAgICAgICAgICAgIHJldHVybiBTcGxpdChQeUJ5dGVzX0FzU3RyaW5nKGFyZykpOworICAgICAgICAgICAgcmV0dXJuIFNwbGl0KFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZykpOwogICAgICAgICAvKiBGYWxsIHRocm91Z2gsIHJldHVybmluZyBhcmcuICovCiAgICAgfQogICAgIFB5X0lOQ1JFRihhcmcpOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFRjbF9TZXRWYXIodi0+aW50ZXJwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRjbF9saWJyYXJ5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmcodXRmOF9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHV0ZjhfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ0xfR0xPQkFMX09OTFkpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1dGY4X3BhdGgpOwogICAgICAgICAgICAgfQpAQCAtODQxLDcgKzg0MSw3IEBACiAgICAgUHlfREVDUkVGKHRwKTsKIH0KIAotc3RhdGljIGNoYXIqCitzdGF0aWMgY29uc3QgY2hhciAqCiBQeVRjbE9iamVjdF9UY2xTdHJpbmcoUHlPYmplY3QgKnNlbGYpCiB7CiAgICAgcmV0dXJuIFRjbF9HZXRTdHJpbmcoKChQeVRjbE9iamVjdCopc2VsZiktPnZhbHVlKTsKQEAgLTEzMDYsNyArMTMwNiw3IEBACiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBlbGVtKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE1MTcsOCArMTUxNyw4IEBACiAgICAgaW50IGZsYWdzID0gVENMX0VWQUxfRElSRUNUIHwgVENMX0VWQUxfR0xPQkFMOwogCiAgICAgLyogSWYgYXJncyBpcyBhIHNpbmdsZSB0dXBsZSwgcmVwbGFjZSB3aXRoIGNvbnRlbnRzIG9mIHR1cGxlICovCi0gICAgaWYgKDEgPT0gUHlUdXBsZV9TaXplKGFyZ3MpKXsKLSAgICAgICAgUHlPYmplY3QqIGl0ZW0gPSBQeVR1cGxlX0dldEl0ZW0oYXJncywgMCk7CisgICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgMCk7CiAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKGl0ZW0pKQogICAgICAgICAgICAgYXJncyA9IGl0ZW07CiAgICAgfQpAQCAtMTcyNiwxNCArMTcyNiwxNCBAQAogdmFybmFtZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmluLCB2b2lkICpfb3V0KQogewogICAgIGNoYXIgKnM7Ci0gICAgY2hhciAqKm91dCA9IChjaGFyKiopX291dDsKKyAgICBjb25zdCBjaGFyICoqb3V0ID0gKGNvbnN0IGNoYXIqKilfb3V0OwogICAgIGlmIChQeUJ5dGVzX0NoZWNrKGluKSkgewotICAgICAgICBpZiAoUHlCeXRlc19TaXplKGluKSA+IElOVF9NQVgpIHsKKyAgICAgICAgaWYgKFB5Qnl0ZXNfR0VUX1NJWkUoaW4pID4gSU5UX01BWCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJieXRlcyBvYmplY3QgaXMgdG9vIGxvbmciKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIHMgPSBQeUJ5dGVzX0FzU3RyaW5nKGluKTsKLSAgICAgICAgaWYgKHN0cmxlbihzKSAhPSAoc2l6ZV90KVB5Qnl0ZXNfU2l6ZShpbikpIHsKKyAgICAgICAgcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGluKTsKKyAgICAgICAgaWYgKHN0cmxlbihzKSAhPSAoc2l6ZV90KVB5Qnl0ZXNfR0VUX1NJWkUoaW4pKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImVtYmVkZGVkIG51bGwgYnl0ZSIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTE4NDYsNyArMTg0Niw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogU2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI7CisgICAgY29uc3QgY2hhciAqbmFtZTEsICpuYW1lMjsKICAgICBQeU9iamVjdCAqbmV3VmFsdWU7CiAgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAgICAgVGNsX09iaiAqbmV3dmFsLCAqb2s7CkBAIC0xOTE1LDcgKzE5MTUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIEdldFZhcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBmbGFncykKIHsKLSAgICBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CisgICAgY29uc3QgY2hhciAqbmFtZTEsICpuYW1lMj1OVUxMOwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwogICAgIFRjbF9PYmogKnRyZXM7CiAKQEAgLTIyNzQsMTAgKzIyNzQsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCBvYmp2W2ldKTsKLSAgICAgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQpAQCAtMjMwNCwxMSArMjMwNSwxMiBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqcyA9IHVuaWNvZGVGcm9tVGNsU3RyaW5nKGFyZ3ZbaV0pOwotICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKHYsIGksIHMpKSB7CisgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgdiA9IE5VTEw7CiAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7CiAgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICB9CiAKICAgZmluYWxseToKQEAgLTIzNDksMTAgKzIzNTEsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2JqYzsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqcyA9IEZyb21PYmooKFB5T2JqZWN0KilzZWxmLCBvYmp2W2ldKTsKLSAgICAgICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQpAQCAtMjQxMCwxMCArMjQxMywxMSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IChhcmdjIC0gMSk7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqcyA9IHVuaWNvZGVGcm9tVGNsU3RyaW5nKGFyZ3ZbaSArIDFdKTsKLSAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbShhcmcsIGksIHMpKSB7CisgICAgICAgIGlmICghcykgewogICAgICAgICAgICAgUHlfREVDUkVGKGFyZyk7CiAgICAgICAgICAgICByZXR1cm4gUHl0aG9uQ21kX0Vycm9yKGludGVycCk7CiAgICAgICAgIH0KKyAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmcsIGksIHMpOwogICAgIH0KICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmcpOwogICAgIFB5X0RFQ1JFRihhcmcpOwpAQCAtMjQ4NSw3ICsyNDg5LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLmNyZWF0ZWNvbW1hbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGthcHBPYmplY3QgKiIpCiAgICAgbmFtZTogc3RyCiAgICAgZnVuYzogb2JqZWN0CiAgICAgLwpAQCAtMjQ5NSw3ICsyNDk4LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF9jcmVhdGVjb21tYW5kX2ltcGwoVGthcHBPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmExYzc5YTRlZTJhZjQxMCBpbnB1dD0yYmMyYzA0NmEwOTE0MjM0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmExYzc5YTRlZTJhZjQxMCBpbnB1dD0yNTU3ODVjYjcwZWRjNmEwXSovCiB7CiAgICAgUHl0aG9uQ21kX0NsaWVudERhdGEgKmRhdGE7CiAgICAgaW50IGVycjsKQEAgLTI1NjEsNyArMjU2NCw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a2FwcC5kZWxldGVjb21tYW5kCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQogICAgIG5hbWU6IHN0cgogICAgIC8KIApAQCAtMjU2OSw3ICsyNTcxLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX2RlbGV0ZWNvbW1hbmRfaW1wbChUa2FwcE9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjdlOGNiNTg0NWUwZDJkIGlucHV0PWI2MzA2NDY4ZjEwYjIxOWNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNjdlOGNiNTg0NWUwZDJkIGlucHV0PTUzZTk5NTJlYWUxZjg1ZjVdKi8KIHsKICAgICBpbnQgZXJyOwogCkBAIC0yNzYyLDEzICsyNzY0LDExIEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a3RpbWVydG9rZW4uZGVsZXRldGltZXJoYW5kbGVyCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrdHRPYmplY3QgKiIpCi0KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrdGltZXJ0b2tlbl9kZWxldGV0aW1lcmhhbmRsZXJfaW1wbChUa3R0T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJkN2ZlMTdmMzI4Y2ZhNTUgaW5wdXQ9MjViYTVkZDU5NGU1MjA4NF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJkN2ZlMTdmMzI4Y2ZhNTUgaW5wdXQ9NDBiZDA3MGZmODVmNWNmM10qLwogewogICAgIFRrdHRPYmplY3QgKnYgPSBzZWxmOwogICAgIFB5T2JqZWN0ICpmdW5jID0gdi0+ZnVuYzsKQEAgLTI4OTQsNyArMjg5NCw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfdGtpbnRlci50a2FwcC5tYWlubG9vcAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKICAgICB0aHJlc2hvbGQ6IGludCA9IDAKICAgICAvCiAKQEAgLTI5MDIsNyArMjkwMSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF9tYWlubG9vcF9pbXBsKFRrYXBwT2JqZWN0ICpzZWxmLCBpbnQgdGhyZXNob2xkKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiYThlYWJiZTU3ODQxYjAgaW5wdXQ9YWQ1N2M5YzFkZDJiOTQ3MF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiYThlYWJiZTU3ODQxYjAgaW5wdXQ9MDM2YmNkY2YwM2Q1ZWNhMF0qLwogewogI2lmZGVmIFdJVEhfVEhSRUFECiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlID0gUHlUaHJlYWRTdGF0ZV9HZXQoKTsKQEAgLTMwNzIsMTMgKzMwNzEsMTEgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLndpbGxkaXNwYXRjaAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKLQogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGthcHBfd2lsbGRpc3BhdGNoX2ltcGwoVGthcHBPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGUzZjQ2ZDI0NDY0MjE1NSBpbnB1dD0yNjMwNjk5NzY3ODA4OTcwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGUzZjQ2ZDI0NDY0MjE1NSBpbnB1dD1kODhmNTk3MDg0M2Q2ZGFiXSovCiB7CiAgICAgc2VsZi0+ZGlzcGF0Y2hpbmcgPSAxOwogCkBAIC0zNjI5LDE0ICszNjI2LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19Bc1N0cmluZyhjZXhlKSk7CisgICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19BU19TVFJJTkcoY2V4ZSkpOwogCiAgICAgICAgICAgICBpZiAoc2V0X3ZhcikgewogICAgICAgICAgICAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGVXKEwiVENMX0xJQlJBUlkiLCBOVUxMKTsKICAgICAgICAgICAgICAgICBQeU1lbV9GcmVlKHdjc19wYXRoKTsKICAgICAgICAgICAgIH0KICNlbHNlCi0gICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19Bc1N0cmluZyhjZXhlKSk7CisgICAgICAgICAgICBUY2xfRmluZEV4ZWN1dGFibGUoUHlCeXRlc19BU19TVFJJTkcoY2V4ZSkpOwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KICAgICAgICAgfQogICAgICAgICBQeV9YREVDUkVGKGNleGUpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYyBiL01vZHVsZXMvX3RyYWNlbWFsbG9jLmMKaW5kZXggNzk2YWMwZi4uZTMzMjljNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYworKysgYi9Nb2R1bGVzL190cmFjZW1hbGxvYy5jCkBAIC0zOSw3ICszOSwxMSBAQAogICAgIC8qIGxpbWl0IG9mIHRoZSBudW1iZXIgb2YgZnJhbWVzIGluIGEgdHJhY2ViYWNrLCAxIGJ5IGRlZmF1bHQuCiAgICAgICAgVmFyaWFibGUgcHJvdGVjdGVkIGJ5IHRoZSBHSUwuICovCiAgICAgaW50IG1heF9uZnJhbWU7Ci19IHRyYWNlbWFsbG9jX2NvbmZpZyA9IHtUUkFDRU1BTExPQ19OT1RfSU5JVElBTElaRUQsIDAsIDF9OworCisgICAgLyogdXNlIGRvbWFpbiBpbiB0cmFjZSBrZXk/CisgICAgICAgVmFyaWFibGUgcHJvdGVjdGVkIGJ5IHRoZSBHSUwuICovCisgICAgaW50IHVzZV9kb21haW47Cit9IHRyYWNlbWFsbG9jX2NvbmZpZyA9IHtUUkFDRU1BTExPQ19OT1RfSU5JVElBTElaRUQsIDAsIDEsIDB9OwogCiAjaWYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKQogLyogVGhpcyBsb2NrIGlzIG5lZWRlZCBiZWNhdXNlIHRyYWNlbWFsbG9jX2ZyZWUoKSBpcyBjYWxsZWQgd2l0aG91dApAQCAtNTQsMTAgKzU4LDIxIEBACiAjICBkZWZpbmUgVEFCTEVTX1VOTE9DSygpCiAjZW5kaWYKIAorCisjZGVmaW5lIERFRkFVTFRfRE9NQUlOIDAKKworLyogUGFjayB0aGUgZnJhbWVfdCBzdHJ1Y3R1cmUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50LiAqLwordHlwZWRlZiBzdHJ1Y3QKKyNpZmRlZiBfX0dOVUNfXworX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbmRpZgoreworICAgIFB5X3VpbnRwdHJfdCBwdHI7CisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluOworfSBwb2ludGVyX3Q7CisKIC8qIFBhY2sgdGhlIGZyYW1lX3Qgc3RydWN0dXJlIHRvIHJlZHVjZSB0aGUgbWVtb3J5IGZvb3RwcmludCBvbiA2NC1iaXQKLSAgIGFyY2hpdGVjdHVyZXM6IDEyIGJ5dGVzIGluc3RlYWQgb2YgMTYuIFRoaXMgb3B0aW1pemF0aW9uIG1pZ2h0IHByb2R1Y2UKLSAgIFNJR0JVUyBvbiBhcmNoaXRlY3R1cmVzIG5vdCBzdXBwb3J0aW5nIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMgKDY0LWJpdAotICAgTUlQUyBDUFU/KTogb24gc3VjaCBhcmNoaXRlY3R1cmUsIHRoZSBzdHJ1Y3R1cmUgbXVzdCBub3QgYmUgcGFja2VkLiAqLworICAgYXJjaGl0ZWN0dXJlczogMTIgYnl0ZXMgaW5zdGVhZCBvZiAxNi4gKi8KIHR5cGVkZWYgc3RydWN0CiAjaWZkZWYgX19HTlVDX18KIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCkBAIC02NSwxMCArODAsMTMgQEAKIF9kZWNsc3BlYyhhbGlnbig0KSkKICNlbmRpZgogeworICAgIC8qIGZpbGVuYW1lIGNhbm5vdCBiZSBOVUxMOiAiPHVua25vd24+IiBpcyB1c2VkIGlmIHRoZSBQeXRob24gZnJhbWUKKyAgICAgICBmaWxlbmFtZSBpcyBOVUxMICovCiAgICAgUHlPYmplY3QgKmZpbGVuYW1lOwogICAgIHVuc2lnbmVkIGludCBsaW5lbm87CiB9IGZyYW1lX3Q7CiAKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5X3VoYXNoX3QgaGFzaDsKICAgICBpbnQgbmZyYW1lOwpAQCAtODEsNiArOTksNyBAQAogI2RlZmluZSBNQVhfTkZSQU1FIFwKICAgICAgICAgKChJTlRfTUFYIC0gKGludClzaXplb2YodHJhY2ViYWNrX3QpKSAvIChpbnQpc2l6ZW9mKGZyYW1lX3QpICsgMSkKIAorCiBzdGF0aWMgUHlPYmplY3QgKnVua25vd25fZmlsZW5hbWUgPSBOVUxMOwogc3RhdGljIHRyYWNlYmFja190IHRyYWNlbWFsbG9jX2VtcHR5X3RyYWNlYmFjazsKIApAQCAtOTMsNiArMTEyLDcgQEAKICAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwogfSB0cmFjZV90OwogCisKIC8qIFNpemUgaW4gYnl0ZXMgb2YgY3VycmVudGx5IHRyYWNlZCBtZW1vcnkuCiAgICBQcm90ZWN0ZWQgYnkgVEFCTEVTX0xPQ0soKS4gKi8KIHN0YXRpYyBzaXplX3QgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA9IDA7CkBAIC0xMTksNiArMTM5LDcgQEAKICAgIFByb3RlY3RlZCBieSBUQUJMRVNfTE9DSygpLiAqLwogc3RhdGljIF9QeV9oYXNodGFibGVfdCAqdHJhY2VtYWxsb2NfdHJhY2VzID0gTlVMTDsKIAorCiAjaWZkZWYgVFJBQ0VfREVCVUcKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19lcnJvcihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKQEAgLTEzMyw2ICsxNTQsNyBAQAogfQogI2VuZGlmCiAKKwogI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmIGRlZmluZWQoVFJBQ0VfUkFXX01BTExPQykKICNkZWZpbmUgUkVFTlRSQU5UX1RIUkVBRExPQ0FMCiAKQEAgLTE0Myw3ICsxNjUsNyBAQAogIyAgZXJyb3IgIm5lZWQgbmF0aXZlIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIgogI2VuZGlmCiAKLXN0YXRpYyBpbnQgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleTsKK3N0YXRpYyBpbnQgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSA9IC0xOwogCiAvKiBBbnkgbm9uLU5VTEwgcG9pbnRlciBjYW4gYmUgdXNlZCAqLwogI2RlZmluZSBSRUVOVFJBTlQgUHlfVHJ1ZQpAQCAtMTUxLDcgKzE3MywxMCBAQAogc3RhdGljIGludAogZ2V0X3JlZW50cmFudCh2b2lkKQogewotICAgIHZvaWQgKnB0ciA9IFB5VGhyZWFkX2dldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CisgICAgdm9pZCAqcHRyOworCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkgIT0gLTEpOworICAgIHB0ciA9IFB5VGhyZWFkX2dldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CiAgICAgaWYgKHB0ciAhPSBOVUxMKSB7CiAgICAgICAgIGFzc2VydChwdHIgPT0gUkVFTlRSQU5UKTsKICAgICAgICAgcmV0dXJuIDE7CkBAIC0xNjQsMTIgKzE4OSwxNCBAQAogc2V0X3JlZW50cmFudChpbnQgcmVlbnRyYW50KQogewogICAgIGFzc2VydChyZWVudHJhbnQgPT0gMCB8fCByZWVudHJhbnQgPT0gMSk7CisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkgIT0gLTEpOworCiAgICAgaWYgKHJlZW50cmFudCkgewotICAgICAgICBhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KSA9PSBOVUxMKTsKKyAgICAgICAgYXNzZXJ0KCFnZXRfcmVlbnRyYW50KCkpOwogICAgICAgICBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXksIFJFRU5UUkFOVCk7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBhc3NlcnQoUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KSA9PSBSRUVOVFJBTlQpOworICAgICAgICBhc3NlcnQoZ2V0X3JlZW50cmFudCgpKTsKICAgICAgICAgUHlUaHJlYWRfc2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5LCBOVUxMKTsKICAgICB9CiB9CkBAIC0xOTQsMjcgKzIyMSw3NSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQKLWhhc2h0YWJsZV9jb21wYXJlX3VuaWNvZGUoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQorCitzdGF0aWMgUHlfdWhhc2hfdAoraGFzaHRhYmxlX2hhc2hfcHlvYmplY3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSkKIHsKLSAgICBpZiAoa2V5ICE9IE5VTEwgJiYgZW50cnktPmtleSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gKFB5VW5pY29kZV9Db21wYXJlKChQeU9iamVjdCAqKWtleSwgKFB5T2JqZWN0ICopZW50cnktPmtleSkgPT0gMCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4ga2V5ID09IGVudHJ5LT5rZXk7CisgICAgUHlPYmplY3QgKm9iajsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIG9iaik7CisgICAgcmV0dXJuIFB5T2JqZWN0X0hhc2gob2JqKTsKIH0KIAotc3RhdGljIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgaGFzaHRhYmxlX2FsbG9jID0ge21hbGxvYywgZnJlZX07CisKK3N0YXRpYyBpbnQKK2hhc2h0YWJsZV9jb21wYXJlX3VuaWNvZGUoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKK3sKKyAgICBQeU9iamVjdCAqa2V5MSwgKmtleTI7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBrZXkxKTsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwga2V5Mik7CisKKyAgICBpZiAoa2V5MSAhPSBOVUxMICYmIGtleTIgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIChQeVVuaWNvZGVfQ29tcGFyZShrZXkxLCBrZXkyKSA9PSAwKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBrZXkxID09IGtleTI7Cit9CisKKworc3RhdGljIFB5X3VoYXNoX3QKK2hhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQoreworICAgIHBvaW50ZXJfdCBwdHI7CisgICAgUHlfdWhhc2hfdCBoYXNoOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgcHRyKTsKKworICAgIGhhc2ggPSAoUHlfdWhhc2hfdClfUHlfSGFzaFBvaW50ZXIoKHZvaWQqKXB0ci5wdHIpOworICAgIGhhc2ggXj0gcHRyLmRvbWFpbjsKKyAgICByZXR1cm4gaGFzaDsKK30KKworCitzdGF0aWMgaW50CitoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQoreworICAgIHBvaW50ZXJfdCBwdHIxLCBwdHIyOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgcHRyMSk7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHB0cjIpOworCisgICAgLyogY29tcGFyZSBwb2ludGVyIGJlZm9yZSBkb21haW4sIGJlY2F1c2UgcG9pbnRlciBpcyBtb3JlIGxpa2VseSB0byBiZQorICAgICAgIGRpZmZlcmVudCAqLworICAgIHJldHVybiAocHRyMS5wdHIgPT0gcHRyMi5wdHIgJiYgcHRyMS5kb21haW4gPT0gcHRyMi5kb21haW4pOworCit9CisKIAogc3RhdGljIF9QeV9oYXNodGFibGVfdCAqCi1oYXNodGFibGVfbmV3KHNpemVfdCBkYXRhX3NpemUsCitoYXNodGFibGVfbmV3KHNpemVfdCBrZXlfc2l6ZSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMgaGFzaF9mdW5jLAogICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMpCiB7Ci0gICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoZGF0YV9zaXplLCAwLAorICAgIF9QeV9oYXNodGFibGVfYWxsb2NhdG9yX3QgaGFzaHRhYmxlX2FsbG9jID0ge21hbGxvYywgZnJlZX07CisgICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoa2V5X3NpemUsIGRhdGFfc2l6ZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2Z1bmMsIGNvbXBhcmVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmaGFzaHRhYmxlX2FsbG9jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzaHRhYmxlX2FsbG9jKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHJhd19tYWxsb2Moc2l6ZV90IHNpemUpCiB7CkBAIC0yMjcsMjEgKzMwMiwyOCBAQAogICAgIGFsbG9jYXRvcnMucmF3LmZyZWUoYWxsb2NhdG9ycy5yYXcuY3R4LCBwdHIpOwogfQogCisKIHN0YXRpYyBQeV91aGFzaF90Ci1oYXNodGFibGVfaGFzaF90cmFjZWJhY2soY29uc3Qgdm9pZCAqa2V5KQoraGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCiB7Ci0gICAgY29uc3QgdHJhY2ViYWNrX3QgKnRyYWNlYmFjayA9IGtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgdHJhY2ViYWNrKTsKICAgICByZXR1cm4gdHJhY2ViYWNrLT5oYXNoOwogfQogCisKIHN0YXRpYyBpbnQKLWhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayhjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmhlKQoraGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSkKIHsKLSAgICBjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMiA9IGhlLT5rZXk7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazEsICp0cmFjZWJhY2syOwogICAgIGNvbnN0IGZyYW1lX3QgKmZyYW1lMSwgKmZyYW1lMjsKICAgICBpbnQgaTsKIAorICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIHRyYWNlYmFjazEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCB0cmFjZWJhY2syKTsKKwogICAgIGlmICh0cmFjZWJhY2sxLT5uZnJhbWUgIT0gdHJhY2ViYWNrMi0+bmZyYW1lKQogICAgICAgICByZXR1cm4gMDsKIApAQCAtMjYwLDYgKzM0Miw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2dldF9mcmFtZShQeUZyYW1lT2JqZWN0ICpweWZyYW1lLCBmcmFtZV90ICpmcmFtZSkKIHsKQEAgLTMxMCwxNSArMzkzLDE1IEBACiAgICAgfQogCiAgICAgLyogaW50ZXJuIHRoZSBmaWxlbmFtZSAqLwotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBmaWxlbmFtZSk7CisgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewotICAgICAgICBmaWxlbmFtZSA9IChQeU9iamVjdCAqKWVudHJ5LT5rZXk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkodHJhY2VtYWxsb2NfZmlsZW5hbWVzLCBlbnRyeSwgZmlsZW5hbWUpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgLyogdHJhY2VtYWxsb2NfZmlsZW5hbWVzIGlzIHJlc3BvbnNpYmxlIHRvIGtlZXAgYSByZWZlcmVuY2UKICAgICAgICAgICAgdG8gdGhlIGZpbGVuYW1lICovCiAgICAgICAgIFB5X0lOQ1JFRihmaWxlbmFtZSk7Ci0gICAgICAgIGlmIChfUHlfaGFzaHRhYmxlX3NldCh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lLCBOVUxMLCAwKSA8IDApIHsKKyAgICAgICAgaWYgKF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKSA8IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihmaWxlbmFtZSk7CiAjaWZkZWYgVFJBQ0VfREVCVUcKICAgICAgICAgICAgIHRyYWNlbWFsbG9jX2Vycm9yKCJmYWlsZWQgdG8gaW50ZXJuIHRoZSBmaWxlbmFtZSIpOwpAQCAtMzMxLDYgKzQxNCw3IEBACiAgICAgZnJhbWUtPmZpbGVuYW1lID0gZmlsZW5hbWU7CiB9CiAKKwogc3RhdGljIFB5X3VoYXNoX3QKIHRyYWNlYmFja19oYXNoKHRyYWNlYmFja190ICp0cmFjZWJhY2spCiB7CkBAIC0zNTUsNiArNDM5LDcgQEAKICAgICByZXR1cm4geDsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2ViYWNrX2dldF9mcmFtZXModHJhY2ViYWNrX3QgKnRyYWNlYmFjaykKIHsKQEAgLTM4Miw2ICs0NjcsNyBAQAogICAgIH0KIH0KIAorCiBzdGF0aWMgdHJhY2ViYWNrX3QgKgogdHJhY2ViYWNrX25ldyh2b2lkKQogewpAQCAtNDAxLDkgKzQ4Nyw5IEBACiAgICAgdHJhY2ViYWNrLT5oYXNoID0gdHJhY2ViYWNrX2hhc2godHJhY2ViYWNrKTsKIAogICAgIC8qIGludGVybiB0aGUgdHJhY2ViYWNrICovCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCB0cmFjZWJhY2spOworICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgdHJhY2ViYWNrKTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewotICAgICAgICB0cmFjZWJhY2sgPSAodHJhY2ViYWNrX3QgKillbnRyeS0+a2V5OworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGVudHJ5LCB0cmFjZWJhY2spOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdHJhY2ViYWNrX3QgKmNvcHk7CkBAIC00MjAsNyArNTA2LDcgQEAKICAgICAgICAgfQogICAgICAgICBtZW1jcHkoY29weSwgdHJhY2ViYWNrLCB0cmFjZWJhY2tfc2l6ZSk7CiAKLSAgICAgICAgaWYgKF9QeV9oYXNodGFibGVfc2V0KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGNvcHksIE5VTEwsIDApIDwgMCkgeworICAgICAgICBpZiAoX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIGNvcHkpIDwgMCkgewogICAgICAgICAgICAgcmF3X2ZyZWUoY29weSk7CiAjaWZkZWYgVFJBQ0VfREVCVUcKICAgICAgICAgICAgIHRyYWNlbWFsbG9jX2Vycm9yKCJmYWlsZWQgdG8gaW50ZXJuIHRoZSB0cmFjZWJhY2s6IHB1dGRhdGEgZmFpbGVkIik7CkBAIC00MzIsNDYgKzUxOCwxNTQgQEAKICAgICByZXR1cm4gdHJhY2ViYWNrOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2FkZF90cmFjZSh2b2lkICpwdHIsIHNpemVfdCBzaXplKQordHJhY2VtYWxsb2NfdXNlX2RvbWFpbl9jYihfUHlfaGFzaHRhYmxlX3QgKm9sZF90cmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKLSAgICB0cmFjZV90IHRyYWNlOwotICAgIGludCByZXM7CisgICAgUHlfdWludHB0cl90IHB0cjsKKyAgICBwb2ludGVyX3Qga2V5OworICAgIF9QeV9oYXNodGFibGVfdCAqbmV3X3RyYWNlcyA9IChfUHlfaGFzaHRhYmxlX3QgKil1c2VyX2RhdGE7CisgICAgY29uc3Qgdm9pZCAqcGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX1BEQVRBKG9sZF90cmFjZXMsIGVudHJ5KTsKIAotI2lmZGVmIFdJVEhfVEhSRUFECi0gICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7Ci0jZW5kaWYKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKG9sZF90cmFjZXMsIGVudHJ5LCBwdHIpOworICAgIGtleS5wdHIgPSBwdHI7CisgICAga2V5LmRvbWFpbiA9IERFRkFVTFRfRE9NQUlOOwogCi0gICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX25ldygpOwotICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9zZXQobmV3X3RyYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGtleSksICZrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF90cmFjZXMtPmRhdGFfc2l6ZSwgcGRhdGEpOworfQorCisKKy8qIENvbnZlcnQgdHJhY2VtYWxsb2NfdHJhY2VzIGZyb20gY29tcGFjdCBrZXkgKFB5X3VpbnRwdHJfdCkgdG8gcG9pbnRlcl90IGtleS4KKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yLiAqLworc3RhdGljIGludAordHJhY2VtYWxsb2NfdXNlX2RvbWFpbih2b2lkKQoreworICAgIF9QeV9oYXNodGFibGVfdCAqbmV3X3RyYWNlcyA9IE5VTEw7CisKKyAgICBhc3NlcnQoIXRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKTsKKworICAgIG5ld190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihwb2ludGVyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfaGFzaF9wb2ludGVyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfcG9pbnRlcl90KTsKKyAgICBpZiAobmV3X3RyYWNlcyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKLQotICAgIHRyYWNlLnNpemUgPSBzaXplOwotICAgIHRyYWNlLnRyYWNlYmFjayA9IHRyYWNlYmFjazsKLQotICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7Ci0gICAgaWYgKHJlcyA9PSAwKSB7Ci0gICAgICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7Ci0gICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgKz0gc2l6ZTsKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPiB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkpCi0gICAgICAgICAgICB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkgPSB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5OwogICAgIH0KIAotICAgIHJldHVybiByZXM7CisgICAgaWYgKF9QeV9oYXNodGFibGVfZm9yZWFjaCh0cmFjZW1hbGxvY190cmFjZXMsIHRyYWNlbWFsbG9jX3VzZV9kb21haW5fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdHJhY2VzKSA8IDApCisgICAgeworICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kobmV3X3RyYWNlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2VzKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBuZXdfdHJhY2VzOworCisgICAgdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4gPSAxOworCisgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIHZvaWQKLXRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZSh2b2lkICpwdHIpCit0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UoX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyKQogewogICAgIHRyYWNlX3QgdHJhY2U7CisgICAgaW50IHJlbW92ZWQ7CiAKLSAgICBpZiAoX1B5X2hhc2h0YWJsZV9wb3AodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsICZ0cmFjZSwgc2l6ZW9mKHRyYWNlKSkpIHsKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpOworCisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgICAgICByZW1vdmVkID0gX1B5X0hBU0hUQUJMRV9QT1AodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXksIHRyYWNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlbW92ZWQgPSBfUHlfSEFTSFRBQkxFX1BPUCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgIH0KKyAgICBpZiAoIXJlbW92ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID49IHRyYWNlLnNpemUpOworICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgLT0gdHJhY2Uuc2l6ZTsKK30KKworI2RlZmluZSBSRU1PVkVfVFJBQ0UocHRyKSBcCisgICAgICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UoREVGQVVMVF9ET01BSU4sIChQeV91aW50cHRyX3QpKHB0cikpCisKKworc3RhdGljIGludAordHJhY2VtYWxsb2NfYWRkX3RyYWNlKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBwb2ludGVyX3Qga2V5ID0ge3B0ciwgZG9tYWlufTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworICAgIHRyYWNlX3QgdHJhY2U7CisgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90KiBlbnRyeTsKKyAgICBpbnQgcmVzOworCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKTsKKworICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja19uZXcoKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4gJiYgZG9tYWluICE9IERFRkFVTFRfRE9NQUlOKSB7CisgICAgICAgIC8qIGZpcnN0IHRyYWNlIHVzaW5nIGEgbm9uLXplcm8gZG9tYWluIHdoZXJlYXMgdHJhY2VzIHVzZSBjb21wYWN0CisgICAgICAgICAgIChQeV91aW50cHRyX3QpIGtleXM6IHN3aXRjaCB0byBwb2ludGVyX3Qga2V5cy4gKi8KKyAgICAgICAgaWYgKHRyYWNlbWFsbG9jX3VzZV9kb21haW4oKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIpOworICAgIH0KKworICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7CisgICAgICAgIC8qIHRoZSBtZW1vcnkgYmxvY2sgaXMgYWxyZWFkeSB0cmFja2VkICovCisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlbWFsbG9jX3RyYWNlcywgZW50cnksIHRyYWNlKTsKICAgICAgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPj0gdHJhY2Uuc2l6ZSk7CiAgICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgLT0gdHJhY2Uuc2l6ZTsKKworICAgICAgICB0cmFjZS5zaXplID0gc2l6ZTsKKyAgICAgICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOworICAgICAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1dSSVRFX0RBVEEodHJhY2VtYWxsb2NfdHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdHJhY2Uuc2l6ZSA9IHNpemU7CisgICAgICAgIHRyYWNlLnRyYWNlYmFjayA9IHRyYWNlYmFjazsKKworICAgICAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywga2V5LCB0cmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBfUHlfSEFTSFRBQkxFX1NFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFzc2VydCh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5IDw9IFBZX1NJWkVfTUFYIC0gc2l6ZSk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSArPSBzaXplOworICAgIGlmICh0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID4gdHJhY2VtYWxsb2NfcGVha190cmFjZWRfbWVtb3J5KQorICAgICAgICB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkgPSB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5OworICAgIHJldHVybiAwOwogfQogCisjZGVmaW5lIEFERF9UUkFDRShwdHIsIHNpemUpIFwKKyAgICAgICAgICAgIHRyYWNlbWFsbG9jX2FkZF90cmFjZShERUZBVUxUX0RPTUFJTiwgKFB5X3VpbnRwdHJfdCkocHRyKSwgc2l6ZSkKKworCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX2FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKQEAgLTQ4OCw3ICs2ODIsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIsIG5lbGVtICogZWxzaXplKSA8IDApIHsKKyAgICBpZiAoQUREX1RSQUNFKHB0ciwgbmVsZW0gKiBlbHNpemUpIDwgMCkgewogICAgICAgICAvKiBGYWlsZWQgdG8gYWxsb2NhdGUgYSB0cmFjZSBmb3IgdGhlIG5ldyBtZW1vcnkgYmxvY2sgKi8KICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICBhbGxvYy0+ZnJlZShhbGxvYy0+Y3R4LCBwdHIpOwpAQCAtNDk4LDYgKzY5Miw3IEBACiAgICAgcmV0dXJuIHB0cjsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKIHsKQEAgLTUxMiw5ICs3MDcsMTQgQEAKICAgICAgICAgLyogYW4gZXhpc3RpbmcgbWVtb3J5IGJsb2NrIGhhcyBiZWVuIHJlc2l6ZWQgKi8KIAogICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UocHRyKTsKIAotICAgICAgICBpZiAodHJhY2VtYWxsb2NfYWRkX3RyYWNlKHB0cjIsIG5ld19zaXplKSA8IDApIHsKKyAgICAgICAgLyogdHJhY2VtYWxsb2NfYWRkX3RyYWNlKCkgdXBkYXRlcyB0aGUgdHJhY2UgaWYgdGhlcmUgaXMgYWxyZWFkeQorICAgICAgICAgICBhIHRyYWNlIGF0IGFkZHJlc3MgKGRvbWFpbiwgcHRyMikgKi8KKyAgICAgICAgaWYgKHB0cjIgIT0gcHRyKSB7CisgICAgICAgICAgICBSRU1PVkVfVFJBQ0UocHRyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBRERfVFJBQ0UocHRyMiwgbmV3X3NpemUpIDwgMCkgewogICAgICAgICAgICAgLyogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiBUaGUgZXJyb3IgY2Fubm90IGJlIHJlcG9ydGVkIHRvCiAgICAgICAgICAgICAgICB0aGUgY2FsbGVyLCBiZWNhdXNlIHJlYWxsb2MoKSBtYXkgYWxyZWFkeSBoYXZlIHNocmlua2VkIHRoZQogICAgICAgICAgICAgICAgbWVtb3J5IGJsb2NrIGFuZCBzbyByZW1vdmVkIGJ5dGVzLgpAQCAtNTMyLDcgKzczMiw3IEBACiAgICAgICAgIC8qIG5ldyBhbGxvY2F0aW9uICovCiAKICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgaWYgKHRyYWNlbWFsbG9jX2FkZF90cmFjZShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CisgICAgICAgIGlmIChBRERfVFJBQ0UocHRyMiwgbmV3X3NpemUpIDwgMCkgewogICAgICAgICAgICAgLyogRmFpbGVkIHRvIGFsbG9jYXRlIGEgdHJhY2UgZm9yIHRoZSBuZXcgbWVtb3J5IGJsb2NrICovCiAgICAgICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgICAgICBhbGxvYy0+ZnJlZShhbGxvYy0+Y3R4LCBwdHIyKTsKQEAgLTU0Myw2ICs3NDMsNyBAQAogICAgIHJldHVybiBwdHIyOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19mcmVlKHZvaWQgKmN0eCwgdm9pZCAqcHRyKQogewpAQCAtNTU3LDEwICs3NTgsMTEgQEAKICAgICBhbGxvYy0+ZnJlZShhbGxvYy0+Y3R4LCBwdHIpOwogCiAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UocHRyKTsKKyAgICBSRU1PVkVfVFJBQ0UocHRyKTsKICAgICBUQUJMRVNfVU5MT0NLKCk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19hbGxvY19naWwoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewpAQCAtNTg1LDE4ICs3ODcsMjEgQEAKICAgICByZXR1cm4gcHRyOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfbWFsbG9jX2dpbCh2b2lkICpjdHgsIHNpemVfdCBzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19hbGxvY19naWwoMCwgY3R4LCAxLCBzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX2NhbGxvY19naWwodm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX2FsbG9jX2dpbCgxLCBjdHgsIG5lbGVtLCBlbHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmVhbGxvY19naWwodm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKIHsKQEAgLTYxMiw3ICs4MTcsNyBAQAogICAgICAgICBwdHIyID0gYWxsb2MtPnJlYWxsb2MoYWxsb2MtPmN0eCwgcHRyLCBuZXdfc2l6ZSk7CiAgICAgICAgIGlmIChwdHIyICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UocHRyKTsKKyAgICAgICAgICAgIFJFTU9WRV9UUkFDRShwdHIpOwogICAgICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwdHIyOwpAQCAtNjI5LDYgKzgzNCw3IEBACiAgICAgcmV0dXJuIHB0cjI7CiB9CiAKKwogI2lmZGVmIFRSQUNFX1JBV19NQUxMT0MKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X2FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKQEAgLTY2MywxOCArODY5LDIxIEBACiAgICAgcmV0dXJuIHB0cjsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19tYWxsb2Modm9pZCAqY3R4LCBzaXplX3Qgc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfcmF3X2FsbG9jKDAsIGN0eCwgMSwgc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfY2FsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19yYXdfYWxsb2MoMSwgY3R4LCBuZWxlbSwgZWxzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19yZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcHRyLCBzaXplX3QgbmV3X3NpemUpCiB7CkBAIC02OTEsNyArOTAwLDcgQEAKIAogICAgICAgICBpZiAocHRyMiAhPSBOVUxMICYmIHB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICAgICAgdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHB0cik7CisgICAgICAgICAgICBSRU1PVkVfVFJBQ0UocHRyKTsKICAgICAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcHRyMjsKQEAgLTcxNSwyMiArOTI0LDMxIEBACiB9CiAjZW5kaWYgICAvKiBUUkFDRV9SQVdfTUFMTE9DICovCiAKKwogc3RhdGljIGludAotdHJhY2VtYWxsb2NfY2xlYXJfZmlsZW5hbWUoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqdXNlcl9kYXRhKQordHJhY2VtYWxsb2NfY2xlYXJfZmlsZW5hbWUoX1B5X2hhc2h0YWJsZV90ICpodCwgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICBQeU9iamVjdCAqZmlsZW5hbWUgPSAoUHlPYmplY3QgKillbnRyeS0+a2V5OworICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKKworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBmaWxlbmFtZSk7CiAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgaW50Ci10cmFjZWJhY2tfZnJlZV90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqdXNlcl9kYXRhKQordHJhY2ViYWNrX2ZyZWVfdHJhY2ViYWNrKF9QeV9oYXNodGFibGVfdCAqaHQsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2sgPSAodHJhY2ViYWNrX3QgKillbnRyeS0+a2V5OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgdHJhY2ViYWNrKTsKICAgICByYXdfZnJlZSh0cmFjZWJhY2spOwogICAgIHJldHVybiAwOwogfQogCisKIC8qIHJlZW50cmFudCBmbGFnIG11c3QgYmUgc2V0IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBhbmQgR0lMIG11c3QgYmUgaGVsZCAqLwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2NsZWFyX3RyYWNlcyh2b2lkKQpAQCAtNzUzLDYgKzk3MSw3IEBACiAgICAgX1B5X2hhc2h0YWJsZV9jbGVhcih0cmFjZW1hbGxvY19maWxlbmFtZXMpOwogfQogCisKIHN0YXRpYyBpbnQKIHRyYWNlbWFsbG9jX2luaXQodm9pZCkKIHsKQEAgLTc4OSwyMSArMTAwOCwyOSBAQAogICAgIH0KICNlbmRpZgogCi0gICAgdHJhY2VtYWxsb2NfZmlsZW5hbWVzID0gaGFzaHRhYmxlX25ldygwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeV9oYXNodGFibGVfaGFzaF9mdW5jKVB5T2JqZWN0X0hhc2gsCisgICAgdHJhY2VtYWxsb2NfZmlsZW5hbWVzID0gaGFzaHRhYmxlX25ldyhzaXplb2YoUHlPYmplY3QgKiksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfaGFzaF9weW9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9jb21wYXJlX3VuaWNvZGUpOwogCi0gICAgdHJhY2VtYWxsb2NfdHJhY2ViYWNrcyA9IGhhc2h0YWJsZV9uZXcoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMpaGFzaHRhYmxlX2hhc2hfdHJhY2ViYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyloYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2spOworICAgIHRyYWNlbWFsbG9jX3RyYWNlYmFja3MgPSBoYXNodGFibGVfbmV3KHNpemVvZih0cmFjZWJhY2tfdCAqKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfaGFzaF90cmFjZWJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKTsKIAotICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHRyYWNlX3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QpOworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICB0cmFjZW1hbGxvY190cmFjZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihwb2ludGVyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih0cmFjZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfaGFzaF9wb2ludGVyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfcG9pbnRlcl90KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5X3VpbnRwdHJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CisgICAgfQogCiAgICAgaWYgKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyA9PSBOVUxMIHx8IHRyYWNlbWFsbG9jX3RyYWNlYmFja3MgPT0gTlVMTAotICAgICAgICB8fCB0cmFjZW1hbGxvY190cmFjZXMgPT0gTlVMTCkKLSAgICB7CisgICAgICAgfHwgdHJhY2VtYWxsb2NfdHJhY2VzID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTgyMyw2ICsxMDUwLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfZGVpbml0KHZvaWQpCiB7CkBAIC04MzMsOSArMTA2MSw5IEBACiAgICAgdHJhY2VtYWxsb2Nfc3RvcCgpOwogCiAgICAgLyogZGVzdHJveSBoYXNoIHRhYmxlcyAqLwotICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZXMpOwogICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZWJhY2tzKTsKICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfZmlsZW5hbWVzKTsKKyAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3kodHJhY2VtYWxsb2NfdHJhY2VzKTsKIAogI2lmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmIGRlZmluZWQoVFJBQ0VfUkFXX01BTExPQykKICAgICBpZiAodGFibGVzX2xvY2sgIT0gTlVMTCkgewpAQCAtODQ2LDExICsxMDc0LDEzIEBACiAKICNpZmRlZiBSRUVOVFJBTlRfVEhSRUFETE9DQUwKICAgICBQeVRocmVhZF9kZWxldGVfa2V5KHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpOworICAgIHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkgPSAtMTsKICNlbmRpZgogCiAgICAgUHlfWERFQ1JFRih1bmtub3duX2ZpbGVuYW1lKTsKIH0KIAorCiBzdGF0aWMgaW50CiB0cmFjZW1hbGxvY19zdGFydChpbnQgbWF4X25mcmFtZSkKIHsKQEAgLTkwNyw2ICsxMTM3LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2Nfc3RvcCh2b2lkKQogewpAQCAtOTIzLDggKzExNTQsOSBAQAogICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmYWxsb2NhdG9ycy5tZW0pOwogICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fT0JKLCAmYWxsb2NhdG9ycy5vYmopOwogCi0gICAgLyogcmVsZWFzZSBtZW1vcnkgKi8KICAgICB0cmFjZW1hbGxvY19jbGVhcl90cmFjZXMoKTsKKworICAgIC8qIHJlbGVhc2UgbWVtb3J5ICovCiAgICAgcmF3X2ZyZWUodHJhY2VtYWxsb2NfdHJhY2ViYWNrKTsKICAgICB0cmFjZW1hbGxvY190cmFjZWJhY2sgPSBOVUxMOwogfQpAQCAtOTM1LDYgKzExNjcsNyBAQAogICAgICJUcnVlIGlmIHRoZSB0cmFjZW1hbGxvYyBtb2R1bGUgaXMgdHJhY2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zLFxuIgogICAgICJGYWxzZSBvdGhlcndpc2UuIik7CiAKKwogc3RhdGljIFB5T2JqZWN0KgogcHlfdHJhY2VtYWxsb2NfaXNfdHJhY2luZyhQeU9iamVjdCAqc2VsZikKIHsKQEAgLTk0Niw2ICsxMTc5LDcgQEAKICAgICAiXG4iCiAgICAgIkNsZWFyIHRyYWNlcyBvZiBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSBQeXRob24uIik7CiAKKwogc3RhdGljIFB5T2JqZWN0KgogcHlfdHJhY2VtYWxsb2NfY2xlYXJfdHJhY2VzKFB5T2JqZWN0ICpzZWxmKQogewpAQCAtOTU5LDYgKzExOTMsNyBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisKIHN0YXRpYyBQeU9iamVjdCoKIGZyYW1lX3RvX3B5b2JqZWN0KGZyYW1lX3QgKmZyYW1lKQogewpAQCAtOTY4LDggKzEyMDMsNiBAQAogICAgIGlmIChmcmFtZV9vYmogPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoZnJhbWUtPmZpbGVuYW1lID09IE5VTEwpCi0gICAgICAgIGZyYW1lLT5maWxlbmFtZSA9IFB5X05vbmU7CiAgICAgUHlfSU5DUkVGKGZyYW1lLT5maWxlbmFtZSk7CiAgICAgUHlUdXBsZV9TRVRfSVRFTShmcmFtZV9vYmosIDAsIGZyYW1lLT5maWxlbmFtZSk7CiAKQEAgLTk4Myw2ICsxMjE2LDcgQEAKICAgICByZXR1cm4gZnJhbWVfb2JqOwogfQogCisKIHN0YXRpYyBQeU9iamVjdCoKIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZWJhY2tfdCAqdHJhY2ViYWNrLCBfUHlfaGFzaHRhYmxlX3QgKmludGVybl90YWJsZSkKIHsKQEAgLTEwMjEsMzMgKzEyNTUsNDMgQEAKICAgICByZXR1cm4gZnJhbWVzOwogfQogCisKIHN0YXRpYyBQeU9iamVjdCoKLXRyYWNlX3RvX3B5b2JqZWN0KHRyYWNlX3QgKnRyYWNlLCBfUHlfaGFzaHRhYmxlX3QgKmludGVybl90cmFjZWJhY2tzKQordHJhY2VfdG9fcHlvYmplY3QoX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCB0cmFjZV90ICp0cmFjZSwKKyAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfdCAqaW50ZXJuX3RyYWNlYmFja3MpCiB7CiAgICAgUHlPYmplY3QgKnRyYWNlX29iaiA9IE5VTEw7Ci0gICAgUHlPYmplY3QgKnNpemUsICp0cmFjZWJhY2s7CisgICAgUHlPYmplY3QgKm9iajsKIAotICAgIHRyYWNlX29iaiA9IFB5VHVwbGVfTmV3KDIpOworICAgIHRyYWNlX29iaiA9IFB5VHVwbGVfTmV3KDMpOwogICAgIGlmICh0cmFjZV9vYmogPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBzaXplID0gUHlMb25nX0Zyb21TaXplX3QodHJhY2UtPnNpemUpOwotICAgIGlmIChzaXplID09IE5VTEwpIHsKKyAgICBvYmogPSBQeUxvbmdfRnJvbVNpemVfdChkb21haW4pOworICAgIGlmIChvYmogPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYodHJhY2Vfb2JqKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAwLCBzaXplKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMCwgb2JqKTsKIAotICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZS0+dHJhY2ViYWNrLCBpbnRlcm5fdHJhY2ViYWNrcyk7Ci0gICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKSB7CisgICAgb2JqID0gUHlMb25nX0Zyb21TaXplX3QodHJhY2UtPnNpemUpOworICAgIGlmIChvYmogPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYodHJhY2Vfb2JqKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAxLCB0cmFjZWJhY2spOworICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAxLCBvYmopOworCisgICAgb2JqID0gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlLT50cmFjZWJhY2ssIGludGVybl90cmFjZWJhY2tzKTsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgUHlfREVDUkVGKHRyYWNlX29iaik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeVR1cGxlX1NFVF9JVEVNKHRyYWNlX29iaiwgMiwgb2JqKTsKIAogICAgIHJldHVybiB0cmFjZV9vYmo7CiB9CiAKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIF9QeV9oYXNodGFibGVfdCAqdHJhY2VzOwogICAgIF9QeV9oYXNodGFibGVfdCAqdHJhY2ViYWNrczsKQEAgLTEwNTUsMTYgKzEyOTksMjYgQEAKIH0gZ2V0X3RyYWNlc190OwogCiBzdGF0aWMgaW50Ci10cmFjZW1hbGxvY19nZXRfdHJhY2VzX2ZpbGwoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqdXNlcl9kYXRhKQordHJhY2VtYWxsb2NfZ2V0X3RyYWNlc19maWxsKF9QeV9oYXNodGFibGVfdCAqdHJhY2VzLCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKICAgICBnZXRfdHJhY2VzX3QgKmdldF90cmFjZXMgPSB1c2VyX2RhdGE7Ci0gICAgdHJhY2VfdCAqdHJhY2U7CisgICAgX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluOworICAgIHRyYWNlX3QgdHJhY2U7CiAgICAgUHlPYmplY3QgKnRyYWNlbWFsbG9jX29iajsKICAgICBpbnQgcmVzOwogCi0gICAgdHJhY2UgPSAodHJhY2VfdCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShlbnRyeSk7CisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHBvaW50ZXJfdCBrZXk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkodHJhY2VzLCBlbnRyeSwga2V5KTsKKyAgICAgICAgZG9tYWluID0ga2V5LmRvbWFpbjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRvbWFpbiA9IERFRkFVTFRfRE9NQUlOOworICAgIH0KKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQSh0cmFjZXMsIGVudHJ5LCB0cmFjZSk7CiAKLSAgICB0cmFjZW1hbGxvY19vYmogPSB0cmFjZV90b19weW9iamVjdCh0cmFjZSwgZ2V0X3RyYWNlcy0+dHJhY2ViYWNrcyk7CisgICAgdHJhY2VtYWxsb2Nfb2JqID0gdHJhY2VfdG9fcHlvYmplY3QoZG9tYWluLCAmdHJhY2UsIGdldF90cmFjZXMtPnRyYWNlYmFja3MpOwogICAgIGlmICh0cmFjZW1hbGxvY19vYmogPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDE7CiAKQEAgLTEwNzYsMTQgKzEzMzAsMTkgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgaW50Ci10cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqdXNlcl9kYXRhKQordHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiKF9QeV9oYXNodGFibGVfdCAqdHJhY2ViYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICBQeU9iamVjdCAqb2JqID0gKFB5T2JqZWN0ICopX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChlbnRyeSk7CisgICAgUHlPYmplY3QgKm9iajsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQSh0cmFjZWJhY2tzLCBlbnRyeSwgb2JqKTsKICAgICBQeV9ERUNSRUYob2JqKTsKICAgICByZXR1cm4gMDsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlc19kb2MsCiAgICAgIl9nZXRfdHJhY2VzKCkgLT4gbGlzdFxuIgogICAgICJcbiIKQEAgLTExMTAsNyArMTM2OSw4IEBACiAKICAgICAvKiB0aGUgdHJhY2ViYWNrIGhhc2ggdGFibGUgaXMgdXNlZCB0ZW1wb3JhcmlseSB0byBpbnRlcm4gdHJhY2ViYWNrIHR1cGxlCiAgICAgICAgb2YgKGZpbGVuYW1lLCBsaW5lbm8pIHR1cGxlcyAqLwotICAgIGdldF90cmFjZXMudHJhY2ViYWNrcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKFB5T2JqZWN0ICopLAorICAgIGdldF90cmFjZXMudHJhY2ViYWNrcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHRyYWNlYmFja190ICopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFB5T2JqZWN0ICopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QpOwogICAgIGlmIChnZXRfdHJhY2VzLnRyYWNlYmFja3MgPT0gTlVMTCkgewpAQCAtMTE0MiwxNSArMTQwMiw0MyBAQAogZmluYWxseToKICAgICBpZiAoZ2V0X3RyYWNlcy50cmFjZWJhY2tzICE9IE5VTEwpIHsKICAgICAgICAgX1B5X2hhc2h0YWJsZV9mb3JlYWNoKGdldF90cmFjZXMudHJhY2ViYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VtYWxsb2NfcHlvYmplY3RfZGVjcmVmX2NiLCBOVUxMKTsKICAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KGdldF90cmFjZXMudHJhY2ViYWNrcyk7CiAgICAgfQotICAgIGlmIChnZXRfdHJhY2VzLnRyYWNlcyAhPSBOVUxMKQorICAgIGlmIChnZXRfdHJhY2VzLnRyYWNlcyAhPSBOVUxMKSB7CiAgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShnZXRfdHJhY2VzLnRyYWNlcyk7CisgICAgfQogCiAgICAgcmV0dXJuIGdldF90cmFjZXMubGlzdDsKIH0KIAorCitzdGF0aWMgdHJhY2ViYWNrX3QqCit0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0cikKK3sKKyAgICB0cmFjZV90IHRyYWNlOworICAgIGludCBmb3VuZDsKKworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgVEFCTEVTX0xPQ0soKTsKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgcG9pbnRlcl90IGtleSA9IHtwdHIsIGRvbWFpbn07CisgICAgICAgIGZvdW5kID0gX1B5X0hBU0hUQUJMRV9HRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXksIHRyYWNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvdW5kID0gX1B5X0hBU0hUQUJMRV9HRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKKyAgICB9CisgICAgVEFCTEVTX1VOTE9DSygpOworCisgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gdHJhY2UudHJhY2ViYWNrOworfQorCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfb2JqZWN0X3RyYWNlYmFja19kb2MsCiAgICAgIl9nZXRfb2JqZWN0X3RyYWNlYmFjayhvYmopXG4iCiAgICAgIlxuIgpAQCAtMTE2NSwxMSArMTQ1Myw3IEBACiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0eXBlOwogICAgIHZvaWQgKnB0cjsKLSAgICB0cmFjZV90IHRyYWNlOwotICAgIGludCBmb3VuZDsKLQotICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpCi0gICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CiAKICAgICB0eXBlID0gUHlfVFlQRShvYmopOwogICAgIGlmIChQeVR5cGVfSVNfR0ModHlwZSkpCkBAIC0xMTc3LDE2ICsxNDYxLDQ4IEBACiAgICAgZWxzZQogICAgICAgICBwdHIgPSAodm9pZCAqKW9iajsKIAotICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgZm91bmQgPSBfUHlfSEFTSFRBQkxFX0dFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOwotICAgIFRBQkxFU19VTkxPQ0soKTsKLQotICAgIGlmICghZm91bmQpCisgICAgdHJhY2ViYWNrID0gdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhERUZBVUxUX0RPTUFJTiwgKFB5X3VpbnRwdHJfdClwdHIpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAKLSAgICByZXR1cm4gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlLnRyYWNlYmFjaywgTlVMTCk7CisgICAgcmV0dXJuIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZWJhY2ssIE5VTEwpOwogfQogCisKKyNkZWZpbmUgUFVUUyhmZCwgc3RyKSBfUHlfd3JpdGVfbm9yYWlzZShmZCwgc3RyLCAoaW50KXN0cmxlbihzdHIpKQorCitzdGF0aWMgdm9pZAorX1B5TWVtX0R1bXBGcmFtZShpbnQgZmQsIGZyYW1lX3QgKiBmcmFtZSkKK3sKKyAgICBQVVRTKGZkLCAiICBGaWxlIFwiIik7CisgICAgX1B5X0R1bXBBU0NJSShmZCwgZnJhbWUtPmZpbGVuYW1lKTsKKyAgICBQVVRTKGZkLCAiXCIsIGxpbmUgIik7CisgICAgX1B5X0R1bXBEZWNpbWFsKGZkLCBmcmFtZS0+bGluZW5vKTsKKyAgICBQVVRTKGZkLCAiXG4iKTsKK30KKworLyogRHVtcCB0aGUgdHJhY2ViYWNrIHdoZXJlIGEgbWVtb3J5IGJsb2NrIHdhcyBhbGxvY2F0ZWQgaW50byBmaWxlIGRlc2NyaXB0b3IKKyAgIGZkLiBUaGUgZnVuY3Rpb24gbWF5IGJsb2NrIG9uIFRBQkxFU19MT0NLKCkgYnV0IGl0IGlzIHVubGlrZWx5LiAqLwordm9pZAorX1B5TWVtX0R1bXBUcmFjZWJhY2soaW50IGZkLCBjb25zdCB2b2lkICpwdHIpCit7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKyAgICBpbnQgaTsKKworICAgIHRyYWNlYmFjayA9IHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soREVGQVVMVF9ET01BSU4sIChQeV91aW50cHRyX3QpcHRyKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIFBVVFMoZmQsICJNZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KTpcbiIpOworICAgIGZvciAoaT0wOyBpIDwgdHJhY2ViYWNrLT5uZnJhbWU7IGkrKykgeworICAgICAgICBfUHlNZW1fRHVtcEZyYW1lKGZkLCAmdHJhY2ViYWNrLT5mcmFtZXNbaV0pOworICAgIH0KKyAgICBQVVRTKGZkLCAiXG4iKTsKK30KKworI3VuZGVmIFBVVFMKKworCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2Nfc3RhcnRfZG9jLAogICAgICJzdGFydChuZnJhbWU6IGludD0xKVxuIgogICAgICJcbiIKQEAgLTEyMjIsNiArMTUzOCw3IEBACiAgICAgIlN0b3AgdHJhY2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBjbGVhciB0cmFjZXNcbiIKICAgICAib2YgbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQgYnkgUHl0aG9uLiIpOwogCisKIHN0YXRpYyBQeU9iamVjdCoKIHB5X3RyYWNlbWFsbG9jX3N0b3AoUHlPYmplY3QgKnNlbGYpCiB7CkBAIC0xMjI5LDYgKzE1NDYsNyBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrX2xpbWl0X2RvYywKICAgICAiZ2V0X3RyYWNlYmFja19saW1pdCgpIC0+IGludFxuIgogICAgICJcbiIKQEAgLTEyNDQsNiArMTU2Miw3IEBACiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyh0cmFjZW1hbGxvY19jb25maWcubWF4X25mcmFtZSk7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZW1hbGxvY19tZW1vcnlfZG9jLAogICAgICJnZXRfdHJhY2VtYWxsb2NfbWVtb3J5KCkgLT4gaW50XG4iCiAgICAgIlxuIgpAQCAtMTI2Nyw2ICsxNTg2LDcgQEAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTiIsIHNpemVfb2JqKTsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlZF9tZW1vcnlfZG9jLAogICAgICJnZXRfdHJhY2VkX21lbW9yeSgpIC0+IChpbnQsIGludClcbiIKICAgICAiXG4iCkBAIC0xMjkyLDYgKzE2MTIsNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOTiIsIHNpemVfb2JqLCBwZWFrX3NpemVfb2JqKTsKIH0KIAorCiBzdGF0aWMgUHlNZXRob2REZWYgbW9kdWxlX21ldGhvZHNbXSA9IHsKICAgICB7ImlzX3RyYWNpbmciLCAoUHlDRnVuY3Rpb24pcHlfdHJhY2VtYWxsb2NfaXNfdHJhY2luZywKICAgICAgTUVUSF9OT0FSR1MsIHRyYWNlbWFsbG9jX2lzX3RyYWNpbmdfZG9jfSwKQEAgLTEzNDIsNiArMTY2Myw3IEBACiAgICAgcmV0dXJuIG07CiB9CiAKKwogc3RhdGljIGludAogcGFyc2Vfc3lzX3hvcHRpb25zKFB5T2JqZWN0ICp2YWx1ZSkKIHsKQEAgLTEzNzAsNiArMTY5Miw3IEBACiAgICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QobmZyYW1lLCBsb25nLCBpbnQpOwogfQogCisKIGludAogX1B5VHJhY2VNYWxsb2NfSW5pdCh2b2lkKQogewpAQCAtMTQyOCw2ICsxNzUxLDcgQEAKICAgICByZXR1cm4gdHJhY2VtYWxsb2Nfc3RhcnQobmZyYW1lKTsKIH0KIAorCiB2b2lkCiBfUHlUcmFjZU1hbGxvY19GaW5pKHZvaWQpCiB7CkBAIC0xNDM3LDMgKzE3NjEsNTkgQEAKICAgICB0cmFjZW1hbGxvY19kZWluaXQoKTsKIH0KIAoraW50CitfUHlUcmFjZU1hbGxvY19UcmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgcmVzOworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgUHlHSUxTdGF0ZV9TVEFURSBnaWxfc3RhdGU7CisjZW5kaWYKKworICAgIGlmICghdHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpIHsKKyAgICAgICAgLyogdHJhY2VtYWxsb2MgaXMgbm90IHRyYWNpbmc6IGRvIG5vdGhpbmcgKi8KKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgZ2lsX3N0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyNlbmRpZgorCisgICAgVEFCTEVTX0xPQ0soKTsKKyAgICByZXMgPSB0cmFjZW1hbGxvY19hZGRfdHJhY2UoZG9tYWluLCBwdHIsIHNpemUpOworICAgIFRBQkxFU19VTkxPQ0soKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgUHlHSUxTdGF0ZV9SZWxlYXNlKGdpbF9zdGF0ZSk7CisjZW5kaWYKKyAgICByZXR1cm4gcmVzOworfQorCisKK2ludAorX1B5VHJhY2VNYWxsb2NfVW50cmFjayhfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIpCit7CisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykgeworICAgICAgICAvKiB0cmFjZW1hbGxvYyBpcyBub3QgdHJhY2luZzogZG8gbm90aGluZyAqLworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisgICAgVEFCTEVTX0xPQ0soKTsKKyAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UoZG9tYWluLCBwdHIpOworICAgIFRBQkxFU19VTkxPQ0soKTsKKworICAgIHJldHVybiAwOworfQorCisKK1B5T2JqZWN0KgorX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0cikKK3sKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworCisgICAgdHJhY2ViYWNrID0gdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhkb21haW4sIHB0cik7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQorICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKworICAgIHJldHVybiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2ViYWNrLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3dpbmFwaS5jIGIvTW9kdWxlcy9fd2luYXBpLmMKaW5kZXggM2U3ZjE4Ny4uMjM5NmZlMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fd2luYXBpLmMKKysrIGIvTW9kdWxlcy9fd2luYXBpLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgICAgICBzZWxmLmRlY2xhcmUoZGF0YSkKICAgICAgICAgc2VsZi5lcnJfb2NjdXJyZWRfaWYoIl9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUiLCBkYXRhKQogICAgICAgICBkYXRhLnJldHVybl9jb252ZXJzaW9uLmFwcGVuZCgKLSAgICAgICAgICAgICdpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKVxuICAgIFB5X1JFVFVSTl9OT05FO1xuJykKKyAgICAgICAgICAgICdpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7XG4gICAgUHlfUkVUVVJOX05PTkU7XG59XG4nKQogICAgICAgICBkYXRhLnJldHVybl9jb252ZXJzaW9uLmFwcGVuZCgKICAgICAgICAgICAgICdyZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7XG4nKQogCkBAIC0xODgsNyArMTg4LDcgQEAKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoCiAgICAgICAgICAgICAncmV0dXJuX3ZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiayIsIF9yZXR1cm5fdmFsdWUpO1xuJykKIFtweXRob24gc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KLS8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTM3NDA3Njk3OTU5NmViYmFdKi8KKy8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTk0ODE5ZTcyZDJjNmQ1NThdKi8KIAogI2luY2x1ZGUgImNsaW5pYy9fd2luYXBpLmMuaCIKIApAQCAtNjc1LDcgKzY3NSw3IEBACiAvKiBoZWxwZXJzIGZvciBjcmVhdGVwcm9jZXNzICovCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nCi1nZXR1bG9uZyhQeU9iamVjdCogb2JqLCBjaGFyKiBuYW1lKQorZ2V0dWxvbmcoUHlPYmplY3QqIG9iaiwgY29uc3QgY2hhciogbmFtZSkKIHsKICAgICBQeU9iamVjdCogdmFsdWU7CiAgICAgdW5zaWduZWQgbG9uZyByZXQ7CkBAIC02OTEsNyArNjkxLDcgQEAKIH0KIAogc3RhdGljIEhBTkRMRQotZ2V0aGFuZGxlKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCitnZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY29uc3QgY2hhciogbmFtZSkKIHsKICAgICBQeU9iamVjdCogdmFsdWU7CiAgICAgSEFORExFIHJldDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCAyODAzMTc3Li5jYWMyM2JmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0zMSw3ICszMSw3IEBACiAgICAgaW50IGl0ZW1zaXplOwogICAgIFB5T2JqZWN0ICogKCpnZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCk7CiAgICAgaW50ICgqc2V0aXRlbSkoc3RydWN0IGFycmF5b2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOwotICAgIGNoYXIgKmZvcm1hdHM7CisgICAgY29uc3QgY2hhciAqZm9ybWF0czsKICAgICBpbnQgaXNfaW50ZWdlcl90eXBlOwogICAgIGludCBpc19zaWduZWQ7CiB9OwpAQCAtNDAsNyArNDAsNyBAQAogICAgIFB5T2JqZWN0X1ZBUl9IRUFECiAgICAgY2hhciAqb2JfaXRlbTsKICAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKm9iX2Rlc2NyOwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KICAgICBpbnQgb2JfZXhwb3J0czsgIC8qIE51bWJlciBvZiBleHBvcnRlZCBidWZmZXJzICovCiB9IGFycmF5b2JqZWN0OwpAQCAtNTExLDcgKzUxMSw3IEBACiAgKiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHR5cGVjb2RlX3RvX21mb3JtYXRfY29kZSgpIGlmIHlvdSBhZGQgYSBuZXcKICAqIHR5cGVjb2RlLgogICovCi1zdGF0aWMgc3RydWN0IGFycmF5ZGVzY3IgZGVzY3JpcHRvcnNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0gewogICAgIHsnYicsIDEsIGJfZ2V0aXRlbSwgYl9zZXRpdGVtLCAiYiIsIDEsIDF9LAogICAgIHsnQicsIDEsIEJCX2dldGl0ZW0sIEJCX3NldGl0ZW0sICJCIiwgMSwgMH0sCiAgICAgeyd1Jywgc2l6ZW9mKFB5X1VOSUNPREUpLCB1X2dldGl0ZW0sIHVfc2V0aXRlbSwgInUiLCAwLCAwfSwKQEAgLTUzOSw3ICs1MzksNyBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9YWQ0M2QzN2U5NDJhODg1NF0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKK25ld2FycmF5b2JqZWN0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlfc3NpemVfdCBzaXplLCBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3IpCiB7CiAgICAgYXJyYXlvYmplY3QgKm9wOwogICAgIHNpemVfdCBuYnl0ZXM7CkBAIC0xOTQ2LDcgKzE5NDYsNyBAQAogewogICAgIFB5T2JqZWN0ICpjb252ZXJ0ZWRfaXRlbXM7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKCFQeVR5cGVfQ2hlY2soYXJyYXl0eXBlKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLApAQCAtMjA4NCw3ICsyMDg0LDcgQEAKICAgICAgICAgUHlfc3NpemVfdCBpdGVtY291bnQgPSBQeV9TSVpFKGl0ZW1zKSAvIG1mX2Rlc2NyLnNpemU7CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1lbXN0ciA9CiAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKGl0ZW1zKTsKLSAgICAgICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgICAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICAgICAgLyogSWYgcG9zc2libGUsIHRyeSB0byBwYWNrIGFycmF5J3MgaXRlbXMgdXNpbmcgYSBkYXRhIHR5cGUKICAgICAgICAgICogdGhhdCBmaXRzIGJldHRlci4gVGhpcyBtYXkgcmVzdWx0IGluIGFuIGFycmF5IHdpdGggbmFycm93ZXIKQEAgLTI1NTQsNyArMjU1NCw3IEBACiAgICAgdmlldy0+Zm9ybWF0ID0gTlVMTDsKICAgICB2aWV3LT5pbnRlcm5hbCA9IE5VTEw7CiAgICAgaWYgKChmbGFncyAmIFB5QlVGX0ZPUk1BVCkgPT0gUHlCVUZfRk9STUFUKSB7Ci0gICAgICAgIHZpZXctPmZvcm1hdCA9IHNlbGYtPm9iX2Rlc2NyLT5mb3JtYXRzOworICAgICAgICB2aWV3LT5mb3JtYXQgPSAoY2hhciAqKXNlbGYtPm9iX2Rlc2NyLT5mb3JtYXRzOwogI2lmZGVmIFB5X1VOSUNPREVfV0lERQogICAgICAgICBpZiAoc2VsZi0+b2JfZGVzY3ItPnR5cGVjb2RlID09ICd1JykgewogICAgICAgICAgICAgdmlldy0+Zm9ybWF0ID0gInciOwpAQCAtMjU5NSw3ICsyNTk1LDcgQEAKIHsKICAgICBpbnQgYzsKICAgICBQeU9iamVjdCAqaW5pdGlhbCA9IE5VTEwsICppdCA9IE5VTEw7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmICh0eXBlID09ICZBcnJheXR5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJhcnJheS5hcnJheSgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg3NSw5ICsyODc1LDIwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogYXJyYXlpdGVyX25leHQoYXJyYXlpdGVyb2JqZWN0ICppdCkKIHsKKyAgICBhcnJheW9iamVjdCAqYW87CisKKyAgICBhc3NlcnQoaXQgIT0gTlVMTCk7CiAgICAgYXNzZXJ0KFB5QXJyYXlJdGVyX0NoZWNrKGl0KSk7Ci0gICAgaWYgKGl0LT5pbmRleCA8IFB5X1NJWkUoaXQtPmFvKSkKLSAgICAgICAgcmV0dXJuICgqaXQtPmdldGl0ZW0pKGl0LT5hbywgaXQtPmluZGV4KyspOworICAgIGFvID0gaXQtPmFvOworICAgIGlmIChhbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhc3NlcnQoYXJyYXlfQ2hlY2soYW8pKTsKKyAgICBpZiAoaXQtPmluZGV4IDwgUHlfU0laRShhbykpIHsKKyAgICAgICAgcmV0dXJuICgqaXQtPmdldGl0ZW0pKGFvLCBpdC0+aW5kZXgrKyk7CisgICAgfQorICAgIGl0LT5hbyA9IE5VTEw7CisgICAgUHlfREVDUkVGKGFvKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMjkwNiw4ICsyOTE3LDExIEBACiBhcnJheV9hcnJheWl0ZXJhdG9yX19fcmVkdWNlX19faW1wbChhcnJheWl0ZXJvYmplY3QgKnNlbGYpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Nzg5OGE1MmU4ZTY2ZTAxNiBpbnB1dD1hMDYyZWExZTk5NTE0MTdhXSovCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4oTyluIiwgX1B5T2JqZWN0X0dldEJ1aWx0aW4oIml0ZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5hbywgc2VsZi0+aW5kZXgpOworICAgIFB5T2JqZWN0ICpmdW5jID0gX1B5T2JqZWN0X0dldEJ1aWx0aW4oIml0ZXIiKTsKKyAgICBpZiAoc2VsZi0+YW8gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTigoKSkiLCBmdW5jKTsKKyAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk4oTyluIiwgZnVuYywgc2VsZi0+YW8sIHNlbGYtPmluZGV4KTsKIH0KIAogLypbY2xpbmljIGlucHV0XQpAQCAtMjk4Nyw3ICszMDAxLDcgQEAKICAgICBjaGFyIGJ1ZmZlcltQeV9BUlJBWV9MRU5HVEgoZGVzY3JpcHRvcnMpXSwgKnA7CiAgICAgUHlPYmplY3QgKnR5cGVjb2RlczsKICAgICBQeV9zc2l6ZV90IHNpemUgPSAwOwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICBpZiAoUHlUeXBlX1JlYWR5KCZBcnJheXR5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hdWRpb29wLmMgYi9Nb2R1bGVzL2F1ZGlvb3AuYwppbmRleCAzMDY5MzdlLi45YTk2ZWVhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2F1ZGlvb3AuYworKysgYi9Nb2R1bGVzL2F1ZGlvb3AuYwpAQCAtNTEsMTMgKzUxLDE1IEBACiAjZGVmaW5lIFNFR19TSElGVCAgICAgICAoNCkgICAgICAgICAgICAgLyogTGVmdCBzaGlmdCBmb3Igc2VnbWVudCBudW1iZXIuICovCiAjZGVmaW5lIFNFR19NQVNLICAgICAgICAoMHg3MCkgICAgICAgICAgLyogU2VnbWVudCBmaWVsZCBtYXNrLiAqLwogCi1zdGF0aWMgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsweDFGLCAweDNGLCAweDdGLCAweEZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkZ9Owotc3RhdGljIFB5SW50MTYgc2VnX3VlbmRbOF0gPSB7MHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkZ9Oworc3RhdGljIGNvbnN0IFB5SW50MTYgc2VnX2FlbmRbOF0gPSB7CisgICAgMHgxRiwgMHgzRiwgMHg3RiwgMHhGRiwgMHgxRkYsIDB4M0ZGLCAweDdGRiwgMHhGRkYKK307CitzdGF0aWMgY29uc3QgUHlJbnQxNiBzZWdfdWVuZFs4XSA9IHsKKyAgICAweDNGLCAweDdGLCAweEZGLCAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRiwgMHgxRkZGCit9OwogCiBzdGF0aWMgUHlJbnQxNgotc2VhcmNoKFB5SW50MTYgdmFsLCBQeUludDE2ICp0YWJsZSwgaW50IHNpemUpCitzZWFyY2goUHlJbnQxNiB2YWwsIGNvbnN0IFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKIHsKICAgICBpbnQgaTsKIApAQCAtNzAsNyArNzIsNyBAQAogI2RlZmluZSBzdF91bGF3MmxpbmVhcjE2KHVjKSAoX3N0X3VsYXcybGluZWFyMTZbdWNdKQogI2RlZmluZSBzdF9hbGF3MmxpbmVhcjE2KHVjKSAoX3N0X2FsYXcybGluZWFyMTZbdWNdKQogCi1zdGF0aWMgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0geworc3RhdGljIGNvbnN0IFB5SW50MTYgX3N0X3VsYXcybGluZWFyMTZbMjU2XSA9IHsKICAgICAtMzIxMjQsICAtMzExMDAsICAtMzAwNzYsICAtMjkwNTIsICAtMjgwMjgsICAtMjcwMDQsICAtMjU5ODAsCiAgICAgLTI0OTU2LCAgLTIzOTMyLCAgLTIyOTA4LCAgLTIxODg0LCAgLTIwODYwLCAgLTE5ODM2LCAgLTE4ODEyLAogICAgIC0xNzc4OCwgIC0xNjc2NCwgIC0xNTk5NiwgIC0xNTQ4NCwgIC0xNDk3MiwgIC0xNDQ2MCwgIC0xMzk0OCwKQEAgLTE3Niw3ICsxNzgsNyBAQAogCiB9CiAKLXN0YXRpYyBQeUludDE2IF9zdF9hbGF3MmxpbmVhcjE2WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgUHlJbnQxNiBfc3RfYWxhdzJsaW5lYXIxNlsyNTZdID0gewogICAgICAtNTUwNCwgICAtNTI0OCwgICAtNjAxNiwgICAtNTc2MCwgICAtNDQ4MCwgICAtNDIyNCwgICAtNDk5MiwKICAgICAgLTQ3MzYsICAgLTc1NTIsICAgLTcyOTYsICAgLTgwNjQsICAgLTc4MDgsICAgLTY1MjgsICAgLTYyNzIsCiAgICAgIC03MDQwLCAgIC02Nzg0LCAgIC0yNzUyLCAgIC0yNjI0LCAgIC0zMDA4LCAgIC0yODgwLCAgIC0yMjQwLApAQCAtMjcwLDEyICsyNzIsMTIgQEAKIC8qIEVuZCBvZiBjb2RlIHRha2VuIGZyb20gc294ICovCiAKIC8qIEludGVsIEFEUENNIHN0ZXAgdmFyaWF0aW9uIHRhYmxlICovCi1zdGF0aWMgaW50IGluZGV4VGFibGVbMTZdID0geworc3RhdGljIGNvbnN0IGludCBpbmRleFRhYmxlWzE2XSA9IHsKICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKICAgICAtMSwgLTEsIC0xLCAtMSwgMiwgNCwgNiwgOCwKIH07CiAKLXN0YXRpYyBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7CitzdGF0aWMgY29uc3QgaW50IHN0ZXBzaXplVGFibGVbODldID0gewogICAgIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LAogICAgIDE5LCAyMSwgMjMsIDI1LCAyOCwgMzEsIDM0LCAzNywgNDEsIDQ1LAogICAgIDUwLCA1NSwgNjAsIDY2LCA3MywgODAsIDg4LCA5NywgMTA3LCAxMTgsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2JpbmFzY2lpLmMgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKaW5kZXggZDkyMGQyMy4uYTMwNmFjZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9iaW5hc2NpaS5jCisrKyBiL01vZHVsZXMvYmluYXNjaWkuYwpAQCAtNzQsNyArNzQsNyBAQAogI2RlZmluZSBTS0lQIDB4N0UKICNkZWZpbmUgRkFJTCAweDdECiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2EyYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2EyYl9ocXhbMjU2XSA9IHsKIC8qICAgICAgIF5AICAgIF5BICAgIF5CICAgIF5DICAgIF5EICAgIF5FICAgIF5GICAgIF5HICAgKi8KIC8qIDAqLyAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIC8qICAgICAgIFxiICAgIFx0ICAgIFxuICAgIF5LICAgIF5MICAgIFxyICAgIF5OICAgIF5PICAgKi8KQEAgLTEyNSwxMCArMTI1LDEwIEBACiAgICAgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwgRkFJTCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfaHF4W10gPQogIiFcIiMkJSYnKCkqKywtMDEyMzQ1Njg5QEFCQ0RFRkdISUpLTE1OUFFSU1RVVlhZWltgYWJjZGVmaGlqa2xtcHFyIjsKIAotc3RhdGljIGNoYXIgdGFibGVfYTJiX2Jhc2U2NFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgdGFibGVfYTJiX2Jhc2U2NFtdID0gewogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsNjIsIC0xLC0xLC0xLDYzLApAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIC8qIE1heCBiaW5hcnkgY2h1bmsgc2l6ZTsgbGltaXRlZCBvbmx5IGJ5IGF2YWlsYWJsZSBtZW1vcnkgKi8KICNkZWZpbmUgQkFTRTY0X01BWEJJTiAoKFBZX1NTSVpFX1RfTUFYIC0gMykgLyAyKQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2Jhc2U2NFtdID0KICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKIAogCiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgY3JjdGFiX2hxeFsyNTZdID0gewogICAgIDB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAogICAgIDB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAogICAgIDB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LApAQCAtMjU2LDcgKzI1Niw4IEBACiBiaW5hc2NpaV9hMmJfdXVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTc3OWYzOWIwYjQ4NDU5ZiBpbnB1dD03Y2FmZWFmNzNkZjYzZDFjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKQEAgLTM0MiwxMyArMzQzLDE1IEBACiBiaW5hc2NpaV9iMmFfdXVfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTgxMDIxYjY5YmI5YTQxNCBpbnB1dD0wMGZkZjQ1OGNlOGI0NjViXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBiaW5fbGVuOworICAgIFB5X3NzaXplX3QgYmluX2xlbiwgb3V0X2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CiAgICAgaWYgKCBiaW5fbGVuID4gNDUgKSB7CkBAIC0zNTgsOSArMzYxLDEwIEBACiAgICAgfQogCiAgICAgLyogV2UncmUgbGF6eSBhbmQgYWxsb2NhdGUgdG8gbXVjaCAoZml4ZWQgdXAgbGF0ZXIpICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAyICsgKGJpbl9sZW4rMikvMyo0KSkgPT0gTlVMTCApCisgICAgb3V0X2xlbiA9IDIgKyAoYmluX2xlbiArIDIpIC8gMyAqIDQ7CisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIG91dF9sZW4pOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIC8qIFN0b3JlIHRoZSBsZW5ndGggKi8KICAgICAqYXNjaWlfZGF0YSsrID0gJyAnICsgKGJpbl9sZW4gJiAwNzcpOwpAQCAtMzgyLDE3ICszODYsMTIgQEAKICAgICB9CiAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAKIHN0YXRpYyBpbnQKLWJpbmFzY2lpX2ZpbmRfdmFsaWQodW5zaWduZWQgY2hhciAqcywgUHlfc3NpemVfdCBzbGVuLCBpbnQgbnVtKQorYmluYXNjaWlfZmluZF92YWxpZChjb25zdCB1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCiB7CiAgICAgLyogRmluZHMgJiByZXR1cm5zIHRoZSAobnVtKzEpdGgKICAgICAqKiB2YWxpZCBjaGFyYWN0ZXIgZm9yIGJhc2U2NCwgb3IgLTEgaWYgbm9uZS4KQEAgLTQyOSwxMyArNDI4LDE0IEBACiBiaW5hc2NpaV9hMmJfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlMzUxYjcwMmJlZDU2ZDIgaW5wdXQ9NTg3MmFjZjZlMWNhYzI0M10qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgYXNjaWlfbGVuLCBiaW5fbGVuOwogICAgIGludCBxdWFkX3BvcyA9IDA7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgYXNjaWlfZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBhc2NpaV9sZW4gPSBkYXRhLT5sZW47CkBAIC00NDcsMTEgKzQ0NywxMiBAQAogCiAgICAgYmluX2xlbiA9ICgoYXNjaWlfbGVuKzMpLzQpKjM7IC8qIFVwcGVyIGJvdW5kLCBjb3JyZWN0ZWQgbGF0ZXIgKi8KIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICAvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKSkgPT0gTlVMTCApCisgICAgYmluX2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBiaW5fbGVuKTsKKyAgICBpZiAoYmluX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKLSAgICBiaW5fbGVuID0gMDsKIAogICAgIGZvciggOyBhc2NpaV9sZW4gPiAwOyBhc2NpaV9sZW4tLSwgYXNjaWlfZGF0YSsrKSB7CiAgICAgICAgIHRoaXNfY2ggPSAqYXNjaWlfZGF0YTsKQEAgLTQ5NiwzMSArNDk3LDE3IEBACiAgICAgICAgIGlmICggbGVmdGJpdHMgPj0gOCApIHsKICAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7CiAgICAgICAgICAgICAqYmluX2RhdGErKyA9IChsZWZ0Y2hhciA+PiBsZWZ0Yml0cykgJiAweGZmOwotICAgICAgICAgICAgYmluX2xlbisrOwogICAgICAgICAgICAgbGVmdGNoYXIgJj0gKCgxIDw8IGxlZnRiaXRzKSAtIDEpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGxlZnRiaXRzICE9IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSW5jb3JyZWN0IHBhZGRpbmciKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgLyogQW5kIHNldCBzdHJpbmcgc2l6ZSBjb3JyZWN0bHkuIElmIHRoZSByZXN1bHQgc3RyaW5nIGlzIGVtcHR5Ci0gICAgKiogKGJlY2F1c2UgdGhlIGlucHV0IHdhcyBhbGwgaW52YWxpZCkgcmV0dXJuIHRoZSBzaGFyZWQgZW1wdHkKLSAgICAqKiBzdHJpbmcgaW5zdGVhZDsgX1B5Qnl0ZXNfUmVzaXplKCkgd29uJ3QgZG8gdGhpcyBmb3IgdXMuCi0gICAgKi8KLSAgICBpZiAoYmluX2xlbiA+IDApIHsKLSAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIGJpbl9sZW4pIDwgMCkgewotICAgICAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICBydiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoIiIsIDApOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBiaW5fZGF0YSk7CiB9CiAKIApAQCAtNTI4LDI0ICs1MTUsMjcgQEAKIGJpbmFzY2lpLmIyYV9iYXNlNjQKIAogICAgIGRhdGE6IFB5X2J1ZmZlcgotICAgIC8KKyAgICAqCisgICAgbmV3bGluZTogaW50KGNfZGVmYXVsdD0iMSIpID0gVHJ1ZQogCiBCYXNlNjQtY29kZSBsaW5lIG9mIGRhdGEuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1iaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNjZDYxZmJlZTI5MTMyODUgaW5wdXQ9MTRlYzRlNDczNzExNzRhOV0qLworYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IG5ld2xpbmUpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTllMWRkNzE5YTg5MGI1MCBpbnB1dD03YjJlYTZmYTM4ZDg5MjRjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBiaW5fbGVuOworICAgIFB5X3NzaXplX3QgYmluX2xlbiwgb3V0X2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBiaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBiaW5fbGVuID0gZGF0YS0+bGVuOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKICAgICBhc3NlcnQoYmluX2xlbiA+PSAwKTsKIApAQCAtNTU1LDExICs1NDUsMTQgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0b28gbXVjaCAoZml4ZWQgdXAgbGF0ZXIpLgotICAgICAgICIrMyIgbGVhdmVzIHJvb20gZm9yIHVwIHRvIHR3byBwYWQgY2hhcmFjdGVycyBhbmQgYSB0cmFpbGluZwotICAgICAgIG5ld2xpbmUuICBOb3RlIHRoYXQgJ2InIGdldHMgZW5jb2RlZCBhcyAnWWc9PVxuJyAoMSBpbiwgNSBvdXQpLiAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYmluX2xlbioyICsgMykpID09IE5VTEwgKQorICAgICAgICIrMiIgbGVhdmVzIHJvb20gZm9yIHVwIHRvIHR3byBwYWQgY2hhcmFjdGVycy4KKyAgICAgICBOb3RlIHRoYXQgJ2InIGdldHMgZW5jb2RlZCBhcyAnWWc9PVxuJyAoMSBpbiwgNSBvdXQpLiAqLworICAgIG91dF9sZW4gPSBiaW5fbGVuKjIgKyAyOworICAgIGlmIChuZXdsaW5lKQorICAgICAgICBvdXRfbGVuKys7CisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIG91dF9sZW4pOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBiaW5fbGVuID4gMCA7IGJpbl9sZW4tLSwgYmluX2RhdGErKyApIHsKICAgICAgICAgLyogU2hpZnQgdGhlIGRhdGEgaW50byBvdXIgYnVmZmVyICovCkBAIC01ODEsMTQgKzU3NCwxMCBAQAogICAgICAgICAqYXNjaWlfZGF0YSsrID0gdGFibGVfYjJhX2Jhc2U2NFsobGVmdGNoYXImMHhmKSA8PCAyXTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IEJBU0U2NF9QQUQ7CiAgICAgfQotICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgICphc2NpaV9kYXRhKysgPSAnXG4nOyAgICAgICAvKiBBcHBlbmQgYSBjb3VydGVzeSBuZXdsaW5lICovCiAKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGFzY2lpX2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQpAQCAtNjA0LDE2ICs1OTMsMTkgQEAKIGJpbmFzY2lpX2EyYl9ocXhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjBiY2RiYmQyOGIxMDVjZCBpbnB1dD0wZDkxNGM2ODBlMGVlZDU1XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CisgICAgUHlPYmplY3QgKnJlczsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBpbnQgZG9uZSA9IDA7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgYXNjaWlfZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBsZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChsZW4gPj0gMCk7CiAKQEAgLTYyMyw5ICs2MTUsOSBAQAogICAgIC8qIEFsbG9jYXRlIGEgc3RyaW5nIHRoYXQgaXMgdG9vIGJpZyAoZml4ZWQgbGF0ZXIpCiAgICAgICAgQWRkIHR3byB0byB0aGUgaW5pdGlhbCBsZW5ndGggdG8gcHJldmVudCBpbnRlcm5pbmcgd2hpY2gKICAgICAgICB3b3VsZCBwcmVjbHVkZSBzdWJzZXF1ZW50IHJlc2l6aW5nLiAgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbisyKSkgPT0gTlVMTCApCisgICAgYmluX2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4gKyAyKTsKKyAgICBpZiAoYmluX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYmluX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGFzY2lpX2RhdGErKyApIHsKICAgICAgICAgLyogR2V0IHRoZSBieXRlIGFuZCBsb29rIGl0IHVwICovCkBAIC02MzQsNyArNjI2LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoIHRoaXNfY2ggPT0gRkFJTCApIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIklsbGVnYWwgY2hhciIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoIHRoaXNfY2ggPT0gRE9ORSApIHsKQEAgLTY1NiwyMSArNjQ4LDE0IEBACiAgICAgaWYgKCBsZWZ0Yml0cyAmJiAhZG9uZSApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGhhcyBpbmNvbXBsZXRlIG51bWJlciBvZiBieXRlcyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChiaW5fZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIGlmIChydikgewotICAgICAgICBQeU9iamVjdCAqcnJ2ID0gUHlfQnVpbGRWYWx1ZSgiT2kiLCBydiwgZG9uZSk7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJldHVybiBycnY7Ci0gICAgfQogCi0gICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOaSIsIHJlcywgZG9uZSk7CiB9CiAKIApAQCAtNjg3LDExICs2NzIsMTMgQEAKIGJpbmFzY2lpX3JsZWNvZGVfaHF4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTA5MDVkYTM0NGRiZjA2NDggaW5wdXQ9ZTFmMTcxMjQ0N2E4MmIwOV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmluX2RhdGEsICpvdXRfZGF0YTsKLSAgICBQeU9iamVjdCAqcnY7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGNoOwogICAgIFB5X3NzaXplX3QgaW4sIGluZW5kLCBsZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKIApAQCAtNzAxLDkgKzY4OCw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogV29yc3QgY2FzZTogb3V0cHV0IGlzIHR3aWNlIGFzIGJpZyBhcyBpbnB1dCAoZml4ZWQgbGF0ZXIpICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4gKiAyICsgMik7CisgICAgaWYgKG91dF9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CiAKICAgICBmb3IoIGluPTA7IGluPGxlbjsgaW4rKykgewogICAgICAgICBjaCA9IGluX2RhdGFbaW5dOwpAQCAtNzI5LDEyICs3MTYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAob3V0X2RhdGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikpKSA8IDApIHsKLSAgICAgICAgUHlfQ0xFQVIocnYpOwotICAgIH0KLSAgICByZXR1cm4gcnY7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIG91dF9kYXRhKTsKIH0KIAogCkBAIC03NTEsMTUgKzczNCwxNyBAQAogYmluYXNjaWlfYjJhX2hxeF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01YTk4NzgxMGQ1ZTNjZGJiIGlucHV0PTk1OTZlYmUwMTlmZTEyYmFdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBiaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBsZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChsZW4gPj0gMCk7CiAKQEAgLTc2Nyw5ICs3NTIsOSBAQAogICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIAogICAgIC8qIEFsbG9jYXRlIGEgYnVmZmVyIHRoYXQgaXMgYXQgbGVhc3QgbGFyZ2UgZW5vdWdoICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBsZW4qMisyKSkgPT0gTlVMTCApCisgICAgYXNjaWlfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAoYXNjaWlfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBhc2NpaV9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CiAKICAgICBmb3IoIDsgbGVuID4gMCA7IGxlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCBpbnRvIG91ciBidWZmZXIsIGFuZCBvdXRwdXQgYW55IDZiaXRzIHJlYWR5ICovCkBAIC03ODYsMTIgKzc3MSw4IEBACiAgICAgICAgIGxlZnRjaGFyIDw8PSAoNi1sZWZ0Yml0cyk7CiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfaHF4W2xlZnRjaGFyICYgMHgzZl07CiAgICAgfQotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIApAQCAtODA4LDEzICs3ODksMTUgQEAKIGJpbmFzY2lpX3JsZWRlY29kZV9ocXhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjdhZmQ4OWI3ODk5NDZhYiBpbnB1dD01NGNkZDQ5ZmMwMTQ0MDJjXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqb3V0X2RhdGE7CiAgICAgdW5zaWduZWQgY2hhciBpbl9ieXRlLCBpbl9yZXBlYXQ7Ci0gICAgUHlPYmplY3QgKnJ2OwotICAgIFB5X3NzaXplX3QgaW5fbGVuLCBvdXRfbGVuLCBvdXRfbGVuX2xlZnQ7CisgICAgUHlfc3NpemVfdCBpbl9sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaW5fZGF0YSA9IGRhdGEtPmJ1ZjsKICAgICBpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChpbl9sZW4gPj0gMCk7CiAKQEAgLTgyNSw1OSArODA4LDQ4IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgb2YgcmVhc29uYWJsZSBzaXplLiBSZXNpemVkIHdoZW4gbmVlZGVkICovCi0gICAgb3V0X2xlbiA9IGluX2xlbioyOwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgb3V0X2xlbikpID09IE5VTEwgKQorICAgIG91dF9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgaW5fbGVuKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbjsKLSAgICBvdXRfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOworCisgICAgLyogVXNlIG92ZXJhbGxvY2F0aW9uICovCisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKICAgICAvKgogICAgICoqIFdlIG5lZWQgdHdvIG1hY3JvcyBoZXJlIHRvIGdldC9wdXQgYnl0ZXMgYW5kIGhhbmRsZQogICAgICoqIGVuZC1vZi1idWZmZXIgZm9yIGlucHV0IGFuZCBvdXRwdXQgc3RyaW5ncy4KICAgICAqLwotI2RlZmluZSBJTkJZVEUoYikgXAotICAgIGRvIHsgXAotICAgICAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbmNvbXBsZXRlLCAiIik7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsgXAotICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsgXAotICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyBcCisjZGVmaW5lIElOQllURShiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBpZiAoIC0taW5fbGVuIDwgMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhJbmNvbXBsZXRlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBiID0gKmluX2RhdGErKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSgwKQogCi0jZGVmaW5lIE9VVEJZVEUoYikgXAotICAgIGRvIHsgXAotICAgICAgICAgICAgIGlmICggLS1vdXRfbGVuX2xlZnQgPCAwICkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKCBvdXRfbGVuID4gUFlfU1NJWkVfVF9NQVggLyAyKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsgXAotICAgICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LCAyKm91dF9sZW4pIDwgMCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgeyBQeV9YREVDUkVGKHJ2KTsgcmV0dXJuIE5VTEw7IH0gXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0X2xlbjsgXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW5fbGVmdCA9IG91dF9sZW4tMTsgXAotICAgICAgICAgICAgICAgICAgICAgIG91dF9sZW4gPSBvdXRfbGVuICogMjsgXAotICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gYjsgXAotICAgIH0gd2hpbGUoMCkKLQotICAgICAgICAvKgotICAgICAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQotICAgICAgICAqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KLSAgICAgICAgKi8KLSAgICAgICAgSU5CWVRFKGluX2J5dGUpOworICAgIC8qCisgICAgKiogSGFuZGxlIGZpcnN0IGJ5dGUgc2VwYXJhdGVseSAoc2luY2Ugd2UgaGF2ZSB0byBnZXQgYW5ncnkKKyAgICAqKiBpbiBjYXNlIG9mIGFuIG9ycGhhbmVkIFJMRSBjb2RlKS4KKyAgICAqLworICAgIElOQllURShpbl9ieXRlKTsKIAogICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgSU5CWVRFKGluX3JlcGVhdCk7CisgICAgICAgIC8qIG9ubHkgMSBieXRlIHdpbGwgYmUgd3JpdHRlbiwgYnV0IDIgYnl0ZXMgd2VyZSBwcmVhbGxvY2F0ZWQ6CisgICAgICAgICAgIHN1YnN0cmFjdCAxIGJ5dGUgdG8gcHJldmVudCBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICB3cml0ZXIubWluX3NpemUtLTsKKwogICAgICAgICBpZiAoaW5fcmVwZWF0ICE9IDApIHsKICAgICAgICAgICAgIC8qIE5vdGUgRXJyb3IsIG5vdCBJbmNvbXBsZXRlICh3aGljaCBpcyBhdCB0aGUgZW5kCiAgICAgICAgICAgICAqKiBvZiB0aGUgc3RyaW5nIG9ubHkpLiBUaGlzIGlzIGEgcHJvZ3JhbW1lciBlcnJvci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJPcnBoYW5lZCBSTEUgY29kZSBhdCBzdGFydCIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBPVVRCWVRFKFJVTkNIQVIpOworICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgKm91dF9kYXRhKysgPSBpbl9ieXRlOwogICAgIH0KIAogICAgIHdoaWxlKCBpbl9sZW4gPiAwICkgewpAQCAtODg1LDI2ICs4NTcsMzkgQEAKIAogICAgICAgICBpZiAoaW5fYnl0ZSA9PSBSVU5DSEFSKSB7CiAgICAgICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgICAgIC8qIG9ubHkgMSBieXRlIHdpbGwgYmUgd3JpdHRlbiwgYnV0IDIgYnl0ZXMgd2VyZSBwcmVhbGxvY2F0ZWQ6CisgICAgICAgICAgICAgICBzdWJzdHJhY3QgMSBieXRlIHRvIHByZXZlbnQgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgICAgICBpZiAoIGluX3JlcGVhdCA9PSAwICkgewogICAgICAgICAgICAgICAgIC8qIEp1c3QgYW4gZXNjYXBlZCBSVU5DSEFSIHZhbHVlICovCi0gICAgICAgICAgICAgICAgT1VUQllURShSVU5DSEFSKTsKKyAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IFJVTkNIQVI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIFBpY2sgdXAgdmFsdWUgYW5kIG91dHB1dCBhIHNlcXVlbmNlIG9mIGl0ICovCiAgICAgICAgICAgICAgICAgaW5fYnl0ZSA9IG91dF9kYXRhWy0xXTsKKworICAgICAgICAgICAgICAgIC8qIGVubGFyZ2UgdGhlIGJ1ZmZlciBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoaW5fcmVwZWF0ID4gMSkgeworICAgICAgICAgICAgICAgICAgICAvKiAtMSBiZWNhdXNlIHdlIGFscmVhZHkgcHJlYWxsb2NhdGVkIDEgYnl0ZSAqLworICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yZXBlYXQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dF9kYXRhID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHdoaWxlICggLS1pbl9yZXBlYXQgPiAwICkKLSAgICAgICAgICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dF9kYXRhKysgPSBpbl9ieXRlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogTm9ybWFsIGJ5dGUgKi8KLSAgICAgICAgICAgIE9VVEJZVEUoaW5fYnl0ZSk7CisgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIG91dF9kYXRhKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogCkBAIC05MjIsNyArOTA3LDcgQEAKIGJpbmFzY2lpX2NyY19ocXhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIHVuc2lnbmVkIGludCBjcmMpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTY3YzJkYWM2MjYyNTcxNyBpbnB1dD1hZGQ4YzUzNzEyY2NjZWRhXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CiAKICAgICBjcmMgJj0gMHhmZmZmOwpAQCAtMTAwMCw3ICs5ODUsNyBAQAogICAgICB1c2luZyBieXRlLXN3YXAgaW5zdHJ1Y3Rpb25zLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3JjXzMyX3RhYlsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjcmNfMzJfdGFiWzI1Nl0gPSB7CiAweDAwMDAwMDAwVSwgMHg3NzA3MzA5NlUsIDB4ZWUwZTYxMmNVLCAweDk5MDk1MWJhVSwgMHgwNzZkYzQxOVUsCiAweDcwNmFmNDhmVSwgMHhlOTYzYTUzNVUsIDB4OWU2NDk1YTNVLCAweDBlZGI4ODMyVSwgMHg3OWRjYjhhNFUsCiAweGUwZDVlOTFlVSwgMHg5N2QyZDk4OFUsIDB4MDliNjRjMmJVLCAweDdlYjE3Y2JkVSwgMHhlN2I4MmQwN1UsCkBAIC0xMDczLDcgKzEwNTgsNyBAQAogI2lmZGVmIFVTRV9aTElCX0NSQzMyCiAvKiBUaGlzIHdhcyB0YWtlbiBmcm9tIHpsaWJtb2R1bGUuYyBQeVpsaWJfY3JjMzIgKGJ1dCBpcyBQWV9TU0laRV9UX0NMRUFOKSAqLwogewotICAgIEJ5dGUgKmJ1ZjsKKyAgICBjb25zdCBCeXRlICpidWY7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgaW50IHNpZ25lZF92YWw7CiAKQEAgLTEwODQsNyArMTA2OSw3IEBACiB9CiAjZWxzZSAgLyogVVNFX1pMSUJfQ1JDMzIgKi8KIHsgLyogQnkgSmltIEFobHN0cm9tOyBBbGwgcmlnaHRzIHRyYW5zZmVycmVkIHRvIENOUkkgKi8KLSAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICB1bnNpZ25lZCBpbnQgcmVzdWx0OwogCkBAIC0xMTY3LDcgKzExNTIsNyBAQAogYmluYXNjaWlfYTJiX2hleF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqaGV4c3RyKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ2MWRhNDUyYjVjNmQyOTAgaW5wdXQ9OWUxZTdmMmY5NGRiMjRmZF0qLwogewotICAgIGNoYXIqIGFyZ2J1ZjsKKyAgICBjb25zdCBjaGFyKiBhcmdidWY7CiAgICAgUHlfc3NpemVfdCBhcmdsZW47CiAgICAgUHlPYmplY3QgKnJldHZhbDsKICAgICBjaGFyKiByZXRidWY7CkBAIC0xMjI0LDcgKzEyMDksNyBAQAogICAgIHJldHVybiBiaW5hc2NpaV9hMmJfaGV4X2ltcGwobW9kdWxlLCBoZXhzdHIpOwogfQogCi1zdGF0aWMgaW50IHRhYmxlX2hleFsxMjhdID0geworc3RhdGljIGNvbnN0IGludCB0YWJsZV9oZXhbMTI4XSA9IHsKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLAogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKQEAgLTEyNTUsNyArMTI0MCw4IEBACiB7CiAgICAgUHlfc3NpemVfdCBpbiwgb3V0OwogICAgIGNoYXIgY2g7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKm9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqb2RhdGE7CiAgICAgUHlfc3NpemVfdCBkYXRhbGVuID0gMDsKICAgICBQeU9iamVjdCAqcnY7CiAKQEAgLTEzNjEsMTMgKzEzNDcsMTQgQEAKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hODdjYTljY2I5NGUyYTlmIGlucHV0PTdmMmE5YWFhMDA4ZTkyYjJdKi8KIHsKICAgICBQeV9zc2l6ZV90IGluLCBvdXQ7Ci0gICAgdW5zaWduZWQgY2hhciAqZGF0YWJ1ZiwgKm9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGFidWY7CisgICAgdW5zaWduZWQgY2hhciAqb2RhdGE7CiAgICAgUHlfc3NpemVfdCBkYXRhbGVuID0gMCwgb2RhdGFsZW4gPSAwOwogICAgIFB5T2JqZWN0ICpydjsKICAgICB1bnNpZ25lZCBpbnQgbGluZWxlbiA9IDA7CiAgICAgdW5zaWduZWQgY2hhciBjaDsKICAgICBpbnQgY3JsZiA9IDA7Ci0gICAgdW5zaWduZWQgY2hhciAqcDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOwogCiAgICAgZGF0YWJ1ZiA9IGRhdGEtPmJ1ZjsKICAgICBkYXRhbGVuID0gZGF0YS0+bGVuOwpAQCAtMTM3Niw3ICsxMzYzLDcgQEAKICAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBjb252ZXJ0aW5nIGFsbCBvZgogICAgICAqIHRoZSBlbmQgb2YgbGluZXMgdG8gYmUgdGhlIHNhbWUgZGVwZW5kaW5nIG9uIHRoaXMgZGV0ZWN0aW9uCiAgICAgICogaGVyZSAqLwotICAgIHAgPSAodW5zaWduZWQgY2hhciAqKSBtZW1jaHIoZGF0YWJ1ZiwgJ1xuJywgZGF0YWxlbik7CisgICAgcCA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhYnVmLCAnXG4nLCBkYXRhbGVuKTsKICAgICBpZiAoKHAgIT0gTlVMTCkgJiYgKHAgPiBkYXRhYnVmKSAmJiAoKihwLTEpID09ICdccicpKQogICAgICAgICBjcmxmID0gMTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaCBiL01vZHVsZXMvY2prY29kZWNzL2NsaW5pYy9tdWx0aWJ5dGVjb2RlYy5jLmgKaW5kZXggOGE0N2ZmOC4uMGQ4YTNlMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaAorKysgYi9Nb2R1bGVzL2Nqa2NvZGVjcy9jbGluaWMvbXVsdGlieXRlY29kZWMuYy5oCkBAIC0zMCw4ICszMCw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98ejplbmNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmVycm9ycykpCisgICAgICAgICZpbnB1dCwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlQ29kZWNfZW5jb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC02NiwxNCArNjcsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8ejpkZWNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZpbnB1dCwgJmVycm9ycykpCisgICAgICAgICZpbnB1dCwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlQ29kZWNfZGVjb2RlX2ltcGwoc2VsZiwgJmlucHV0LCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGlucHV0ICovCi0gICAgaWYgKGlucHV0Lm9iaikKKyAgICBpZiAoaW5wdXQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmaW5wdXQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMDAsOCArMTAzLDkgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgICAgICAmaW5wdXQsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyX2VuY29kZV9pbXBsKHNlbGYsIGlucHV0LCBmaW5hbCk7CiAKIGV4aXQ6CkBAIC0xNDcsMTQgKzE1MSwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxpOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgICAgICAmaW5wdXQsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyX2RlY29kZV9pbXBsKHNlbGYsICZpbnB1dCwgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGlucHV0ICovCi0gICAgaWYgKGlucHV0Lm9iaikKKyAgICBpZiAoaW5wdXQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmaW5wdXQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xOTYsOCArMjAyLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmc2l6ZW9iaikpCisgICAgICAgICZzaXplb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVTdHJlYW1SZWFkZXJfcmVhZF9pbXBsKHNlbGYsIHNpemVvYmopOwogCiBleGl0OgpAQCAtMjI0LDggKzIzMSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZSIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplb2JqKSkKKyAgICAgICAgJnNpemVvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkbGluZV9pbXBsKHNlbGYsIHNpemVvYmopOwogCiBleGl0OgpAQCAtMjUyLDggKzI2MCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyZWFkbGluZXMiLAogICAgICAgICAwLCAxLAotICAgICAgICAmc2l6ZWhpbnRvYmopKQorICAgICAgICAmc2l6ZWhpbnRvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkbGluZXNfaW1wbChzZWxmLCBzaXplaGludG9iaik7CiAKIGV4aXQ6CkBAIC0zMTcsNCArMzI2LDQgQEAKIAogI2RlZmluZSBfTVVMVElCWVRFQ09ERUNfX19DUkVBVEVfQ09ERUNfTUVUSE9EREVGICAgIFwKICAgICB7Il9fY3JlYXRlX2NvZGVjIiwgKFB5Q0Z1bmN0aW9uKV9tdWx0aWJ5dGVjb2RlY19fX2NyZWF0ZV9jb2RlYywgTUVUSF9PLCBfbXVsdGlieXRlY29kZWNfX19jcmVhdGVfY29kZWNfX2RvY19ffSwKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lZWJiMjFlMThjMzA0M2QxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mODM3YmM1NmIyZmEyYTRlIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19iejJtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKaW5kZXggM2VkODMwMy4uOTQ1MWZkMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmgKQEAgLTI1LDE0ICsyNSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpjb21wcmVzcyIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2J6Ml9CWjJDb21wcmVzc29yX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgwLDExICs4MiwxMyBAQAogICAgIGludCBjb21wcmVzc2xldmVsID0gOTsKIAogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmQloyQ29tcHJlc3Nvcl9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkNvbXByZXNzb3IiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkNvbXByZXNzb3IiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpCWjJDb21wcmVzc29yIiwKLSAgICAgICAgJmNvbXByZXNzbGV2ZWwpKQorICAgICAgICAmY29tcHJlc3NsZXZlbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkNvbXByZXNzb3JfX19pbml0X19faW1wbCgoQloyQ29tcHJlc3NvciAqKXNlbGYsIGNvbXByZXNzbGV2ZWwpOwogCiBleGl0OgpAQCAtMTI2LDE0ICsxMzAsMTYgQEAKICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGggPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfG46ZGVjb21wcmVzcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZtYXhfbGVuZ3RoKSkKKyAgICAgICAgJmRhdGEsICZtYXhfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9iejJfQloyRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTU1LDE0ICsxNjEsMTYgQEAKICAgICBpbnQgcmV0dXJuX3ZhbHVlID0gLTE7CiAKICAgICBpZiAoKFB5X1RZUEUoc2VsZikgPT0gJkJaMkRlY29tcHJlc3Nvcl9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vUG9zaXRpb25hbCgiQloyRGVjb21wcmVzc29yIiwgYXJncykpCisgICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJCWjJEZWNvbXByZXNzb3IiLCBhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmQloyRGVjb21wcmVzc29yX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyRGVjb21wcmVzc29yIiwga3dhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJCWjJEZWNvbXByZXNzb3IiLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2J6Ml9CWjJEZWNvbXByZXNzb3JfX19pbml0X19faW1wbCgoQloyRGVjb21wcmVzc29yICopc2VsZik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mZWYyOWI3NmIzMzE0ZmM3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03MWJlMjJmMzgyMjRmZTg0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19jb2RlY3Ntb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2NvZGVjc21vZHVsZS5jLmgKaW5kZXggZTk0YmUxMS4uYTdjYTc5ZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2NvZGVjc21vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2NvZGVjc21vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICplbmNvZGluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXAiLCAmZW5jb2RpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXAiLCAmZW5jb2RpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19sb29rdXBfaW1wbChtb2R1bGUsIGVuY29kaW5nKTsKIAogZXhpdDoKQEAgLTcwLDggKzcxLDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xzczplbmNvZGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZvYmosICZlbmNvZGluZywgJmVycm9ycykpCisgICAgICAgICZvYmosICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2VuY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEwNyw4ICsxMDksOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNzOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZGVjb2RlX2ltcGwobW9kdWxlLCBvYmosIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTMzLDggKzEzNiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6X2ZvcmdldF9jb2RlYyIsICZlbmNvZGluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOl9mb3JnZXRfY29kZWMiLCAmZW5jb2RpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19fZm9yZ2V0X2NvZGVjX2ltcGwobW9kdWxlLCBlbmNvZGluZyk7CiAKIGV4aXQ6CkBAIC0xNjEsMTQgKzE2NSwxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6ZXNjYXBlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19lc2NhcGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xOTMsOCArMTk5LDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIXx6OmVzY2FwZV9lbmNvZGUiLAotICAgICAgICAmUHlCeXRlc19UeXBlLCAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZQeUJ5dGVzX1R5cGUsICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZXNjYXBlX2VuY29kZV9pbXBsKG1vZHVsZSwgZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTIyMSw4ICsyMjgsOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2ludGVybmFsX2RlY29kZSIsCi0gICAgICAgICZvYmosICZlcnJvcnMpKQorICAgICAgICAmb2JqLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9pbnRlcm5hbF9kZWNvZGVfaW1wbChtb2R1bGUsIG9iaiwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTI1MCwxNCArMjU4LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzdfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfN19kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODMsMTQgKzI5MywxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl84X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzhfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzE2LDE0ICszMjgsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzQ5LDE0ICszNjMsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfbGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfbGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzgyLDE0ICszOTgsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMTZfYmVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfYmVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDE3LDE0ICs0MzUsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aWk6dXRmXzE2X2V4X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2V4X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgYnl0ZW9yZGVyLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDUwLDE0ICs0NzAsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDgzLDE0ICs1MDUsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfbGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfbGVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTE2LDE0ICs1NDAsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfMzJfYmVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfYmVfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTUxLDE0ICs1NzcsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aWk6dXRmXzMyX2V4X2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKQorICAgICAgICAmZGF0YSwgJmVycm9ycywgJmJ5dGVvcmRlciwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2V4X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgYnl0ZW9yZGVyLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTgzLDE0ICs2MTEsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnVuaWNvZGVfZXNjYXBlX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2VzY2FwZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTYxNSwxNCArNjQ1LDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpyYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3Jhd191bmljb2RlX2VzY2FwZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY0NywxNCArNjc5LDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8ejpsYXRpbl8xX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19sYXRpbl8xX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjc5LDE0ICs3MTMsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6OmFzY2lpX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19hc2NpaV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTcxMiwxNCArNzQ4LDE2IEBACiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6TzpjaGFybWFwX2RlY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzLCAmbWFwcGluZykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmbWFwcGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBtYXBwaW5nKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03NDcsMTQgKzc4NSwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOm1iY3NfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19tYmNzX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc4NSwxNCArODI1LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqfHppOmNvZGVfcGFnZV9kZWNvZGUiLAotICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKQorICAgICAgICAmY29kZXBhZ2UsICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19jb2RlX3BhZ2VfZGVjb2RlX2ltcGwobW9kdWxlLCBjb2RlcGFnZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgxOSwxNCArODYxLDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejpyZWFkYnVmZmVyX2VuY29kZSIsCi0gICAgICAgICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yZWFkYnVmZmVyX2VuY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODUxLDggKzg5NSw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlIiwKLSAgICAgICAgJm9iaiwgJmVycm9ycykpCisgICAgICAgICZvYmosICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2ludGVybmFsX2VuY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtODc4LDkgKzkyMywxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl83X2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl83X2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfN19lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTkwNiw5ICs5NTIsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfOF9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfOF9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzhfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC05MzUsOSArOTgyLDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMTZfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8xNl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC05NjMsOSArMTAxMSwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8xNl9sZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMTZfbGVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9sZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTk5MSw5ICsxMDQwLDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzE2X2JlX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8xNl9iZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2JlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTAyMCw5ICsxMDcwLDEwIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKICAgICBpbnQgYnl0ZW9yZGVyID0gMDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6aTp1dGZfMzJfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJmJ5dGVvcmRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHppOnV0Zl8zMl9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzMyX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMsIGJ5dGVvcmRlcik7CiAKIGV4aXQ6CkBAIC0xMDQ4LDkgKzEwOTksMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfbGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2xlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfbGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMDc2LDkgKzExMjgsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMzJfYmVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzMyX2JlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfYmVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTA0LDkgKzExNTcsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1bmljb2RlX2VzY2FwZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTMyLDkgKzExODYsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6cmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTYwLDkgKzEyMTUsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejpsYXRpbl8xX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OmxhdGluXzFfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xhdGluXzFfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMTg4LDkgKzEyNDQsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejphc2NpaV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejphc2NpaV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfYXNjaWlfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMjE3LDkgKzEyNzQsMTAgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXBwaW5nID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6TzpjaGFybWFwX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMsICZtYXBwaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ek86Y2hhcm1hcF9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzLCAmbWFwcGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgbWFwcGluZyk7CiAKIGV4aXQ6CkBAIC0xMjQzLDggKzEzMDEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICptYXA7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6Y2hhcm1hcF9idWlsZCIsICZtYXApKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpjaGFybWFwX2J1aWxkIiwgJm1hcCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NoYXJtYXBfYnVpbGRfaW1wbChtb2R1bGUsIG1hcCk7CiAKIGV4aXQ6CkBAIC0xMjcyLDkgKzEzMzEsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejptYmNzX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6Om1iY3NfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX21iY3NfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMzA1LDkgKzEzNjUsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPfHo6Y29kZV9wYWdlX2VuY29kZSIsCi0gICAgICAgICZjb2RlX3BhZ2UsICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaVV8ejpjb2RlX3BhZ2VfZW5jb2RlIiwKKyAgICAgICAgJmNvZGVfcGFnZSwgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NvZGVfcGFnZV9lbmNvZGVfaW1wbChtb2R1bGUsIGNvZGVfcGFnZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTM0MSw4ICsxNDAyLDkgQEAKICAgICBQeU9iamVjdCAqaGFuZGxlcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086cmVnaXN0ZXJfZXJyb3IiLAotICAgICAgICAmZXJyb3JzLCAmaGFuZGxlcikpCisgICAgICAgICZlcnJvcnMsICZoYW5kbGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfcmVnaXN0ZXJfZXJyb3JfaW1wbChtb2R1bGUsIGVycm9ycywgaGFuZGxlcik7CiAKIGV4aXQ6CkBAIC0xMzcwLDggKzE0MzIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6bG9va3VwX2Vycm9yIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXBfZXJyb3IiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xvb2t1cF9lcnJvcl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0xMzkzLDQgKzE0NTYsNCBAQAogI2lmbmRlZiBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0NPREVDU19DT0RFX1BBR0VfRU5DT0RFX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05Yzk5NjcwNDgwMjdjMWM3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xMjAzMjBmZTJhYzMyMDg1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fY3J5cHRtb2R1bGUuYy5oCmluZGV4IGI4ZWMzMWUuLjY2NGNiYTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2NyeXB0bW9kdWxlLmMuaApAQCAtMjcsMTEgKzI3LDEyIEBACiAgICAgY29uc3QgY2hhciAqc2FsdDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3M6Y3J5cHQiLAotICAgICAgICAmd29yZCwgJnNhbHQpKQorICAgICAgICAmd29yZCwgJnNhbHQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY3J5cHRfY3J5cHRfaW1wbChtb2R1bGUsIHdvcmQsIHNhbHQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjJjMjk1YzliY2UwMThjNCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Njk3N2NmOTkxN2Q5YTY4NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fY3Vyc2VzbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCmluZGV4IDVlMTE3NDIuLjYyZmYxYzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oCkBAIC00MCwyMiArNDAsMjYgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YWRkY2giLCAmY2gpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPOmFkZGNoIiwgJmNoKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9sOmFkZGNoIiwgJmNoLCAmYXR0cikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTzphZGRjaCIsICZ5LCAmeCwgJmNoKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPOmFkZGNoIiwgJnksICZ4LCAmY2gpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpT2w6YWRkY2giLCAmeSwgJngsICZjaCwgJmF0dHIpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU9sOmFkZGNoIiwgJnksICZ4LCAmY2gsICZhdHRyKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwogICAgICAgICAgICAgZ3JvdXBfbGVmdF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjgsNCArNzIsNCBAQAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk4MmIxZTcwOTU3N2YzZWMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTEzZmZjNWY4ZDc5Y2JmYmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19kYXRldGltZW1vZHVsZS5jLmgKaW5kZXggNjg4YzkwMy4uY2Y5ODYwYiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZGF0ZXRpbWVtb2R1bGUuYy5oCkBAIC0yNywxMSArMjcsMTIgQEAKICAgICBQeU9iamVjdCAqdHogPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86bm93IiwgX2tleXdvcmRzLAotICAgICAgICAmdHopKQorICAgICAgICAmdHopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGF0ZXRpbWVfZGF0ZXRpbWVfbm93X2ltcGwodHlwZSwgdHopOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9N2Y0NWM2NzBkNmU0OTUzYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTgyZTZiZDA1N2E1ZGFiOSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fZGJtbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oCmluZGV4IDg0NzRlMDIuLmIzMWRhNzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oCkBAIC02MCw4ICs2MCw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOmdldCIsCi0gICAgICAgICZrZXksICZrZXlfbGVuZ3RoLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZrZXksICZrZXlfbGVuZ3RoLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZGJtX2RibV9nZXRfaW1wbChzZWxmLCBrZXksIGtleV9sZW5ndGgsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtOTMsOCArOTQsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8TzpzZXRkZWZhdWx0IiwKLSAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9kYm1fZGJtX3NldGRlZmF1bHRfaW1wbChzZWxmLCBrZXksIGtleV9sZW5ndGgsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtMTMxLDExICsxMzMsMTIgQEAKICAgICBpbnQgbW9kZSA9IDQzODsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzaTpvcGVuIiwKLSAgICAgICAgJmZpbGVuYW1lLCAmZmxhZ3MsICZtb2RlKSkKKyAgICAgICAgJmZpbGVuYW1lLCAmZmxhZ3MsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGRibW9wZW5faW1wbChtb2R1bGUsIGZpbGVuYW1lLCBmbGFncywgbW9kZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xZDkyZTgxYjI4YzU1OGQwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05N2Y4YjZmNTQyOTczYjcxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCmluZGV4IDg2YjRjNGMuLjI2NmI5MmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpzdWJlbGVtZW50OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPITphcHBlbmQiLCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPITphcHBlbmQiLCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9hcHBlbmRfaW1wbChzZWxmLCBzdWJlbGVtZW50KTsKIAogZXhpdDoKQEAgLTg3LDggKzg4LDkgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfX19zaXplb2ZfX19pbXBsKHNlbGYpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xNDksOCArMTUxLDkgQEAKICAgICBQeU9iamVjdCAqbmFtZXNwYWNlcyA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE86ZmluZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmRfaW1wbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTE4MCw4ICsxODMsOSBAQAogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98T086ZmluZHRleHQiLCBfa2V5d29yZHMsCi0gICAgICAgICZwYXRoLCAmZGVmYXVsdF92YWx1ZSwgJm5hbWVzcGFjZXMpKQorICAgICAgICAmcGF0aCwgJmRlZmF1bHRfdmFsdWUsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmR0ZXh0X2ltcGwoc2VsZiwgcGF0aCwgZGVmYXVsdF92YWx1ZSwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yMDksOCArMjEzLDkgQEAKICAgICBQeU9iamVjdCAqbmFtZXNwYWNlcyA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE86ZmluZGFsbCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2ZpbmRhbGxfaW1wbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTIzOCw4ICsyNDMsOSBAQAogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzppdGVyZmluZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkKKyAgICAgICAgJnBhdGgsICZuYW1lc3BhY2VzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2l0ZXJmaW5kX2ltcGwoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcyk7CiAKIGV4aXQ6CkBAIC0yNjcsOCArMjczLDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE86Z2V0IiwgX2tleXdvcmRzLAotICAgICAgICAma2V5LCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2dldF9pbXBsKHNlbGYsIGtleSwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMTEsOCArMzE4LDkgQEAKICAgICBQeU9iamVjdCAqdGFnID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOml0ZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZ0YWcpKQorICAgICAgICAmdGFnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2l0ZXJfaW1wbChzZWxmLCB0YWcpOwogCiBleGl0OgpAQCAtMzU2LDggKzM2NCw5IEBACiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PITppbnNlcnQiLAotICAgICAgICAmaW5kZXgsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICAgICAgJmluZGV4LCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9pbnNlcnRfaW1wbChzZWxmLCBpbmRleCwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00MTksOCArNDI4LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIm1ha2VlbGVtZW50IiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJnRhZywgJmF0dHJpYikpCisgICAgICAgICZ0YWcsICZhdHRyaWIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfbWFrZWVsZW1lbnRfaW1wbChzZWxmLCB0YWcsIGF0dHJpYik7CiAKIGV4aXQ6CkBAIC00NDQsOCArNDU0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3ViZWxlbWVudDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyE6cmVtb3ZlIiwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfcmVtb3ZlX2ltcGwoc2VsZiwgc3ViZWxlbWVudCk7CiAKIGV4aXQ6CkBAIC00NzMsOCArNDg0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldCIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZrZXksICZ2YWx1ZSkpCisgICAgICAgICZrZXksICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9zZXRfaW1wbChzZWxmLCBrZXksIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQ5Myw4ICs1MDUsOSBAQAogICAgIFB5T2JqZWN0ICplbGVtZW50X2ZhY3RvcnkgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86VHJlZUJ1aWxkZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZlbGVtZW50X2ZhY3RvcnkpKQorICAgICAgICAmZWxlbWVudF9mYWN0b3J5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9UcmVlQnVpbGRlcl9fX2luaXRfX19pbXBsKChUcmVlQnVpbGRlck9iamVjdCAqKXNlbGYsIGVsZW1lbnRfZmFjdG9yeSk7CiAKIGV4aXQ6CkBAIC01NTUsOCArNTY4LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXJ0IiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJnRhZywgJmF0dHJzKSkKKyAgICAgICAgJnRhZywgJmF0dHJzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9UcmVlQnVpbGRlcl9zdGFydF9pbXBsKHNlbGYsIHRhZywgYXR0cnMpOwogCiBleGl0OgpAQCAtNTc3LDggKzU5MSw5IEBACiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9PejpYTUxQYXJzZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZodG1sLCAmdGFyZ2V0LCAmZW5jb2RpbmcpKQorICAgICAgICAmaHRtbCwgJnRhcmdldCwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9YTUxQYXJzZXJfX19pbml0X19faW1wbCgoWE1MUGFyc2VyT2JqZWN0ICopc2VsZiwgaHRtbCwgdGFyZ2V0LCBlbmNvZGluZyk7CiAKIGV4aXQ6CkBAIC02NDAsOCArNjU1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRvY3R5cGUiLAogICAgICAgICAzLCAzLAotICAgICAgICAmbmFtZSwgJnB1YmlkLCAmc3lzdGVtKSkKKyAgICAgICAgJm5hbWUsICZwdWJpZCwgJnN5c3RlbSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX2RvY3R5cGVfaW1wbChzZWxmLCBuYW1lLCBwdWJpZCwgc3lzdGVtKTsKIAogZXhpdDoKQEAgLTY2OCwxMiArNjg0LDE0IEBACiAgICAgUHlPYmplY3QgKmV2ZW50c19xdWV1ZTsKICAgICBQeU9iamVjdCAqZXZlbnRzX3RvX3JlcG9ydCA9IFB5X05vbmU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfE86X3NldGV2ZW50cyIsCi0gICAgICAgICZQeUxpc3RfVHlwZSwgJmV2ZW50c19xdWV1ZSwgJmV2ZW50c190b19yZXBvcnQpKQorICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgIl9zZXRldmVudHMiLAorICAgICAgICAxLCAyLAorICAgICAgICAmZXZlbnRzX3F1ZXVlLCAmZXZlbnRzX3RvX3JlcG9ydCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfWE1MUGFyc2VyX19zZXRldmVudHNfaW1wbChzZWxmLCBldmVudHNfcXVldWUsIGV2ZW50c190b19yZXBvcnQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjViOGJmN2U3ZjIxNTFjYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDkxZWI1NzE4YzFhZTY0YiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fZ2RibW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fZ2RibW1vZHVsZS5jLmgKaW5kZXggMTEwYWQ5YS4uMjMxODJjOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19nZGJtbW9kdWxlLmMuaApAQCAtMjMsOCArMjMsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZ2V0IiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAma2V5LCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZ2RibV9nZGJtX2dldF9pbXBsKHNlbGYsIGtleSwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01Myw4ICs1NCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzZXRkZWZhdWx0IiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAma2V5LCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZ2RibV9nZGJtX3NldGRlZmF1bHRfaW1wbChzZWxmLCBrZXksIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtMTQ3LDggKzE0OSw5IEBACiAgICAgY29uc3QgY2hhciAqa2V5OwogICAgIFB5X3NzaXplX2NsZWFuX3Qga2V5X2xlbmd0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicyM6bmV4dGtleSIsICZrZXksICZrZXlfbGVuZ3RoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOm5leHRrZXkiLCAma2V5LCAma2V5X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZ2RibV9nZGJtX25leHRrZXlfaW1wbChzZWxmLCBrZXksIGtleV9sZW5ndGgpOwogCiBleGl0OgpAQCAtMjQzLDExICsyNDYsMTIgQEAKICAgICBpbnQgbW9kZSA9IDQzODsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic3xzaTpvcGVuIiwKLSAgICAgICAgJm5hbWUsICZmbGFncywgJm1vZGUpKQorICAgICAgICAmbmFtZSwgJmZsYWdzLCAmbW9kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkYm1vcGVuX2ltcGwobW9kdWxlLCBuYW1lLCBmbGFncywgbW9kZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kM2Q4ZDg3MWJjY2NiNjhhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00MTg4NDlmYjVkYmU2OWE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaAppbmRleCA1OWQ5ZDUxLi5iNzhkYmNkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oCkBAIC0yNSwxNCArMjUsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpjb21wcmVzcyIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX0xaTUFDb21wcmVzc29yX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTk0LDE0ICs5NiwxNiBAQAogICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8bjpkZWNvbXByZXNzIiwgX2tleXdvcmRzLAotICAgICAgICAmZGF0YSwgJm1heF9sZW5ndGgpKQorICAgICAgICAmZGF0YSwgJm1heF9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEsIG1heF9sZW5ndGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE0Myw4ICsxNDcsOSBAQAogICAgIFB5T2JqZWN0ICpmaWx0ZXJzID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpT086TFpNQURlY29tcHJlc3NvciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZvcm1hdCwgJm1lbWxpbWl0LCAmZmlsdGVycykpCisgICAgICAgICZmb3JtYXQsICZtZW1saW1pdCwgJmZpbHRlcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKChEZWNvbXByZXNzb3IgKilzZWxmLCBmb3JtYXQsIG1lbWxpbWl0LCBmaWx0ZXJzKTsKIAogZXhpdDoKQEAgLTE3MSw4ICsxNzYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaGVja19pZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTppc19jaGVja19zdXBwb3J0ZWQiLCAmY2hlY2tfaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTppc19jaGVja19zdXBwb3J0ZWQiLCAmY2hlY2tfaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfaXNfY2hlY2tfc3VwcG9ydGVkX2ltcGwobW9kdWxlLCBjaGVja19pZCk7CiAKIGV4aXQ6CkBAIC0xOTksOCArMjA1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBsem1hX2ZpbHRlciBmaWx0ZXIgPSB7TFpNQV9WTElfVU5LTk9XTiwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9lbmNvZGVfZmlsdGVyX3Byb3BlcnRpZXMiLCBsem1hX2ZpbHRlcl9jb252ZXJ0ZXIsICZmaWx0ZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2VuY29kZV9maWx0ZXJfcHJvcGVydGllcyIsIGx6bWFfZmlsdGVyX2NvbnZlcnRlciwgJmZpbHRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9fZW5jb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzX2ltcGwobW9kdWxlLCBmaWx0ZXIpOwogCiBleGl0OgpAQCAtMjM0LDE1ICsyNDEsMTcgQEAKICAgICBQeV9idWZmZXIgZW5jb2RlZF9wcm9wcyA9IHtOVUxMLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ5KjpfZGVjb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzIiwKLSAgICAgICAgbHptYV92bGlfY29udmVydGVyLCAmZmlsdGVyX2lkLCAmZW5jb2RlZF9wcm9wcykpCisgICAgICAgIGx6bWFfdmxpX2NvbnZlcnRlciwgJmZpbHRlcl9pZCwgJmVuY29kZWRfcHJvcHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfX2RlY29kZV9maWx0ZXJfcHJvcGVydGllc19pbXBsKG1vZHVsZSwgZmlsdGVyX2lkLCAmZW5jb2RlZF9wcm9wcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZW5jb2RlZF9wcm9wcyAqLwotICAgIGlmIChlbmNvZGVkX3Byb3BzLm9iaikKKyAgICBpZiAoZW5jb2RlZF9wcm9wcy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZlbmNvZGVkX3Byb3BzKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJkM2UwODQyYmUzZDNmZTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgwNGFlZDdkMTk2YmE1MmUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX29wY29kZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fb3Bjb2RlLmMuaAppbmRleCAxOTZhMmVlLi42ODY1MmIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fb3Bjb2RlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fb3Bjb2RlLmMuaApAQCAtMjMsMTQgKzIzLDE2IEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIml8TzpzdGFja19lZmZlY3QiLAotICAgICAgICAmb3Bjb2RlLCAmb3BhcmcpKQorICAgICAgICAmb3Bjb2RlLCAmb3BhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF9vcGNvZGVfc3RhY2tfZWZmZWN0X2ltcGwobW9kdWxlLCBvcGNvZGUsIG9wYXJnKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGVlN2NiNzM1NzA1ZThiMyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NWJkN2MxYzExM2U2NTI2YSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fcGlja2xlLmMuaCBiL01vZHVsZXMvY2xpbmljL19waWNrbGUuYy5oCmluZGV4IGFiNGQyMDUuLjExMjk5ZTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19waWNrbGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19waWNrbGUuYy5oCkBAIC01Myw4ICs1Myw5IEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9waWNrbGVfUGlja2xlcl9fX3NpemVvZl9fX2ltcGwoc2VsZik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTk4LDggKzk5LDkgQEAKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPcDpQaWNrbGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKQorICAgICAgICAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9QaWNrbGVyX19faW5pdF9fX2ltcGwoKFBpY2tsZXJPYmplY3QgKilzZWxmLCBmaWxlLCBwcm90b2NvbCwgZml4X2ltcG9ydHMpOwogCiBleGl0OgpAQCAtMjEyLDggKzIxNCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJmaW5kX2NsYXNzIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJm1vZHVsZV9uYW1lLCAmZ2xvYmFsX25hbWUpKQorICAgICAgICAmbW9kdWxlX25hbWUsICZnbG9iYWxfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX1VucGlja2xlcl9maW5kX2NsYXNzX2ltcGwoc2VsZiwgbW9kdWxlX25hbWUsIGdsb2JhbF9uYW1lKTsKIAogZXhpdDoKQEAgLTIzOSw4ICsyNDIsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfcGlja2xlX1VucGlja2xlcl9fX3NpemVvZl9fX2ltcGwoc2VsZik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTI4OCw4ICsyOTIsOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9ICJzdHJpY3QiOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3wkcHNzOlVucGlja2xlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19faW5pdF9fX2ltcGwoKFVucGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIGZpeF9pbXBvcnRzLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTM5NCw4ICszOTksOSBAQAogICAgIGludCBmaXhfaW1wb3J0cyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xPJHA6ZHVtcCIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9iaiwgJmZpbGUsICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkKKyAgICAgICAgJm9iaiwgJmZpbGUsICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfZHVtcF9pbXBsKG1vZHVsZSwgb2JqLCBmaWxlLCBwcm90b2NvbCwgZml4X2ltcG9ydHMpOwogCiBleGl0OgpAQCAtNDM3LDggKzQ0Myw5IEBACiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TyRwOmR1bXBzIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgICAgICZvYmosICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfZHVtcHNfaW1wbChtb2R1bGUsIG9iaiwgcHJvdG9jb2wsIGZpeF9pbXBvcnRzKTsKIAogZXhpdDoKQEAgLTQ5Miw4ICs0OTksOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9ICJzdHJpY3QiOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3wkcHNzOmxvYWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZmaWxlLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpCisgICAgICAgICZmaWxlLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2xvYWRfaW1wbChtb2R1bGUsIGZpbGUsIGZpeF9pbXBvcnRzLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTUzOCwxMSArNTQ2LDEyIEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gInN0cmljdCI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfCRwc3M6bG9hZHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZkYXRhLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZml4X2ltcG9ydHMsICZlbmNvZGluZywgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX2xvYWRzX2ltcGwobW9kdWxlLCBkYXRhLCBmaXhfaW1wb3J0cywgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNzE2OWQ0ZmJiZWVmODI3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZTk3MmYzMzlkMTk3NzYwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19zcmUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKaW5kZXggNmRlNDcwOC4uNDQ4ZDhhZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmgKQEAgLTIwLDggKzIwLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGNvZGVzaXplX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDgsMTEgKzQ5LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOmdldGxvd2VyIiwKLSAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkKKyAgICAgICAgJmNoYXJhY3RlciwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX2dldGxvd2VyX2ltcGwobW9kdWxlLCBjaGFyYWN0ZXIsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtODQsOCArODcsOSBAQAogICAgIFB5T2JqZWN0ICpwYXR0ZXJuID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzptYXRjaCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKQorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX21hdGNoX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcywgcGF0dGVybik7CiAKIGV4aXQ6CkBAIC0xMTgsOCArMTIyLDkgQEAKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86ZnVsbG1hdGNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZwYXR0ZXJuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fZnVsbG1hdGNoX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcywgcGF0dGVybik7CiAKIGV4aXQ6CkBAIC0xNTQsOCArMTU5LDkgQEAKICAgICBQeU9iamVjdCAqcGF0dGVybiA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T25uJE86c2VhcmNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZwYXR0ZXJuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fc2VhcmNoX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcywgcGF0dGVybik7CiAKIGV4aXQ6CkBAIC0xODgsOCArMTk0LDkgQEAKICAgICBQeU9iamVjdCAqc291cmNlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzpmaW5kYWxsIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmc291cmNlKSkKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnNvdXJjZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX2ZpbmRhbGxfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zLCBzb3VyY2UpOwogCiBleGl0OgpAQCAtMjIxLDggKzIyOCw5IEBACiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bm46ZmluZGl0ZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKQorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fZmluZGl0ZXJfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zKTsKIAogZXhpdDoKQEAgLTI1MSw4ICsyNTksOSBAQAogICAgIFB5X3NzaXplX3QgZW5kcG9zID0gUFlfU1NJWkVfVF9NQVg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfG5uOnNjYW5uZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKQorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fc2Nhbm5lcl9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MpOwogCiBleGl0OgpAQCAtMjgyLDggKzI5MSw5IEBACiAgICAgUHlPYmplY3QgKnNvdXJjZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T24kTzpzcGxpdCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJm1heHNwbGl0LCAmc291cmNlKSkKKyAgICAgICAgJnN0cmluZywgJm1heHNwbGl0LCAmc291cmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fc3BsaXRfaW1wbChzZWxmLCBzdHJpbmcsIG1heHNwbGl0LCBzb3VyY2UpOwogCiBleGl0OgpAQCAtMzEzLDggKzMyMyw5IEBACiAgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xuOnN1YiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJlcGwsICZzdHJpbmcsICZjb3VudCkpCisgICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zdWJfaW1wbChzZWxmLCByZXBsLCBzdHJpbmcsIGNvdW50KTsKIAogZXhpdDoKQEAgLTM0NCw4ICszNTUsOSBAQAogICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT098bjpzdWJuIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgJnJlcGwsICZzdHJpbmcsICZjb3VudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3N1Ym5faW1wbChzZWxmLCByZXBsLCBzdHJpbmcsIGNvdW50KTsKIAogZXhpdDoKQEAgLTM4OCw4ICs0MDAsOSBAQAogICAgIFB5T2JqZWN0ICptZW1vOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZtZW1vKSkKKyAgICAgICAgJm1lbW8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9fX2RlZXBjb3B5X19faW1wbChzZWxmLCBtZW1vKTsKIAogZXhpdDoKQEAgLTQyMyw4ICs0MzYsOSBAQAogICAgIFB5T2JqZWN0ICppbmRleGdyb3VwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT2lPIW5PTzpjb21waWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0dGVybiwgJmZsYWdzLCAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLCAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKQorICAgICAgICAmcGF0dGVybiwgJmZsYWdzLCAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLCAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9jb21waWxlX2ltcGwobW9kdWxlLCBwYXR0ZXJuLCBmbGFncywgY29kZSwgZ3JvdXBzLCBncm91cGluZGV4LCBpbmRleGdyb3VwKTsKIAogZXhpdDoKQEAgLTQ1MSw4ICs0NjUsOSBAQAogICAgIFB5T2JqZWN0ICp0ZW1wbGF0ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86ZXhwYW5kIiwgX2tleXdvcmRzLAotICAgICAgICAmdGVtcGxhdGUpKQorICAgICAgICAmdGVtcGxhdGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfZXhwYW5kX2ltcGwoc2VsZiwgdGVtcGxhdGUpOwogCiBleGl0OgpAQCAtNDgyLDggKzQ5Nyw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86Z3JvdXBzIiwgX2tleXdvcmRzLAotICAgICAgICAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2dyb3Vwc19pbXBsKHNlbGYsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTEzLDggKzUyOSw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86Z3JvdXBkaWN0IiwgX2tleXdvcmRzLAotICAgICAgICAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX2dyb3VwZGljdF9pbXBsKHNlbGYsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTQyLDExICs1NTksMTMgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0YXJ0IiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgJmdyb3VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9zdGFydF9pbXBsKHNlbGYsIGdyb3VwKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTc0LDExICs1OTMsMTMgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImVuZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZncm91cCkpCisgICAgICAgICZncm91cCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfZW5kX2ltcGwoc2VsZiwgZ3JvdXApOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC02MDUsOCArNjI2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNwYW4iLAogICAgICAgICAwLCAxLAotICAgICAgICAmZ3JvdXApKQorICAgICAgICAmZ3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfc3Bhbl9pbXBsKHNlbGYsIGdyb3VwKTsKIAogZXhpdDoKQEAgLTY0OSw4ICs2NzEsOSBAQAogICAgIFB5T2JqZWN0ICptZW1vOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpfX2RlZXBjb3B5X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZtZW1vKSkKKyAgICAgICAgJm1lbW8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfX19kZWVwY29weV9fX2ltcGwoc2VsZiwgbWVtbyk7CiAKIGV4aXQ6CkBAIC02OTAsNCArNzEzLDQgQEAKIHsKICAgICByZXR1cm4gX3NyZV9TUkVfU2Nhbm5lcl9zZWFyY2hfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMWQ3M2FiMmM1MDA4YmQ0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMGY3YmY4NjliMzI4M2JjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19zc2wuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3NzbC5jLmgKaW5kZXggNGRiYzVkMC4uMmJmNDZiNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3NzbC5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3NzbC5jLmgKQEAgLTM2LDggKzM2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X3Rlc3RfZGVjb2RlX2NlcnQiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl90ZXN0X2RlY29kZV9jZXJ0IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX190ZXN0X2RlY29kZV9jZXJ0X2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTcxLDggKzcyLDkgQEAKICAgICBpbnQgYmluYXJ5X21vZGUgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8cDpwZWVyX2NlcnRpZmljYXRlIiwKLSAgICAgICAgJmJpbmFyeV9tb2RlKSkKKyAgICAgICAgJmJpbmFyeV9tb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTFNvY2tldF9wZWVyX2NlcnRpZmljYXRlX2ltcGwoc2VsZiwgYmluYXJ5X21vZGUpOwogCiBleGl0OgpAQCAtMjA5LDE0ICsyMTEsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYiA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTFNvY2tldF93cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yNjAsMTIgKzI2NCwxNCBAQAogCiAgICAgc3dpdGNoIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkIiwgJmxlbikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6cmVhZCIsICZsZW4pKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXcqOnJlYWQiLCAmbGVuLCAmYnVmZmVyKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXcqOnJlYWQiLCAmbGVuLCAmYnVmZmVyKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0yNzYsOCArMjgyLDkgQEAKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMzMiwxMSArMzM5LDEzIEBACiAgICAgaW50IHByb3RvX3ZlcnNpb247CiAKICAgICBpZiAoKHR5cGUgPT0gJlB5U1NMQ29udGV4dF9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIl9TU0xDb250ZXh0Iiwga3dhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJfU1NMQ29udGV4dCIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImk6X1NTTENvbnRleHQiLAotICAgICAgICAmcHJvdG9fdmVyc2lvbikpCisgICAgICAgICZwcm90b192ZXJzaW9uKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfaW1wbCh0eXBlLCBwcm90b192ZXJzaW9uKTsKIAogZXhpdDoKQEAgLTM2MCw4ICszNjksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmNpcGhlcmxpc3Q7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6c2V0X2NpcGhlcnMiLCAmY2lwaGVybGlzdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnNldF9jaXBoZXJzIiwgJmNpcGhlcmxpc3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9zZXRfY2lwaGVyc19pbXBsKHNlbGYsIGNpcGhlcmxpc3QpOwogCiBleGl0OgpAQCAtMzg2LDE0ICszOTYsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgcHJvdG9zID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpfc2V0X25wbl9wcm90b2NvbHMiLCAmcHJvdG9zKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOl9zZXRfbnBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X25wbl9wcm90b2NvbHNfaW1wbChzZWxmLCAmcHJvdG9zKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBwcm90b3MgKi8KLSAgICBpZiAocHJvdG9zLm9iaikKKyAgICBpZiAocHJvdG9zLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnByb3Rvcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQxNiwxNCArNDI4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIHByb3RvcyA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9hbHBuX3Byb3RvY29scyIsICZwcm90b3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fc2V0X2FscG5fcHJvdG9jb2xzX2ltcGwoc2VsZiwgJnByb3Rvcyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgcHJvdG9zICovCi0gICAgaWYgKHByb3Rvcy5vYmopCisgICAgaWYgKHByb3Rvcy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZwcm90b3MpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NTAsOCArNDY0LDkgQEAKICAgICBQeU9iamVjdCAqcGFzc3dvcmQgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPTzpsb2FkX2NlcnRfY2hhaW4iLCBfa2V5d29yZHMsCi0gICAgICAgICZjZXJ0ZmlsZSwgJmtleWZpbGUsICZwYXNzd29yZCkpCisgICAgICAgICZjZXJ0ZmlsZSwgJmtleWZpbGUsICZwYXNzd29yZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2xvYWRfY2VydF9jaGFpbl9pbXBsKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlLCBwYXNzd29yZCk7CiAKIGV4aXQ6CkBAIC00ODIsOCArNDk3LDkgQEAKICAgICBQeU9iamVjdCAqY2FkYXRhID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPT086bG9hZF92ZXJpZnlfbG9jYXRpb25zIiwgX2tleXdvcmRzLAotICAgICAgICAmY2FmaWxlLCAmY2FwYXRoLCAmY2FkYXRhKSkKKyAgICAgICAgJmNhZmlsZSwgJmNhcGF0aCwgJmNhZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2xvYWRfdmVyaWZ5X2xvY2F0aW9uc19pbXBsKHNlbGYsIGNhZmlsZSwgY2FwYXRoLCBjYWRhdGEpOwogCiBleGl0OgpAQCAtNTIwLDggKzUzNiw5IEBACiAgICAgUHlPYmplY3QgKmhvc3RuYW1lX29iaiA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPIWl8Tzpfd3JhcF9zb2NrZXQiLCBfa2V5d29yZHMsCi0gICAgICAgIFB5U29ja2V0TW9kdWxlLlNvY2tfVHlwZSwgJnNvY2ssICZzZXJ2ZXJfc2lkZSwgJmhvc3RuYW1lX29iaikpCisgICAgICAgIFB5U29ja2V0TW9kdWxlLlNvY2tfVHlwZSwgJnNvY2ssICZzZXJ2ZXJfc2lkZSwgJmhvc3RuYW1lX29iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X193cmFwX3NvY2tldF9pbXBsKHNlbGYsIHNvY2ssIHNlcnZlcl9zaWRlLCBob3N0bmFtZV9vYmopOwogCiBleGl0OgpAQCAtNTUzLDggKzU3MCw5IEBACiAgICAgUHlPYmplY3QgKmhvc3RuYW1lX29iaiA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPIU8haXxPOl93cmFwX2JpbyIsIF9rZXl3b3JkcywKLSAgICAgICAgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZpbmNvbWluZywgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZvdXRnb2luZywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkKKyAgICAgICAgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZpbmNvbWluZywgJlB5U1NMTWVtb3J5QklPX1R5cGUsICZvdXRnb2luZywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfYmlvX2ltcGwoc2VsZiwgaW5jb21pbmcsIG91dGdvaW5nLCBzZXJ2ZXJfc2lkZSwgaG9zdG5hbWVfb2JqKTsKIAogZXhpdDoKQEAgLTY3MCw4ICs2ODgsOSBAQAogICAgIGludCBiaW5hcnlfZm9ybSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8cDpnZXRfY2FfY2VydHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZiaW5hcnlfZm9ybSkpCisgICAgICAgICZiaW5hcnlfZm9ybSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X2dldF9jYV9jZXJ0c19pbXBsKHNlbGYsIGJpbmFyeV9mb3JtKTsKIAogZXhpdDoKQEAgLTY4NywxMSArNzA2LDEzIEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoKHR5cGUgPT0gJlB5U1NMTWVtb3J5QklPX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJNZW1vcnlCSU8iLCBhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIk1lbW9yeUJJTyIsIGFyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKCh0eXBlID09ICZQeVNTTE1lbW9yeUJJT19UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIk1lbW9yeUJJTyIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiTWVtb3J5QklPIiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfTWVtb3J5QklPX2ltcGwodHlwZSk7CiAKIGV4aXQ6CkBAIC03MjIsOCArNzQzLDkgQEAKICAgICBpbnQgbGVuID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOnJlYWQiLAotICAgICAgICAmbGVuKSkKKyAgICAgICAgJmxlbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT19yZWFkX2ltcGwoc2VsZiwgbGVuKTsKIAogZXhpdDoKQEAgLTc1MCwxNCArNzcyLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX01lbW9yeUJJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04MDUsMTQgKzgyOSwxNiBAQAogICAgIGRvdWJsZSBlbnRyb3B5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKmQ6UkFORF9hZGQiLAotICAgICAgICAmdmlldywgJmVudHJvcHkpKQorICAgICAgICAmdmlldywgJmVudHJvcHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX2FkZF9pbXBsKG1vZHVsZSwgJnZpZXcsIGVudHJvcHkpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHZpZXcgKi8KLSAgICBpZiAodmlldy5vYmopCisgICAgaWYgKHZpZXcub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgzNSw4ICs4NjEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBuOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfYnl0ZXMiLCAmbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfYnl0ZXNfaW1wbChtb2R1bGUsIG4pOwogCiBleGl0OgpAQCAtODY0LDggKzg5MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG47CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9wc2V1ZG9fYnl0ZXMiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOlJBTkRfcHNldWRvX2J5dGVzIiwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9SQU5EX3BzZXVkb19ieXRlc19pbXBsKG1vZHVsZSwgbik7CiAKIGV4aXQ6CkBAIC05MTYsOCArOTQ0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcGF0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UkFORF9lZ2QiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlJBTkRfZWdkIiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfZWdkX2ltcGwobW9kdWxlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTk3MCw4ICs5OTksOSBAQAogICAgIGludCBuYW1lID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInN8cDp0eHQyb2JqIiwgX2tleXdvcmRzLAotICAgICAgICAmdHh0LCAmbmFtZSkpCisgICAgICAgICZ0eHQsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfdHh0Mm9ial9pbXBsKG1vZHVsZSwgdHh0LCBuYW1lKTsKIAogZXhpdDoKQEAgLTk5Niw4ICsxMDI2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOm5pZDJvYmoiLCAmbmlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmlkMm9iaiIsICZuaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9uaWQyb2JqX2ltcGwobW9kdWxlLCBuaWQpOwogCiBleGl0OgpAQCAtMTAzMiw4ICsxMDYzLDkgQEAKICAgICBjb25zdCBjaGFyICpzdG9yZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiczplbnVtX2NlcnRpZmljYXRlcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0b3JlX25hbWUpKQorICAgICAgICAmc3RvcmVfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX2VudW1fY2VydGlmaWNhdGVzX2ltcGwobW9kdWxlLCBzdG9yZV9uYW1lKTsKIAogZXhpdDoKQEAgLTEwNjksOCArMTEwMSw5IEBACiAgICAgY29uc3QgY2hhciAqc3RvcmVfbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInM6ZW51bV9jcmxzIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RvcmVfbmFtZSkpCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jcmxzX2ltcGwobW9kdWxlLCBzdG9yZV9uYW1lKTsKIAogZXhpdDoKQEAgLTExMDIsNCArMTEzNSw0IEBACiAjaWZuZGVmIF9TU0xfRU5VTV9DUkxTX01FVEhPRERFRgogICAgICNkZWZpbmUgX1NTTF9FTlVNX0NSTFNfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1NTTF9FTlVNX0NSTFNfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWExNDk5OWNiNTY1YTY5YTIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM2ZmUyMDMwOTlhNWFhODkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3RraW50ZXIuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3RraW50ZXIuYy5oCmluZGV4IDc5MTdkZWMuLjczNTI3ZmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL190a2ludGVyLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmgKQEAgLTE5LDggKzE5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzY3JpcHQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXZhbCIsICZzY3JpcHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpldmFsIiwgJnNjcmlwdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9ldmFsX2ltcGwoc2VsZiwgc2NyaXB0KTsKIAogZXhpdDoKQEAgLTQ0LDggKzQ1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpmaWxlTmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpldmFsZmlsZSIsICZmaWxlTmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V2YWxmaWxlX2ltcGwoc2VsZiwgZmlsZU5hbWUpOwogCiBleGl0OgpAQCAtNjksOCArNzEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNjcmlwdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpyZWNvcmQiLCAmc2NyaXB0KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6cmVjb3JkIiwgJnNjcmlwdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9yZWNvcmRfaW1wbChzZWxmLCBzY3JpcHQpOwogCiBleGl0OgpAQCAtOTQsOCArOTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKm1zZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczphZGRlcnJpbmZvIiwgJm1zZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmFkZGVycmluZm8iLCAmbXNnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2FkZGVycmluZm9faW1wbChzZWxmLCBtc2cpOwogCiBleGl0OgpAQCAtMTQzLDggKzE0Nyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqczsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByc3RyaW5nIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByc3RyaW5nIiwgJnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZXhwcnN0cmluZ19pbXBsKHNlbGYsIHMpOwogCiBleGl0OgpAQCAtMTY4LDggKzE3Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqczsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHBybG9uZyIsICZzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXhwcmxvbmciLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHBybG9uZ19pbXBsKHNlbGYsIHMpOwogCiBleGl0OgpAQCAtMTkzLDggKzE5OSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqczsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByZG91YmxlIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByZG91YmxlIiwgJnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZXhwcmRvdWJsZV9pbXBsKHNlbGYsIHMpOwogCiBleGl0OgpAQCAtMjE4LDggKzIyNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqczsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByYm9vbGVhbiIsICZzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXhwcmJvb2xlYW4iLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByYm9vbGVhbl9pbXBsKHNlbGYsIHMpOwogCiBleGl0OgpAQCAtMjYyLDggKzI3MCw5IEBACiAgICAgUHlPYmplY3QgKmZ1bmM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPOmNyZWF0ZWNvbW1hbmQiLAotICAgICAgICAmbmFtZSwgJmZ1bmMpKQorICAgICAgICAmbmFtZSwgJmZ1bmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfY3JlYXRlY29tbWFuZF9pbXBsKHNlbGYsIG5hbWUsIGZ1bmMpOwogCiBleGl0OgpAQCAtMjg3LDggKzI5Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpkZWxldGVjb21tYW5kIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpkZWxldGVjb21tYW5kIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZGVsZXRlY29tbWFuZF9pbXBsKHNlbGYsIG5hbWUpOwogCiBleGl0OgpAQCAtMzE4LDggKzMyOCw5IEBACiAgICAgUHlPYmplY3QgKmZ1bmM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pTzpjcmVhdGVmaWxlaGFuZGxlciIsCi0gICAgICAgICZmaWxlLCAmbWFzaywgJmZ1bmMpKQorICAgICAgICAmZmlsZSwgJm1hc2ssICZmdW5jKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2NyZWF0ZWZpbGVoYW5kbGVyX2ltcGwoc2VsZiwgZmlsZSwgbWFzaywgZnVuYyk7CiAKIGV4aXQ6CkBAIC0zNzcsOCArMzg4LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86Y3JlYXRldGltZXJoYW5kbGVyIiwKLSAgICAgICAgJm1pbGxpc2Vjb25kcywgJmZ1bmMpKQorICAgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9jcmVhdGV0aW1lcmhhbmRsZXJfaW1wbChzZWxmLCBtaWxsaXNlY29uZHMsIGZ1bmMpOwogCiBleGl0OgpAQCAtNDAzLDggKzQxNSw5IEBACiAgICAgaW50IHRocmVzaG9sZCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOm1haW5sb29wIiwKLSAgICAgICAgJnRocmVzaG9sZCkpCisgICAgICAgICZ0aHJlc2hvbGQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfbWFpbmxvb3BfaW1wbChzZWxmLCB0aHJlc2hvbGQpOwogCiBleGl0OgpAQCAtNDI5LDggKzQ0Miw5IEBACiAgICAgaW50IGZsYWdzID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6ZG9vbmVldmVudCIsCi0gICAgICAgICZmbGFncykpCisgICAgICAgICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9kb29uZWV2ZW50X2ltcGwoc2VsZiwgZmxhZ3MpOwogCiBleGl0OgpAQCAtNTUxLDggKzU2NSw5IEBACiAgICAgY29uc3QgY2hhciAqdXNlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHpzc2lpaWl6OmNyZWF0ZSIsCi0gICAgICAgICZzY3JlZW5OYW1lLCAmYmFzZU5hbWUsICZjbGFzc05hbWUsICZpbnRlcmFjdGl2ZSwgJndhbnRvYmplY3RzLCAmd2FudFRrLCAmc3luYywgJnVzZSkpCisgICAgICAgICZzY3JlZW5OYW1lLCAmYmFzZU5hbWUsICZjbGFzc05hbWUsICZpbnRlcmFjdGl2ZSwgJndhbnRvYmplY3RzLCAmd2FudFRrLCAmc3luYywgJnVzZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl9jcmVhdGVfaW1wbChtb2R1bGUsIHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsIGludGVyYWN0aXZlLCB3YW50b2JqZWN0cywgd2FudFRrLCBzeW5jLCB1c2UpOwogCiBleGl0OgpAQCAtNTc5LDggKzU5NCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG5ld192YWw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6c2V0YnVzeXdhaXRpbnRlcnZhbCIsICZuZXdfdmFsKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6c2V0YnVzeXdhaXRpbnRlcnZhbCIsICZuZXdfdmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3NldGJ1c3l3YWl0aW50ZXJ2YWxfaW1wbChtb2R1bGUsIG5ld192YWwpOwogCiBleGl0OgpAQCAtNjA2LDggKzYyMiw5IEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfZ2V0YnVzeXdhaXRpbnRlcnZhbF9pbXBsKG1vZHVsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTYyMSw0ICs2MzgsNCBAQAogI2lmbmRlZiBfVEtJTlRFUl9US0FQUF9ERUxFVEVGSUxFSEFORExFUl9NRVRIT0RERUYKICAgICAjZGVmaW5lIF9US0lOVEVSX1RLQVBQX0RFTEVURUZJTEVIQU5ETEVSX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9US0lOVEVSX1RLQVBQX0RFTEVURUZJTEVIQU5ETEVSX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02ZGQ2NjdiOTFjZjhhZGRkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xM2JlM2Y4MzEzYmJhM2M3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL193ZWFrcmVmLmMuaCBiL01vZHVsZXMvY2xpbmljL193ZWFrcmVmLmMuaAppbmRleCA4N2M3MDFjLi5iOTMzNDNiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fd2Vha3JlZi5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oCkBAIC0yMSwxMSArMjEsMTIgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3dlYWtyZWZfZ2V0d2Vha3JlZmNvdW50X2ltcGwobW9kdWxlLCBvYmplY3QpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZGE5YWFkZTYzZWVkNzdmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMGUzMTdjZGE1MzU5ZWEzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL193aW5hcGkuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmgKaW5kZXggMzQ1MThlOC4uMmI4ZGVlYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmgKQEAgLTE5LDggKzE5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgd2FpdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicDpHZXRPdmVybGFwcGVkUmVzdWx0IiwgJndhaXQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicDpHZXRPdmVybGFwcGVkUmVzdWx0IiwgJndhaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9PdmVybGFwcGVkX0dldE92ZXJsYXBwZWRSZXN1bHRfaW1wbChzZWxmLCB3YWl0KTsKIAogZXhpdDoKQEAgLTc5LDggKzgwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIQU5ETEUgaGFuZGxlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6Q2xvc2VIYW5kbGUiLCAmaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpDbG9zZUhhbmRsZSIsICZoYW5kbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DbG9zZUhhbmRsZV9pbXBsKG1vZHVsZSwgaGFuZGxlKTsKIAogZXhpdDoKQEAgLTEwOCw4ICsxMTAsOSBAQAogICAgIGludCB1c2Vfb3ZlcmxhcHBlZCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIEZfSEFORExFICJ8aTpDb25uZWN0TmFtZWRQaXBlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmdXNlX292ZXJsYXBwZWQpKQorICAgICAgICAmaGFuZGxlLCAmdXNlX292ZXJsYXBwZWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9Db25uZWN0TmFtZWRQaXBlX2ltcGwobW9kdWxlLCBoYW5kbGUsIHVzZV9vdmVybGFwcGVkKTsKIAogZXhpdDoKQEAgLTE0NywxMyArMTUwLDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNrayIgRl9QT0lOVEVSICJrayIgRl9IQU5ETEUgIjpDcmVhdGVGaWxlIiwKLSAgICAgICAgJmZpbGVfbmFtZSwgJmRlc2lyZWRfYWNjZXNzLCAmc2hhcmVfbW9kZSwgJnNlY3VyaXR5X2F0dHJpYnV0ZXMsICZjcmVhdGlvbl9kaXNwb3NpdGlvbiwgJmZsYWdzX2FuZF9hdHRyaWJ1dGVzLCAmdGVtcGxhdGVfZmlsZSkpCisgICAgICAgICZmaWxlX25hbWUsICZkZXNpcmVkX2FjY2VzcywgJnNoYXJlX21vZGUsICZzZWN1cml0eV9hdHRyaWJ1dGVzLCAmY3JlYXRpb25fZGlzcG9zaXRpb24sICZmbGFnc19hbmRfYXR0cmlidXRlcywgJnRlbXBsYXRlX2ZpbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlRmlsZV9pbXBsKG1vZHVsZSwgZmlsZV9uYW1lLCBkZXNpcmVkX2FjY2Vzcywgc2hhcmVfbW9kZSwgc2VjdXJpdHlfYXR0cmlidXRlcywgY3JlYXRpb25fZGlzcG9zaXRpb24sIGZsYWdzX2FuZF9hdHRyaWJ1dGVzLCB0ZW1wbGF0ZV9maWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xODAsOCArMTg2LDkgQEAKICAgICBMUFdTVFIgZHN0X3BhdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInV1OkNyZWF0ZUp1bmN0aW9uIiwKLSAgICAgICAgJnNyY19wYXRoLCAmZHN0X3BhdGgpKQorICAgICAgICAmc3JjX3BhdGgsICZkc3RfcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZUp1bmN0aW9uX2ltcGwobW9kdWxlLCBzcmNfcGF0aCwgZHN0X3BhdGgpOwogCiBleGl0OgpAQCAtMjIwLDEzICsyMjcsMTYgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2tra2trayIgRl9QT0lOVEVSICI6Q3JlYXRlTmFtZWRQaXBlIiwKLSAgICAgICAgJm5hbWUsICZvcGVuX21vZGUsICZwaXBlX21vZGUsICZtYXhfaW5zdGFuY2VzLCAmb3V0X2J1ZmZlcl9zaXplLCAmaW5fYnVmZmVyX3NpemUsICZkZWZhdWx0X3RpbWVvdXQsICZzZWN1cml0eV9hdHRyaWJ1dGVzKSkKKyAgICAgICAgJm5hbWUsICZvcGVuX21vZGUsICZwaXBlX21vZGUsICZtYXhfaW5zdGFuY2VzLCAmb3V0X2J1ZmZlcl9zaXplLCAmaW5fYnVmZmVyX3NpemUsICZkZWZhdWx0X3RpbWVvdXQsICZzZWN1cml0eV9hdHRyaWJ1dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZU5hbWVkUGlwZV9pbXBsKG1vZHVsZSwgbmFtZSwgb3Blbl9tb2RlLCBwaXBlX21vZGUsIG1heF9pbnN0YW5jZXMsIG91dF9idWZmZXJfc2l6ZSwgaW5fYnVmZmVyX3NpemUsIGRlZmF1bHRfdGltZW91dCwgc2VjdXJpdHlfYXR0cmlidXRlcyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjU5LDggKzI2OSw5IEBACiAgICAgRFdPUkQgc2l6ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2s6Q3JlYXRlUGlwZSIsCi0gICAgICAgICZwaXBlX2F0dHJzLCAmc2l6ZSkpCisgICAgICAgICZwaXBlX2F0dHJzLCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZVBpcGVfaW1wbChtb2R1bGUsIHBpcGVfYXR0cnMsIHNpemUpOwogCiBleGl0OgpAQCAtMzA5LDggKzMyMCw5IEBACiAgICAgUHlPYmplY3QgKnN0YXJ0dXBfaW5mbzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiWlpPT2lrT1pPOkNyZWF0ZVByb2Nlc3MiLAotICAgICAgICAmYXBwbGljYXRpb25fbmFtZSwgJmNvbW1hbmRfbGluZSwgJnByb2NfYXR0cnMsICZ0aHJlYWRfYXR0cnMsICZpbmhlcml0X2hhbmRsZXMsICZjcmVhdGlvbl9mbGFncywgJmVudl9tYXBwaW5nLCAmY3VycmVudF9kaXJlY3RvcnksICZzdGFydHVwX2luZm8pKQorICAgICAgICAmYXBwbGljYXRpb25fbmFtZSwgJmNvbW1hbmRfbGluZSwgJnByb2NfYXR0cnMsICZ0aHJlYWRfYXR0cnMsICZpbmhlcml0X2hhbmRsZXMsICZjcmVhdGlvbl9mbGFncywgJmVudl9tYXBwaW5nLCAmY3VycmVudF9kaXJlY3RvcnksICZzdGFydHVwX2luZm8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVQcm9jZXNzX2ltcGwobW9kdWxlLCBhcHBsaWNhdGlvbl9uYW1lLCBjb21tYW5kX2xpbmUsIHByb2NfYXR0cnMsIHRocmVhZF9hdHRycywgaW5oZXJpdF9oYW5kbGVzLCBjcmVhdGlvbl9mbGFncywgZW52X21hcHBpbmcsIGN1cnJlbnRfZGlyZWN0b3J5LCBzdGFydHVwX2luZm8pOwogCiBleGl0OgpAQCAtMzUzLDEzICszNjUsMTYgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAiIiBGX0hBTkRMRSAiIiBGX0hBTkRMRSAia2l8azpEdXBsaWNhdGVIYW5kbGUiLAotICAgICAgICAmc291cmNlX3Byb2Nlc3NfaGFuZGxlLCAmc291cmNlX2hhbmRsZSwgJnRhcmdldF9wcm9jZXNzX2hhbmRsZSwgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZvcHRpb25zKSkKKyAgICAgICAgJnNvdXJjZV9wcm9jZXNzX2hhbmRsZSwgJnNvdXJjZV9oYW5kbGUsICZ0YXJnZXRfcHJvY2Vzc19oYW5kbGUsICZkZXNpcmVkX2FjY2VzcywgJmluaGVyaXRfaGFuZGxlLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9EdXBsaWNhdGVIYW5kbGVfaW1wbChtb2R1bGUsIHNvdXJjZV9wcm9jZXNzX2hhbmRsZSwgc291cmNlX2hhbmRsZSwgdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLCBkZXNpcmVkX2FjY2VzcywgaW5oZXJpdF9oYW5kbGUsIG9wdGlvbnMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM4Myw4ICszOTgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFVJTlQgRXhpdENvZGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkk6RXhpdFByb2Nlc3MiLCAmRXhpdENvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiSTpFeGl0UHJvY2VzcyIsICZFeGl0Q29kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0V4aXRQcm9jZXNzX2ltcGwobW9kdWxlLCBFeGl0Q29kZSk7CiAKIGV4aXQ6CkBAIC00MTAsMTAgKzQyNiwxMiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0Q3VycmVudFByb2Nlc3NfaW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQzOSwxMSArNDU3LDEzIEBACiAgICAgSEFORExFIHByb2Nlc3M7CiAgICAgRFdPUkQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkdldEV4aXRDb2RlUHJvY2VzcyIsICZwcm9jZXNzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpHZXRFeGl0Q29kZVByb2Nlc3MiLCAmcHJvY2VzcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRFeGl0Q29kZVByb2Nlc3NfaW1wbChtb2R1bGUsIHByb2Nlc3MpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IERXT1JEX01BWCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5X0J1aWxkVmFsdWUoImsiLCBfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2OCw4ICs0ODgsOSBAQAogICAgIERXT1JEIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRMYXN0RXJyb3JfaW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBEV09SRF9NQVgpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IERXT1JEX01BWCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5X0J1aWxkVmFsdWUoImsiLCBfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUwMSw4ICs1MjIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhNT0RVTEUgbW9kdWxlX2hhbmRsZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkdldE1vZHVsZUZpbGVOYW1lIiwgJm1vZHVsZV9oYW5kbGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkdldE1vZHVsZUZpbGVOYW1lIiwgJm1vZHVsZV9oYW5kbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRNb2R1bGVGaWxlTmFtZV9pbXBsKG1vZHVsZSwgbW9kdWxlX2hhbmRsZSk7CiAKIGV4aXQ6CkBAIC01MzMsMTMgKzU1NSwxNiBAQAogICAgIERXT1JEIHN0ZF9oYW5kbGU7CiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIms6R2V0U3RkSGFuZGxlIiwgJnN0ZF9oYW5kbGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiazpHZXRTdGRIYW5kbGUiLCAmc3RkX2hhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRTdGRIYW5kbGVfaW1wbChtb2R1bGUsIHN0ZF9oYW5kbGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU2NSw4ICs1OTAsOSBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldFZlcnNpb25faW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01OTUsMTMgKzYyMSwxNiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJraWs6T3BlblByb2Nlc3MiLAotICAgICAgICAmZGVzaXJlZF9hY2Nlc3MsICZpbmhlcml0X2hhbmRsZSwgJnByb2Nlc3NfaWQpKQorICAgICAgICAmZGVzaXJlZF9hY2Nlc3MsICZpbmhlcml0X2hhbmRsZSwgJnByb2Nlc3NfaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfT3BlblByb2Nlc3NfaW1wbChtb2R1bGUsIGRlc2lyZWRfYWNjZXNzLCBpbmhlcml0X2hhbmRsZSwgcHJvY2Vzc19pZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjI3LDggKzY1Niw5IEBACiAgICAgaW50IHNpemUgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICJ8aTpQZWVrTmFtZWRQaXBlIiwKLSAgICAgICAgJmhhbmRsZSwgJnNpemUpKQorICAgICAgICAmaGFuZGxlLCAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1BlZWtOYW1lZFBpcGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC02NTcsOCArNjg3LDkgQEAKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiaXxpOlJlYWRGaWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmc2l6ZSwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICAgICAgJmhhbmRsZSwgJnNpemUsICZ1c2Vfb3ZlcmxhcHBlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1JlYWRGaWxlX2ltcGwobW9kdWxlLCBoYW5kbGUsIHNpemUsIHVzZV9vdmVybGFwcGVkKTsKIAogZXhpdDoKQEAgLTY5MCw4ICs3MjEsOSBAQAogICAgIFB5T2JqZWN0ICpjb2xsZWN0X2RhdGFfdGltZW91dDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAiT09POlNldE5hbWVkUGlwZUhhbmRsZVN0YXRlIiwKLSAgICAgICAgJm5hbWVkX3BpcGUsICZtb2RlLCAmbWF4X2NvbGxlY3Rpb25fY291bnQsICZjb2xsZWN0X2RhdGFfdGltZW91dCkpCisgICAgICAgICZuYW1lZF9waXBlLCAmbW9kZSwgJm1heF9jb2xsZWN0aW9uX2NvdW50LCAmY29sbGVjdF9kYXRhX3RpbWVvdXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9TZXROYW1lZFBpcGVIYW5kbGVTdGF0ZV9pbXBsKG1vZHVsZSwgbmFtZWRfcGlwZSwgbW9kZSwgbWF4X2NvbGxlY3Rpb25fY291bnQsIGNvbGxlY3RfZGF0YV90aW1lb3V0KTsKIAogZXhpdDoKQEAgLTcxOSw4ICs3NTEsOSBAQAogICAgIFVJTlQgZXhpdF9jb2RlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICJJOlRlcm1pbmF0ZVByb2Nlc3MiLAotICAgICAgICAmaGFuZGxlLCAmZXhpdF9jb2RlKSkKKyAgICAgICAgJmhhbmRsZSwgJmV4aXRfY29kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1Rlcm1pbmF0ZVByb2Nlc3NfaW1wbChtb2R1bGUsIGhhbmRsZSwgZXhpdF9jb2RlKTsKIAogZXhpdDoKQEAgLTc0Niw4ICs3NzksOSBAQAogICAgIERXT1JEIHRpbWVvdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNrOldhaXROYW1lZFBpcGUiLAotICAgICAgICAmbmFtZSwgJnRpbWVvdXQpKQorICAgICAgICAmbmFtZSwgJnRpbWVvdXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9XYWl0TmFtZWRQaXBlX2ltcGwobW9kdWxlLCBuYW1lLCB0aW1lb3V0KTsKIAogZXhpdDoKQEAgLTc3Nyw4ICs4MTEsOSBAQAogICAgIERXT1JEIG1pbGxpc2Vjb25kcyA9IElORklOSVRFOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPaXxrOldhaXRGb3JNdWx0aXBsZU9iamVjdHMiLAotICAgICAgICAmaGFuZGxlX3NlcSwgJndhaXRfZmxhZywgJm1pbGxpc2Vjb25kcykpCisgICAgICAgICZoYW5kbGVfc2VxLCAmd2FpdF9mbGFnLCAmbWlsbGlzZWNvbmRzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfV2FpdEZvck11bHRpcGxlT2JqZWN0c19pbXBsKG1vZHVsZSwgaGFuZGxlX3NlcSwgd2FpdF9mbGFnLCBtaWxsaXNlY29uZHMpOwogCiBleGl0OgpAQCAtODExLDExICs4NDYsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIms6V2FpdEZvclNpbmdsZU9iamVjdCIsCi0gICAgICAgICZoYW5kbGUsICZtaWxsaXNlY29uZHMpKQorICAgICAgICAmaGFuZGxlLCAmbWlsbGlzZWNvbmRzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dhaXRGb3JTaW5nbGVPYmplY3RfaW1wbChtb2R1bGUsIGhhbmRsZSwgbWlsbGlzZWNvbmRzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtODQ0LDExICs4ODEsMTIgQEAKICAgICBpbnQgdXNlX292ZXJsYXBwZWQgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBGX0hBTkRMRSAiT3xpOldyaXRlRmlsZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmhhbmRsZSwgJmJ1ZmZlciwgJnVzZV9vdmVybGFwcGVkKSkKKyAgICAgICAgJmhhbmRsZSwgJmJ1ZmZlciwgJnVzZV9vdmVybGFwcGVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfV3JpdGVGaWxlX2ltcGwobW9kdWxlLCBoYW5kbGUsIGJ1ZmZlciwgdXNlX292ZXJsYXBwZWQpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTg3NzFjNjU4NDA1NmQxOSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDA5OWVlNGZiY2RkNWJjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9hcnJheW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9hcnJheW1vZHVsZS5jLmgKaW5kZXggZmRmMjQ3ZS4uY2VkMTdhYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2FycmF5bW9kdWxlLmMuaApAQCAtNzcsOCArNzcsOSBAQAogICAgIFB5X3NzaXplX3QgaSA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8bjpwb3AiLAotICAgICAgICAmaSkpCisgICAgICAgICZpKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X3BvcF9pbXBsKHNlbGYsIGkpOwogCiBleGl0OgpAQCAtMTE0LDggKzExNSw5IEBACiAgICAgUHlPYmplY3QgKnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5POmluc2VydCIsCi0gICAgICAgICZpLCAmdikpCisgICAgICAgICZpLCAmdikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9pbnNlcnRfaW1wbChzZWxmLCBpLCB2KTsKIAogZXhpdDoKQEAgLTIxMSw4ICsyMTMsOSBAQAogICAgIFB5X3NzaXplX3QgbjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT246ZnJvbWZpbGUiLAotICAgICAgICAmZiwgJm4pKQorICAgICAgICAmZiwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfZnJvbWZpbGVfaW1wbChzZWxmLCBmLCBuKTsKIAogZXhpdDoKQEAgLTI3NSwxNCArMjc4LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicyo6ZnJvbXN0cmluZyIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicyo6ZnJvbXN0cmluZyIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfZnJvbXN0cmluZ19pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzA1LDE0ICszMTAsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpmcm9tYnl0ZXMiLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmZyb21ieXRlcyIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfZnJvbWJ5dGVzX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNzksOCArMzg2LDkgQEAKICAgICBQeV9VTklDT0RFICp1c3RyOwogICAgIFB5X3NzaXplX2NsZWFuX3QgdXN0cl9sZW5ndGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInUjOmZyb211bmljb2RlIiwgJnVzdHIsICZ1c3RyX2xlbmd0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ1Izpmcm9tdW5pY29kZSIsICZ1c3RyLCAmdXN0cl9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfZnJvbXVuaWNvZGVfaW1wbChzZWxmLCB1c3RyLCB1c3RyX2xlbmd0aCk7CiAKIGV4aXQ6CkBAIC00NTMsOCArNDYxLDkgQEAKICAgICBQeU9iamVjdCAqaXRlbXM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9DaU86X2FycmF5X3JlY29uc3RydWN0b3IiLAotICAgICAgICAmYXJyYXl0eXBlLCAmdHlwZWNvZGUsICZtZm9ybWF0X2NvZGUsICZpdGVtcykpCisgICAgICAgICZhcnJheXR5cGUsICZ0eXBlY29kZSwgJm1mb3JtYXRfY29kZSwgJml0ZW1zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X19hcnJheV9yZWNvbnN0cnVjdG9yX2ltcGwobW9kdWxlLCBhcnJheXR5cGUsIHR5cGVjb2RlLCBtZm9ybWF0X2NvZGUsIGl0ZW1zKTsKIAogZXhpdDoKQEAgLTQ5Niw0ICs1MDUsNCBAQAogCiAjZGVmaW5lIEFSUkFZX0FSUkFZSVRFUkFUT1JfX19TRVRTVEFURV9fX01FVEhPRERFRiAgICBcCiAgICAgeyJfX3NldHN0YXRlX18iLCAoUHlDRnVuY3Rpb24pYXJyYXlfYXJyYXlpdGVyYXRvcl9fX3NldHN0YXRlX18sIE1FVEhfTywgYXJyYXlfYXJyYXlpdGVyYXRvcl9fX3NldHN0YXRlX19fX2RvY19ffSwKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMmU4MmM2NWVhODQxY2ZjIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wYjk5Yzg5Mjc1ZWRhMjY1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2F1ZGlvb3AuYy5oIGIvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmgKaW5kZXggM2VlMjk2Ni4uNGJhYmEyNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmgKQEAgLTI0LDE0ICsyNCwxNiBAQAogICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaW46Z2V0c2FtcGxlIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZpbmRleCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmaW5kZXgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9nZXRzYW1wbGVfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGluZGV4KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTYsMTQgKzU4LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTg4LDE0ICs5MiwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOm1pbm1heCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9taW5tYXhfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMjAsMTQgKzEyNiwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmF2ZyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hdmdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNTIsMTQgKzE2MCwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnJtcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9ybXNfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xODUsMTcgKzE5NSwyMCBAQAogICAgIFB5X2J1ZmZlciByZWZlcmVuY2UgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6ZmluZGZpdCIsCi0gICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpCisgICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2ZpbmRmaXRfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgJnJlZmVyZW5jZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmIChyZWZlcmVuY2Uub2JqKQorICAgIGlmIChyZWZlcmVuY2Uub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmVmZXJlbmNlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjIxLDE3ICsyMzQsMjAgQEAKICAgICBQeV9idWZmZXIgcmVmZXJlbmNlID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqOmZpbmRmYWN0b3IiLAotICAgICAgICAmZnJhZ21lbnQsICZyZWZlcmVuY2UpKQorICAgICAgICAmZnJhZ21lbnQsICZyZWZlcmVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9maW5kZmFjdG9yX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsICZyZWZlcmVuY2UpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciByZWZlcmVuY2UgKi8KLSAgICBpZiAocmVmZXJlbmNlLm9iaikKKyAgICBpZiAocmVmZXJlbmNlLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJlZmVyZW5jZSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI1NywxNCArMjczLDE2IEBACiAgICAgUHlfc3NpemVfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqbjpmaW5kbWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmbGVuZ3RoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfZmluZG1heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCBsZW5ndGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODksMTQgKzMwNywxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmF2Z3BwIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2F2Z3BwX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzIxLDE0ICszNDEsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTptYXhwcCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9tYXhwcF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM1MywxNCArMzc1LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6Y3Jvc3MiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfY3Jvc3NfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zODcsMTQgKzQxMSwxNiBAQAogICAgIGRvdWJsZSBmYWN0b3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWQ6bXVsIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZmYWN0b3IpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmZhY3RvcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX211bF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgZmFjdG9yKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDIyLDE0ICs0NDgsMTYgQEAKICAgICBkb3VibGUgcmZhY3RvcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppZGQ6dG9tb25vIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF90b21vbm9faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NTcsMTQgKzQ4NSwxNiBAQAogICAgIGRvdWJsZSByZmFjdG9yOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlkZDp0b3N0ZXJlbyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmxmYWN0b3IsICZyZmFjdG9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfdG9zdGVyZW9faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00OTEsMTcgKzUyMSwyMCBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp5Kmk6YWRkIiwKLSAgICAgICAgJmZyYWdtZW50MSwgJmZyYWdtZW50MiwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50MSwgJmZyYWdtZW50MiwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYWRkX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQxICovCi0gICAgaWYgKGZyYWdtZW50MS5vYmopCisgICAgaWYgKGZyYWdtZW50MS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudDEpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudDIgKi8KLSAgICBpZiAoZnJhZ21lbnQyLm9iaikKKyAgICBpZiAoZnJhZ21lbnQyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50Mik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTUyOCwxNCArNTYxLDE2IEBACiAgICAgaW50IGJpYXM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWk6YmlhcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmYmlhcykpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmYmlhcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2JpYXNfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGJpYXMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01NjAsMTQgKzU5NSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnJldmVyc2UiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfcmV2ZXJzZV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU5MiwxNCArNjI5LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6Ynl0ZXN3YXAiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYnl0ZXN3YXBfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02MjYsMTQgKzY2NSwxNiBAQAogICAgIGludCBuZXd3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppaTpsaW4ybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuZXd3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmV3d2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4ybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBuZXd3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY2NywxNCArNzA4LDE2IEBACiAgICAgaW50IHdlaWdodEIgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlpaWlPfGlpOnJhdGVjdiIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJm5jaGFubmVscywgJmlucmF0ZSwgJm91dHJhdGUsICZzdGF0ZSwgJndlaWdodEEsICZ3ZWlnaHRCKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfcmF0ZWN2X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgc3RhdGUsIHdlaWdodEEsIHdlaWdodEIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02OTksMTQgKzc0MiwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmxpbjJ1bGF3IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJ1bGF3X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzMxLDE0ICs3NzYsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTp1bGF3MmxpbiIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF91bGF3Mmxpbl9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc2MywxNCArODEwLDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bGluMmFsYXciLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbGluMmFsYXdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03OTUsMTQgKzg0NCwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmFsYXcybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2FsYXcybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODI5LDE0ICs4ODAsMTYgQEAKICAgICBQeU9iamVjdCAqc3RhdGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaU86bGluMmFkcGNtIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmc3RhdGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4yYWRwY21faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIHN0YXRlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODYzLDE1ICs5MTYsMTcgQEAKICAgICBQeU9iamVjdCAqc3RhdGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaU86YWRwY20ybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmc3RhdGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hZHBjbTJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIHN0YXRlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWEwNzZlMWIyMTNhODcyN2IgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFmNWIwMjVmMDI0MWZlZTIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oIGIvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCmluZGV4IGUzNDhiZWUuLmUyOTdmMWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKQEAgLTIwLDggKzIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX3V1IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX3V1IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX3V1X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CkBAIC01MCwxNCArNTEsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX3V1IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX3V1IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX3V1X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODAsOCArODMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfYmFzZTY0IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX2Jhc2U2NCIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKQEAgLTkzLDMxICs5NywzNiBAQAogfQogCiBQeURvY19TVFJWQVIoYmluYXNjaWlfYjJhX2Jhc2U2NF9fZG9jX18sCi0iYjJhX2Jhc2U2NCgkbW9kdWxlLCBkYXRhLCAvKVxuIgorImIyYV9iYXNlNjQoJG1vZHVsZSwgLywgZGF0YSwgKiwgbmV3bGluZT1UcnVlKVxuIgogIi0tXG4iCiAiXG4iCiAiQmFzZTY0LWNvZGUgbGluZSBvZiBkYXRhLiIpOwogCiAjZGVmaW5lIEJJTkFTQ0lJX0IyQV9CQVNFNjRfTUVUSE9EREVGICAgIFwKLSAgICB7ImIyYV9iYXNlNjQiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9PLCBiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfX30sCisgICAgeyJiMmFfYmFzZTY0IiwgKFB5Q0Z1bmN0aW9uKWJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1iaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKTsKK2JpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCBuZXdsaW5lKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjQoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKmFyZykKK2JpbmFzY2lpX2IyYV9iYXNlNjQoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkYXRhIiwgIm5ld2xpbmUiLCBOVUxMfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKKyAgICBpbnQgbmV3bGluZSA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9iYXNlNjQiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8JGk6YjJhX2Jhc2U2NCIsIF9rZXl3b3JkcywKKyAgICAgICAgJmRhdGEsICZuZXdsaW5lKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEpOworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwobW9kdWxlLCAmZGF0YSwgbmV3bGluZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTQwLDggKzE0OSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9ocXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaHF4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX2hxeF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgpAQCAtMTcwLDE0ICsxODAsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlY29kZV9ocXgiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVjb2RlX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3JsZWNvZGVfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjAwLDE0ICsyMTIsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9ocXgiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjMwLDE0ICsyNDQsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlZGVjb2RlX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJsZWRlY29kZV9ocXgiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9ybGVkZWNvZGVfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjYzLDE3ICsyNzksMjAgQEAKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSpJOmNyY19ocXgiLAotICAgICAgICAmZGF0YSwgJmNyYykpCisgICAgICAgICZkYXRhLCAmY3JjKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9jcmNfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSwgY3JjKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI5OSwxNyArMzE4LDIwIEBACiAgICAgdW5zaWduZWQgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6Y3JjMzIiLAotICAgICAgICAmZGF0YSwgJmNyYykpCisgICAgICAgICZkYXRhLCAmY3JjKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9jcmMzMl9pbXBsKG1vZHVsZSwgJmRhdGEsIGNyYyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMzUsMTQgKzM1NywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaGV4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hleCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9oZXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNjcsMTQgKzM5MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpoZXhsaWZ5IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6aGV4bGlmeSIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2hleGxpZnlfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MDAsOCArNDI2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgaGV4c3RyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaGV4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaGV4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfaGV4X2ltcGwobW9kdWxlLCAmaGV4c3RyKTsKIAogZXhpdDoKQEAgLTQzMiw4ICs0NTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBoZXhzdHIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnVuaGV4bGlmeSIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZoZXhzdHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5oZXhsaWZ5IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV91bmhleGxpZnlfaW1wbChtb2R1bGUsICZoZXhzdHIpOwogCiBleGl0OgpAQCAtNDY1LDggKzQ5Myw5IEBACiAgICAgaW50IGhlYWRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpOmEyYl9xcCIsIF9rZXl3b3JkcywKLSAgICAgICAgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEsICZoZWFkZXIpKQorICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBoZWFkZXIpOwogCiBleGl0OgpAQCAtNTA1LDE1ICs1MzQsMTcgQEAKICAgICBpbnQgaGVhZGVyID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGlpaTpiMmFfcXAiLCBfa2V5d29yZHMsCi0gICAgICAgICZkYXRhLCAmcXVvdGV0YWJzLCAmaXN0ZXh0LCAmaGVhZGVyKSkKKyAgICAgICAgJmRhdGEsICZxdW90ZXRhYnMsICZpc3RleHQsICZoZWFkZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX3FwX2ltcGwobW9kdWxlLCAmZGF0YSwgcXVvdGV0YWJzLCBpc3RleHQsIGhlYWRlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIxYTNjYmY3NjYwZWJhYTUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTdmYjQyMDM5MmQ3OGFjNGQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oCmluZGV4IDdkNjE2NDkuLjU4OTkzNDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmgKQEAgLTIxLDggKzIxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3MiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3MiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYWNvc19pbXBsKG1vZHVsZSwgeik7CkBAIC02Miw4ICs2Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphY29zaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvc2giLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYWNvc2hfaW1wbChtb2R1bGUsIHopOwpAQCAtMTAzLDggKzEwNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2FzaW5faW1wbChtb2R1bGUsIHopOwpAQCAtMTQ0LDggKzE0Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YXNpbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXNpbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtMTg1LDggKzE4OSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2F0YW5faW1wbChtb2R1bGUsIHopOwpAQCAtMjI2LDggKzIzMSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YXRhbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXRhbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtMjY3LDggKzI3Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3MiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvcyIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9jb3NfaW1wbChtb2R1bGUsIHopOwpAQCAtMzA4LDggKzMxNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3NoIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3NoIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2Nvc2hfaW1wbChtb2R1bGUsIHopOwpAQCAtMzQ5LDggKzM1Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpleHAiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmV4cCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9leHBfaW1wbChtb2R1bGUsIHopOwpAQCAtMzkwLDggKzM5OSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpsb2cxMCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6bG9nMTAiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfbG9nMTBfaW1wbChtb2R1bGUsIHopOwpAQCAtNDMxLDggKzQ0MSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9zaW5faW1wbChtb2R1bGUsIHopOwpAQCAtNDcyLDggKzQ4Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW5oIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3NpbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtNTEzLDggKzUyNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzcXJ0IiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzcXJ0IiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3NxcnRfaW1wbChtb2R1bGUsIHopOwpAQCAtNTU0LDggKzU2Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF90YW5faW1wbChtb2R1bGUsIHopOwpAQCAtNTk1LDggKzYwOSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW5oIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3RhbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtNjM5LDggKzY1NCw5IEBACiAgICAgUHlPYmplY3QgKnlfb2JqID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRHxPOmxvZyIsCi0gICAgICAgICZ4LCAmeV9vYmopKQorICAgICAgICAmeCwgJnlfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2xvZ19pbXBsKG1vZHVsZSwgeCwgeV9vYmopOwogCiBleGl0OgpAQCAtNjY1LDggKzY4MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBoYXNlIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwaGFzZSIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3BoYXNlX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTY5Myw4ICs3MTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwb2xhciIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6cG9sYXIiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9wb2xhcl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC03MjEsOCArNzM5LDkgQEAKICAgICBkb3VibGUgcGhpOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkZDpyZWN0IiwKLSAgICAgICAgJnIsICZwaGkpKQorICAgICAgICAmciwgJnBoaSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9yZWN0X2ltcGwobW9kdWxlLCByLCBwaGkpOwogCiBleGl0OgpAQCAtNzQ3LDggKzc2Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzZmluaXRlIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc2Zpbml0ZSIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2lzZmluaXRlX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTc3Myw4ICs3OTMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc25hbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNuYW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9pc25hbl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC03OTksOCArODIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNpbmYiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzaW5mIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNpbmZfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtODQ3LDE0ICs4NjksMTYgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIkREfCRkZDppc2Nsb3NlIiwgX2tleXdvcmRzLAotICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpCisgICAgICAgICZhLCAmYiwgJnJlbF90b2wsICZhYnNfdG9sKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9pc2Nsb3NlX2ltcGwobW9kdWxlLCBhLCBiLCByZWxfdG9sLCBhYnNfdG9sKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjI5ZTljNDhjOWQyNzM2MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjE2NjIwNWI0YmViMTgyNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmgKaW5kZXggZDlhMTUxNy4uMTA0YjQ4MiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2ZjbnRsbW9kdWxlLmMuaApAQCAtMzMsOCArMzMsOSBAQAogICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8TzpmY250bCIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9mY250bF9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIGFyZyk7CiAKIGV4aXQ6CkBAIC05MSw4ICs5Miw5IEBACiAgICAgaW50IG11dGF0ZV9hcmcgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJkl8T3A6aW9jdGwiLAotICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZvYl9hcmcsICZtdXRhdGVfYXJnKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmb2JfYXJnLCAmbXV0YXRlX2FyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9pb2N0bF9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIG9iX2FyZywgbXV0YXRlX2FyZyk7CiAKIGV4aXQ6CkBAIC0xMjIsOCArMTI0LDkgQEAKICAgICBpbnQgY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOmZsb2NrIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGZjbnRsX2Zsb2NrX2ltcGwobW9kdWxlLCBmZCwgY29kZSk7CiAKIGV4aXQ6CkBAIC0xNzUsMTEgKzE3OCwxMiBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8T09pOmxvY2tmIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKQorICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZsZW5vYmosICZzdGFydG9iaiwgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9sb2NrZl9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIGxlbm9iaiwgc3RhcnRvYmosIHdoZW5jZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iN2Q2ZThmYzJhZDA5YzQ4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iMDg1MzdlOWFkYzA0Y2EyIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oCmluZGV4IGViNWI1OWQuLmNkMTExYWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvZ3JwbW9kdWxlLmMuaApAQCAtMjQsOCArMjQsOSBAQAogICAgIFB5T2JqZWN0ICppZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZpZCkpCisgICAgICAgICZpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBncnBfZ2V0Z3JnaWRfaW1wbChtb2R1bGUsIGlkKTsKIAogZXhpdDoKQEAgLTU0LDggKzU1LDkgQEAKICAgICBQeU9iamVjdCAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIlU6Z2V0Z3JuYW0iLCBfa2V5d29yZHMsCi0gICAgICAgICZuYW1lKSkKKyAgICAgICAgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZ3JwX2dldGdybmFtX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTgyLDQgKzg0LDQgQEAKIHsKICAgICByZXR1cm4gZ3JwX2dldGdyYWxsX2ltcGwobW9kdWxlKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MTkxYzI1NjAwYWZiMWJkIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hOGEwOTc1MjAyMDZjY2Q2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9tZDVtb2R1bGUuYy5oCmluZGV4IGY1YTMxMTcuLjljODk4N2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaApAQCAtODUsMTEgKzg1LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzptZDUiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tZDVfbWQ1X2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGY4MDNkZWQ3MDFhY2E1NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDcwMWQwNDFkMzg3YjA4MSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKaW5kZXggOWVmNzAyYS4uMzM2MjFkOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaApAQCAtNDMsOCArNDMsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mcDpzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIEZTVEFUQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03OCw4ICs3OSw5IEBACiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOmxzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIEZTVEFUQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xzdGF0X2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTE0MSwxMSArMTQzLDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJml8JE8mcHA6YWNjZXNzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2FjY2Vzc19pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCwgZWZmZWN0aXZlX2lkcywgZm9sbG93X3N5bWxpbmtzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTc5LDExICsxODMsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgY2hhciAqX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0dHluYW1lIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dHR5bmFtZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfdHR5bmFtZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yMzgsOCArMjQ0LDkgQEAKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGRpciIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZDSERJUik7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NoZGlyX2ltcGwobW9kdWxlLCAmcGF0aCk7CiAKIGV4aXQ6CkBAIC0yNzQsOCArMjgxLDkgQEAKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpmY2hkaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hkaXJfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTMyOCw4ICszMzYsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZpfCRPJnA6Y2htb2QiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZDSE1PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQ0hNT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NobW9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGlyX2ZkLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtMzY0LDggKzM3Myw5IEBACiAgICAgaW50IG1vZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaTpmY2htb2QiLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCwgJm1vZGUpKQorICAgICAgICAmZmQsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZjaG1vZF9pbXBsKG1vZHVsZSwgZmQsIG1vZGUpOwogCiBleGl0OgpAQCAtNDAwLDggKzQxMCw5IEBACiAgICAgaW50IG1vZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJmk6bGNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19sY2htb2RfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlKTsKIAogZXhpdDoKQEAgLTQ0NCw4ICs0NTUsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrfHA6Y2hmbGFncyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaGZsYWdzX2ltcGwobW9kdWxlLCAmcGF0aCwgZmxhZ3MsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC00ODMsOCArNDk1LDkgQEAKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrOmxjaGZsYWdzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xjaGZsYWdzX2ltcGwobW9kdWxlLCAmcGF0aCwgZmxhZ3MpOwogCiBleGl0OgpAQCAtNTE4LDggKzUzMSw5IEBACiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2hyb290IiwgInBhdGgiLCAwLCAwKTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmNocm9vdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Nocm9vdF9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtNTUzLDggKzU2Nyw5IEBACiAgICAgaW50IGZkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZnN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mc3luY19pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtNjA3LDggKzYyMiw5IEBACiAgICAgaW50IGZkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZmRhdGFzeW5jIiwgX2tleXdvcmRzLAotICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKQorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZmRhdGFzeW5jX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC02NjgsOCArNjg0LDkgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZPJnwkTyZwOmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkLCBGQ0hPV05BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Nob3duX2ltcGwobW9kdWxlLCAmcGF0aCwgdWlkLCBnaWQsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTcwNyw4ICs3MjQsOSBAQAogICAgIGdpZF90IGdpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlPJk8mOmZjaG93biIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hvd25faW1wbChtb2R1bGUsIGZkLCB1aWQsIGdpZCk7CiAKIGV4aXQ6CkBAIC03NDQsOCArNzYyLDkgQEAKICAgICBnaWRfdCBnaWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mTyY6bGNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xjaG93bl9pbXBsKG1vZHVsZSwgJnBhdGgsIHVpZCwgZ2lkKTsKIAogZXhpdDoKQEAgLTgzMSw4ICs4NTAsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnwkTyZPJnA6bGluayIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsIGRpcl9mZF9jb252ZXJ0ZXIsICZzcmNfZGlyX2ZkLCBkaXJfZmRfY29udmVydGVyLCAmZHN0X2Rpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19saW5rX2ltcGwobW9kdWxlLCAmc3JjLCAmZHN0LCBzcmNfZGlyX2ZkLCBkc3RfZGlyX2ZkLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtODc3LDggKzg5Nyw5IEBACiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibGlzdGRpciIsICJwYXRoIiwgMSwgUEFUSF9IQVZFX0ZET1BFTkRJUik7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyY6bGlzdGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xpc3RkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTkwNyw4ICs5MjgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoIl9nZXRmdWxscGF0aG5hbWUiLCAicGF0aCIsIDAsIDApOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfZ2V0ZnVsbHBhdGhuYW1lIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9nZXRmdWxscGF0aG5hbWUiLCBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldGZ1bGxwYXRobmFtZV9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtOTQwLDggKzk2Miw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6X2dldGZpbmFscGF0aG5hbWUiLCAmcGF0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOl9nZXRmaW5hbHBhdGhuYW1lIiwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldGZpbmFscGF0aG5hbWVfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtOTY5LDggKzk5Miw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2lzZGlyIiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2lzZGlyIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9pc2RpciIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19faXNkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTEwMDQsOCArMTAyOCw5IEBACiAgICAgUHlPYmplY3QgKnBhdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgpKQorICAgICAgICAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0dm9sdW1lcGF0aG5hbWVfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtMTA0Myw4ICsxMDY4LDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpJE8mOm1rZGlyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0RJUkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0RJUkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbWtkaXJfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTA3NCw4ICsxMTAwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgaW5jcmVtZW50OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOm5pY2UiLCAmaW5jcmVtZW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmljZSIsICZpbmNyZW1lbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbmljZV9pbXBsKG1vZHVsZSwgaW5jcmVtZW50KTsKIAogZXhpdDoKQEAgLTExMDcsOCArMTEzNCw5IEBACiAgICAgaW50IHdobzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlpOmdldHByaW9yaXR5IiwgX2tleXdvcmRzLAotICAgICAgICAmd2hpY2gsICZ3aG8pKQorICAgICAgICAmd2hpY2gsICZ3aG8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cHJpb3JpdHlfaW1wbChtb2R1bGUsIHdoaWNoLCB3aG8pOwogCiBleGl0OgpAQCAtMTE0MSw4ICsxMTY5LDkgQEAKICAgICBpbnQgcHJpb3JpdHk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaWk6c2V0cHJpb3JpdHkiLCBfa2V5d29yZHMsCi0gICAgICAgICZ3aGljaCwgJndobywgJnByaW9yaXR5KSkKKyAgICAgICAgJndoaWNoLCAmd2hvLCAmcHJpb3JpdHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cHJpb3JpdHlfaW1wbChtb2R1bGUsIHdoaWNoLCB3aG8sIHByaW9yaXR5KTsKIAogZXhpdDoKQEAgLTExODEsOCArMTIxMCw5IEBACiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyY6cmVuYW1lIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsIGRpcl9mZF9jb252ZXJ0ZXIsICZzcmNfZGlyX2ZkLCBkaXJfZmRfY29udmVydGVyLCAmZHN0X2Rpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbmFtZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjI0LDggKzEyNTQsOSBAQAogICAgIGludCBkc3RfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRPJk8mOnJlcGxhY2UiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVwbGFjZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjYzLDggKzEyOTQsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfCRPJjpybWRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JtZGlyX2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTEyOTcsMTEgKzEzMjksMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ1OnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICAmY29tbWFuZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfc3lzdGVtX2ltcGwobW9kdWxlLCBjb21tYW5kKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTMzMywxMSArMTM2NywxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmY29tbWFuZCkpCisgICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzNjcsOCArMTQwMyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG1hc2s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dW1hc2siLCAmbWFzaykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnVtYXNrIiwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW1hc2tfaW1wbChtb2R1bGUsIG1hc2spOwogCiBleGl0OgpAQCAtMTQwMSw4ICsxNDM4LDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyY6dW5saW5rIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW5saW5rX2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTE0MzgsOCArMTQ3Niw5IEBACiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnJlbW92ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbW92ZV9pbXBsKG1vZHVsZSwgJnBhdGgsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xNTIyLDggKzE1NjEsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8TyRPTyZwOnV0aW1lIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdXRpbWVfaW1wbChtb2R1bGUsICZwYXRoLCB0aW1lcywgbnMsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTE1NTMsOCArMTU5Myw5IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6X2V4aXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX19leGl0X2ltcGwobW9kdWxlLCBzdGF0dXMpOwogCiBleGl0OgpAQCAtMTU4OCw4ICsxNjI5LDkgQEAKICAgICBQeU9iamVjdCAqYXJndjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPOmV4ZWN2IiwKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YpKQorICAgICAgICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoLCAmYXJndikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19leGVjdl9pbXBsKG1vZHVsZSwgcGF0aCwgYXJndik7CiAKIGV4aXQ6CkBAIC0xNjMzLDggKzE2NzUsOSBAQAogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk9POmV4ZWN2ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmYXJndiwgJmVudikpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZlX2ltcGwobW9kdWxlLCAmcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE2NzYsOCArMTcxOSw5IEBACiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk86c3Bhd252IiwKLSAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkKKyAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NwYXdudl9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndik7CiAKIGV4aXQ6CkBAIC0xNzIzLDggKzE3NjcsOSBAQAogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk9POnNwYXdudmUiLAotICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKQorICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3Bhd252ZV9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE4MDYsOCArMTg1MSw5IEBACiAgICAgaW50IHBvbGljeTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6c2NoZWRfZ2V0X3ByaW9yaXR5X21heCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBvbGljeSkpCisgICAgICAgICZwb2xpY3kpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF9pbXBsKG1vZHVsZSwgcG9saWN5KTsKIAogZXhpdDoKQEAgLTE4MzgsOCArMTg4NCw5IEBACiAgICAgaW50IHBvbGljeTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6c2NoZWRfZ2V0X3ByaW9yaXR5X21pbiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBvbGljeSkpCisgICAgICAgICZwb2xpY3kpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl9pbXBsKG1vZHVsZSwgcG9saWN5KTsKIAogZXhpdDoKQEAgLTE4NzAsOCArMTkxNyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGlkX3QgcGlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9nZXRzY2hlZHVsZXIiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHNjaGVkdWxlciIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0c2NoZWR1bGVyX2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMTkwMiw4ICsxOTUwLDkgQEAKICAgICBQeU9iamVjdCAqc2NoZWRfcHJpb3JpdHk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOnNjaGVkX3BhcmFtIiwgX2tleXdvcmRzLAotICAgICAgICAmc2NoZWRfcHJpb3JpdHkpKQorICAgICAgICAmc2NoZWRfcHJpb3JpdHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfcGFyYW1faW1wbCh0eXBlLCBzY2hlZF9wcmlvcml0eSk7CiAKIGV4aXQ6CkBAIC0xOTM5LDggKzE5ODgsOSBAQAogICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJpTyY6c2NoZWRfc2V0c2NoZWR1bGVyIiwKLSAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHNjaGVkdWxlcl9pbXBsKG1vZHVsZSwgcGlkLCBwb2xpY3ksICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0xOTcyLDggKzIwMjIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0cGFyYW0iLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHBhcmFtIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRwYXJhbV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIwMDgsOCArMjA1OSw5IEBACiAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgIk8mOnNjaGVkX3NldHBhcmFtIiwKLSAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHBhcmFtX2ltcGwobW9kdWxlLCBwaWQsICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0yMDQxLDExICsyMDkzLDEzIEBACiAgICAgcGlkX3QgcGlkOwogICAgIGRvdWJsZSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9ycl9nZXRfaW50ZXJ2YWwiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX3JyX2dldF9pbnRlcnZhbCIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3NjaGVkX3JyX2dldF9pbnRlcnZhbF9pbXBsKG1vZHVsZSwgcGlkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTIxMDAsOCArMjE1NCw5IEBACiAgICAgUHlPYmplY3QgKm1hc2s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiTzpzY2hlZF9zZXRhZmZpbml0eSIsCi0gICAgICAgICZwaWQsICZtYXNrKSkKKyAgICAgICAgJnBpZCwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfc2V0YWZmaW5pdHlfaW1wbChtb2R1bGUsIHBpZCwgbWFzayk7CiAKIGV4aXQ6CkBAIC0yMTE2LDcgKzIxNzEsNyBAQAogInNjaGVkX2dldGFmZmluaXR5KCRtb2R1bGUsIHBpZCwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuXG4iCisiUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS5cbiIKICJcbiIKICJUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLiIpOwogCkBAIC0yMTMyLDggKzIxODcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0YWZmaW5pdHkiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldGFmZmluaXR5IiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRhZmZpbml0eV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIzMjIsOCArMjM3OCw5IEBACiAgICAgcGlkX3QgcGlkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBfUHlfUEFSU0VfUElEICI6Z2V0cGdpZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBpZCkpCisgICAgICAgICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cGdpZF9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTI0NjcsOCArMjUyNCw5IEBACiAgICAgUHlfc3NpemVfdCBzaWduYWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAibjpraWxsIiwKLSAgICAgICAgJnBpZCwgJnNpZ25hbCkpCisgICAgICAgICZwaWQsICZzaWduYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfa2lsbF9pbXBsKG1vZHVsZSwgcGlkLCBzaWduYWwpOwogCiBleGl0OgpAQCAtMjQ5OSw4ICsyNTU3LDkgQEAKICAgICBpbnQgc2lnbmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImk6a2lsbHBnIiwKLSAgICAgICAgJnBnaWQsICZzaWduYWwpKQorICAgICAgICAmcGdpZCwgJnNpZ25hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19raWxscGdfaW1wbChtb2R1bGUsIHBnaWQsIHNpZ25hbCk7CiAKIGV4aXQ6CkBAIC0yNTI5LDggKzI1ODgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBvcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwbG9jayIsICZvcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnBsb2NrIiwgJm9wKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Bsb2NrX2ltcGwobW9kdWxlLCBvcCk7CiAKIGV4aXQ6CkBAIC0yNTU5LDggKzI2MTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVpZF90IHVpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0dWlkX2ltcGwobW9kdWxlLCB1aWQpOwogCiBleGl0OgpAQCAtMjU4OSw4ICsyNjUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICB1aWRfdCBldWlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRldWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGV1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0ZXVpZF9pbXBsKG1vZHVsZSwgZXVpZCk7CiAKIGV4aXQ6CkBAIC0yNjE5LDggKzI2ODEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGVnaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGVnaWQiLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0ZWdpZCIsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRlZ2lkX2ltcGwobW9kdWxlLCBlZ2lkKTsKIAogZXhpdDoKQEAgLTI2NTEsOCArMjcxNCw5IEBACiAgICAgdWlkX3QgZXVpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJjpzZXRyZXVpZCIsCi0gICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmcnVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmV1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQpOwogCiBleGl0OgpAQCAtMjY4Myw4ICsyNzQ3LDkgQEAKICAgICBnaWRfdCBlZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnNldHJlZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJnJnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZWdpZF9pbXBsKG1vZHVsZSwgcmdpZCwgZWdpZCk7CiAKIGV4aXQ6CkBAIC0yNzEzLDggKzI3NzgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGdpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0Z2lkX2ltcGwobW9kdWxlLCBnaWQpOwogCiBleGl0OgpAQCAtMjc2MSw4ICsyODI3LDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6d2FpdDMiLCBfa2V5d29yZHMsCi0gICAgICAgICZvcHRpb25zKSkKKyAgICAgICAgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdDNfaW1wbChtb2R1bGUsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjc5Nyw4ICsyODY0LDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgICAgICAmcGlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0NF9pbXBsKG1vZHVsZSwgcGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI4NDEsOCArMjkwOSw5IEBACiAgICAgaW50IG9wdGlvbnM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiIF9QeV9QQVJTRV9QSUQgImk6d2FpdGlkIiwKLSAgICAgICAgJmlkdHlwZSwgJmlkLCAmb3B0aW9ucykpCisgICAgICAgICZpZHR5cGUsICZpZCwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdGlkX2ltcGwobW9kdWxlLCBpZHR5cGUsIGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI4NzgsOCArMjk0Nyw5IEBACiAgICAgaW50IG9wdGlvbnM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0cGlkIiwKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgICAgICAmcGlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0cGlkX2ltcGwobW9kdWxlLCBwaWQsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjkxNSw4ICsyOTg1LDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfSU5UUFRSICJpOndhaXRwaWQiLAotICAgICAgICAmcGlkLCAmb3B0aW9ucykpCisgICAgICAgICZwaWQsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3dhaXRwaWRfaW1wbChtb2R1bGUsIHBpZCwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yOTg2LDggKzMwNTcsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8cCRPJjpzeW1saW5rIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsICZ0YXJnZXRfaXNfZGlyZWN0b3J5LCBTWU1MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgJnRhcmdldF9pc19kaXJlY3RvcnksIFNZTUxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N5bWxpbmtfaW1wbChtb2R1bGUsICZzcmMsICZkc3QsIHRhcmdldF9pc19kaXJlY3RvcnksIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0zMDQ3LDggKzMxMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6Z2V0c2lkIiwgJnBpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpnZXRzaWQiLCAmcGlkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2dldHNpZF9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTMxMDEsOCArMzE3NCw5IEBACiAgICAgcGlkX3QgcGdycDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICIiIF9QeV9QQVJTRV9QSUQgIjpzZXRwZ2lkIiwKLSAgICAgICAgJnBpZCwgJnBncnApKQorICAgICAgICAmcGlkLCAmcGdycCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRwZ2lkX2ltcGwobW9kdWxlLCBwaWQsIHBncnApOwogCiBleGl0OgpAQCAtMzEzMSw4ICszMjA1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dGNnZXRwZ3JwIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dGNnZXRwZ3JwIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3RjZ2V0cGdycF9pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtMzE2Myw4ICszMjM4LDkgQEAKICAgICBwaWRfdCBwZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiBfUHlfUEFSU0VfUElEICI6dGNzZXRwZ3JwIiwKLSAgICAgICAgJmZkLCAmcGdpZCkpCisgICAgICAgICZmZCwgJnBnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdGNzZXRwZ3JwX2ltcGwobW9kdWxlLCBmZCwgcGdpZCk7CiAKIGV4aXQ6CkBAIC0zMjAzLDExICszMjc5LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJml8aSRPJjpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncywgJm1vZGUsIE9QRU5BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZtb2RlLCBPUEVOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfb3Blbl9pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzLCBtb2RlLCBkaXJfZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMjM3LDggKzMzMTUsOSBAQAogICAgIGludCBmZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6Y2xvc2UiLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCkpCisgICAgICAgICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jbG9zZV9pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtMzI2NSw4ICszMzQ0LDkgQEAKICAgICBpbnQgZmRfaGlnaDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6Y2xvc2VyYW5nZSIsCi0gICAgICAgICZmZF9sb3csICZmZF9oaWdoKSkKKyAgICAgICAgJmZkX2xvdywgJmZkX2hpZ2gpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2xvc2VyYW5nZV9pbXBsKG1vZHVsZSwgZmRfbG93LCBmZF9oaWdoKTsKIAogZXhpdDoKQEAgLTMyOTIsMTEgKzMzNzIsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19kdXBfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzMyNSw4ICszNDA3LDkgQEAKICAgICBpbnQgaW5oZXJpdGFibGUgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWl8cDpkdXAyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQsICZmZDIsICZpbmhlcml0YWJsZSkpCisgICAgICAgICZmZCwgJmZkMiwgJmluaGVyaXRhYmxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2R1cDJfaW1wbChtb2R1bGUsIGZkLCBmZDIsIGluaGVyaXRhYmxlKTsKIAogZXhpdDoKQEAgLTMzNjMsOCArMzQ0Niw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU8mOmxvY2tmIiwKLSAgICAgICAgJmZkLCAmY29tbWFuZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCAmY29tbWFuZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xvY2tmX2ltcGwobW9kdWxlLCBmZCwgY29tbWFuZCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTMzOTgsMTEgKzM0ODIsMTMgQEAKICAgICBQeV9vZmZfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZpOmxzZWVrIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZwb3NpdGlvbiwgJmhvdykpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmcG9zaXRpb24sICZob3cpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2xzZWVrX2ltcGwobW9kdWxlLCBmZCwgcG9zaXRpb24sIGhvdyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tUHlfb2ZmX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNDI5LDggKzM1MTUsOSBAQAogICAgIFB5X3NzaXplX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpbjpyZWFkIiwKLSAgICAgICAgJmZkLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlYWRfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtMzQ2OCwxMSArMzU1NSwxMyBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cmVhZHYiLAotICAgICAgICAmZmQsICZidWZmZXJzKSkKKyAgICAgICAgJmZkLCAmYnVmZmVycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfcmVhZHZfaW1wbChtb2R1bGUsIGZkLCBidWZmZXJzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzUwNyw4ICszNTk2LDkgQEAKICAgICBQeV9vZmZfdCBvZmZzZXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTyY6cHJlYWQiLAotICAgICAgICAmZmQsICZsZW5ndGgsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpCisgICAgICAgICZmZCwgJmxlbmd0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3ByZWFkX2ltcGwobW9kdWxlLCBmZCwgbGVuZ3RoLCBvZmZzZXQpOwogCiBleGl0OgpAQCAtMzUzOCwxNyArMzYyOCwyMCBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqOndyaXRlIiwKLSAgICAgICAgJmZkLCAmZGF0YSkpCisgICAgICAgICZmZCwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3dyaXRlX2ltcGwobW9kdWxlLCBmZCwgJmRhdGEpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzU3Niw4ICszNjY5LDkgQEAKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOmZzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN0YXRfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTM2MDYsMTEgKzM3MDAsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19pc2F0dHlfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzY2OCw4ICszNzY0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmxhZ3M7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6cGlwZTIiLCAmZmxhZ3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwaXBlMiIsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19waXBlMl9pbXBsKG1vZHVsZSwgZmxhZ3MpOwogCiBleGl0OgpAQCAtMzcwNCwxMSArMzgwMSwxMyBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86d3JpdGV2IiwKLSAgICAgICAgJmZkLCAmYnVmZmVycykpCisgICAgICAgICZmZCwgJmJ1ZmZlcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3dyaXRldl9pbXBsKG1vZHVsZSwgZmQsIGJ1ZmZlcnMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNzQ2LDE3ICszODQ1LDIwIEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpeSpPJjpwd3JpdGUiLAotICAgICAgICAmZmQsICZidWZmZXIsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpCisgICAgICAgICZmZCwgJmJ1ZmZlciwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19wd3JpdGVfaW1wbChtb2R1bGUsIGZkLCAmYnVmZmVyLCBvZmZzZXQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNzkyLDggKzM4OTQsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGkkTyY6bWtmaWZvIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0ZJRk9BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgTUtGSUZPQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19ta2ZpZm9faW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzg0Myw4ICszOTQ2LDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpTyYkTyY6bWtub2QiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlLCBNS05PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSwgTUtOT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX21rbm9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGV2aWNlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzg3NywxMSArMzk4MSwxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWFqb3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptYWpvciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWpvcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzkxMSwxMSArNDAxNywxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWlub3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptaW5vciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19taW5vcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzk0NywxMSArNDA1NSwxMyBAQAogICAgIGRldl90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOm1ha2VkZXYiLAotICAgICAgICAmbWFqb3IsICZtaW5vcikpCisgICAgICAgICZtYWpvciwgJm1pbm9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWtlZGV2X2ltcGwobW9kdWxlLCBtYWpvciwgbWlub3IpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAoZGV2X3QpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IChkZXZfdCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9QeUxvbmdfRnJvbURldihfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM5ODIsOCArNDA5Miw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyY6ZnRydW5jYXRlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mdHJ1bmNhdGVfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtNDAxOCw4ICs0MTI5LDkgQEAKICAgICBQeV9vZmZfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mOnRydW5jYXRlIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3RydW5jYXRlX2ltcGwobW9kdWxlLCAmcGF0aCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTQwNTgsOCArNDE3MCw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZPJjpwb3NpeF9mYWxsb2NhdGUiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wb3NpeF9mYWxsb2NhdGVfaW1wbChtb2R1bGUsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC00MTAxLDggKzQyMTQsOSBAQAogICAgIGludCBhZHZpY2U7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk8maTpwb3NpeF9mYWR2aXNlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCwgJmFkdmljZSkpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0LCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgsICZhZHZpY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcG9zaXhfZmFkdmlzZV9pbXBsKG1vZHVsZSwgZmQsIG9mZnNldCwgbGVuZ3RoLCBhZHZpY2UpOwogCiBleGl0OgpAQCAtNDEzMyw4ICs0MjQ3LDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVVOnB1dGVudiIsCi0gICAgICAgICZuYW1lLCAmdmFsdWUpKQorICAgICAgICAmbmFtZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3B1dGVudl9pbXBsKG1vZHVsZSwgbmFtZSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDE2NSw4ICs0MjgwLDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnB1dGVudiIsCi0gICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJm5hbWUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnZhbHVlKSkKKyAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcHV0ZW52X2ltcGwobW9kdWxlLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MjAwLDggKzQzMTYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5zZXRlbnYiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnVuc2V0ZW52IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191bnNldGVudl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC00MjMxLDggKzQzNDgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnN0cmVycm9yIiwgJmNvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzdHJlcnJvciIsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0cmVycm9yX2ltcGwobW9kdWxlLCBjb2RlKTsKIAogZXhpdDoKQEAgLTQyNjAsMTEgKzQzNzgsMTMgQEAKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOldDT1JFRFVNUCIsICZzdGF0dXMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpXQ09SRURVTVAiLCAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XQ09SRURVTVBfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQyOTksMTEgKzQ0MTksMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0lGQ09OVElOVUVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGQ09OVElOVUVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzM1LDExICs0NDU3LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRlNUT1BQRUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XSUZTVE9QUEVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzcxLDExICs0NDk1LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRlNJR05BTEVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGU0lHTkFMRURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0MDcsMTEgKzQ1MzMsMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0lGRVhJVEVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGRVhJVEVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NDQzLDExICs0NTcxLDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldFWElUU1RBVFVTIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0VYSVRTVEFUVVNfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0NzksMTEgKzQ2MDksMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V1RFUk1TSUciLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XVEVSTVNJR19pbXBsKG1vZHVsZSwgc3RhdHVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDUxNSwxMSArNDY0NywxMyBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXU1RPUFNJRyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0YXR1cykpCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dTVE9QU0lHX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NTUwLDggKzQ2ODQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpmc3RhdHZmcyIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmZzdGF0dmZzIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZzdGF0dmZzX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00NTg2LDggKzQ3MjEsOSBAQAogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInN0YXR2ZnMiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GU1RBVFZGUyk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpzdGF0dmZzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3RhdHZmc19pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtNDYyMSw4ICs0NzU3LDkgQEAKICAgICBQeV9VTklDT0RFICpwYXRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAidTpfZ2V0ZGlza3VzYWdlIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCkpCisgICAgICAgICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX19nZXRkaXNrdXNhZ2VfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtNDY1NiwxMSArNDc5MywxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8mOmZwYXRoY29uZiIsCi0gICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpCisgICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZnBhdGhjb25mX2ltcGwobW9kdWxlLCBmZCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2OTcsMTEgKzQ4MzYsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mOnBhdGhjb25mIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIGNvbnZfcGF0aF9jb25mbmFtZSwgJm5hbWUpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIGNvbnZfcGF0aF9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3BhdGhjb25mX2ltcGwobW9kdWxlLCAmcGF0aCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ3MzMsOCArNDg3NCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NvbmZzdHJfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtNDc2NCwxMSArNDkwNiwxMyBAQAogICAgIGludCBuYW1lOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c2NvbmZfaW1wbChtb2R1bGUsIG5hbWUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00ODQ3LDggKzQ5OTEsOSBAQAogICAgIGludCBmZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6ZGV2aWNlX2VuY29kaW5nIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZGV2aWNlX2VuY29kaW5nX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00ODc4LDggKzUwMjMsOSBAQAogICAgIHVpZF90IHN1aWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJjpzZXRyZXN1aWQiLAotICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJnJ1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZzdWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmc3VpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZXN1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQsIHN1aWQpOwogCiBleGl0OgpAQCAtNDkxMSw4ICs1MDU3LDkgQEAKICAgICBnaWRfdCBzZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyY6c2V0cmVzZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmc2dpZCkpCisgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJnNnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmVzZ2lkX2ltcGwobW9kdWxlLCByZ2lkLCBlZ2lkLCBzZ2lkKTsKIAogZXhpdDoKQEAgLTQ5OTUsOCArNTE0Miw5IEBACiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRwOmdldHhhdHRyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXR4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MDQzLDggKzUxOTEsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnkqfGkkcDpzZXR4YXR0ciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJnZhbHVlLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmdmFsdWUsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXR4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsICZ2YWx1ZSwgZmxhZ3MsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MDUzLDggKzUyMDIsOSBAQAogICAgIC8qIENsZWFudXAgZm9yIGF0dHJpYnV0ZSAqLwogICAgIHBhdGhfY2xlYW51cCgmYXR0cmlidXRlKTsKICAgICAvKiBDbGVhbnVwIGZvciB2YWx1ZSAqLwotICAgIGlmICh2YWx1ZS5vYmopCisgICAgaWYgKHZhbHVlLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhbHVlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTA5MSw4ICs1MjQxLDkgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JHA6cmVtb3ZleGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbW92ZXhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgJmF0dHJpYnV0ZSwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUxMzUsOCArNTI4Niw5IEBACiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyYkcDpsaXN0eGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19saXN0eGF0dHJfaW1wbChtb2R1bGUsICZwYXRoLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtNTE2Niw4ICs1MzE4LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIm46dXJhbmRvbSIsICZzaXplKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIm46dXJhbmRvbSIsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3VyYW5kb21faW1wbChtb2R1bGUsIHNpemUpOwogCiBleGl0OgpAQCAtNTE3OCw3ICs1MzMxLDExIEBACiAiY3B1X2NvdW50KCRtb2R1bGUsIC8pXG4iCiAiLS1cbiIKICJcbiIKLSJSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW07IHJldHVybiBOb25lIGlmIGluZGV0ZXJtaW5hYmxlLiIpOworIlJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuXG4iCisiXG4iCisiVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuXG4iCisidXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aFxuIgorImBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgIik7CiAKICNkZWZpbmUgT1NfQ1BVX0NPVU5UX01FVEhPRERFRiAgICBcCiAgICAgeyJjcHVfY291bnQiLCAoUHlDRnVuY3Rpb24pb3NfY3B1X2NvdW50LCBNRVRIX05PQVJHUywgb3NfY3B1X2NvdW50X19kb2NfX30sCkBAIC01MjExLDExICs1MzY4LDEzIEBACiAgICAgaW50IGZkOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9pbmhlcml0YWJsZSIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9pbmhlcml0YWJsZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZ2V0X2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBmZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUyNDIsOCArNTQwMSw5IEBACiAgICAgaW50IGluaGVyaXRhYmxlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpzZXRfaW5oZXJpdGFibGUiLAotICAgICAgICAmZmQsICZpbmhlcml0YWJsZSkpCisgICAgICAgICZmZCwgJmluaGVyaXRhYmxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldF9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgZmQsIGluaGVyaXRhYmxlKTsKIAogZXhpdDoKQEAgLTUyNzEsMTEgKzU0MzEsMTMgQEAKICAgICBQeV9pbnRwdHJfdCBoYW5kbGU7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MzA3LDggKzU0NjksOSBAQAogICAgIGludCBpbmhlcml0YWJsZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfSU5UUFRSICJwOnNldF9oYW5kbGVfaW5oZXJpdGFibGUiLAotICAgICAgICAmaGFuZGxlLCAmaW5oZXJpdGFibGUpKQorICAgICAgICAmaGFuZGxlLCAmaW5oZXJpdGFibGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBpbmhlcml0YWJsZSk7CiAKIGV4aXQ6CkBAIC01MzE3LDYgKzU0ODAsMzkgQEAKIAogI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KIAorUHlEb2NfU1RSVkFSKG9zX2ZzcGF0aF9fZG9jX18sCisiZnNwYXRoKCRtb2R1bGUsIC8sIHBhdGgpXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cbiIKKyJcbiIKKyJJZiB0aGUgb2JqZWN0IGlzIHN0ciBvciBieXRlcywgdGhlbiBhbGxvdyBpdCB0byBwYXNzIHRocm91Z2ggYXMtaXMuIElmIHRoZVxuIgorIm9iamVjdCBkZWZpbmVzIF9fZnNwYXRoX18oKSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0IG1ldGhvZC4gQWxsIG90aGVyXG4iCisidHlwZXMgcmFpc2UgYSBUeXBlRXJyb3IuIik7CisKKyNkZWZpbmUgT1NfRlNQQVRIX01FVEhPRERFRiAgICBcCisgICAgeyJmc3BhdGgiLCAoUHlDRnVuY3Rpb24pb3NfZnNwYXRoLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgb3NfZnNwYXRoX19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19mc3BhdGhfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqcGF0aCk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19mc3BhdGgoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBhdGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOmZzcGF0aCIsIF9rZXl3b3JkcywKKyAgICAgICAgJnBhdGgpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnNwYXRoX2ltcGwobW9kdWxlLCBwYXRoKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCiAjaWZuZGVmIE9TX1RUWU5BTUVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBPU19UVFlOQU1FX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE9TX1RUWU5BTUVfTUVUSE9EREVGKSAqLwpAQCAtNTc4OCw0ICs1OTg0LDQgQEAKICNpZm5kZWYgT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYKICAgICAjZGVmaW5lIE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTU4MjRjNTJmZDAzNDY1NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MWI5MWMzYTEwMGU3NWE0ZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvcHdkbW9kdWxlLmMuaAppbmRleCA5ZGUyZTRmLi42YjUwNDY0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B3ZG1vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqYXJnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmdfLCAiVTpnZXRwd25hbSIsICZhcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0cHduYW0iLCAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB3ZF9nZXRwd25hbV9pbXBsKG1vZHVsZSwgYXJnKTsKIAogZXhpdDoKQEAgLTY4LDQgKzY5LDQgQEAKICNpZm5kZWYgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFBXRF9HRVRQV0FMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MmVkMGVjZjM0ZmQzZjk4ZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjgwN2M4OWI0NGJlMGZkZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaCBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCmluZGV4IDM3OWM1ZGIuLjBjMWYzZmMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCkBAIC0yNSw4ICsyNSw5IEBACiAgICAgaW50IGlzZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6UGFyc2UiLAotICAgICAgICAmZGF0YSwgJmlzZmluYWwpKQorICAgICAgICAmZGF0YSwgJmlzZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfUGFyc2VfaW1wbChzZWxmLCBkYXRhLCBpc2ZpbmFsKTsKIAogZXhpdDoKQEAgLTYwLDggKzYxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpiYXNlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRCYXNlX2ltcGwoc2VsZiwgYmFzZSk7CiAKIGV4aXQ6CkBAIC0xMjksOCArMTMxLDkgQEAKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8czpFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIsCi0gICAgICAgICZjb250ZXh0LCAmZW5jb2RpbmcpKQorICAgICAgICAmY29udGV4dCwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfeG1scGFyc2VyX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlX2ltcGwoc2VsZiwgY29udGV4dCwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtMTYwLDggKzE2Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZsYWc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6U2V0UGFyYW1FbnRpdHlQYXJzaW5nIiwgJmZsYWcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpTZXRQYXJhbUVudGl0eVBhcnNpbmciLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRQYXJhbUVudGl0eVBhcnNpbmdfaW1wbChzZWxmLCBmbGFnKTsKIAogZXhpdDoKQEAgLTE5Myw4ICsxOTcsOSBAQAogICAgIGludCBmbGFnID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHA6VXNlRm9yZWlnbkRURCIsCi0gICAgICAgICZmbGFnKSkKKyAgICAgICAgJmZsYWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfVXNlRm9yZWlnbkRURF9pbXBsKHNlbGYsIGZsYWcpOwogCiBleGl0OgpAQCAtMjQ0LDggKzI0OSw5IEBACiAgICAgUHlPYmplY3QgKmludGVybiA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8enpPOlBhcnNlckNyZWF0ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVuY29kaW5nLCAmbmFtZXNwYWNlX3NlcGFyYXRvciwgJmludGVybikpCisgICAgICAgICZlbmNvZGluZywgJm5hbWVzcGFjZV9zZXBhcmF0b3IsICZpbnRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF9QYXJzZXJDcmVhdGVfaW1wbChtb2R1bGUsIGVuY29kaW5nLCBuYW1lc3BhY2Vfc2VwYXJhdG9yLCBpbnRlcm4pOwogCiBleGl0OgpAQCAtMjcwLDggKzI3Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgbG9uZyBjb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJsOkVycm9yU3RyaW5nIiwgJmNvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibDpFcnJvclN0cmluZyIsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfRXJyb3JTdHJpbmdfaW1wbChtb2R1bGUsIGNvZGUpOwogCiBleGl0OgpAQCAtMjgxLDQgKzI4OCw0IEBACiAjaWZuZGVmIFBZRVhQQVRfWE1MUEFSU0VSX1VTRUZPUkVJR05EVERfTUVUSE9EREVGCiAgICAgI2RlZmluZSBQWUVYUEFUX1hNTFBBUlNFUl9VU0VGT1JFSUdORFREX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFBZRVhQQVRfWE1MUEFSU0VSX1VTRUZPUkVJR05EVERfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJmNGQ5OWM5NzAyZDhhNmMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTcxYTYwZDcwOTY0N2ZiZTMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2hhMW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaAppbmRleCBmYTg2NWJhLi42ZDNmYTY0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaApAQCAtODUsMTEgKzg1LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpzaGExIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMV9zaGExX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmUxOTEwMmYzMTIwNDkwYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDBkZjNmODk1NTkxOWU3MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2hhMjU2bW9kdWxlLmMuaAppbmRleCBjNWZlMTg4Li5jNDI5ODAwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NoYTI1Nm1vZHVsZS5jLmgKQEAgLTg1LDggKzg1LDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTI1NiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTI1Nl9zaGEyNTZfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xMTMsMTEgKzExNCwxMiBAQAogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86c2hhMjI0IiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMjU2X3NoYTIyNF9pbXBsKG1vZHVsZSwgc3RyaW5nKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM1NGNlZGYzYjYzMmM3YjIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWU4NWNjNGEyMjMzNzFkODQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3NoYTUxMm1vZHVsZS5jLmgKaW5kZXggYzMwODczOS4uOTRmYjE1YyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaGE1MTJtb2R1bGUuYy5oCkBAIC0xMDMsOCArMTAzLDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTUxMiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTUxMl9zaGE1MTJfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xMzUsOCArMTM2LDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTM4NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTUxMl9zaGEzODRfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xNjgsNCArMTcwLDQgQEAKICNpZm5kZWYgX1NIQTUxMl9TSEEzODRfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MWM3ZDM4NTczMWZlZTdjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ODQ1YWY0N2NlYTIyZTJhMSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2lnbmFsbW9kdWxlLmMuaAppbmRleCBlYzA3ZWYxLi5lMGFhYWI2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NpZ25hbG1vZHVsZS5jLmgKQEAgLTIzLDExICsyMywxMyBAQAogICAgIGludCBzZWNvbmRzOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTphbGFybSIsICZzZWNvbmRzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6YWxhcm0iLCAmc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gc2lnbmFsX2FsYXJtX2ltcGwobW9kdWxlLCBzZWNvbmRzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtODUsOCArODcsOSBAQAogICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpzaWduYWwiLAotICAgICAgICAmc2lnbmFsbnVtLCAmaGFuZGxlcikpCisgICAgICAgICZzaWduYWxudW0sICZoYW5kbGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9zaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSwgaGFuZGxlcik7CiAKIGV4aXQ6CkBAIC0xMTcsOCArMTIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgc2lnbmFsbnVtOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldHNpZ25hbCIsICZzaWduYWxudW0pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRzaWduYWwiLCAmc2lnbmFsbnVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9nZXRzaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC0xNTAsOCArMTU0LDkgQEAKICAgICBpbnQgZmxhZzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2lnaW50ZXJydXB0IiwKLSAgICAgICAgJnNpZ25hbG51bSwgJmZsYWcpKQorICAgICAgICAmc2lnbmFsbnVtLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2lnaW50ZXJydXB0X2ltcGwobW9kdWxlLCBzaWduYWxudW0sIGZsYWcpOwogCiBleGl0OgpAQCAtMTg5LDggKzE5NCw5IEBACiAgICAgZG91YmxlIGludGVydmFsID0gMC4wOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpZHxkOnNldGl0aW1lciIsCi0gICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpCisgICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCwgc2Vjb25kcywgaW50ZXJ2YWwpOwogCiBleGl0OgpAQCAtMjE5LDggKzIyNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHdoaWNoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfZ2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjU4LDkgQEAKICAgICBQeU9iamVjdCAqbWFzazsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cHRocmVhZF9zaWdtYXNrIiwKLSAgICAgICAgJmhvdywgJm1hc2spKQorICAgICAgICAmaG93LCAmbWFzaykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9zaWdtYXNrX2ltcGwobW9kdWxlLCBob3csIG1hc2spOwogCiBleGl0OgpAQCAtMzQ0LDggKzM1Miw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzaWd0aW1lZHdhaXQiLAogICAgICAgICAyLCAyLAotICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKQorICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3NpZ3RpbWVkd2FpdF9pbXBsKG1vZHVsZSwgc2lnc2V0LCB0aW1lb3V0X29iaik7CiAKIGV4aXQ6CkBAIC0zNzYsOCArMzg1LDkgQEAKICAgICBpbnQgc2lnbmFsbnVtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdGhyZWFkX2tpbGwiLAotICAgICAgICAmdGhyZWFkX2lkLCAmc2lnbmFsbnVtKSkKKyAgICAgICAgJnRocmVhZF9pZCwgJnNpZ25hbG51bSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9raWxsX2ltcGwobW9kdWxlLCB0aHJlYWRfaWQsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC00MjksNCArNDM5LDQgQEAKICNpZm5kZWYgU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFNJR05BTF9QVEhSRUFEX0tJTExfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Yjk5Mjc4YzE2YzQwZWE0MyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGI5NTE5MTgwYTA5MTUzNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCmluZGV4IGMwZDE4ZGIuLjUxYmRhOTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCkBAIC0yNCw4ICsyNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0c3BuYW0iLCAmYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ18sICJVOmdldHNwbmFtIiwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzcHdkX2dldHNwbmFtX2ltcGwobW9kdWxlLCBhcmcpOwogCiBleGl0OgpAQCAtNjUsNCArNjYsNCBAQAogI2lmbmRlZiBTUFdEX0dFVFNQQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgU1BXRF9HRVRTUEFMTF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChTUFdEX0dFVFNQQUxMX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02YzE3ODgzMDQxM2Y3NzYzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYjdhMzg0NDQ3ZTVmMWUzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaCBiL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaAppbmRleCBkNTIwYzFlLi5kNDgxY2NiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy91bmljb2RlZGF0YS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvdW5pY29kZWRhdGEuYy5oCkBAIC0yNyw4ICsyNyw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJDfE86ZGVjaW1hbCIsCi0gICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2RlY2ltYWxfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTksOCArNjAsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOmRpZ2l0IiwKLSAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGlnaXRfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtOTIsOCArOTQsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm51bWVyaWMiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9udW1lcmljX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTExOCw4ICsxMjEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9jYXRlZ29yeV9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0xNDYsOCArMTUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmJpZGlyZWN0aW9uYWwiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6YmlkaXJlY3Rpb25hbCIsICZjaHIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2JpZGlyZWN0aW9uYWxfaW1wbChzZWxmLCBjaHIpOwogCiBleGl0OgpAQCAtMTc1LDExICsxODAsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmNvbWJpbmluZyIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpjb21iaW5pbmciLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfY29tYmluaW5nX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjA4LDExICsyMTUsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX21pcnJvcmVkX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjM3LDggKzI0Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNocjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzplYXN0X2FzaWFuX3dpZHRoIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmVhc3RfYXNpYW5fd2lkdGgiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9lYXN0X2FzaWFuX3dpZHRoX2ltcGwoc2VsZiwgY2hyKTsKIAogZXhpdDoKQEAgLTI2NSw4ICsyNzUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6ZGVjb21wb3NpdGlvbiIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpkZWNvbXBvc2l0aW9uIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGVjb21wb3NpdGlvbl9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0yOTYsOCArMzA3LDkgQEAKICAgICBQeU9iamVjdCAqaW5wdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPITpub3JtYWxpemUiLAotICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKQorICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX25vcm1hbGl6ZV9pbXBsKHNlbGYsIGZvcm0sIGlucHV0KTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzksOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm5hbWUiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9uYW1lX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1OCwxMSArMzcxLDEyIEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBQeV9zc2l6ZV9jbGVhbl90IG5hbWVfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVfbGVuZ3RoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOmxvb2t1cCIsICZuYW1lLCAmbmFtZV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2xvb2t1cF9pbXBsKHNlbGYsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRmOGRhMzNjNmJjNmVmYzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUzMTNjZTEyOWRhODdiMmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAppbmRleCA2MDJhZTFkLi5kY2FlZWY4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaApAQCAtMywzOCArMyw0MSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBQeURvY19TVFJWQVIoemxpYl9jb21wcmVzc19fZG9jX18sCi0iY29tcHJlc3MoJG1vZHVsZSwgYnl0ZXMsIGxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiwgLylcbiIKKyJjb21wcmVzcygkbW9kdWxlLCBkYXRhLCAvLCBsZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04pXG4iCiAiLS1cbiIKICJcbiIKICJSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLlxuIgogIlxuIgotIiAgYnl0ZXNcbiIKKyIgIGRhdGFcbiIKICIgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC5cbiIKICIgIGxldmVsXG4iCi0iICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuIik7CisiICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuIik7CiAKICNkZWZpbmUgWkxJQl9DT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9jb21wcmVzcywgTUVUSF9WQVJBUkdTLCB6bGliX2NvbXByZXNzX19kb2NfX30sCisgICAgeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbil6bGliX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9jb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCk7Cit6bGliX2NvbXByZXNzX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbGV2ZWwpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzcyhQeU1vZHVsZURlZiAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3psaWJfY29tcHJlc3MoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfYnVmZmVyIGJ5dGVzID0ge05VTEwsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiIiwgImxldmVsIiwgTlVMTH07CisgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnxpOmNvbXByZXNzIiwKLSAgICAgICAgJmJ5dGVzLCAmbGV2ZWwpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGk6Y29tcHJlc3MiLCBfa2V5d29yZHMsCisgICAgICAgICZkYXRhLCAmbGV2ZWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NvbXByZXNzX2ltcGwobW9kdWxlLCAmYnl0ZXMsIGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc19pbXBsKG1vZHVsZSwgJmRhdGEsIGxldmVsKTsKIAogZXhpdDoKLSAgICAvKiBDbGVhbnVwIGZvciBieXRlcyAqLwotICAgIGlmIChieXRlcy5vYmopCi0gICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnl0ZXMpOworICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KKyAgICBpZiAoZGF0YS5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjgsMTQgKzcxLDE2IEBACiAgICAgdW5zaWduZWQgaW50IGJ1ZnNpemUgPSBERUZfQlVGX1NJWkU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfGlPJjpkZWNvbXByZXNzIiwKLSAgICAgICAgJmRhdGEsICZ3Yml0cywgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmYnVmc2l6ZSkpCisgICAgICAgICZkYXRhLCAmd2JpdHMsIGNhcHBlZF91aW50X2NvbnZlcnRlciwgJmJ1ZnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9kZWNvbXByZXNzX2ltcGwobW9kdWxlLCAmZGF0YSwgd2JpdHMsIGJ1ZnNpemUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEzMCwxNCArMTM1LDE2IEBACiAgICAgUHlfYnVmZmVyIHpkaWN0ID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlpaWlpeSo6Y29tcHJlc3NvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZsZXZlbCwgJm1ldGhvZCwgJndiaXRzLCAmbWVtTGV2ZWwsICZzdHJhdGVneSwgJnpkaWN0KSkKKyAgICAgICAgJmxldmVsLCAmbWV0aG9kLCAmd2JpdHMsICZtZW1MZXZlbCwgJnN0cmF0ZWd5LCAmemRpY3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc29ial9pbXBsKG1vZHVsZSwgbGV2ZWwsIG1ldGhvZCwgd2JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgJnpkaWN0KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciB6ZGljdCAqLwotICAgIGlmICh6ZGljdC5vYmopCisgICAgaWYgKHpkaWN0Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnpkaWN0KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTY5LDggKzE3Niw5IEBACiAgICAgUHlPYmplY3QgKnpkaWN0ID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpTzpkZWNvbXByZXNzb2JqIiwgX2tleXdvcmRzLAotICAgICAgICAmd2JpdHMsICZ6ZGljdCkpCisgICAgICAgICZ3Yml0cywgJnpkaWN0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfZGVjb21wcmVzc29ial9pbXBsKG1vZHVsZSwgd2JpdHMsIHpkaWN0KTsKIAogZXhpdDoKQEAgLTIwMiwxNCArMjEwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0NvbXByZXNzX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI0NiwxNCArMjU2LDE2IEBACiAgICAgdW5zaWduZWQgaW50IG1heF9sZW5ndGggPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnxPJjpkZWNvbXByZXNzIiwKLSAgICAgICAgJmRhdGEsIGNhcHBlZF91aW50X2NvbnZlcnRlciwgJm1heF9sZW5ndGgpKQorICAgICAgICAmZGF0YSwgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0RlY29tcHJlc3NfZGVjb21wcmVzc19pbXBsKHNlbGYsICZkYXRhLCBtYXhfbGVuZ3RoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODMsOCArMjk1LDkgQEAKICAgICBpbnQgbW9kZSA9IFpfRklOSVNIOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpmbHVzaCIsCi0gICAgICAgICZtb2RlKSkKKyAgICAgICAgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9Db21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIG1vZGUpOwogCiBleGl0OgpAQCAtMzU3LDggKzM3MCw5IEBACiAgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IERFRl9CVUZfU0laRTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOmZsdXNoIiwKLSAgICAgICAgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfRGVjb21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC0zOTAsMTQgKzQwNCwxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6YWRsZXIzMiIsCi0gICAgICAgICZkYXRhLCAmdmFsdWUpKQorICAgICAgICAmZGF0YSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfYWRsZXIzMl9pbXBsKG1vZHVsZSwgJmRhdGEsIHZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MjcsMTQgKzQ0MywxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6Y3JjMzIiLAotICAgICAgICAmZGF0YSwgJnZhbHVlKSkKKyAgICAgICAgJmRhdGEsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NyYzMyX2ltcGwobW9kdWxlLCAmZGF0YSwgdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ0Miw0ICs0NjAsNCBAQAogI2lmbmRlZiBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAgICAgI2RlZmluZSBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoWkxJQl9DT01QUkVTU19DT1BZX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1mMzE2MjdiMzE0YTdiZDJmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iYTkwNGRlYzMwY2MxYTFhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMgYi9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCmluZGV4IGYxZmRhNDguLmQ2MzIyZDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKKysrIGIvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgaGFuZGxlciBmYWlscyBpbiBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoKSAqLwogICAgIHtTSUdTRUdWLCAwLCAiU2VnbWVudGF0aW9uIGZhdWx0IiwgfQogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhdWx0aGFuZGxlcl9uc2lnbmFscyA9IFwKK3N0YXRpYyBjb25zdCBzaXplX3QgZmF1bHRoYW5kbGVyX25zaWduYWxzID0gXAogICAgIFB5X0FSUkFZX0xFTkdUSChmYXVsdGhhbmRsZXJfaGFuZGxlcnMpOwogCiAjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwpAQCAtMjAyLDggKzIwMiw5IEBACiBzdGF0aWMgUHlUaHJlYWRTdGF0ZSoKIGdldF90aHJlYWRfc3RhdGUodm9pZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAvKiBqdXN0IGluIGNhc2UgYnV0IHZlcnkgdW5saWtlbHkuLi4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIzNCwxMSArMjM1LDEyIEBACiAgICAgICAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKS4gKi8KICAgICB0c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwogI2Vsc2UKLSAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIHRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogI2VuZGlmCiAKLSAgICBpZiAoYWxsX3RocmVhZHMpCi0gICAgICAgIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgaW50ZXJwLCB0c3RhdGUpOworICAgIGlmIChhbGxfdGhyZWFkcykgeworICAgICAgICAodm9pZClfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBpZiAodHN0YXRlICE9IE5VTEwpCiAgICAgICAgICAgICBfUHlfRHVtcFRyYWNlYmFjayhmZCwgdHN0YXRlKTsKQEAgLTI3Miw3ICsyNzQsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChhbGxfdGhyZWFkcykgewotICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIHRzdGF0ZS0+aW50ZXJwLCB0c3RhdGUpOworICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CiAgICAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgZXJybXNnKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg4LDYgKzI5MCwxOSBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCitzdGF0aWMgdm9pZAorZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXIpCit7CisgICAgaWYgKCFoYW5kbGVyLT5lbmFibGVkKQorICAgICAgICByZXR1cm47CisgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAodm9pZClzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOworI2Vsc2UKKyAgICAodm9pZClzaWduYWwoaGFuZGxlci0+c2lnbnVtLCBoYW5kbGVyLT5wcmV2aW91cyk7CisjZW5kaWYKK30KKwogCiAvKiBIYW5kbGVyIGZvciBTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQsIFNJR0JVUyBhbmQgU0lHSUxMIHNpZ25hbHMuCiAKQEAgLTMwNiw3ICszMjEsNyBAQAogZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKGludCBzaWdudW0pCiB7CiAgICAgY29uc3QgaW50IGZkID0gZmF0YWxfZXJyb3IuZmQ7Ci0gICAgdW5zaWduZWQgaW50IGk7CisgICAgc2l6ZV90IGk7CiAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gTlVMTDsKICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwogCkBAIC0zMjQsMTIgKzMzOSw3IEBACiAgICAgfQogCiAgICAgLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgaGFuZGxlciAqLwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgKHZvaWQpc2lnYWN0aW9uKHNpZ251bSwgJmhhbmRsZXItPnByZXZpb3VzLCBOVUxMKTsKLSNlbHNlCi0gICAgKHZvaWQpc2lnbmFsKHNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOwotI2VuZGlmCi0gICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisgICAgZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihoYW5kbGVyKTsKIAogICAgIFBVVFMoZmQsICJGYXRhbCBQeXRob24gZXJyb3I6ICIpOwogICAgIFBVVFMoZmQsIGhhbmRsZXItPm5hbWUpOwpAQCAtMzUxLDIwICszNjEsMTE3IEBACiAgICAgcmFpc2Uoc2lnbnVtKTsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKK3N0YXRpYyBMT05HIFdJTkFQSQorZmF1bHRoYW5kbGVyX2V4Y19oYW5kbGVyKHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTICpleGNfaW5mbykKK3sKKyAgICBjb25zdCBpbnQgZmQgPSBmYXRhbF9lcnJvci5mZDsKKyAgICBEV09SRCBjb2RlID0gZXhjX2luZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZTsKKyAgICBEV09SRCBmbGFncyA9IGV4Y19pbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkZsYWdzOworCisgICAgLyogb25seSBsb2cgZmF0YWwgZXhjZXB0aW9ucyAqLworICAgIGlmIChmbGFncyAmIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRSkgeworICAgICAgICAvKiBjYWxsIHRoZSBuZXh0IGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgIH0KKworICAgIFBVVFMoZmQsICJXaW5kb3dzIGZhdGFsIGV4Y2VwdGlvbjogIik7CisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICAvKiBvbmx5IGZvcm1hdCBtb3N0IGNvbW1vbiBlcnJvcnMgKi8KKyAgICBjYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOiBQVVRTKGZkLCAiYWNjZXNzIHZpb2xhdGlvbiIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJmbG9hdCBkaXZpZGUgYnkgemVybyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfT1ZFUkZMT1c6IFBVVFMoZmQsICJmbG9hdCBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJpbnQgZGl2aWRlIGJ5IHplcm8iKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOiBQVVRTKGZkLCAiaW50ZWdlciBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTl9QQUdFX0VSUk9SOiBQVVRTKGZkLCAicGFnZSBlcnJvciIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVzogUFVUUyhmZCwgInN0YWNrIG92ZXJmbG93Iik7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFBVVFMoZmQsICJjb2RlICIpOworICAgICAgICBfUHlfRHVtcERlY2ltYWwoZmQsIGNvZGUpOworICAgIH0KKyAgICBQVVRTKGZkLCAiXG5cbiIpOworCisgICAgaWYgKGNvZGUgPT0gRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04pIHsKKyAgICAgICAgLyogZGlzYWJsZSBzaWduYWwgaGFuZGxlciBmb3IgU0lHU0VHViAqLworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgeworICAgICAgICAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyLT5zaWdudW0gPT0gU0lHU0VHVikgeworICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmYXVsdGhhbmRsZXJfZHVtcF90cmFjZWJhY2soZmQsIGZhdGFsX2Vycm9yLmFsbF90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbF9lcnJvci5pbnRlcnApOworCisgICAgLyogY2FsbCB0aGUgbmV4dCBleGNlcHRpb24gaGFuZGxlciAqLworICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmCisKIC8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGZhdGFsIHNpZ25hbHMsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcigpLiAqLwogCitzdGF0aWMgaW50CitmYXVsdGhhbmRsZXJfZW5hYmxlKHZvaWQpCit7CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAoZmF0YWxfZXJyb3IuZW5hYmxlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDE7CisKKyAgICBmb3IgKGk9MDsgaSA8IGZhdWx0aGFuZGxlcl9uc2lnbmFsczsgaSsrKSB7CisgICAgICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlcjsKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKKyNlbmRpZgorICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOworICAgICAgICBhc3NlcnQoIWhhbmRsZXItPmVuYWJsZWQpOworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisgICAgICAgIGFjdGlvbi5zYV9oYW5kbGVyID0gZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yOworICAgICAgICBzaWdlbXB0eXNldCgmYWN0aW9uLnNhX21hc2spOworICAgICAgICAvKiBEbyBub3QgcHJldmVudCB0aGUgc2lnbmFsIGZyb20gYmVpbmcgcmVjZWl2ZWQgZnJvbSB3aXRoaW4KKyAgICAgICAgICAgaXRzIG93biBzaWduYWwgaGFuZGxlciAqLworICAgICAgICBhY3Rpb24uc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworI2lmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKKyAgICAgICAgaWYgKHN0YWNrLnNzX3NwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIENhbGwgdGhlIHNpZ25hbCBoYW5kbGVyIG9uIGFuIGFsdGVybmF0ZSBzaWduYWwgc3RhY2sKKyAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHNpZ2FsdHN0YWNrKCkgKi8KKyAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyB8PSBTQV9PTlNUQUNLOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZXJyID0gc2lnYWN0aW9uKGhhbmRsZXItPnNpZ251bSwgJmFjdGlvbiwgJmhhbmRsZXItPnByZXZpb3VzKTsKKyNlbHNlCisgICAgICAgIGhhbmRsZXItPnByZXZpb3VzID0gc2lnbmFsKGhhbmRsZXItPnNpZ251bSwKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IpOworICAgICAgICBlcnIgPSAoaGFuZGxlci0+cHJldmlvdXMgPT0gU0lHX0VSUik7CisjZW5kaWYKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGVyLT5lbmFibGVkID0gMTsKKyAgICB9CisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgQWRkVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKDEsIGZhdWx0aGFuZGxlcl9leGNfaGFuZGxlcik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIFB5T2JqZWN0KgotZmF1bHRoYW5kbGVyX2VuYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitmYXVsdGhhbmRsZXJfcHlfZW5hYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGUiLCAiYWxsX3RocmVhZHMiLCBOVUxMfTsKICAgICBQeU9iamVjdCAqZmlsZSA9IE5VTEw7CiAgICAgaW50IGFsbF90aHJlYWRzID0gMTsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXI7Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKLSNlbmRpZgotICAgIGludCBlcnI7CiAgICAgaW50IGZkOwogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKIApAQCAtMzg2LDM3ICs0OTMsMTAgQEAKICAgICBmYXRhbF9lcnJvci5hbGxfdGhyZWFkcyA9IGFsbF90aHJlYWRzOwogICAgIGZhdGFsX2Vycm9yLmludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwogCi0gICAgaWYgKCFmYXRhbF9lcnJvci5lbmFibGVkKSB7Ci0gICAgICAgIGZhdGFsX2Vycm9yLmVuYWJsZWQgPSAxOwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgICAgICAgICBhY3Rpb24uc2FfaGFuZGxlciA9IGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcjsKLSAgICAgICAgICAgIHNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7Ci0gICAgICAgICAgICAvKiBEbyBub3QgcHJldmVudCB0aGUgc2lnbmFsIGZyb20gYmVpbmcgcmVjZWl2ZWQgZnJvbSB3aXRoaW4KLSAgICAgICAgICAgICAgIGl0cyBvd24gc2lnbmFsIGhhbmRsZXIgKi8KLSAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyA9IFNBX05PREVGRVI7Ci0jaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwotICAgICAgICAgICAgaWYgKHN0YWNrLnNzX3NwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaWduYWwgaGFuZGxlciBvbiBhbiBhbHRlcm5hdGUgc2lnbmFsIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgc2lnYWx0c3RhY2soKSAqLwotICAgICAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyB8PSBTQV9PTlNUQUNLOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBlcnIgPSBzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmYWN0aW9uLCAmaGFuZGxlci0+cHJldmlvdXMpOwotI2Vsc2UKLSAgICAgICAgICAgIGhhbmRsZXItPnByZXZpb3VzID0gc2lnbmFsKGhhbmRsZXItPnNpZ251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcik7Ci0gICAgICAgICAgICBlcnIgPSAoaGFuZGxlci0+cHJldmlvdXMgPT0gU0lHX0VSUik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZXItPmVuYWJsZWQgPSAxOwotICAgICAgICB9CisgICAgaWYgKGZhdWx0aGFuZGxlcl9lbmFibGUoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKQEAgLTQzMCwxNCArNTEwLDcgQEAKICAgICAgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDA7CiAgICAgICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKICAgICAgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOwotICAgICAgICAgICAgaWYgKCFoYW5kbGVyLT5lbmFibGVkKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgICAgICAgICAodm9pZClzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOwotI2Vsc2UKLSAgICAgICAgICAgICh2b2lkKXNpZ25hbChoYW5kbGVyLT5zaWdudW0sIGhhbmRsZXItPnByZXZpb3VzKTsKLSNlbmRpZgotICAgICAgICAgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZGlzYWJsZV9mYXRhbF9oYW5kbGVyKGhhbmRsZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NjksNyArNTQyLDYgQEAKIHsKICAgICBQeUxvY2tTdGF0dXMgc3Q7CiAgICAgY29uc3QgY2hhciogZXJybXNnOwotICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnQ7CiAgICAgaW50IG9rOwogI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX1NJR01BU0spICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BUSFJFQURfU0lHTUFTSykKICAgICBzaWdzZXRfdCBzZXQ7CkBAIC00ODksMTIgKzU2MSw5IEBACiAgICAgICAgIC8qIFRpbWVvdXQgPT4gZHVtcCB0cmFjZWJhY2sgKi8KICAgICAgICAgYXNzZXJ0KHN0ID09IFBZX0xPQ0tfRkFJTFVSRSk7CiAKLSAgICAgICAgLyogZ2V0IHRoZSB0aHJlYWQgaG9sZGluZyB0aGUgR0lMLCBOVUxMIGlmIG5vIHRocmVhZCBob2xkIHRoZSBHSUwgKi8KLSAgICAgICAgY3VycmVudCA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwotCiAgICAgICAgIF9QeV93cml0ZV9ub3JhaXNlKHRocmVhZC5mZCwgdGhyZWFkLmhlYWRlciwgKGludCl0aHJlYWQuaGVhZGVyX2xlbik7CiAKLSAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKHRocmVhZC5mZCwgdGhyZWFkLmludGVycCwgY3VycmVudCk7CisgICAgICAgIGVycm1zZyA9IF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyh0aHJlYWQuZmQsIHRocmVhZC5pbnRlcnAsIE5VTEwpOwogICAgICAgICBvayA9IChlcnJtc2cgPT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHRocmVhZC5leGl0KQpAQCAtODk0LDcgKzk2Myw3IEBACiBmYXVsdGhhbmRsZXJfc2lnc2VndihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgaW50IHJlbGVhc2VfZ2lsID0gMDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9yZWFkX251bGwiLCAmcmVsZWFzZV9naWwpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X3NpZ3NlZ3YiLCAmcmVsZWFzZV9naWwpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChyZWxlYXNlX2dpbCkgewpAQCAtOTA3LDYgKzk3Niw0OSBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisjaWZkZWYgV0lUSF9USFJFQUQKK3N0YXRpYyB2b2lkCitmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfdGhyZWFkKHZvaWQgKnBsb2NrKQoreworICAgIFB5VGhyZWFkX3R5cGVfbG9jayAqbG9jayA9IChQeVRocmVhZF90eXBlX2xvY2sgKilwbG9jazsKKworICAgIFB5X0ZhdGFsRXJyb3IoImluIG5ldyB0aHJlYWQiKTsKKworICAgIC8qIG5vdGlmeSB0aGUgY2FsbGVyIHRoYXQgd2UgYXJlIGRvbmUgKi8KKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobG9jayk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfY190aHJlYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGxvbmcgdGhyZWFkOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworCisgICAgZmF1bHRoYW5kbGVyX3N1cHByZXNzX2NyYXNoX3JlcG9ydCgpOworCisgICAgbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAobG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhsb2NrLCBXQUlUX0xPQ0spOworCisgICAgdGhyZWFkID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfdGhyZWFkLCBsb2NrKTsKKyAgICBpZiAodGhyZWFkID09IC0xKSB7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhsb2NrKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInVuYWJsZSB0byBzdGFydCB0aGUgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIHdhaXQgdW50aWwgdGhlIHRocmVhZCBjb21wbGV0ZXM6IGl0IHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIFB5X0ZhdGFsRXJyb3IoKQorICAgICAgIGV4aXRzIHRoZSBwcm9jZXNzIGltbWVkaWFsdHkuICovCisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGxvY2ssIFdBSVRfTE9DSyk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGxvY2spOworICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhsb2NrKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorI2VuZGlmCisKIHN0YXRpYyBQeU9iamVjdCAqCiBmYXVsdGhhbmRsZXJfc2lnZnBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTk1MSw2ICsxMDYzLDggQEAKIH0KIAogI2lmIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgJiYgZGVmaW5lZChIQVZFX1NJR0FDVElPTikKKyNkZWZpbmUgRkFVTFRIQU5ETEVSX1NUQUNLX09WRVJGTE9XCisKICNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCiAgICAvKiBJc3N1ZSAjMjM2NTQ6IFR1cm4gb2ZmIElDQydzIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gZm9yIHRoZQogICAgICogc3RhY2tfb3ZlcmZsb3cgZ2VuZXJhdG9yLiBJQ0MgdHVybnMgdGhlIHJlY3Vyc2l2ZSB0YWlsIGNhbGwgaW50bwpAQCAtOTk0LDcgKzExMDgsNyBAQAogICAgICAgICBzaXplLCBkZXB0aCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci0jZW5kaWYKKyNlbmRpZiAgIC8qIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgJiYgZGVmaW5lZChIQVZFX1NJR0FDVElPTikgKi8KIAogCiBzdGF0aWMgaW50CkBAIC0xMDE3LDEyICsxMTMxLDI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBNU19XSU5ET1dTCitzdGF0aWMgUHlPYmplY3QgKgorZmF1bHRoYW5kbGVyX3JhaXNlX2V4Y2VwdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGNvZGUsIGZsYWdzID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkl8STpfcmFpc2VfZXhjZXB0aW9uIiwgJmNvZGUsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZhdWx0aGFuZGxlcl9zdXBwcmVzc19jcmFzaF9yZXBvcnQoKTsKKyAgICBSYWlzZUV4Y2VwdGlvbihjb2RlLCBmbGFncywgMCwgTlVMTCk7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisjZW5kaWYKKwogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiAiZmF1bHRoYW5kbGVyIG1vZHVsZS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICAgeyJlbmFibGUiLAotICAgICAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX2VuYWJsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfcHlfZW5hYmxlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJlbmFibGUoZmlsZT1zeXMuc3RkZXJyLCBhbGxfdGhyZWFkcz1UcnVlKTogIgogICAgICAgICAgICAgICAgImVuYWJsZSB0aGUgZmF1bHQgaGFuZGxlciIpfSwKICAgICB7ImRpc2FibGUiLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX2Rpc2FibGVfcHksIE1FVEhfTk9BUkdTLApAQCAtMTA2NSwxNiArMTE5MiwyNSBAQAogICAgICAgICAgICAgICAgImEgU0lHU0VHViBvciBTSUdCVVMgc2lnbmFsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0iKX0sCiAgICAgeyJfc2lnc2VndiIsIGZhdWx0aGFuZGxlcl9zaWdzZWd2LCBNRVRIX1ZBUkFSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ3NlZ3YocmVsZWFzZV9naWw9RmFsc2UpOiByYWlzZSBhIFNJR1NFR1Ygc2lnbmFsIil9LAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgeyJfZmF0YWxfZXJyb3JfY190aHJlYWQiLCBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfY190aHJlYWQsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoImZhdGFsX2Vycm9yX2NfdGhyZWFkKCk6ICIKKyAgICAgICAgICAgICAgICJjYWxsIFB5X0ZhdGFsRXJyb3IoKSBpbiBhIG5ldyBDIHRocmVhZC4iKX0sCisjZW5kaWYKICAgICB7Il9zaWdhYnJ0IiwgZmF1bHRoYW5kbGVyX3NpZ2FicnQsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIl9zaWdhYnJ0KCk6IHJhaXNlIGEgU0lHQUJSVCBzaWduYWwiKX0sCiAgICAgeyJfc2lnZnBlIiwgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9zaWdmcGUsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIl9zaWdmcGUoKTogcmFpc2UgYSBTSUdGUEUgc2lnbmFsIil9LAogICAgIHsiX2ZhdGFsX2Vycm9yIiwgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX3B5LCBNRVRIX1ZBUkFSR1MsCiAgICAgIFB5RG9jX1NUUigiX2ZhdGFsX2Vycm9yKG1lc3NhZ2UpOiBjYWxsIFB5X0ZhdGFsRXJyb3IobWVzc2FnZSkiKX0sCi0jaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQorI2lmZGVmIEZBVUxUSEFORExFUl9TVEFDS19PVkVSRkxPVwogICAgIHsiX3N0YWNrX292ZXJmbG93IiwgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9zdGFja19vdmVyZmxvdywgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3N0YWNrX292ZXJmbG93KCk6IHJlY3Vyc2l2ZSBjYWxsIHRvIHJhaXNlIGEgc3RhY2sgb3ZlcmZsb3ciKX0sCiAjZW5kaWYKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgeyJfcmFpc2VfZXhjZXB0aW9uIiwgZmF1bHRoYW5kbGVyX3JhaXNlX2V4Y2VwdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoInJhaXNlX2V4Y2VwdGlvbihjb2RlLCBmbGFncz0wKTogQ2FsbCBSYWlzZUV4Y2VwdGlvbihjb2RlLCBmbGFncykuIil9LAorI2VuZGlmCiAgICAge05VTEwsIE5VTEx9ICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtMTA5Myw3ICsxMjI5LDMzIEBACiBQeU1PRElOSVRfRlVOQwogUHlJbml0X2ZhdWx0aGFuZGxlcih2b2lkKQogewotICAgIHJldHVybiBQeU1vZHVsZV9DcmVhdGUoJm1vZHVsZV9kZWYpOworICAgIFB5T2JqZWN0ICptID0gUHlNb2R1bGVfQ3JlYXRlKCZtb2R1bGVfZGVmKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEFkZCBjb25zdGFudHMgZm9yIHVuaXQgdGVzdHMgKi8KKyNpZmRlZiBNU19XSU5ET1dTCisgICAgLyogUmFpc2VFeGNlcHRpb24oKSBjb2RlcyAocHJlZml4ZWQgYnkgYW4gdW5kZXJzY29yZSkgKi8KKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFJhaXNlRXhjZXB0aW9uKCkgZmxhZ3MgKHByZWZpeGVkIGJ5IGFuIHVuZGVyc2NvcmUpICovCisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT04pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorCisgICAgcmV0dXJuIG07CiB9CiAKIC8qIENhbGwgZmF1bHRoYW5kbGVyLmVuYWJsZSgpIGlmIHRoZSBQWVRIT05GQVVMVEhBTkRMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCBjYjcyMjJkLi4wYzZmNDQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC03MzgsNyArNzM4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQorZGVidWdfY3ljbGUoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlTeXNfRm9ybWF0U3RkZXJyKCJnYzogJXMgPCVzICVwPlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBQeV9UWVBFKG9wKS0+dHBfbmFtZSwgb3ApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IGQ4MTY3ZWEuLmI2ZmI1M2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICosIGludCk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlcihjb25zdCBjaGFyICopOwogCi1zdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaV9lcnJsaXN0W10gPSB7CiAgICAgInN1Y2Nlc3MuIiwKICAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KICAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIEVSUihlcnIpIHsgZXJyb3IgPSAoZXJyKTsgZ290byBiYWQ7IH0KIAotY2hhciAqCitjb25zdCBjaGFyICoKIGdhaV9zdHJlcnJvcihpbnQgZWNvZGUpCiB7CiAgICAgaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDE4ZGViNjAuLjY1YjQ3YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC00NjAsOCArNDYwLDggQEAKIHsKICAgICBleHRlcm4gd2NoYXJfdCAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKLSAgICBzdGF0aWMgd2NoYXJfdCBkZWxpbWl0ZXJbMl0gPSB7REVMSU0sICdcMCd9OwotICAgIHN0YXRpYyB3Y2hhcl90IHNlcGFyYXRvclsyXSA9IHtTRVAsICdcMCd9OworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CiAgICAgY2hhciAqX3J0cHlwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7IC8qIFhYWCB1c2Ugd2lkZSB2ZXJzaW9uIG9uIFdpbmRvd3MgKi8KICAgICB3Y2hhcl90ICpydHB5cGF0aCA9IE5VTEw7CiAgICAgd2NoYXJfdCAqaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ3JwbW9kdWxlLmMgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCmluZGV4IDQwM2U0MzQuLjVhZDg3ZjEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ3JwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwpAQCAtMTAwLDE0ICsxMDAsMjUgQEAKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwogCi0gICAgcHlfaW50X2lkID0gUHlOdW1iZXJfTG9uZyhpZCk7Ci0gICAgaWYgKCFweV9pbnRfaWQpCisgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihpZCwgJmdpZCkpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghX1B5X0dpZF9Db252ZXJ0ZXIocHlfaW50X2lkLCAmZ2lkKSkgeworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIGlkIG11c3QgYmUgaW50LCBub3QgJS4yMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+b2JfdHlwZS0+dHBfbmFtZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBweV9pbnRfaWQgPSBQeU51bWJlcl9Mb25nKGlkKTsKKyAgICAgICAgaWYgKCFweV9pbnRfaWQpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihweV9pbnRfaWQsICZnaWQpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocHlfaW50X2lkKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRihweV9pbnRfaWQpOwotICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfREVDUkVGKHB5X2ludF9pZCk7CiAKICAgICBpZiAoKHAgPSBnZXRncmdpZChnaWQpKSA9PSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpnaWRfb2JqID0gX1B5TG9uZ19Gcm9tR2lkKGdpZCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2hhc2h0YWJsZS5jIGIvTW9kdWxlcy9oYXNodGFibGUuYwppbmRleCAxMzNmMzEzLi5iNTNjYzI0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2hhc2h0YWJsZS5jCisrKyBiL01vZHVsZXMvaGFzaHRhYmxlLmMKQEAgLTEsNSArMSw1IEBACi0vKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2ggdGFibGUgKF9QeV9oYXNodGFibGVfdCkgaXMgYmFzZWQgb24gdGhlIGNmdWhhc2gKLSAgIHByb2plY3Q6CisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGhhc2ggdGFibGUgKF9QeV9oYXNodGFibGVfdCkgaXMgYmFzZWQgb24gdGhlCisgICBjZnVoYXNoIHByb2plY3Q6CiAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYmNmdS8KIAogICAgQ29weXJpZ2h0IG9mIGNmdWhhc2g6CkBAIC01OSw3ICs1OSwyMSBAQAogI2RlZmluZSBFTlRSWV9ORVhUKEVOVFJZKSBcCiAgICAgICAgICgoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICopX1B5X1NMSVNUX0lURU1fTkVYVChFTlRSWSkpCiAjZGVmaW5lIEhBU0hUQUJMRV9JVEVNX1NJWkUoSFQpIFwKLSAgICAgICAgKHNpemVvZihfUHlfaGFzaHRhYmxlX2VudHJ5X3QpICsgKEhUKS0+ZGF0YV9zaXplKQorICAgICAgICAoc2l6ZW9mKF9QeV9oYXNodGFibGVfZW50cnlfdCkgKyAoSFQpLT5rZXlfc2l6ZSArIChIVCktPmRhdGFfc2l6ZSkKKworI2RlZmluZSBFTlRSWV9SRUFEX1BEQVRBKFRBQkxFLCBFTlRSWSwgREFUQV9TSVpFLCBQREFUQSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoKERBVEFfU0laRSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoKFBEQVRBKSwgX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQShUQUJMRSwgKEVOVFJZKSksIFwKKyAgICAgICAgICAgICAgICAgIChEQVRBX1NJWkUpKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRU5UUllfV1JJVEVfUERBVEEoVEFCTEUsIEVOVFJZLCBEQVRBX1NJWkUsIFBEQVRBKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydCgoREFUQV9TSVpFKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgodm9pZCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoKFRBQkxFKSwgKEVOVFJZKSksIFwKKyAgICAgICAgICAgICAgICAgIChQREFUQSksIChEQVRBX1NJWkUpKTsgXAorICAgIH0gd2hpbGUgKDApCiAKIC8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KIHN0YXRpYyB2b2lkIGhhc2h0YWJsZV9yZWhhc2goX1B5X2hhc2h0YWJsZV90ICpodCk7CkBAIC03MCw2ICs4NCw3IEBACiAgICAgbGlzdC0+aGVhZCA9IE5VTEw7CiB9CiAKKwogc3RhdGljIHZvaWQKIF9QeV9zbGlzdF9wcmVwZW5kKF9QeV9zbGlzdF90ICpsaXN0LCBfUHlfc2xpc3RfaXRlbV90ICppdGVtKQogewpAQCAtNzcsNiArOTIsNyBAQAogICAgIGxpc3QtPmhlYWQgPSBpdGVtOwogfQogCisKIHN0YXRpYyB2b2lkCiBfUHlfc2xpc3RfcmVtb3ZlKF9QeV9zbGlzdF90ICpsaXN0LCBfUHlfc2xpc3RfaXRlbV90ICpwcmV2aW91cywKICAgICAgICAgICAgICAgICAgX1B5X3NsaXN0X2l0ZW1fdCAqaXRlbSkKQEAgLTg3LDI0ICsxMDMsMjYgQEAKICAgICAgICAgbGlzdC0+aGVhZCA9IGl0ZW0tPm5leHQ7CiB9CiAKLVB5X3VoYXNoX3QKLV9QeV9oYXNodGFibGVfaGFzaF9pbnQoY29uc3Qgdm9pZCAqa2V5KQotewotICAgIHJldHVybiAoUHlfdWhhc2hfdClrZXk7Ci19CiAKIFB5X3VoYXNoX3QKLV9QeV9oYXNodGFibGVfaGFzaF9wdHIoY29uc3Qgdm9pZCAqa2V5KQorX1B5X2hhc2h0YWJsZV9oYXNoX3B0cihzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSkKIHsKLSAgICByZXR1cm4gKFB5X3VoYXNoX3QpX1B5X0hhc2hQb2ludGVyKCh2b2lkICopa2V5KTsKKyAgICB2b2lkICprZXk7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBrZXkpOworICAgIHJldHVybiAoUHlfdWhhc2hfdClfUHlfSGFzaFBvaW50ZXIoa2V5KTsKIH0KIAorCiBpbnQKLV9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQorX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQogewotICAgIHJldHVybiBlbnRyeS0+a2V5ID09IGtleTsKKyAgICBjb25zdCB2b2lkICpwa2V5MiA9IF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShlbnRyeSk7CisgICAgcmV0dXJuIChtZW1jbXAocGtleSwgcGtleTIsIGh0LT5rZXlfc2l6ZSkgPT0gMCk7CiB9CiAKKwogLyogbWFrZXMgc3VyZSB0aGUgcmVhbCBzaXplIG9mIHRoZSBidWNrZXRzIGFycmF5IGlzIGEgcG93ZXIgb2YgMiAqLwogc3RhdGljIHNpemVfdAogcm91bmRfc2l6ZShzaXplX3QgcykKQEAgLTExOCwxMyArMTM2LDEyIEBACiAgICAgcmV0dXJuIGk7CiB9CiAKKwogX1B5X2hhc2h0YWJsZV90ICoKLV9QeV9oYXNodGFibGVfbmV3X2Z1bGwoc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IGluaXRfc2l6ZSwKK19QeV9oYXNodGFibGVfbmV3X2Z1bGwoc2l6ZV90IGtleV9zaXplLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5pdF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb3B5X2RhdGFfZnVuYyBjb3B5X2RhdGFfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9mcmVlX2RhdGFfZnVuYyBmcmVlX2RhdGFfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9nZXRfZGF0YV9zaXplX2Z1bmMgZ2V0X2RhdGFfc2l6ZV9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2FsbG9jYXRvcl90ICphbGxvY2F0b3IpCiB7CiAgICAgX1B5X2hhc2h0YWJsZV90ICpodDsKQEAgLTE0NCw2ICsxNjEsNyBAQAogCiAgICAgaHQtPm51bV9idWNrZXRzID0gcm91bmRfc2l6ZShpbml0X3NpemUpOwogICAgIGh0LT5lbnRyaWVzID0gMDsKKyAgICBodC0+a2V5X3NpemUgPSBrZXlfc2l6ZTsKICAgICBodC0+ZGF0YV9zaXplID0gZGF0YV9zaXplOwogCiAgICAgYnVja2V0c19zaXplID0gaHQtPm51bV9idWNrZXRzICogc2l6ZW9mKGh0LT5idWNrZXRzWzBdKTsKQEAgLTE1NiwyOCArMTc0LDI3IEBACiAKICAgICBodC0+aGFzaF9mdW5jID0gaGFzaF9mdW5jOwogICAgIGh0LT5jb21wYXJlX2Z1bmMgPSBjb21wYXJlX2Z1bmM7Ci0gICAgaHQtPmNvcHlfZGF0YV9mdW5jID0gY29weV9kYXRhX2Z1bmM7Ci0gICAgaHQtPmZyZWVfZGF0YV9mdW5jID0gZnJlZV9kYXRhX2Z1bmM7Ci0gICAgaHQtPmdldF9kYXRhX3NpemVfZnVuYyA9IGdldF9kYXRhX3NpemVfZnVuYzsKICAgICBodC0+YWxsb2MgPSBhbGxvYzsKICAgICByZXR1cm4gaHQ7CiB9CiAKKwogX1B5X2hhc2h0YWJsZV90ICoKLV9QeV9oYXNodGFibGVfbmV3KHNpemVfdCBkYXRhX3NpemUsCitfUHlfaGFzaHRhYmxlX25ldyhzaXplX3Qga2V5X3NpemUsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMpCiB7Ci0gICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoZGF0YV9zaXplLCBIQVNIVEFCTEVfTUlOX1NJWkUsCisgICAgcmV0dXJuIF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoa2V5X3NpemUsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQVNIVEFCTEVfTUlOX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF9mdW5jLCBjb21wYXJlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiB9CiAKKwogc2l6ZV90CiBfUHlfaGFzaHRhYmxlX3NpemUoX1B5X2hhc2h0YWJsZV90ICpodCkKIHsKICAgICBzaXplX3Qgc2l6ZTsKLSAgICBzaXplX3QgaHY7CiAKICAgICBzaXplID0gc2l6ZW9mKF9QeV9oYXNodGFibGVfdCk7CiAKQEAgLTE4NywyMiArMjA0LDEwIEBACiAgICAgLyogZW50cmllcyAqLwogICAgIHNpemUgKz0gaHQtPmVudHJpZXMgKiBIQVNIVEFCTEVfSVRFTV9TSVpFKGh0KTsKIAotICAgIC8qIGRhdGEgbGlua2VkIGZyb20gZW50cmllcyAqLwotICAgIGlmIChodC0+Z2V0X2RhdGFfc2l6ZV9mdW5jKSB7Ci0gICAgICAgIGZvciAoaHYgPSAwOyBodiA8IGh0LT5udW1fYnVja2V0czsgaHYrKykgewotICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKLQotICAgICAgICAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGh2KTsgZW50cnk7IGVudHJ5ID0gRU5UUllfTkVYVChlbnRyeSkpIHsKLSAgICAgICAgICAgICAgICB2b2lkICpkYXRhOwotCi0gICAgICAgICAgICAgICAgZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpOwotICAgICAgICAgICAgICAgIHNpemUgKz0gaHQtPmdldF9kYXRhX3NpemVfZnVuYyhkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KICAgICByZXR1cm4gc2l6ZTsKIH0KIAorCiAjaWZkZWYgUHlfREVCVUcKIHZvaWQKIF9QeV9oYXNodGFibGVfcHJpbnRfc3RhdHMoX1B5X2hhc2h0YWJsZV90ICpodCkKQEAgLTI0MywzOCArMjQ4LDQ1IEBACiB9CiAjZW5kaWYKIAotLyogR2V0IGFuIGVudHJ5LiBSZXR1cm4gTlVMTCBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LiAqLworCiBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKgotX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5KQorX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSkKIHsKICAgICBQeV91aGFzaF90IGtleV9oYXNoOwogICAgIHNpemVfdCBpbmRleDsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwogCi0gICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGtleSk7CisgICAgYXNzZXJ0KGtleV9zaXplID09IGh0LT5rZXlfc2l6ZSk7CisKKyAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoaHQsIHBrZXkpOwogICAgIGluZGV4ID0ga2V5X2hhc2ggJiAoaHQtPm51bV9idWNrZXRzIC0gMSk7CiAKICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaW5kZXgpOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhrZXksIGVudHJ5KSkKKyAgICAgICAgaWYgKGVudHJ5LT5rZXlfaGFzaCA9PSBrZXlfaGFzaCAmJiBodC0+Y29tcGFyZV9mdW5jKGh0LCBwa2V5LCBlbnRyeSkpCiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICByZXR1cm4gZW50cnk7CiB9CiAKKwogc3RhdGljIGludAotX2hhc2h0YWJsZV9wb3BfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQorX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoX1B5X2hhc2h0YWJsZV90ICpodCwgc2l6ZV90IGtleV9zaXplLCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKIHsKICAgICBQeV91aGFzaF90IGtleV9oYXNoOwogICAgIHNpemVfdCBpbmRleDsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCAqcHJldmlvdXM7CiAKLSAgICBrZXlfaGFzaCA9IGh0LT5oYXNoX2Z1bmMoa2V5KTsKKyAgICBhc3NlcnQoa2V5X3NpemUgPT0gaHQtPmtleV9zaXplKTsKKworICAgIGtleV9oYXNoID0gaHQtPmhhc2hfZnVuYyhodCwgcGtleSk7CiAgICAgaW5kZXggPSBrZXlfaGFzaCAmIChodC0+bnVtX2J1Y2tldHMgLSAxKTsKIAogICAgIHByZXZpb3VzID0gTlVMTDsKICAgICBmb3IgKGVudHJ5ID0gVEFCTEVfSEVBRChodCwgaW5kZXgpOyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IEVOVFJZX05FWFQoZW50cnkpKSB7Ci0gICAgICAgIGlmIChlbnRyeS0+a2V5X2hhc2ggPT0ga2V5X2hhc2ggJiYgaHQtPmNvbXBhcmVfZnVuYyhrZXksIGVudHJ5KSkKKyAgICAgICAgaWYgKGVudHJ5LT5rZXlfaGFzaCA9PSBrZXlfaGFzaCAmJiBodC0+Y29tcGFyZV9mdW5jKGh0LCBwa2V5LCBlbnRyeSkpCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgcHJldmlvdXMgPSBlbnRyeTsKICAgICB9CkBAIC0yODcsNyArMjk5LDcgQEAKICAgICBodC0+ZW50cmllcy0tOwogCiAgICAgaWYgKGRhdGEgIT0gTlVMTCkKLSAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEoaHQsIGRhdGEsIGRhdGFfc2l6ZSwgZW50cnkpOworICAgICAgICBFTlRSWV9SRUFEX1BEQVRBKGh0LCBlbnRyeSwgZGF0YV9zaXplLCBkYXRhKTsKICAgICBodC0+YWxsb2MuZnJlZShlbnRyeSk7CiAKICAgICBpZiAoKGZsb2F0KWh0LT5lbnRyaWVzIC8gKGZsb2F0KWh0LT5udW1fYnVja2V0cyA8IEhBU0hUQUJMRV9MT1cpCkBAIC0yOTUsMjYgKzMwNywyNyBAQAogICAgIHJldHVybiAxOwogfQogCi0vKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGhhc2guIFRoZSBrZXkgbXVzdCBub3QgYmUgcHJlc2VudCBpbiB0aGUgaGFzaCB0YWJsZS4KLSAgIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIG1lbW9yeSBlcnJvci4gKi8KKwogaW50Ci1fUHlfaGFzaHRhYmxlX3NldChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICprZXksCi0gICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQorX1B5X2hhc2h0YWJsZV9zZXQoX1B5X2hhc2h0YWJsZV90ICpodCwgc2l6ZV90IGtleV9zaXplLCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3Qgdm9pZCAqZGF0YSkKIHsKICAgICBQeV91aGFzaF90IGtleV9oYXNoOwogICAgIHNpemVfdCBpbmRleDsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwogCisgICAgYXNzZXJ0KGtleV9zaXplID09IGh0LT5rZXlfc2l6ZSk7CisKICAgICBhc3NlcnQoZGF0YSAhPSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSAwKTsKICNpZm5kZWYgTkRFQlVHCiAgICAgLyogRG9uJ3Qgd3JpdGUgdGhlIGFzc2VydGlvbiBvbiBhIHNpbmdsZSBsaW5lIGJlY2F1c2UgaXQgaXMgaW50ZXJlc3RpbmcKICAgICAgICB0byBrbm93IHRoZSBkdXBsaWNhdGVkIGVudHJ5IGlmIHRoZSBhc3NlcnRpb24gZmFpbGVkLiBUaGUgZW50cnkgY2FuCiAgICAgICAgYmUgcmVhZCB1c2luZyBhIGRlYnVnZ2VyLiAqLwotICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoaHQsIGtleSk7CisgICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShodCwga2V5X3NpemUsIHBrZXkpOwogICAgIGFzc2VydChlbnRyeSA9PSBOVUxMKTsKICNlbmRpZgogCi0gICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGtleSk7CisgICAga2V5X2hhc2ggPSBodC0+aGFzaF9mdW5jKGh0LCBwa2V5KTsKICAgICBpbmRleCA9IGtleV9oYXNoICYgKGh0LT5udW1fYnVja2V0cyAtIDEpOwogCiAgICAgZW50cnkgPSBodC0+YWxsb2MubWFsbG9jKEhBU0hUQUJMRV9JVEVNX1NJWkUoaHQpKTsKQEAgLTMyMywxMSArMzM2LDkgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGVudHJ5LT5rZXkgPSAodm9pZCAqKWtleTsKICAgICBlbnRyeS0+a2V5X2hhc2ggPSBrZXlfaGFzaDsKLQotICAgIGFzc2VydChkYXRhX3NpemUgPT0gaHQtPmRhdGFfc2l6ZSk7Ci0gICAgbWVtY3B5KF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShlbnRyeSksIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgUHlfTUVNQ1BZKCh2b2lkICopX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKGVudHJ5KSwgcGtleSwgaHQtPmtleV9zaXplKTsKKyAgICBFTlRSWV9XUklURV9QREFUQShodCwgZW50cnksIGRhdGFfc2l6ZSwgZGF0YSk7CiAKICAgICBfUHlfc2xpc3RfcHJlcGVuZCgmaHQtPmJ1Y2tldHNbaW5kZXhdLCAoX1B5X3NsaXN0X2l0ZW1fdCopZW50cnkpOwogICAgIGh0LT5lbnRyaWVzKys7CkBAIC0zMzcsNDggKzM0OCw1MCBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiBHZXQgZGF0YSBmcm9tIGFuIGVudHJ5LiBDb3B5IGVudHJ5IGRhdGEgaW50byBkYXRhIGFuZCByZXR1cm4gMSBpZiB0aGUgZW50cnkKLSAgIGV4aXN0cywgcmV0dXJuIDAgaWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LiAqLworCiBpbnQKLV9QeV9oYXNodGFibGVfZ2V0KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSwgdm9pZCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkKK19QeV9oYXNodGFibGVfZ2V0KF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSxjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKIHsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwogCiAgICAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CiAKLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KGh0LCBrZXkpOworICAgIGVudHJ5ID0gX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5KTsKICAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEoaHQsIGRhdGEsIGRhdGFfc2l6ZSwgZW50cnkpOworICAgIEVOVFJZX1JFQURfUERBVEEoaHQsIGVudHJ5LCBkYXRhX3NpemUsIGRhdGEpOwogICAgIHJldHVybiAxOwogfQogCisKIGludAotX1B5X2hhc2h0YWJsZV9wb3AoX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqa2V5LCB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9zaXplKQorX1B5X2hhc2h0YWJsZV9wb3AoX1B5X2hhc2h0YWJsZV90ICpodCwgc2l6ZV90IGtleV9zaXplLCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdm9pZCAqZGF0YSkKIHsKICAgICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKLSAgICBhc3NlcnQoaHQtPmZyZWVfZGF0YV9mdW5jID09IE5VTEwpOwotICAgIHJldHVybiBfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5LCBkYXRhLCBkYXRhX3NpemUpOworICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5X3NpemUsIHBrZXksIGRhdGEsIGRhdGFfc2l6ZSk7CiB9CiAKLS8qIERlbGV0ZSBhbiBlbnRyeS4gVGhlIGVudHJ5IG11c3QgZXhpc3QuICovCisKKy8qIENvZGUgY29tbWVudGVkIHNpbmNlIHRoZSBmdW5jdGlvbiBpcyBub3QgbmVlZGVkIGluIFB5dGhvbiAqLworI2lmIDAKIHZvaWQKLV9QeV9oYXNodGFibGVfZGVsZXRlKF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKmtleSkKK19QeV9oYXNodGFibGVfZGVsZXRlKF9QeV9oYXNodGFibGVfdCAqaHQsIHNpemVfdCBrZXlfc2l6ZSwgY29uc3Qgdm9pZCAqcGtleSkKIHsKICNpZm5kZWYgTkRFQlVHCi0gICAgaW50IGZvdW5kID0gX2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleSwgTlVMTCwgMCk7CisgICAgaW50IGZvdW5kID0gX1B5X2hhc2h0YWJsZV9wb3BfZW50cnkoaHQsIGtleV9zaXplLCBwa2V5LCBOVUxMLCAwKTsKICAgICBhc3NlcnQoZm91bmQpOwogI2Vsc2UKLSAgICAodm9pZClfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5LCBOVUxMLCAwKTsKKyAgICAodm9pZClfUHlfaGFzaHRhYmxlX3BvcF9lbnRyeShodCwga2V5X3NpemUsIHBrZXksIE5VTEwsIDApOwogI2VuZGlmCiB9CisjZW5kaWYKIAotLyogUHJvdG90eXBlIGZvciBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yZWFjaAotICAga2V5L3ZhbHVlIHBhaXIgaW4gdGhlIGhhc2ggYnkgaGFzaHRhYmxlX2ZvcmVhY2goKS4gIEl0ZXJhdGlvbgotICAgc3RvcHMgaWYgYSBub24temVybyB2YWx1ZSBpcyByZXR1cm5lZC4gKi8KKwogaW50CiBfUHlfaGFzaHRhYmxlX2ZvcmVhY2goX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpmdW5jKSAoX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwgdm9pZCAqYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2hfZnVuYyBmdW5jLAogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZykKIHsKICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5OwpAQCAtMzg2LDcgKzM5OSw3IEBACiAKICAgICBmb3IgKGh2ID0gMDsgaHYgPCBodC0+bnVtX2J1Y2tldHM7IGh2KyspIHsKICAgICAgICAgZm9yIChlbnRyeSA9IFRBQkxFX0hFQUQoaHQsIGh2KTsgZW50cnk7IGVudHJ5ID0gRU5UUllfTkVYVChlbnRyeSkpIHsKLSAgICAgICAgICAgIGludCByZXMgPSBmdW5jKGVudHJ5LCBhcmcpOworICAgICAgICAgICAgaW50IHJlcyA9IGZ1bmMoaHQsIGVudHJ5LCBhcmcpOwogICAgICAgICAgICAgaWYgKHJlcykKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CkBAIC0zOTQsNiArNDA3LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZAogaGFzaHRhYmxlX3JlaGFzaChfUHlfaGFzaHRhYmxlX3QgKmh0KQogewpAQCAtNDI1LDcgKzQzOSw4IEBACiAgICAgICAgIGZvciAoZW50cnkgPSBCVUNLRVRTX0hFQUQob2xkX2J1Y2tldHNbYnVja2V0XSk7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgewogICAgICAgICAgICAgc2l6ZV90IGVudHJ5X2luZGV4OwogCi0gICAgICAgICAgICBhc3NlcnQoaHQtPmhhc2hfZnVuYyhlbnRyeS0+a2V5KSA9PSBlbnRyeS0+a2V5X2hhc2gpOworCisgICAgICAgICAgICBhc3NlcnQoaHQtPmhhc2hfZnVuYyhodCwgX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKGVudHJ5KSkgPT0gZW50cnktPmtleV9oYXNoKTsKICAgICAgICAgICAgIG5leHQgPSBFTlRSWV9ORVhUKGVudHJ5KTsKICAgICAgICAgICAgIGVudHJ5X2luZGV4ID0gZW50cnktPmtleV9oYXNoICYgKG5ld19zaXplIC0gMSk7CiAKQEAgLTQzNiw2ICs0NTEsNyBAQAogICAgIGh0LT5hbGxvYy5mcmVlKG9sZF9idWNrZXRzKTsKIH0KIAorCiB2b2lkCiBfUHlfaGFzaHRhYmxlX2NsZWFyKF9QeV9oYXNodGFibGVfdCAqaHQpCiB7CkBAIC00NDUsOCArNDYxLDYgQEAKICAgICBmb3IgKGk9MDsgaSA8IGh0LT5udW1fYnVja2V0czsgaSsrKSB7CiAgICAgICAgIGZvciAoZW50cnkgPSBUQUJMRV9IRUFEKGh0LCBpKTsgZW50cnkgIT0gTlVMTDsgZW50cnkgPSBuZXh0KSB7CiAgICAgICAgICAgICBuZXh0ID0gRU5UUllfTkVYVChlbnRyeSk7Ci0gICAgICAgICAgICBpZiAoaHQtPmZyZWVfZGF0YV9mdW5jKQotICAgICAgICAgICAgICAgIGh0LT5mcmVlX2RhdGFfZnVuYyhfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KSk7CiAgICAgICAgICAgICBodC0+YWxsb2MuZnJlZShlbnRyeSk7CiAgICAgICAgIH0KICAgICAgICAgX1B5X3NsaXN0X2luaXQoJmh0LT5idWNrZXRzW2ldKTsKQEAgLTQ1NSw2ICs0NjksNyBAQAogICAgIGhhc2h0YWJsZV9yZWhhc2goaHQpOwogfQogCisKIHZvaWQKIF9QeV9oYXNodGFibGVfZGVzdHJveShfUHlfaGFzaHRhYmxlX3QgKmh0KQogewpAQCAtNDY0LDggKzQ3OSw2IEBACiAgICAgICAgIF9QeV9zbGlzdF9pdGVtX3QgKmVudHJ5ID0gaHQtPmJ1Y2tldHNbaV0uaGVhZDsKICAgICAgICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgICAgICBfUHlfc2xpc3RfaXRlbV90ICplbnRyeV9uZXh0ID0gZW50cnktPm5leHQ7Ci0gICAgICAgICAgICBpZiAoaHQtPmZyZWVfZGF0YV9mdW5jKQotICAgICAgICAgICAgICAgIGh0LT5mcmVlX2RhdGFfZnVuYyhfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KSk7CiAgICAgICAgICAgICBodC0+YWxsb2MuZnJlZShlbnRyeSk7CiAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5X25leHQ7CiAgICAgICAgIH0KQEAgLTQ3NSwzOSArNDg4LDMxIEBACiAgICAgaHQtPmFsbG9jLmZyZWUoaHQpOwogfQogCi0vKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBoYXNoIHRhYmxlICovCisKIF9QeV9oYXNodGFibGVfdCAqCiBfUHlfaGFzaHRhYmxlX2NvcHkoX1B5X2hhc2h0YWJsZV90ICpzcmMpCiB7CisgICAgY29uc3Qgc2l6ZV90IGtleV9zaXplID0gc3JjLT5rZXlfc2l6ZTsKKyAgICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gc3JjLT5kYXRhX3NpemU7CiAgICAgX1B5X2hhc2h0YWJsZV90ICpkc3Q7CiAgICAgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeTsKICAgICBzaXplX3QgYnVja2V0OwogICAgIGludCBlcnI7Ci0gICAgdm9pZCAqZGF0YSwgKm5ld19kYXRhOwogCi0gICAgZHN0ID0gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChzcmMtPmRhdGFfc2l6ZSwgc3JjLT5udW1fYnVja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmhhc2hfZnVuYywgc3JjLT5jb21wYXJlX2Z1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT5jb3B5X2RhdGFfZnVuYywgc3JjLT5mcmVlX2RhdGFfZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmdldF9kYXRhX3NpemVfZnVuYywgJnNyYy0+YWxsb2MpOworICAgIGRzdCA9IF9QeV9oYXNodGFibGVfbmV3X2Z1bGwoa2V5X3NpemUsIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+bnVtX2J1Y2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmhhc2hfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+Y29tcGFyZV9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNyYy0+YWxsb2MpOwogICAgIGlmIChkc3QgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBmb3IgKGJ1Y2tldD0wOyBidWNrZXQgPCBzcmMtPm51bV9idWNrZXRzOyBidWNrZXQrKykgewogICAgICAgICBlbnRyeSA9IFRBQkxFX0hFQUQoc3JjLCBidWNrZXQpOwogICAgICAgICBmb3IgKDsgZW50cnk7IGVudHJ5ID0gRU5UUllfTkVYVChlbnRyeSkpIHsKLSAgICAgICAgICAgIGlmIChzcmMtPmNvcHlfZGF0YV9mdW5jKSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQV9BU19WT0lEX1AoZW50cnkpOwotICAgICAgICAgICAgICAgIG5ld19kYXRhID0gc3JjLT5jb3B5X2RhdGFfZnVuYyhkYXRhKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3X2RhdGEgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gX1B5X2hhc2h0YWJsZV9zZXQoZHN0LCBlbnRyeS0+a2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXdfZGF0YSwgc3JjLT5kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEEoZW50cnkpOwotICAgICAgICAgICAgICAgIGVyciA9IF9QeV9oYXNodGFibGVfc2V0KGRzdCwgZW50cnktPmtleSwgZGF0YSwgc3JjLT5kYXRhX3NpemUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGtleSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShlbnRyeSk7CisgICAgICAgICAgICBjb25zdCB2b2lkICpwZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoc3JjLCBlbnRyeSk7CisgICAgICAgICAgICBlcnIgPSBfUHlfaGFzaHRhYmxlX3NldChkc3QsIGtleV9zaXplLCBwa2V5LCBkYXRhX3NpemUsIHBkYXRhKTsKICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koZHN0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUxNiw0ICs1MjEsMyBAQAogICAgIH0KICAgICByZXR1cm4gZHN0OwogfQotCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2hhc2h0YWJsZS5oIGIvTW9kdWxlcy9oYXNodGFibGUuaAppbmRleCBhOWY5OTkzLi4xOGZlZDA5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2hhc2h0YWJsZS5oCisrKyBiL01vZHVsZXMvaGFzaHRhYmxlLmgKQEAgLTEsOSArMSwxMCBAQAogI2lmbmRlZiBQeV9IQVNIVEFCTEVfSAogI2RlZmluZSBQeV9IQVNIVEFCTEVfSAotCiAvKiBUaGUgd2hvbGUgQVBJIGlzIHByaXZhdGUgKi8KICNpZm5kZWYgUHlfTElNSVRFRF9BUEkKIAorLyogU2luZ2xlIGxpbmtlZCBsaXN0ICovCisKIHR5cGVkZWYgc3RydWN0IF9QeV9zbGlzdF9pdGVtX3MgewogICAgIHN0cnVjdCBfUHlfc2xpc3RfaXRlbV9zICpuZXh0OwogfSBfUHlfc2xpc3RfaXRlbV90OwpAQCAtMTYsMzMgKzE3LDY2IEBACiAKICNkZWZpbmUgX1B5X1NMSVNUX0hFQUQoU0xJU1QpICgoKF9QeV9zbGlzdF90ICopU0xJU1QpLT5oZWFkKQogCisKKy8qIF9QeV9oYXNodGFibGU6IHRhYmxlIGVudHJ5ICovCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICAvKiB1c2VkIGJ5IF9QeV9oYXNodGFibGVfdC5idWNrZXRzIHRvIGxpbmsgZW50cmllcyAqLwogICAgIF9QeV9zbGlzdF9pdGVtX3QgX1B5X3NsaXN0X2l0ZW07CiAKLSAgICBjb25zdCB2b2lkICprZXk7CiAgICAgUHlfdWhhc2hfdCBrZXlfaGFzaDsKIAotICAgIC8qIGRhdGEgZm9sbG93cyAqLworICAgIC8qIGtleSAoa2V5X3NpemUgYnl0ZXMpIGFuZCB0aGVuIGRhdGEgKGRhdGFfc2l6ZSBieXRlcykgZm9sbG93cyAqLwogfSBfUHlfaGFzaHRhYmxlX2VudHJ5X3Q7CiAKLSNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKEVOVFJZKSBcCi0gICAgICAgICgoY2hhciAqKShFTlRSWSkgKyBzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSkKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9QS0VZKEVOVFJZKSBcCisgICAgICAgICgoY29uc3Qgdm9pZCAqKSgoY2hhciAqKShFTlRSWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSkpCiAKLSNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBX0FTX1ZPSURfUChFTlRSWSkgXAotICAgICAgICAoKih2b2lkICoqKV9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShFTlRSWSkpCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoVEFCTEUsIEVOVFJZKSBcCisgICAgICAgICgoY29uc3Qgdm9pZCAqKSgoY2hhciAqKShFTlRSWSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyBzaXplb2YoX1B5X2hhc2h0YWJsZV9lbnRyeV90KSBcCisgICAgICAgICAgICAgICAgICAgICAgICArIChUQUJMRSktPmtleV9zaXplKSkKIAotI2RlZmluZSBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfREFUQShUQUJMRSwgREFUQSwgREFUQV9TSVpFLCBFTlRSWSkgXAorLyogR2V0IGEga2V5IHZhbHVlIGZyb20gcGtleTogdXNlIG1lbWNweSgpIHJhdGhlciB0aGFuIGEgcG9pbnRlciBkZXJlZmVyZW5jZQorICAgdG8gYXZvaWQgbWVtb3J5IGFsaWdubWVudCBpc3N1ZXMuICovCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoVEFCTEUsIFBLRVksIERTVF9LRVkpIFwKICAgICBkbyB7IFwKLSAgICAgICAgYXNzZXJ0KChEQVRBX1NJWkUpID09IChUQUJMRSktPmRhdGFfc2l6ZSk7IFwKLSAgICAgICAgbWVtY3B5KERBVEEsIF9QeV9IQVNIVEFCTEVfRU5UUllfREFUQShFTlRSWSksIERBVEFfU0laRSk7IFwKKyAgICAgICAgYXNzZXJ0KHNpemVvZihEU1RfS0VZKSA9PSAoVEFCTEUpLT5rZXlfc2l6ZSk7IFwKKyAgICAgICAgUHlfTUVNQ1BZKCYoRFNUX0tFWSksIChQS0VZKSwgc2l6ZW9mKERTVF9LRVkpKTsgXAogICAgIH0gd2hpbGUgKDApCiAKLXR5cGVkZWYgUHlfdWhhc2hfdCAoKl9QeV9oYXNodGFibGVfaGFzaF9mdW5jKSAoY29uc3Qgdm9pZCAqa2V5KTsKLXR5cGVkZWYgaW50ICgqX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMpIChjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqaGUpOwotdHlwZWRlZiB2b2lkKiAoKl9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMpKHZvaWQgKmRhdGEpOwotdHlwZWRlZiB2b2lkICgqX1B5X2hhc2h0YWJsZV9mcmVlX2RhdGFfZnVuYykodm9pZCAqZGF0YSk7Ci10eXBlZGVmIHNpemVfdCAoKl9QeV9oYXNodGFibGVfZ2V0X2RhdGFfc2l6ZV9mdW5jKSh2b2lkICpkYXRhKTsKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShUQUJMRSwgRU5UUlksIEtFWSkgXAorICAgIGRvIHsgXAorICAgICAgICBhc3NlcnQoc2l6ZW9mKEtFWSkgPT0gKFRBQkxFKS0+a2V5X3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgmKEtFWSksIF9QeV9IQVNIVEFCTEVfRU5UUllfUEtFWShFTlRSWSksIHNpemVvZihLRVkpKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEoVEFCTEUsIEVOVFJZLCBEQVRBKSBcCisgICAgZG8geyBcCisgICAgICAgIGFzc2VydChzaXplb2YoREFUQSkgPT0gKFRBQkxFKS0+ZGF0YV9zaXplKTsgXAorICAgICAgICBQeV9NRU1DUFkoJihEQVRBKSwgX1B5X0hBU0hUQUJMRV9FTlRSWV9QREFUQShUQUJMRSwgKEVOVFJZKSksIFwKKyAgICAgICAgICAgICAgICAgIHNpemVvZihEQVRBKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIF9QeV9IQVNIVEFCTEVfRU5UUllfV1JJVEVfREFUQShUQUJMRSwgRU5UUlksIERBVEEpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgYXNzZXJ0KHNpemVvZihEQVRBKSA9PSAoVEFCTEUpLT5kYXRhX3NpemUpOyBcCisgICAgICAgIFB5X01FTUNQWSgodm9pZCAqKV9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEoKFRBQkxFKSwgKEVOVFJZKSksIFwKKyAgICAgICAgICAgICAgICAgICYoREFUQSksIHNpemVvZihEQVRBKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisKKy8qIF9QeV9oYXNodGFibGU6IHByb3RvdHlwZXMgKi8KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IF9QeV9oYXNodGFibGVfdDsKKwordHlwZWRlZiBQeV91aGFzaF90ICgqX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMpIChzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGtleSk7Cit0eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jKSAoc3RydWN0IF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmhlKTsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIC8qIGFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrICovCkBAIC01Miw3NyArODYsMTI2IEBACiAgICAgdm9pZCAoKmZyZWUpICh2b2lkICpwdHIpOwogfSBfUHlfaGFzaHRhYmxlX2FsbG9jYXRvcl90OwogCi10eXBlZGVmIHN0cnVjdCB7CisKKy8qIF9QeV9oYXNodGFibGU6IHRhYmxlICovCisKK3R5cGVkZWYgc3RydWN0IF9QeV9oYXNodGFibGVfdCB7CiAgICAgc2l6ZV90IG51bV9idWNrZXRzOwogICAgIHNpemVfdCBlbnRyaWVzOyAvKiBUb3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdGFibGUuICovCiAgICAgX1B5X3NsaXN0X3QgKmJ1Y2tldHM7CisgICAgc2l6ZV90IGtleV9zaXplOwogICAgIHNpemVfdCBkYXRhX3NpemU7CiAKICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmM7CiAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jOwotICAgIF9QeV9oYXNodGFibGVfY29weV9kYXRhX2Z1bmMgY29weV9kYXRhX2Z1bmM7Ci0gICAgX1B5X2hhc2h0YWJsZV9mcmVlX2RhdGFfZnVuYyBmcmVlX2RhdGFfZnVuYzsKLSAgICBfUHlfaGFzaHRhYmxlX2dldF9kYXRhX3NpemVfZnVuYyBnZXRfZGF0YV9zaXplX2Z1bmM7CiAgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBhbGxvYzsKIH0gX1B5X2hhc2h0YWJsZV90OwogCi0vKiBoYXNoIGFuZCBjb21wYXJlIGZ1bmN0aW9ucyBmb3IgaW50ZWdlcnMgYW5kIHBvaW50ZXJzICovCi1QeUFQSV9GVU5DKFB5X3VoYXNoX3QpIF9QeV9oYXNodGFibGVfaGFzaF9wdHIoY29uc3Qgdm9pZCAqa2V5KTsKLVB5QVBJX0ZVTkMoUHlfdWhhc2hfdCkgX1B5X2hhc2h0YWJsZV9oYXNoX2ludChjb25zdCB2b2lkICprZXkpOwotUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KTsKKy8qIGhhc2ggYSBwb2ludGVyICh2b2lkKikgKi8KK1B5QVBJX0ZVTkMoUHlfdWhhc2hfdCkgX1B5X2hhc2h0YWJsZV9oYXNoX3B0cigKKyAgICBzdHJ1Y3QgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICBjb25zdCB2b2lkICpwa2V5KTsKKworLyogY29tcGFyaXNvbiB1c2luZyBtZW1jbXAoKSAqLworUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QoCisgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICBjb25zdCB2b2lkICpwa2V5LAorICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpOwogCiBQeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfdCAqKSBfUHlfaGFzaHRhYmxlX25ldygKKyAgICBzaXplX3Qga2V5X3NpemUsCiAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2Z1bmMgY29tcGFyZV9mdW5jKTsKKwogUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX3QgKikgX1B5X2hhc2h0YWJsZV9uZXdfZnVsbCgKKyAgICBzaXplX3Qga2V5X3NpemUsCiAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICBzaXplX3QgaW5pdF9zaXplLAogICAgIF9QeV9oYXNodGFibGVfaGFzaF9mdW5jIGhhc2hfZnVuYywKICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZnVuYyBjb21wYXJlX2Z1bmMsCi0gICAgX1B5X2hhc2h0YWJsZV9jb3B5X2RhdGFfZnVuYyBjb3B5X2RhdGFfZnVuYywKLSAgICBfUHlfaGFzaHRhYmxlX2ZyZWVfZGF0YV9mdW5jIGZyZWVfZGF0YV9mdW5jLAotICAgIF9QeV9oYXNodGFibGVfZ2V0X2RhdGFfc2l6ZV9mdW5jIGdldF9kYXRhX3NpemVfZnVuYywKICAgICBfUHlfaGFzaHRhYmxlX2FsbG9jYXRvcl90ICphbGxvY2F0b3IpOwotUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX3QgKikgX1B5X2hhc2h0YWJsZV9jb3B5KF9QeV9oYXNodGFibGVfdCAqc3JjKTsKLVB5QVBJX0ZVTkModm9pZCkgX1B5X2hhc2h0YWJsZV9jbGVhcihfUHlfaGFzaHRhYmxlX3QgKmh0KTsKKwogUHlBUElfRlVOQyh2b2lkKSBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koX1B5X2hhc2h0YWJsZV90ICpodCk7CiAKLXR5cGVkZWYgaW50ICgqX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMpIChfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICphcmcpOworLyogUmV0dXJuIGEgY29weSBvZiB0aGUgaGFzaCB0YWJsZSAqLworUHlBUElfRlVOQyhfUHlfaGFzaHRhYmxlX3QgKikgX1B5X2hhc2h0YWJsZV9jb3B5KF9QeV9oYXNodGFibGVfdCAqc3JjKTsKIAorUHlBUElfRlVOQyh2b2lkKSBfUHlfaGFzaHRhYmxlX2NsZWFyKF9QeV9oYXNodGFibGVfdCAqaHQpOworCit0eXBlZGVmIGludCAoKl9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jKSAoX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZyk7CisKKy8qIENhbGwgZnVuYygpIG9uIGVhY2ggZW50cnkgb2YgdGhlIGhhc2h0YWJsZS4KKyAgIEl0ZXJhdGlvbiBzdG9wcyBpZiBmdW5jKCkgcmVzdWx0IGlzIG5vbi16ZXJvLCBpbiB0aGlzIGNhc2UgaXQncyB0aGUgcmVzdWx0CisgICBvZiB0aGUgY2FsbC4gT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLiAqLwogUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfZm9yZWFjaCgKICAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIF9QeV9oYXNodGFibGVfZm9yZWFjaF9mdW5jIGZ1bmMsIHZvaWQgKmFyZyk7CisgICAgX1B5X2hhc2h0YWJsZV9mb3JlYWNoX2Z1bmMgZnVuYywKKyAgICB2b2lkICphcmcpOworCiBQeUFQSV9GVU5DKHNpemVfdCkgX1B5X2hhc2h0YWJsZV9zaXplKF9QeV9oYXNodGFibGVfdCAqaHQpOwogCi1QeUFQSV9GVU5DKF9QeV9oYXNodGFibGVfZW50cnlfdCopIF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KAotICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5KTsKKy8qIEFkZCBhIG5ldyBlbnRyeSB0byB0aGUgaGFzaC4gVGhlIGtleSBtdXN0IG5vdCBiZSBwcmVzZW50IGluIHRoZSBoYXNoIHRhYmxlLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gbWVtb3J5IGVycm9yLgorCisgICBEb24ndCBjYWxsIGRpcmVjdGx5IHRoaXMgZnVuY3Rpb24sCisgICBidXQgdXNlIF9QeV9IQVNIVEFCTEVfU0VUKCkgYW5kIF9QeV9IQVNIVEFCTEVfU0VUX05PREFUQSgpIG1hY3JvcyAqLwogUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfc2V0KAogICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCi0gICAgY29uc3Qgdm9pZCAqa2V5LAotICAgIHZvaWQgKmRhdGEsCi0gICAgc2l6ZV90IGRhdGFfc2l6ZSk7Ci1QeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9nZXQoCi0gICAgX1B5X2hhc2h0YWJsZV90ICpodCwKLSAgICBjb25zdCB2b2lkICprZXksCi0gICAgdm9pZCAqZGF0YSwKLSAgICBzaXplX3QgZGF0YV9zaXplKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlfaGFzaHRhYmxlX3BvcCgKLSAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSwKLSAgICB2b2lkICpkYXRhLAotICAgIHNpemVfdCBkYXRhX3NpemUpOwotUHlBUElfRlVOQyh2b2lkKSBfUHlfaGFzaHRhYmxlX2RlbGV0ZSgKLSAgICBfUHlfaGFzaHRhYmxlX3QgKmh0LAotICAgIGNvbnN0IHZvaWQgKmtleSk7CisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICBjb25zdCB2b2lkICpkYXRhKTsKIAogI2RlZmluZSBfUHlfSEFTSFRBQkxFX1NFVChUQUJMRSwgS0VZLCBEQVRBKSBcCi0gICAgX1B5X2hhc2h0YWJsZV9zZXQoVEFCTEUsIEtFWSwgJihEQVRBKSwgc2l6ZW9mKERBVEEpKQorICAgIF9QeV9oYXNodGFibGVfc2V0KFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpLCBzaXplb2YoREFUQSksICYoREFUQSkpCisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKFRBQkxFLCBLRVkpIFwKKyAgICBfUHlfaGFzaHRhYmxlX3NldChUQUJMRSwgc2l6ZW9mKEtFWSksICYoS0VZKSwgMCwgTlVMTCkKKworCisvKiBHZXQgYW4gZW50cnkuCisgICBSZXR1cm4gTlVMTCBpZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0LgorCisgICBEb24ndCBjYWxsIGRpcmVjdGx5IHRoaXMgZnVuY3Rpb24sIGJ1dCB1c2UgX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkoKQorICAgbWFjcm8gKi8KK1B5QVBJX0ZVTkMoX1B5X2hhc2h0YWJsZV9lbnRyeV90KikgX1B5X2hhc2h0YWJsZV9nZXRfZW50cnkoCisgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICBzaXplX3Qga2V5X3NpemUsCisgICAgY29uc3Qgdm9pZCAqcGtleSk7CisKKyNkZWZpbmUgX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkoVEFCTEUsIEtFWSkgXAorICAgIF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KFRBQkxFLCBzaXplb2YoS0VZKSwgJihLRVkpKQorCisKKy8qIEdldCBkYXRhIGZyb20gYW4gZW50cnkuIENvcHkgZW50cnkgZGF0YSBpbnRvIGRhdGEgYW5kIHJldHVybiAxIGlmIHRoZSBlbnRyeQorICAgZXhpc3RzLCByZXR1cm4gMCBpZiB0aGUgZW50cnkgZG9lcyBub3QgZXhpc3QuCisKKyAgIERvbid0IGNhbGwgZGlyZWN0bHkgdGhpcyBmdW5jdGlvbiwgYnV0IHVzZSBfUHlfSEFTSFRBQkxFX0dFVCgpIG1hY3JvICovCitQeUFQSV9GVU5DKGludCkgX1B5X2hhc2h0YWJsZV9nZXQoCisgICAgX1B5X2hhc2h0YWJsZV90ICpodCwKKyAgICBzaXplX3Qga2V5X3NpemUsCisgICAgY29uc3Qgdm9pZCAqcGtleSwKKyAgICBzaXplX3QgZGF0YV9zaXplLAorICAgIHZvaWQgKmRhdGEpOwogCiAjZGVmaW5lIF9QeV9IQVNIVEFCTEVfR0VUKFRBQkxFLCBLRVksIERBVEEpIFwKLSAgICBfUHlfaGFzaHRhYmxlX2dldChUQUJMRSwgS0VZLCAmKERBVEEpLCBzaXplb2YoREFUQSkpCisgICAgX1B5X2hhc2h0YWJsZV9nZXQoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSksIHNpemVvZihEQVRBKSwgJihEQVRBKSkKKworCisvKiBEb24ndCBjYWxsIGRpcmVjdGx5IHRoaXMgZnVuY3Rpb24sIGJ1dCB1c2UgX1B5X0hBU0hUQUJMRV9QT1AoKSBtYWNybyAqLworUHlBUElfRlVOQyhpbnQpIF9QeV9oYXNodGFibGVfcG9wKAorICAgIF9QeV9oYXNodGFibGVfdCAqaHQsCisgICAgc2l6ZV90IGtleV9zaXplLAorICAgIGNvbnN0IHZvaWQgKnBrZXksCisgICAgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICB2b2lkICpkYXRhKTsKKworI2RlZmluZSBfUHlfSEFTSFRBQkxFX1BPUChUQUJMRSwgS0VZLCBEQVRBKSBcCisgICAgX1B5X2hhc2h0YWJsZV9wb3AoVEFCTEUsIHNpemVvZihLRVkpLCAmKEtFWSksIHNpemVvZihEQVRBKSwgJihEQVRBKSkKKwogCiAjZW5kaWYgICAvKiBQeV9MSU1JVEVEX0FQSSAqLwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IDQwOTkyMmEuLmM4MmFkN2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMSw0ICsxLDUgQEAKIAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAic3RydWN0bWVtYmVyLmgiCiAKQEAgLTcsNyArOCw3IEBACiAqLwogCiAKLS8qIGdyb3VwYnkgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZ3JvdXBieSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtNzQsNyArNzUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGdyb3VwYnlfbmV4dChncm91cGJ5b2JqZWN0ICpnYm8pCiB7Ci0gICAgUHlPYmplY3QgKm5ld3ZhbHVlLCAqbmV3a2V5LCAqciwgKmdyb3VwZXIsICp0bXA7CisgICAgUHlPYmplY3QgKm5ld3ZhbHVlLCAqbmV3a2V5LCAqciwgKmdyb3VwZXI7CiAKICAgICAvKiBza2lwIHRvIG5leHQgaXRlcmF0aW9uIGdyb3VwICovCiAgICAgZm9yICg7OykgewpAQCAtODUsOCArODYsNyBAQAogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGludCByY21wOwogCi0gICAgICAgICAgICByY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGdiby0+dGd0a2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYm8tPmN1cnJrZXksIFB5X0VRKTsKKyAgICAgICAgICAgIHJjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZ2JvLT50Z3RrZXksIGdiby0+Y3VycmtleSwgUHlfRVEpOwogICAgICAgICAgICAgaWYgKHJjbXAgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBlbHNlIGlmIChyY21wID09IDApCkBAIC0xMDEsMjcgKzEwMSwxOSBAQAogICAgICAgICAgICAgbmV3a2V5ID0gbmV3dmFsdWU7CiAgICAgICAgICAgICBQeV9JTkNSRUYobmV3dmFsdWUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3ZhbHVlLCBOVUxMKTsKKyAgICAgICAgICAgIG5ld2tleSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoZ2JvLT5rZXlmdW5jLCBuZXd2YWx1ZSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAobmV3a2V5ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3dmFsdWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgdG1wID0gZ2JvLT5jdXJya2V5OwotICAgICAgICBnYm8tPmN1cnJrZXkgPSBuZXdrZXk7Ci0gICAgICAgIFB5X1hERUNSRUYodG1wKTsKLQotICAgICAgICB0bXAgPSBnYm8tPmN1cnJ2YWx1ZTsKLSAgICAgICAgZ2JvLT5jdXJydmFsdWUgPSBuZXd2YWx1ZTsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKGdiby0+Y3VycmtleSwgbmV3a2V5KTsKKyAgICAgICAgUHlfWFNFVFJFRihnYm8tPmN1cnJ2YWx1ZSwgbmV3dmFsdWUpOwogICAgIH0KIAogICAgIFB5X0lOQ1JFRihnYm8tPmN1cnJrZXkpOwotICAgIHRtcCA9IGdiby0+dGd0a2V5OwotICAgIGdiby0+dGd0a2V5ID0gZ2JvLT5jdXJya2V5OwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKGdiby0+dGd0a2V5LCBnYm8tPmN1cnJrZXkpOwogCiAgICAgZ3JvdXBlciA9IF9ncm91cGVyX2NyZWF0ZShnYm8sIGdiby0+dGd0a2V5KTsKICAgICBpZiAoZ3JvdXBlciA9PSBOVUxMKQpAQCAtMTczLDcgKzE2NSw3IEBACiAgICAgIHJlZHVjZV9kb2N9LAogICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKWdyb3VwYnlfc2V0c3RhdGUsICAgIE1FVEhfTywKICAgICAgc2V0c3RhdGVfZG9jfSwKLSAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogUHlEb2NfU1RSVkFSKGdyb3VwYnlfZG9jLApAQCAtMjk2LDggKzI4OCw3IEBACiAgICAgICAgICAgICBuZXdrZXkgPSBuZXd2YWx1ZTsKICAgICAgICAgICAgIFB5X0lOQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXdrZXkgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGdiby0+a2V5ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dmFsdWUsIE5VTEwpOworICAgICAgICAgICAgbmV3a2V5ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhnYm8tPmtleWZ1bmMsIG5ld3ZhbHVlLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChuZXdrZXkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXd2YWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zMjUsOCArMzE2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZ3JvdXBlcl9yZWR1Y2UoX2dyb3VwZXJvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLAotICAgICAgICAgICAgbHotPnBhcmVudCwgbHotPnRndGtleSk7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksIGx6LT5wYXJlbnQsIGx6LT50Z3RrZXkpOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgX2dyb3VwZXJfbWV0aG9kc1tdID0gewpAQCAtMzU5LDcgKzM0OSw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylfZ3JvdXBlcl90cmF2ZXJzZSwvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpX2dyb3VwZXJfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC0zODAsOCArMzcwLDcgQEAKIH07CiAKIAotCi0vKiB0ZWUgb2JqZWN0IGFuZCB3aXRoIHN1cHBvcnRpbmcgZnVuY3Rpb24gYW5kIG9iamVjdHMgKioqKioqKioqKioqKioqLworLyogdGVlIG9iamVjdCBhbmQgd2l0aCBzdXBwb3J0aW5nIGZ1bmN0aW9uIGFuZCBvYmplY3RzICoqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBUaGUgdGVlZGF0YW9iamVjdCBwcmUtYWxsb2NhdGVzIHNwYWNlIGZvciBMSU5LQ0VMTFMgbnVtYmVyIG9mIG9iamVjdHMuCiAgICBUbyBoZWxwIHRoZSBvYmplY3QgZml0IG5lYXRseSBpbnNpZGUgY2FjaGUgbGluZXMgKHNwYWNlIGZvciAxNiB0byAzMgpAQCAtMzk2LDcgKzM4NSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAogICAgIFB5T2JqZWN0ICppdDsKLSAgICBpbnQgbnVtcmVhZDsgIC8qIDAgPD0gbnVtcmVhZCA8PSBMSU5LQ0VMTFMgKi8KKyAgICBpbnQgbnVtcmVhZDsgICAgICAgICAgICAgICAgLyogMCA8PSBudW1yZWFkIDw9IExJTktDRUxMUyAqLwogICAgIFB5T2JqZWN0ICpuZXh0bGluazsKICAgICBQeU9iamVjdCAqKHZhbHVlc1tMSU5LQ0VMTFNdKTsKIH0gdGVlZGF0YW9iamVjdDsKQEAgLTQwNCw3ICszOTMsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICB0ZWVkYXRhb2JqZWN0ICpkYXRhb2JqOwotICAgIGludCBpbmRleDsgICAgLyogMCA8PSBpbmRleCA8PSBMSU5LQ0VMTFMgKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgICAgLyogMCA8PSBpbmRleCA8PSBMSU5LQ0VMTFMgKi8KICAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7CiB9IHRlZW9iamVjdDsKIApAQCAtNDYxLDYgKzQ1MCw3IEBACiB0ZWVkYXRhb2JqZWN0X3RyYXZlcnNlKHRlZWRhdGFvYmplY3QgKnRkbywgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICogYXJnKQogewogICAgIGludCBpOworCiAgICAgUHlfVklTSVQodGRvLT5pdCk7CiAgICAgZm9yIChpID0gMDsgaSA8IHRkby0+bnVtcmVhZDsgaSsrKQogICAgICAgICBQeV9WSVNJVCh0ZG8tPnZhbHVlc1tpXSk7CkBAIC01MTAsNiArNTAwLDcgQEAKICAgICBpbnQgaTsKICAgICAvKiBjcmVhdGUgYSB0ZW1wb3JhcnkgbGlzdCBvZiBhbHJlYWR5IGl0ZXJhdGVkIHZhbHVlcyAqLwogICAgIFB5T2JqZWN0ICp2YWx1ZXMgPSBQeUxpc3RfTmV3KHRkby0+bnVtcmVhZCk7CisKICAgICBpZiAoIXZhbHVlcykKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgZm9yIChpPTAgOyBpPHRkby0+bnVtcmVhZCA7IGkrKykgewpAQCAtNTc3LDcgKzU2OCw3IEBACiBQeURvY19TVFJWQVIodGVlZGF0YW9iamVjdF9kb2MsICJEYXRhIGNvbnRhaW5lciBjb21tb24gdG8gbXVsdGlwbGUgdGVlIG9iamVjdHMuIik7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgdGVlZGF0YW9iamVjdF90eXBlID0gewotICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgwLCAwKSAgICAgICAgIC8qIE11c3QgZmlsbCBpbiB0eXBlIHZhbHVlIGxhdGVyICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKDAsIDApICAgICAgICAgICAgICAgICAvKiBNdXN0IGZpbGwgaW4gdHlwZSB2YWx1ZSBsYXRlciAqLwogICAgICJpdGVydG9vbHMuX3RlZV9kYXRhb2JqZWN0IiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZih0ZWVkYXRhb2JqZWN0KSwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwpAQCAtNTk3LDcgKzU4OCw3IEBACiAgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQywgICAgLyogdHBfZmxhZ3MgKi8KICAgICB0ZWVkYXRhb2JqZWN0X2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgICh0cmF2ZXJzZXByb2MpdGVlZGF0YW9iamVjdF90cmF2ZXJzZSwgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAoaW5xdWlyeSl0ZWVkYXRhb2JqZWN0X2NsZWFyLCAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC03NTIsOSArNzQzLDkgQEAKICJJdGVyYXRvciB3cmFwcGVkIHRvIG1ha2UgaXQgY29weWFibGUiKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRlZV9tZXRob2RzW10gPSB7Ci0gICAgeyJfX2NvcHlfXyIsICAgICAgICAoUHlDRnVuY3Rpb24pdGVlX2NvcHksICBNRVRIX05PQVJHUywgdGVlY29weV9kb2N9LAotICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsIHJlZHVjZV9kb2N9LAotICAgIHsiX19zZXRzdGF0ZV9fIiwgICAgKFB5Q0Z1bmN0aW9uKXRlZV9zZXRzdGF0ZSwgICAgTUVUSF9PLCBzZXRzdGF0ZV9kb2N9LAorICAgIHsiX19jb3B5X18iLCAgICAgICAgKFB5Q0Z1bmN0aW9uKXRlZV9jb3B5LCAgICAgTUVUSF9OT0FSR1MsIHRlZWNvcHlfZG9jfSwKKyAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbil0ZWVfcmVkdWNlLCAgIE1FVEhfTk9BUkdTLCByZWR1Y2VfZG9jfSwKKyAgICB7Il9fc2V0c3RhdGVfXyIsICAgIChQeUNGdW5jdGlvbil0ZWVfc2V0c3RhdGUsIE1FVEhfTywgICAgICBzZXRzdGF0ZV9kb2N9LAogICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC03ODQsNyArNzc1LDcgQEAKICAgICAodHJhdmVyc2Vwcm9jKXRlZV90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXRlZV9jbGVhciwgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZih0ZWVvYmplY3QsIHdlYWtyZWZsaXN0KSwgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgb2Zmc2V0b2YodGVlb2JqZWN0LCB3ZWFrcmVmbGlzdCksICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYyl0ZWVfbmV4dCwgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICB0ZWVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCkBAIC04NTAsMTIgKzg0MSwxMyBAQAogInRlZShpdGVyYWJsZSwgbj0yKSAtLT4gdHVwbGUgb2YgbiBpbmRlcGVuZGVudCBpdGVyYXRvcnMuIik7CiAKIAotLyogY3ljbGUgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjeWNsZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKml0OwogICAgIFB5T2JqZWN0ICpzYXZlZDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogICAgIGludCBmaXJzdHBhc3M7CiB9IGN5Y2xlb2JqZWN0OwogCkBAIC04OTUsNiArODg3LDcgQEAKICAgICB9CiAgICAgbHotPml0ID0gaXQ7CiAgICAgbHotPnNhdmVkID0gc2F2ZWQ7CisgICAgbHotPmluZGV4ID0gMDsKICAgICBsei0+Zmlyc3RwYXNzID0gMDsKIAogICAgIHJldHVybiAoUHlPYmplY3QgKilsejsKQEAgLTkwNCwxNSArODk3LDE2IEBACiBjeWNsZV9kZWFsbG9jKGN5Y2xlb2JqZWN0ICpseikKIHsKICAgICBQeU9iamVjdF9HQ19VblRyYWNrKGx6KTsKLSAgICBQeV9YREVDUkVGKGx6LT5zYXZlZCk7CiAgICAgUHlfWERFQ1JFRihsei0+aXQpOworICAgIFB5X1hERUNSRUYobHotPnNhdmVkKTsKICAgICBQeV9UWVBFKGx6KS0+dHBfZnJlZShseik7CiB9CiAKIHN0YXRpYyBpbnQKIGN5Y2xlX3RyYXZlcnNlKGN5Y2xlb2JqZWN0ICpseiwgdmlzaXRwcm9jIHZpc2l0LCB2b2lkICphcmcpCiB7Ci0gICAgUHlfVklTSVQobHotPml0KTsKKyAgICBpZiAobHotPml0KQorICAgICAgICBQeV9WSVNJVChsei0+aXQpOwogICAgIFB5X1ZJU0lUKGx6LT5zYXZlZCk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC05MjEsNTYgKzkxNSw2OSBAQAogY3ljbGVfbmV4dChjeWNsZW9iamVjdCAqbHopCiB7CiAgICAgUHlPYmplY3QgKml0ZW07Ci0gICAgUHlPYmplY3QgKml0OwotICAgIFB5T2JqZWN0ICp0bXA7CiAKLSAgICB3aGlsZSAoMSkgeworICAgIGlmIChsei0+aXQgIT0gTlVMTCkgewogICAgICAgICBpdGVtID0gUHlJdGVyX05leHQobHotPml0KTsKICAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFsei0+Zmlyc3RwYXNzICYmIFB5TGlzdF9BcHBlbmQobHotPnNhdmVkLCBpdGVtKSkgeworICAgICAgICAgICAgaWYgKGx6LT5maXJzdHBhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgICAgICBpZiAoUHlMaXN0X0FwcGVuZChsei0+c2F2ZWQsIGl0ZW0pKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGl0ZW07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQotICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFB5TGlzdF9TaXplKGx6LT5zYXZlZCkgPT0gMCkKKyAgICAgICAgLyogTm90ZTogIFN0b3BJdGVyYXRpb24gaXMgYWxyZWFkeSBjbGVhcmVkIGJ5IFB5SXRlcl9OZXh0KCkgKi8KKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGx6LT5zYXZlZCk7Ci0gICAgICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHRtcCA9IGx6LT5pdDsKLSAgICAgICAgbHotPml0ID0gaXQ7Ci0gICAgICAgIGx6LT5maXJzdHBhc3MgPSAxOwotICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgUHlfQ0xFQVIobHotPml0KTsKICAgICB9CisgICAgaWYgKFB5X1NJWkUobHotPnNhdmVkKSA9PSAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpdGVtID0gUHlMaXN0X0dFVF9JVEVNKGx6LT5zYXZlZCwgbHotPmluZGV4KTsKKyAgICBsei0+aW5kZXgrKzsKKyAgICBpZiAobHotPmluZGV4ID49IFB5X1NJWkUobHotPnNhdmVkKSkKKyAgICAgICAgbHotPmluZGV4ID0gMDsKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjeWNsZV9yZWR1Y2UoY3ljbGVvYmplY3QgKmx6KQogewotICAgIC8qIENyZWF0ZSBhIG5ldyBjeWNsZSB3aXRoIHRoZSBpdGVyYXRvciB0dXBsZSwgdGhlbiBzZXQKLSAgICAgKiB0aGUgc2F2ZWQgc3RhdGUgb24gaXQuCi0gICAgICovCi0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTykoT2kpIiwgUHlfVFlQRShseiksCi0gICAgICAgIGx6LT5pdCwgbHotPnNhdmVkLCBsei0+Zmlyc3RwYXNzKTsKKyAgICAvKiBDcmVhdGUgYSBuZXcgY3ljbGUgd2l0aCB0aGUgaXRlcmF0b3IgdHVwbGUsIHRoZW4gc2V0IHRoZSBzYXZlZCBzdGF0ZSAqLworICAgIGlmIChsei0+aXQgPT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqaXQgPSBQeU9iamVjdF9HZXRJdGVyKGx6LT5zYXZlZCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChsei0+aW5kZXggIT0gMCkgeworICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19zZXRzdGF0ZV9fKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGl0LCAmUHlJZF9fX3NldHN0YXRlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibiIsIGx6LT5pbmRleCk7CisgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oTikoT2kpIiwgUHlfVFlQRShseiksIGl0LCBsei0+c2F2ZWQsIDEpOwogICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPKShPaSkiLCBQeV9UWVBFKGx6KSwgbHotPml0LCBsei0+c2F2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbHotPmZpcnN0cGFzcyk7Cit9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjeWNsZV9zZXRzdGF0ZShjeWNsZW9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBQeU9iamVjdCAqc2F2ZWQ9TlVMTDsKICAgICBpbnQgZmlyc3RwYXNzOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgIk9pIiwgJnNhdmVkLCAmZmlyc3RwYXNzKSkKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShzdGF0ZSwgIk8haSIsICZQeUxpc3RfVHlwZSwgJnNhdmVkLCAmZmlyc3RwYXNzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlfWElOQ1JFRihzYXZlZCk7CisgICAgUHlfSU5DUkVGKHNhdmVkKTsKICAgICBQeV9YU0VUUkVGKGx6LT5zYXZlZCwgc2F2ZWQpOwogICAgIGx6LT5maXJzdHBhc3MgPSBmaXJzdHBhc3MgIT0gMDsKKyAgICBsei0+aW5kZXggPSAwOwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCkBAIC0xMDM5LDcgKzEwNDYsNyBAQAogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQeU9iamVjdCAqZnVuYzsKICAgICBQeU9iamVjdCAqaXQ7Ci0gICAgbG9uZyAgICAgICAgIHN0YXJ0OworICAgIGxvbmcgc3RhcnQ7CiB9IGRyb3B3aGlsZW9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBkcm9wd2hpbGVfdHlwZTsKQEAgLTExMjksOCArMTEzNiw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZHJvcHdoaWxlX3JlZHVjZShkcm9wd2hpbGVvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsei0+ZnVuYywgbHotPml0LCBsei0+c3RhcnQpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKWwiLCBQeV9UWVBFKGx6KSwgbHotPmZ1bmMsIGx6LT5pdCwgbHotPnN0YXJ0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTExODEsMTMgKzExODcsMTMgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAogICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgZHJvcHdoaWxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYylkcm9wd2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYylkcm9wd2hpbGVfdHJhdmVyc2UsICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYylkcm9wd2hpbGVfbmV4dCwgICAgICAgLyogdHBfaXRlcm5leHQgKi8KLSAgICBkcm9wd2hpbGVfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgIGRyb3B3aGlsZV9tZXRob2RzLCAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwpAQCAtMTIwOCw3ICsxMjE0LDcgQEAKICAgICBQeU9iamVjdF9IRUFECiAgICAgUHlPYmplY3QgKmZ1bmM7CiAgICAgUHlPYmplY3QgKml0OwotICAgIGxvbmcgICAgICAgICBzdG9wOworICAgIGxvbmcgc3RvcDsKIH0gdGFrZXdoaWxlb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHRha2V3aGlsZV90eXBlOwpAQCAtMTI4Myw3ICsxMjg5LDcgQEAKICAgICB9CiAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoZ29vZCk7CiAgICAgUHlfREVDUkVGKGdvb2QpOwotICAgIGlmIChvayA9PSAxKQorICAgIGlmIChvayA+IDApCiAgICAgICAgIHJldHVybiBpdGVtOwogICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICBpZiAob2sgPT0gMCkKQEAgLTEyOTQsMTQgKzEzMDAsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB0YWtld2hpbGVfcmVkdWNlKHRha2V3aGlsZW9iamVjdCAqbHopCiB7Ci0gICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pbCIsIFB5X1RZUEUobHopLAotICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdG9wKTsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTylsIiwgUHlfVFlQRShseiksIGx6LT5mdW5jLCBsei0+aXQsIGx6LT5zdG9wKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHRha2V3aGlsZV9yZWR1Y2Vfc2V0c3RhdGUodGFrZXdoaWxlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQogewogICAgIGludCBzdG9wID0gUHlPYmplY3RfSXNUcnVlKHN0YXRlKTsKKwogICAgIGlmIChzdG9wIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbHotPnN0b3AgPSBzdG9wOwpAQCAtMTM0NSw3ICsxMzUxLDcgQEAKICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAogICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgdGFrZXdoaWxlX2RvYywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCi0gICAgKHRyYXZlcnNlcHJvYyl0YWtld2hpbGVfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgKHRyYXZlcnNlcHJvYyl0YWtld2hpbGVfdHJhdmVyc2UsICAgLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KQEAgLTEzNjYsNyArMTM3Miw3IEBACiB9OwogCiAKLS8qIGlzbGljZSBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaXNsaWNlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtMTQwMiw3ICsxNDA4LDggQEAKICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKKyAgICAgICAgICAgICAgICAgICAiU3RvcCBhcmd1bWVudCBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yICIKKyAgICAgICAgICAgICAgICAgICAiYW4gaW50ZWdlcjogMCA8PSB4IDw9IHN5cy5tYXhzaXplLiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDE3LDE0ICsxNDI0LDE2IEBACiAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciBhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CisgICAgICAgICAgICAgICAgICAgIlN0b3AgYXJndW1lbnQgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciAiCisgICAgICAgICAgICAgICAgICAgImFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAoc3RhcnQ8MCB8fCBzdG9wPC0xKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAiSW5kaWNlcyBmb3IgaXNsaWNlKCkgbXVzdCBiZSBOb25lIG9yIGFuIGludGVnZXI6IDAgPD0geCA8PSBzeXMubWF4c2l6ZS4iKTsKKyAgICAgICAgICAgIkluZGljZXMgZm9yIGlzbGljZSgpIG11c3QgYmUgTm9uZSBvciAiCisgICAgICAgICAgICJhbiBpbnRlZ2VyOiAwIDw9IHggPD0gc3lzLm1heHNpemUuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTUyMSw2ICsxNTMwLDcgQEAKICAgICAgKiB0aGVuICdzZXRzdGF0ZScgd2l0aCB0aGUgbmV4dCBhbmQgY291bnQKICAgICAgKi8KICAgICBQeU9iamVjdCAqc3RvcDsKKwogICAgIGlmIChsei0+aXQgPT0gTlVMTCkgewogICAgICAgICBQeU9iamVjdCAqZW1wdHlfbGlzdDsKICAgICAgICAgUHlPYmplY3QgKmVtcHR5X2l0OwpAQCAtMTU1MCw2ICsxNTYwLDcgQEAKIGlzbGljZV9zZXRzdGF0ZShpc2xpY2VvYmplY3QgKmx6LCBQeU9iamVjdCAqc3RhdGUpCiB7CiAgICAgUHlfc3NpemVfdCBjbnQgPSBQeUxvbmdfQXNTc2l6ZV90KHN0YXRlKTsKKwogICAgIGlmIChjbnQgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgbHotPmNudCA9IGNudDsKQEAgLTE3NjQsNyArMTc3NSw3IEBACiB9OwogCiAKLS8qIGNoYWluIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBjaGFpbiBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECkBAIC0xODQwLDMyICsxODUxLDMyIEBACiAgICAgUHlPYmplY3QgKml0ZW07CiAKICAgICBpZiAobHotPnNvdXJjZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHN0b3BwZWQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAvKiBhbHJlYWR5IHN0b3BwZWQgKi8KIAogICAgIGlmIChsei0+YWN0aXZlID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gUHlJdGVyX05leHQobHotPnNvdXJjZSk7CiAgICAgICAgIGlmIChpdGVyYWJsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9DTEVBUihsei0+c291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gbW9yZSBpbnB1dCBzb3VyY2VzICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogbm8gbW9yZSBpbnB1dCBzb3VyY2VzICovCiAgICAgICAgIH0KICAgICAgICAgbHotPmFjdGl2ZSA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwogICAgICAgICBQeV9ERUNSRUYoaXRlcmFibGUpOwogICAgICAgICBpZiAobHotPmFjdGl2ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9DTEVBUihsei0+c291cmNlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgbm90IGl0ZXJhYmxlICovCisgICAgICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgLyogaW5wdXQgbm90IGl0ZXJhYmxlICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgaXRlbSA9IFB5SXRlcl9OZXh0KGx6LT5hY3RpdmUpOworICAgIGl0ZW0gPSAoKlB5X1RZUEUobHotPmFjdGl2ZSktPnRwX2l0ZXJuZXh0KShsei0+YWN0aXZlKTsKICAgICBpZiAoaXRlbSAhPSBOVUxMKQogICAgICAgICByZXR1cm4gaXRlbTsKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19TdG9wSXRlcmF0aW9uKSkKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgcmFpc2VkIGFuIGV4Y2VwdGlvbiAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGlucHV0IHJhaXNlZCBhbiBleGNlcHRpb24gKi8KICAgICB9CiAgICAgUHlfQ0xFQVIobHotPmFjdGl2ZSk7Ci0gICAgcmV0dXJuIGNoYWluX25leHQobHopOyAgICAgICAgICAgICAgICAgICAgICAvKiByZWN1cnNlIGFuZCB1c2UgbmV4dCBhY3RpdmUgKi8KKyAgICByZXR1cm4gY2hhaW5fbmV4dChseik7ICAgICAgICAgICAgICAvKiByZWN1cnNlIGFuZCB1c2UgbmV4dCBhY3RpdmUgKi8KIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE4OTEsNiArMTkwMiw3IEBACiBjaGFpbl9zZXRzdGF0ZShjaGFpbm9iamVjdCAqbHosIFB5T2JqZWN0ICpzdGF0ZSkKIHsKICAgICBQeU9iamVjdCAqc291cmNlLCAqYWN0aXZlPU5VTEw7CisKICAgICBpZiAoISBQeUFyZ19QYXJzZVR1cGxlKHN0YXRlLCAiT3xPIiwgJnNvdXJjZSwgJmFjdGl2ZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xOTE1LDEzICsxOTI3LDEzIEBACiB0aGF0IGV2YWx1YXRlcyBsYXppbHkuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjaGFpbl9tZXRob2RzW10gPSB7Ci0gICAgeyJmcm9tX2l0ZXJhYmxlIiwgKFB5Q0Z1bmN0aW9uKSBjaGFpbl9uZXdfZnJvbV9pdGVyYWJsZSwgICAgICAgICAgICBNRVRIX08gfCBNRVRIX0NMQVNTLAotICAgICAgICBjaGFpbl9mcm9tX2l0ZXJhYmxlX2RvY30sCisgICAgeyJmcm9tX2l0ZXJhYmxlIiwgKFB5Q0Z1bmN0aW9uKSBjaGFpbl9uZXdfZnJvbV9pdGVyYWJsZSwgTUVUSF9PIHwgTUVUSF9DTEFTUywKKyAgICAgY2hhaW5fZnJvbV9pdGVyYWJsZV9kb2N9LAogICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWNoYWluX3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKICAgICAgcmVkdWNlX2RvY30sCiAgICAgeyJfX3NldHN0YXRlX18iLCAgICAoUHlDRnVuY3Rpb24pY2hhaW5fc2V0c3RhdGUsICAgIE1FVEhfTywKICAgICAgc2V0c3RhdGVfZG9jfSwKLSAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgLyogc2VudGluZWwgKi8KKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLwogfTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBjaGFpbl90eXBlID0gewpAQCAtMTk3MywxMCArMTk4NSwxMCBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sczsgICAgICAgICAgICAgICAgICAgIC8qIHR1cGxlIG9mIHBvb2wgdHVwbGVzICovCi0gICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIHBvb2wgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCi0gICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBwcm9kdWN0IGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0ICpwb29sczsgICAgICAgIC8qIHR1cGxlIG9mIHBvb2wgdHVwbGVzICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgLyogb25lIGluZGV4IHBlciBwb29sICovCisgICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgLyogbW9zdCByZWNlbnRseSByZXR1cm5lZCByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gcHJvZHVjdG9iamVjdDsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwcm9kdWN0X3R5cGU7CkBAIC0xOTk1LDcgKzIwMDcsOCBAQAogICAgICAgICBQeU9iamVjdCAqdG1wYXJncyA9IFB5VHVwbGVfTmV3KDApOwogICAgICAgICBpZiAodG1wYXJncyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKHRtcGFyZ3MsIGt3ZHMsICJ8bjpwcm9kdWN0Iiwga3dsaXN0LCAmcmVwZWF0KSkgeworICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcyh0bXBhcmdzLCBrd2RzLCAifG46cHJvZHVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJnJlcGVhdCkpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXBhcmdzKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC0yMjg0LDcgKzIyOTcsNyBAQAogc3RhdGljIFB5VHlwZU9iamVjdCBwcm9kdWN0X3R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgIml0ZXJ0b29scy5wcm9kdWN0IiwgICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwotICAgIHNpemVvZihwcm9kdWN0b2JqZWN0KSwgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICBzaXplb2YocHJvZHVjdG9iamVjdCksICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KICAgICAoZGVzdHJ1Y3Rvcilwcm9kdWN0X2RlYWxsb2MsICAgICAgICAvKiB0cF9kZWFsbG9jICovCkBAIC0yMzI2LDE1ICsyMzM5LDE1IEBACiB9OwogCiAKLS8qIGNvbWJpbmF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29tYmluYXRpb25zIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0gICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIHJlc3VsdCBlbGVtZW50ICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCi0gICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY29tYmluYXRpb25zIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgLyogb25lIGluZGV4IHBlciByZXN1bHQgZWxlbWVudCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gY29tYmluYXRpb25zb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IGNvbWJpbmF0aW9uc190eXBlOwpAQCAtMjU0NCwxNyArMjU1NywxNiBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX0dFVF9TSVpFKGx6LT5wb29sKTsKIAotICAgIGlmICghUHlUdXBsZV9DaGVjayhzdGF0ZSkgfHwgUHlUdXBsZV9HRVRfU0laRShzdGF0ZSkgIT0gbHotPnIpCi0gICAgeworICAgIGlmICghUHlUdXBsZV9DaGVjayhzdGF0ZSkgfHwgUHlUdXBsZV9HRVRfU0laRShzdGF0ZSkgIT0gbHotPnIpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50cyIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKSB7CiAgICAgICAgIFB5X3NzaXplX3QgbWF4OwogICAgICAgICBQeU9iamVjdCogaW5kZXhPYmplY3QgPSBQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOworCiAgICAgICAgIGlmIChpbmRleCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8qIG5vdCBhbiBpbnRlZ2VyICovCiAgICAgICAgIG1heCA9IGkgKyBuIC0gbHotPnI7CkBAIC0yNjQwLDcgKzI2NTIsNyBAQAogfTsKIAogCi0vKiBjb21iaW5hdGlvbnMgd2l0aCByZXBsYWNlbWVudCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGNvbWJpbmF0aW9ucyB3aXRoIHJlcGxhY2VtZW50IG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyogRXF1aXZhbGVudCB0bzoKIApAQCAtMjY3MCwxMSArMjY4MiwxMSBAQAogKi8KIHR5cGVkZWYgc3RydWN0IHsKICAgICBQeU9iamVjdF9IRUFECi0gICAgUHlPYmplY3QgKnBvb2w7ICAgICAgICAgICAgICAgICAgICAgLyogaW5wdXQgY29udmVydGVkIHRvIGEgdHVwbGUgKi8KKyAgICBQeU9iamVjdCAqcG9vbDsgICAgICAgICAvKiBpbnB1dCBjb252ZXJ0ZWQgdG8gYSB0dXBsZSAqLwogICAgIFB5X3NzaXplX3QgKmluZGljZXM7ICAgIC8qIG9uZSBpbmRleCBwZXIgcmVzdWx0IGVsZW1lbnQgKi8KICAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCi0gICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY3dyIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCisgICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY3dyIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLwogfSBjd3JvYmplY3Q7CiAKIHN0YXRpYyBQeVR5cGVPYmplY3QgY3dyX3R5cGU7CkBAIC0yNjkxLDggKzI3MDMsOSBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICBzdGF0aWMgY2hhciAqa3dhcmdzW10gPSB7Iml0ZXJhYmxlIiwgInIiLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPbjpjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCIsIGt3YXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRlcmFibGUsICZyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPbjpjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dhcmdzLCAmaXRlcmFibGUsICZyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwb29sID0gUHlTZXF1ZW5jZV9UdXBsZShpdGVyYWJsZSk7CkBAIC0yODU3LDggKzI4NzAsNyBAQAogICAgICAgICBpbmRpY2VzID0gUHlUdXBsZV9OZXcobHotPnIpOwogICAgICAgICBpZiAoIWluZGljZXMpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykKLSAgICAgICAgeworICAgICAgICBmb3IgKGk9MDsgaTxsei0+cjsgaSsrKSB7CiAgICAgICAgICAgICBQeU9iamVjdCogaW5kZXggPSBQeUxvbmdfRnJvbVNzaXplX3QobHotPmluZGljZXNbaV0pOwogICAgICAgICAgICAgaWYgKCFpbmRleCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpbmRpY2VzKTsKQEAgLTI4ODQsMTAgKzI4OTYsMTAgQEAKICAgICB9CiAKICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShsei0+cG9vbCk7Ci0gICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8bHotPnI7IGkrKykgewogICAgICAgICBQeU9iamVjdCogaW5kZXhPYmplY3QgPSBQeVR1cGxlX0dFVF9JVEVNKHN0YXRlLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOworCiAgICAgICAgIGlmIChpbmRleCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvKiBub3QgYW4gaW50ZWdlciAqLwogICAgICAgICAvKiBjbGFtcCB0aGUgaW5kZXggKi8KQEAgLTI5NzEsNyArMjk4Myw3IEBACiB9OwogCiAKLS8qIHBlcm11dGF0aW9ucyBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKiBwZXJtdXRhdGlvbnMgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKIGRlZiBwZXJtdXRhdGlvbnMoaXRlcmFibGUsIHI9Tm9uZSk6CiAgICAgJ3Blcm11dGF0aW9ucyhyYW5nZSgzKSwgMikgLS0+ICgwLDEpICgwLDIpICgxLDApICgxLDIpICgyLDApICgyLDEpJwpAQCAtMjk5OCwxMiArMzAxMCwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRAotICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCi0gICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgICAgICAgICAvKiBvbmUgaW5kZXggcGVyIGVsZW1lbnQgaW4gdGhlIHBvb2wgKi8KLSAgICBQeV9zc2l6ZV90ICpjeWNsZXM7ICAgICAgICAgICAgICAgICAvKiBvbmUgcm9sbG92ZXIgY291bnRlciBwZXIgZWxlbWVudCBpbiB0aGUgcmVzdWx0ICovCi0gICAgUHlPYmplY3QgKnJlc3VsdDsgICAgICAgICAgICAgICAvKiBtb3N0IHJlY2VudGx5IHJldHVybmVkIHJlc3VsdCB0dXBsZSAqLwotICAgIFB5X3NzaXplX3QgcjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVzdWx0IHR1cGxlICovCi0gICAgaW50IHN0b3BwZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgcGVybXV0YXRpb25zIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCAqLworICAgIFB5T2JqZWN0ICpwb29sOyAgICAgICAgIC8qIGlucHV0IGNvbnZlcnRlZCB0byBhIHR1cGxlICovCisgICAgUHlfc3NpemVfdCAqaW5kaWNlczsgICAgLyogb25lIGluZGV4IHBlciBlbGVtZW50IGluIHRoZSBwb29sICovCisgICAgUHlfc3NpemVfdCAqY3ljbGVzOyAgICAgLyogb25lIHJvbGxvdmVyIGNvdW50ZXIgcGVyIGVsZW1lbnQgaW4gdGhlIHJlc3VsdCAqLworICAgIFB5T2JqZWN0ICpyZXN1bHQ7ICAgICAgIC8qIG1vc3QgcmVjZW50bHkgcmV0dXJuZWQgcmVzdWx0IHR1cGxlICovCisgICAgUHlfc3NpemVfdCByOyAgICAgICAgICAgLyogc2l6ZSBvZiByZXN1bHQgdHVwbGUgKi8KKyAgICBpbnQgc3RvcHBlZDsgICAgICAgICAgICAvKiBzZXQgdG8gMSB3aGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQgKi8KIH0gcGVybXV0YXRpb25zb2JqZWN0OwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IHBlcm11dGF0aW9uc190eXBlOwpAQCAtMzIxOCw3ICszMjMwLDcgQEAKICAgICAgICAgaW5kaWNlcyA9IFB5VHVwbGVfTmV3KG4pOwogICAgICAgICBpZiAoaW5kaWNlcyA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIGZvciAoaT0wOyBpPG47IGkrKyl7CisgICAgICAgIGZvciAoaT0wOyBpPG47IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QqIGluZGV4ID0gUHlMb25nX0Zyb21Tc2l6ZV90KHBvLT5pbmRpY2VzW2ldKTsKICAgICAgICAgICAgIGlmICghaW5kZXgpCiAgICAgICAgICAgICAgICAgZ290byBlcnI7CkBAIC0zMjI4LDggKzMyNDAsNyBAQAogICAgICAgICBjeWNsZXMgPSBQeVR1cGxlX05ldyhwby0+cik7CiAgICAgICAgIGlmIChjeWNsZXMgPT0gTlVMTCkKICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICBmb3IgKGk9MDsgaTxwby0+cjsgaSsrKQotICAgICAgICB7CisgICAgICAgIGZvciAoaT0wIDsgaTxwby0+ciA7IGkrKykgewogICAgICAgICAgICAgUHlPYmplY3QqIGluZGV4ID0gUHlMb25nX0Zyb21Tc2l6ZV90KHBvLT5jeWNsZXNbaV0pOwogICAgICAgICAgICAgaWYgKCFpbmRleCkKICAgICAgICAgICAgICAgICBnb3RvIGVycjsKQEAgLTMyNTcsMTUgKzMyNjgsMTIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBuID0gUHlUdXBsZV9HRVRfU0laRShwby0+cG9vbCk7Ci0gICAgaWYgKFB5VHVwbGVfR0VUX1NJWkUoaW5kaWNlcykgIT0gbiB8fAotICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGN5Y2xlcykgIT0gcG8tPnIpCi0gICAgeworICAgIGlmIChQeVR1cGxlX0dFVF9TSVpFKGluZGljZXMpICE9IG4gfHwgUHlUdXBsZV9HRVRfU0laRShjeWNsZXMpICE9IHBvLT5yKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiaW52YWxpZCBhcmd1bWVudHMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgZm9yIChpPTA7IGk8bjsgaSsrKQotICAgIHsKKyAgICBmb3IgKGk9MDsgaTxuOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShpbmRpY2VzLCBpKTsKICAgICAgICAgUHlfc3NpemVfdCBpbmRleCA9IFB5TG9uZ19Bc1NzaXplX3QoaW5kZXhPYmplY3QpOwogICAgICAgICBpZiAoaW5kZXggPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCkBAIC0zMjc4LDggKzMyODYsNyBAQAogICAgICAgICBwby0+aW5kaWNlc1tpXSA9IGluZGV4OwogICAgIH0KIAotICAgIGZvciAoaT0wOyBpPHBvLT5yOyBpKyspCi0gICAgeworICAgIGZvciAoaT0wOyBpPHBvLT5yOyBpKyspIHsKICAgICAgICAgUHlPYmplY3QqIGluZGV4T2JqZWN0ID0gUHlUdXBsZV9HRVRfSVRFTShjeWNsZXMsIGkpOwogICAgICAgICBQeV9zc2l6ZV90IGluZGV4ID0gUHlMb25nX0FzU3NpemVfdChpbmRleE9iamVjdCk7CiAgICAgICAgIGlmIChpbmRleCA8IDAgJiYgUHlFcnJfT2NjdXJyZWQoKSkKQEAgLTMzMjAsMTEgKzMzMjcsMTEgQEAKIAogc3RhdGljIFB5VHlwZU9iamVjdCBwZXJtdXRhdGlvbnNfdHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKLSAgICAiaXRlcnRvb2xzLnBlcm11dGF0aW9ucyIsICAgICAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAiaXRlcnRvb2xzLnBlcm11dGF0aW9ucyIsICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgc2l6ZW9mKHBlcm11dGF0aW9uc29iamVjdCksICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpcGVybXV0YXRpb25zX2RlYWxsb2MsICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKGRlc3RydWN0b3IpcGVybXV0YXRpb25zX2RlYWxsb2MsICAgLyogdHBfZGVhbGxvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KQEAgLTMzNDEsMTMgKzMzNDgsMTMgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAogICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCi0gICAgcGVybXV0YXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKXBlcm11dGF0aW9uc190cmF2ZXJzZSwgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgcGVybXV0YXRpb25zX2RvYywgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgKHRyYXZlcnNlcHJvYylwZXJtdXRhdGlvbnNfdHJhdmVyc2UsLyogdHBfdHJhdmVyc2UgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCi0gICAgKGl0ZXJuZXh0ZnVuYylwZXJtdXRhdGlvbnNfbmV4dCwgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgIChpdGVybmV4dGZ1bmMpcGVybXV0YXRpb25zX25leHQsICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgcGVybXVhdGlvbnNfbWV0aG9kcywgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KQEAgLTMzNTgsMTEgKzMzNjUsMTEgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCi0gICAgcGVybXV0YXRpb25zX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICBwZXJtdXRhdGlvbnNfbmV3LCAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KICAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCiB9OwogCi0vKiBhY2N1bXVsYXRlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBhY2N1bXVsYXRlIG9iamVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKQEAgLTM0MjksOSArMzQzNiw5IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYWNjdW11bGF0ZV9uZXh0KGFjY3VtdWxhdGVvYmplY3QgKmx6KQogewotICAgIFB5T2JqZWN0ICp2YWwsICpvbGR0b3RhbCwgKm5ld3RvdGFsOworICAgIFB5T2JqZWN0ICp2YWwsICpuZXd0b3RhbDsKIAotICAgIHZhbCA9IFB5SXRlcl9OZXh0KGx6LT5pdCk7CisgICAgdmFsID0gKCpQeV9UWVBFKGx6LT5pdCktPnRwX2l0ZXJuZXh0KShsei0+aXQpOwogICAgIGlmICh2YWwgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTM0NDksMTEgKzM0NTYsOCBAQAogICAgIGlmIChuZXd0b3RhbCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIG9sZHRvdGFsID0gbHotPnRvdGFsOwotICAgIGx6LT50b3RhbCA9IG5ld3RvdGFsOwotICAgIFB5X0RFQ1JFRihvbGR0b3RhbCk7Ci0KICAgICBQeV9JTkNSRUYobmV3dG90YWwpOworICAgIFB5X1NFVFJFRihsei0+dG90YWwsIG5ld3RvdGFsKTsKICAgICByZXR1cm4gbmV3dG90YWw7CiB9CiAKQEAgLTM0ODAsNyArMzQ4NCw3IEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pTyIsIFB5X1RZUEUobHopLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT5pdCwgbHotPmJpbm9wP2x6LT5iaW5vcDpQeV9Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6LT50b3RhbD9sei0+dG90YWw6UHlfTm9uZSk7Ci0gfQorfQogCiBzdGF0aWMgUHlPYmplY3QgKgogYWNjdW11bGF0ZV9zZXRzdGF0ZShhY2N1bXVsYXRlb2JqZWN0ICpseiwgUHlPYmplY3QgKnN0YXRlKQpAQCAtMzY0Miw3ICszNjQ2LDcgQEAKIAogICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShzZWxlY3Rvcik7CiAgICAgICAgIFB5X0RFQ1JFRihzZWxlY3Rvcik7Ci0gICAgICAgIGlmIChvayA9PSAxKQorICAgICAgICBpZiAob2sgPiAwKQogICAgICAgICAgICAgcmV0dXJuIGRhdHVtOwogICAgICAgICBQeV9ERUNSRUYoZGF0dW0pOwogICAgICAgICBpZiAob2sgPCAwKQpAQCAtMzY1NSw3ICszNjU5LDcgQEAKIHsKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyhPTykiLCBQeV9UWVBFKGx6KSwKICAgICAgICAgbHotPmRhdGEsIGx6LT5zZWxlY3RvcnMpOwotICAgIH0KK30KIAogc3RhdGljIFB5TWV0aG9kRGVmIGNvbXByZXNzX21ldGhvZHNbXSA9IHsKICAgICB7Il9fcmVkdWNlX18iLCAgICAgIChQeUNGdW5jdGlvbiljb21wcmVzc19yZWR1Y2UsICAgICAgTUVUSF9OT0FSR1MsCkBAIC0zNjc0LDQ0ICszNjc4LDQ0IEBACiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgIml0ZXJ0b29scy5jb21wcmVzcyIsICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwogICAgIHNpemVvZihjb21wcmVzc29iamVjdCksICAgICAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCiAgICAgKGRlc3RydWN0b3IpY29tcHJlc3NfZGVhbGxvYywgICAgICAgLyogdHBfZGVhbGxvYyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3Jlc2VydmVkICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KLSAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3Jlc2VydmVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIsICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLwogICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9HQyB8Ci0gICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwotICAgIGNvbXByZXNzX2RvYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWNvbXByZXNzX3RyYXZlcnNlLCAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi0gICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIGNvbXByZXNzX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpY29tcHJlc3NfdHJhdmVyc2UsICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpY29tcHJlc3NfbmV4dCwgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgY29tcHJlc3NfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwotICAgIGNvbXByZXNzX25ldywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KLSAgICBQeU9iamVjdF9HQ19EZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIGNvbXByZXNzX21ldGhvZHMsICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgY29tcHJlc3NfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgUHlPYmplY3RfR0NfRGVsLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwogfTsKIAogCkBAIC0zNzkyLDggKzM3OTYsNyBAQAogICAgICAgICAgICAgb2sgPSBQeU9iamVjdF9Jc1RydWUoaXRlbSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZ29vZDsKLSAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgTlVMTCk7CisgICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywgaXRlbSwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoZ29vZCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzgxMiw5ICszODE1LDggQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmaWx0ZXJmYWxzZV9yZWR1Y2UoZmlsdGVyZmFsc2VvYmplY3QgKmx6KQogewotICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKE9PKSIsIFB5X1RZUEUobHopLAotICAgICAgICBsei0+ZnVuYywgbHotPml0KTsKLSAgICB9CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oT08pIiwgUHlfVFlQRShseiksIGx6LT5mdW5jLCBsei0+aXQpOworfQogCiBzdGF0aWMgUHlNZXRob2REZWYgZmlsdGVyZmFsc2VfbWV0aG9kc1tdID0gewogICAgIHsiX19yZWR1Y2VfXyIsICAgICAgKFB5Q0Z1bmN0aW9uKWZpbHRlcmZhbHNlX3JlZHVjZSwgICAgICBNRVRIX05PQVJHUywKQEAgLTM4MzQsNyArMzgzNiw3IEBACiAgICAgc2l6ZW9mKGZpbHRlcmZhbHNlb2JqZWN0KSwgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAvKiBtZXRob2RzICovCi0gICAgKGRlc3RydWN0b3IpZmlsdGVyZmFsc2VfZGVhbGxvYywgICAgICAgICAgICAvKiB0cF9kZWFsbG9jICovCisgICAgKGRlc3RydWN0b3IpZmlsdGVyZmFsc2VfZGVhbGxvYywgICAgLyogdHBfZGVhbGxvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ByaW50ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KQEAgLTM4NTIsNyArMzg1NCw3IEBACiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKICAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwogICAgIGZpbHRlcmZhbHNlX2RvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwotICAgICh0cmF2ZXJzZXByb2MpZmlsdGVyZmFsc2VfdHJhdmVyc2UsICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAodHJhdmVyc2Vwcm9jKWZpbHRlcmZhbHNlX3RyYXZlcnNlLCAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwpAQCAtNDA5MSwxNSArNDA5MywxNSBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDIHwKLSAgICAgICAgUHlfVFBGTEFHU19CQVNFVFlQRSwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICAgIFB5X1RQRkxBR1NfQkFTRVRZUEUsICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICBjb3VudF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKWNvdW50X3RyYXZlcnNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICh0cmF2ZXJzZXByb2MpY291bnRfdHJhdmVyc2UsICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCiAgICAgUHlPYmplY3RfU2VsZkl0ZXIsICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpY291bnRfbmV4dCwgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCi0gICAgY291bnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgY291bnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCkBAIC00MjY1LDkgKzQyNjcsNyBAQAogICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKLS8qIHppcGxvbmdlc3Qgb2JqZWN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlB5dGhvbi5oIgorLyogemlwbG9uZ2VzdCBvYmplY3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfSEVBRApAQCAtNDMwNiw3ICs0MzA2LDcgQEAKICAgICBpdHR1cGxlID0gUHlUdXBsZV9OZXcodHVwbGVzaXplKTsKICAgICBpZiAoaXR0dXBsZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBmb3IgKGk9MDsgaSA8IHR1cGxlc2l6ZTsgKytpKSB7CisgICAgZm9yIChpPTA7IGkgPCB0dXBsZXNpemU7IGkrKykgewogICAgICAgICBQeU9iamVjdCAqaXRlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CiAgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlbSk7CiAgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CkBAIC00NDQ3LDYgKzQ0NDcsNyBAQAogICAgICAqLwogICAgIGludCBpOwogICAgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoUHlUdXBsZV9HRVRfU0laRShsei0+aXR0dXBsZSkpOworCiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgZm9yIChpPTA7IGk8UHlUdXBsZV9HRVRfU0laRShsei0+aXR0dXBsZSk7IGkrKykgewpAQCAtNDQ5Nyw3ICs0NDk4LDcgQEAKICAgICBzaXplb2YoemlwbG9uZ2VzdG9iamVjdCksICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLwogICAgIC8qIG1ldGhvZHMgKi8KLSAgICAoZGVzdHJ1Y3Rvcil6aXBfbG9uZ2VzdF9kZWFsbG9jLCAgICAgICAgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAoZGVzdHJ1Y3Rvcil6aXBfbG9uZ2VzdF9kZWFsbG9jLCAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwpAQCAtNDUxNCw4ICs0NTE1LDggQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KICAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0hBVkVfR0MgfAogICAgICAgICBQeV9UUEZMQUdTX0JBU0VUWVBFLCAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCi0gICAgemlwX2xvbmdlc3RfZG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAodHJhdmVyc2Vwcm9jKXppcF9sb25nZXN0X3RyYXZlcnNlLCAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgIHppcF9sb25nZXN0X2RvYywgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICh0cmF2ZXJzZXByb2MpemlwX2xvbmdlc3RfdHJhdmVyc2UsIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCkBAIC00NTMxLDcgKzQ1MzIsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KLSAgICB6aXBfbG9uZ2VzdF9uZXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIHppcF9sb25nZXN0X25ldywgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLwogICAgIFB5T2JqZWN0X0dDX0RlbCwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KIH07CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggZTRjOTU1ZS4uYjZkY2RkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTQyLDExICs0MiwxMSBAQAogI2RlZmluZSBQUk9HUkFNX09QVFMgQkFTRV9PUFRTCiAKIC8qIFNob3J0IHVzYWdlIG1lc3NhZ2UgKHdpdGggJXMgZm9yIGFyZ3YwKSAqLwotc3RhdGljIGNoYXIgKnVzYWdlX2xpbmUgPQorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfbGluZVtdID0KICJ1c2FnZTogJWxzIFtvcHRpb25dIC4uLiBbLWMgY21kIHwgLW0gbW9kIHwgZmlsZSB8IC1dIFthcmddIC4uLlxuIjsKIAogLyogTG9uZyB1c2FnZSBtZXNzYWdlLCBzcGxpdCBpbnRvIHBhcnRzIDwgNTEyIGJ5dGVzICovCi1zdGF0aWMgY2hhciAqdXNhZ2VfMSA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV8xW10gPSAiXAogT3B0aW9ucyBhbmQgYXJndW1lbnRzIChhbmQgY29ycmVzcG9uZGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMpOlxuXAogLWIgICAgIDogaXNzdWUgd2FybmluZ3MgYWJvdXQgc3RyKGJ5dGVzX2luc3RhbmNlKSwgc3RyKGJ5dGVhcnJheV9pbnN0YW5jZSlcblwKICAgICAgICAgIGFuZCBjb21wYXJpbmcgYnl0ZXMvYnl0ZWFycmF5IHdpdGggc3RyLiAoLWJiOiBpc3N1ZSBlcnJvcnMpXG5cCkBAIC01Niw3ICs1Niw3IEBACiAtRSAgICAgOiBpZ25vcmUgUFlUSE9OKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKHN1Y2ggYXMgUFlUSE9OUEFUSClcblwKIC1oICAgICA6IHByaW50IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0IChhbHNvIC0taGVscClcblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfMiA9ICJcCitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV8yW10gPSAiXAogLWkgICAgIDogaW5zcGVjdCBpbnRlcmFjdGl2ZWx5IGFmdGVyIHJ1bm5pbmcgc2NyaXB0OyBmb3JjZXMgYSBwcm9tcHQgZXZlblxuXAogICAgICAgICAgaWYgc3RkaW4gZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdGVybWluYWw7IGFsc28gUFlUSE9OSU5TUEVDVD14XG5cCiAtSSAgICAgOiBpc29sYXRlIFB5dGhvbiBmcm9tIHRoZSB1c2VyJ3MgZW52aXJvbm1lbnQgKGltcGxpZXMgLUUgYW5kIC1zKVxuXApAQCAtNjcsNyArNjcsNyBAQAogLXMgICAgIDogZG9uJ3QgYWRkIHVzZXIgc2l0ZSBkaXJlY3RvcnkgdG8gc3lzLnBhdGg7IGFsc28gUFlUSE9OTk9VU0VSU0lURVxuXAogLVMgICAgIDogZG9uJ3QgaW1wbHkgJ2ltcG9ydCBzaXRlJyBvbiBpbml0aWFsaXphdGlvblxuXAogIjsKLXN0YXRpYyBjaGFyICp1c2FnZV8zID0gIlwKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlXzNbXSA9ICJcCiAtdSAgICAgOiB1bmJ1ZmZlcmVkIGJpbmFyeSBzdGRvdXQgYW5kIHN0ZGVyciwgc3RkaW4gYWx3YXlzIGJ1ZmZlcmVkO1xuXAogICAgICAgICAgYWxzbyBQWVRIT05VTkJVRkZFUkVEPXhcblwKICAgICAgICAgIHNlZSBtYW4gcGFnZSBmb3IgZGV0YWlscyBvbiBpbnRlcm5hbCBidWZmZXJpbmcgcmVsYXRpbmcgdG8gJy11J1xuXApAQCAtNzksNyArNzksNyBAQAogLXggICAgIDogc2tpcCBmaXJzdCBsaW5lIG9mIHNvdXJjZSwgYWxsb3dpbmcgdXNlIG9mIG5vbi1Vbml4IGZvcm1zIG9mICMhY21kXG5cCiAtWCBvcHQgOiBzZXQgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgb3B0aW9uXG5cCiAiOwotc3RhdGljIGNoYXIgKnVzYWdlXzQgPSAiXAorc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfNFtdID0gIlwKIGZpbGUgICA6IHByb2dyYW0gcmVhZCBmcm9tIHNjcmlwdCBmaWxlXG5cCiAtICAgICAgOiBwcm9ncmFtIHJlYWQgZnJvbSBzdGRpbiAoZGVmYXVsdDsgaW50ZXJhY3RpdmUgbW9kZSBpZiBhIHR0eSlcblwKIGFyZyAuLi46IGFyZ3VtZW50cyBwYXNzZWQgdG8gcHJvZ3JhbSBpbiBzeXMuYXJndlsxOl1cblxuXApAQCAtODgsMjIgKzg4LDIzIEBACiBQWVRIT05QQVRIICAgOiAnJWxjJy1zZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBwcmVmaXhlZCB0byB0aGVcblwKICAgICAgICAgICAgICAgIGRlZmF1bHQgbW9kdWxlIHNlYXJjaCBwYXRoLiAgVGhlIHJlc3VsdCBpcyBzeXMucGF0aC5cblwKICI7Ci1zdGF0aWMgY2hhciAqdXNhZ2VfNSA9CitzdGF0aWMgY29uc3QgY2hhciB1c2FnZV81W10gPQogIlBZVEhPTkhPTUUgICA6IGFsdGVybmF0ZSA8cHJlZml4PiBkaXJlY3RvcnkgKG9yIDxwcmVmaXg+JWxjPGV4ZWNfcHJlZml4PikuXG4iCiAiICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbW9kdWxlIHNlYXJjaCBwYXRoIHVzZXMgJXMuXG4iCiAiUFlUSE9OQ0FTRU9LIDogaWdub3JlIGNhc2UgaW4gJ2ltcG9ydCcgc3RhdGVtZW50cyAoV2luZG93cykuXG4iCiAiUFlUSE9OSU9FTkNPRElORzogRW5jb2RpbmdbOmVycm9yc10gdXNlZCBmb3Igc3RkaW4vc3Rkb3V0L3N0ZGVyci5cbiIKLSJQWVRIT05GQVVMVEhBTkRMRVI6IGR1bXAgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzLlxuXAotIjsKLXN0YXRpYyBjaGFyICp1c2FnZV82ID0gIlwKLVBZVEhPTkhBU0hTRUVEOiBpZiB0aGlzIHZhcmlhYmxlIGlzIHNldCB0byAncmFuZG9tJywgYSByYW5kb20gdmFsdWUgaXMgdXNlZFxuXAotICAgdG8gc2VlZCB0aGUgaGFzaGVzIG9mIHN0ciwgYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZVxuXAotICAgc2V0IHRvIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLDQyOTQ5NjcyOTVdIHRvIGdldCBoYXNoIHZhbHVlcyB3aXRoIGFcblwKLSAgIHByZWRpY3RhYmxlIHNlZWQuXG5cCi0iOworIlBZVEhPTkZBVUxUSEFORExFUjogZHVtcCB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMuXG4iOworc3RhdGljIGNvbnN0IGNoYXIgdXNhZ2VfNltdID0KKyJQWVRIT05IQVNIU0VFRDogaWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gJ3JhbmRvbScsIGEgcmFuZG9tIHZhbHVlIGlzIHVzZWRcbiIKKyIgICB0byBzZWVkIHRoZSBoYXNoZXMgb2Ygc3RyLCBieXRlcyBhbmQgZGF0ZXRpbWUgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlXG4iCisiICAgc2V0IHRvIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFswLDQyOTQ5NjcyOTVdIHRvIGdldCBoYXNoIHZhbHVlcyB3aXRoIGFcbiIKKyIgICBwcmVkaWN0YWJsZSBzZWVkLlxuIgorIlBZVEhPTk1BTExPQzogc2V0IHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3NcbiIKKyIgICBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMuIFVzZSBQWVRIT05NQUxMT0M9ZGVidWcgdG8gaW5zdGFsbCBkZWJ1Z1xuIgorIiAgIGhvb2tzLlxuIjsKIAogc3RhdGljIGludAotdXNhZ2UoaW50IGV4aXRjb2RlLCB3Y2hhcl90KiBwcm9ncmFtKQordXNhZ2UoaW50IGV4aXRjb2RlLCBjb25zdCB3Y2hhcl90KiBwcm9ncmFtKQogewogICAgIEZJTEUgKmYgPSBleGl0Y29kZSA/IHN0ZGVyciA6IHN0ZG91dDsKIApAQCAtMzQxLDYgKzM0Miw3IEBACiAgICAgaW50IGhlbHAgPSAwOwogICAgIGludCB2ZXJzaW9uID0gMDsKICAgICBpbnQgc2F3X3VuYnVmZmVyZWRfZmxhZyA9IDA7CisgICAgY2hhciAqb3B0OwogICAgIFB5Q29tcGlsZXJGbGFncyBjZjsKICAgICBQeU9iamVjdCAqd2FybmluZ19vcHRpb24gPSBOVUxMOwogICAgIFB5T2JqZWN0ICp3YXJuaW5nX29wdGlvbnMgPSBOVUxMOwpAQCAtMzY1LDYgKzM2NywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgb3B0ID0gUHlfR0VURU5WKCJQWVRIT05NQUxMT0MiKTsKKyAgICBpZiAoX1B5TWVtX1NldHVwQWxsb2NhdG9ycyhvcHQpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiRXJyb3IgaW4gUFlUSE9OTUFMTE9DOiB1bmtub3duIGFsbG9jYXRvciBcIiVzXCIhXG4iLCBvcHQpOworICAgICAgICBleGl0KDEpOworICAgIH0KKwogICAgIFB5X0hhc2hSYW5kb21pemF0aW9uRmxhZyA9IDE7CiAgICAgX1B5UmFuZG9tX0luaXQoKTsKIApAQCAtNjU0LDcgKzY2Myw3IEBACiAgICAgICAgICAgICBQeV9TZXRQcm9ncmFtTmFtZSh3YnVmKTsKIAogICAgICAgICAgICAgLyogRG9uJ3QgZnJlZSB3YnVmLCB0aGUgYXJndW1lbnQgdG8gUHlfU2V0UHJvZ3JhbU5hbWUKLSAgICAgICAgICAgICAqIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBQeV9GaW5hbGl6ZSBpcyBjYWxsZWQuCisgICAgICAgICAgICAgKiBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbCBQeV9GaW5hbGl6ZUV4IGlzIGNhbGxlZC4KICAgICAgICAgICAgICAqLwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlfU2V0UHJvZ3JhbU5hbWUoYXJndlswXSk7CkBAIC03ODUsNyArNzk0LDExIEBACiAgICAgICAgIHN0cyA9IFB5UnVuX0FueUZpbGVGbGFncyhzdGRpbiwgIjxzdGRpbj4iLCAmY2YpICE9IDA7CiAgICAgfQogCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICAvKiBWYWx1ZSB1bmxpa2VseSB0byBiZSBjb25mdXNlZCB3aXRoIGEgbm9uLWVycm9yIGV4aXQgc3RhdHVzIG9yCisgICAgICAgIG90aGVyIHNwZWNpYWwgbWVhbmluZyAqLworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiAjaWZkZWYgX19JTlNVUkVfXwogICAgIC8qIEluc3VyZSsrIGlzIGEgbWVtb3J5IGFuYWx5c2lzIHRvb2wgdGhhdCBhaWRzIGluIGRpc2NvdmVyaW5nCmRpZmYgLS1naXQgYS9Nb2R1bGVzL21hdGhtb2R1bGUuYyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCmluZGV4IDdlYmY4ZTguLmNmMDQ5MDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbWF0aG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbWF0aG1vZHVsZS5jCkBAIC04NzUsNyArODc1LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLW1hdGhfMihQeU9iamVjdCAqYXJncywgZG91YmxlICgqZnVuYykgKGRvdWJsZSwgZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCittYXRoXzIoUHlPYmplY3QgKmFyZ3MsIGRvdWJsZSAoKmZ1bmMpIChkb3VibGUsIGRvdWJsZSksIGNvbnN0IGNoYXIgKmZ1bmNuYW1lKQogewogICAgIFB5T2JqZWN0ICpveCwgKm95OwogICAgIGRvdWJsZSB4LCB5LCByOwpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKICAgIGluIHRoYXQgaW50IGlzIGxhcmdlciB0aGFuIFBZX1NTSVpFX1RfTUFYLiAqLwogCiBzdGF0aWMgUHlPYmplY3QqCi1sb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY2hhciAqZnVuY25hbWUpCitsb2doZWxwZXIoUHlPYmplY3QqIGFyZywgZG91YmxlICgqZnVuYykoZG91YmxlKSwgY29uc3QgY2hhciAqZnVuY25hbWUpCiB7CiAgICAgLyogSWYgaXQgaXMgaW50LCBkbyBpdCBvdXJzZWx2ZXMuICovCiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21tYXBtb2R1bGUuYyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCmluZGV4IGJiOThhOTkuLjUwY2VjMjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbW1hcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCkBAIC0zODksNiArMzg5LDcgQEAKICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5X2J1ZmZlciBkYXRhOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAKICAgICBDSEVDS19WQUxJRChOVUxMKTsKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqOndyaXRlIiwgJmRhdGEpKQpAQCAtNDA2LDkgKzQwNyw5IEBACiAgICAgfQogICAgIG1lbWNweShzZWxmLT5kYXRhICsgc2VsZi0+cG9zLCBkYXRhLmJ1ZiwgZGF0YS5sZW4pOwogICAgIHNlbGYtPnBvcyA9IHNlbGYtPnBvcyArIGRhdGEubGVuOworICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tU3NpemVfdChkYXRhLmxlbik7CiAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7Ci0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCmRpZmYgLS1naXQgYS9Nb2R1bGVzL25pc21vZHVsZS5jIGIvTW9kdWxlcy9uaXNtb2R1bGUuYwppbmRleCA2NGViNWRiLi5iNmE4NTVjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL25pc21vZHVsZS5jCisrKyBiL01vZHVsZXMvbmlzbW9kdWxlLmMKQEAgLTc2LDExICs3Niw3IEBACiAKICAgICAqcGZpeCA9IDA7CiAgICAgZm9yIChpPTA7IGFsaWFzZXNbaV0uYWxpYXMgIT0gMEw7IGkrKykgewotICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5hbGlhcywgbWFwKSkgewotICAgICAgICAgICAgKnBmaXggPSBhbGlhc2VzW2ldLmZpeDsKLSAgICAgICAgICAgIHJldHVybiBhbGlhc2VzW2ldLm1hcDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAgKGFsaWFzZXNbaV0uYWxpYXMsIG1hcCkgfHwgIXN0cmNtcCAoYWxpYXNlc1tpXS5tYXAsIG1hcCkpIHsKICAgICAgICAgICAgICpwZml4ID0gYWxpYXNlc1tpXS5maXg7CiAgICAgICAgICAgICByZXR1cm4gYWxpYXNlc1tpXS5tYXA7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvb3NzYXVkaW9kZXYuYyBiL01vZHVsZXMvb3NzYXVkaW9kZXYuYwppbmRleCBkMmZkNWM4Li4yYjdkNzFmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL29zc2F1ZGlvZGV2LmMKKysrIGIvTW9kdWxlcy9vc3NhdWRpb2Rldi5jCkBAIC0zMSw3ICszMSwxMSBAQAogI2VuZGlmCiAKICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2Vsc2UKICNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CisjZW5kaWYKIAogI2lmIGRlZmluZWQobGludXgpCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMgYi9Nb2R1bGVzL3BhcnNlcm1vZHVsZS5jCmluZGV4IDY0NzFiOGUuLjgyNzcwYTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcGFyc2VybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wYXJzZXJtb2R1bGUuYwpAQCAtNTMsNyArNTMsNyBAQAogLyogIFN0cmluZyBjb25zdGFudHMgdXNlZCB0byBpbml0aWFsaXplIG1vZHVsZSBhdHRyaWJ1dGVzLgogICoKICAqLwotc3RhdGljIGNoYXIgcGFyc2VyX2NvcHlyaWdodF9zdHJpbmdbXSA9CitzdGF0aWMgY29uc3QgY2hhciBwYXJzZXJfY29weXJpZ2h0X3N0cmluZ1tdID0KICJDb3B5cmlnaHQgMTk5NS0xOTk2IGJ5IFZpcmdpbmlhIFBvbHl0ZWNobmljIEluc3RpdHV0ZSAmIFN0YXRlXG5cCiBVbml2ZXJzaXR5LCBCbGFja3NidXJnLCBWaXJnaW5pYSwgVVNBLCBhbmQgRnJlZCBMLiBEcmFrZSwgSnIuLCBSZXN0b24sXG5cCiBWaXJnaW5pYSwgVVNBLiAgUG9ydGlvbnMgY29weXJpZ2h0IDE5OTEtMTk5NSBieSBTdGljaHRpbmcgTWF0aGVtYXRpc2NoXG5cCkBAIC02Myw3ICs2Myw3IEBACiBQeURvY19TVFJWQVIocGFyc2VyX2RvY19zdHJpbmcsCiAiVGhpcyBpcyBhbiBpbnRlcmZhY2UgdG8gUHl0aG9uJ3MgaW50ZXJuYWwgcGFyc2VyLiIpOwogCi1zdGF0aWMgY2hhciBwYXJzZXJfdmVyc2lvbl9zdHJpbmdbXSA9ICIwLjUiOworc3RhdGljIGNvbnN0IGNoYXIgcGFyc2VyX3ZlcnNpb25fc3RyaW5nW10gPSAiMC41IjsKIAogCiB0eXBlZGVmIFB5T2JqZWN0KiAoKlNlcU1ha2VyKSAoUHlfc3NpemVfdCBsZW5ndGgpOwpAQCAtNTc4LDEzICs1NzgsMTMgQEAKIH0KIAogCi0vKiAgZXJyX3N0cmluZyhjaGFyKiBtZXNzYWdlKQorLyogIGVycl9zdHJpbmcoY29uc3QgY2hhciogbWVzc2FnZSkKICAqCiAgKiAgU2V0cyB0aGUgZXJyb3Igc3RyaW5nIGZvciBhbiBleGNlcHRpb24gb2YgdHlwZSBQYXJzZXJFcnJvci4KICAqCiAgKi8KIHN0YXRpYyB2b2lkCi1lcnJfc3RyaW5nKGNoYXIgKm1lc3NhZ2UpCitlcnJfc3RyaW5nKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCiB7CiAgICAgUHlFcnJfU2V0U3RyaW5nKHBhcnNlcl9lcnJvciwgbWVzc2FnZSk7CiB9CkBAIC01OTcsNyArNTk3LDcgQEAKICAqCiAgKi8KIHN0YXRpYyBQeU9iamVjdCoKLXBhcnNlcl9kb19wYXJzZShQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3LCBjaGFyICphcmdzcGVjLCBpbnQgdHlwZSkKK3BhcnNlcl9kb19wYXJzZShQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3LCBjb25zdCBjaGFyICphcmdzcGVjLCBpbnQgdHlwZSkKIHsKICAgICBjaGFyKiAgICAgc3RyaW5nID0gMDsKICAgICBQeU9iamVjdCogcmVzICAgID0gMDsKQEAgLTY3MCw5ICs2NzAsNzUgQEAKIAogCiBzdGF0aWMgbm9kZSogYnVpbGRfbm9kZV90cmVlKFB5T2JqZWN0ICp0dXBsZSk7Ci1zdGF0aWMgaW50ICAgdmFsaWRhdGVfZXhwcl90cmVlKG5vZGUgKnRyZWUpOwotc3RhdGljIGludCAgIHZhbGlkYXRlX2ZpbGVfaW5wdXQobm9kZSAqdHJlZSk7Ci1zdGF0aWMgaW50ICAgdmFsaWRhdGVfZW5jb2RpbmdfZGVjbChub2RlICp0cmVlKTsKKworc3RhdGljIGludAordmFsaWRhdGVfbm9kZShub2RlICp0cmVlKQoreworICAgIGludCB0eXBlID0gVFlQRSh0cmVlKTsKKyAgICBpbnQgbmNoID0gTkNIKHRyZWUpOworICAgIGRmYSAqbnRfZGZhOworICAgIHN0YXRlICpkZmFfc3RhdGU7CisgICAgaW50IHBvcywgYXJjOworCisgICAgYXNzZXJ0KElTTk9OVEVSTUlOQUwodHlwZSkpOworICAgIHR5cGUgLT0gTlRfT0ZGU0VUOworICAgIGlmICh0eXBlID49IF9QeVBhcnNlcl9HcmFtbWFyLmdfbmRmYXMpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwgIlVucmVjb2duaXplZCBub2RlIHR5cGUgJWQuIiwgVFlQRSh0cmVlKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBudF9kZmEgPSAmX1B5UGFyc2VyX0dyYW1tYXIuZ19kZmFbdHlwZV07CisgICAgUkVRKHRyZWUsIG50X2RmYS0+ZF90eXBlKTsKKworICAgIC8qIFJ1biB0aGUgREZBIGZvciB0aGlzIG5vbnRlcm1pbmFsLiAqLworICAgIGRmYV9zdGF0ZSA9ICZudF9kZmEtPmRfc3RhdGVbbnRfZGZhLT5kX2luaXRpYWxdOworICAgIGZvciAocG9zID0gMDsgcG9zIDwgbmNoOyArK3BvcykgeworICAgICAgICBub2RlICpjaCA9IENISUxEKHRyZWUsIHBvcyk7CisgICAgICAgIGludCBjaF90eXBlID0gVFlQRShjaCk7CisgICAgICAgIGZvciAoYXJjID0gMDsgYXJjIDwgZGZhX3N0YXRlLT5zX25hcmNzOyArK2FyYykgeworICAgICAgICAgICAgc2hvcnQgYV9sYWJlbCA9IGRmYV9zdGF0ZS0+c19hcmNbYXJjXS5hX2xibDsKKyAgICAgICAgICAgIGFzc2VydChhX2xhYmVsIDwgX1B5UGFyc2VyX0dyYW1tYXIuZ19sbC5sbF9ubGFiZWxzKTsKKyAgICAgICAgICAgIGlmIChfUHlQYXJzZXJfR3JhbW1hci5nX2xsLmxsX2xhYmVsW2FfbGFiZWxdLmxiX3R5cGUgPT0gY2hfdHlwZSkgeworICAgICAJICAgICAgICAvKiBUaGUgY2hpbGQgaXMgYWNjZXB0YWJsZTsgaWYgbm9uLXRlcm1pbmFsLCB2YWxpZGF0ZSBpdCByZWN1cnNpdmVseS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoSVNOT05URVJNSU5BTChjaF90eXBlKSAmJiAhdmFsaWRhdGVfbm9kZShjaCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBzdGF0ZSwgYW5kIG1vdmUgb24gdG8gdGhlIG5leHQgY2hpbGQuICovCisgICAgICAgICAgICAgICAgZGZhX3N0YXRlID0gJm50X2RmYS0+ZF9zdGF0ZVtkZmFfc3RhdGUtPnNfYXJjW2FyY10uYV9hcnJvd107CisgICAgICAgICAgICAgICAgZ290byBhcmNfZm91bmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogV2hhdCB3b3VsZCB0aGlzIHN0YXRlIGhhdmUgYWNjZXB0ZWQ/ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0IGFfbGFiZWwgPSBkZmFfc3RhdGUtPnNfYXJjLT5hX2xibDsKKyAgICAgICAgICAgIGludCBuZXh0X3R5cGU7CisgICAgICAgICAgICBpZiAoIWFfbGFiZWwpIC8qIFdvdWxkbid0IGFjY2VwdCBhbnkgbW9yZSBjaGlsZHJlbiAqLworICAgICAgICAgICAgICAgIGdvdG8gaWxsZWdhbF9udW1fY2hpbGRyZW47CisKKyAgICAgICAgICAgIG5leHRfdHlwZSA9IF9QeVBhcnNlcl9HcmFtbWFyLmdfbGwubGxfbGFiZWxbYV9sYWJlbF0ubGJfdHlwZTsKKyAgICAgICAgICAgIGlmIChJU05PTlRFUk1JTkFMKG5leHRfdHlwZSkpCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwgIkV4cGVjdGVkIG5vZGUgdHlwZSAlZCwgZ290ICVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfdHlwZSwgY2hfdHlwZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwgIklsbGVnYWwgdGVybWluYWw6IGV4cGVjdGVkICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW25leHRfdHlwZV0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworYXJjX2ZvdW5kOgorICAgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgLyogQXJlIHdlIGluIGEgZmluYWwgc3RhdGU/IElmIHNvLCByZXR1cm4gMSBmb3Igc3VjY2Vzc2Z1bCB2YWxpZGF0aW9uLiAqLworICAgIGZvciAoYXJjID0gMDsgYXJjIDwgZGZhX3N0YXRlLT5zX25hcmNzOyArK2FyYykgeworICAgICAgICBpZiAoIWRmYV9zdGF0ZS0+c19hcmNbYXJjXS5hX2xibCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKK2lsbGVnYWxfbnVtX2NoaWxkcmVuOgorICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCisgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgJXMgbm9kZS4iLCBudF9kZmEtPmRfbmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CiAKIC8qICBQeU9iamVjdCogcGFyc2VyX3R1cGxlMnN0KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKICAqCkBAIC02ODEsNyArNzQ3LDcgQEAKICAqICB0dXBsZSBjYW4gYmUgdmFsaWRhdGVkLiAgSXQgZG9lcyB0aGlzIGJ5IGNoZWNraW5nIHRoZSBmaXJzdCBjb2RlIG9mIHRoZQogICogIHR1cGxlLCBhbmQsIGlmIGFjY2VwdGFibGUsIGJ1aWxkcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uICBJZiB0aGlzCiAgKiAgc3RlcCBzdWNjZWVkcywgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlzIHZhbGlkYXRlZCBhcyBmdWxseSBhcwotICogIHBvc3NpYmxlIHdpdGggdGhlIHZhcmlvdXMgdmFsaWRhdGVfKigpIHJvdXRpbmVzIGRlZmluZWQgYmVsb3cuCisgKiAgcG9zc2libGUgd2l0aCB0aGUgcmVjdXJzaXZlIHZhbGlkYXRlX25vZGUoKSByb3V0aW5lIGRlZmluZWQgYWJvdmUuCiAgKgogICogIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGFuZ2VkIGlmIHN1cHBvcnQgaXMgdG8gYmUgYWRkZWQgZm9yIFB5U1RfRlJBR01FTlQKICAqICBTVCBvYmplY3RzLgpAQCAtNzEwLDMzICs3NzYsMzUgQEAKICAgICAgKi8KICAgICB0cmVlID0gYnVpbGRfbm9kZV90cmVlKHR1cGxlKTsKICAgICBpZiAodHJlZSAhPSAwKSB7Ci0gICAgICAgIGludCBzdGFydF9zeW0gPSBUWVBFKHRyZWUpOwotICAgICAgICBpZiAoc3RhcnRfc3ltID09IGV2YWxfaW5wdXQpIHsKKyAgICAgICAgbm9kZSAqdmFsaWRhdGlvbl9yb290ID0gdHJlZTsKKyAgICAgICAgaW50IHRyZWVfdHlwZSA9IDA7CisgICAgICAgIHN3aXRjaCAoVFlQRSh0cmVlKSkgeworICAgICAgICBjYXNlIGV2YWxfaW5wdXQ6CiAgICAgICAgICAgICAvKiAgTWlnaHQgYmUgYW4gZXZhbCBmb3JtLiAgKi8KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9leHByX3RyZWUodHJlZSkpCi0gICAgICAgICAgICAgICAgc3QgPSBwYXJzZXJfbmV3c3RvYmplY3QodHJlZSwgUHlTVF9FWFBSKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBQeU5vZGVfRnJlZSh0cmVlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzdGFydF9zeW0gPT0gZmlsZV9pbnB1dCkgewotICAgICAgICAgICAgLyogIFRoaXMgbG9va3MgbGlrZSBhbiBleGVjIGZvcm0gc28gZmFyLiAgKi8KLSAgICAgICAgICAgIGlmICh2YWxpZGF0ZV9maWxlX2lucHV0KHRyZWUpKQotICAgICAgICAgICAgICAgIHN0ID0gcGFyc2VyX25ld3N0b2JqZWN0KHRyZWUsIFB5U1RfU1VJVEUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFB5Tm9kZV9GcmVlKHRyZWUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHN0YXJ0X3N5bSA9PSBlbmNvZGluZ19kZWNsKSB7CisgICAgICAgICAgICB0cmVlX3R5cGUgPSBQeVNUX0VYUFI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlbmNvZGluZ19kZWNsOgogICAgICAgICAgICAgLyogVGhpcyBsb29rcyBsaWtlIGFuIGVuY29kaW5nX2RlY2wgc28gZmFyLiAqLwotICAgICAgICAgICAgaWYgKHZhbGlkYXRlX2VuY29kaW5nX2RlY2wodHJlZSkpCi0gICAgICAgICAgICAgICAgc3QgPSBwYXJzZXJfbmV3c3RvYmplY3QodHJlZSwgUHlTVF9TVUlURSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgUHlOb2RlX0ZyZWUodHJlZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoTkNIKHRyZWUpICE9IDEpCisgICAgICAgICAgICAgICAgZXJyX3N0cmluZygiRXJyb3IgUGFyc2luZyBlbmNvZGluZ19kZWNsIik7CisgICAgICAgICAgICB2YWxpZGF0aW9uX3Jvb3QgPSBDSElMRCh0cmVlLCAwKTsKKyAgICAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIGZpbGVfaW5wdXQ6CisgICAgICAgICAgICAvKiAgVGhpcyBsb29rcyBsaWtlIGFuIGV4ZWMgZm9ybSBzbyBmYXIuICAqLworCisgICAgICAgICAgICB0cmVlX3R5cGUgPSBQeVNUX1NVSVRFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAvKiAgVGhpcyBpcyBhIGZyYWdtZW50LCBhdCBiZXN0LiAqLwogICAgICAgICAgICAgUHlOb2RlX0ZyZWUodHJlZSk7CiAgICAgICAgICAgICBlcnJfc3RyaW5nKCJwYXJzZSB0cmVlIGRvZXMgbm90IHVzZSBhIHZhbGlkIHN0YXJ0IHN5bWJvbCIpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKICAgICAgICAgfQorCisgICAgICAgIGlmICh2YWxpZGF0ZV9ub2RlKHZhbGlkYXRpb25fcm9vdCkpCisgICAgICAgICAgICBzdCA9IHBhcnNlcl9uZXdzdG9iamVjdCh0cmVlLCB0cmVlX3R5cGUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBQeU5vZGVfRnJlZSh0cmVlKTsKICAgICB9CiAgICAgLyogIE1ha2Ugc3VyZSB3ZSByYWlzZSBhbiBleGNlcHRpb24gb24gYWxsIGVycm9ycy4gIFdlIHNob3VsZCBuZXZlcgogICAgICAqICBnZXQgdGhpcywgYnV0IHdlJ2QgZG8gd2VsbCB0byBiZSBzdXJlIHNvbWV0aGluZyBpcyBkb25lLgpAQCAtOTgxLDI0MzMgKzEwNDksNiBAQAogfQogCiAKLS8qCi0gKiAgVmFsaWRhdGlvbiByb3V0aW5lcyB1c2VkIHdpdGhpbiB0aGUgdmFsaWRhdGlvbiBzZWN0aW9uOgotICovCi1zdGF0aWMgaW50IHZhbGlkYXRlX3Rlcm1pbmFsKG5vZGUgKnRlcm1pbmFsLCBpbnQgdHlwZSwgY2hhciAqc3RyaW5nKTsKLQotI2RlZmluZSB2YWxpZGF0ZV9hbXBlcnNhbmQoY2gpICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICBBTVBFUiwgIiYiKQotI2RlZmluZSB2YWxpZGF0ZV9jaXJjdW1mbGV4KGNoKSB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgQ0lSQ1VNRkxFWCwgIl4iKQotI2RlZmluZSB2YWxpZGF0ZV9jb2xvbihjaCkgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICBDT0xPTiwgIjoiKQotI2RlZmluZSB2YWxpZGF0ZV9jb21tYShjaCkgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICBDT01NQSwgIiwiKQotI2RlZmluZSB2YWxpZGF0ZV9kZWRlbnQoY2gpICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgIERFREVOVCwgIiIpCi0jZGVmaW5lIHZhbGlkYXRlX2VxdWFsKGNoKSAgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgIEVRVUFMLCAiPSIpCi0jZGVmaW5lIHZhbGlkYXRlX2luZGVudChjaCkgICAgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgSU5ERU5ULCAoY2hhciopTlVMTCkKLSNkZWZpbmUgdmFsaWRhdGVfbHBhcmVuKGNoKSAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgIExQQVIsICIoIikKLSNkZWZpbmUgdmFsaWRhdGVfbmV3bGluZShjaCkgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgIE5FV0xJTkUsIChjaGFyKilOVUxMKQotI2RlZmluZSB2YWxpZGF0ZV9ycGFyZW4oY2gpICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgUlBBUiwgIikiKQotI2RlZmluZSB2YWxpZGF0ZV9zZW1pKGNoKSAgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgU0VNSSwgIjsiKQotI2RlZmluZSB2YWxpZGF0ZV9zdGFyKGNoKSAgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgU1RBUiwgIioiKQotI2RlZmluZSB2YWxpZGF0ZV92YmFyKGNoKSAgICAgICB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgICAgICAgVkJBUiwgInwiKQotI2RlZmluZSB2YWxpZGF0ZV9kb3VibGVzdGFyKGNoKSB2YWxpZGF0ZV90ZXJtaW5hbChjaCwgRE9VQkxFU1RBUiwgIioqIikKLSNkZWZpbmUgdmFsaWRhdGVfZG90KGNoKSAgICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgICBET1QsICIuIikKLSNkZWZpbmUgdmFsaWRhdGVfYXQoY2gpICAgICAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICAgICAgQVQsICJAIikKLSNkZWZpbmUgdmFsaWRhdGVfcmFycm93KGNoKSAgICAgdmFsaWRhdGVfdGVybWluYWwoY2gsICAgICBSQVJST1csICItPiIpCi0jZGVmaW5lIHZhbGlkYXRlX25hbWUoY2gsIHN0cikgIHZhbGlkYXRlX3Rlcm1pbmFsKGNoLCAgICAgICBOQU1FLCBzdHIpCi0KLSNkZWZpbmUgVkFMSURBVEVSKG4pICAgIHN0YXRpYyBpbnQgdmFsaWRhdGVfIyNuKG5vZGUgKnRyZWUpCi0KLVZBTElEQVRFUihub2RlKTsgICAgICAgICAgICAgICAgVkFMSURBVEVSKHNtYWxsX3N0bXQpOwotVkFMSURBVEVSKGNsYXNzKTsgICAgICAgICAgICAgICBWQUxJREFURVIobm9kZSk7Ci1WQUxJREFURVIocGFyYW1ldGVycyk7ICAgICAgICAgIFZBTElEQVRFUihzdWl0ZSk7Ci1WQUxJREFURVIodGVzdGxpc3QpOyAgICAgICAgICAgIFZBTElEQVRFUih2YXJhcmdzbGlzdCk7Ci1WQUxJREFURVIodmZwZGVmKTsKLVZBTElEQVRFUihzdG10KTsgICAgICAgICAgICAgICAgVkFMSURBVEVSKHNpbXBsZV9zdG10KTsKLVZBTElEQVRFUihleHByX3N0bXQpOyAgICAgICAgICAgVkFMSURBVEVSKHBvd2VyKTsKLVZBTElEQVRFUihkZWxfc3RtdCk7Ci1WQUxJREFURVIocmV0dXJuX3N0bXQpOyAgICAgICAgIFZBTElEQVRFUihyYWlzZV9zdG10KTsKLVZBTElEQVRFUihpbXBvcnRfc3RtdCk7ICAgICAgICAgVkFMSURBVEVSKGltcG9ydF9zdG10KTsKLVZBTElEQVRFUihpbXBvcnRfbmFtZSk7ICAgICAgICAgVkFMSURBVEVSKHlpZWxkX3N0bXQpOwotVkFMSURBVEVSKGdsb2JhbF9zdG10KTsgICAgICAgICBWQUxJREFURVIobm9ubG9jYWxfc3RtdCk7Ci1WQUxJREFURVIoYXNzZXJ0X3N0bXQpOwotVkFMSURBVEVSKGNvbXBvdW5kX3N0bXQpOyAgICAgICBWQUxJREFURVIodGVzdF9vcl9zdGFyX2V4cHIpOwotVkFMSURBVEVSKHdoaWxlKTsgICAgICAgICAgICAgICBWQUxJREFURVIoZm9yKTsKLVZBTElEQVRFUih0cnkpOyAgICAgICAgICAgICAgICAgVkFMSURBVEVSKGV4Y2VwdF9jbGF1c2UpOwotVkFMSURBVEVSKHRlc3QpOyAgICAgICAgICAgICAgICBWQUxJREFURVIoYW5kX3Rlc3QpOwotVkFMSURBVEVSKG5vdF90ZXN0KTsgICAgICAgICAgICBWQUxJREFURVIoY29tcGFyaXNvbik7Ci1WQUxJREFURVIoY29tcF9vcCk7Ci1WQUxJREFURVIoc3Rhcl9leHByKTsgICAgICAgICAgIFZBTElEQVRFUihleHByKTsKLVZBTElEQVRFUih4b3JfZXhwcik7ICAgICAgICAgICAgVkFMSURBVEVSKGFuZF9leHByKTsKLVZBTElEQVRFUihzaGlmdF9leHByKTsgICAgICAgICAgVkFMSURBVEVSKGFyaXRoX2V4cHIpOwotVkFMSURBVEVSKHRlcm0pOyAgICAgICAgICAgICAgICBWQUxJREFURVIoZmFjdG9yKTsKLVZBTElEQVRFUihhdG9tKTsgICAgICAgICAgICAgICAgVkFMSURBVEVSKGxhbWJkZWYpOwotVkFMSURBVEVSKHRyYWlsZXIpOyAgICAgICAgICAgICBWQUxJREFURVIoc3Vic2NyaXB0KTsKLVZBTElEQVRFUihzdWJzY3JpcHRsaXN0KTsgICAgICAgVkFMSURBVEVSKHNsaWNlb3ApOwotVkFMSURBVEVSKGV4cHJsaXN0KTsgICAgICAgICAgICBWQUxJREFURVIoZGljdG9yc2V0bWFrZXIpOwotVkFMSURBVEVSKGFyZ2xpc3QpOyAgICAgICAgICAgICBWQUxJREFURVIoYXJndW1lbnQpOwotVkFMSURBVEVSKGNvbXBfZm9yKTsKLVZBTElEQVRFUihjb21wX2l0ZXIpOyAgICAgICAgICAgVkFMSURBVEVSKGNvbXBfaWYpOwotVkFMSURBVEVSKHRlc3RsaXN0X2NvbXApOyAgICAgICBWQUxJREFURVIoeWllbGRfZXhwcik7Ci1WQUxJREFURVIob3JfdGVzdCk7Ci1WQUxJREFURVIodGVzdF9ub2NvbmQpOyAgICAgICAgIFZBTElEQVRFUihsYW1iZGVmX25vY29uZCk7Ci1WQUxJREFURVIoeWllbGRfYXJnKTsKLVZBTElEQVRFUihhc3luY19mdW5jZGVmKTsgICAgICAgVkFMSURBVEVSKGFzeW5jX3N0bXQpOwotVkFMSURBVEVSKGF0b21fZXhwcik7Ci0KLSN1bmRlZiBWQUxJREFURVIKLQotI2RlZmluZSBpc19ldmVuKG4pICAgICAgKCgobikgJiAxKSA9PSAwKQotI2RlZmluZSBpc19vZGQobikgICAgICAgKCgobikgJiAxKSA9PSAxKQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX250eXBlKG5vZGUgKm4sIGludCB0KQotewotICAgIGlmIChUWVBFKG4pICE9IHQpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwgIkV4cGVjdGVkIG5vZGUgdHlwZSAlZCwgZ290ICVkLiIsCi0gICAgICAgICAgICAgICAgICAgICB0LCBUWVBFKG4pKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0KLS8qICBWZXJpZmllcyB0aGF0IHRoZSBudW1iZXIgb2YgY2hpbGQgbm9kZXMgaXMgZXhhY3RseSAnbnVtJywgcmFpc2luZwotICogIGFuIGV4Y2VwdGlvbiBpZiBpdCBpc24ndC4gIFRoZSBleGNlcHRpb24gbWVzc2FnZSBkb2VzIG5vdCBpbmRpY2F0ZQotICogIHRoZSBleGFjdCBudW1iZXIgb2Ygbm9kZXMsIGFsbG93aW5nIHRoaXMgdG8gYmUgdXNlZCB0byByYWlzZSB0aGUKLSAqICAicmlnaHQiIGV4Y2VwdGlvbiB3aGVuIHRoZSB3cm9uZyBudW1iZXIgb2Ygbm9kZXMgaXMgcHJlc2VudCBpbiBhCi0gKiAgc3BlY2lmaWMgdmFyaWFudCBvZiBhIHN0YXRlbWVudCdzIHN5bnRheC4gIFRoaXMgaXMgY29tbW9ubHkgdXNlZAotICogIGluIHRoYXQgZmFzaGlvbi4KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfbnVtbm9kZXMobm9kZSAqbiwgaW50IG51bSwgY29uc3QgY2hhciAqY29uc3QgbmFtZSkKLXsKLSAgICBpZiAoTkNIKG4pICE9IG51bSkgewotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciAlcyBub2RlLiIsIG5hbWUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVybWluYWwobm9kZSAqdGVybWluYWwsIGludCB0eXBlLCBjaGFyICpzdHJpbmcpCi17Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0ZXJtaW5hbCwgdHlwZSkKLSAgICAgICAgICAgICAgICYmICgoc3RyaW5nID09IDApIHx8IChzdHJjbXAoc3RyaW5nLCBTVFIodGVybWluYWwpKSA9PSAwKSkpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIHRlcm1pbmFsOiBleHBlY3RlZCBcIiVzXCIiLCBzdHJpbmcpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLS8qICBYICgnLCcgWCkgWycsJ10gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3JlcGVhdGluZ19saXN0X3ZhcmlhYmxlKG5vZGUgKnRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdF9ub2RlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCp2YWxpZGF0ZV9jaGlsZF9mdW5jX2luYykobm9kZSAqLCBpbnQgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IGxpc3Rfbm9kZV90eXBlX25hbWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKG5jaCAmJiB2YWxpZGF0ZV9udHlwZSh0cmVlLCBsaXN0X25vZGVfdHlwZSkpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgLyogVW5jb25kaXRpb25hbGx5IHJhaXNlLiAqLwotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgbGlzdF9ub2RlX3R5cGVfbmFtZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKCA7IHJlcyAmJiAqcG9zIDwgbmNoOyApIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NoaWxkX2Z1bmNfaW5jKHRyZWUsIHBvcyk7Ci0gICAgICAgICAgICBpZiAoIXJlcyB8fCAqcG9zID49IG5jaCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsICgqcG9zKSsrKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogIFggKCcsJyBYKSBbJywnXSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfcmVwZWF0aW5nX2xpc3Qobm9kZSAqdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0X25vZGVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKnZhbGlkYXRlX2NoaWxkX2Z1bmMpKG5vZGUgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb25zdCBsaXN0X25vZGVfdHlwZV9uYW1lKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IChuY2ggJiYgdmFsaWRhdGVfbnR5cGUodHJlZSwgbGlzdF9ub2RlX3R5cGUpKTsKLSAgICBpbnQgcG9zID0gMDsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIC8qIFVuY29uZGl0aW9uYWxseSByYWlzZS4gKi8KLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsIGxpc3Rfbm9kZV90eXBlX25hbWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yICggOyByZXMgJiYgcG9zIDwgbmNoOyApIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NoaWxkX2Z1bmMoQ0hJTEQodHJlZSwgcG9zKyspKTsKLSAgICAgICAgICAgIGlmICghcmVzIHx8IHBvcyA+PSBuY2gpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBwb3MrKykpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogIHZhbGlkYXRlX2NsYXNzKCkKLSAqCi0gKiAgY2xhc3NkZWY6Ci0gKiAgICAgICdjbGFzcycgTkFNRSBbJygnIHRlc3RsaXN0ICcpJ10gJzonIHN1aXRlCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NsYXNzKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGNsYXNzZGVmKSAmJgotICAgICAgICAgICAgICAgICgobmNoID09IDQpIHx8IChuY2ggPT0gNikgfHwgKG5jaCA9PSA3KSkpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImNsYXNzIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgbmNoIC0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDQsICJjbGFzcyIpOwotICAgIH0KLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKG5jaCA9PSA3KSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gKCh2YWxpZGF0ZV9scGFyZW4oQ0hJTEQodHJlZSwgMikpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZV9hcmdsaXN0KENISUxEKHRyZWUsIDMpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIDQpKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSA2KSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLDIpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsMykpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGlmX3N0bXQ6Ci0gKiAgICAgICdpZicgdGVzdCAnOicgc3VpdGUgKCdlbGlmJyB0ZXN0ICc6JyBzdWl0ZSkqIFsnZWxzZScgJzonIHN1aXRlXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBpZl9zdG10KQotICAgICAgICAgICAgICAgJiYgKG5jaCA+PSA0KQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDMpKSk7Ci0KLSAgICBpZiAocmVzICYmICgobmNoICUgNCkgPT0gMykpIHsKLSAgICAgICAgLyogIC4uLiAnZWxzZScgJzonIHN1aXRlICAqLwotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBuY2ggLSAzKSwgImVsc2UiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgbmNoIC0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotICAgICAgICBuY2ggLT0gMzsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDQsICJpZiIpOwotICAgIGlmICgobmNoICUgNCkgIT0gMCkKLSAgICAgICAgLyogV2lsbCBjYXRjaCB0aGUgY2FzZSBmb3IgbmNoIDwgNCAqLwotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAwLCAiaWYiKTsKLSAgICBlbHNlIGlmIChyZXMgJiYgKG5jaCA+IDQpKSB7Ci0gICAgICAgIC8qICAuLi4gKCdlbGlmJyB0ZXN0ICc6JyBzdWl0ZSkrIC4uLiAgKi8KLSAgICAgICAgaW50IGogPSA0OwotICAgICAgICB3aGlsZSAoKGogPCBuY2gpICYmIHJlcykgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgaiksICJlbGlmIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBqICsgMikpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBqICsgMSkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgaiArIDMpKSk7Ci0gICAgICAgICAgICBqICs9IDQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBwYXJhbWV0ZXJzOgotICogICAgICAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3BhcmFtZXRlcnMobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBwYXJhbWV0ZXJzKSAmJiAoKG5jaCA9PSAyKSB8fCAobmNoID09IDMpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotICAgICAgICBpZiAocmVzICYmIChuY2ggPT0gMykpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV92YXJhcmdzbGlzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInBhcmFtZXRlcnMiKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICB2YWxpZGF0ZV9zdWl0ZSgpCi0gKgotICogIHN1aXRlOgotICogICAgICBzaW1wbGVfc3RtdAotICogICAgfCBORVdMSU5FIElOREVOVCBzdG10KyBERURFTlQKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfc3VpdGUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgc3VpdGUpICYmICgobmNoID09IDEpIHx8IChuY2ggPj0gNCkpKTsKLQotICAgIGlmIChyZXMgJiYgKG5jaCA9PSAxKSkKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfc2ltcGxlX3N0bXQoQ0hJTEQodHJlZSwgMCkpOwotICAgIGVsc2UgaWYgKHJlcykgewotICAgICAgICAvKiAgTkVXTElORSBJTkRFTlQgc3RtdCsgREVERU5UICAqLwotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmV3bGluZShDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2luZGVudChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N0bXQoQ0hJTEQodHJlZSwgMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kZWRlbnQoQ0hJTEQodHJlZSwgbmNoIC0gMSkpKTsKLQotICAgICAgICBpZiAocmVzICYmIChuY2ggPiA0KSkgewotICAgICAgICAgICAgaW50IGkgPSAzOwotICAgICAgICAgICAgLS1uY2g7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZvcmdldCB0aGUgREVERU5UICAgICAqLwotICAgICAgICAgICAgZm9yICggOyByZXMgJiYgKGkgPCBuY2gpOyArK2kpCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc3RtdChDSElMRCh0cmVlLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmNoIDwgNCkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDQsICJzdWl0ZSIpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdGxpc3Qobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRyZWUsIHRlc3RsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfdGVzdCwgInRlc3RsaXN0IikpOwotfQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV90ZXN0bGlzdF9zdGFyX2V4cHIobm9kZSAqdGwpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0bCwgdGVzdGxpc3Rfc3Rhcl9leHByLCB2YWxpZGF0ZV90ZXN0X29yX3N0YXJfZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0bGlzdCIpKTsKLX0KLQotCi0vKiB2YWxpZGF0ZSBlaXRoZXIgdmZwZGVmIG9yIHRmcGRlZi4KLSAqIHZmcGRlZjogTkFNRQotICogdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdmZwZGVmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpZiAoVFlQRSh0cmVlKSA9PSB2ZnBkZWYpIHsKLSAgICAgICAgcmV0dXJuIG5jaCA9PSAxICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpOwotICAgIH0KLSAgICBlbHNlIGlmIChUWVBFKHRyZWUpID09IHRmcGRlZikgewotICAgICAgICBpZiAobmNoID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMykgewotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpICYmCi0gICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgMSkpICYmCi0gICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHZmcGRlZl0gfCAnKionIHZmcGRlZgotICogLi5vciB0ZnBkZWYgaW4gcGxhY2Ugb2YgdmZwZGVmLiB2ZnBkZWY6IE5BTUU7IHRmcGRlZjogTkFNRSBbJzonIHRlc3RdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3ZhcmFyZ3NsaXN0X3RyYWlsZXIobm9kZSAqdHJlZSwgaW50IHN0YXJ0KQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IDA7Ci0KLSAgICBpZiAobmNoIDw9IHN0YXJ0KSB7Ci0gICAgICAgIGVycl9zdHJpbmcoImV4cGVjdGVkIHZhcmlhYmxlIGFyZ3VtZW50IHRyYWlsZXIgZm9yIHZhcmFyZ3NsaXN0Iik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoVFlQRShDSElMRCh0cmVlLCBzdGFydCkpID09IFNUQVIpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogJyonIFt2ZnBkZWZdCi0gICAgICAgICAqLwotICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdGFyKENISUxEKHRyZWUsIHN0YXJ0KyspKTsKLSAgICAgICAgaWYgKHJlcyAmJiBzdGFydCA8IG5jaCAmJiAoVFlQRShDSElMRCh0cmVlLCBzdGFydCkpID09IHZmcGRlZiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFKENISUxEKHRyZWUsIHN0YXJ0KSkgPT0gdGZwZGVmKSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZmcGRlZihDSElMRCh0cmVlLCBzdGFydCsrKSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKgotICAgICAgICAgKi8KLSAgICAgICAgd2hpbGUgKHJlcyAmJiBzdGFydCArIDEgPCBuY2ggJiYgKAotICAgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQgKyAxKSkgPT0gdmZwZGVmIHx8Ci0gICAgICAgICAgICAgICAgICAgVFlQRShDSElMRCh0cmVlLCBzdGFydCArIDEpKSA9PSB0ZnBkZWYpKSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgc3RhcnQrKykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdmZwZGVmKENISUxEKHRyZWUsIHN0YXJ0KyspKSk7Ci0gICAgICAgICAgICBpZiAocmVzICYmIHN0YXJ0ICsgMSA8IG5jaCAmJiBUWVBFKENISUxEKHRyZWUsIHN0YXJ0KSkgPT0gRVFVQUwpCi0gICAgICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX2VxdWFsKENISUxEKHRyZWUsIHN0YXJ0KyspKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIHN0YXJ0KyspKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogWycsJyAnKionIHZmcGRlZl0KLSAgICAgICAgICovCi0gICAgICAgIGlmIChyZXMgJiYgc3RhcnQgKyAyIDwgbmNoICYmIFRZUEUoQ0hJTEQodHJlZSwgc3RhcnQrMSkpID09IERPVUJMRVNUQVIpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgc3RhcnQrKykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG91Ymxlc3RhcihDSElMRCh0cmVlLCBzdGFydCsrKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV92ZnBkZWYoQ0hJTEQodHJlZSwgc3RhcnQrKykpKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoVFlQRShDSElMRCh0cmVlLCBzdGFydCkpID09IERPVUJMRVNUQVIpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogJyoqJyB2ZnBkZWYKLSAgICAgICAgICovCi0gICAgICAgIGlmIChzdGFydCArIDEgPCBuY2gpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfZG91Ymxlc3RhcihDSElMRCh0cmVlLCBzdGFydCsrKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV92ZnBkZWYoQ0hJTEQodHJlZSwgc3RhcnQrKykpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiZXhwZWN0ZWQgdmZwZGVmIGFmdGVyICoqIGluIHZhcmFyZ3NsaXN0IHRyYWlsZXIiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgZXJyX3N0cmluZygiZXhwZWN0ZWQgKiBvciAqKiBpbiB2YXJhcmdzbGlzdCB0cmFpbGVyIik7Ci0gICAgfQotCi0gICAgaWYgKHJlcyAmJiBzdGFydCAhPSBuY2gpIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgZXJyX3N0cmluZygidW5leHBlY3RlZCBleHRyYSBjaGlsZHJlbiBpbiB2YXJhcmdzbGlzdCB0cmFpbGVyIik7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogdmFsaWRhdGVfdmFyYXJnc2xpc3QoKQotICoKLSAqIFZhbGlkYXRlIHR5cGVkYXJnc2xpc3Qgb3IgdmFyYXJnc2xpc3QuCi0gKgotICogdHlwZWRhcmdzbGlzdDogKCh0ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICogICAgICAgICAgICAgICAgICgnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0ZnBkZWZdIHwKLSAqICAgICAgICAgICAgICAgICAgJyoqJyB0ZnBkZWYpCi0gKiAgICAgICAgICAgICAgICAgfCB0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCi0gKiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotICogdmFyYXJnc2xpc3Q6ICgodmZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAqICAgICAgICAgICAgICAgKCcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogIFsnLCcgJyoqJyB2ZnBkZWZdIHwKLSAqICAgICAgICAgICAgICAgICcqKicgdmZwZGVmKQotICogICAgICAgICAgICAgICB8IHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKLSAqIHZmcGRlZjogTkFNRQotICoKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdmFyYXJnc2xpc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAoVFlQRSh0cmVlKSA9PSB2YXJhcmdzbGlzdCB8fAotICAgICAgICAgICAgICAgVFlQRSh0cmVlKSA9PSB0eXBlZGFyZ3NsaXN0KSAmJgotICAgICAgICAgICAgICAobmNoICE9IDApOwotICAgIGludCBzeW07Ci0gICAgbm9kZSAqY2g7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChuY2ggPCAxKSB7Ci0gICAgICAgIGVycl9zdHJpbmcoInZhcmFyZ3NsaXN0IG1pc3NpbmcgY2hpbGQgbm9kZXMiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHdoaWxlIChpIDwgbmNoKSB7Ci0gICAgICAgIGNoID0gQ0hJTEQodHJlZSwgaSk7Ci0gICAgICAgIHN5bSA9IFRZUEUoY2gpOwotICAgICAgICBpZiAoc3ltID09IHZmcGRlZiB8fCBzeW0gPT0gdGZwZGVmKSB7Ci0gICAgICAgICAgICAvKiB2YWxpZGF0ZSAodmZwZGVmIFsnPScgdGVzdF0gJywnKSsgKi8KLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZmcGRlZihjaCk7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICBpZiAocmVzICYmIChpKzIgPD0gbmNoKSAmJiBUWVBFKENISUxEKHRyZWUsIGkpKSA9PSBFUVVBTCkgewotICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9lcXVhbChDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBpKzEpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXMgJiYgaSA8IG5jaCkgewotICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIGkpKTsKLSAgICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3ltID09IERPVUJMRVNUQVIgfHwgc3ltID09IFNUQVIpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZhcmFyZ3NsaXN0X3RyYWlsZXIodHJlZSwgaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGZvcm1hdGlvbiBmb3IgdmFyYXJnc2xpc3QiKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qICBjb21wX2l0ZXI6ICBjb21wX2ZvciB8IGNvbXBfaWYKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfY29tcF9pdGVyKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBjb21wX2l0ZXIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiY29tcF9pdGVyIikpOwotICAgIGlmIChyZXMgJiYgVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gY29tcF9mb3IpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBfZm9yKENISUxEKHRyZWUsIDApKTsKLSAgICBlbHNlCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBfaWYoQ0hJTEQodHJlZSwgMCkpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogIGNvbXBfZm9yOiAgJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0IFtjb21wX2l0ZXJdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2NvbXBfZm9yKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzOwotCi0gICAgaWYgKG5jaCA9PSA1KQotICAgICAgICByZXMgPSB2YWxpZGF0ZV9jb21wX2l0ZXIoQ0hJTEQodHJlZSwgNCkpOwotICAgIGVsc2UKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgNCwgImNvbXBfZm9yIik7Ci0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImZvciIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHBybGlzdChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksICJpbiIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9vcl90ZXN0KENISUxEKHRyZWUsIDMpKSk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKiAgY29tcF9pZjogICdpZicgdGVzdF9ub2NvbmQgW2NvbXBfaXRlcl0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfY29tcF9pZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlczsKLQotICAgIGlmIChuY2ggPT0gMykKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcF9pdGVyKENISUxEKHRyZWUsIDIpKTsKLSAgICBlbHNlCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJjb21wX2lmIik7Ci0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImlmIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3Rfbm9jb25kKENISUxEKHRyZWUsIDEpKSk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLS8qICBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHN0bXQpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAic3RtdCIpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgdHJlZSA9IENISUxEKHRyZWUsIDApOwotCi0gICAgICAgIGlmIChUWVBFKHRyZWUpID09IHNpbXBsZV9zdG10KQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc2ltcGxlX3N0bXQodHJlZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBvdW5kX3N0bXQodHJlZSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXSBORVdMSU5FCi0gKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zaW1wbGVfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBzaW1wbGVfc3RtdCkKLSAgICAgICAgICAgICAgICYmIChuY2ggPj0gMikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3NtYWxsX3N0bXQoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uZXdsaW5lKENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0KLSAgICBpZiAobmNoIDwgMikKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInNpbXBsZV9zdG10Iik7Ci0gICAgLS1uY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yZ2V0IHRoZSBORVdMSU5FICAgICovCi0gICAgaWYgKHJlcyAmJiBpc19ldmVuKG5jaCkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3NlbWkoQ0hJTEQodHJlZSwgLS1uY2gpKTsKLSAgICBpZiAocmVzICYmIChuY2ggPiAyKSkgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgPCBuY2gpOyBpICs9IDIpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfc2VtaShDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zbWFsbF9zdG10KENISUxEKHRyZWUsIGkgKyAxKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfc21hbGxfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJzbWFsbF9zdG10Iik7Ci0KLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIGludCBudHlwZSA9IFRZUEUoQ0hJTEQodHJlZSwgMCkpOwotCi0gICAgICAgIGlmICggIChudHlwZSA9PSBleHByX3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBkZWxfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IHBhc3Nfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IGZsb3dfc3RtdCkKLSAgICAgICAgICAgICAgfHwgKG50eXBlID09IGltcG9ydF9zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gZ2xvYmFsX3N0bXQpCi0gICAgICAgICAgICAgIHx8IChudHlwZSA9PSBub25sb2NhbF9zdG10KQotICAgICAgICAgICAgICB8fCAobnR5cGUgPT0gYXNzZXJ0X3N0bXQpKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbm9kZShDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgc21hbGxfc3RtdCBjaGlsZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobmNoID09IDEpIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgY2hpbGQgbm9kZSBvZiBzbWFsbF9zdG10OiAlZC4iLAotICAgICAgICAgICAgICAgICAgICAgVFlQRShDSElMRCh0cmVlLCAwKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGNvbXBvdW5kX3N0bXQ6Ci0gKiAgICAgIGlmX3N0bXQgfCB3aGlsZV9zdG10IHwgZm9yX3N0bXQgfCB0cnlfc3RtdCB8IHdpdGhfc3RtdCB8IGZ1bmNkZWYgfCBjbGFzc2RlZiB8IGRlY29yYXRlZAotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wb3VuZF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBjb21wb3VuZF9zdG10KQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgImNvbXBvdW5kX3N0bXQiKSk7Ci0gICAgaW50IG50eXBlOwotCi0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiAoMCk7Ci0KLSAgICB0cmVlID0gQ0hJTEQodHJlZSwgMCk7Ci0gICAgbnR5cGUgPSBUWVBFKHRyZWUpOwotICAgIGlmICggIChudHlwZSA9PSBpZl9zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSB3aGlsZV9zdG10KQotICAgICAgICAgIHx8IChudHlwZSA9PSBmb3Jfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gdHJ5X3N0bXQpCi0gICAgICAgICAgfHwgKG50eXBlID09IHdpdGhfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gZnVuY2RlZikKLSAgICAgICAgICB8fCAobnR5cGUgPT0gYXN5bmNfc3RtdCkKLSAgICAgICAgICB8fCAobnR5cGUgPT0gY2xhc3NkZWYpCi0gICAgICAgICAgfHwgKG50eXBlID09IGRlY29yYXRlZCkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX25vZGUodHJlZSk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChwYXJzZXJfZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBjb21wb3VuZCBzdGF0ZW1lbnQgdHlwZTogJWQuIiwgVFlQRSh0cmVlKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfeWllbGRfb3JfdGVzdGxpc3Qobm9kZSAqdHJlZSwgaW50IHRzZSkKLXsKLSAgICBpZiAoVFlQRSh0cmVlKSA9PSB5aWVsZF9leHByKSB7Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZV95aWVsZF9leHByKHRyZWUpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKHRzZSkKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdF9zdGFyX2V4cHIodHJlZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4cHJfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBleHByX3N0bXQpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdGxpc3Rfc3Rhcl9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBpZiAocmVzICYmIG5jaCA9PSAzCi0gICAgICAgICYmIFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGF1Z2Fzc2lnbikgewotICAgICAgICByZXMgPSB2YWxpZGF0ZV9udW1ub2RlcyhDSElMRCh0cmVlLCAxKSwgMSwgImF1Z2Fzc2lnbiIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV95aWVsZF9vcl90ZXN0bGlzdChDSElMRCh0cmVlLCAyKSwgMCk7Ci0KLSAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgY2hhciAqcyA9IFNUUihDSElMRChDSElMRCh0cmVlLCAxKSwgMCkpOwotCi0gICAgICAgICAgICByZXMgPSAoc3RyY21wKHMsICIrPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIi09IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiKj0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICIvPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIi8vPSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIiU9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiJj0iKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgfHwgc3RyY21wKHMsICJ8PSIpID09IDAKLSAgICAgICAgICAgICAgICAgICB8fCBzdHJjbXAocywgIl49IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiPDw9IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiPj49IikgPT0gMAotICAgICAgICAgICAgICAgICAgIHx8IHN0cmNtcChzLCAiKio9IikgPT0gMCk7Ci0gICAgICAgICAgICBpZiAoIXJlcykKLSAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGF1Z21lbnRlZCBhc3NpZ25tZW50IG9wZXJhdG9yIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaiA9IDE7IHJlcyAmJiAoaiA8IG5jaCk7IGogKz0gMikKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2VxdWFsKENISUxEKHRyZWUsIGopKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3lpZWxkX29yX3Rlc3RsaXN0KENISUxEKHRyZWUsIGogKyAxKSwgMSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kZWxfc3RtdChub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImRlbF9zdG10IikKLSAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJkZWwiKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcmxpc3QoQ0hJTEQodHJlZSwgMSkpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9yZXR1cm5fc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCByZXR1cm5fc3RtdCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDEpIHx8IChuY2ggPT0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAicmV0dXJuIikpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDIpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCAxKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyoKLSAqICByYWlzZV9zdG10OgotICoKLSAqICAncmFpc2UnIFt0ZXN0IFsnZnJvbScgdGVzdF1dCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3JhaXNlX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgcmFpc2Vfc3RtdCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDEpIHx8IChuY2ggPT0gMikgfHwgKG5jaCA9PSA0KSkpOwotCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAyLCAicmFpc2UiKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgInJhaXNlIik7Ci0gICAgICAgIGlmIChyZXMgJiYgKG5jaCA+PSAyKSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICBpZiAocmVzICYmIChuY2ggPT0gNCkpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCAiZnJvbSIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAzKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiB5aWVsZF9leHByOiAneWllbGQnIFt5aWVsZF9hcmddCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3lpZWxkX2V4cHIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGlmIChuY2ggPCAxIHx8IG5jaCA+IDIpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmICghdmFsaWRhdGVfbnR5cGUodHJlZSwgeWllbGRfZXhwcikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmICghdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgInlpZWxkIikpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChuY2ggPT0gMikgewotICAgICAgICBpZiAoIXZhbGlkYXRlX3lpZWxkX2FyZyhDSElMRCh0cmVlLCAxKSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLS8qIHlpZWxkX2FyZzogJ2Zyb20nIHRlc3QgfCB0ZXN0bGlzdAotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV95aWVsZF9hcmcobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGlmICghdmFsaWRhdGVfbnR5cGUodHJlZSwgeWllbGRfYXJnKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgc3dpdGNoIChuY2gpIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKCF2YWxpZGF0ZV90ZXN0bGlzdChDSElMRCh0cmVlLCBuY2ggLSAxKSkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIGlmICghdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImZyb20iKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIXZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiAxOwotfQotCi0vKiB5aWVsZF9zdG10OiB5aWVsZF9leHByCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3lpZWxkX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICByZXR1cm4gKHZhbGlkYXRlX250eXBlKHRyZWUsIHlpZWxkX3N0bXQpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAieWllbGRfc3RtdCIpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV95aWVsZF9leHByKENISUxEKHRyZWUsIDApKSk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfaW1wb3J0X2FzX25hbWUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBvayA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGltcG9ydF9hc19uYW1lKTsKLQotICAgIGlmIChvaykgewotICAgICAgICBpZiAobmNoID09IDEpCi0gICAgICAgICAgICBvayA9IHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpOwotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMykKLSAgICAgICAgICAgIG9rID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpCi0gICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDEpLCAiYXMiKQotICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAyKSwgTlVMTCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBvayA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDMsICJpbXBvcnRfYXNfbmFtZSIpOwotICAgIH0KLSAgICByZXR1cm4gb2s7Ci19Ci0KLQotLyogZG90dGVkX25hbWU6ICBOQU1FICgiLiIgTkFNRSkqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RvdHRlZF9uYW1lKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRvdHRlZF9uYW1lKQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksIE5VTEwpKTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSA8IG5jaCk7IGkgKz0gMikgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfZG90KENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBpKzEpLCBOVUxMKSk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotLyogZG90dGVkX2FzX25hbWU6ICBkb3R0ZWRfbmFtZSBbTkFNRSBOQU1FXQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGRvdHRlZF9hc19uYW1lKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKG5jaCA9PSAxKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZG90dGVkX25hbWUoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMykKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9kb3R0ZWRfbmFtZShDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDEpLCAiYXMiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksIE5VTEwpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGRvdHRlZF9hc19uYW1lIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBkb3R0ZWRfYXNfbmFtZSAoJywnIGRvdHRlZF9hc19uYW1lKSogKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RvdHRlZF9hc19uYW1lcyhub2RlICp0cmVlKQotewotICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgICAgICBpbnQgcmVzID0gaXNfb2RkKG5jaCkgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmb3IgKGkgPSAxOyByZXMgJiYgKGkgPCBuY2gpOyBpICs9IDIpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaSkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG90dGVkX2FzX25hbWUoQ0hJTEQodHJlZSwgaSArIDEpKSk7Ci0gICAgICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiBpbXBvcnRfYXNfbmFtZSAoJywnIGltcG9ydF9hc19uYW1lKSogWycsJ10gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ltcG9ydF9hc19uYW1lcyhub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lKENISUxEKHRyZWUsIDApKTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDE7IHJlcyAmJiAoaSArIDEgPCBuY2gpOyBpICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2ltcG9ydF9hc19uYW1lKENISUxEKHRyZWUsIGkgKyAxKSkpOwotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMgKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ltcG9ydF9uYW1lKG5vZGUgKnRyZWUpCi17Ci0gICAgICAgIHJldHVybiAodmFsaWRhdGVfbnR5cGUodHJlZSwgaW1wb3J0X25hbWUpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImltcG9ydF9uYW1lIikKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiaW1wb3J0IikKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3R0ZWRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgMSkpKTsKLX0KLQotLyogSGVscGVyIGZ1bmN0aW9uIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyBkb3RzIChvciBlbGxpcHNpcyB0b2tlbnMpIGluCi0gKiAnZnJvbSAuLi5tb2R1bGUgaW1wb3J0IG5hbWUnCi0gKi8KLXN0YXRpYyBpbnQKLWNvdW50X2Zyb21fZG90cyhub2RlICp0cmVlKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDE7IGkgPCBOQ0godHJlZSk7IGkrKykKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgaSkpICE9IERPVCAmJiBUWVBFKENISUxEKHRyZWUsIGkpKSAhPSBFTExJUFNJUykKLSAgICAgICAgICAgIGJyZWFrOwotICAgIHJldHVybiBpIC0gMTsKLX0KLQotLyogaW1wb3J0X2Zyb206ICgnZnJvbScgKCcuJyogZG90dGVkX25hbWUgfCAnLicrKQotICogICAgICAgICAgICAgICAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpKQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pbXBvcnRfZnJvbShub2RlICp0cmVlKQotewotICAgICAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgICAgICBpbnQgbmRvdHMgPSBjb3VudF9mcm9tX2RvdHModHJlZSk7Ci0gICAgICAgIGludCBoYXZlbmFtZSA9IChUWVBFKENISUxEKHRyZWUsIG5kb3RzICsgMSkpID09IGRvdHRlZF9uYW1lKTsKLSAgICAgICAgaW50IG9mZnNldCA9IG5kb3RzICsgaGF2ZW5hbWU7Ci0gICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBpbXBvcnRfZnJvbSkKLSAgICAgICAgICAgICAgICAmJiAob2Zmc2V0ID49IDEpCi0gICAgICAgICAgICAgICAgJiYgKG5jaCA+PSAzICsgb2Zmc2V0KQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmcm9tIikKLSAgICAgICAgICAgICAgICAmJiAoIWhhdmVuYW1lIHx8IHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIG5kb3RzICsgMSkpKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMSksICJpbXBvcnQiKTsKLQotICAgICAgICBpZiAocmVzICYmIFRZUEUoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMikpID09IExQQVIpCi0gICAgICAgICAgICByZXMgPSAoKG5jaCA9PSBvZmZzZXQgKyA1KQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCBvZmZzZXQgKyAyKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9pbXBvcnRfYXNfbmFtZXMoQ0hJTEQodHJlZSwgb2Zmc2V0ICsgMykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcnBhcmVuKENISUxEKHRyZWUsIG9mZnNldCArIDQpKSk7Ci0gICAgICAgIGVsc2UgaWYgKHJlcyAmJiBUWVBFKENISUxEKHRyZWUsIG9mZnNldCArIDIpKSAhPSBTVEFSKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfaW1wb3J0X2FzX25hbWVzKENISUxEKHRyZWUsIG9mZnNldCArIDIpKTsKLSAgICAgICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qIGltcG9ydF9zdG10OiBpbXBvcnRfbmFtZSB8IGltcG9ydF9mcm9tICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9pbXBvcnRfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJpbXBvcnRfc3RtdCIpOwotCi0gICAgaWYgKHJlcykgewotICAgICAgICBpbnQgbnR5cGUgPSBUWVBFKENISUxEKHRyZWUsIDApKTsKLQotICAgICAgICBpZiAobnR5cGUgPT0gaW1wb3J0X25hbWUgfHwgbnR5cGUgPT0gaW1wb3J0X2Zyb20pCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9ub2RlKENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBpbXBvcnRfc3RtdCBjaGlsZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAobmNoID09IDEpIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgY2hpbGQgbm9kZSBvZiBpbXBvcnRfc3RtdDogJWQuIiwKLSAgICAgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQodHJlZSwgMCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBnbG9iYWxfc3RtdDoKLSAqCi0gKiAgJ2dsb2JhbCcgTkFNRSAoJywnIE5BTUUpKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9nbG9iYWxfc3RtdChub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBnbG9iYWxfc3RtdCkKLSAgICAgICAgICAgICAgICYmIGlzX2V2ZW4obmNoKSAmJiAobmNoID49IDIpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGdsb2JhbCBzdGF0ZW1lbnQiKTsKLQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZ2xvYmFsIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDEpLCBOQU1FKSk7Ci0gICAgZm9yIChqID0gMjsgcmVzICYmIChqIDwgbmNoKTsgaiArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29tbWEoQ0hJTEQodHJlZSwgaikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBqICsgMSksIE5BTUUpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotLyogIG5vbmxvY2FsX3N0bXQ6Ci0gKgotICogICdub25sb2NhbCcgTkFNRSAoJywnIE5BTUUpKgotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9ub25sb2NhbF9zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIG5vbmxvY2FsX3N0bXQpCi0gICAgICAgICAgICAgICAmJiBpc19ldmVuKG5jaCkgJiYgKG5jaCA+PSAyKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBub25sb2NhbCBzdGF0ZW1lbnQiKTsKLQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAibm9ubG9jYWwiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpKTsKLSAgICBmb3IgKGogPSAyOyByZXMgJiYgKGogPCBuY2gpOyBqICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBqKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIGogKyAxKSwgTkFNRSkpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogIGFzc2VydF9zdG10OgotICoKLSAqICAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfYXNzZXJ0X3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgYXNzZXJ0X3N0bXQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAyKSB8fCAobmNoID09IDQpKQotICAgICAgICAgICAgICAgJiYgKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJhc3NlcnQiKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGFzc2VydCBzdGF0ZW1lbnQiKTsKLSAgICBpZiAocmVzICYmIChuY2ggPiAyKSkKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2NvbW1hKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAzKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3doaWxlKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHdoaWxlX3N0bXQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSA0KSB8fCAobmNoID09IDcpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgIndoaWxlIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDMpKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gNykpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDQpLCAiZWxzZSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCA1KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDYpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZm9yKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGZvcl9zdG10KQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gNikgfHwgKG5jaCA9PSA5KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJmb3IiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZXhwcmxpc3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDIpLCAiaW4iKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCA0KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDUpKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gOSkpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDYpLCAiZWxzZSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCA3KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDgpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHRyeV9zdG10OgotICogICAgICAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2ZpbmFsbHknICc6JyBzdWl0ZV0KLSAqICAgIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKLSAqCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3RyeShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHBvcyA9IDM7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB0cnlfc3RtdCkKLSAgICAgICAgICAgICAgICYmIChuY2ggPj0gNikgJiYgKChuY2ggJSAzKSA9PSAwKSk7Ci0KLSAgICBpZiAocmVzKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgInRyeSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgbmNoIC0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotICAgIGVsc2UgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSAiZXhjZXB0IjsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgbmNoIC0gMykpICE9IGV4Y2VwdF9jbGF1c2UpCi0gICAgICAgICAgICBuYW1lID0gU1RSKENISUxEKHRyZWUsIG5jaCAtIDMpKTsKLQotICAgICAgICBQeUVycl9Gb3JtYXQocGFyc2VyX2Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgIklsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciB0cnkvJXMgbm9kZS4iLCBuYW1lKTsKLSAgICB9Ci0gICAgLyogSGFuZGxlIHRyeS9maW5hbGx5IHN0YXRlbWVudCAqLwotICAgIGlmIChyZXMgJiYgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gTkFNRSkgJiYKLSAgICAgICAgKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgcG9zKSksICJmaW5hbGx5IikgPT0gMCkpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDYsICJ0cnkvZmluYWxseSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCA0KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIDUpKSk7Ci0gICAgICAgIHJldHVybiAocmVzKTsKLSAgICB9Ci0gICAgLyogdHJ5L2V4Y2VwdCBzdGF0ZW1lbnQ6IHNraXAgcGFzdCBleGNlcHRfY2xhdXNlIHNlY3Rpb25zICovCi0gICAgd2hpbGUgKHJlcyAmJiBwb3MgPCBuY2ggJiYgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gZXhjZXB0X2NsYXVzZSkpIHsKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2V4Y2VwdF9jbGF1c2UoQ0hJTEQodHJlZSwgcG9zKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIHBvcyArIDEpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoQ0hJTEQodHJlZSwgcG9zICsgMikpKTsKLSAgICAgICAgcG9zICs9IDM7Ci0gICAgfQotICAgIC8qIHNraXAgZWxzZSBjbGF1c2UgKi8KLSAgICBpZiAocmVzICYmIHBvcyA8IG5jaCAmJiAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBOQU1FKSAmJgotICAgICAgICAoc3RyY21wKFNUUihDSElMRCh0cmVlLCBwb3MpKSwgImVsc2UiKSA9PSAwKSkgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgcG9zICsgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCBwb3MgKyAyKSkpOwotICAgICAgICBwb3MgKz0gMzsKLSAgICB9Ci0gICAgaWYgKHJlcyAmJiBwb3MgPCBuY2gpIHsKLSAgICAgICAgLyogbGFzdCBjbGF1c2UgbXVzdCBiZSBhIGZpbmFsbHkgKi8KLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgcG9zKSwgImZpbmFsbHkiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgcG9zICsgMywgInRyeS9leGNlcHQvZmluYWxseSIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCBwb3MgKyAxKSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1aXRlKENISUxEKHRyZWUsIHBvcyArIDIpKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leGNlcHRfY2xhdXNlKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGV4Y2VwdF9jbGF1c2UpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID09IDIpIHx8IChuY2ggPT0gNCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAiZXhjZXB0IikpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID4gMSkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgIGlmIChyZXMgJiYgKG5jaCA9PSA0KSkKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMiksICJhcyIpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAzKSwgTkFNRSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCB0ZXN0KSAmJiBpc19vZGQobmNoKTsKLQotICAgIGlmIChyZXMgJiYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IGxhbWJkZWYpKQotICAgICAgICByZXMgPSAoKG5jaCA9PSAxKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbGFtYmRlZihDSElMRCh0cmVlLCAwKSkpOwotICAgIGVsc2UgaWYgKHJlcykgewotICAgICAgICByZXMgPSB2YWxpZGF0ZV9vcl90ZXN0KENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgcmVzID0gKHJlcyAmJiAobmNoID09IDEgfHwgKG5jaCA9PSA1ICYmCi0gICAgICAgICAgICB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDEpLCAiaWYiKSAmJgotICAgICAgICAgICAgdmFsaWRhdGVfb3JfdGVzdChDSElMRCh0cmVlLCAyKSkgJiYKLSAgICAgICAgICAgIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMyksICJlbHNlIikgJiYKLSAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgNCkpKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3Rfbm9jb25kKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgdGVzdF9ub2NvbmQpICYmIChuY2ggPT0gMSk7Ci0KLSAgICBpZiAocmVzICYmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBsYW1iZGVmX25vY29uZCkpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9sYW1iZGVmX25vY29uZChDSElMRCh0cmVlLCAwKSkpOwotICAgIGVsc2UgaWYgKHJlcykgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfb3JfdGVzdChDSElMRCh0cmVlLCAwKSkpOwotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX29yX3Rlc3Qobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBvcl90ZXN0KSAmJiBpc19vZGQobmNoKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaW50IHBvczsKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfYW5kX3Rlc3QoQ0hJTEQodHJlZSwgMCkpOwotICAgICAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCBwb3MpLCAib3IiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2FuZF90ZXN0KENISUxEKHRyZWUsIHBvcyArIDEpKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hbmRfdGVzdChub2RlICp0cmVlKQotewotICAgIGludCBwb3M7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFuZF90ZXN0KQotICAgICAgICAgICAgICAgJiYgaXNfb2RkKG5jaCkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25vdF90ZXN0KENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIHBvcyksICJhbmQiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbm90X3Rlc3QoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9ub3RfdGVzdChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIG5vdF90ZXN0KSAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID09IDIpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKG5jaCA9PSAyKQotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJub3QiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25vdF90ZXN0KENISUxEKHRyZWUsIDEpKSk7Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAxKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcGFyaXNvbihDSElMRCh0cmVlLCAwKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9jb21wYXJpc29uKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvczsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgY29tcGFyaXNvbikKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpCi0gICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9jb21wX29wKENISUxEKHRyZWUsIHBvcykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsIHBvcyArIDEpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfY29tcF9vcChub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSAwOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0KLSAgICBpZiAoIXZhbGlkYXRlX250eXBlKHRyZWUsIGNvbXBfb3ApKQotICAgICAgICByZXR1cm4gKDApOwotICAgIGlmIChuY2ggPT0gMSkgewotICAgICAgICAvKgotICAgICAgICAgKiAgT25seSBjaGlsZCB3aWxsIGJlIGEgdGVybWluYWwgd2l0aCBhIHdlbGwtZGVmaW5lZCBzeW1ib2xpYyBuYW1lCi0gICAgICAgICAqICBvciBhIE5BTUUgd2l0aCBhIHN0cmluZyBvZiBlaXRoZXIgJ2lzJyBvciAnaW4nCi0gICAgICAgICAqLwotICAgICAgICB0cmVlID0gQ0hJTEQodHJlZSwgMCk7Ci0gICAgICAgIHN3aXRjaCAoVFlQRSh0cmVlKSkgewotICAgICAgICAgIGNhc2UgTEVTUzoKLSAgICAgICAgICBjYXNlIEdSRUFURVI6Ci0gICAgICAgICAgY2FzZSBFUUVRVUFMOgotICAgICAgICAgIGNhc2UgRVFVQUw6Ci0gICAgICAgICAgY2FzZSBMRVNTRVFVQUw6Ci0gICAgICAgICAgY2FzZSBHUkVBVEVSRVFVQUw6Ci0gICAgICAgICAgY2FzZSBOT1RFUVVBTDoKLSAgICAgICAgICAgICAgcmVzID0gMTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBOQU1FOgotICAgICAgICAgICAgICByZXMgPSAoKHN0cmNtcChTVFIodHJlZSksICJpbiIpID09IDApCi0gICAgICAgICAgICAgICAgICAgICB8fCAoc3RyY21wKFNUUih0cmVlKSwgImlzIikgPT0gMCkpOwotICAgICAgICAgICAgICBpZiAoIXJlcykgewotICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHBhcnNlcl9lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCBvcGVyYXRvciAnJXMnIiwgU1RSKHRyZWUpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGNvbXBhcmlzb24gb3BlcmF0b3IgdHlwZSIpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICgocmVzID0gdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgImNvbXBfb3AiKSkgIT0gMCkgewotICAgICAgICByZXMgPSAodmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMCksIE5BTUUpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkKLSAgICAgICAgICAgICAgICYmICgoKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgMCkpLCAiaXMiKSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAmJiAoc3RyY21wKFNUUihDSElMRCh0cmVlLCAxKSksICJub3QiKSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICB8fCAoKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgMCkpLCAibm90IikgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgJiYgKHN0cmNtcChTVFIoQ0hJTEQodHJlZSwgMSkpLCAiaW4iKSA9PSAwKSkpKTsKLSAgICAgICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICBlcnJfc3RyaW5nKCJ1bmtub3duIGNvbXBhcmlzb24gb3BlcmF0b3IiKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3N0YXJfZXhwcihub2RlICp0cmVlKQotewotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBzdGFyX2V4cHIpOwotICAgIGlmICghcmVzKSByZXR1cm4gcmVzOwotICAgIGlmICghdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMiwgInN0YXJfZXhwciIpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMCksIFNUQVIpICYmICAgICAgXAotICAgICAgICB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsIDEpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IGo7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGV4cHIpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfeG9yX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAoaiA9IDI7IHJlcyAmJiAoaiA8IG5jaCk7IGogKz0gMikKLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX3hvcl9leHByKENISUxEKHRyZWUsIGopKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdmJhcihDSElMRCh0cmVlLCBqIC0gMSkpKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV94b3JfZXhwcihub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB4b3JfZXhwcikKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9hbmRfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yIChqID0gMjsgcmVzICYmIChqIDwgbmNoKTsgaiArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfY2lyY3VtZmxleChDSElMRCh0cmVlLCBqIC0gMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9hbmRfZXhwcihDSElMRCh0cmVlLCBqKSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2FuZF9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHBvczsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgYW5kX2V4cHIpCi0gICAgICAgICAgICAgICAmJiBpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfc2hpZnRfZXhwcihDSElMRCh0cmVlLCAwKSkpOwotCi0gICAgZm9yIChwb3MgPSAxOyByZXMgJiYgKHBvcyA8IG5jaCk7IHBvcyArPSAyKQotICAgICAgICByZXMgPSAodmFsaWRhdGVfYW1wZXJzYW5kKENISUxEKHRyZWUsIHBvcykpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zaGlmdF9leHByKENISUxEKHRyZWUsIHBvcyArIDEpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfY2hhaW5fdHdvX29wcyhub2RlICp0cmVlLCBpbnQgKCp0ZXJtdmFsaWQpKG5vZGUgKiksIGludCBvcDEsIGludCBvcDIpCi0gewotICAgIGludCBwb3MgPSAxOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IChpc19vZGQobmNoKQotICAgICAgICAgICAgICAgJiYgKCp0ZXJtdmFsaWQpKENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBmb3IgKCA7IHJlcyAmJiAocG9zIDwgbmNoKTsgcG9zICs9IDIpIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgIT0gb3AxKQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgcG9zKSwgb3AyKTsKLSAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgIHJlcyA9ICgqdGVybXZhbGlkKShDSElMRCh0cmVlLCBwb3MgKyAxKSk7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9zaGlmdF9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBzaGlmdF9leHByKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfY2hhaW5fdHdvX29wcyh0cmVlLCB2YWxpZGF0ZV9hcml0aF9leHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRUZUU0hJRlQsIFJJR0hUU0hJRlQpKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hcml0aF9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBhcml0aF9leHByKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfY2hhaW5fdHdvX29wcyh0cmVlLCB2YWxpZGF0ZV90ZXJtLCBQTFVTLCBNSU5VUykpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlcm0obm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zID0gMTsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgdGVybSkKLSAgICAgICAgICAgICAgICYmIGlzX29kZChuY2gpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9mYWN0b3IoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGZvciAoIDsgcmVzICYmIChwb3MgPCBuY2gpOyBwb3MgKz0gMikKLSAgICAgICAgcmVzID0gKCgoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBTVEFSKQotICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgcG9zKSkgPT0gU0xBU0gpCi0gICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSBET1VCTEVTTEFTSCkKLSAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIHBvcykpID09IFBFUkNFTlQpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZmFjdG9yKENISUxEKHRyZWUsIHBvcyArIDEpKSk7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGZhY3RvcjoKLSAqCi0gKiAgZmFjdG9yOiAoJysnfCctJ3wnficpIGZhY3RvciB8IHBvd2VyCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2ZhY3Rvcihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBmYWN0b3IpCi0gICAgICAgICAgICAgICAmJiAoKChuY2ggPT0gMikKLSAgICAgICAgICAgICAgICAgICAgJiYgKChUWVBFKENISUxEKHRyZWUsIDApKSA9PSBQTFVTKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IE1JTlVTKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IFRJTERFKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZmFjdG9yKENISUxEKHRyZWUsIDEpKSkKLSAgICAgICAgICAgICAgICAgICB8fCAoKG5jaCA9PSAxKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9wb3dlcihDSElMRCh0cmVlLCAwKSkpKSk7Ci0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBwb3dlcjoKLSAqCi0gKiAgcG93ZXI6IGF0b21fZXhwciB0cmFpbGVyKiBbJyoqJyBmYWN0b3JdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Bvd2VyKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHBvd2VyKSAmJiAobmNoID49IDEpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9hdG9tX2V4cHIoQ0hJTEQodHJlZSwgMCkpKTsKLQotICAgIGlmIChuY2ggPiAxKSB7Ci0gICAgICAgIGlmIChuY2ggIT0gMykgewotICAgICAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2Ygbm9kZXMgZm9yICdwb3dlciciKTsKLSAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzID0gKHZhbGlkYXRlX2RvdWJsZXN0YXIoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9mYWN0b3IoQ0hJTEQodHJlZSwgMikpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIGF0b21fZXhwcjoKLSAqCi0gKiAgYXRvbV9leHByOiBbQVdBSVRdIGF0b20gdHJhaWxlcioKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfYXRvbV9leHByKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXM7Ci0gICAgaW50IHBvczsKLQotICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGF0b21fZXhwcikgJiYgKG5jaCA+PSAxKTsKLSAgICBpZiAoIXJlcykgewotICAgICAgICByZXR1cm4gKHJlcyk7Ci0gICAgfQotCi0gICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IEFXQUlUKSB7Ci0gICAgICAgIHN0YXJ0ID0gMTsKLSAgICAgICAgaWYgKG5jaCA8IDIpIHsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIG5vZGVzIGZvciAnYXRvbV9leHByJyIpOwotICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlcyA9IHZhbGlkYXRlX2F0b20oQ0hJTEQodHJlZSwgc3RhcnQpKTsKLSAgICBpZiAocmVzKSB7Ci0gICAgICAgIHBvcyA9IHN0YXJ0ICsgMTsKLSAgICAgICAgd2hpbGUgKHJlcyAmJiAocG9zIDwgbmNoKSAmJiAoVFlQRShDSElMRCh0cmVlLCBwb3MpKSA9PSB0cmFpbGVyKSkKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3RyYWlsZXIoQ0hJTEQodHJlZSwgcG9zKyspKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfYXRvbShub2RlICp0cmVlKQotewotICAgIGludCBwb3M7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgYXRvbSk7Ci0KLSAgICBpZiAocmVzICYmIG5jaCA8IDEpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIG5jaCsxLCAiYXRvbSIpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgc3dpdGNoIChUWVBFKENISUxEKHRyZWUsIDApKSkgewotICAgICAgICAgIGNhc2UgTFBBUjoKLSAgICAgICAgICAgIHJlcyA9ICgobmNoIDw9IDMpCi0gICAgICAgICAgICAgICAgICAgJiYgKHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBuY2ggLSAxKSkpKTsKLQotICAgICAgICAgICAgaWYgKHJlcyAmJiAobmNoID09IDMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMSkpPT15aWVsZF9leHByKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfeWllbGRfZXhwcihDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdGxpc3RfY29tcChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIExTUUI6Ci0gICAgICAgICAgICBpZiAobmNoID09IDIpCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIFJTUUIpOwotICAgICAgICAgICAgZWxzZSBpZiAobmNoID09IDMpCi0gICAgICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3Rlc3RsaXN0X2NvbXAoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIDIpLCBSU1FCKSk7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbGlzdCBkaXNwbGF5IGF0b20iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICAgICAgcmVzID0gKChuY2ggPD0gMykKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBuY2ggLSAxKSwgUkJSQUNFKSk7Ci0KLSAgICAgICAgICAgIGlmIChyZXMgJiYgKG5jaCA9PSAzKSkKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9kaWN0b3JzZXRtYWtlcihDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIE5BTUU6Ci0gICAgICAgICAgY2FzZSBOVU1CRVI6Ci0gICAgICAgICAgY2FzZSBFTExJUFNJUzoKLSAgICAgICAgICAgIHJlcyA9IChuY2ggPT0gMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgIGZvciAocG9zID0gMTsgcmVzICYmIChwb3MgPCBuY2gpOyArK3BvcykKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBwb3MpLCBTVFJJTkcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotLyogIHRlc3RsaXN0X2NvbXA6Ci0gKiAgICAodGVzdHxzdGFyX2V4cHIpICggY29tcF9mb3IgfCAoJywnICh0ZXN0fHN0YXJfZXhwcikpKiBbJywnXSApCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3RsaXN0X2NvbXAobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBvazsKLQotICAgIGlmIChuY2ggPT0gMCkgewotICAgICAgICBlcnJfc3RyaW5nKCJtaXNzaW5nIGNoaWxkIG5vZGVzIG9mIHRlc3RsaXN0X2NvbXAiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG5jaCA9PSAyICYmIFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGNvbXBfZm9yKSB7Ci0gICAgICAgIG9rID0gKHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29tcF9mb3IoQ0hJTEQodHJlZSwgMSkpKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIG9rID0gdmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodHJlZSwKLSAgICAgICAgICAgICAgICB0ZXN0bGlzdF9jb21wLAotICAgICAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3Rfb3Jfc3Rhcl9leHByLAotICAgICAgICAgICAgICAgICJ0ZXN0bGlzdF9jb21wIik7Ci0gICAgfQotICAgIHJldHVybiBvazsKLX0KLQotLyogIGRlY29yYXRvcjoKLSAqICAgICdAJyBkb3R0ZWRfbmFtZSBbICcoJyBbYXJnbGlzdF0gJyknIF0gTkVXTElORQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9kZWNvcmF0b3Iobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgb2s7Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBkZWNvcmF0b3IpICYmCi0gICAgICAgICAgKG5jaCA9PSAzIHx8IG5jaCA9PSA1IHx8IG5jaCA9PSA2KSAmJgotICAgICAgICAgIHZhbGlkYXRlX2F0KENISUxEKHRyZWUsIDApKSAmJgotICAgICAgICAgIHZhbGlkYXRlX2RvdHRlZF9uYW1lKENISUxEKHRyZWUsIDEpKSAmJgotICAgICAgICAgIHZhbGlkYXRlX25ld2xpbmUoUkNISUxEKHRyZWUsIC0xKSkpOwotCi0gICAgaWYgKG9rICYmIG5jaCAhPSAzKSB7Ci0gICAgICAgIG9rID0gKHZhbGlkYXRlX2xwYXJlbihDSElMRCh0cmVlLCAyKSkgJiYKLSAgICAgICAgICAgICAgdmFsaWRhdGVfcnBhcmVuKFJDSElMRCh0cmVlLCAtMikpKTsKLQotICAgICAgICBpZiAob2sgJiYgbmNoID09IDYpCi0gICAgICAgICAgICBvayA9IHZhbGlkYXRlX2FyZ2xpc3QoQ0hJTEQodHJlZSwgMykpOwotICAgIH0KLQotICAgIHJldHVybiBvazsKLX0KLQotLyogIGRlY29yYXRvcnM6Ci0gKiAgICBkZWNvcmF0b3IrCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RlY29yYXRvcnMobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgaSwgbmNoLCBvazsKLSAgICBuY2ggPSBOQ0godHJlZSk7Ci0gICAgb2sgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCBkZWNvcmF0b3JzKSAmJiBuY2ggPj0gMTsKLQotICAgIGZvciAoaSA9IDA7IG9rICYmIGkgPCBuY2g7ICsraSkKLSAgICAgICAgb2sgPSB2YWxpZGF0ZV9kZWNvcmF0b3IoQ0hJTEQodHJlZSwgaSkpOwotCi0gICAgcmV0dXJuIG9rOwotfQotCi0vKiAgd2l0aF9pdGVtOgotICogICB0ZXN0IFsnYXMnIGV4cHJdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3dpdGhfaXRlbShub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIHdpdGhfaXRlbSkKLSAgICAgICAgICAgICAgJiYgKG5jaCA9PSAxIHx8IG5jaCA9PSAzKQotICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKSk7Ci0gICAgaWYgKG9rICYmIG5jaCA9PSAzKQotICAgICAgICBvayA9ICh2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDEpLCAiYXMiKQotICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsIDIpKSk7Ci0gICAgcmV0dXJuIG9rOwotfQotCi0vKiAgd2l0aF9zdG10OgotICogICAgMCAgICAgIDEgICAgICAgICAgLi4uICAgICAgICAgICAgIC0yICAgLTEKLSAqICAgJ3dpdGgnIHdpdGhfaXRlbSAoJywnIHdpdGhfaXRlbSkqICc6JyBzdWl0ZQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV93aXRoX3N0bXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCBvayA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCB3aXRoX3N0bXQpCi0gICAgICAgICYmIChuY2ggJSAyID09IDApCi0gICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJ3aXRoIikKLSAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oUkNISUxEKHRyZWUsIC0yKSkKLSAgICAgICAgJiYgdmFsaWRhdGVfc3VpdGUoUkNISUxEKHRyZWUsIC0xKSkpOwotICAgIGZvciAoaSA9IDE7IG9rICYmIGkgPCBuY2ggLSAyOyBpICs9IDIpCi0gICAgICAgIG9rID0gdmFsaWRhdGVfd2l0aF9pdGVtKENISUxEKHRyZWUsIGkpKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qIGZ1bmNkZWY6ICdkZWYnIE5BTUUgcGFyYW1ldGVycyBbJy0+JyB0ZXN0XSAnOicgc3VpdGUgKi8KLQotc3RhdGljIGludAotdmFsaWRhdGVfZnVuY2RlZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIGZ1bmNkZWYpOwotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKG5jaCA9PSA1KSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImRlZiIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcGFyYW1ldGVycyhDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAzKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA0KSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSA3KSB7Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImRlZiIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMSksIE5BTUUpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfcGFyYW1ldGVycyhDSElMRCh0cmVlLCAyKSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9yYXJyb3coQ0hJTEQodHJlZSwgMykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCA0KSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCA1KSkKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9zdWl0ZShDSElMRCh0cmVlLCA2KSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciBmdW5jZGVmIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyogYXN5bmNfZnVuY2RlZjogQVNZTkMgZnVuY2RlZiAqLwotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hc3luY19mdW5jZGVmKG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgYXN5bmNfZnVuY2RlZik7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBpZiAobmNoID09IDIpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAwKSwgQVNZTkMpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZnVuY2RlZihDSElMRCh0cmVlLCAxKSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgbnVtYmVyIG9mIGNoaWxkcmVuIGZvciBhc3luY19mdW5jZGVmIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0vKiBhc3luY19zdG10OiBBU1lOQyAoZnVuY2RlZiB8IHdpdGhfc3RtdCB8IGZvcl9zdG10KSAqLwotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hc3luY19zdG10KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgcmVzID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGFzeW5jX3N0bXQpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMCksIEFTWU5DKSk7Ci0KLSAgICBpZiAobmNoICE9IDIpIHsKLSAgICAgICAgcmVzID0gMDsKLSAgICAgICAgZXJyX3N0cmluZygiaWxsZWdhbCBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIGFzeW5jX3N0bXQiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gZnVuY2RlZikgewotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZnVuY2RlZihDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVFlQRShDSElMRCh0cmVlLCAxKSkgPT0gd2l0aF9zdG10KSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV93aXRoX3N0bXQoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMSkpID09IGZvcl9zdG10KSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9mb3IoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotCi0KLS8qIGRlY29yYXRlZAotICogICBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RlY29yYXRlZChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IG9rID0gKHZhbGlkYXRlX250eXBlKHRyZWUsIGRlY29yYXRlZCkKLSAgICAgICAgICAgICAgJiYgKG5jaCA9PSAyKQotICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kZWNvcmF0b3JzKFJDSElMRCh0cmVlLCAtMikpKTsKLSAgICBpZiAoVFlQRShSQ0hJTEQodHJlZSwgLTEpKSA9PSBmdW5jZGVmKQotICAgICAgICBvayA9IG9rICYmIHZhbGlkYXRlX2Z1bmNkZWYoUkNISUxEKHRyZWUsIC0xKSk7Ci0gICAgZWxzZQotICAgICAgICBvayA9IG9rICYmIHZhbGlkYXRlX2NsYXNzKFJDSElMRCh0cmVlLCAtMSkpOwotICAgIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfbGFtYmRlZihub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBsYW1iZGVmKQotICAgICAgICAgICAgICAgJiYgKChuY2ggPT0gMykgfHwgKG5jaCA9PSA0KSkKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJsYW1iZGEiKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgbmNoIC0gMikpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIG5jaCAtIDEpKSk7Ci0KLSAgICBpZiAocmVzICYmIChuY2ggPT0gNCkpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3ZhcmFyZ3NsaXN0KENISUxEKHRyZWUsIDEpKTsKLSAgICBlbHNlIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAodm9pZCkgdmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMywgImxhbWJkZWYiKTsKLQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9sYW1iZGVmX25vY29uZChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBsYW1iZGVmX25vY29uZCkKLSAgICAgICAgICAgICAgICYmICgobmNoID09IDMpIHx8IChuY2ggPT0gNCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9uYW1lKENISUxEKHRyZWUsIDApLCAibGFtYmRhIikKLSAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIG5jaCAtIDIpKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCBuY2ggLSAxKSkpOwotCi0gICAgaWYgKHJlcyAmJiAobmNoID09IDQpKQotICAgICAgICByZXMgPSB2YWxpZGF0ZV92YXJhcmdzbGlzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgZWxzZSBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDMsICJsYW1iZGVmX25vY29uZCIpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBhcmdsaXN0OgotICoKLSAqICAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IFsnLCddIHwgJyonIHRlc3QgWycsJyAnKionIHRlc3RdIHwgJyoqJyB0ZXN0KQotICovCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9hcmdsaXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgaW50IG5jaCA9IE5DSCh0cmVlKTsKLSAgICBpbnQgaSA9IDA7Ci0gICAgaW50IG9rID0gMTsKLQotICAgIGlmIChuY2ggPD0gMCkKLSAgICAgICAgLyogcmFpc2UgdGhlIHJpZ2h0IGVycm9yIGZyb20gaGF2aW5nIGFuIGludmFsaWQgbnVtYmVyIG9mIGNoaWxkcmVuICovCi0gICAgICAgIHJldHVybiB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCBuY2ggKyAxLCAiYXJnbGlzdCIpOwotCi0gICAgaWYgKG5jaCA+IDEpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8bmNoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIGkpKSA9PSBhcmd1bWVudCkgewotICAgICAgICAgICAgICAgIG5vZGUgKmNoID0gQ0hJTEQodHJlZSwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKE5DSChjaCkgPT0gMiAmJiBUWVBFKENISUxEKGNoLCAxKSkgPT0gY29tcF9mb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyX3N0cmluZygibmVlZCAnKCcsICcpJyBmb3IgZ2VuZXJhdG9yIGV4cHJlc3Npb24iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKG9rICYmIG5jaC1pID49IDIpIHsKLSAgICAgICAgLyogc2tpcCBsZWFkaW5nIChhcmd1bWVudCAnLCcpICovCi0gICAgICAgIG9rID0gKHZhbGlkYXRlX2FyZ3VtZW50KENISUxEKHRyZWUsIGkpKQotICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb21tYShDSElMRCh0cmVlLCBpKzEpKSk7Ci0gICAgICAgIGlmIChvaykKLSAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9Ci0gICAgb2sgPSAxOwotICAgIGlmIChuY2gtaSA+IDApIHsKLSAgICAgICAgaW50IHN5bSA9IFRZUEUoQ0hJTEQodHJlZSwgaSkpOwotCi0gICAgICAgIGlmIChzeW0gPT0gYXJndW1lbnQpIHsKLSAgICAgICAgICAgIG9rID0gdmFsaWRhdGVfYXJndW1lbnQoQ0hJTEQodHJlZSwgaSkpOwotICAgICAgICAgICAgaWYgKG9rICYmIGkrMSAhPSBuY2gpIHsKLSAgICAgICAgICAgICAgICBlcnJfc3RyaW5nKCJpbGxlZ2FsIGFyZ2xpc3Qgc3BlY2lmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGV4dHJhIHN0dWZmIG9uIGVuZCkiKTsKLSAgICAgICAgICAgICAgICBvayA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgYXJnbGlzdCBzcGVjaWZpY2F0aW9uIik7Ci0gICAgICAgICAgICBvayA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIChvayk7Ci19Ci0KLQotCi0vKiAgYXJndW1lbnQ6ICggdGVzdCBbY29tcF9mb3JdIHwKLSAqICAgICAgICAgICAgICB0ZXN0ICc9JyB0ZXN0IHwKLSAqICAgICAgICAgICAgICAnKionIHRlc3QgfAotICogICAgICAgICAgICAgICcqJyB0ZXN0ICkKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfYXJndW1lbnQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAodmFsaWRhdGVfbnR5cGUodHJlZSwgYXJndW1lbnQpCi0gICAgICAgICAgICAgICAmJiAoKG5jaCA9PSAxKSB8fCAobmNoID09IDIpIHx8IChuY2ggPT0gMykpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IERPVUJMRVNUQVIpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IFNUQVIpIHsKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuY2ggPT0gMikgewotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbXBfZm9yKENISUxEKHRyZWUsIDEpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocmVzICYmIChuY2ggPT0gMykpIHsKLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9lcXVhbChDSElMRCh0cmVlLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAyKSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0KLS8qICB0cmFpbGVyOgotICoKLSAqICAnKCcgW2FyZ2xpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHRsaXN0ICddJyB8ICcuJyBOQU1FCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3RyYWlsZXIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSB2YWxpZGF0ZV9udHlwZSh0cmVlLCB0cmFpbGVyKSAmJiAoKG5jaCA9PSAyKSB8fCAobmNoID09IDMpKTsKLQotICAgIGlmIChyZXMpIHsKLSAgICAgICAgc3dpdGNoIChUWVBFKENISUxEKHRyZWUsIDApKSkgewotICAgICAgICAgIGNhc2UgTFBBUjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3JwYXJlbihDSElMRCh0cmVlLCBuY2ggLSAxKSk7Ci0gICAgICAgICAgICBpZiAocmVzICYmIChuY2ggPT0gMykpCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXJnbGlzdChDSElMRCh0cmVlLCAxKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIExTUUI6Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMywgInRyYWlsZXIiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX3N1YnNjcmlwdGxpc3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgMiksIFJTUUIpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRE9UOgotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJ0cmFpbGVyIikKLSAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCAxKSwgTkFNRSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJlcyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgKHZvaWQpIHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJ0cmFpbGVyIik7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi0vKiAgc3Vic2NyaXB0bGlzdDoKLSAqCi0gKiAgc3Vic2NyaXB0ICgnLCcgc3Vic2NyaXB0KSogWycsJ10KLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfc3Vic2NyaXB0bGlzdChub2RlICp0cmVlKQotewotICAgIHJldHVybiAodmFsaWRhdGVfcmVwZWF0aW5nX2xpc3QodHJlZSwgc3Vic2NyaXB0bGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3N1YnNjcmlwdCwgInN1YnNjcmlwdGxpc3QiKSk7Ci19Ci0KLQotLyogIHN1YnNjcmlwdDoKLSAqCi0gKiAgJy4nICcuJyAnLicgfCB0ZXN0IHwgW3Rlc3RdICc6JyBbdGVzdF0gW3NsaWNlb3BdCi0gKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3N1YnNjcmlwdChub2RlICp0cmVlKQotewotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IHZhbGlkYXRlX250eXBlKHRyZWUsIHN1YnNjcmlwdCkgJiYgKG5jaCA+PSAxKSAmJiAobmNoIDw9IDQpOwotCi0gICAgaWYgKCFyZXMpIHsKLSAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgZXJyX3N0cmluZygiaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBzdWJzY3JpcHQgbm9kZSIpOwotICAgICAgICByZXR1cm4gKDApOwotICAgIH0KLSAgICBpZiAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gRE9UKQotICAgICAgICAvKiB0YWtlIGNhcmUgb2YgKCcuJyAnLicgJy4nKSBwb3NzaWJpbGl0eSAqLwotICAgICAgICByZXR1cm4gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDMsICJzdWJzY3JpcHQiKQotICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2RvdChDSElMRCh0cmVlLCAwKSkKLSAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9kb3QoQ0hJTEQodHJlZSwgMSkpCi0gICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfZG90KENISUxEKHRyZWUsIDIpKSk7Ci0gICAgaWYgKG5jaCA9PSAxKSB7Ci0gICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIDApKSA9PSB0ZXN0KQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAwKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgcmV0dXJuIChyZXMpOwotICAgIH0KLSAgICAvKiAgTXVzdCBiZSBbdGVzdF0gJzonIFt0ZXN0XSBbc2xpY2VvcF0sCi0gICAgICogIGJ1dCBhdCBsZWFzdCBvbmUgb2YgdGhlIG9wdGlvbmFsIGNvbXBvbmVudHMgd2lsbAotICAgICAqICBiZSBwcmVzZW50LCBidXQgd2UgZG9uJ3Qga25vdyB3aGljaCB5ZXQuCi0gICAgICovCi0gICAgaWYgKChUWVBFKENISUxEKHRyZWUsIDApKSAhPSBDT0xPTikgfHwgKG5jaCA9PSA0KSkgewotICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIDApKTsKLSAgICAgICAgb2Zmc2V0ID0gMTsKLSAgICB9Ci0gICAgaWYgKHJlcykKLSAgICAgICAgcmVzID0gdmFsaWRhdGVfY29sb24oQ0hJTEQodHJlZSwgb2Zmc2V0KSk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBpbnQgcmVtID0gbmNoIC0gKytvZmZzZXQ7Ci0gICAgICAgIGlmIChyZW0pIHsKLSAgICAgICAgICAgIGlmIChUWVBFKENISUxEKHRyZWUsIG9mZnNldCkpID09IHRlc3QpIHsKLSAgICAgICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIG9mZnNldCkpOwotICAgICAgICAgICAgICAgICsrb2Zmc2V0OwotICAgICAgICAgICAgICAgIC0tcmVtOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlcyAmJiByZW0pCi0gICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc2xpY2VvcChDSElMRCh0cmVlLCBvZmZzZXQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLQotc3RhdGljIGludAotdmFsaWRhdGVfc2xpY2VvcChub2RlICp0cmVlKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICgobmNoID09IDEpIHx8IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDIsICJzbGljZW9wIikpCi0gICAgICAgICAgICAgICYmIHZhbGlkYXRlX250eXBlKHRyZWUsIHNsaWNlb3ApOwotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIHJlcyA9IHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJzbGljZW9wIik7Ci0gICAgfQotICAgIGlmIChyZXMpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbG9uKENISUxEKHRyZWUsIDApKTsKLSAgICBpZiAocmVzICYmIChuY2ggPT0gMikpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX3Rlc3QoQ0hJTEQodHJlZSwgMSkpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX3Rlc3Rfb3Jfc3Rhcl9leHByKG5vZGUgKm4pCi17Ci0gICAgaWYgKFRZUEUobikgPT0gdGVzdCkKLSAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3Rlc3Qobik7Ci0gICAgcmV0dXJuIHZhbGlkYXRlX3N0YXJfZXhwcihuKTsKLX0KLQotc3RhdGljIGludAotdmFsaWRhdGVfZXhwcl9vcl9zdGFyX2V4cHIobm9kZSAqbikKLXsKLSAgICBpZiAoVFlQRShuKSA9PSBleHByKQotICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcihuKTsKLSAgICByZXR1cm4gdmFsaWRhdGVfc3Rhcl9leHByKG4pOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V4cHJsaXN0KG5vZGUgKnRyZWUpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV9yZXBlYXRpbmdfbGlzdCh0cmVlLCBleHBybGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHJfb3Jfc3Rhcl9leHByLCAiZXhwcmxpc3QiKSk7Ci19Ci0KLS8qIEluY3JlbWVudGluZyB2YWxpZGF0ZSBmdW5jdGlvbnMgcmV0dXJucyBub256ZXJvIGlmZiBzdWNjZXNzIChsaWtlIG90aGVyCi0gKiB2YWxpZGF0ZSBmdW5jdGlvbnMsIGFuZCBhZHZhbmNlICppIGJ5IHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgcGF0dGVybi4gKi8KLQotLyogdGVzdCAnOicgdGVzdCAqLwotc3RhdGljIGludAotdmFsaWRhdGVfdGVzdF9jb2xvbl90ZXN0X2luYyhub2RlICp0cmVlLCBpbnQgKmkpCi17Ci0gICAgcmV0dXJuICh2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsICgqaSkrKykpCi0gICAgICAgICAgICAmJiB2YWxpZGF0ZV9jb2xvbihDSElMRCh0cmVlLCAoKmkpKyspKQotICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdChDSElMRCh0cmVlLCAoKmkpKyspKSk7Ci19Ci0KLS8qIHRlc3QgJzonIHRlc3QgfCAnKionIGV4cHIgKi8KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2RpY3RfZWxlbWVudF9pbmMobm9kZSAqdHJlZSwgaW50ICppKQotewotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9IDA7Ci0gICAgaWYgKG5jaCAtICppID49IDIpIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgKmkrMSkpID09IENPTE9OKSB7Ci0gICAgICAgICAgICAvKiB0ZXN0ICc6JyB0ZXN0ICovCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0X2NvbG9uX3Rlc3RfaW5jKHRyZWUsIGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogJyoqJyBleHByICovCi0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfZG91Ymxlc3RhcihDSElMRCh0cmVlLCAoKmkpKyspKQotICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9leHByKENISUxEKHRyZWUsICgqaSkrKykpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi0vKgotICogIGRpY3RvcnNldG1ha2VyOgotICoKLSAqICAgKCAoKHRlc3QgJzonIHRlc3QgfCAnKionIGV4cHIpCi0gKiAgICAgIChjb21wX2ZvciB8ICgnLCcgKHRlc3QgJzonIHRlc3QgfCAnKionIGV4cHIpKSogWycsJ10pKSB8Ci0gKiAgICAgKCh0ZXN0IHwgJyonIHRlc3QpCi0gKiAgICAgIChjb21wX2ZvciB8ICgnLCcgKHRlc3QgfCAnKicgdGVzdCkpKiBbJywnXSkpICkKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZGljdG9yc2V0bWFrZXIobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXM7Ci0gICAgaW50IGkgPSAwOwotCi0gICAgcmVzID0gdmFsaWRhdGVfbnR5cGUodHJlZSwgZGljdG9yc2V0bWFrZXIpOwotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChuY2ggLSBpIDwgMSkgewotICAgICAgICAvKiBVbmNvbmRpdGlvbmFsbHkgcmFpc2UuICovCi0gICAgICAgICh2b2lkKSB2YWxpZGF0ZV9udW1ub2Rlcyh0cmVlLCAxLCAiZGljdG9yc2V0bWFrZXIiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG5jaCAtIGkgPj0gMgotICAgICAgICAmJiAoKFRZUEUoQ0hJTEQodHJlZSwgaSsxKSkgPT0gQ09MT04pIHx8Ci0gICAgICAgICAgICAoVFlQRShDSElMRCh0cmVlLCBpKSkgPT0gRE9VQkxFU1RBUikpKSB7Ci0gICAgICAgIC8qIERpY3Rpb25hcnkgZGlzcGxheSBvciBkaWN0aW9uYXJ5IGNvbXByZWhlbnNpb24uICovCi0gICAgICAgIGlmIChuY2ggLSBpID49IDQgJiYgVFlQRShDSElMRCh0cmVlLCBpKzMpKSA9PSBjb21wX2ZvcikgewotICAgICAgICAgICAgLyogRGljdGlvbmFyeSBjb21wcmVoZW5zaW9uLiAqLwotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX3Rlc3RfY29sb25fdGVzdF9pbmModHJlZSwgJmkpCi0gICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX2NvbXBfZm9yKENISUxEKHRyZWUsIGkrKykpKTsKLSAgICAgICAgICAgIGlmICghcmVzKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogRGljdGlvbmFyeSBkaXNwbGF5LiAqLwotICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3JlcGVhdGluZ19saXN0X3ZhcmlhYmxlKAotICAgICAgICAgICAgICAgICAgICB0cmVlLAotICAgICAgICAgICAgICAgICAgICBkaWN0b3JzZXRtYWtlciwKLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfZGljdF9lbGVtZW50X2luYywKLSAgICAgICAgICAgICAgICAgICAgJmksCi0gICAgICAgICAgICAgICAgICAgICJkaWN0b3JzZXRtYWtlciIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogU2V0IGRpc3BsYXkgb3Igc2V0IGNvbXByZWhlbnNpb24uICovCi0gICAgICAgIGlmIChuY2ggLSBpID49IDIgJiYgVFlQRShDSElMRCh0cmVlLCBpICsgMSkpID09IGNvbXBfZm9yKSB7Ci0gICAgICAgICAgICAvKiBTZXQgY29tcHJlaGVuc2lvbi4gKi8KLSAgICAgICAgICAgIHJlcyA9ICh2YWxpZGF0ZV90ZXN0KENISUxEKHRyZWUsIGkrKykpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfY29tcF9mb3IoQ0hJTEQodHJlZSwgaSsrKSkpOwotICAgICAgICAgICAgaWYgKCFyZXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBTZXQgZGlzcGxheS4gKi8KLSAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX3JlcGVhdGluZ19saXN0KHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0b3JzZXRtYWtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlX3Rlc3Rfb3Jfc3Rhcl9leHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpY3RvcnNldG1ha2VyIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobmNoIC0gaSA+IDApIHsKLSAgICAgICAgZXJyX3N0cmluZygiSWxsZWdhbCB0cmFpbGluZyBub2RlcyBmb3IgZGljdG9yc2V0bWFrZXIuIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiAxOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2V2YWxfaW5wdXQobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcG9zOwotICAgIGludCBuY2ggPSBOQ0godHJlZSk7Ci0gICAgaW50IHJlcyA9ICh2YWxpZGF0ZV9udHlwZSh0cmVlLCBldmFsX2lucHV0KQotICAgICAgICAgICAgICAgJiYgKG5jaCA+PSAyKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfdGVzdGxpc3QoQ0hJTEQodHJlZSwgMCkpCi0gICAgICAgICAgICAgICAmJiB2YWxpZGF0ZV9udHlwZShDSElMRCh0cmVlLCBuY2ggLSAxKSwgRU5ETUFSS0VSKSk7Ci0KLSAgICBmb3IgKHBvcyA9IDE7IHJlcyAmJiAocG9zIDwgKG5jaCAtIDEpKTsgKytwb3MpCi0gICAgICAgIHJlcyA9IHZhbGlkYXRlX250eXBlKENISUxEKHRyZWUsIHBvcyksIE5FV0xJTkUpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX25vZGUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgICBuY2ggID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBudW0uIGNoaWxkcmVuIG9uIGN1cnJlbnQgbm9kZSAgKi8KLSAgICBpbnQgICByZXMgID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiByZXN1bHQgdmFsdWUgICAgICAgICAgICAgICAgICAgKi8KLSAgICBub2RlKiBuZXh0ID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBub2RlIHRvIHByb2Nlc3MgYWZ0ZXIgdGhpcyBvbmUgKi8KLQotICAgIHdoaWxlIChyZXMgJiYgKHRyZWUgIT0gMCkpIHsKLSAgICAgICAgbmNoICA9IE5DSCh0cmVlKTsKLSAgICAgICAgbmV4dCA9IDA7Ci0gICAgICAgIHN3aXRjaCAoVFlQRSh0cmVlKSkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBEZWZpbml0aW9uIG5vZGVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgY2FzZSBhc3luY19mdW5jZGVmOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXN5bmNfZnVuY2RlZih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYXN5bmNfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FzeW5jX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGZ1bmNkZWY6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9mdW5jZGVmKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB3aXRoX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV93aXRoX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGNsYXNzZGVmOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY2xhc3ModHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGRlY29yYXRlZDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2RlY29yYXRlZCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICAiVHJpdmlhbCIgcGFyc2UgdHJlZSBub2Rlcy4KLSAgICAgICAgICAgICAqICAoV2h5IGRpZCBJIGNhbGwgdGhlc2UgdHJpdmlhbD8pCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICBjYXNlIHN0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBzbWFsbF9zdG10OgotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqICBleHByX3N0bXQgfCBkZWxfc3RtdCB8IHBhc3Nfc3RtdCB8IGZsb3dfc3RtdCB8Ci0gICAgICAgICAgICAgKiAgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IG5vbmxvY2FsX3N0bXQgfCBhc3NlcnRfc3RtdAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zbWFsbF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBmbG93X3N0bXQ6Ci0gICAgICAgICAgICByZXMgID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJmbG93X3N0bXQiKQotICAgICAgICAgICAgICAgICAgICAmJiAoKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IGJyZWFrX3N0bXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoVFlQRShDSElMRCh0cmVlLCAwKSkgPT0gY29udGludWVfc3RtdCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChUWVBFKENISUxEKHRyZWUsIDApKSA9PSB5aWVsZF9zdG10KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IHJldHVybl9zdG10KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgKFRZUEUoQ0hJTEQodHJlZSwgMCkpID09IHJhaXNlX3N0bXQpKSk7Ci0gICAgICAgICAgICBpZiAocmVzKQotICAgICAgICAgICAgICAgIG5leHQgPSBDSElMRCh0cmVlLCAwKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKG5jaCA9PSAxKQotICAgICAgICAgICAgICAgIGVycl9zdHJpbmcoImlsbGVnYWwgZmxvd19zdG10IHR5cGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgeWllbGRfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3lpZWxkX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgQ29tcG91bmQgc3RhdGVtZW50cy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2Ugc2ltcGxlX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zaW1wbGVfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgY29tcG91bmRfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBvdW5kX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgRnVuZGFtZW50YWwgc3RhdGVtZW50cy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2UgZXhwcl9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfZXhwcl9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBkZWxfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2RlbF9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBwYXNzX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSAodmFsaWRhdGVfbnVtbm9kZXModHJlZSwgMSwgInBhc3MiKQotICAgICAgICAgICAgICAgICAgICYmIHZhbGlkYXRlX25hbWUoQ0hJTEQodHJlZSwgMCksICJwYXNzIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBicmVha19zdG10OgotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJicmVhayIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImJyZWFrIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBjb250aW51ZV9zdG10OgotICAgICAgICAgICAgcmVzID0gKHZhbGlkYXRlX251bW5vZGVzKHRyZWUsIDEsICJjb250aW51ZSIpCi0gICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbmFtZShDSElMRCh0cmVlLCAwKSwgImNvbnRpbnVlIikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSByZXR1cm5fc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3JldHVybl9zdG10KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSByYWlzZV9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfcmFpc2Vfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgaW1wb3J0X3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgaW1wb3J0X25hbWU6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfbmFtZSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgaW1wb3J0X2Zyb206Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pbXBvcnRfZnJvbSh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZ2xvYmFsX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9nbG9iYWxfc3RtdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugbm9ubG9jYWxfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25vbmxvY2FsX3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGFzc2VydF9zdG10OgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfYXNzZXJ0X3N0bXQodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGlmX3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9pZih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2Ugd2hpbGVfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3doaWxlKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBmb3Jfc3RtdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2Zvcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgdHJ5X3N0bXQ6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90cnkodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHN1aXRlOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc3VpdGUodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgRXhwcmVzc2lvbiBub2Rlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgIGNhc2UgdGVzdGxpc3Q6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0bGlzdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgeWllbGRfZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3lpZWxkX2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRlc3Q6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXN0KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhbmRfdGVzdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FuZF90ZXN0KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBub3RfdGVzdDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX25vdF90ZXN0KHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBjb21wYXJpc29uOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfY29tcGFyaXNvbih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgZXhwcmxpc3Q6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9leHBybGlzdCh0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgY29tcF9vcDoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2NvbXBfb3AodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGV4cHI6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSB4b3JfZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX3hvcl9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBhbmRfZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FuZF9leHByKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBzaGlmdF9leHByOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfc2hpZnRfZXhwcih0cmVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgYXJpdGhfZXhwcjoKLSAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRlX2FyaXRoX2V4cHIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHRlcm06Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV90ZXJtKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBmYWN0b3I6Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9mYWN0b3IodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIHBvd2VyOgotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfcG93ZXIodHJlZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIGF0b206Ci0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9hdG9tKHRyZWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLyogSG9wZWZ1bGx5IG5ldmVyIHJlYWNoZWQhICovCi0gICAgICAgICAgICBlcnJfc3RyaW5nKCJ1bnJlY29nbml6ZWQgbm9kZSB0eXBlIik7Ci0gICAgICAgICAgICByZXMgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdHJlZSA9IG5leHQ7Ci0gICAgfQotICAgIHJldHVybiAocmVzKTsKLX0KLQotCi1zdGF0aWMgaW50Ci12YWxpZGF0ZV9leHByX3RyZWUobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgcmVzID0gdmFsaWRhdGVfZXZhbF9pbnB1dCh0cmVlKTsKLQotICAgIGlmICghcmVzICYmICFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICBlcnJfc3RyaW5nKCJjb3VsZCBub3QgdmFsaWRhdGUgZXhwcmVzc2lvbiB0dXBsZSIpOwotCi0gICAgcmV0dXJuIChyZXMpOwotfQotCi0KLS8qICBmaWxlX2lucHV0OgotICogICAgICAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKLSAqLwotc3RhdGljIGludAotdmFsaWRhdGVfZmlsZV9pbnB1dChub2RlICp0cmVlKQotewotICAgIGludCBqOwotICAgIGludCBuY2ggPSBOQ0godHJlZSkgLSAxOwotICAgIGludCByZXMgPSAoKG5jaCA+PSAwKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgbmNoKSwgRU5ETUFSS0VSKSk7Ci0KLSAgICBmb3IgKGogPSAwOyByZXMgJiYgKGogPCBuY2gpOyArK2opIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgaikpID09IHN0bXQpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdG10KENISUxEKHRyZWUsIGopKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbmV3bGluZShDSElMRCh0cmVlLCBqKSk7Ci0gICAgfQotICAgIC8qICBUaGlzIHN0YXlzIGluIHRvIHByZXZlbnQgYW55IGludGVybmFsIGZhaWx1cmVzIGZyb20gZ2V0dGluZyB0byB0aGUKLSAgICAgKiAgdXNlci4gIEhvcGVmdWxseSwgdGhpcyB3b24ndCBiZSBuZWVkZWQuICBJZiBhIHVzZXIgcmVwb3J0cyBnZXR0aW5nCi0gICAgICogIHRoaXMsIHdlIGhhdmUgc29tZSBkZWJ1Z2dpbmcgdG8gZG8uCi0gICAgICovCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoIlZBTElEQVRJT04gRkFJTFVSRTogcmVwb3J0IHRoaXMgdG8gdGhlIG1haW50YWluZXIhIik7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2VuY29kaW5nX2RlY2wobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAoKG5jaCA9PSAxKQotICAgICAgICAmJiB2YWxpZGF0ZV9maWxlX2lucHV0KENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiRXJyb3IgUGFyc2luZyBlbmNvZGluZ19kZWNsIik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCiBzdGF0aWMgUHlPYmplY3QqCiBwaWNrbGVfY29uc3RydWN0b3IgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggZTVmNThhYi4uNGRjN2M0OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtMzIsNiArMzIsMTIgQEAKICNpbmNsdWRlICJ3aW5yZXBhcnNlLmgiCiAjZW5kaWYKIAorLyogT24gYW5kcm9pZCBBUEkgbGV2ZWwgMjEsICdBVF9FQUNDRVNTJyBpcyBub3QgZGVjbGFyZWQgYWx0aG91Z2gKKyAqIEhBVkVfRkFDQ0VTU0FUIGlzIGRlZmluZWQuICovCisjaWZkZWYgX19BTkRST0lEX18KKyN1bmRlZiBIQVZFX0ZBQ0NFU1NBVAorI2VuZGlmCisKICNpbmNsdWRlIDxzdGRpby5oPiAgLyogbmVlZGVkIGZvciBjdGVybWlkKCkgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC02NzEsMjEgKzY3NywyMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLV9mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCwgY29uc3QgY2hhciAqYWxsb3dlZCkKK19mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCkKIHsKICAgICBpbnQgb3ZlcmZsb3c7CiAgICAgbG9uZyBsb25nX3ZhbHVlOwogCiAgICAgUHlPYmplY3QgKmluZGV4ID0gUHlOdW1iZXJfSW5kZXgobyk7CiAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgJXMsIG5vdCAlLjIwMHMiLAotICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCwgUHlfVFlQRShvKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIGFzc2VydChQeUxvbmdfQ2hlY2soaW5kZXgpKTsKICAgICBsb25nX3ZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KGluZGV4LCAmb3ZlcmZsb3cpOwogICAgIFB5X0RFQ1JFRihpbmRleCk7CisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICBpZiAob3ZlcmZsb3cgPiAwIHx8IGxvbmdfdmFsdWUgPiBJTlRfTUFYKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImZkIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CkBAIC03MDgsNyArNzEzLDE1IEBACiAgICAgICAgICooaW50ICopcCA9IERFRkFVTFRfRElSX0ZEOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgcmV0dXJuIF9mZF9jb252ZXJ0ZXIobywgKGludCAqKXAsICJpbnRlZ2VyIik7CisgICAgZWxzZSBpZiAoUHlJbmRleF9DaGVjayhvKSkgeworICAgICAgICByZXR1cm4gX2ZkX2NvbnZlcnRlcihvLCAoaW50ICopcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogCkBAIC03OTksOCArODEyLDggQEAKICAgICBjb25zdCBjaGFyICphcmd1bWVudF9uYW1lOwogICAgIGludCBudWxsYWJsZTsKICAgICBpbnQgYWxsb3dfZmQ7Ci0gICAgd2NoYXJfdCAqd2lkZTsKLSAgICBjaGFyICpuYXJyb3c7CisgICAgY29uc3Qgd2NoYXJfdCAqd2lkZTsKKyAgICBjb25zdCBjaGFyICpuYXJyb3c7CiAgICAgaW50IGZkOwogICAgIFB5X3NzaXplX3QgbGVuZ3RoOwogICAgIFB5T2JqZWN0ICpvYmplY3Q7CkBAIC04MTgsMTEgKzgzMSwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXRoX2NvbnZlcnRlcihQeU9iamVjdCAqbywgdm9pZCAqcCkgeworcGF0aF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIHZvaWQgKnApCit7CiAgICAgcGF0aF90ICpwYXRoID0gKHBhdGhfdCAqKXA7Ci0gICAgUHlPYmplY3QgKnVuaWNvZGUsICpieXRlczsKKyAgICBQeU9iamVjdCAqYnl0ZXM7CiAgICAgUHlfc3NpemVfdCBsZW5ndGg7Ci0gICAgY2hhciAqbmFycm93OworICAgIGNvbnN0IGNoYXIgKm5hcnJvdzsKIAogI2RlZmluZSBGT1JNQVRfRVhDRVBUSU9OKGV4YywgZm10KSBcCiAgICAgUHlFcnJfRm9ybWF0KGV4YywgIiVzJXMiIGZtdCwgXApAQCAtODM5LDEyICs4NTMsNyBAQAogICAgIC8qIGVuc3VyZSBpdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgcGF0aF9jbGVhbnVwKCkgKi8KICAgICBwYXRoLT5jbGVhbnVwID0gTlVMTDsKIAotICAgIGlmIChvID09IFB5X05vbmUpIHsKLSAgICAgICAgaWYgKCFwYXRoLT5udWxsYWJsZSkgewotICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzcGVjaWZ5IE5vbmUgZm9yICVzIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICgobyA9PSBQeV9Ob25lKSAmJiBwYXRoLT5udWxsYWJsZSkgewogICAgICAgICBwYXRoLT53aWRlID0gTlVMTDsKICAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKICAgICAgICAgcGF0aC0+bGVuZ3RoID0gMDsKQEAgLTg1MywyNCArODYyLDIwIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChvKTsKLSAgICBpZiAodW5pY29kZSkgeworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobykpIHsKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgICAgIHdjaGFyX3QgKndpZGU7CisgICAgICAgIGNvbnN0IHdjaGFyX3QgKndpZGU7CiAKLSAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVBbmRTaXplKHVuaWNvZGUsICZsZW5ndGgpOworICAgICAgICB3aWRlID0gUHlVbmljb2RlX0FzVW5pY29kZUFuZFNpemUobywgJmxlbmd0aCk7CiAgICAgICAgIGlmICghd2lkZSkgewotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCA+IDMyNzY3KSB7CiAgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICIlcyB0b28gbG9uZyBmb3IgV2luZG93cyIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdjc2xlbih3aWRlKSAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVmFsdWVFcnJvciwgImVtYmVkZGVkIG51bGwgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZSk7CisgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIApAQCAtODc5LDUyICs4ODQsNDcgQEAKICAgICAgICAgcGF0aC0+bGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBwYXRoLT5vYmplY3QgPSBvOwogICAgICAgICBwYXRoLT5mZCA9IC0xOwotICAgICAgICBwYXRoLT5jbGVhbnVwID0gdW5pY29kZTsKLSAgICAgICAgcmV0dXJuIFB5X0NMRUFOVVBfU1VQUE9SVEVEOworICAgICAgICByZXR1cm4gMTsKICNlbHNlCi0gICAgICAgIGludCBjb252ZXJ0ZWQgPSBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIodW5pY29kZSwgJmJ5dGVzKTsKLSAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgICBpZiAoIWNvbnZlcnRlZCkKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICAgICAgaWYgKCFQeVVuaWNvZGVfRlNDb252ZXJ0ZXIobywgJmJ5dGVzKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICNlbmRpZgogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKG8pKQotICAgICAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcihvKSkgeworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKHdpbjMyX3dhcm5fYnl0ZXNfYXBpKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7CiAgICAgICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICBpZiAocGF0aC0+YWxsb3dfZmQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZmQ7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IF9mZF9jb252ZXJ0ZXIobywgJmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZywgYnl0ZXMgb3IgaW50ZWdlciIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm9iamVjdCA9IG87Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmZkID0gZmQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVHlwZUVycm9yLCAiaWxsZWdhbCB0eXBlIGZvciAlcyBwYXJhbWV0ZXIiKTsKKyAgICBlbHNlIGlmIChwYXRoLT5hbGxvd19mZCAmJiBQeUluZGV4X0NoZWNrKG8pKSB7CisgICAgICAgIGlmICghX2ZkX2NvbnZlcnRlcihvLCAmcGF0aC0+ZmQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwYXRoLT53aWRlID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bGVuZ3RoID0gMDsKKyAgICAgICAgcGF0aC0+b2JqZWN0ID0gbzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyVzIHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gcGF0aC0+ZnVuY3Rpb25fbmFtZSA6ICIiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/ICI6ICIgICAgICAgICAgICAgICAgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmFyZ3VtZW50X25hbWUgPyBwYXRoLT5hcmd1bWVudF9uYW1lIDogInBhdGgiLAorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgJiYgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgaW50ZWdlciBvciBOb25lIiA6CisgICAgICAgICAgICBwYXRoLT5hbGxvd19mZCA/ICJzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIiIDoKKyAgICAgICAgICAgIHBhdGgtPm51bGxhYmxlID8gInN0cmluZywgYnl0ZXMgb3IgTm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIG9yIGJ5dGVzIiwKKyAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKHdpbjMyX3dhcm5fYnl0ZXNfYXBpKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGJ5dGVzKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0KICAgICBsZW5ndGggPSBQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKTsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKGxlbmd0aCA+IE1BWF9QQVRILTEpIHsKQEAgLTk1MSw3ICs5NTEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqYXJndW1lbnRfbmFtZSkgeworYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY29uc3QgY2hhciAqYXJndW1lbnRfbmFtZSkKK3sKICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKICAgICAgICAgIiVzJXMlcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIiwKICAgICAgICAgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkgPyBmdW5jdGlvbl9uYW1lIDogIiIsCkBAIC05NzQsNyArOTc1LDggQEAKIH0KIAogc3RhdGljIGludAotZmRfc3BlY2lmaWVkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCkgeworZmRfc3BlY2lmaWVkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCkKK3sKICAgICBpZiAoZmQgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC05ODMsNyArOTg1LDggQEAKIH0KIAogc3RhdGljIGludAotZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZm9sbG93X3N5bWxpbmtzKSB7Citmb2xsb3dfc3ltbGlua3Nfc3BlY2lmaWVkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmb2xsb3dfc3ltbGlua3MpCit7CiAgICAgaWYgKGZvbGxvd19zeW1saW5rcykKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTk5Miw3ICs5OTUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXRoX2FuZF9kaXJfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsIGludCBkaXJfZmQpIHsKK3BhdGhfYW5kX2Rpcl9mZF9pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwgaW50IGRpcl9mZCkKK3sKICAgICBpZiAoIXBhdGgtPm5hcnJvdyAmJiAhcGF0aC0+d2lkZSAmJiAoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICIlczogY2FuJ3Qgc3BlY2lmeSBkaXJfZmQgd2l0aG91dCBtYXRjaGluZyBwYXRoIiwKQEAgLTEwMDMsNyArMTAwNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpcl9mZF9hbmRfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpIHsKK2Rpcl9mZF9hbmRfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpCit7CiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpICYmIChmZCAhPSAtMSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgYm90aCBkaXJfZmQgYW5kIGZkIiwKQEAgLTEwMTQsOCArMTAxOSw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykgeworZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmICgoZmQgPiAwKSAmJiAoIWZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCB1c2UgZmQgYW5kIGZvbGxvd19zeW1saW5rcyB0b2dldGhlciIsCkBAIC0xMDI2LDggKzEwMzIsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kaXJfZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2Rpcl9mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkgJiYgKCFmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgdXNlIGRpcl9mZCBhbmQgZm9sbG93X3N5bWxpbmtzIHRvZ2V0aGVyIiwKQEAgLTExNTksNyArMTE2Niw3IEBACiAgICAgZm9yIChlID0gX3dlbnZpcm9uOyAqZSAhPSBOVUxMOyBlKyspIHsKICAgICAgICAgUHlPYmplY3QgKms7CiAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICB3Y2hhcl90ICpwID0gd2NzY2hyKCplLCBMJz0nKTsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCAqcCA9IHdjc2NocigqZSwgTCc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKmUsIChQeV9zc2l6ZV90KShwLSplKSk7CkBAIC0xMTg3LDcgKzExOTQsNyBAQAogICAgIGZvciAoZSA9IGVudmlyb247ICplICE9IE5VTEw7IGUrKykgewogICAgICAgICBQeU9iamVjdCAqazsKICAgICAgICAgUHlPYmplY3QgKnY7Ci0gICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKmUsIChpbnQpKHAtKmUpKTsKQEAgLTEyMjIsNyArMTIyOSw3IEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiBzdGF0aWMgUHlPYmplY3QgKgotd2luMzJfZXJyb3IoY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQord2luMzJfZXJyb3IoY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQogewogICAgIC8qIFhYWCBXZSBzaG91bGQgcGFzcyB0aGUgZnVuY3Rpb24gbmFtZSBhbG9uZyBpbiB0aGUgZnV0dXJlLgogICAgICAgICh3aW5yZWcuYyBhbHNvIHdhbnRzIHRvIHBhc3MgdGhlIGZ1bmN0aW9uIG5hbWUuKQpAQCAtMTIzNyw3ICsxMjQ0LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbjMyX2Vycm9yX29iamVjdChjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGZpbGVuYW1lKQord2luMzJfZXJyb3Jfb2JqZWN0KGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogZmlsZW5hbWUpCiB7CiAgICAgLyogWFhYIC0gc2VlIHdpbjMyX2Vycm9yIGZvciBjb21tZW50cyBvbiAnZnVuY3Rpb24nICovCiAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTE0NTgsNyArMTQ2NSw3IEBACiAgICAgaWYoIWJ1Zl9zaXplKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgYnVmX3NpemUrMSk7CisgICAgYnVmID0gKHdjaGFyX3QgKilQeU1lbV9SYXdNYWxsb2MoKGJ1Zl9zaXplICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogICAgIGlmICghYnVmKSB7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9PVVRPRk1FTU9SWSk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE0NjgsMTIgKzE0NzUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfc2l6ZSwgVk9MVU1FX05BTUVfRE9TKTsKIAogICAgIGlmKCFyZXN1bHRfbGVuZ3RoKSB7Ci0gICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgUHlNZW1fUmF3RnJlZShidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaWYoIUNsb3NlSGFuZGxlKGhkbCkpIHsKLSAgICAgICAgUHlNZW1fRnJlZShidWYpOworICAgICAgICBQeU1lbV9SYXdGcmVlKGJ1Zik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTE1NTgsNyArMTU2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTE2NDgsNyArMTY1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTIxMDIsNyArMjEwOSw3IEBACiAKIAogc3RhdGljIFB5T2JqZWN0ICoKLXBvc2l4X2RvX3N0YXQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLAorcG9zaXhfZG9fc3RhdChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsCiAgICAgICAgICAgICAgIGludCBkaXJfZmQsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAgICAgU1RSVUNUX1NUQVQgc3Q7CkBAIC0zMzE1LDEyICszMzIyLDIyIEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIGRvIHsKICAgICAgICAgYnVmbGVuICs9IGNodW5rOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIHRtcGJ1ZiA9IFB5TWVtX1Jhd1JlYWxsb2MoYnVmLCBidWZsZW4pOwogICAgICAgICBpZiAodG1wYnVmID09IE5VTEwpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBidWYgPSB0bXBidWY7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCAoaW50KWJ1Zmxlbik7CisjZWxzZQogICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCBidWZsZW4pOworI2VuZGlmCiAgICAgfSB3aGlsZSAoY3dkID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCkBAIC0zNDYyLDE1ICszNDc5LDEzIEBACiAgICAgQk9PTCByZXN1bHQ7CiAgICAgV0lOMzJfRklORF9EQVRBIEZpbGVEYXRhOwogICAgIGNoYXIgbmFtZWJ1ZltNQVhfUEFUSCs0XTsgLyogT3ZlcmFsbG9jYXRlIGZvciAiXCouKiIgKi8KLSAgICBjaGFyICpidWZwdHIgPSBuYW1lYnVmOwogICAgIC8qIG9ubHkgY2xhaW0gdG8gaGF2ZSBzcGFjZSBmb3IgTUFYX1BBVEggKi8KICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5X0FSUkFZX0xFTkdUSChuYW1lYnVmKS00OwotICAgIFB5T2JqZWN0ICpwbyA9IE5VTEw7CiAgICAgd2NoYXJfdCAqd25hbWVidWYgPSBOVUxMOwogCiAgICAgaWYgKCFwYXRoLT5uYXJyb3cpIHsKICAgICAgICAgV0lOMzJfRklORF9EQVRBVyB3RmlsZURhdGE7Ci0gICAgICAgIHdjaGFyX3QgKnBvX3djaGFyczsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCAqcG9fd2NoYXJzOwogCiAgICAgICAgIGlmICghcGF0aC0+d2lkZSkgeyAvKiBEZWZhdWx0IGFyZzogIi4iICovCiAgICAgICAgICAgICBwb193Y2hhcnMgPSBMIi4iOwpAQCAtMzYzNiw3ICszNjUxLDcgQEAKICAgICBlbHNlCiAjZW5kaWYKICAgICB7Ci0gICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgICAgIGlmIChwYXRoLT5uYXJyb3cpIHsKICAgICAgICAgICAgIG5hbWUgPSBwYXRoLT5uYXJyb3c7CiAgICAgICAgICAgICAvKiBvbmx5IHJldHVybiBieXRlcyBpZiB0aGV5IHNwZWNpZmllZCBhIGJ5dGVzIG9iamVjdCAqLwpAQCAtMzgxOCw3ICszODMzLDcgQEAKICAgICB3Y2hhcl90ICp0YXJnZXRfcGF0aDsKICAgICBpbnQgcmVzdWx0X2xlbmd0aDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHdjaGFyX3QgKnBhdGhfd2NoYXI7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aF93Y2hhcjsKIAogICAgIHBhdGhfd2NoYXIgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHBhdGgpOwogICAgIGlmIChwYXRoX3djaGFyID09IE5VTEwpCkBAIC0zOTA3LDcgKzM5MjIsOCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc5YTBiYTcyOWY5NTZkYmUgaW5wdXQ9N2VhY2FkYzQwYWNiZGE2Yl0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgd2NoYXJfdCAqcGF0aF93Y2hhciwgKm1vdW50cGF0aD1OVUxMOworICAgIGNvbnN0IHdjaGFyX3QgKnBhdGhfd2NoYXI7CisgICAgd2NoYXJfdCAqbW91bnRwYXRoPU5VTEw7CiAgICAgc2l6ZV90IGJ1ZmxlbjsKICAgICBCT09MIHJldDsKIApAQCAtNDEwNSw3ICs0MTIxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRlcm5hbF9yZW5hbWUocGF0aF90ICpzcmMsIHBhdGhfdCAqZHN0LCBpbnQgc3JjX2Rpcl9mZCwgaW50IGRzdF9kaXJfZmQsIGludCBpc19yZXBsYWNlKQogewotICAgIGNoYXIgKmZ1bmN0aW9uX25hbWUgPSBpc19yZXBsYWNlID8gInJlcGxhY2UiIDogInJlbmFtZSI7CisgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSA9IGlzX3JlcGxhY2UgPyAicmVwbGFjZSIgOiAicmVuYW1lIjsKICAgICBpbnQgZGlyX2ZkX3NwZWNpZmllZDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTQyODUsNyArNDMwMSw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ODAwZjc3NWUxMGI3YmU1NSBpbnB1dD04NmE1ODU1NGJhNjA5NGFmXSovCiB7CiAgICAgbG9uZyByZXN1bHQ7Ci0gICAgY2hhciAqYnl0ZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKGNvbW1hbmQpOworICAgIGNvbnN0IGNoYXIgKmJ5dGVzID0gUHlCeXRlc19Bc1N0cmluZyhjb21tYW5kKTsKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgcmVzdWx0ID0gc3lzdGVtKGJ5dGVzKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwpAQCAtNDU2NSw3ICs0NTgxLDcgQEAKICNpZiBkZWZpbmVkKEhBVkVfRlVUSU1FU0FUKSB8fCBkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKQogCiBzdGF0aWMgaW50Ci11dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCit1dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAjaWZkZWYgSEFWRV9VVElNRU5TQVQKICAgICBpbnQgZmxhZ3MgPSBmb2xsb3dfc3ltbGlua3MgPyAwIDogQVRfU1lNTElOS19OT0ZPTExPVzsKQEAgLTQ2MDcsMTQgKzQ2MjMsMTQgQEAKICAgICAjZGVmaW5lIFBBVEhfVVRJTUVfSEFWRV9GRCAwCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9VVElNRU5TQVQpIHx8IGRlZmluZWQoSEFWRV9MVVRJTUVTKQorIyAgZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNlbmRpZgogCi0jZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MgXAotICAgICAgICAoZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpKQotCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKIAogc3RhdGljIGludAotdXRpbWVfbm9mb2xsb3dfc3ltbGlua3ModXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDYzMCw3ICs0NjQ2LDcgQEAKICNpZm5kZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgaW50Ci11dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjaGFyICpwYXRoKQordXRpbWVfZGVmYXVsdCh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDc3Myw3ICs0Nzg5LDcgQEAKICAgICAgICAgdXRpbWUubm93ID0gMTsKICAgICB9CiAKLSNpZiAhVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmICFkZWZpbmVkKFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MpCiAgICAgaWYgKGZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoInV0aW1lIiwgZm9sbG93X3N5bWxpbmtzKSkKICAgICAgICAgZ290byBleGl0OwogI2VuZGlmCkBAIC00ODI3LDcgKzQ4NDMsNyBAQAogI2Vsc2UgLyogTVNfV0lORE9XUyAqLwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAotI2lmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNpZmRlZiBVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCiAgICAgaWYgKCghZm9sbG93X3N5bWxpbmtzKSAmJiAoZGlyX2ZkID09IERFRkFVTFRfRElSX0ZEKSkKICAgICAgICAgcmVzdWx0ID0gdXRpbWVfbm9mb2xsb3dfc3ltbGlua3MoJnV0aW1lLCBwYXRoLT5uYXJyb3cpOwogICAgIGVsc2UKQEAgLTQ5MjQsNyArNDk0MCw4IEBACiAgICAgUHlfc3NpemVfdCBpLCBwb3MsIGVudmM7CiAgICAgUHlPYmplY3QgKmtleXM9TlVMTCwgKnZhbHM9TlVMTDsKICAgICBQeU9iamVjdCAqa2V5LCAqdmFsLCAqa2V5MiwgKnZhbDI7Ci0gICAgY2hhciAqcCwgKmssICp2OworICAgIGNoYXIgKnA7CisgICAgY29uc3QgY2hhciAqaywgKnY7CiAgICAgc2l6ZV90IGxlbjsKIAogICAgIGkgPSBQeU1hcHBpbmdfU2l6ZShlbnYpOwpAQCAtNTAzOSw3ICs1MDU2LDcgQEAKIG9zX2V4ZWN2X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnBhdGgsIFB5T2JqZWN0ICphcmd2KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkyMjFmMDgxNDMxNDZmZmYgaW5wdXQ9OTYwNDE1NTk5MjVlNTIyOV0qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKKyAgICBjb25zdCBjaGFyICpwYXRoX2NoYXI7CiAgICAgY2hhciAqKmFyZ3ZsaXN0OwogICAgIFB5X3NzaXplX3QgYXJnYzsKIApAQCAtNTE2MCw3ICs1MTc3LDcgQEAKIG9zX3NwYXdudl9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIGludCBtb2RlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTQwYTc5NDU0ODRjOGNjNSBpbnB1dD0wNDJjOTFkZmMxZTZkZWJjXSovCiB7Ci0gICAgY2hhciAqcGF0aF9jaGFyOworICAgIGNvbnN0IGNoYXIgKnBhdGhfY2hhcjsKICAgICBjaGFyICoqYXJndmxpc3Q7CiAgICAgaW50IGk7CiAgICAgUHlfc3NpemVfdCBhcmdjOwpAQCAtNTIzOCw3ICs1MjU1LDcgQEAKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJndiwgUHlPYmplY3QgKmVudikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lN2Y1ZjA3MDM2MTA1MzFmIGlucHV0PTAyMzYyZmQ5Mzc5NjNmOGZdKi8KIHsKLSAgICBjaGFyICpwYXRoX2NoYXI7CisgICAgY29uc3QgY2hhciAqcGF0aF9jaGFyOwogICAgIGNoYXIgKiphcmd2bGlzdDsKICAgICBjaGFyICoqZW52bGlzdDsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKQEAgLTU3NTgsMTQgKzU3NzUsMTQgQEAKICAgICBwaWQ6IHBpZF90CiAgICAgLwogCi1SZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkLgorUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS4KIAogVGhlIGFmZmluaXR5IGlzIHJldHVybmVkIGFzIGEgc2V0IG9mIENQVSBpZGVudGlmaWVycy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX3NjaGVkX2dldGFmZmluaXR5X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgcGlkX3QgcGlkKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI0MzFhOGYzMTBlMzY5ZTcgaW5wdXQ9ZWFmMTYxOTM2ODc0YjhhMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI0MzFhOGYzMTBlMzY5ZTcgaW5wdXQ9OTgzY2U3Y2I0YTU2NTk4MF0qLwogewogICAgIGludCBjcHUsIG5jcHVzLCBjb3VudDsKICAgICBzaXplX3Qgc2V0c2l6ZTsKQEAgLTU5MjYsNyArNTk0Myw3IEBACiAgICAgaWYgKF9QeV9zZXRfaW5oZXJpdGFibGUobWFzdGVyX2ZkLCAwLCBOVUxMKSA8IDApCiAgICAgICAgIGdvdG8gcG9zaXhfZXJyb3I7CiAKLSNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChIQVZFX0RFVl9QVEMpCisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykgJiYgIWRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKEhBVkVfREVWX1BUQykKICAgICBpb2N0bChzbGF2ZV9mZCwgSV9QVVNILCAicHRlbSIpOyAvKiBwdXNoIHB0ZW0gKi8KICAgICBpb2N0bChzbGF2ZV9mZCwgSV9QVVNILCAibGR0ZXJtIik7IC8qIHB1c2ggbGR0ZXJtICovCiAjaWZuZGVmIF9faHB1eApAQCAtNjI1MSw3ICs2MjY4LDcgQEAKIHBvc2l4X2luaXRncm91cHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpvbmFtZTsKLSAgICBjaGFyICp1c2VybmFtZTsKKyAgICBjb25zdCBjaGFyICp1c2VybmFtZTsKICAgICBpbnQgcmVzOwogI2lmZGVmIF9fQVBQTEVfXwogICAgIGludCBnaWQ7CkBAIC03MTI1LDE2ICs3MTQyLDE2IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd2luX3JlYWRsaW5rKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKLSAgICB3Y2hhcl90ICpwYXRoOworICAgIGNvbnN0IHdjaGFyX3QgKnBhdGg7CiAgICAgRFdPUkQgbl9ieXRlc19yZXR1cm5lZDsKICAgICBEV09SRCBpb19yZXN1bHQ7CiAgICAgUHlPYmplY3QgKnBvLCAqcmVzdWx0OwotICAgICAgICBpbnQgZGlyX2ZkOworICAgIGludCBkaXJfZmQ7CiAgICAgSEFORExFIHJlcGFyc2VfcG9pbnRfaGFuZGxlOwogCiAgICAgY2hhciB0YXJnZXRfYnVmZmVyW01BWElNVU1fUkVQQVJTRV9EQVRBX0JVRkZFUl9TSVpFXTsKICAgICBSRVBBUlNFX0RBVEFfQlVGRkVSICpyZGIgPSAoUkVQQVJTRV9EQVRBX0JVRkZFUiAqKXRhcmdldF9idWZmZXI7Ci0gICAgd2NoYXJfdCAqcHJpbnRfbmFtZTsKKyAgICBjb25zdCB3Y2hhcl90ICpwcmludF9uYW1lOwogCiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InBhdGgiLCAiZGlyX2ZkIiwgTlVMTH07CiAKQEAgLTcyMDIsOCArNzIxOSw4IEBACiAjaWYgZGVmaW5lZChNU19XSU5ET1dTKQogCiAvKiBHcmFiIENyZWF0ZVN5bWJvbGljTGlua1cgZHluYW1pY2FsbHkgZnJvbSBrZXJuZWwzMiAqLwotc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rVykoTFBXU1RSLCBMUFdTVFIsIERXT1JEKSA9IE5VTEw7Ci1zdGF0aWMgRFdPUkQgKENBTExCQUNLICpQeV9DcmVhdGVTeW1ib2xpY0xpbmtBKShMUFNUUiwgTFBTVFIsIERXT1JEKSA9IE5VTEw7CitzdGF0aWMgRFdPUkQgKENBTExCQUNLICpQeV9DcmVhdGVTeW1ib2xpY0xpbmtXKShMUENXU1RSLCBMUENXU1RSLCBEV09SRCkgPSBOVUxMOworc3RhdGljIERXT1JEIChDQUxMQkFDSyAqUHlfQ3JlYXRlU3ltYm9saWNMaW5rQSkoTFBDU1RSLCBMUENTVFIsIERXT1JEKSA9IE5VTEw7CiAKIHN0YXRpYyBpbnQKIGNoZWNrX0NyZWF0ZVN5bWJvbGljTGluayh2b2lkKQpAQCAtNzMwOCw3ICs3MzI1LDcgQEAKIAogLyogUmV0dXJuIFRydWUgaWYgdGhlIHBhdGggYXQgc3JjIHJlbGF0aXZlIHRvIGRlc3QgaXMgYSBkaXJlY3RvcnkgKi8KIHN0YXRpYyBpbnQKLV9jaGVja19kaXJXKFdDSEFSICpzcmMsIFdDSEFSICpkZXN0KQorX2NoZWNrX2RpclcoTFBDV1NUUiBzcmMsIExQQ1dTVFIgZGVzdCkKIHsKICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHNyY19pbmZvOwogICAgIFdDSEFSIGRlc3RfcGFyZW50W01BWF9QQVRIXTsKQEAgLTczMjcsNyArNzM0NCw3IEBACiAKIC8qIFJldHVybiBUcnVlIGlmIHRoZSBwYXRoIGF0IHNyYyByZWxhdGl2ZSB0byBkZXN0IGlzIGEgZGlyZWN0b3J5ICovCiBzdGF0aWMgaW50Ci1fY2hlY2tfZGlyQShjaGFyICpzcmMsIGNoYXIgKmRlc3QpCitfY2hlY2tfZGlyQShMUENTVFIgc3JjLCBMUENTVFIgZGVzdCkKIHsKICAgICBXSU4zMl9GSUxFX0FUVFJJQlVURV9EQVRBIHNyY19pbmZvOwogICAgIGNoYXIgZGVzdF9wYXJlbnRbTUFYX1BBVEhdOwpAQCAtOTAxNyw3ICs5MDM0LDcgQEAKIG9zX3B1dGVudl9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5T2JqZWN0ICpuYW1lLCBQeU9iamVjdCAqdmFsdWUpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTI0MzhjZjk1ZTVhMGMxYyBpbnB1dD1iYTU4NjU4MWMyZTYxMDVmXSovCiB7Ci0gICAgd2NoYXJfdCAqZW52OworICAgIGNvbnN0IHdjaGFyX3QgKmVudjsKIAogICAgIFB5T2JqZWN0ICp1bmljb2RlID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiVVPSVVIiwgbmFtZSwgdmFsdWUpOwogICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKQEAgLTkwNjMsOCArOTA4MCw4IEBACiB7CiAgICAgUHlPYmplY3QgKmJ5dGVzID0gTlVMTDsKICAgICBjaGFyICplbnY7Ci0gICAgY2hhciAqbmFtZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKG5hbWUpOwotICAgIGNoYXIgKnZhbHVlX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcodmFsdWUpOworICAgIGNvbnN0IGNoYXIgKm5hbWVfc3RyaW5nID0gUHlCeXRlc19Bc1N0cmluZyhuYW1lKTsKKyAgICBjb25zdCBjaGFyICp2YWx1ZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKHZhbHVlKTsKIAogICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tRm9ybWF0KCIlcz0lcyIsIG5hbWVfc3RyaW5nLCB2YWx1ZV9zdHJpbmcpOwogICAgIGlmIChieXRlcyA9PSBOVUxMKSB7CkBAIC05NDgzLDggKzk1MDAsOCBAQAogICogc3VmZmljaWVudGx5IHBlcnZhc2l2ZSB0aGF0IGl0J3Mgbm90IHdvcnRoIHRoZSBsb3NzIG9mIHJlYWRhYmlsaXR5LgogICovCiBzdHJ1Y3QgY29uc3RkZWYgewotICAgIGNoYXIgKm5hbWU7Ci0gICAgbG9uZyB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGludCB2YWx1ZTsKIH07CiAKIHN0YXRpYyBpbnQKQEAgLTk0OTIsNyArOTUwOSwxMCBAQAogICAgICAgICAgICAgICBzaXplX3QgdGFibGVzaXplKQogewogICAgIGlmIChQeUxvbmdfQ2hlY2soYXJnKSkgewotICAgICAgICAqdmFsdWVwID0gUHlMb25nX0FTX0xPTkcoYXJnKTsKKyAgICAgICAgaW50IHZhbHVlID0gX1B5TG9uZ19Bc0ludChhcmcpOworICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAqdmFsdWVwID0gdmFsdWU7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTEwNDUzLDcgKzEwNDczLDcgQEAKIAogc3RhdGljIGludAogc2V0dXBfY29uZm5hbWVfdGFibGUoc3RydWN0IGNvbnN0ZGVmICp0YWJsZSwgc2l6ZV90IHRhYmxlc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnRhYmxlbmFtZSwgUHlPYmplY3QgKm1vZHVsZSkKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwgUHlPYmplY3QgKm1vZHVsZSkKIHsKICAgICBQeU9iamVjdCAqZCA9IE5VTEw7CiAgICAgc2l6ZV90IGk7CkBAIC0xMDU4MCw5ICsxMDYwMCw5IEBACiB3aW4zMl9zdGFydGZpbGUoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogICAgIFB5T2JqZWN0ICpvZmlsZXBhdGg7Ci0gICAgY2hhciAqZmlsZXBhdGg7Ci0gICAgY2hhciAqb3BlcmF0aW9uID0gTlVMTDsKLSAgICB3Y2hhcl90ICp3cGF0aCwgKndvcGVyYXRpb247CisgICAgY29uc3QgY2hhciAqZmlsZXBhdGg7CisgICAgY29uc3QgY2hhciAqb3BlcmF0aW9uID0gTlVMTDsKKyAgICBjb25zdCB3Y2hhcl90ICp3cGF0aCwgKndvcGVyYXRpb247CiAgICAgSElOU1RBTkNFIHJjOwogCiAgICAgUHlPYmplY3QgKnVuaXBhdGgsICp1b3BlcmF0aW9uID0gTlVMTDsKQEAgLTEwODIzLDcgKzEwODQzLDcgQEAKICAgICBmb3IgKGkgPSAwOyA7IGkrKykgewogICAgICAgICB2b2lkICpwdHI7CiAgICAgICAgIHNzaXplX3QgcmVzdWx0OwotICAgICAgICBzdGF0aWMgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsxMjgsIFhBVFRSX1NJWkVfTUFYLCAwfTsKKyAgICAgICAgc3RhdGljIGNvbnN0IFB5X3NzaXplX3QgYnVmZmVyX3NpemVzW10gPSB7MTI4LCBYQVRUUl9TSVpFX01BWCwgMH07CiAgICAgICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZXNbaV07CiAgICAgICAgIGlmICghYnVmZmVyX3NpemUpIHsKICAgICAgICAgICAgIHBhdGhfZXJyb3IocGF0aCk7CkBAIC0xMDk4Nyw5ICsxMTAwNyw5IEBACiAgICAgbmFtZSA9IHBhdGgtPm5hcnJvdyA/IHBhdGgtPm5hcnJvdyA6ICIuIjsKIAogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKnN0YXJ0LCAqdHJhY2UsICplbmQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXJ0LCAqdHJhY2UsICplbmQ7CiAgICAgICAgIHNzaXplX3QgbGVuZ3RoOwotICAgICAgICBzdGF0aWMgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsgMjU2LCBYQVRUUl9MSVNUX01BWCwgMCB9OworICAgICAgICBzdGF0aWMgY29uc3QgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsgMjU2LCBYQVRUUl9MSVNUX01BWCwgMCB9OwogICAgICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemVzW2ldOwogICAgICAgICBpZiAoIWJ1ZmZlcl9zaXplKSB7CiAgICAgICAgICAgICAvKiBFUkFOR0UgKi8KQEAgLTExMjAxLDExICsxMTIyMSwxNSBAQAogb3MuY3B1X2NvdW50CiAKIFJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuCisKK1RoaXMgbnVtYmVyIGlzIG5vdCBlcXVpdmFsZW50IHRvIHRoZSBudW1iZXIgb2YgQ1BVcyB0aGUgY3VycmVudCBwcm9jZXNzIGNhbgordXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aAorYGBsZW4ob3Muc2NoZWRfZ2V0YWZmaW5pdHkoMCkpYGAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIG9zX2NwdV9jb3VudF9pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzU5ZWU3ZjZiY2U4MzJiOCBpbnB1dD1kNTVlMmY4ZjM4MjNhNjI4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzU5ZWU3ZjZiY2U4MzJiOCBpbnB1dD1lN2M4ZjRiYTZkYmJhZGQzXSovCiB7CiAgICAgaW50IG5jcHUgPSAwOwogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTExNDYyLDcgKzExNDg2LDcgQEAKICAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0OwogCiAjaWZkZWYgTVNfV0lORE9XUwotICAgIHdjaGFyX3QgKnBhdGg7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aDsKIAogICAgIHBhdGggPSBQeVVuaWNvZGVfQXNVbmljb2RlKHNlbGYtPnBhdGgpOwogICAgIGlmICghcGF0aCkKQEAgLTExNDc5LDcgKzExNTAzLDcgQEAKICAgICB9CiAjZWxzZSAvKiBQT1NJWCAqLwogICAgIFB5T2JqZWN0ICpieXRlczsKLSAgICBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAKICAgICBpZiAoIVB5VW5pY29kZV9GU0NvbnZlcnRlcihzZWxmLT5wYXRoLCAmYnl0ZXMpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNjYzLDcgKzExNjg3LDcgQEAKIHsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKCFzZWxmLT5nb3RfZmlsZV9pbmRleCkgewotICAgICAgICB3Y2hhcl90ICpwYXRoOworICAgICAgICBjb25zdCB3Y2hhcl90ICpwYXRoOwogICAgICAgICBzdHJ1Y3QgX1B5X3N0YXRfc3RydWN0IHN0YXQ7CiAKICAgICAgICAgcGF0aCA9IFB5VW5pY29kZV9Bc1VuaWNvZGUoc2VsZi0+cGF0aCk7CkBAIC0xMTY5NCw2ICsxMTcxOCwxMyBAQAogICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiPERpckVudHJ5ICVSPiIsIHNlbGYtPm5hbWUpOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorRGlyRW50cnlfZnNwYXRoKERpckVudHJ5ICpzZWxmKQoreworICAgIFB5X0lOQ1JFRihzZWxmLT5wYXRoKTsKKyAgICByZXR1cm4gc2VsZi0+cGF0aDsKK30KKwogc3RhdGljIFB5TWVtYmVyRGVmIERpckVudHJ5X21lbWJlcnNbXSA9IHsKICAgICB7Im5hbWUiLCBUX09CSkVDVF9FWCwgb2Zmc2V0b2YoRGlyRW50cnksIG5hbWUpLCBSRUFET05MWSwKICAgICAgInRoZSBlbnRyeSdzIGJhc2UgZmlsZW5hbWUsIHJlbGF0aXZlIHRvIHNjYW5kaXIoKSBcInBhdGhcIiBhcmd1bWVudCJ9LApAQCAtMTE3MTgsNiArMTE3NDksOSBAQAogICAgIHsiaW5vZGUiLCAoUHlDRnVuY3Rpb24pRGlyRW50cnlfaW5vZGUsIE1FVEhfTk9BUkdTLAogICAgICAicmV0dXJuIGlub2RlIG9mIHRoZSBlbnRyeTsgY2FjaGVkIHBlciBlbnRyeSIsCiAgICAgfSwKKyAgICB7Il9fZnNwYXRoX18iLCAoUHlDRnVuY3Rpb24pRGlyRW50cnlfZnNwYXRoLCBNRVRIX05PQVJHUywKKyAgICAgInJldHVybnMgdGhlIHBhdGggZm9yIHRoZSBlbnRyeSIsCisgICAgfSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTExNzU3LDcgKzExNzkxLDcgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAKIHN0YXRpYyB3Y2hhcl90ICoKLWpvaW5fcGF0aF9maWxlbmFtZVcod2NoYXJfdCAqcGF0aF93aWRlLCB3Y2hhcl90KiBmaWxlbmFtZSkKK2pvaW5fcGF0aF9maWxlbmFtZVcoY29uc3Qgd2NoYXJfdCAqcGF0aF93aWRlLCBjb25zdCB3Y2hhcl90ICpmaWxlbmFtZSkKIHsKICAgICBQeV9zc2l6ZV90IHBhdGhfbGVuOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKQEAgLTExODMyLDcgKzExODY2LDcgQEAKICNlbHNlIC8qIFBPU0lYICovCiAKIHN0YXRpYyBjaGFyICoKLWpvaW5fcGF0aF9maWxlbmFtZShjaGFyICpwYXRoX25hcnJvdywgY2hhciogZmlsZW5hbWUsIFB5X3NzaXplX3QgZmlsZW5hbWVfbGVuKQoram9pbl9wYXRoX2ZpbGVuYW1lKGNvbnN0IGNoYXIgKnBhdGhfbmFycm93LCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgUHlfc3NpemVfdCBmaWxlbmFtZV9sZW4pCiB7CiAgICAgUHlfc3NpemVfdCBwYXRoX2xlbjsKICAgICBQeV9zc2l6ZV90IHNpemU7CkBAIC0xMTg2NCw3ICsxMTg5OCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1EaXJFbnRyeV9mcm9tX3Bvc2l4X2luZm8ocGF0aF90ICpwYXRoLCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG5hbWVfbGVuLAorRGlyRW50cnlfZnJvbV9wb3NpeF9pbmZvKHBhdGhfdCAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSwgUHlfc3NpemVfdCBuYW1lX2xlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbm9fdCBkX2lubwogI2lmZGVmIEhBVkVfRElSRU5UX0RfVFlQRQogICAgICAgICAgICAgICAgICAgICAgICAgICwgdW5zaWduZWQgY2hhciBkX3R5cGUKQEAgLTExOTI3LDggKzExOTYxLDE0IEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiAKK3N0YXRpYyBpbnQKK1NjYW5kaXJJdGVyYXRvcl9pc19jbG9zZWQoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK3sKKyAgICByZXR1cm4gaXRlcmF0b3ItPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKK30KKwogc3RhdGljIHZvaWQKLVNjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQorU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCiB7CiAgICAgSEFORExFIGhhbmRsZSA9IGl0ZXJhdG9yLT5oYW5kbGU7CiAKQEAgLTExOTQ4LDcgKzExOTg4LDcgQEAKICAgICBCT09MIHN1Y2Nlc3M7CiAgICAgUHlPYmplY3QgKmVudHJ5OwogCi0gICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UgKi8KKyAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSwgb3IgY2xvc2VkIGV4cGxpY2l0bHkgKi8KICAgICBpZiAoaXRlcmF0b3ItPmhhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTExOTc5LDE0ICsxMjAxOSwyMCBAQAogICAgIH0KIAogICAgIC8qIEVycm9yIG9yIG5vIG1vcmUgZmlsZXMgKi8KLSAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2UoaXRlcmF0b3IpOworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihpdGVyYXRvcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbHNlIC8qIFBPU0lYICovCiAKK3N0YXRpYyBpbnQKK1NjYW5kaXJJdGVyYXRvcl9pc19jbG9zZWQoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK3sKKyAgICByZXR1cm4gIWl0ZXJhdG9yLT5kaXJwOworfQorCiBzdGF0aWMgdm9pZAotU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCitTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKIHsKICAgICBESVIgKmRpcnAgPSBpdGVyYXRvci0+ZGlycDsKIApAQCAtMTIwMDgsNyArMTIwNTQsNyBAQAogICAgIGludCBpc19kb3Q7CiAgICAgUHlPYmplY3QgKmVudHJ5OwogCi0gICAgLyogSGFwcGVucyBpZiB0aGUgaXRlcmF0b3IgaXMgaXRlcmF0ZWQgdHdpY2UgKi8KKyAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSwgb3IgY2xvc2VkIGV4cGxpY2l0bHkgKi8KICAgICBpZiAoIWl0ZXJhdG9yLT5kaXJwKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTIwNDUsMjEgKzEyMDkxLDc2IEBACiAgICAgfQogCiAgICAgLyogRXJyb3Igb3Igbm8gbW9yZSBmaWxlcyAqLwotICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZShpdGVyYXRvcik7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKGl0ZXJhdG9yKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAogI2VuZGlmCiAKK3N0YXRpYyBQeU9iamVjdCAqCitTY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoc2VsZik7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitTY2FuZGlySXRlcmF0b3JfZW50ZXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICByZXR1cm4gc2VsZjsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9leGl0KFNjYW5kaXJJdGVyYXRvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKHNlbGYpOworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgdm9pZAorU2NhbmRpckl0ZXJhdG9yX2ZpbmFsaXplKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCit7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisKKyAgICBpZiAoIVNjYW5kaXJJdGVyYXRvcl9pc19jbG9zZWQoaXRlcmF0b3IpKSB7CisgICAgICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihpdGVyYXRvcik7CisKKyAgICAgICAgaWYgKFB5RXJyX1Jlc291cmNlV2FybmluZygoUHlPYmplY3QgKilpdGVyYXRvciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5jbG9zZWQgc2NhbmRpciBpdGVyYXRvciAlUiIsIGl0ZXJhdG9yKSkgeworICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KKyAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKChQeU9iamVjdCAqKSBpdGVyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQeV9DTEVBUihpdGVyYXRvci0+cGF0aC5vYmplY3QpOworICAgIHBhdGhfY2xlYW51cCgmaXRlcmF0b3ItPnBhdGgpOworCisgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLworICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7Cit9CisKIHN0YXRpYyB2b2lkCiBTY2FuZGlySXRlcmF0b3JfZGVhbGxvYyhTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQogewotICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZShpdGVyYXRvcik7Ci0gICAgUHlfWERFQ1JFRihpdGVyYXRvci0+cGF0aC5vYmplY3QpOwotICAgIHBhdGhfY2xlYW51cCgmaXRlcmF0b3ItPnBhdGgpOworICAgIGlmIChQeU9iamVjdF9DYWxsRmluYWxpemVyRnJvbURlYWxsb2MoKFB5T2JqZWN0ICopaXRlcmF0b3IpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCiAgICAgUHlfVFlQRShpdGVyYXRvciktPnRwX2ZyZWUoKFB5T2JqZWN0ICopaXRlcmF0b3IpOwogfQogCitzdGF0aWMgUHlNZXRob2REZWYgU2NhbmRpckl0ZXJhdG9yX21ldGhvZHNbXSA9IHsKKyAgICB7Il9fZW50ZXJfXyIsIChQeUNGdW5jdGlvbilTY2FuZGlySXRlcmF0b3JfZW50ZXIsIE1FVEhfTk9BUkdTfSwKKyAgICB7Il9fZXhpdF9fIiwgKFB5Q0Z1bmN0aW9uKVNjYW5kaXJJdGVyYXRvcl9leGl0LCBNRVRIX1ZBUkFSR1N9LAorICAgIHsiY2xvc2UiLCAoUHlDRnVuY3Rpb24pU2NhbmRpckl0ZXJhdG9yX2Nsb3NlLCBNRVRIX05PQVJHU30sCisgICAge05VTEx9Cit9OworCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFNjYW5kaXJJdGVyYXRvclR5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgTU9ETkFNRSAiLlNjYW5kaXJJdGVyYXRvciIsICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KQEAgLTEyMDgxLDcgKzEyMTgyLDggQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUCisgICAgICAgIHwgUHlfVFBGTEFHU19IQVZFX0ZJTkFMSVpFLCAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtMTIwODksNiArMTIxOTEsMjcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLwogICAgIChpdGVybmV4dGZ1bmMpU2NhbmRpckl0ZXJhdG9yX2l0ZXJuZXh0LCAvKiB0cF9pdGVybmV4dCAqLworICAgIFNjYW5kaXJJdGVyYXRvcl9tZXRob2RzLCAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3ViY2xhc3NlcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdmVyc2lvbl90YWcgKi8KKyAgICAoZGVzdHJ1Y3RvcilTY2FuZGlySXRlcmF0b3JfZmluYWxpemUsICAgLyogdHBfZmluYWxpemUgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMjA5OSw3ICsxMjIyMiw3IEBACiAjaWZkZWYgTVNfV0lORE9XUwogICAgIHdjaGFyX3QgKnBhdGhfc3RyVzsKICNlbHNlCi0gICAgY2hhciAqcGF0aDsKKyAgICBjb25zdCBjaGFyICpwYXRoOwogI2VuZGlmCiAKICAgICBpdGVyYXRvciA9IFB5T2JqZWN0X05ldyhTY2FuZGlySXRlcmF0b3IsICZTY2FuZGlySXRlcmF0b3JUeXBlKTsKQEAgLTEyMTcxLDYgKzEyMjk0LDY1IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKKy8qCisgICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisKKyAgICBJZiB0aGUgb2JqZWN0IGlzIHN0ciBvciBieXRlcywgdGhlbiBhbGxvdyBpdCB0byBwYXNzIHRocm91Z2ggd2l0aAorICAgIGFuIGluY3JlbWVudGVkIHJlZmNvdW50LiBJZiB0aGUgb2JqZWN0IGRlZmluZXMgX19mc3BhdGhfXygpLCB0aGVuCisgICAgcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhhdCBtZXRob2QuIEFsbCBvdGhlciB0eXBlcyByYWlzZSBhIFR5cGVFcnJvci4KKyovCitQeU9iamVjdCAqCitQeU9TX0ZTUGF0aChQeU9iamVjdCAqcGF0aCkKK3sKKyAgICBfUHlfSURFTlRJRklFUihfX2ZzcGF0aF9fKTsKKyAgICBQeU9iamVjdCAqZnVuYyA9IE5VTEw7CisgICAgUHlPYmplY3QgKnBhdGhfcmVwciA9IE5VTEw7CisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHBhdGgpIHx8IFB5Qnl0ZXNfQ2hlY2socGF0aCkpIHsKKyAgICAgICAgUHlfSU5DUkVGKHBhdGgpOworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBmdW5jID0gX1B5T2JqZWN0X0xvb2t1cFNwZWNpYWwocGF0aCwgJlB5SWRfX19mc3BhdGhfXyk7CisgICAgaWYgKE5VTEwgPT0gZnVuYykgeworICAgICAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyLCBieXRlcyBvciBvcy5QYXRoTGlrZSBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMjAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwYXRoKS0+dHBfbmFtZSk7CisgICAgfQorCisgICAgcGF0aF9yZXByID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhmdW5jLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoZnVuYyk7CisgICAgaWYgKCEoUHlVbmljb2RlX0NoZWNrKHBhdGhfcmVwcikgfHwgUHlCeXRlc19DaGVjayhwYXRoX3JlcHIpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICUuMjAwcy5fX2ZzcGF0aF9fKCkgdG8gcmV0dXJuIHN0ciBvciBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHBhdGgpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwYXRoX3JlcHIpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHBhdGhfcmVwcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwYXRoX3JlcHI7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK29zLmZzcGF0aAorCisgICAgcGF0aDogb2JqZWN0CisKK1JldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorCitJZiB0aGUgb2JqZWN0IGlzIHN0ciBvciBieXRlcywgdGhlbiBhbGxvdyBpdCB0byBwYXNzIHRocm91Z2ggYXMtaXMuIElmIHRoZQorb2JqZWN0IGRlZmluZXMgX19mc3BhdGhfXygpLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgbWV0aG9kLiBBbGwgb3RoZXIKK3R5cGVzIHJhaXNlIGEgVHlwZUVycm9yLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZnNwYXRoX2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgUHlPYmplY3QgKnBhdGgpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTFlZjBjMjc3MmMxOTMyYSBpbnB1dD1lMzU3MTY1ZjdiMjI0OTBmXSovCit7CisgICAgcmV0dXJuIFB5T1NfRlNQYXRoKHBhdGgpOworfQogCiAjaW5jbHVkZSAiY2xpbmljL3Bvc2l4bW9kdWxlLmMuaCIKIApAQCAtMTIzNzEsNiArMTI1NTMsNyBAQAogICAgIHsic2NhbmRpciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvc2l4X3NjYW5kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXhfc2NhbmRpcl9fZG9jX199LAorICAgIE9TX0ZTUEFUSF9NRVRIT0RERUYKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKQEAgLTEyMzgyLDcgKzEyNTY1LDYgQEAKICAgICBIQU5ETEUgdG9rOwogICAgIFRPS0VOX1BSSVZJTEVHRVMgdG9rX3ByaXY7CiAgICAgTFVJRCBsdWlkOwotICAgIGludCBtZXRoX2lkeCA9IDA7CiAKICAgICBpZiAoIU9wZW5Qcm9jZXNzVG9rZW4oR2V0Q3VycmVudFByb2Nlc3MoKSwgVE9LRU5fQUxMX0FDQ0VTUywgJnRvaykpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTI0ODUsMTIgKzEyNjY3LDE0IEBACiAjaWZkZWYgT19MQVJHRUZJTEUKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19MQVJHRUZJTEUpKSByZXR1cm4gLTE7CiAjZW5kaWYKKyNpZm5kZWYgX19HTlVfXwogI2lmZGVmIE9fU0hMT0NLCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE9fU0hMT0NLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19FWExPQ0sKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19FWExPQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKKyNlbmRpZgogI2lmZGVmIE9fRVhFQwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBPX0VYRUMpKSByZXR1cm4gLTE7CiAjZW5kaWYKQEAgLTEyNzg3LDI1ICsxMjk3MSwyNSBAQAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBYQVRUUl9TSVpFX01BWCkpIHJldHVybiAtMTsKICNlbmRpZgogCi0jaWZkZWYgUlRMRF9MQVpZCisjaWYgSEFWRV9ERUNMX1JUTERfTEFaWQogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX0xBWlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX05PVworI2lmIEhBVkVfREVDTF9SVExEX05PVwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX05PVykpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfR0xPQkFMCisjaWYgSEFWRV9ERUNMX1JUTERfR0xPQkFMCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfR0xPQkFMKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9MT0NBTAorI2lmIEhBVkVfREVDTF9SVExEX0xPQ0FMCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTE9DQUwpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX05PREVMRVRFCisjaWYgSEFWRV9ERUNMX1JUTERfTk9ERUxFVEUKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9OT0RFTEVURSkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfTk9MT0FECisjaWYgSEFWRV9ERUNMX1JUTERfTk9MT0FECiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTk9MT0FEKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9ERUVQQklORAorI2lmIEhBVkVfREVDTF9SVExEX0RFRVBCSU5ECiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfREVFUEJJTkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKIApAQCAtMTI4MjYsNyArMTMwMTAsNyBAQAogfTsKIAogCi1zdGF0aWMgY2hhciAqaGF2ZV9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGF2ZV9mdW5jdGlvbnNbXSA9IHsKIAogI2lmZGVmIEhBVkVfRkFDQ0VTU0FUCiAgICAgIkhBVkVfRkFDQ0VTU0FUIiwKQEAgLTEyOTYxLDcgKzEzMTQ1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqbSwgKnY7CiAgICAgUHlPYmplY3QgKmxpc3Q7Ci0gICAgY2hhciAqKnRyYWNlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdHJhY2U7CiAKICNpZiBkZWZpbmVkKEhBVkVfU1lNTElOSykgJiYgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIHdpbjMyX2Nhbl9zeW1saW5rID0gZW5hYmxlX3N5bWxpbmsoKTsKQEAgLTEzMTM2LDYgKzEzMzIwLDcgQEAKICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgIH0KICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9oYXZlX2Z1bmN0aW9ucyIsIGxpc3QpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRGlyRW50cnkiLCAoUHlPYmplY3QgKikmRGlyRW50cnlUeXBlKTsKIAogICAgIGluaXRpYWxpemVkID0gMTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wd2Rtb2R1bGUuYyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKaW5kZXggMjgxYzMwYi4uNjFiZTNiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCkBAIC03NSwxMCArNzUsMTggQEAKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX1BBU1NXRCkgJiYgIWRlZmluZWQoX19BTkRST0lEX18pCiAgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19wYXNzd2QpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tVWlkKHAtPnB3X3VpZCkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tR2lkKHAtPnB3X2dpZCkpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TKQogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZ2Vjb3MpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZGlyKTsKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3NoZWxsKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCA5YTZkYTczLi4yZGFmYmIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogZmFsc2Ugb24gYW4gZXhjZXB0aW9uLgogICovCiBzdGF0aWMgaW50Ci1zZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCitzZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotY2FsbF93aXRoX2ZyYW1lKGNoYXIgKmZ1bmNuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCogZnVuYywgUHlPYmplY3QqIGFyZ3MsCitjYWxsX3dpdGhfZnJhbWUoY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0KiBmdW5jLCBQeU9iamVjdCogYXJncywKICAgICAgICAgICAgICAgICB4bWxwYXJzZW9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcmVzOwpAQCAtNzQ3LDcgKzc0Nyw4IEBACiAgICAgICAgIHMgKz0gTUFYX0NIVU5LX1NJWkU7CiAgICAgICAgIHNsZW4gLT0gTUFYX0NIVU5LX1NJWkU7CiAgICAgfQotICAgIGFzc2VydChNQVhfQ0hVTktfU0laRSA8IElOVF9NQVggJiYgc2xlbiA8IElOVF9NQVgpOworICAgIFB5X0JVSUxEX0FTU0VSVChNQVhfQ0hVTktfU0laRSA8PSBJTlRfTUFYKTsKKyAgICBhc3NlcnQoc2xlbiA8PSBJTlRfTUFYKTsKICAgICByYyA9IFhNTF9QYXJzZShzZWxmLT5pdHNlbGYsIHMsIChpbnQpc2xlbiwgaXNmaW5hbCk7CiAKIGRvbmU6CkBAIC03NjUsNyArNzY2LDcgQEAKIHsKICAgICBQeU9iamVjdCAqc3RyOwogICAgIFB5X3NzaXplX3QgbGVuOwotICAgIGNoYXIgKnB0cjsKKyAgICBjb25zdCBjaGFyICpwdHI7CiAKICAgICBzdHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIm4iLCBidWZfc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQpAQCAtMTIyNSwxMiArMTIyNiw4IEBACiAgICAgc2VsZi0+aXRzZWxmID0gTlVMTDsKIAogICAgIGlmIChzZWxmLT5oYW5kbGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wOwotICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+aGFuZGxlcnNbaV0pOwogICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmhhbmRsZXJzKTsKICAgICAgICAgc2VsZi0+aGFuZGxlcnMgPSBOVUxMOwogICAgIH0KQEAgLTEzNDQsNyArMTM0MSw2IEBACiAgICAgaW50IGhhbmRsZXJudW0gPSBoYW5kbGVybmFtZTJpbnQobmFtZSk7CiAgICAgaWYgKGhhbmRsZXJudW0gPj0gMCkgewogICAgICAgICB4bWxoYW5kbGVyIGNfaGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV07CiAKICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewogICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYW5kIGEgY2hhcmFjdGVyCkBAIC0xMzY2LDggKzEzNjIsNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgY19oYW5kbGVyID0gaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLmhhbmRsZXI7CiAgICAgICAgIH0KLSAgICAgICAgc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV0gPSB2OwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICBQeV9YU0VUUkVGKHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dLCB2KTsKICAgICAgICAgaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLnNldHRlcihzZWxmLT5pdHNlbGYsIGNfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE4OTcsMTUgKzE4OTIsMTIgQEAKIGNsZWFyX2hhbmRsZXJzKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBpbnQgaW5pdGlhbCkKIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgUHlPYmplY3QgKnRlbXA7CiAKICAgICBmb3IgKDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGlmIChpbml0aWFsKQogICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggOTFmN2NjYS4uZjg4NzZlMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMzQzLDEwICszNDMsOCBAQAogICAgICAgICBQeV9DTEVBUigqaG9va192YXIpOwogICAgIH0KICAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgewotICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOwogICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOwotICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKCpob29rX3ZhciwgZnVuY3Rpb24pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKQEAgLTYwNCw2ICs2MDIsMjQgQEAKICJhZGRfaGlzdG9yeShzdHJpbmcpIC0+IE5vbmVcblwKIGFkZCBhbiBpdGVtIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlciIpOwogCitzdGF0aWMgaW50IHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ID0gMTsKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGhpc3RvcnkgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3B5X3NldF9hdXRvX2hpc3RvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicDpzZXRfYXV0b19oaXN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNob3VsZF9hdXRvX2FkZF9oaXN0b3J5KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5RG9jX1NUUlZBUihkb2Nfc2V0X2F1dG9faGlzdG9yeSwKKyJzZXRfYXV0b19oaXN0b3J5KGVuYWJsZWQpIC0+IE5vbmVcblwKK0VuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGhpc3RvcnkuIik7CisKIAogLyogR2V0IHRoZSB0YWItY29tcGxldGlvbiB3b3JkLWRlbGltaXRlcnMgdGhhdCByZWFkbGluZSB1c2VzICovCiAKQEAgLTgyMiw2ICs4MzgsNyBAQAogCiAgICAgeyJzZXRfY29tcGxldGVyX2RlbGltcyIsIHNldF9jb21wbGV0ZXJfZGVsaW1zLAogICAgICBNRVRIX08sIGRvY19zZXRfY29tcGxldGVyX2RlbGltc30sCisgICAgeyJzZXRfYXV0b19oaXN0b3J5IiwgcHlfc2V0X2F1dG9faGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2F1dG9faGlzdG9yeX0sCiAgICAgeyJhZGRfaGlzdG9yeSIsIHB5X2FkZF9oaXN0b3J5LCBNRVRIX08sIGRvY19hZGRfaGlzdG9yeX0sCiAgICAgeyJyZW1vdmVfaGlzdG9yeV9pdGVtIiwgcHlfcmVtb3ZlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlbW92ZV9oaXN0b3J5fSwKICAgICB7InJlcGxhY2VfaGlzdG9yeV9pdGVtIiwgcHlfcmVwbGFjZV9oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19yZXBsYWNlX2hpc3Rvcnl9LApAQCAtODU3LDcgKzg3NCw3IEBACiAgICAgICAgIGlmIChyID09IFB5X05vbmUpCiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmcocik7CisgICAgICAgICAgICByZXN1bHQgPSBfUHlMb25nX0FzSW50KHIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTEzMjQsNyArMTM0MSw3IEBACiAKICAgICAvKiB3ZSBoYXZlIGEgdmFsaWQgbGluZSAqLwogICAgIG4gPSBzdHJsZW4ocCk7Ci0gICAgaWYgKG4gPiAwKSB7CisgICAgaWYgKHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ICYmIG4gPiAwKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmxpbmU7CiAgICAgICAgIGludCBsZW5ndGggPSBfcHlfZ2V0X2hpc3RvcnlfbGVuZ3RoKCk7CiAgICAgICAgIGlmIChsZW5ndGggPiAwKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggMDAzMjRhNS4uYTZiNjNkMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC0xODQyLDcgKzE4NDIsNyBAQAogICAgIFB5T2JqZWN0ICpwZmQ7CiAgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpZGVudCIsICJmaWx0ZXIiLCAiZmxhZ3MiLCAiZmZsYWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiLCAidWRhdGEiLCBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gIk98aEhJIiBEQVRBX0ZNVF9VTklUIFVJTlRQVFJUX0ZNVF9VTklUICI6a2V2ZW50IjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJPfGhISSIgREFUQV9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CiAKICAgICBFVl9TRVQoJihzZWxmLT5lKSwgMCwgRVZGSUxUX1JFQUQsIEVWX0FERCwgMCwgMCwgMCk7IC8qIGRlZmF1bHRzICovCiAKQEAgLTIxMjcsNyArMjEyNyw3IEBACiAgICAgICAgIGlmIChfUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KCZ0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGltZW91dCwgX1B5VGltZV9ST1VORF9DRUlMSU5HKSA8IDApIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgInRpbWVvdXQgYXJndW1lbnQgbXVzdCBiZSBhbiBudW1iZXIgIgorICAgICAgICAgICAgICAgICJ0aW1lb3V0IGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIgIgogICAgICAgICAgICAgICAgICJvciBOb25lLCBnb3QgJS4yMDBzIiwKICAgICAgICAgICAgICAgICBQeV9UWVBFKG90aW1lb3V0KS0+dHBfbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IDhmNTcxYTIuLmY3ZmUyMTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtMTYzLDcgKzE2MywxMSBAQAogIyBpbmNsdWRlIDxzeXMvdWlvLmg+CiAjZW5kaWYKIAotI2lmbmRlZiBXSVRIX1RIUkVBRAorI2lmICFkZWZpbmVkKFdJVEhfVEhSRUFEKQorIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAyMwogIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgogI2VuZGlmCiAKQEAgLTkyNiw3ICs5MzAsNyBAQAogICAgYW4gZXJyb3Igb2NjdXJyZWQ7IHRoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKi8KIAogc3RhdGljIGludAotc2V0aXBhZGRyKGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCitzZXRpcGFkZHIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICphZGRyX3JldCwgc2l6ZV90IGFkZHJfcmV0X3NpemUsIGludCBhZikKIHsKICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CiAgICAgaW50IGVycm9yOwpAQCAtMTEwNyw3ICsxMTExLDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkLiAqLwogCiBzdGF0aWMgaW50Ci1zZXRiZGFkZHIoY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKK3NldGJkYWRkcihjb25zdCBjaGFyICpuYW1lLCBiZGFkZHJfdCAqYmRhZGRyKQogewogICAgIHVuc2lnbmVkIGludCBiMCwgYjEsIGIyLCBiMywgYjQsIGI1OwogICAgIGNoYXIgY2g7CkBAIC0xNDAxLDcgKzE0MDUsNyBAQAogaWRuYV9jb252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgc3RydWN0IG1heWJlX2lkbmEgKmRhdGEpCiB7CiAgICAgc2l6ZV90IGxlbjsKLSAgICBQeU9iamVjdCAqb2JqMiwgKm9iajM7CisgICAgUHlPYmplY3QgKm9iajI7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIGlkbmFfY2xlYW51cChkYXRhKTsKICAgICAgICAgcmV0dXJuIDE7CkBAIC0xNDE2LDMxICsxNDIwLDI3IEBACiAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5Qnl0ZUFycmF5X0FzU3RyaW5nKG9iaik7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZUFycmF5X1NpemUob2JqKTsKICAgICB9Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikgJiYgUHlVbmljb2RlX1JFQURZKG9iaikgPT0gMCAmJiBQeVVuaWNvZGVfSVNfQ09NUEFDVF9BU0NJSShvYmopKSB7Ci0gICAgICAgIGRhdGEtPmJ1ZiA9IFB5VW5pY29kZV9EQVRBKG9iaik7Ci0gICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopID09IDAgJiYgUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkob2JqKSkgeworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlVbmljb2RlX0RBVEEob2JqKTsKKyAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYmoyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmosICJpZG5hIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9iajIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhvYmoyKSk7CisgICAgICAgICAgICBkYXRhLT5vYmogPSBvYmoyOworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlCeXRlc19BU19TVFJJTkcob2JqMik7CisgICAgICAgICAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKG9iajIpOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBvYmoyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICAgICAgaWYgKCFvYmoyKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RyaW5nIG9yIHVuaWNvZGUgdGV4dCBidWZmZXIgZXhwZWN0ZWQsIG5vdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG9iajMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG9iajIsICJpZG5hIiwgTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihvYmoyKTsKLSAgICAgICAgaWYgKCFvYmozKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sob2JqMykpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihvYmozKTsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlbmNvZGluZyBvZiBob3N0bmFtZSBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBkYXRhLT5vYmogPSBvYmozOwotICAgICAgICBkYXRhLT5idWYgPSBQeUJ5dGVzX0FTX1NUUklORyhvYmozKTsKLSAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShvYmozKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0ciwgYnl0ZXMgb3IgYnl0ZWFycmF5IGV4cGVjdGVkLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChzdHJsZW4oZGF0YS0+YnVmKSAhPSBsZW4pIHsKICAgICAgICAgUHlfQ0xFQVIoZGF0YS0+b2JqKTsKQEAgLTI0NTgsMTMgKzI0NTgsMjYgQEAKICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXkqOnNldHNvY2tvcHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsLCAmb3B0bmFtZSwgJm9wdHZhbCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGlmIChvcHR2YWwubGVuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmb3B0dmFsKTsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQgb3B0aW9uIGlzIGxhcmdlciB0aGFuICVpIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlcyA9IHNldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsLmJ1ZiwgKGludClvcHR2YWwubGVuKTsKKyNlbHNlCiAgICAgICAgIHJlcyA9IHNldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbC5idWYsIG9wdHZhbC5sZW4pOworI2VuZGlmCiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9wdHZhbCk7CiAgICAgfQotICAgIGlmIChyZXMgPCAwKQorICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRzb2Nrb3B0X2RvYywKQEAgLTI1NjMsMTYgKzI1NzYsMjIgQEAKIHNvY2tfY2xvc2UoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewogICAgIFNPQ0tFVF9UIGZkOworICAgIGludCByZXM7CiAKLSAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNTc2NDc4LwotICAgICAqIGFuZCBodHRwOi8vbGludXguZGVya2VpbGVyLmNvbS9NYWlsaW5nLUxpc3RzL0tlcm5lbC8yMDA1LTA5LzMwMDAuaHRtbAotICAgICAqIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICovCi0gICAgaWYgKChmZCA9IHMtPnNvY2tfZmQpICE9IC0xKSB7CisgICAgZmQgPSBzLT5zb2NrX2ZkOworICAgIGlmIChmZCAhPSAtMSkgewogICAgICAgICBzLT5zb2NrX2ZkID0gLTE7CisKKyAgICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gcmV0cnkgdXBvbiBFSU5UUjogc2VlCisgICAgICAgICAgIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzU3NjQ3OC8gYW5kCisgICAgICAgICAgIGh0dHA6Ly9saW51eC5kZXJrZWlsZXIuY29tL01haWxpbmctTGlzdHMvS2VybmVsLzIwMDUtMDkvMzAwMC5odG1sCisgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuICovCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKGZkKTsKKyAgICAgICAgcmVzID0gU09DS0VUQ0xPU0UoZmQpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgICAgICB9CiAgICAgfQogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQwMzQsNiArNDA1MywxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZWN2KTsgfQorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICBjYXNlIFNJT19MT09QQkFDS19GQVNUX1BBVEg6IHsKKyAgICAgICAgdW5zaWduZWQgaW50IG9wdGlvbjsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImtJOmlvY3RsIiwgJmNtZCwgJm9wdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgJnJlY3YsIE5VTEwsIE5VTEwpID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZWN2KTsgfQorI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGlvY3RsIGNvbW1hbmQgJWQiLCBjbWQpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQwNDQsNyArNDA3NCw4IEBACiBcblwKIENvbnRyb2wgdGhlIHNvY2tldCB3aXRoIFdTQUlvY3RsIHN5c2NhbGwuIEN1cnJlbnRseSBzdXBwb3J0ZWQgJ2NtZCcgdmFsdWVzIGFyZVxuXAogU0lPX1JDVkFMTDogICdvcHRpb24nIG11c3QgYmUgb25lIG9mIHRoZSBzb2NrZXQuUkNWQUxMXyogY29uc3RhbnRzLlxuXAotU0lPX0tFRVBBTElWRV9WQUxTOiAgJ29wdGlvbicgaXMgYSB0dXBsZSBvZiAob25vZmYsIHRpbWVvdXQsIGludGVydmFsKS4iKTsKK1NJT19LRUVQQUxJVkVfVkFMUzogICdvcHRpb24nIGlzIGEgdHVwbGUgb2YgKG9ub2ZmLCB0aW1lb3V0LCBpbnRlcnZhbCkuXG5cCitTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIOiAnb3B0aW9uJyBpcyBhIGJvb2xlYW4gdmFsdWUsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Iik7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKQEAgLTQxNjMsMjIgKzQxOTQsNDUgQEAKICAgIEZpcnN0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiAqLwogCiBzdGF0aWMgdm9pZAorc29ja19maW5hbGl6ZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCit7CisgICAgU09DS0VUX1QgZmQ7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisKKyAgICBpZiAocy0+c29ja19mZCAhPSAtMSkgeworICAgICAgICBpZiAoUHlFcnJfUmVzb3VyY2VXYXJuaW5nKChQeU9iamVjdCAqKXMsIDEsICJ1bmNsb3NlZCAlUiIsIHMpKSB7CisgICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBPbmx5IGNsb3NlIHRoZSBzb2NrZXQgKmFmdGVyKiBsb2dnaW5nIHRoZSBSZXNvdXJjZVdhcm5pbmcgd2FybmluZworICAgICAgICAgICB0byBhbGxvdyB0aGUgbG9nZ2VyIHRvIGNhbGwgc29ja2V0IG1ldGhvZHMgbGlrZQorICAgICAgICAgICBzb2NrZXQuZ2V0c29ja25hbWUoKS4gSWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgYmVmb3JlLCBzb2NrZXQKKyAgICAgICAgICAgbWV0aG9kcyBmYWlscyB3aXRoIHRoZSBFQkFERiBlcnJvci4gKi8KKyAgICAgICAgZmQgPSBzLT5zb2NrX2ZkOworICAgICAgICBzLT5zb2NrX2ZkID0gLTE7CisKKyAgICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gcmV0cnkgdXBvbiBFSU5UUjogc2VlIHNvY2tfY2xvc2UoKSAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorCisgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLworICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7Cit9CisKK3N0YXRpYyB2b2lkCiBzb2NrX2RlYWxsb2MoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotICAgIGlmIChzLT5zb2NrX2ZkICE9IC0xKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKLSAgICAgICAgUHlfc3NpemVfdCBvbGRfcmVmY291bnQgPSBQeV9SRUZDTlQocyk7Ci0gICAgICAgICsrUHlfUkVGQ05UKHMpOwotICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19SZXNvdXJjZVdhcm5pbmcsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmNsb3NlZCAlUiIsIHMpKQotICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KLSAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKQotICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgcyk7Ci0gICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjLCB2YWwsIHRiKTsKLSAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKHMtPnNvY2tfZmQpOwotICAgICAgICBQeV9SRUZDTlQocykgPSBvbGRfcmVmY291bnQ7Ci0gICAgfQorICAgIGlmIChQeU9iamVjdF9DYWxsRmluYWxpemVyRnJvbURlYWxsb2MoKFB5T2JqZWN0ICopcykgPCAwKQorICAgICAgICByZXR1cm47CisKICAgICBQeV9UWVBFKHMpLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOwogfQogCkBAIC00Mzk1LDcgKzQ0NDksOCBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUKKyAgICAgICAgfCBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgc29ja19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtNDQxNSw2ICs0NDcwLDE1IEBACiAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwogICAgIHNvY2tfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCisgICAgKGRlc3RydWN0b3Ipc29ja19maW5hbGl6ZSwgICAgICAgICAgICAgICAgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogCkBAIC01NDUwLDEwICs1NTE0LDYgQEAKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcocmV0dmFsKTsKICAgICB9Ci0KLSAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImludmFsaWQgaGFuZGxpbmcgb2YgaW5ldF9udG9wIik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKQEAgLTYxODcsOSArNjI0Nyw2IEBACiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfVU5TUEVDKTsKICNlbmRpZgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX0lORVQpOwotI2lmZGVmIEFGX0lORVQ2Ci0gICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfSU5FVDYpOwotI2VuZGlmIC8qIEFGX0lORVQ2ICovCiAjaWYgZGVmaW5lZChBRl9VTklYKQogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX1VOSVgpOwogI2VuZGlmIC8qIEFGX1VOSVggKi8KQEAgLTY0ODEsOSArNjUzOCwxMSBAQAogI2lmZGVmICBTT19PT0JJTkxJTkUKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19PT0JJTkxJTkUpOwogI2VuZGlmCisjaWZuZGVmIF9fR05VX18KICNpZmRlZiAgU09fUkVVU0VQT1JUCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fUkVVU0VQT1JUKTsKICNlbmRpZgorI2VuZGlmCiAjaWZkZWYgIFNPX1NOREJVRgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1NOREJVRik7CiAjZW5kaWYKQEAgLTcyMjQsOCArNzI4MywxNiBAQAogCiAjaWZkZWYgU0lPX1JDVkFMTAogICAgIHsKLSAgICAgICAgRFdPUkQgY29kZXNbXSA9IHtTSU9fUkNWQUxMLCBTSU9fS0VFUEFMSVZFX1ZBTFN9OwotICAgICAgICBjb25zdCBjaGFyICpuYW1lc1tdID0geyJTSU9fUkNWQUxMIiwgIlNJT19LRUVQQUxJVkVfVkFMUyJ9OworICAgICAgICBEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMUywKKyNpZiBkZWZpbmVkKFNJT19MT09QQkFDS19GQVNUX1BBVEgpCisgICAgICAgICAgICBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRICisjZW5kaWYKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsiU0lPX1JDVkFMTCIsICJTSU9fS0VFUEFMSVZFX1ZBTFMiLAorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICAgICAgICAgICJTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIIgorI2VuZGlmCisgICAgICAgIH07CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IoaSA9IDA7IGk8UHlfQVJSQVlfTEVOR1RIKGNvZGVzKTsgKytpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdG1wOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwppbmRleCA0OTMyNGQ1Li5lNzE1ZDAxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwpAQCAtMTM3LDcgKzEzNywxMCBAQAogICAgIGlmIChQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShieXRlcywgJm5hbWUsIE5VTEwpID09IC0xKQogICAgICAgICBnb3RvIG91dDsKICAgICBpZiAoKHAgPSBnZXRzcG5hbShuYW1lKSkgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiZ2V0c3BuYW0oKTogbmFtZSBub3QgZm91bmQiKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogICAgIHJldHZhbCA9IG1rc3BlbnQocCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NyZV9saWIuaCBiL01vZHVsZXMvc3JlX2xpYi5oCmluZGV4IDEyOGM3MWUuLjc4ZjdhYzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3JlX2xpYi5oCisrKyBiL01vZHVsZXMvc3JlX2xpYi5oCkBAIC0zNjcsMTQgKzM2NywxMiBAQAogI2RlZmluZSBSRVRVUk5fT05fRkFJTFVSRShpKSBcCiAgICAgZG8geyBSRVRVUk5fT05fRVJST1IoaSk7IGlmIChpID09IDApIFJFVFVSTl9GQUlMVVJFOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNGWSh4KSAjeAotCiAjZGVmaW5lIERBVEFfU1RBQ0tfQUxMT0Moc3RhdGUsIHR5cGUsIHB0cikgXAogZG8geyBcCiAgICAgYWxsb2NfcG9zID0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZTsgXAogICAgIFRSQUNFKCgiYWxsb2NhdGluZyAlcyBpbiAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAogICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCi0gICAgICAgICAgIFNGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAorICAgICAgICAgICBQeV9TVFJJTkdJRlkodHlwZSksIGFsbG9jX3Bvcywgc2l6ZW9mKHR5cGUpKSk7IFwKICAgICBpZiAoc2l6ZW9mKHR5cGUpID4gc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZSAtIGFsbG9jX3BvcykgeyBcCiAgICAgICAgIGludCBqID0gZGF0YV9zdGFja19ncm93KHN0YXRlLCBzaXplb2YodHlwZSkpOyBcCiAgICAgICAgIGlmIChqIDwgMCkgcmV0dXJuIGo7IFwKQEAgLTM4Nyw3ICszODUsNyBAQAogCiAjZGVmaW5lIERBVEFfU1RBQ0tfTE9PS1VQX0FUKHN0YXRlLCB0eXBlLCBwdHIsIHBvcykgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIFNGWSh0eXBlKSwgcG9zKSk7IFwKKyAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgUHlfU1RSSU5HSUZZKHR5cGUpLCBwb3MpKTsgXAogICAgIHB0ciA9ICh0eXBlKikoc3RhdGUtPmRhdGFfc3RhY2srcG9zKTsgXAogfSB3aGlsZSAoMCkKIApAQCAtMTI1Niw3ICsxMjU0LDMyIEBACiAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgcHJlZml4X3NraXApKTsKICAgICBUUkFDRSgoImNoYXJzZXQgPSAlcFxuIiwgY2hhcnNldCkpOwogCi0jaWYgZGVmaW5lZChVU0VfRkFTVF9TRUFSQ0gpCisgICAgaWYgKHByZWZpeF9sZW4gPT0gMSkgeworICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgU1JFX0NIQVIgYyA9IChTUkVfQ0hBUikgcHJlZml4WzBdOworI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKKyAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwcmVmaXhbMF0pCisgICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLworI2VuZGlmCisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CisgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKKyAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBwdHIgKyBwcmVmaXhfc2tpcDsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyKnByZWZpeF9za2lwLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgKytwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgaWYgKHByZWZpeF9sZW4gPiAxKSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBrbm93biBwcmVmaXguICB1c2UgdGhlIG92ZXJsYXAKICAgICAgICAgICAgdGFibGUgdG8gc2tpcCBmb3J3YXJkIGFzIGZhc3QgYXMgd2UgcG9zc2libHkgY2FuICovCkBAIC0xMzA1LDMyICsxMzI4LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jZW5kaWYKIAotICAgIGlmIChwYXR0ZXJuWzBdID09IFNSRV9PUF9MSVRFUkFMKSB7Ci0gICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3Rlci4gIHRoaXMgaXMgdXNlZAotICAgICAgICAgICBmb3Igc2hvcnQgcHJlZml4ZXMsIGFuZCBpZiBmYXN0IHNlYXJjaCBpcyBkaXNhYmxlZCAqLwotICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwYXR0ZXJuWzFdOwotI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKLSAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwYXR0ZXJuWzFdKQotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGxpdGVyYWwgY2FuJ3QgbWF0Y2g6IGRvZXNuJ3QgZml0IGluIGNoYXIgd2lkdGggKi8KLSNlbmRpZgotICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKnB0ciAhPSBjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrcHRyID49IGVuZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxTRUFSQ0ggTElURVJBTFxuIiwgcGF0dGVybiwgcHRyKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+c3RhcnQgPSBwdHI7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0gKytwdHI7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBTUkVfSU5GT19MSVRFUkFMKQotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiB3ZSBnb3QgYWxsIG9mIGl0ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBTUkUobWF0Y2gpKHN0YXRlLCBwYXR0ZXJuICsgMiwgMCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNoYXJzZXQpIHsKKyAgICBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KICAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBkMmNhYWNkLi4wYjZkNDYxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICBSZXR1cm5zIG5vbi16ZXJvIG9uIHN1Y2Nlc3MgKHBhcmFsbGVscyBQeUFyZ19QYXJzZVR1cGxlKS4KICovCiBzdGF0aWMgaW50Ci1wYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQorcGFyc2VfdGltZV90X2FyZ3MoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdGltZV90ICpwd2hlbikKIHsKICAgICBQeU9iamVjdCAqb3QgPSBOVUxMOwogICAgIHRpbWVfdCB3aGVudDsKQEAgLTczMiwxMCArNzMyLDEwIEBACiB7CiAgICAgLyogSW5zcGlyZWQgYnkgT3BlbiBHcm91cCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGF0CiAgICAgICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvYXNjdGltZS5odG1sICovCi0gICAgc3RhdGljIGNoYXIgd2RheV9uYW1lWzddWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIHdkYXlfbmFtZVs3XVs0XSA9IHsKICAgICAgICAgIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKICAgICB9OwotICAgIHN0YXRpYyBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb25fbmFtZVsxMl1bNF0gPSB7CiAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCiAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKICAgICB9OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy91bmljb2RlZGF0YS5jIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCmluZGV4IGZlNGU5MDguLjdkNTE4ZmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdW5pY29kZWRhdGEuYworKysgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKQEAgLTg4NCw3ICs4ODQsNyBAQAogICAgIHJldHVybiBoOwogfQogCi1zdGF0aWMgY2hhciAqaGFuZ3VsX3N5bGxhYmxlc1tdWzNdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CiAgICAgeyAiRyIsICAiQSIsICAgIiIgICB9LAogICAgIHsgIkdHIiwgIkFFIiwgICJHIiAgfSwKICAgICB7ICJOIiwgICJZQSIsICAiR0ciIH0sCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogICAgIGludCBpLCBsZW4xOwogICAgICpsZW4gPSAtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBjaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOworICAgICAgICBjb25zdCBjaGFyICpzID0gaGFuZ3VsX3N5bGxhYmxlc1tpXVtjb2x1bW5dOwogICAgICAgICBsZW4xID0gUHlfU0FGRV9ET1dOQ0FTVChzdHJsZW4ocyksIHNpemVfdCwgaW50KTsKICAgICAgICAgaWYgKGxlbjEgPD0gKmxlbikKICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy94eGxpbWl0ZWQuYyBiL01vZHVsZXMveHhsaW1pdGVkLmMKaW5kZXggNDBjMTc2MC4uYzFhOWJlOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eGxpbWl0ZWQuYworKysgYi9Nb2R1bGVzL3h4bGltaXRlZC5jCkBAIC04OSw3ICs4OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bW9kdWxlLmMgYi9Nb2R1bGVzL3h4bW9kdWxlLmMKaW5kZXggODUyMzBkOS4uMDc2NDQwNyAxMDA2NDQKLS0tIGEvTW9kdWxlcy94eG1vZHVsZS5jCisrKyBiL01vZHVsZXMveHhtb2R1bGUuYwpAQCAtNzYsNyArNzYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1YeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQorWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKIHsKICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKICAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy96bGlibW9kdWxlLmMgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwppbmRleCAxNmNjMTc4Li4zYTQ1OWE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3psaWJtb2R1bGUuYworKysgYi9Nb2R1bGVzL3psaWJtb2R1bGUuYwpAQCAtNTcsNyArNTcsNyBAQAogfSBjb21wb2JqZWN0OwogCiBzdGF0aWMgdm9pZAotemxpYl9lcnJvcih6X3N0cmVhbSB6c3QsIGludCBlcnIsIGNoYXIgKm1zZykKK3psaWJfZXJyb3Ioel9zdHJlYW0genN0LCBpbnQgZXJyLCBjb25zdCBjaGFyICptc2cpCiB7CiAgICAgY29uc3QgY2hhciAqem1zZyA9IFpfTlVMTDsKICAgICAvKiBJbiBjYXNlIG9mIGEgdmVyc2lvbiBtaXNtYXRjaCwgenN0Lm1zZyB3b24ndCBiZSBpbml0aWFsaXplZC4KQEAgLTE0MSwxOCArMTQxLDE4IEBACiAvKltjbGluaWMgaW5wdXRdCiB6bGliLmNvbXByZXNzCiAKLSAgICBieXRlczogUHlfYnVmZmVyCisgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgICAgIEJpbmFyeSBkYXRhIHRvIGJlIGNvbXByZXNzZWQuCi0gICAgbGV2ZWw6IGludChjX2RlZmF1bHQ9IlpfREVGQVVMVF9DT01QUkVTU0lPTiIpID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OCi0gICAgICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuCiAgICAgLworICAgIGxldmVsOiBpbnQoY19kZWZhdWx0PSJaX0RFRkFVTFRfQ09NUFJFU1NJT04iKSA9IFpfREVGQVVMVF9DT01QUkVTU0lPTgorICAgICAgICBDb21wcmVzc2lvbiBsZXZlbCwgaW4gMC05IG9yIC0xLgogCiBSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5TW9kdWxlRGVmICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZDdkZDQ1ODg3ODhlZmQzIGlucHV0PWJlM2FiZTk5MzRiZGE0YjNdKi8KK3psaWJfY29tcHJlc3NfaW1wbChQeU1vZHVsZURlZiAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCBsZXZlbCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xYjk3NTg5MTMyYjIwM2I0IGlucHV0PTYzOGQ1NGI2MzE1ZGJlZDNdKi8KIHsKICAgICBQeU9iamVjdCAqUmV0dXJuVmFsID0gTlVMTDsKICAgICBCeXRlICppbnB1dCwgKm91dHB1dCA9IE5VTEw7CkBAIC0xNjAsMTMgKzE2MCwxMyBAQAogICAgIGludCBlcnI7CiAgICAgel9zdHJlYW0genN0OwogCi0gICAgaWYgKChzaXplX3QpYnl0ZXMtPmxlbiA+IFVJTlRfTUFYKSB7CisgICAgaWYgKChzaXplX3QpZGF0YS0+bGVuID4gVUlOVF9NQVgpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSBkb2VzIG5vdCBmaXQgaW4gYW4gdW5zaWduZWQgaW50Iik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQotICAgIGlucHV0ID0gYnl0ZXMtPmJ1ZjsKLSAgICBsZW5ndGggPSAodW5zaWduZWQgaW50KWJ5dGVzLT5sZW47CisgICAgaW5wdXQgPSBkYXRhLT5idWY7CisgICAgbGVuZ3RoID0gKHVuc2lnbmVkIGludClkYXRhLT5sZW47CiAKICAgICB6c3QuYXZhaWxfb3V0ID0gbGVuZ3RoICsgbGVuZ3RoLzEwMDAgKyAxMiArIDE7CiAKQEAgLTEzNTIsNyArMTM1Miw3IEBACiAiemxpYiBsaWJyYXJ5LCB3aGljaCBpcyBiYXNlZCBvbiBHTlUgemlwLlxuIgogIlxuIgogImFkbGVyMzIoc3RyaW5nWywgc3RhcnRdKSAtLSBDb21wdXRlIGFuIEFkbGVyLTMyIGNoZWNrc3VtLlxuIgotImNvbXByZXNzKHN0cmluZ1ssIGxldmVsXSkgLS0gQ29tcHJlc3Mgc3RyaW5nLCB3aXRoIGNvbXByZXNzaW9uIGxldmVsIGluIDAtOS5cbiIKKyJjb21wcmVzcyhkYXRhWywgbGV2ZWxdKSAtLSBDb21wcmVzcyBkYXRhLCB3aXRoIGNvbXByZXNzaW9uIGxldmVsIDAtOSBvciAtMS5cbiIKICJjb21wcmVzc29iaihbbGV2ZWxbLCAuLi5dXSkgLS0gUmV0dXJuIGEgY29tcHJlc3NvciBvYmplY3QuXG4iCiAiY3JjMzIoc3RyaW5nWywgc3RhcnRdKSAtLSBDb21wdXRlIGEgQ1JDLTMyIGNoZWNrc3VtLlxuIgogImRlY29tcHJlc3Moc3RyaW5nLFt3Yml0c10sW2J1ZnNpemVdKSAtLSBEZWNvbXByZXNzZXMgYSBjb21wcmVzc2VkIHN0cmluZy5cbiIKZGlmZiAtLWdpdCBhL09iamVjdHMvYWJzdHJhY3QuYyBiL09iamVjdHMvYWJzdHJhY3QuYwppbmRleCA1ODU5OTJkLi44ODVkOGRlIDEwMDY0NAotLS0gYS9PYmplY3RzL2Fic3RyYWN0LmMKKysrIGIvT2JqZWN0cy9hYnN0cmFjdC5jCkBAIC0xNDEsOCArMTQxLDExIEBACiAgICAgICAgIHJldHVybiBudWxsX2Vycm9yKCk7CiAKICAgICBtID0gby0+b2JfdHlwZS0+dHBfYXNfbWFwcGluZzsKLSAgICBpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpCi0gICAgICAgIHJldHVybiBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKKyAgICBpZiAobSAmJiBtLT5tcF9zdWJzY3JpcHQpIHsKKyAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBtLT5tcF9zdWJzY3JpcHQobywga2V5KTsKKyAgICAgICAgYXNzZXJ0KChpdGVtICE9IE5VTEwpIF4gKFB5RXJyX09jY3VycmVkKCkgIT0gTlVMTCkpOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CiAKICAgICBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UpIHsKICAgICAgICAgaWYgKFB5SW5kZXhfQ2hlY2soa2V5KSkgewpAQCAtMTM0OCwyMSArMTM1MSwzOSBAQAogCiAgICAgaWYgKG8gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKKyAgICBpZiAoUHlGbG9hdF9DaGVja0V4YWN0KG8pKSB7CisgICAgICAgIFB5X0lOQ1JFRihvKTsKKyAgICAgICAgcmV0dXJuIG87CisgICAgfQogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19udW1iZXI7CiAgICAgaWYgKG0gJiYgbS0+bmJfZmxvYXQpIHsgLyogVGhpcyBzaG91bGQgaW5jbHVkZSBzdWJjbGFzc2VzIG9mIGZsb2F0ICovCiAgICAgICAgIFB5T2JqZWN0ICpyZXMgPSBtLT5uYl9mbG9hdChvKTsKLSAgICAgICAgaWYgKHJlcyAmJiAhUHlGbG9hdF9DaGVjayhyZXMpKSB7CisgICAgICAgIGRvdWJsZSB2YWw7CisgICAgICAgIGlmICghcmVzIHx8IFB5RmxvYXRfQ2hlY2tFeGFjdChyZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGlmICghUHlGbG9hdF9DaGVjayhyZXMpKSB7CiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAiX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjIwMHMpIiwKLSAgICAgICAgICAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJS41MHMuX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjUwcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG8tPm9iX3R5cGUtPnRwX25hbWUsIHJlcy0+b2JfdHlwZS0+dHBfbmFtZSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7CisgICAgICAgIC8qIElzc3VlICMyNjk4Mzogd2FybiBpZiAncmVzJyBub3Qgb2YgZXhhY3QgdHlwZSBmbG9hdC4gKi8KKyAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCAxLAorICAgICAgICAgICAgICAgICIlLjUwcy5fX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuNTBzKS4gICIKKyAgICAgICAgICAgICAgICAiVGhlIGFiaWxpdHkgdG8gcmV0dXJuIGFuIGluc3RhbmNlIG9mIGEgc3RyaWN0IHN1YmNsYXNzIG9mIGZsb2F0ICIKKyAgICAgICAgICAgICAgICAiaXMgZGVwcmVjYXRlZCwgYW5kIG1heSBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24gb2YgUHl0aG9uLiIsCisgICAgICAgICAgICAgICAgby0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKSkgeworICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB2YWwgPSBQeUZsb2F0X0FTX0RPVUJMRShyZXMpOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWwpOwogICAgIH0KICAgICBpZiAoUHlGbG9hdF9DaGVjayhvKSkgeyAvKiBBIGZsb2F0IHN1YmNsYXNzIHdpdGggbmJfZmxvYXQgPT0gTlVMTCAqLwotICAgICAgICBQeUZsb2F0T2JqZWN0ICpwbyA9IChQeUZsb2F0T2JqZWN0ICopbzsKLSAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShwby0+b2JfZnZhbCk7CisgICAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoUHlGbG9hdF9BU19ET1VCTEUobykpOwogICAgIH0KICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tU3RyaW5nKG8pOwogfQpAQCAtMTU0NCw4ICsxNTY1LDEwIEBACiAgICAgICAgIGlmIChpIDwgMCkgewogICAgICAgICAgICAgaWYgKG0tPnNxX2xlbmd0aCkgewogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbCA9ICgqbS0+c3FfbGVuZ3RoKShzKTsKLSAgICAgICAgICAgICAgICBpZiAobCA8IDApCisgICAgICAgICAgICAgICAgaWYgKGwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeUVycl9PY2N1cnJlZCgpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGkgKz0gbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYyBiL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKaW5kZXggMzg4ZTk5MC4uNTBkYTYzNyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYworKysgYi9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCkBAIC0yNzksMzEgKzI3OSw2IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXJlc3VsdDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVhcnJheV9mb3JtYXQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQotewotICAgIFB5T2JqZWN0ICpieXRlc19pbiwgKmJ5dGVzX291dCwgKnJlczsKLSAgICBjaGFyICpieXRlc3RyaW5nOwotCi0gICAgaWYgKHNlbGYgPT0gTlVMTCB8fCAhUHlCeXRlQXJyYXlfQ2hlY2soc2VsZikgfHwgYXJncyA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgYnl0ZXN0cmluZyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBieXRlc19pbiA9IFB5Qnl0ZXNfRnJvbVN0cmluZyhieXRlc3RyaW5nKTsKLSAgICBpZiAoYnl0ZXNfaW4gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYnl0ZXNfb3V0ID0gX1B5Qnl0ZXNfRm9ybWF0KGJ5dGVzX2luLCBhcmdzKTsKLSAgICBQeV9ERUNSRUYoYnl0ZXNfaW4pOwotICAgIGlmIChieXRlc19vdXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzID0gUHlCeXRlQXJyYXlfRnJvbU9iamVjdChieXRlc19vdXQpOwotICAgIFB5X0RFQ1JFRihieXRlc19vdXQpOwotICAgIGlmIChyZXMgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQogLyogRnVuY3Rpb25zIHN0dWZmZWQgaW50byB0aGUgdHlwZSBvYmplY3QgKi8KIAogc3RhdGljIFB5X3NzaXplX3QKQEAgLTExMjIsMTYxICsxMDk3LDI3IEBACiAjaW5jbHVkZSAic3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oIgogCiAKLS8qIFRoZSBmb2xsb3dpbmcgUHlfTE9DQUxfSU5MSU5FIGFuZCBQeV9MT0NBTCBmdW5jdGlvbnMKLXdlcmUgY29waWVkIGZyb20gdGhlIG9sZCBjaGFyKiBzdHlsZSBzdHJpbmcgb2JqZWN0LiAqLwotCi0vKiBoZWxwZXIgbWFjcm8gdG8gZml4dXAgc3RhcnQvZW5kIHNsaWNlIHZhbHVlcyAqLwotI2RlZmluZSBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pICAgICAgICAgXAotICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKGVuZCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZW5kIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzdGFydCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoc3RhcnQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1ieXRlYXJyYXlfZmluZF9pbnRlcm5hbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCi17Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfYnVmZmVyIHN1YmJ1ZjsKLSAgICBjb25zdCBjaGFyICpzdWI7Ci0gICAgUHlfc3NpemVfdCBsZW4sIHN1Yl9sZW47Ci0gICAgUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlfc3NpemVfdCByZXM7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX2J5dGUoImZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgJnN1Ym9iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiAtMjsKLQotICAgIGlmIChzdWJvYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJvYmosICZzdWJidWYsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMjsKLQotICAgICAgICBzdWIgPSBzdWJidWYuYnVmOwotICAgICAgICBzdWJfbGVuID0gc3ViYnVmLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0gICAgbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwotICAgIGlmIChlbmQgLSBzdGFydCA8IHN1Yl9sZW4pCi0gICAgICAgIHJlcyA9IC0xOwotICAgIGVsc2UgaWYgKHN1Yl9sZW4gPT0gMQotI2lmbmRlZiBIQVZFX01FTVJDSFIKLSAgICAgICAgICAgICYmIGRpciA+IDAKLSNlbmRpZgotICAgICkgewotICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZSA9ICpzdWI7Ci0gICAgICAgIGludCBtb2RlID0gKGRpciA+IDApID8gRkFTVF9TRUFSQ0ggOiBGQVNUX1JTRUFSQ0g7Ci0gICAgICAgIHJlcyA9IHN0cmluZ2xpYl9mYXN0c2VhcmNoX21lbWNocl8xY2hhcigKLSAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKLSAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlLCBtb2RlKTsKLSAgICAgICAgaWYgKHJlcyA+PSAwKQotICAgICAgICAgICAgcmVzICs9IHN0YXJ0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRpciA+IDApCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfc2xpY2UoCi0gICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBsZW4sCi0gICAgICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKLSAgICB9Ci0KLSAgICBpZiAoc3Vib2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJidWYpOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotUHlEb2NfU1RSVkFSKGZpbmRfX2RvY19fLAotIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9maW5kKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVhcnJheV9maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19maW5kKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi1QeURvY19TVFJWQVIoY291bnRfX2RvY19fLAotIkIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzZWN0aW9uIHN1YiBpblxuXAotYnl0ZXMgQltzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkXG5cCi1hcyBpbiBzbGljZSBub3RhdGlvbi4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9jb3VudChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnN1Yl9vYmo7Ci0gICAgY29uc3QgY2hhciAqc3RyID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotCi0gICAgUHlfYnVmZmVyIHZzdWI7Ci0gICAgUHlPYmplY3QgKmNvdW50X29iajsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiY291bnQiLCBhcmdzLCAmc3ViX29iaiwgJmJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKHN1Yl9vYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJfb2JqLCAmdnN1YiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgc3ViID0gdnN1Yi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSB2c3ViLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSk7Ci0KLSAgICBjb3VudF9vYmogPSBQeUxvbmdfRnJvbVNzaXplX3QoCi0gICAgICAgIHN0cmluZ2xpYl9jb3VudChzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHN1Yiwgc3ViX2xlbiwgUFlfU1NJWkVfVF9NQVgpCi0gICAgICAgICk7Ci0KLSAgICBpZiAoc3ViX29iaikKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdnN1Yik7Ci0KLSAgICByZXR1cm4gY291bnRfb2JqOworICAgIHJldHVybiBfUHlfYnl0ZXNfY291bnQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5jbGVhcgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBieXRlYXJyYXkuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfY2xlYXJfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04NWMyZmU2YWVkZTA5NTZjIGlucHV0PWU1MjRmZDMzMGFiY2RjMThdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04NWMyZmU2YWVkZTA5NTZjIGlucHV0PWVkNmVkYWU5ZGU0NDdhYzRdKi8KIHsKICAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKChQeU9iamVjdCAqKXNlbGYsIDApIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMjg2LDIzNiArMTEyNyw1NyBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmNvcHkKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCi0KIFJldHVybiBhIGNvcHkgb2YgQi4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9jb3B5X2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjhjZmJjZmVkNDg0YzEzMiBpbnB1dD02ZDVkMjk3NWFhMGYzM2YzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjhjZmJjZmVkNDg0YzEzMiBpbnB1dD02NTk3YjBjMDFiY2NhYTllXSovCiB7CiAgICAgcmV0dXJuIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKFB5Qnl0ZUFycmF5X0FTX1NUUklORygoUHlPYmplY3QgKilzZWxmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZikpOwogfQogCi1QeURvY19TVFJWQVIoaW5kZXhfX2RvY19fLAotIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5maW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfaW5kZXgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3Vic2VjdGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2luZGV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KLVB5RG9jX1NUUlZBUihyZmluZF9fZG9jX18sCi0iQi5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXG5cCi1zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcblwKLWFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKLVxuXAotUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmZpbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JmaW5kKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KLVB5RG9jX1NUUlZBUihyaW5kZXhfX2RvY19fLAotIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1MaWtlIEIucmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yaW5kZXgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3Vic2VjdGlvbiBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JpbmRleChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAotCiBzdGF0aWMgaW50CiBieXRlYXJyYXlfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgUHlfc3NpemVfdCBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9idWZmZXIgdmFyZzsKLSAgICAgICAgUHlfc3NpemVfdCBwb3M7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCAmdmFyZywgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBwb3MgPSBzdHJpbmdsaWJfZmluZChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5X1NJWkUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmcuYnVmLCB2YXJnLmxlbiwgMCk7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhcmcpOwotICAgICAgICByZXR1cm4gcG9zID49IDA7Ci0gICAgfQotICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID49IDI1NikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ5dGUgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVtY2hyKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgKGludCkgaXZhbCwgUHlfU0laRShzZWxmKSkgIT0gTlVMTDsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2NvbnRhaW5zKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZyk7CiB9CiAKLQotLyogTWF0Y2hlcyB0aGUgZW5kIChkaXJlY3Rpb24gPj0gMCkgb3Igc3RhcnQgKGRpcmVjdGlvbiA8IDApIG9mIHNlbGYKLSAqIGFnYWluc3Qgc3Vic3RyLCB1c2luZyB0aGUgc3RhcnQgYW5kIGVuZCBhcmd1bWVudHMuIFJldHVybnMKLSAqIC0xIG9uIGVycm9yLCAwIGlmIG5vdCBmb3VuZCBhbmQgMSBpZiBmb3VuZC4KLSAqLwotUHlfTE9DQUwoaW50KQotX2J5dGVhcnJheV90YWlsbWF0Y2goUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzdWJzdHIsIFB5X3NzaXplX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLCBpbnQgZGlyZWN0aW9uKQotewotICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0gICAgY29uc3QgY2hhciogc3RyOwotICAgIFB5X2J1ZmZlciB2c3Vic3RyOwotICAgIGludCBydiA9IDA7Ci0KLSAgICBzdHIgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1YnN0ciwgJnZzdWJzdHIsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKLQotICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7Ci0gICAgICAgIC8qIHN0YXJ0c3dpdGggKi8KLSAgICAgICAgaWYgKHN0YXJ0K3ZzdWJzdHIubGVuID4gbGVuKSB7Ci0gICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiBlbmRzd2l0aCAqLwotICAgICAgICBpZiAoZW5kLXN0YXJ0IDwgdnN1YnN0ci5sZW4gfHwgc3RhcnQgPiBsZW4pIHsKLSAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlbmQtdnN1YnN0ci5sZW4gPiBzdGFydCkKLSAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gdnN1YnN0ci5sZW47Ci0gICAgfQotICAgIGlmIChlbmQtc3RhcnQgPj0gdnN1YnN0ci5sZW4pCi0gICAgICAgIHJ2ID0gISBtZW1jbXAoc3RyK3N0YXJ0LCB2c3Vic3RyLmJ1ZiwgdnN1YnN0ci5sZW4pOwotCi1kb25lOgotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZzdWJzdHIpOwotICAgIHJldHVybiBydjsKLX0KLQotCi1QeURvY19TVFJWQVIoc3RhcnRzd2l0aF9fZG9jX18sCi0iQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9zdGFydHN3aXRoKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIFB5T2JqZWN0ICpzdWJvYmo7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoInN0YXJ0c3dpdGgiLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfYnl0ZWFycmF5X3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgfQotICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfc3RhcnRzd2l0aChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAotUHlEb2NfU1RSVkFSKGVuZHN3aXRoX19kb2NfXywKLSJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKLVdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1zdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfZW5kc3dpdGgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygiZW5kc3dpdGgiLCBhcmdzLCAmc3Vib2JqLCAmc3RhcnQsICZlbmQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBfYnl0ZWFycmF5X3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsICsxKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gICAgfQotICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2YgYnl0ZXMsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2VuZHN3aXRoKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCiAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS50cmFuc2xhdGUKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgdGFibGU6IG9iamVjdAogICAgICAgICBUcmFuc2xhdGlvbiB0YWJsZSwgd2hpY2ggbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBvZiBsZW5ndGggMjU2LgogICAgIFsKQEAgLTE1MzIsNyArMTE5NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3RyYW5zbGF0ZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwX3JpZ2h0XzEsIFB5T2JqZWN0ICpkZWxldGVjaGFycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYmViYzg2YTlhMWZmMDgzIGlucHV0PWI3NDlhZDg1ZjQ4NjA4MjRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYmViYzg2YTlhMWZmMDgzIGlucHV0PTg0NmEwMTY3MWJjY2MxYzVdKi8KIHsKICAgICBjaGFyICppbnB1dCwgKm91dHB1dDsKICAgICBjb25zdCBjaGFyICp0YWJsZV9jaGFyczsKQEAgLTE1NzUsNyArMTIzNyw3IEBACiAgICAgcmVzdWx0ID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBpbmxlbik7CiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICBnb3RvIGRvbmU7Ci0gICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlCeXRlQXJyYXlfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKICAgICBpbnB1dCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhpbnB1dF9vYmopOwogCiAgICAgaWYgKHZkZWwubGVuID09IDAgJiYgdGFibGVfY2hhcnMgIT0gTlVMTCkgewpAQCAtMTY0NSw0OTMgKzEzMDcsNiBAQAogfQogCiAKLS8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KLQotI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQotCi0KLS8qIEJ5dGVzIG9wcyBtdXN0IHJldHVybiBhIHN0cmluZywgY3JlYXRlIGEgY29weSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJldHVybl9zZWxmKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotewotICAgIC8qIGFsd2F5cyByZXR1cm4gYSBuZXcgYnl0ZWFycmF5ICovCi0gICAgcmV0dXJuIChQeUJ5dGVBcnJheU9iamVjdCAqKVB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZikpOwotfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWNvdW50Y2hhcihjb25zdCBjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIFB5X3NzaXplX3QgY291bnQ9MDsKLSAgICBjb25zdCBjaGFyICpzdGFydD10YXJnZXQ7Ci0gICAgY29uc3QgY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOwotCi0gICAgd2hpbGUgKCAoc3RhcnQ9ZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgYykpICE9IE5VTEwgKSB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGlmIChjb3VudCA+PSBtYXhjb3VudCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzdGFydCArPSAxOwotICAgIH0KLSAgICByZXR1cm4gY291bnQ7Ci19Ci0KLQotLyogQWxnb3JpdGhtcyBmb3IgZGlmZmVyZW50IGNhc2VzIG9mIHN0cmluZyByZXBsYWNlbWVudCAqLwotCi0vKiBsZW4oc2VsZik+PTEsIGZyb209IiIsIGxlbih0byk+PTEsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9pbnRlcmxlYXZlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBpOwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXI7Ci0gICAgICAgY291bnQgPSBtaW4obWF4Y291bnQsIHNlbGZfbGVuICsgMSkgKi8KLSAgICBpZiAobWF4Y291bnQgPD0gc2VsZl9sZW4pCi0gICAgICAgIGNvdW50ID0gbWF4Y291bnQ7Ci0gICAgZWxzZQotICAgICAgICAvKiBDYW4ndCBvdmVyZmxvdzogc2VsZl9sZW4gKyAxIDw9IG1heGNvdW50IDw9IFBZX1NTSVpFX1RfTUFYLiAqLwotICAgICAgICBjb3VudCA9IHNlbGZfbGVuICsgMTsKLQotICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2Ugc3RyaW5nIGlzIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsKLQotICAgIGlmICghIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwotCi0gICAgLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBkZWxldGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLQotICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSBjb3VudDsgIC8qIGZyb21fbGVuID09IDEgKi8KLSAgICBhc3NlcnQocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgfQotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgdG89IiIsIG1heGNvdW50Pj0xICovCi0KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gLSAoY291bnQgKiBmcm9tX2xlbik7Ci0gICAgYXNzZXJ0IChyZXN1bHRfbGVuPj0wKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OwotCi0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCi0gICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPT0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgY2hhciB0b19jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKLQotICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IGJ5dGVzICovCi0gICAgcmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQotICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0gICAgc3RhcnQgPSAgcmVzdWx0X3MgKyAobmV4dC1zZWxmX3MpOwotICAgICpzdGFydCA9IHRvX2M7Ci0gICAgc3RhcnQrKzsKLSAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCi0gICAgd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICpuZXh0ID0gdG9fYzsKLSAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKLSAgICBjaGFyICpzZWxmX3M7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBUaGUgcmVzdWx0IGJ5dGVzIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotCi0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgewotICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgYnl0ZXMgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKLSAgICBQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCi0gICAgd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldD09LTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwotICAgICAgICBzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGFuZCBuZXcsIGhlbmNlIHRoZSAiLTEiICovCi0gICAgLyogICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tMSkgICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIDEgPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2UgYnl0ZXMgaXMgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbiAtIDEpOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX3N1YnN0cmluZyhQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLQotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgIC8qICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbikgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuIC0gZnJvbV9sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgInJlcGxhY2UgYnl0ZXMgaXMgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbiAtIGZyb21fbGVuKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdGFydCtvZmZzZXQ7Ci0gICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ICs9IGZyb21fbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBieXRlcyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGlmIChtYXhjb3VudCA8IDApIHsKLSAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKLSAgICB9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAobWF4Y291bnQgPT0gMCB8fAotICAgICAgICAoZnJvbV9sZW4gPT0gMCAmJiB0b19sZW4gPT0gMCkpIHsKLSAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KLQotICAgIGlmIChmcm9tX2xlbiA9PSAwKSB7Ci0gICAgICAgIC8qIGluc2VydCB0aGUgJ3RvJyBieXRlcyBldmVyeXdoZXJlLiAgICovCi0gICAgICAgIC8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLwotICAgICAgICAvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKiBFeGNlcHQgZm9yICIiLnJlcGxhY2UoIiIsICJBIikgPT0gIkEiIHRoZXJlIGlzIG5vIHdheSBiZXlvbmQgdGhpcyAqLwotICAgIC8qIHBvaW50IGZvciBhbiBlbXB0eSBzZWxmIGJ5dGVzIHRvIGdlbmVyYXRlIGEgbm9uLWVtcHR5IGJ5dGVzICovCi0gICAgLyogU3BlY2lhbCBjYXNlIHNvIHRoZSByZW1haW5pbmcgY29kZSBhbHdheXMgZ2V0cyBhIG5vbi1lbXB0eSBieXRlcyAqLwotICAgIGlmIChQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAodG9fbGVuID09IDApIHsKLSAgICAgICAgLyogZGVsZXRlIGFsbCBvY2N1cnJlbmNlcyBvZiAnZnJvbScgYnl0ZXMgKi8KLSAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKAotICAgICAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgbWF4Y291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIGJ5dGVzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoICovCi0KLSAgICBpZiAoZnJvbV9sZW4gPT0gdG9fbGVuKSB7Ci0gICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAotICAgICAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgICAgICBmcm9tX3NbMF0sCi0gICAgICAgICAgICAgICAgICAgIHRvX3NbMF0sCi0gICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCi0gICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBmcm9tX3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogbGVuKCdmcm9tJyk+PTIsIGxlbigndG8nKT49MSAqLwotICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfQotfQotCi0KIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5yZXBsYWNlCiAKQEAgLTIxNTMsOSArMTMyOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFB5X2J1ZmZlciAqbmV3LCBQeV9zc2l6ZV90IGNvdW50KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQzOTg4NGM0ZGM1OTQxMmEgaW5wdXQ9YWEzNzlkOTg4NjM3YzdmYl0qLwogewotICAgIHJldHVybiAoUHlPYmplY3QgKilyZXBsYWNlKChQeUJ5dGVBcnJheU9iamVjdCAqKSBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZC0+YnVmLCBvbGQtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXctPmJ1ZiwgbmV3LT5sZW4sIGNvdW50KTsKKyAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilvbGQtPmJ1Ziwgb2xkLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopbmV3LT5idWYsIG5ldy0+bGVuLCBjb3VudCk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KQEAgLTIyMDMsNyArMTM3OCw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucGFydGl0aW9uCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIHNlcDogb2JqZWN0CiAgICAgLwogCkBAIC0yMjE5LDcgKzEzOTMsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3BhcnRpdGlvbihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NWQyNTI1ZGRkMzVmOTU3IGlucHV0PTdkN2ZlMzdiMTY5NmQ1MDZdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NWQyNTI1ZGRkMzVmOTU3IGlucHV0PTg2Zjg5MjIzODkyYjcwYjVdKi8KIHsKICAgICBQeU9iamVjdCAqYnl0ZXNlcCwgKnJlc3VsdDsKIApAQCAtMjI0MSw3ICsxNDE1LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5ycGFydGl0aW9uCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIHNlcDogb2JqZWN0CiAgICAgLwogCkBAIC0yMjU3LDcgKzE0MzAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JwYXJ0aXRpb24oUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXApCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDQwZGUzYzk0MjYxMTVlOCBpbnB1dD05YjhjZDU0MGMxYjc1ODUzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDQwZGUzYzk0MjYxMTVlOCBpbnB1dD01ZjQwOTRmMmRlODdjOGYzXSovCiB7CiAgICAgUHlPYmplY3QgKmJ5dGVzZXAsICpyZXN1bHQ7CiAKQEAgLTIzMTUsMTQgKzE0ODgsMTIgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5yZXZlcnNlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgdmFsdWVzIGluIEIgaW4gcGxhY2UuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmV2ZXJzZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTlmNzYxNmYyOWFiMzA5ZDMgaW5wdXQ9NzkzM2E0OTliODU5N2JkMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTlmNzYxNmYyOWFiMzA5ZDMgaW5wdXQ9NTQzMzU2MzE5ZmM3ODU1N10qLwogewogICAgIGNoYXIgc3dhcCwgKmhlYWQsICp0YWlsOwogICAgIFB5X3NzaXplX3QgaSwgaiwgbiA9IFB5X1NJWkUoc2VsZik7CkBAIC0yMzUxLDcgKzE1MjIsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5Lmluc2VydAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBpbmRleDogUHlfc3NpemVfdAogICAgICAgICBUaGUgaW5kZXggd2hlcmUgdGhlIHZhbHVlIGlzIHRvIGJlIGluc2VydGVkLgogICAgIGl0ZW06IGJ5dGVzdmFsdWUKQEAgLTIzNjMsNyArMTUzMyw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfaW5zZXJ0X2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgsIGludCBpdGVtKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc2Yzc3NWE3MGU3YjA3YjcgaW5wdXQ9ODMzNzY2ODM2YmEzMGUxZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc2Yzc3NWE3MGU3YjA3YjcgaW5wdXQ9YjJiNWQwN2U5ZGU2YzA3MF0qLwogewogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7CiAgICAgY2hhciAqYnVmOwpAQCAtMjM5Myw3ICsxNTYzLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5hcHBlbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgaXRlbTogYnl0ZXN2YWx1ZQogICAgICAgICBUaGUgaXRlbSB0byBiZSBhcHBlbmRlZC4KICAgICAvCkBAIC0yNDAzLDcgKzE1NzIsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2FwcGVuZF9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBpbnQgaXRlbSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hMTU0ZTE5ZWQxODg2Y2I2IGlucHV0PWFlNTZlYTg3MzgwNDA3Y2NdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hMTU0ZTE5ZWQxODg2Y2I2IGlucHV0PTIwZDZiZWMzZDEzNDA1OTNdKi8KIHsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKHNlbGYpOwogCkBAIC0yNDIzLDcgKzE1OTIsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmV4dGVuZAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBpdGVyYWJsZV9vZl9pbnRzOiBvYmplY3QKICAgICAgICAgVGhlIGl0ZXJhYmxlIG9mIGl0ZW1zIHRvIGFwcGVuZC4KICAgICAvCkBAIC0yNDMzLDcgKzE2MDEsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2V4dGVuZChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZXJhYmxlX29mX2ludHMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTgxNTVkYmUyNDkxNzBiMSBpbnB1dD1jZTgzYTVkNzViNzBkODUwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTgxNTVkYmUyNDkxNzBiMSBpbnB1dD1jNjE3YjNhOTMyNDliYTI4XSovCiB7CiAgICAgUHlPYmplY3QgKml0LCAqaXRlbSwgKmJ5dGVhcnJheV9vYmo7CiAgICAgUHlfc3NpemVfdCBidWZfc2l6ZSA9IDAsIGxlbiA9IDA7CkBAIC0yNTA4LDcgKzE2NzYsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnBvcAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBpbmRleDogUHlfc3NpemVfdCA9IC0xCiAgICAgICAgIFRoZSBpbmRleCBmcm9tIHdoZXJlIHRvIHJlbW92ZSB0aGUgaXRlbS4KICAgICAgICAgLTEgKHRoZSBkZWZhdWx0IHZhbHVlKSBtZWFucyByZW1vdmUgdGhlIGxhc3QgaXRlbS4KQEAgLTI1MjEsNyArMTY4OCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcG9wX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5X3NzaXplX3QgaW5kZXgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTBjY2Q0MDFmODAyMWRhOCBpbnB1dD0wNzk3ZTZjMGNhOWQ1YTg1XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTBjY2Q0MDFmODAyMWRhOCBpbnB1dD0zNTkxZGYyZDA2YzBkMjM3XSovCiB7CiAgICAgaW50IHZhbHVlOwogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7CkBAIC0yNTUzLDcgKzE3MjAsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnJlbW92ZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICB2YWx1ZTogYnl0ZXN2YWx1ZQogICAgICAgICBUaGUgdmFsdWUgdG8gcmVtb3ZlLgogICAgIC8KQEAgLTI1NjMsMjAgKzE3MjksMjAgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZW1vdmVfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgaW50IHZhbHVlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ2NTllMzc4NjY3MDljMTMgaW5wdXQ9NDc1NjBiMTFmZDg1NmMyNF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ2NTllMzc4NjY3MDljMTMgaW5wdXQ9MTIxODMxMjQwY2Q1MWRkZl0qLwogewotICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7CisgICAgUHlfc3NpemVfdCB3aGVyZSwgbiA9IFB5X1NJWkUoc2VsZik7CiAgICAgY2hhciAqYnVmID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIGNoYXIgKndoZXJlID0gbWVtY2hyKGJ1ZiwgdmFsdWUsIG4pOwogCi0gICAgaWYgKCF3aGVyZSkgeworICAgIHdoZXJlID0gc3RyaW5nbGliX2ZpbmRfY2hhcihidWYsIG4sIHZhbHVlKTsKKyAgICBpZiAod2hlcmUgPCAwKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidmFsdWUgbm90IGZvdW5kIGluIGJ5dGVhcnJheSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKCFfY2FucmVzaXplKHNlbGYpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIG1lbW1vdmUod2hlcmUsIHdoZXJlICsgMSwgYnVmICsgbiAtIHdoZXJlKTsKKyAgICBtZW1tb3ZlKGJ1ZiArIHdoZXJlLCBidWYgKyB3aGVyZSArIDEsIG4gLSB3aGVyZSk7CiAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSgoUHlPYmplY3QgKilzZWxmLCBuIC0gMSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjU4Niw4ICsxNzUyLDggQEAKIC8qIFhYWCBUaGVzZSB0d28gaGVscGVycyBjb3VsZCBiZSBvcHRpbWl6ZWQgaWYgYXJnc2l6ZSA9PSAxICovCiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1sc3RyaXBfaGVscGVyKGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKLSAgICAgICAgICAgICAgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCitsc3RyaXBfaGVscGVyKGNvbnN0IGNoYXIgKm15cHRyLCBQeV9zc2l6ZV90IG15c2l6ZSwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYXJncHRyLCBQeV9zc2l6ZV90IGFyZ3NpemUpCiB7CiAgICAgUHlfc3NpemVfdCBpID0gMDsKICAgICB3aGlsZSAoaSA8IG15c2l6ZSAmJiBtZW1jaHIoYXJncHRyLCAodW5zaWduZWQgY2hhcikgbXlwdHJbaV0sIGFyZ3NpemUpKQpAQCAtMjU5Niw4ICsxNzYyLDggQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLXJzdHJpcF9oZWxwZXIoY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAotICAgICAgICAgICAgICB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKK3JzdHJpcF9oZWxwZXIoY29uc3QgY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAorICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKIHsKICAgICBQeV9zc2l6ZV90IGkgPSBteXNpemUgLSAxOwogICAgIHdoaWxlIChpID49IDAgJiYgbWVtY2hyKGFyZ3B0ciwgKHVuc2lnbmVkIGNoYXIpIG15cHRyW2ldLCBhcmdzaXplKSkKQEAgLTI3OTgsMjcgKzE5NjQsMTAgQEAKICAgICAgICAgKTsKIH0KIAotc3RhdGljIGludAotaGV4X2RpZ2l0X3RvX2ludChQeV9VQ1M0IGMpCi17Ci0gICAgaWYgKGMgPj0gMTI4KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIGVsc2UgewotICAgICAgICBpZiAoUHlfSVNVUFBFUihjKSkKLSAgICAgICAgICAgIGMgPSBQeV9UT0xPV0VSKGMpOwotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qW2NsaW5pYyBpbnB1dF0KIEBjbGFzc21ldGhvZAogYnl0ZWFycmF5LmZyb21oZXgKIAotICAgIGNsczogc2VsZih0eXBlPSJQeU9iamVjdCoiKQogICAgIHN0cmluZzogdW5pY29kZQogICAgIC8KIApAQCAtMjgyOSw1MSArMTk3OCwxNSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zyb21oZXhfaW1wbChQeU9iamVjdCpjbHMsIFB5T2JqZWN0ICpzdHJpbmcpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGYzZGE2MDEyOWIzNzAwYyBpbnB1dD05MDdiYmQyZDM0ZDkzNjdhXSovCitieXRlYXJyYXlfZnJvbWhleF9pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnN0cmluZykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04ZjBmMGI2ZDMwZmIzYmEwIGlucHV0PWYwMzNhMTZkMWZiMjFmNDhdKi8KIHsKLSAgICBQeU9iamVjdCAqbmV3Ynl0ZXM7Ci0gICAgY2hhciAqYnVmOwotICAgIFB5X3NzaXplX3QgaGV4bGVuLCBieXRlc2xlbiwgaSwgajsKLSAgICBpbnQgdG9wLCBib3Q7Ci0gICAgdm9pZCAqZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQga2luZDsKLQotICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2soc3RyaW5nKSk7Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKLSAgICBoZXhsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJpbmcpOwotCi0gICAgYnl0ZXNsZW4gPSBoZXhsZW4vMjsgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KLSAgICBuZXdieXRlcyA9IFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzbGVuKTsKLSAgICBpZiAoIW5ld2J5dGVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBidWYgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcobmV3Ynl0ZXMpOwotICAgIGZvciAoaSA9IGogPSAwOyBpIDwgaGV4bGVuOyBpICs9IDIpIHsKLSAgICAgICAgLyogc2tpcCBvdmVyIHNwYWNlcyBpbiB0aGUgaW5wdXQgKi8KLSAgICAgICAgd2hpbGUgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID09ICcgJykKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaWYgKGkgPj0gaGV4bGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRvcCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICBib3QgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkrMSkpOwotICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGkpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotICAgICAgICBidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IF9QeUJ5dGVzX0Zyb21IZXgoc3RyaW5nLCB0eXBlID09ICZQeUJ5dGVBcnJheV9UeXBlKTsKKyAgICBpZiAodHlwZSAhPSAmUHlCeXRlQXJyYXlfVHlwZSAmJiByZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBOVUxMKSk7CiAgICAgfQotICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUobmV3Ynl0ZXMsIGopIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICByZXR1cm4gbmV3Ynl0ZXM7Ci0KLSAgZXJyb3I6Ci0gICAgUHlfREVDUkVGKG5ld2J5dGVzKTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBQeURvY19TVFJWQVIoaGV4X19kb2NfXywKQEAgLTI5MjgsMTQgKzIwNDEsMTIgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5fX3JlZHVjZV9fIGFzIGJ5dGVhcnJheV9yZWR1Y2UKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCi0KIFJldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmVkdWNlX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJiZjMwNDA4NjQ2NGNhYiBpbnB1dD1mYmIwN2RlNGQxMDJhMDNhXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTJiZjMwNDA4NjQ2NGNhYiBpbnB1dD00NGI1NzM3YWRhNjJkZDNmXSovCiB7CiAgICAgcmV0dXJuIF9jb21tb25fcmVkdWNlKHNlbGYsIDIpOwogfQpAQCAtMjk0Myw3ICsyMDU0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5fX3JlZHVjZV9leF9fIGFzIGJ5dGVhcnJheV9yZWR1Y2VfZXgKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgcHJvdG86IGludCA9IDAKICAgICAvCiAKQEAgLTI5NTIsNyArMjA2Miw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcmVkdWNlX2V4X2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIGludCBwcm90bykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MmVhYzMzMzc3MTk3NTIwIGlucHV0PTBlMDkxYTQyY2E2ZGJkOTFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MmVhYzMzMzc3MTk3NTIwIGlucHV0PWYxMjliYzFhMWFhMTUxZWVdKi8KIHsKICAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgcHJvdG8pOwogfQpAQCAtMjk2MCwxNCArMjA3MCwxMiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5Ll9fc2l6ZW9mX18gYXMgYnl0ZWFycmF5X3NpemVvZgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnl0ZWFycmF5IG9iamVjdCBpbiBtZW1vcnksIGluIGJ5dGVzLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3NpemVvZl9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTczOGFiZGQxNzk1MWM0MjcgaW5wdXQ9NmIyM2QzMDUzNjJiNDYyYl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTczOGFiZGQxNzk1MWM0MjcgaW5wdXQ9ZTI3MzIwZmQ5OGE0YmM1YV0qLwogewogICAgIFB5X3NzaXplX3QgcmVzOwogCkBAIC0zMDA4LDE5ICsyMTE2LDIyIEBACiAgICAgQllURUFSUkFZX0FQUEVORF9NRVRIT0RERUYKICAgICB7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfY2FwaXRhbGl6ZV9fZG9jX199LAotICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCisgICAgeyJjZW50ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NlbnRlciwgTUVUSF9WQVJBUkdTLCBfUHlfY2VudGVyX19kb2NfX30sCiAgICAgQllURUFSUkFZX0NMRUFSX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9DT1BZX01FVEhPRERFRgotICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2NvdW50LCBNRVRIX1ZBUkFSR1MsIGNvdW50X19kb2NfX30sCisgICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfY291bnQsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2NvdW50X19kb2NfX30sCiAgICAgQllURUFSUkFZX0RFQ09ERV9NRVRIT0RERUYKLSAgICB7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9lbmRzd2l0aCwgTUVUSF9WQVJBUkdTLCBlbmRzd2l0aF9fZG9jX199LAorICAgIHsiZW5kc3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2VuZHN3aXRoLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9lbmRzd2l0aF9fZG9jX199LAogICAgIHsiZXhwYW5kdGFicyIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAgZXhwYW5kdGFic19fZG9jX199LAorICAgICBfUHlfZXhwYW5kdGFic19fZG9jX199LAogICAgIEJZVEVBUlJBWV9FWFRFTkRfTUVUSE9EREVGCi0gICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9maW5kLCBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKKyAgICB7ImZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2ZpbmQsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2ZpbmRfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfRlJPTUhFWF9NRVRIT0RERUYKICAgICB7ImhleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfaGV4LCBNRVRIX05PQVJHUywgaGV4X19kb2NfX30sCi0gICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfaW5kZXgsIE1FVEhfVkFSQVJHUywgaW5kZXhfX2RvY19ffSwKKyAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9pbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfaW5kZXhfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfSU5TRVJUX01FVEhPRERFRgogICAgIHsiaXNhbG51bSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXNhbG51bSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9pc2FsbnVtX19kb2NfX30sCkBAIC0zMDM3LDcgKzIxNDgsNyBAQAogICAgIHsiaXN1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXN1cHBlciwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9pc3VwcGVyX19kb2NfX30sCiAgICAgQllURUFSUkFZX0pPSU5fTUVUSE9EREVGCi0gICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgbGp1c3RfX2RvY19ffSwKKyAgICB7ImxqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sanVzdCwgTUVUSF9WQVJBUkdTLCBfUHlfbGp1c3RfX2RvY19ffSwKICAgICB7Imxvd2VyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sb3dlciwgTUVUSF9OT0FSR1MsIF9QeV9sb3dlcl9fZG9jX199LAogICAgIEJZVEVBUlJBWV9MU1RSSVBfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX01BS0VUUkFOU19NRVRIT0RERUYKQEAgLTMwNDYsMjMgKzIxNTcsMjMgQEAKICAgICBCWVRFQVJSQVlfUkVNT1ZFX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9SRVBMQUNFX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9SRVZFUlNFX01FVEhPRERFRgotICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3JmaW5kLCBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCi0gICAgeyJyaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3JpbmRleCwgTUVUSF9WQVJBUkdTLCByaW5kZXhfX2RvY19ffSwKLSAgICB7InJqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9yanVzdCwgTUVUSF9WQVJBUkdTLCByanVzdF9fZG9jX199LAorICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3JmaW5kLCBNRVRIX1ZBUkFSR1MsIF9QeV9yZmluZF9fZG9jX199LAorICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9yaW5kZXgsIE1FVEhfVkFSQVJHUywgX1B5X3JpbmRleF9fZG9jX199LAorICAgIHsicmp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3JqdXN0LCBNRVRIX1ZBUkFSR1MsIF9QeV9yanVzdF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9SUEFSVElUSU9OX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9SU1BMSVRfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1JTVFJJUF9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfU1BMSVRfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1NQTElUTElORVNfTUVUSE9EREVGCiAgICAgeyJzdGFydHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9zdGFydHN3aXRoLCBNRVRIX1ZBUkFSR1MgLAotICAgICBzdGFydHN3aXRoX19kb2NfX30sCisgICAgIF9QeV9zdGFydHN3aXRoX19kb2NfX30sCiAgICAgQllURUFSUkFZX1NUUklQX01FVEhPRERFRgogICAgIHsic3dhcGNhc2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3N3YXBjYXNlLCBNRVRIX05PQVJHUywKICAgICAgX1B5X3N3YXBjYXNlX19kb2NfX30sCiAgICAgeyJ0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdGl0bGUsIE1FVEhfTk9BUkdTLCBfUHlfdGl0bGVfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfVFJBTlNMQVRFX01FVEhPRERFRgogICAgIHsidXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3VwcGVyLCBNRVRIX05PQVJHUywgX1B5X3VwcGVyX19kb2NfX30sCi0gICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfemZpbGwsIE1FVEhfVkFSQVJHUywgemZpbGxfX2RvY19ffSwKKyAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl96ZmlsbCwgTUVUSF9WQVJBUkdTLCBfUHlfemZpbGxfX2RvY19ffSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTMwNzEsNyArMjE4Miw3IEBACiB7CiAgICAgaWYgKCFQeUJ5dGVBcnJheV9DaGVjayh2KSkKICAgICAgICAgUHlfUkVUVVJOX05PVElNUExFTUVOVEVEOwotICAgIHJldHVybiBieXRlYXJyYXlfZm9ybWF0KChQeUJ5dGVBcnJheU9iamVjdCAqKXYsIHcpOworICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXRFeChQeUJ5dGVBcnJheV9BU19TVFJJTkcodiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHYpLCB3LCAxKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBieXRlYXJyYXlfYXNfbnVtYmVyID0gewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ieXRlc19tZXRob2RzLmMgYi9PYmplY3RzL2J5dGVzX21ldGhvZHMuYwppbmRleCBhMjk5OTE1Li5kMGY3ODRlIDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVzX21ldGhvZHMuYworKysgYi9PYmplY3RzL2J5dGVzX21ldGhvZHMuYwpAQCAtMSwzICsxLDQgQEAKKyNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgImJ5dGVzX21ldGhvZHMuaCIKIApAQCAtMjc3LDcgKzI3OCw3IEBACiBjaGFyYWN0ZXJzLCBhbGwgcmVtYWluaW5nIGNhc2VkIGNoYXJhY3RlcnMgaGF2ZSBsb3dlcmNhc2UuIik7CiAKIHZvaWQKLV9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlfc3NpemVfdCBpOwogICAgIGludCBwcmV2aW91c19pc19jYXNlZCA9IDA7CkBAIC0zMDYsNyArMzA3LDcgQEAKIGFuZCB0aGUgcmVzdCBsb3dlci1jYXNlZC4iKTsKIAogdm9pZAotX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgUHlfc3NpemVfdCBpOwogCkBAIC0zMzYsNyArMzM3LDcgQEAKIHRvIGxvd2VyY2FzZSBBU0NJSSBhbmQgdmljZSB2ZXJzYS4iKTsKIAogdm9pZAotX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAKQEAgLTM4NywzICszODgsNDI3IEBACiAKICAgICByZXR1cm4gcmVzOwogfQorCisjZGVmaW5lIEZBU1RTRUFSQ0ggZmFzdHNlYXJjaAorI2RlZmluZSBTVFJJTkdMSUIoRikgc3RyaW5nbGliXyMjRgorI2RlZmluZSBTVFJJTkdMSUJfQ0hBUiBjaGFyCisjZGVmaW5lIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiAxCisKKyNpbmNsdWRlICJzdHJpbmdsaWIvZmFzdHNlYXJjaC5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9jb3VudC5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9maW5kLmgiCisKKy8qCitXcmFwcyBzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpIGFuZCBhZGRpdGlvbmFsbHkgY2hlY2tzIHdoZXRoZXIgdGhlCitmaXJzdCBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyIGluIHJhbmdlKDAsIDI1NikuCisKK0lmIHRoaXMgaXMgdGhlIGNhc2UsIHdyaXRlcyB0aGUgaW50ZWdlciB2YWx1ZSB0byB0aGUgYnl0ZSBwYXJhbWV0ZXIKK2FuZCBzZXRzIHN1Ym9iaiB0byBOVUxMLiBPdGhlcndpc2UsIHNldHMgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHN1Ym9iagorYW5kIGRvZXNuJ3QgdG91Y2ggYnl0ZS4gVGhlIG90aGVyIHBhcmFtZXRlcnMgYXJlIHNpbWlsYXIgdG8gdGhvc2Ugb2YKK3N0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkuCisqLworCitQeV9MT0NBTF9JTkxJTkUoaW50KQorcGFyc2VfYXJnc19maW5kc19ieXRlKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vib2JqLCBjaGFyICpieXRlLAorICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICplbmQpCit7CisgICAgUHlPYmplY3QgKnRtcF9zdWJvYmo7CisgICAgUHlfc3NpemVfdCBpdmFsOworICAgIFB5T2JqZWN0ICplcnI7CisKKyAgICBpZighc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoZnVuY3Rpb25fbmFtZSwgYXJncywgJnRtcF9zdWJvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghUHlOdW1iZXJfQ2hlY2sodG1wX3N1Ym9iaikpIHsKKyAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QodG1wX3N1Ym9iaiwgUHlFeGNfT3ZlcmZsb3dFcnJvcik7CisgICAgaWYgKGl2YWwgPT0gLTEpIHsKKyAgICAgICAgZXJyID0gUHlFcnJfT2NjdXJyZWQoKTsKKyAgICAgICAgaWYgKGVyciAmJiAhUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKGVyciwgUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAqc3Vib2JqID0gdG1wX3N1Ym9iajsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPiAyNTUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJieXRlIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqc3Vib2JqID0gTlVMTDsKKyAgICAqYnl0ZSA9IChjaGFyKWl2YWw7CisgICAgcmV0dXJuIDE7Cit9CisKKy8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCisjZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCisgICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYgKGVuZCA8IDApIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGVuZCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChzdGFydCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHN0YXJ0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorZmluZF9pbnRlcm5hbChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLAorICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKK3sKKyAgICBQeU9iamVjdCAqc3Vib2JqOworICAgIGNoYXIgYnl0ZTsKKyAgICBQeV9idWZmZXIgc3ViYnVmOworICAgIGNvbnN0IGNoYXIgKnN1YjsKKyAgICBQeV9zc2l6ZV90IHN1Yl9sZW47CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5X3NzaXplX3QgcmVzOworCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX2J5dGUoZnVuY3Rpb25fbmFtZSwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgaWYgKHN1Ym9iaikgeworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0yOworCisgICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7CisgICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ViID0gJmJ5dGU7CisgICAgICAgIHN1Yl9sZW4gPSAxOworICAgIH0KKworICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKKyAgICAgICAgcmVzID0gLTE7CisgICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxKSB7CisgICAgICAgIGlmIChkaXIgPiAwKQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX2ZpbmRfY2hhcigKKyAgICAgICAgICAgICAgICBzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgKnN1Yik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9jaGFyKAorICAgICAgICAgICAgICAgIHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAqc3ViKTsKKyAgICAgICAgaWYgKHJlcyA+PSAwKQorICAgICAgICAgICAgcmVzICs9IHN0YXJ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGRpciA+IDApCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9zbGljZSgKKyAgICAgICAgICAgICAgICBzdHIsIGxlbiwKKyAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfc2xpY2UoCisgICAgICAgICAgICAgICAgc3RyLCBsZW4sCisgICAgICAgICAgICAgICAgc3ViLCBzdWJfbGVuLCBzdGFydCwgZW5kKTsKKyAgICB9CisKKyAgICBpZiAoc3Vib2JqKQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJidWYpOworCisgICAgcmV0dXJuIHJlczsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfZmluZF9fZG9jX18sCisiQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxuXAorc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXG5cCithcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCitcblwKK1JldHVybiAtMSBvbiBmYWlsdXJlLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGZpbmRfaW50ZXJuYWwoc3RyLCBsZW4sICJmaW5kIiwgYXJncywgKzEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfaW5kZXhfX2RvY19fLAorIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK0xpa2UgQi5maW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19pbmRleChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGZpbmRfaW50ZXJuYWwoc3RyLCBsZW4sICJpbmRleCIsIGFyZ3MsICsxKTsKKyAgICBpZiAocmVzdWx0ID09IC0yKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgInN1YnNlY3Rpb24gbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3JmaW5kX19kb2NfXywKKyJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKK3N1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAorYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAorXG5cCitSZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX3JmaW5kKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gZmluZF9pbnRlcm5hbChzdHIsIGxlbiwgInJmaW5kIiwgYXJncywgLTEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfcmluZGV4X19kb2NfXywKKyJCLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorTGlrZSBCLnJmaW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic2VjdGlvbiBpcyBub3QgZm91bmQuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19yaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAicmluZGV4IiwgYXJncywgLTEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3Vic2VjdGlvbiBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfY291bnRfX2RvY19fLAorIkIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK1JldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzZWN0aW9uIHN1YiBpblxuXAorYnl0ZXMgQltzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkXG5cCithcyBpbiBzbGljZSBub3RhdGlvbi4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX2NvdW50KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpzdWJfb2JqOworICAgIGNvbnN0IGNoYXIgKnN1YjsKKyAgICBQeV9zc2l6ZV90IHN1Yl9sZW47CisgICAgY2hhciBieXRlOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwLCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKworICAgIFB5X2J1ZmZlciB2c3ViOworICAgIFB5T2JqZWN0ICpjb3VudF9vYmo7CisKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiY291bnQiLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJfb2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3ViX29iaikgeworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKKyAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc3ViID0gJmJ5dGU7CisgICAgICAgIHN1Yl9sZW4gPSAxOworICAgIH0KKworICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7CisKKyAgICBjb3VudF9vYmogPSBQeUxvbmdfRnJvbVNzaXplX3QoCisgICAgICAgIHN0cmluZ2xpYl9jb3VudChzdHIgKyBzdGFydCwgZW5kIC0gc3RhcnQsIHN1Yiwgc3ViX2xlbiwgUFlfU1NJWkVfVF9NQVgpCisgICAgICAgICk7CisKKyAgICBpZiAoc3ViX29iaikKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdnN1Yik7CisKKyAgICByZXR1cm4gY291bnRfb2JqOworfQorCitpbnQKK19QeV9ieXRlc19jb250YWlucyhjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJnKQoreworICAgIFB5X3NzaXplX3QgaXZhbCA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX1ZhbHVlRXJyb3IpOworICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgUHlfYnVmZmVyIHZhcmc7CisgICAgICAgIFB5X3NzaXplX3QgcG9zOworICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgJnZhcmcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcG9zID0gc3RyaW5nbGliX2ZpbmQoc3RyLCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmcuYnVmLCB2YXJnLmxlbiwgMCk7CisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhcmcpOworICAgICAgICByZXR1cm4gcG9zID49IDA7CisgICAgfQorICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID49IDI1NikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ5dGUgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gbWVtY2hyKHN0ciwgKGludCkgaXZhbCwgbGVuKSAhPSBOVUxMOworfQorCisKKy8qIE1hdGNoZXMgdGhlIGVuZCAoZGlyZWN0aW9uID49IDApIG9yIHN0YXJ0IChkaXJlY3Rpb24gPCAwKSBvZiB0aGUgYnVmZmVyCisgKiBhZ2FpbnN0IHN1YnN0ciwgdXNpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYXJndW1lbnRzLiBSZXR1cm5zCisgKiAtMSBvbiBlcnJvciwgMCBpZiBub3QgZm91bmQgYW5kIDEgaWYgZm91bmQuCisgKi8KK1B5X0xPQ0FMKGludCkKK3RhaWxtYXRjaChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqc3Vic3RyLAorICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBpbnQgZGlyZWN0aW9uKQoreworICAgIFB5X2J1ZmZlciBzdWJfdmlldyA9IHtOVUxMLCBOVUxMfTsKKyAgICBjb25zdCBjaGFyICpzdWI7CisgICAgUHlfc3NpemVfdCBzbGVuOworCisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soc3Vic3RyKSkgeworICAgICAgICBzdWIgPSBQeUJ5dGVzX0FTX1NUUklORyhzdWJzdHIpOworICAgICAgICBzbGVuID0gUHlCeXRlc19HRVRfU0laRShzdWJzdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJzdHIsICZzdWJfdmlldywgUHlCVUZfU0lNUExFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBzdWIgPSBzdWJfdmlldy5idWY7CisgICAgICAgIHNsZW4gPSBzdWJfdmlldy5sZW47CisgICAgfQorCisgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKKworICAgIGlmIChkaXJlY3Rpb24gPCAwKSB7CisgICAgICAgIC8qIHN0YXJ0c3dpdGggKi8KKyAgICAgICAgaWYgKHN0YXJ0ICsgc2xlbiA+IGxlbikKKyAgICAgICAgICAgIGdvdG8gbm90Zm91bmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogZW5kc3dpdGggKi8KKyAgICAgICAgaWYgKGVuZCAtIHN0YXJ0IDwgc2xlbiB8fCBzdGFydCA+IGxlbikKKyAgICAgICAgICAgIGdvdG8gbm90Zm91bmQ7CisKKyAgICAgICAgaWYgKGVuZCAtIHNsZW4gPiBzdGFydCkKKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kIC0gc2xlbjsKKyAgICB9CisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgc2xlbikKKyAgICAgICAgZ290byBub3Rmb3VuZDsKKyAgICBpZiAobWVtY21wKHN0ciArIHN0YXJ0LCBzdWIsIHNsZW4pICE9IDApCisgICAgICAgIGdvdG8gbm90Zm91bmQ7CisKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7CisgICAgcmV0dXJuIDE7CisKK25vdGZvdW5kOgorICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1Yl92aWV3KTsKKyAgICByZXR1cm4gMDsKK30KKworUHlfTE9DQUwoUHlPYmplY3QgKikKK19QeV9ieXRlc190YWlsbWF0Y2goY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCit7CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBQeU9iamVjdCAqc3Vib2JqOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKGZ1bmN0aW9uX25hbWUsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzdHIsIGxlbiwgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICByZXN1bHQgPSB0YWlsbWF0Y2goc3RyLCBsZW4sIHN1Ym9iaiwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciBhIHR1cGxlIG9mIGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25fbmFtZSwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9zdGFydHN3aXRoX19kb2NfXywKKyJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAorXG5cCitSZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCitXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCitXaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAorcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfc3RhcnRzd2l0aChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICByZXR1cm4gX1B5X2J5dGVzX3RhaWxtYXRjaChzdHIsIGxlbiwgInN0YXJ0c3dpdGgiLCBhcmdzLCAtMSk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2VuZHN3aXRoX19kb2NfXywKKyJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKK1xuXAorUmV0dXJuIFRydWUgaWYgQiBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKK1dpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKK1dpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCitzdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19lbmRzd2l0aChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICByZXR1cm4gX1B5X2J5dGVzX3RhaWxtYXRjaChzdHIsIGxlbiwgImVuZHN3aXRoIiwgYXJncywgKzEpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9leHBhbmR0YWJzX19kb2NfXywKKyJCLmV4cGFuZHRhYnModGFic2l6ZT04KSAtPiBjb3B5IG9mIEJcblwKK1xuXAorUmV0dXJuIGEgY29weSBvZiBCIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgZXhwYW5kZWQgdXNpbmcgc3BhY2VzLlxuXAorSWYgdGFic2l6ZSBpcyBub3QgZ2l2ZW4sIGEgdGFiIHNpemUgb2YgOCBjaGFyYWN0ZXJzIGlzIGFzc3VtZWQuIik7CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2xqdXN0X19kb2NfXywKKyJCLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKKyJcbiIKKyJSZXR1cm4gQiBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguIFBhZGRpbmcgaXNcbiIKKyJkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuIik7CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3JqdXN0X19kb2NfXywKKyJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKKyJcbiIKKyJSZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCisiZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpIik7CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2NlbnRlcl9fZG9jX18sCisiQi5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgorIlxuIgorIlJldHVybiBCIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gIFBhZGRpbmcgaXNcbiIKKyJkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkuIik7CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3pmaWxsX19kb2NfXywKKyJCLnpmaWxsKHdpZHRoKSAtPiBjb3B5IG9mIEJcbiIKKyJcbiIKKyJQYWQgYSBudW1lcmljIHN0cmluZyBCIHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZFxuIgorIm9mIHRoZSBzcGVjaWZpZWQgd2lkdGguICBCIGlzIG5ldmVyIHRydW5jYXRlZC4iKTsKKwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9ieXRlc29iamVjdC5jIGIvT2JqZWN0cy9ieXRlc29iamVjdC5jCmluZGV4IGMyYWE2NWMuLjhhZDI3ODIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZXNvYmplY3QuYworKysgYi9PYmplY3RzL2J5dGVzb2JqZWN0LmMKQEAgLTksOSArOSw5IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAKIC8qW2NsaW5pYyBpbnB1dF0KLWNsYXNzIGJ5dGVzICJQeUJ5dGVzT2JqZWN0KiIgIiZQeUJ5dGVzX1R5cGUiCitjbGFzcyBieXRlcyAiUHlCeXRlc09iamVjdCAqIiAiJlB5Qnl0ZXNfVHlwZSIKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTFhMWQ5MTAyYWZjMWIwMGNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTdhMjM4Zjk2NWQ2NDg5MmJdKi8KIAogI2luY2x1ZGUgImNsaW5pYy9ieXRlc29iamVjdC5jLmgiCiAKQEAgLTMwLDYgKzMwLDEwIEBACiAqLwogI2RlZmluZSBQeUJ5dGVzT2JqZWN0X1NJWkUgKG9mZnNldG9mKFB5Qnl0ZXNPYmplY3QsIG9iX3N2YWwpICsgMSkKIAorLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpIF9QeUJ5dGVzV3JpdGVyX0dldFNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0cik7CisKIC8qCiAgICBGb3IgUHlCeXRlc19Gcm9tU3RyaW5nKCksIHRoZSBwYXJhbWV0ZXIgYHN0cicgcG9pbnRzIHRvIGEgbnVsbC10ZXJtaW5hdGVkCiAgICBzdHJpbmcgY29udGFpbmluZyBleGFjdGx5IGBzaXplJyBieXRlcy4KQEAgLTE3NCwxOTAgKzE3OCwxODQgQEAKIFB5T2JqZWN0ICoKIFB5Qnl0ZXNfRnJvbUZvcm1hdFYoY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhcmdzKQogewotICAgIHZhX2xpc3QgY291bnQ7Ci0gICAgUHlfc3NpemVfdCBuID0gMDsKLSAgICBjb25zdCBjaGFyKiBmOwogICAgIGNoYXIgKnM7Ci0gICAgUHlPYmplY3QqIHN0cmluZzsKKyAgICBjb25zdCBjaGFyICpmOworICAgIGNvbnN0IGNoYXIgKnA7CisgICAgUHlfc3NpemVfdCBwcmVjOworICAgIGludCBsb25nZmxhZzsKKyAgICBpbnQgc2l6ZV90ZmxhZzsKKyAgICAvKiBMb25nZXN0IDY0LWJpdCBmb3JtYXR0ZWQgbnVtYmVyczoKKyAgICAgICAtICIxODQ0Njc0NDA3MzcwOTU1MTYxNVwwIiAoMjEgYnl0ZXMpCisgICAgICAgLSAiLTkyMjMzNzIwMzY4NTQ3NzU4MDhcMCIgKDIxIGJ5dGVzKQorICAgICAgIERlY2ltYWwgdGFrZXMgdGhlIG1vc3Qgc3BhY2UgKGl0IGlzbid0IGVub3VnaCBmb3Igb2N0YWwuKQogCi0gICAgUHlfVkFfQ09QWShjb3VudCwgdmFyZ3MpOwotICAgIC8qIHN0ZXAgMTogZmlndXJlIG91dCBob3cgbGFyZ2UgYSBidWZmZXIgd2UgbmVlZCAqLwotICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotICAgICAgICBpZiAoKmYgPT0gJyUnKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZjsKLSAgICAgICAgICAgIHdoaWxlICgqKytmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgOworICAgICAgIExvbmdlc3QgNjQtYml0IHBvaW50ZXIgcmVwcmVzZW50YXRpb246CisgICAgICAgIjB4ZmZmZmZmZmZmZmZmZmZmZlwwIiAoMTkgYnl0ZXMpLiAqLworICAgIGNoYXIgYnVmZmVyWzIxXTsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKLSAgICAgICAgICAgIC8qIHNraXAgdGhlICdsJyBvciAneicgaW4geyVsZCwgJXpkLCAlbHUsICV6dX0gc2luY2UKLSAgICAgICAgICAgICAqIHRoZXkgZG9uJ3QgYWZmZWN0IHRoZSBhbW91bnQgb2Ygc3BhY2Ugd2UgcmVzZXJ2ZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCgqZiA9PSAnbCcgfHwgKmYgPT0gJ3onKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpCi0gICAgICAgICAgICAgICAgKytmOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKLSAgICAgICAgICAgIHN3aXRjaCAoKmYpIHsKLSAgICAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjID0gdmFfYXJnKGNvdW50LCBpbnQpOwotICAgICAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlB5Qnl0ZXNfRnJvbUZvcm1hdFYoKTogJWMgZm9ybWF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RzIGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDI1NV0iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgIG4rKzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2QnOiBjYXNlICd1JzogY2FzZSAnaSc6IGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogMjAgYnl0ZXMgaXMgZW5vdWdoIHRvIGhvbGQgYSA2NC1iaXQKLSAgICAgICAgICAgICAgICAgICBpbnRlZ2VyLiAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZS4KLSAgICAgICAgICAgICAgICAgICBUaGlzIGlzbid0IGVub3VnaCBmb3Igb2N0YWwuICovCi0gICAgICAgICAgICAgICAgbiArPSAyMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHMgPSB2YV9hcmcoY291bnQsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgICh2b2lkKSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogbWF4aW11bSA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKLSAgICAgICAgICAgICAgICAgKiAweGZmZmZmZmZmZmZmZmZmZmYKLSAgICAgICAgICAgICAgICAgKiBzbyAxOSBjaGFyYWN0ZXJzIGlzIGVub3VnaC4KLSAgICAgICAgICAgICAgICAgKiBYWFggSSBjb3VudCAxOCAtLSB3aGF0J3MgdGhlIGV4dHJhIGZvcj8KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBuICs9IDE5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAvKiBpZiB3ZSBzdHVtYmxlIHVwb24gYW4gdW5rbm93bgotICAgICAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgY29kZSwgY29weSB0aGUgcmVzdCBvZgotICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtYXQgc3RyaW5nIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICBzdHJpbmcuICh3ZSBjYW5ub3QganVzdCBza2lwIHRoZQotICAgICAgICAgICAgICAgICAgIGNvZGUsIHNpbmNlIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLSAgICAgICAgICAgICAgICAgICB3aGF0J3MgaW4gdGhlIGFyZ3VtZW50IGxpc3QpICovCi0gICAgICAgICAgICAgICAgbiArPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICAgICAgZ290byBleHBhbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbisrOwotICAgIH0KLSBleHBhbmQ6Ci0gICAgLyogc3RlcCAyOiBmaWxsIHRoZSBidWZmZXIgKi8KLSAgICAvKiBTaW5jZSB3ZSd2ZSBhbmFseXplZCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGZvciB0aGUgd29yc3QgY2FzZSwKLSAgICAgICB1c2Ugc3ByaW50ZiBkaXJlY3RseSBpbnN0ZWFkIG9mIHRoZSBzbG93ZXIgUHlPU19zbnByaW50Zi4gKi8KLSAgICBzdHJpbmcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG4pOwotICAgIGlmICghc3RyaW5nKQorICAgIHMgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzdHJsZW4oZm9ybWF0KSk7CisgICAgaWYgKHMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKLSAgICBzID0gUHlCeXRlc19Bc1N0cmluZyhzdHJpbmcpOworI2RlZmluZSBXUklURV9CWVRFUyhzdHIpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgKHN0ciksIHN0cmxlbihzdHIpKTsgXAorICAgICAgICBpZiAocyA9PSBOVUxMKSBcCisgICAgICAgICAgICBnb3RvIGVycm9yOyBcCisgICAgfSB3aGlsZSAoMCkKIAogICAgIGZvciAoZiA9IGZvcm1hdDsgKmY7IGYrKykgewotICAgICAgICBpZiAoKmYgPT0gJyUnKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyKiBwID0gZisrOworICAgICAgICBpZiAoKmYgIT0gJyUnKSB7CisgICAgICAgICAgICAqcysrID0gKmY7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBmKys7CisKKyAgICAgICAgLyogaWdub3JlIHRoZSB3aWR0aCAoZXg6IDEwIGluICIlMTBzIikgKi8KKyAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQorICAgICAgICAgICAgZisrOworCisgICAgICAgIC8qIHBhcnNlIHRoZSBwcmVjaXNpb24gKGV4OiAxMCBpbiAiJS4xMHMiKSAqLworICAgICAgICBwcmVjID0gMDsKKyAgICAgICAgaWYgKCpmID09ICcuJykgeworICAgICAgICAgICAgZisrOworICAgICAgICAgICAgZm9yICg7IFB5X0lTRElHSVQoKmYpOyBmKyspIHsKKyAgICAgICAgICAgICAgICBwcmVjID0gKHByZWMgKiAxMCkgKyAoKmYgLSAnMCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCisgICAgICAgICAgICBmKys7CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcgKCdsJyksIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KKyAgICAgICAgICAgb3RoZXJzIGNhbiBiZSBhZGRlZCB3aGVuIG5lY2Vzc2FyeS4gKi8KKyAgICAgICAgbG9uZ2ZsYWcgPSAwOworICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgIGxvbmdmbGFnID0gMTsKKyAgICAgICAgICAgICsrZjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhhbmRsZSB0aGUgc2l6ZV90IGZsYWcgKCd6JykuICovCisgICAgICAgIHNpemVfdGZsYWcgPSAwOworICAgICAgICBpZiAoKmYgPT0gJ3onICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKKyAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOworICAgICAgICAgICAgKytmOworICAgICAgICB9CisKKyAgICAgICAgLyogc3Vic3RyYWN0IGJ5dGVzIHByZWFsbG9jYXRlZCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgICAgKGV4OiAyIGZvciAiJXMiKSAqLworICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGYgLSBwICsgMSk7CisKKyAgICAgICAgc3dpdGNoICgqZikgeworICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7CisgICAgICAgICAgICBpZiAoYyA8IDAgfHwgYyA+IDI1NSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0cyBhbiBpbnRlZ2VyIGluIHJhbmdlIFswOyAyNTVdIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWxkIiwgdmFfYXJnKHZhcmdzLCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAiZCIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3UnOgorICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7CisgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQorICAgICAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIldSIsCisgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgdW5zaWduZWQgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICB7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICBpbnQgbG9uZ2ZsYWcgPSAwOwotICAgICAgICAgICAgaW50IHNpemVfdGZsYWcgPSAwOwotICAgICAgICAgICAgLyogcGFyc2UgdGhlIHdpZHRoLnByZWNpc2lvbiBwYXJ0ICh3ZSdyZSBvbmx5Ci0gICAgICAgICAgICAgICBpbnRlcmVzdGVkIGluIHRoZSBwcmVjaXNpb24gdmFsdWUsIGlmIGFueSkgKi8KLSAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgd2hpbGUgKFB5X0lTRElHSVQoKmYpKQotICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOwotICAgICAgICAgICAgaWYgKCpmID09ICcuJykgewotICAgICAgICAgICAgICAgIGYrKzsKLSAgICAgICAgICAgICAgICBuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgICAgIG4gPSAobioxMCkgKyAqZisrIC0gJzAnOworCisgICAgICAgICAgICBwID0gdmFfYXJnKHZhcmdzLCBjb25zdCBjaGFyKik7CisgICAgICAgICAgICBpID0gc3RybGVuKHApOworICAgICAgICAgICAgaWYgKHByZWMgPiAwICYmIGkgPiBwcmVjKQorICAgICAgICAgICAgICAgIGkgPSBwcmVjOworICAgICAgICAgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgcywgcCwgaSk7CisgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlcCIsIHZhX2FyZyh2YXJncywgdm9pZCopKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCisgICAgICAgICAgICBpZiAoYnVmZmVyWzFdID09ICdYJykKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CisgICAgICAgICAgICBlbHNlIGlmIChidWZmZXJbMV0gIT0gJ3gnKSB7CisgICAgICAgICAgICAgICAgbWVtbW92ZShidWZmZXIrMiwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSsxKTsKKyAgICAgICAgICAgICAgICBidWZmZXJbMF0gPSAnMCc7CisgICAgICAgICAgICAgICAgYnVmZmVyWzFdID0gJ3gnOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKCpmICYmICpmICE9ICclJyAmJiAhUHlfSVNBTFBIQSgqZikpCi0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBsb25nIGZsYWcsIGJ1dCBvbmx5IGZvciAlbGQgYW5kICVsdS4KLSAgICAgICAgICAgICAgIG90aGVycyBjYW4gYmUgYWRkZWQgd2hlbiBuZWNlc3NhcnkuICovCi0gICAgICAgICAgICBpZiAoKmYgPT0gJ2wnICYmIChmWzFdID09ICdkJyB8fCBmWzFdID09ICd1JykpIHsKLSAgICAgICAgICAgICAgICBsb25nZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZy4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIHNpemVfdGZsYWcgPSAxOwotICAgICAgICAgICAgICAgICsrZjsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOworICAgICAgICAgICAgKnMrKyA9ICclJzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKmYgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZpeCBtaW5fc2l6ZSBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUrKzsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcodmFyZ3MsIGludCk7Ci0gICAgICAgICAgICAgICAgLyogYyBoYXMgYmVlbiBjaGVja2VkIGZvciBvdmVyZmxvdyBpbiB0aGUgZmlyc3Qgc3RlcCAqLwotICAgICAgICAgICAgICAgICpzKysgPSAodW5zaWduZWQgY2hhciljOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgUHlfc3NpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWQiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndSc6Ci0gICAgICAgICAgICAgICAgaWYgKGxvbmdmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlbHUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBsb25nKSk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2l6ZV90ZmxhZykKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJSIgUFlfRk9STUFUX1NJWkVfVCAidSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHNpemVfdCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXUiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVpIiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiV4IiwgdmFfYXJnKHZhcmdzLCBpbnQpKTsKLSAgICAgICAgICAgICAgICBzICs9IHN0cmxlbihzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNoYXIqKTsKLSAgICAgICAgICAgICAgICBpID0gc3RybGVuKHApOwotICAgICAgICAgICAgICAgIGlmIChuID4gMCAmJiBpID4gbikKLSAgICAgICAgICAgICAgICAgICAgaSA9IG47Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHMsIHAsIGkpOwotICAgICAgICAgICAgICAgIHMgKz0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOwotICAgICAgICAgICAgICAgIC8qICVwIGlzIGlsbC1kZWZpbmVkOiAgZW5zdXJlIGxlYWRpbmcgMHguICovCi0gICAgICAgICAgICAgICAgaWYgKHNbMV0gPT0gJ1gnKQotICAgICAgICAgICAgICAgICAgICBzWzFdID0gJ3gnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbMV0gIT0gJ3gnKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocysyLCBzLCBzdHJsZW4ocykrMSk7Ci0gICAgICAgICAgICAgICAgICAgIHNbMF0gPSAnMCc7Ci0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgKnMrKyA9ICclJzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RyY3B5KHMsIHApOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIC8qIGludmFsaWQgZm9ybWF0IHN0cmluZzogY29weSB1bmZvcm1hdHRlZCBzdHJpbmcgYW5kIGV4aXQgKi8KKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKHApOworICAgICAgICAgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKyAgICAgICAgfQogICAgIH0KIAotIGVuZDoKLSAgICBfUHlCeXRlc19SZXNpemUoJnN0cmluZywgcyAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHN0cmluZykpOwotICAgIHJldHVybiBzdHJpbmc7CisjdW5kZWYgV1JJVEVfQllURVMKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcyk7CisKKyBlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC00MDksMTIgKzQwNywxNCBAQAogCiAvKiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSB0byBhIFB5Qnl0ZXMgb2JqZWN0LCBvciBOVUxMIG9uIGZhaWx1cmUuICovCiAKLXN0YXRpYyBQeU9iamVjdCAqCi1mb3JtYXRmbG9hdChQeU9iamVjdCAqdiwgaW50IGZsYWdzLCBpbnQgcHJlYywgaW50IHR5cGUpCitzdGF0aWMgY2hhcioKK2Zvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSwKKyAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9yZXN1bHQsIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKIHsKICAgICBjaGFyICpwOwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CisgICAgc2l6ZV90IGxlbjsKIAogICAgIHggPSBQeUZsb2F0X0FzRG91YmxlKHYpOwogICAgIGlmICh4ID09IC0xLjAgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNDMxLDkgKzQzMSwyMiBAQAogCiAgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShwLCBzdHJsZW4ocCkpOworCisgICAgbGVuID0gc3RybGVuKHApOworICAgIGlmICh3cml0ZXIgIT0gTlVMTCkgeworICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBsZW4pOworICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlfTUVNQ1BZKHN0ciwgcCwgbGVuKTsKKyAgICAgICAgUHlNZW1fRnJlZShwKTsKKyAgICAgICAgc3RyICs9IGxlbjsKKyAgICAgICAgcmV0dXJuIHN0cjsKKyAgICB9CisKKyAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIGxlbik7CiAgICAgUHlNZW1fRnJlZShwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgICpwX3Jlc3VsdCA9IHJlc3VsdDsKKyAgICByZXR1cm4gc3RyOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDczLDExICs0ODYsMTEgQEAKIHN0YXRpYyBpbnQKIGJ5dGVfY29udmVydGVyKFB5T2JqZWN0ICphcmcsIGNoYXIgKnApCiB7Ci0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX1NpemUoYXJnKSA9PSAxKSB7CisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soYXJnKSAmJiBQeUJ5dGVzX0dFVF9TSVpFKGFyZykgPT0gMSkgewogICAgICAgICAqcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZylbMF07CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhhcmcpICYmIFB5Qnl0ZUFycmF5X1NpemUoYXJnKSA9PSAxKSB7CisgICAgZWxzZSBpZiAoUHlCeXRlQXJyYXlfQ2hlY2soYXJnKSAmJiBQeUJ5dGVBcnJheV9HRVRfU0laRShhcmcpID09IDEpIHsKICAgICAgICAgKnAgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoYXJnKVswXTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQpAQCAtNTU3LDM2ICs1NzAsMzYgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pCi0KLSAgIEZPUk1BVEJVRkxFTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaW4gd2hpY2ggdGhlIGludHMgJgotICAgY2hhcnMgYXJlIGZvcm1hdHRlZC4gWFhYIFRoaXMgaXMgYSBtYWdpYyBudW1iZXIuIEVhY2ggZm9ybWF0dGluZwotICAgcm91dGluZSBkb2VzIGJvdW5kcyBjaGVja2luZyB0byBlbnN1cmUgbm8gb3ZlcmZsb3csIGJ1dCBhIGJldHRlcgotICAgc29sdXRpb24gbWF5IGJlIHRvIG1hbGxvYyBhIGJ1ZmZlciBvZiBhcHByb3ByaWF0ZSBzaXplIGZvciBlYWNoCi0gICBmb3JtYXQuIEZvciBub3csIHRoZSBjdXJyZW50IHNvbHV0aW9uIGlzIHN1ZmZpY2llbnQuCi0qLwotI2RlZmluZSBGT1JNQVRCVUZMRU4gKHNpemVfdCkxMjAKKy8qIGZtdCUodjEsdjIsLi4uKSBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gc3ByaW50ZihmbXQsIHYxLCB2MiwgLi4uKSAqLwogCiBQeU9iamVjdCAqCi1fUHlCeXRlc19Gb3JtYXQoUHlPYmplY3QgKmZvcm1hdCwgUHlPYmplY3QgKmFyZ3MpCitfUHlCeXRlc19Gb3JtYXRFeChjb25zdCBjaGFyICpmb3JtYXQsIFB5X3NzaXplX3QgZm9ybWF0X2xlbiwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBpbnQgdXNlX2J5dGVhcnJheSkKIHsKLSAgICBjaGFyICpmbXQsICpyZXM7CisgICAgY29uc3QgY2hhciAqZm10OworICAgIGNoYXIgKnJlczsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbiwgYXJnaWR4OwotICAgIFB5X3NzaXplX3QgcmVzbGVuLCByZXNjbnQsIGZtdGNudDsKKyAgICBQeV9zc2l6ZV90IGZtdGNudDsKICAgICBpbnQgYXJnc19vd25lZCA9IDA7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqZGljdCA9IE5VTEw7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMIHx8ICFQeUJ5dGVzX0NoZWNrKGZvcm1hdCkgfHwgYXJncyA9PSBOVUxMKSB7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGZvcm1hdCk7Ci0gICAgZm10Y250ID0gUHlCeXRlc19HRVRfU0laRShmb3JtYXQpOwotICAgIHJlc2xlbiA9IHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgcmVzbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgZm10ID0gZm9ybWF0OworICAgIGZtdGNudCA9IGZvcm1hdF9sZW47CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKKworICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGZtdGNudCk7CisgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgaWYgKCF1c2VfYnl0ZWFycmF5KQorICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKKwogICAgIGlmIChQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7CiAgICAgICAgIGFyZ2xlbiA9IFB5VHVwbGVfR0VUX1NJWkUoYXJncyk7CiAgICAgICAgIGFyZ2lkeCA9IDA7CkBAIC02MDAsMTggKzYxMywyMyBAQAogICAgICAgICAhUHlCeXRlQXJyYXlfQ2hlY2soYXJncykpIHsKICAgICAgICAgICAgIGRpY3QgPSBhcmdzOwogICAgIH0KKwogICAgIHdoaWxlICgtLWZtdGNudCA+PSAwKSB7CiAgICAgICAgIGlmICgqZm10ICE9ICclJykgewotICAgICAgICAgICAgaWYgKC0tcmVzY250IDwgMCkgewotICAgICAgICAgICAgICAgIHJlc2NudCA9IGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpyZXMrKyA9ICpmbXQrKzsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgY2hhciAqcG9zOworCisgICAgICAgICAgICBwb3MgPSBzdHJjaHIoZm10ICsgMSwgJyUnKTsKKyAgICAgICAgICAgIGlmIChwb3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBsZW4gPSBwb3MgLSBmbXQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGVuID0gZm9ybWF0X2xlbiAtIChmbXQgLSBmb3JtYXQpOworICAgICAgICAgICAgYXNzZXJ0KGxlbiAhPSAwKTsKKworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgZm10LCBsZW4pOworICAgICAgICAgICAgcmVzICs9IGxlbjsKKyAgICAgICAgICAgIGZtdCArPSBsZW47CisgICAgICAgICAgICBmbXRjbnQgLT0gKGxlbiAtIDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgLyogR290IGEgZm9ybWF0IHNwZWNpZmllciAqLwpAQCAtNjI2LDEwICs2NDQsMTQgQEAKICAgICAgICAgICAgIGludCBzaWduOwogICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4gPSAwOwogICAgICAgICAgICAgY2hhciBvbmVjaGFyOyAvKiBGb3IgYnl0ZV9jb252ZXJ0ZXIoKSAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBhbGxvYzsKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgY2hhciAqYmVmb3JlOworI2VuZGlmCiAKICAgICAgICAgICAgIGZtdCsrOwogICAgICAgICAgICAgaWYgKCpmbXQgPT0gJygnKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqa2V5c3RhcnQ7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5c3RhcnQ7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBrZXlsZW47CiAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleTsKICAgICAgICAgICAgICAgICBpbnQgcGNvdW50ID0gMTsKQEAgLTY3Myw2ICs2OTUsOCBAQAogICAgICAgICAgICAgICAgIGFyZ2xlbiA9IC0xOwogICAgICAgICAgICAgICAgIGFyZ2lkeCA9IC0yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBmbGFncy4gRXhhbXBsZTogIiUraSIgPT4gZmxhZ3M9Rl9TSUdOLiAqLwogICAgICAgICAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPSAqZm10KyspIHsKICAgICAgICAgICAgICAgICBjYXNlICctJzogZmxhZ3MgfD0gRl9MSlVTVDsgY29udGludWU7CkBAIC02ODMsNiArNzA3LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIHdpZHRoLiBFeGFtcGxlOiAiJTEwcyIgPT4gd2lkdGg9MTAgKi8KICAgICAgICAgICAgIGlmIChjID09ICcqJykgewogICAgICAgICAgICAgICAgIHYgPSBnZXRuZXh0YXJnKGFyZ3MsIGFyZ2xlbiwgJmFyZ2lkeCk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKQEAgLTcxNyw2ICs3NDMsOCBAQAogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHdpZHRoKjEwICsgKGMgLSAnMCcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2UgcHJlY2lzaW9uLiBFeGFtcGxlOiAiJS4zZiIgPT4gcHJlYz0zICovCiAgICAgICAgICAgICBpZiAoYyA9PSAnLicpIHsKICAgICAgICAgICAgICAgICBwcmVjID0gMDsKICAgICAgICAgICAgICAgICBpZiAoLS1mbXRjbnQgPj0gMCkKQEAgLTc3MSwxMyArNzk5LDE5IEBACiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZtdGNudCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBsYXN0IHdyaXRlcjogZGlzYWJsZSB3cml0ZXIgb3ZlcmFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc2lnbiA9IDA7CiAgICAgICAgICAgICBmaWxsID0gJyAnOwogICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBwYnVmID0gIiUiOwotICAgICAgICAgICAgICAgIGxlbiA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgKnJlcysrID0gJyUnOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBjYXNlICdyJzoKICAgICAgICAgICAgICAgICAvLyAlciBpcyBvbmx5IGZvciAyLzMgY29kZTsgMyBvbmx5IGNvZGUgc2hvdWxkIHVzZSAlYQogICAgICAgICAgICAgY2FzZSAnYSc6CkBAIC03OTAsNiArODI0LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgIC8vICVzIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICViCiAgICAgICAgICAgICBjYXNlICdiJzoKQEAgLTc5OSwxMiArODM0LDQ5IEBACiAgICAgICAgICAgICAgICAgaWYgKHByZWMgPj0gMCAmJiBsZW4gPiBwcmVjKQogICAgICAgICAgICAgICAgICAgICBsZW4gPSBwcmVjOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgY2FzZSAndSc6CiAgICAgICAgICAgICBjYXNlICdvJzoKICAgICAgICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHYpCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYyAhPSAnWCcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdGVybmF0ZSA9IGZsYWdzICYgRl9BTFQ7CisgICAgICAgICAgICAgICAgICAgIGludCBiYXNlOworCisgICAgICAgICAgICAgICAgICAgIHN3aXRjaChjKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgwICYmICIndHlwZScgbm90IGluIFtkaXVveFhdIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2knOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd4JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gMjsgLyogc2l6ZSBwcmVhbGxvY2F0ZWQgZm9yICIlZCIgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gX1B5TG9uZ19Gb3JtYXRCeXRlc1dyaXRlcigmd3JpdGVyLCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYmFzZSwgYWx0ZXJuYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGxvbmcodiwgZmxhZ3MsIHByZWMsIGMpOwogICAgICAgICAgICAgICAgIGlmICghdGVtcCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTgxNSwxNCArODg3LDI1IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdlJzoKICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgY2FzZSAnZic6CiAgICAgICAgICAgICBjYXNlICdGJzoKICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICAgICAgdGVtcCA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjKTsKLSAgICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSAmJiBwcmVjID09IC0xCisgICAgICAgICAgICAgICAgICAgICYmICEoZmxhZ3MgJiAoRl9TSUdOIHwgRl9CTEFOSykpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVmIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgTlVMTCwgJndyaXRlciwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFmb3JtYXRmbG9hdCh2LCBmbGFncywgcHJlYywgYywgJnRlbXAsIE5VTEwsIHJlcykpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgcGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHRlbXApOwogICAgICAgICAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUodGVtcCk7CkBAIC04MzAsMjEgKzkxMywyOCBAQAogICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZfWkVSTykKICAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICcwJzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgICAgICAgcGJ1ZiA9ICZvbmVjaGFyOwogICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVfY29udmVydGVyKHYsICZvbmVjaGFyKTsKICAgICAgICAgICAgICAgICBpZiAoIWxlbikKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAod2lkdGggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IG9uZWNoYXI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICclYycgKDB4JXgpICIKICAgICAgICAgICAgICAgICAgICJhdCBpbmRleCAlemQiLAogICAgICAgICAgICAgICAgICAgYywgYywKLSAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FzU3RyaW5nKGZvcm1hdCkpKTsKKyAgICAgICAgICAgICAgICAgIChQeV9zc2l6ZV90KShmbXQgLSAxIC0gZm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoKnBidWYgPT0gJy0nIHx8ICpwYnVmID09ICcrJykgewogICAgICAgICAgICAgICAgICAgICBzaWduID0gKnBidWYrKzsKQEAgLTg1OSwyOSArOTQ5LDMxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAod2lkdGggPCBsZW4pCiAgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47Ci0gICAgICAgICAgICBpZiAocmVzY250IC0gKHNpZ24gIT0gMCkgPCB3aWR0aCkgewotICAgICAgICAgICAgICAgIHJlc2xlbiAtPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gd2lkdGggKyBmbXRjbnQgKyAxMDA7Ci0gICAgICAgICAgICAgICAgcmVzbGVuICs9IHJlc2NudDsKLSAgICAgICAgICAgICAgICBpZiAocmVzbGVuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgcmVzbGVuKSkgewotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICArIHJlc2xlbiAtIHJlc2NudDsKKworICAgICAgICAgICAgYWxsb2MgPSB3aWR0aDsKKyAgICAgICAgICAgIGlmIChzaWduICE9IDAgJiYgbGVuID09IHdpZHRoKQorICAgICAgICAgICAgICAgIGFsbG9jKys7CisgICAgICAgICAgICAvKiAyOiBzaXplIHByZWFsbG9jYXRlZCBmb3IgJXMgKi8KKyAgICAgICAgICAgIGlmIChhbGxvYyA+IDIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHJlcywgYWxsb2MgLSAyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisjaWZkZWYgUHlfREVCVUcKKyAgICAgICAgICAgIGJlZm9yZSA9IHJlczsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgc2lnbiBpZiBuZWVkZWQgKi8KICAgICAgICAgICAgIGlmIChzaWduKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGwgIT0gJyAnKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwotICAgICAgICAgICAgICAgIHJlc2NudC0tOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikKICAgICAgICAgICAgICAgICAgICAgd2lkdGgtLTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV3JpdGUgdGhlIG51bWVyaWMgcHJlZml4IGZvciAieCIsICJYIiBhbmQgIm8iIGZvcm1hdHMKKyAgICAgICAgICAgICAgIGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkLgorICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHdyaXRlICIweCIgZm9yIHRoZSAiJSN4IiBmb3JtYXQuICovCiAgICAgICAgICAgICBpZiAoKGZsYWdzICYgRl9BTFQpICYmIChjID09ICd4JyB8fCBjID09ICdYJykpIHsKICAgICAgICAgICAgICAgICBhc3NlcnQocGJ1ZlswXSA9PSAnMCcpOwogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzFdID09IGMpOwpAQCAtODg5LDE4ICs5ODEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gKnBidWYrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzY250IC09IDI7CiAgICAgICAgICAgICAgICAgd2lkdGggLT0gMjsKICAgICAgICAgICAgICAgICBpZiAod2lkdGggPCAwKQogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDA7CiAgICAgICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhZCBsZWZ0IHdpdGggdGhlIGZpbGwgY2hhcmFjdGVyIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuICYmICEoZmxhZ3MgJiBGX0xKVVNUKSkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IGZpbGw7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS13aWR0aCA+IGxlbik7CisgICAgICAgICAgICAgICAgbWVtc2V0KHJlcywgZmlsbCwgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHdpZHRoID0gbGVuOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiBwYWRkaW5nIHdpdGggc3BhY2VzOiB3cml0ZSBzaWduIGlmIG5lZWRlZCBhbmQvb3IgbnVtZXJpYworICAgICAgICAgICAgICAgcHJlZml4IGlmIHRoZSBhbHRlcm5hdGUgZm9ybSBpcyB1c2VkICovCiAgICAgICAgICAgICBpZiAoZmlsbCA9PSAnICcpIHsKICAgICAgICAgICAgICAgICBpZiAoc2lnbikKICAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gc2lnbjsKQEAgLTkxMiwxMyArMTAwNywxNyBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29weSBieXRlcyAqLwogICAgICAgICAgICAgUHlfTUVNQ1BZKHJlcywgcGJ1ZiwgbGVuKTsKICAgICAgICAgICAgIHJlcyArPSBsZW47Ci0gICAgICAgICAgICByZXNjbnQgLT0gbGVuOwotICAgICAgICAgICAgd2hpbGUgKC0td2lkdGggPj0gbGVuKSB7Ci0gICAgICAgICAgICAgICAgLS1yZXNjbnQ7Ci0gICAgICAgICAgICAgICAgKnJlcysrID0gJyAnOworCisgICAgICAgICAgICAvKiBQYWQgcmlnaHQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCisgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4pIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCAnICcsIHdpZHRoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICByZXMgKz0gKHdpZHRoIC0gbGVuKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGRpY3QgJiYgKGFyZ2lkeCA8IGFyZ2xlbikgJiYgYyAhPSAnJScpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwpAQCAtOTI2LDIyICsxMDI1LDMxIEBACiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisKKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB3ZSBjb21wdXRlZCB0aGUgZXhhY3Qgc2l6ZSBmb3IgdGhpcyB3cml0ZSAqLworICAgICAgICAgICAgYXNzZXJ0KChyZXMgLSBiZWZvcmUpID09IGFsbG9jKTsKKyNlbmRpZgogICAgICAgICB9IC8qICclJyAqLworCisgICAgICAgIC8qIElmIG92ZXJhbGxvY2F0aW9uIHdhcyBkaXNhYmxlZCwgZW5zdXJlIHRoYXQgaXQgd2FzIHRoZSBsYXN0CisgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgYXNzZXJ0KHdyaXRlci5vdmVyYWxsb2NhdGUgfHwgZm10Y250IDwgMCB8fCB1c2VfYnl0ZWFycmF5KTsKICAgICB9IC8qIHVudGlsIGVuZCAqLworCiAgICAgaWYgKGFyZ2lkeCA8IGFyZ2xlbiAmJiAhZGljdCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgYnl0ZXMgZm9ybWF0dGluZyIpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KKwogICAgIGlmIChhcmdzX293bmVkKSB7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4gLSByZXNjbnQpKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcmVzKTsKIAogIGVycm9yOgotICAgIFB5X0RFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KQEAgLTk2MSw2ICsxMDY5LDQyIEBACiAgICB0aGUgc3RyaW5nIGlzIFVURi04IGVuY29kZWQgYW5kIHNob3VsZCBiZSByZS1lbmNvZGVkIGluIHRoZQogICAgc3BlY2lmaWVkIGVuY29kaW5nLiAgKi8KIAorc3RhdGljIGNoYXIgKgorX1B5Qnl0ZXNfRGVjb2RlRXNjYXBlUmVjb2RlKGNvbnN0IGNoYXIgKipzLCBjb25zdCBjaGFyICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqcCkKK3sKKyAgICBQeU9iamVjdCAqdSwgKnc7CisgICAgY29uc3QgY2hhciogdDsKKworICAgIHQgPSAqczsKKyAgICAvKiBEZWNvZGUgbm9uLUFTQ0lJIGJ5dGVzIGFzIFVURi04LiAqLworICAgIHdoaWxlICh0IDwgZW5kICYmICgqdCAmIDB4ODApKQorICAgICAgICB0Kys7CisgICAgdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KCpzLCB0IC0gKnMsIGVycm9ycyk7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCisgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgcmVjb2RlX2VuY29kaW5nLCBlcnJvcnMpOworICAgIFB5X0RFQ1JFRih1KTsKKyAgICBpZiAgKHcgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOworCisgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCisgICAgd3JpdGVyLT5taW5fc2l6ZS0tOyAgIC8qIHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMod3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUodykpOworICAgIFB5X0RFQ1JFRih3KTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICpzID0gdDsKKyAgICByZXR1cm4gcDsKK30KKwogUHlPYmplY3QgKlB5Qnl0ZXNfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCkBAIC05NjgsNTQgKzExMTIsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVjb2RlX2VuY29kaW5nKQogewogICAgIGludCBjOwotICAgIGNoYXIgKnAsICpidWY7CisgICAgY2hhciAqcDsKICAgICBjb25zdCBjaGFyICplbmQ7Ci0gICAgUHlPYmplY3QgKnY7Ci0gICAgUHlfc3NpemVfdCBuZXdsZW4gPSByZWNvZGVfZW5jb2RpbmcgPyA0KmxlbjpsZW47Ci0gICAgdiA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCBuZXdsZW4pOwotICAgIGlmICh2ID09IE5VTEwpCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4pOworICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHAgPSBidWYgPSBQeUJ5dGVzX0FzU3RyaW5nKHYpOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOworCiAgICAgZW5kID0gcyArIGxlbjsKICAgICB3aGlsZSAocyA8IGVuZCkgewogICAgICAgICBpZiAoKnMgIT0gJ1xcJykgewogICAgICAgICAgIG5vbl9lc2M6Ci0gICAgICAgICAgICBpZiAocmVjb2RlX2VuY29kaW5nICYmICgqcyAmIDB4ODApKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnUsICp3OwotICAgICAgICAgICAgICAgIGNoYXIgKnI7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogdDsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHJuOwotICAgICAgICAgICAgICAgIHQgPSBzOwotICAgICAgICAgICAgICAgIC8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpIHQrKzsKLSAgICAgICAgICAgICAgICB1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgdCAtIHMsIGVycm9ycyk7Ci0gICAgICAgICAgICAgICAgaWYoIXUpIGdvdG8gZmFpbGVkOwotCi0gICAgICAgICAgICAgICAgLyogUmVjb2RlIHRoZW0gaW4gdGFyZ2V0IGVuY29kaW5nLiAqLwotICAgICAgICAgICAgICAgIHcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICB1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOwotICAgICAgICAgICAgICAgIGlmICghdykgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotCi0gICAgICAgICAgICAgICAgLyogQXBwZW5kIGJ5dGVzIHRvIG91dHB1dCBidWZmZXIuICovCi0gICAgICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sodykpOwotICAgICAgICAgICAgICAgIHIgPSBQeUJ5dGVzX0FTX1NUUklORyh3KTsKLSAgICAgICAgICAgICAgICBybiA9IFB5Qnl0ZXNfR0VUX1NJWkUodyk7Ci0gICAgICAgICAgICAgICAgUHlfTUVNQ1BZKHAsIHIsIHJuKTsKLSAgICAgICAgICAgICAgICBwICs9IHJuOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKLSAgICAgICAgICAgICAgICBzID0gdDsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpKSB7CiAgICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBub24tQVNDSUkgY2hhcmFjdGVyIGFuZCBuZWVkIHRvIHJlY29kZSAqLworICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoJnMsIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgcmVjb2RlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndyaXRlciwgcCk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCiAgICAgICAgIHMrKzsKLSAgICAgICAgaWYgKHM9PWVuZCkgeworICAgICAgICBpZiAocyA9PSBlbmQpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFpbGluZyBcXCBpbiBzdHJpbmciKTsKICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwogICAgICAgICB9CisKICAgICAgICAgc3dpdGNoICgqcysrKSB7CiAgICAgICAgIC8qIFhYWCBUaGlzIGFzc3VtZXMgQVNDSUkhICovCiAgICAgICAgIGNhc2UgJ1xuJzogYnJlYWs7CkBAIC0xMDQwLDI4ICsxMTcyLDE4IEBACiAgICAgICAgICAgICAqcCsrID0gYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgIGlmIChzKzEgPCBlbmQgJiYgUHlfSVNYRElHSVQoc1swXSkgJiYgUHlfSVNYRElHSVQoc1sxXSkpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgeCA9IDA7Ci0gICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKLSAgICAgICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICAgICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgICAgICAgICAgICAgIHggPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnYSc7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB4ID0gMTAgKyBjIC0gJ0EnOwotICAgICAgICAgICAgICAgIHggPSB4IDw8IDQ7Ci0gICAgICAgICAgICAgICAgYyA9IFB5X0NIQVJNQVNLKCpzKTsKLSAgICAgICAgICAgICAgICBzKys7Ci0gICAgICAgICAgICAgICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gYyAtICcwJzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChQeV9JU0xPV0VSKGMpKQotICAgICAgICAgICAgICAgICAgICB4ICs9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ0EnOwotICAgICAgICAgICAgICAgICpwKysgPSB4OwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCkgeworICAgICAgICAgICAgICAgIGludCBkaWdpdDEsIGRpZ2l0MjsKKyAgICAgICAgICAgICAgICBkaWdpdDEgPSBfUHlMb25nX0RpZ2l0VmFsdWVbUHlfQ0hBUk1BU0soc1swXSldOworICAgICAgICAgICAgICAgIGRpZ2l0MiA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzFdKV07CisgICAgICAgICAgICAgICAgaWYgKGRpZ2l0MSA8IDE2ICYmIGRpZ2l0MiA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAodW5zaWduZWQgY2hhcikoKGRpZ2l0MSA8PCA0KSArIGRpZ2l0Mik7CisgICAgICAgICAgICAgICAgICAgIHMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdHMgKi8KKwogICAgICAgICAgICAgaWYgKCFlcnJvcnMgfHwgc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgXFx4IGVzY2FwZSBhdCBwb3NpdGlvbiAlZCIsCkBAIC0xMDgzLDYgKzEyMDUsNyBAQAogICAgICAgICAgICAgaWYgKHMgPCBlbmQgJiYgUHlfSVNYRElHSVQoc1swXSkpCiAgICAgICAgICAgICAgICAgcysrOyAvKiBhbmQgYSBoZXhkaWdpdCAqLwogICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgcy0tOwpAQCAtMTA5MCwxMSArMTIxMywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEYtOCBieXRlcyBtYXkgZm9sbG93LiAqLwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChwLWJ1ZiA8IG5ld2xlbikKLSAgICAgICAgX1B5Qnl0ZXNfUmVzaXplKCZ2LCBwIC0gYnVmKTsKLSAgICByZXR1cm4gdjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKICAgZmFpbGVkOgotICAgIFB5X0RFQ1JFRih2KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0xMzY1LDI0ICsxNDg4LDcgQEAKIHN0YXRpYyBpbnQKIGJ5dGVzX2NvbnRhaW5zKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotICAgIFB5X3NzaXplX3QgaXZhbCA9IFB5TnVtYmVyX0FzU3NpemVfdChhcmcsIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgIGlmIChpdmFsID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgUHlfYnVmZmVyIHZhcmc7Ci0gICAgICAgIFB5X3NzaXplX3QgcG9zOwotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKGFyZywgJnZhcmcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcG9zID0gc3RyaW5nbGliX2ZpbmQoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5X1NJWkUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmcuYnVmLCB2YXJnLmxlbiwgMCk7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhcmcpOwotICAgICAgICByZXR1cm4gcG9zID49IDA7Ci0gICAgfQotICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID49IDI1NikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ5dGUgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVtY2hyKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAoaW50KSBpdmFsLCBQeV9TSVpFKHNlbGYpKSAhPSBOVUxMOworICAgIHJldHVybiBfUHlfYnl0ZXNfY29udGFpbnMoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZyk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNjI5LDggKzE3MzUsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGJkZTQ0ZGFjYjM2ZWYyZSBpbnB1dD04YjgwOWIzOTA3NGFiYmZhXSovCitieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTIxMjZiNTg0NGMxZDhlZiBpbnB1dD04YjgwOWIzOTA3NGFiYmZhXSovCiB7CiAgICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgKnN1YjsKQEAgLTE2NTQsNyArMTc2MCw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy5wYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBzZXA6IFB5X2J1ZmZlcgogICAgIC8KIApAQCAtMTY3MCw3ICsxNzc1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3BhcnRpdGlvbl9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY1MzJiMzkyYTE3ZmY2OTUgaW5wdXQ9YmM4NTVkYzYzY2E5NDlkZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY1MzJiMzkyYTE3ZmY2OTUgaW5wdXQ9NjFjY2E5NTUxOTQwNjA5OV0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfcGFydGl0aW9uKAogICAgICAgICAoUHlPYmplY3QqKSBzZWxmLApAQCAtMTY4Miw3ICsxNzg3LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJwYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBzZXA6IFB5X2J1ZmZlcgogICAgIC8KIApAQCAtMTY5OCw3ICsxODAyLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JwYXJ0aXRpb25faW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeV9idWZmZXIgKnNlcCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOTFiMTE0Y2JiMDI4ZTUwIGlucHV0PTY1ODhmZmYyNjJhOTE3MGVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xOTFiMTE0Y2JiMDI4ZTUwIGlucHV0PTY3ZjY4OWU2M2E2MmQ0NzhdKi8KIHsKICAgICByZXR1cm4gc3RyaW5nbGliX3JwYXJ0aXRpb24oCiAgICAgICAgIChQeU9iamVjdCopIHNlbGYsCkBAIC0xNzE2LDggKzE4MjAsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBiNjU3MGI5Nzc5MTFkODggaW5wdXQ9MGY4NmM5ZjI4ZjdkN2I3Yl0qLworYnl0ZXNfcnNwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iYTY5OGQ5ZWEwMWUxYzhmIGlucHV0PTBmODZjOWYyOGY3ZDdiN2JdKi8KIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIG47CiAgICAgY29uc3QgY2hhciAqcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwpAQCAtMTc1NSw4ICsxODU5LDggQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX2pvaW4oUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqaXRlcmFibGVfb2ZfYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjM0YWZmMTQ3NjRmZjk5NyBpbnB1dD03ZmUzNzdiOTViZDU0OWQyXSovCitieXRlc19qb2luKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9ieXRlcykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hMDQ2ZjM3OWY2MjZmNmY4IGlucHV0PTdmZTM3N2I5NWJkNTQ5ZDJdKi8KIHsKICAgICByZXR1cm4gc3RyaW5nbGliX2J5dGVzX2pvaW4oKFB5T2JqZWN0KilzZWxmLCBpdGVyYWJsZV9vZl9ieXRlcyk7CiB9CkBAIC0xNzY5LDE1OCArMTg3MywzMCBAQAogICAgIHJldHVybiBieXRlc19qb2luKChQeUJ5dGVzT2JqZWN0KilzZXAsIHgpOwogfQogCi0vKiBoZWxwZXIgbWFjcm8gdG8gZml4dXAgc3RhcnQvZW5kIHNsaWNlIHZhbHVlcyAqLwotI2RlZmluZSBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pICAgICAgICAgXAotICAgIGlmIChlbmQgPiBsZW4pICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmIChlbmQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZW5kID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoc3RhcnQgPCAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGFydCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhcnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWJ5dGVzX2ZpbmRfaW50ZXJuYWwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIGludCBkaXIpCi17Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfYnVmZmVyIHN1YmJ1ZjsKLSAgICBjb25zdCBjaGFyICpzdWI7Ci0gICAgUHlfc3NpemVfdCBsZW4sIHN1Yl9sZW47Ci0gICAgUHlfc3NpemVfdCBzdGFydD0wLCBlbmQ9UFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlfc3NpemVfdCByZXM7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX2J5dGUoImZpbmQvcmZpbmQvaW5kZXgvcmluZGV4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncywgJnN1Ym9iaiwgJmJ5dGUsICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiAtMjsKLQotICAgIGlmIChzdWJvYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJvYmosICZzdWJidWYsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMjsKLQotICAgICAgICBzdWIgPSBzdWJidWYuYnVmOwotICAgICAgICBzdWJfbGVuID0gc3ViYnVmLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0gICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZikgKyBzdGFydCwgZW5kIC0gc3RhcnQsCi0gICAgICAgICAgICBuZWVkbGUsIG5lZWRsZSwgbW9kZSk7Ci0gICAgICAgIGlmIChyZXMgPj0gMCkKLSAgICAgICAgICAgIHJlcyArPSBzdGFydDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChkaXIgPiAwKQotICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX2ZpbmRfc2xpY2UoCi0gICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfcmZpbmRfc2xpY2UoCi0gICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIGlmIChzdWJvYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi0KLVB5RG9jX1NUUlZBUihmaW5kX19kb2NfXywKLSJCLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2ZpbmQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19maW5kKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAotCi1QeURvY19TVFJWQVIoaW5kZXhfX2RvY19fLAotIkIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5maW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2luZGV4KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZXNfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzdHJpbmcgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19pbmRleChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJmaW5kX19kb2NfXywKLSJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcmZpbmQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19yZmluZChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCi0iQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yaW5kZXgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsIC0xKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JpbmRleChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIApAQCAtMjAwNyw3ICsxOTgzLDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwMTgsNyArMTk5Myw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19zdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jN2MyMjhkM2JkMTA0YTFiIGlucHV0PTM3ZGFhNWZhZDEzOTVkOTVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jN2MyMjhkM2JkMTA0YTFiIGlucHV0PThhMzU0NjQwZTRlMGIzZWZdKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgQk9USFNUUklQLCBieXRlcyk7CiB9CkBAIC0yMDI2LDcgKzIwMDEsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMubHN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwMzcsNyArMjAxMSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19sc3RyaXBfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mjg2MDJlNTg2ZjUyNGU4MiBpbnB1dD04ODgxMWIwOWRmYmMyOTg4XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9Mjg2MDJlNTg2ZjUyNGU4MiBpbnB1dD05YmFmZjQzOThjM2Y2ODU3XSovCiB7CiAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIExFRlRTVFJJUCwgYnl0ZXMpOwogfQpAQCAtMjA0NSw3ICsyMDE5LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJzdHJpcAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIGJ5dGVzOiBvYmplY3QgPSBOb25lCiAgICAgLwogCkBAIC0yMDU2LDY0ICsyMDI5LDIyIEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yc3RyaXBfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYnl0ZXMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTQ3ZTM4MTVjOTU0NDdkYSBpbnB1dD04ZjkzYzljZDM2MWYwMTQwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NTQ3ZTM4MTVjOTU0NDdkYSBpbnB1dD1iNzhhZjQ0NWM3MjdlMzJiXSovCiB7CiAgICAgcmV0dXJuIGRvX2FyZ3N0cmlwKHNlbGYsIFJJR0hUU1RSSVAsIGJ5dGVzKTsKIH0KIAogCi1QeURvY19TVFJWQVIoY291bnRfX2RvY19fLAotIkIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgc3ViIGluXG5cCi1zdHJpbmcgQltzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkXG5cCi1hcyBpbiBzbGljZSBub3RhdGlvbi4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2NvdW50KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5T2JqZWN0ICpzdWJfb2JqOwotICAgIGNvbnN0IGNoYXIgKnN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwotICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKLSAgICBjaGFyIGJ5dGU7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotCi0gICAgUHlfYnVmZmVyIHZzdWI7Ci0gICAgUHlPYmplY3QgKmNvdW50X29iajsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiY291bnQiLCBhcmdzLCAmc3ViX29iaiwgJmJ5dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKHN1Yl9vYmopIHsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihzdWJfb2JqLCAmdnN1YiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICAgc3ViID0gdnN1Yi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSB2c3ViLmxlbjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN1YiA9ICZieXRlOwotICAgICAgICBzdWJfbGVuID0gMTsKLSAgICB9Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpKTsKLQotICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKLSAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKLSAgICAgICAgKTsKLQotICAgIGlmIChzdWJfb2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKLQotICAgIHJldHVybiBjb3VudF9vYmo7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb3VudChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMudHJhbnNsYXRlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgdGFibGU6IG9iamVjdAogICAgICAgICBUcmFuc2xhdGlvbiB0YWJsZSwgd2hpY2ggbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBvZiBsZW5ndGggMjU2LgogICAgIFsKQEAgLTIxMzAsNyArMjA2MSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfdHJhbnNsYXRlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhYmxlLCBpbnQgZ3JvdXBfcmlnaHRfMSwKICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWxldGVjaGFycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yMzNkZjg1MGViNTBiZjhkIGlucHV0PWQ4ZmE1NTE5ZDdjYzRiZTddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yMzNkZjg1MGViNTBiZjhkIGlucHV0PWNhMjBlZGYzOWQ3ODBkNDldKi8KIHsKICAgICBjaGFyICppbnB1dCwgKm91dHB1dDsKICAgICBQeV9idWZmZXIgdGFibGVfdmlldyA9IHtOVUxMLCBOVUxMfTsKQEAgLTIxOTEsNyArMjEyMiw3IEBACiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnRhYmxlX3ZpZXcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlCeXRlc19Bc1N0cmluZyhyZXN1bHQpOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7CiAgICAgaW5wdXQgPSBQeUJ5dGVzX0FTX1NUUklORyhpbnB1dF9vYmopOwogCiAgICAgaWYgKGRlbGxlbiA9PSAwICYmIHRhYmxlX2NoYXJzICE9IE5VTEwpIHsKQEAgLTIyNjcsNDk4ICsyMTk4LDYgQEAKICAgICByZXR1cm4gX1B5X2J5dGVzX21ha2V0cmFucyhmcm0sIHRvKTsKIH0KIAotLyogZmluZCBhbmQgY291bnQgY2hhcmFjdGVycyBhbmQgc3Vic3RyaW5ncyAqLwotCi0jZGVmaW5lIGZpbmRjaGFyKHRhcmdldCwgdGFyZ2V0X2xlbiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGNoYXIgKiltZW1jaHIoKGNvbnN0IHZvaWQgKikodGFyZ2V0KSwgYywgdGFyZ2V0X2xlbikpCi0KLS8qIFN0cmluZyBvcHMgbXVzdCByZXR1cm4gYSBzdHJpbmcuICAqLwotLyogSWYgdGhlIG9iamVjdCBpcyBzdWJjbGFzcyBvZiBzdHJpbmcsIGNyZWF0ZSBhIGNvcHkgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJldHVybl9zZWxmKFB5Qnl0ZXNPYmplY3QgKnNlbGYpCi17Ci0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdChzZWxmKSkgewotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiBzZWxmOwotICAgIH0KLSAgICByZXR1cm4gKFB5Qnl0ZXNPYmplY3QgKilQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwKLSAgICAgICAgUHlCeXRlc19HRVRfU0laRShzZWxmKSk7Ci19Ci0KLVB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotY291bnRjaGFyKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgUHlfc3NpemVfdCBjb3VudD0wOwotICAgIGNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKLSAgICBjb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47Ci0KLSAgICB3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi0vKiBBbGdvcml0aG1zIGZvciBkaWZmZXJlbnQgY2FzZXMgb2Ygc3RyaW5nIHJlcGxhY2VtZW50ICovCi0KLS8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2VfaW50ZXJsZWF2ZShQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBpOwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIC8qIDEgYXQgdGhlIGVuZCBwbHVzIDEgYWZ0ZXIgZXZlcnkgY2hhcmFjdGVyOwotICAgICAgIGNvdW50ID0gbWluKG1heGNvdW50LCBzZWxmX2xlbiArIDEpICovCi0gICAgaWYgKG1heGNvdW50IDw9IHNlbGZfbGVuKQotICAgICAgICBjb3VudCA9IG1heGNvdW50OwotICAgIGVsc2UKLSAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3c6IHNlbGZfbGVuICsgMSA8PSBtYXhjb3VudCA8PSBQWV9TU0laRV9UX01BWC4gKi8KLSAgICAgICAgY291bnQgPSBzZWxmX2xlbiArIDE7Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOyAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gPiAoUFlfU1NJWkVfVF9NQVggLSBzZWxmX2xlbikgLyBjb3VudCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlbWVudCBieXRlcyBhcmUgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOwotCi0gICAgaWYgKCEgKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgLyogVE9ETzogc3BlY2lhbCBjYXNlIHNpbmdsZSBjaGFyYWN0ZXIsIHdoaWNoIGRvZXNuJ3QgbmVlZCBtZW1jcHkgKi8KLQotICAgIC8qIExheSB0aGUgZmlyc3Qgb25lIGRvd24gKGd1YXJhbnRlZWQgdGhpcyB3aWxsIG9jY3VyKSAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgY291bnQgLT0gMTsKLQotICAgIGZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKLSAgICAgICAgKnJlc3VsdF9zKysgPSAqc2VsZl9zKys7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgIH0KLQotICAgIC8qIENvcHkgdGhlIHJlc3Qgb2YgdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbi1pKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIFNwZWNpYWwgY2FzZSBmb3IgZGVsZXRpbmcgYSBzaW5nbGUgY2hhcmFjdGVyICovCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgdG89IiIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLCBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIGNvdW50OyAgLyogZnJvbV9sZW4gPT0gMSAqLwotICAgIGFzc2VydChyZXN1bHRfbGVuPj0wKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICB9Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KLQotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpIHsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotCi0gICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLQotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKLSAgICBhc3NlcnQgKHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OwotCi0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotCi0gICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPT0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW47Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7Ci0KLSAgICBpZiAobmV4dCA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCi0gICAgcmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQotICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0gICAgc3RhcnQgPSAgcmVzdWx0X3MgKyAobmV4dC1zZWxmX3MpOwotICAgICpzdGFydCA9IHRvX2M7Ci0gICAgc3RhcnQrKzsKLSAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCi0gICAgd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICpuZXh0ID0gdG9fYzsKLSAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZShQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQ7Ci0gICAgY2hhciAqc2VsZl9zOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLQotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICBpZiAob2Zmc2V0ID09IC0xKSB7Ci0gICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCi0gICAgcmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQotICAgIC8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCi0gICAgc3RhcnQgPSAgcmVzdWx0X3MgKyBvZmZzZXQ7Ci0gICAgUHlfTUVNQ1BZKHN0YXJ0LCB0b19zLCBmcm9tX2xlbik7Ci0gICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKLQotICAgIHdoaWxlICggLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQ9PS0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShzdGFydCtvZmZzZXQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICAgICAgc3RhcnQgKz0gb2Zmc2V0K2Zyb21fbGVuOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KLSAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuIC0gMSA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VtZW50IGJ5dGVzIGFyZSB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuIC0gMSk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0KzE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9zdWJzdHJpbmcoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgLyogICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKSAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSBmcm9tX2xlbiA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VtZW50IGJ5dGVzIGFyZSB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG5leHQgPSBzdGFydCtvZmZzZXQ7Ci0gICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ICs9IGZyb21fbGVuOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCtmcm9tX2xlbjsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgaWYgKG1heGNvdW50IDwgMCkgewotICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIH0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIGlmIChtYXhjb3VudCA9PSAwIHx8Ci0gICAgICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHplcm8tbGVuZ3RoIHNwZWNpYWwgY2FzZXMgKi8KLQotICAgIGlmIChmcm9tX2xlbiA9PSAwKSB7Ci0gICAgICAgIC8qIGluc2VydCB0aGUgJ3RvJyBzdHJpbmcgZXZlcnl3aGVyZS4gICAqLwotICAgICAgICAvKiAgICA+Pj4gIlB5dGhvbiIucmVwbGFjZSgiIiwgIi4iKSAgICAgKi8KLSAgICAgICAgLyogICAgJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfQotCi0gICAgLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KLSAgICAvKiBwb2ludCBmb3IgYW4gZW1wdHkgc2VsZiBzdHJpbmcgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgc3RyaW5nICovCi0gICAgLyogU3BlY2lhbCBjYXNlIHNvIHRoZSByZW1haW5pbmcgY29kZSBhbHdheXMgZ2V0cyBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KLSAgICBpZiAoUHlCeXRlc19HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICBpZiAodG9fbGVuID09IDApIHsKLSAgICAgICAgLyogZGVsZXRlIGFsbCBvY2N1cnJlbmNlcyBvZiAnZnJvbScgc3RyaW5nICovCi0gICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKLSAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX2xlbiwgbWF4Y291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVyZSBib3RoIHN0cmluZ3MgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KLQotICAgIGlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKLSAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCi0gICAgICAgICAgICAgICAgc2VsZiwKLSAgICAgICAgICAgICAgICBmcm9tX3NbMF0sCi0gICAgICAgICAgICAgICAgdG9fc1swXSwKLSAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCi0gICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLAotICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCi0gICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBmcm9tX3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogbGVuKCdmcm9tJyk+PTIsIGxlbigndG8nKT49MSAqLwotICAgICAgICByZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmcoc2VsZiwgZnJvbV9zLCBmcm9tX2xlbiwgdG9fcywgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotICAgIH0KLX0KLQogCiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy5yZXBsYWNlCkBAIC0yNzc3LDE1NiArMjIxNiwyOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcmVwbGFjZV9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAorYnl0ZXNfcmVwbGFjZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqb2xkLCBQeV9idWZmZXIgKm5ldywKICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQwM2RjOWQ3YTgzYzVhMWQgaW5wdXQ9YjJmYmJmMGJmMDRkZThlNV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk5NGZhNTg4YjZiOWMxMDQgaW5wdXQ9YjJmYmJmMGJmMDRkZThlNV0qLwogewotICAgIHJldHVybiAoUHlPYmplY3QgKilyZXBsYWNlKChQeUJ5dGVzT2JqZWN0ICopIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilvbGQtPmJ1Ziwgb2xkLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiluZXctPmJ1ZiwgbmV3LT5sZW4sIGNvdW50KTsKKyAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilvbGQtPmJ1Ziwgb2xkLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopbmV3LT5idWYsIG5ldy0+bGVuLCBjb3VudCk7CiB9CiAKIC8qKiBFbmQgREFMS0UgKiovCiAKLS8qIE1hdGNoZXMgdGhlIGVuZCAoZGlyZWN0aW9uID49IDApIG9yIHN0YXJ0IChkaXJlY3Rpb24gPCAwKSBvZiBzZWxmCi0gKiBhZ2FpbnN0IHN1YnN0ciwgdXNpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgYXJndW1lbnRzLiBSZXR1cm5zCi0gKiAtMSBvbiBlcnJvciwgMCBpZiBub3QgZm91bmQgYW5kIDEgaWYgZm91bmQuCi0gKi8KLVB5X0xPQ0FMKGludCkKLV9ieXRlc190YWlsbWF0Y2goUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLCBpbnQgZGlyZWN0aW9uKQotewotICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLSAgICBQeV9zc2l6ZV90IHNsZW47Ci0gICAgUHlfYnVmZmVyIHN1Yl92aWV3ID0ge05VTEwsIE5VTEx9OwotICAgIGNvbnN0IGNoYXIqIHN1YjsKLSAgICBjb25zdCBjaGFyKiBzdHI7Ci0KLSAgICBpZiAoUHlCeXRlc19DaGVjayhzdWJzdHIpKSB7Ci0gICAgICAgIHN1YiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHN1YnN0cik7Ci0gICAgICAgIHNsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHN1YnN0cik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1YnN0ciwgJnN1Yl92aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHN1YiA9IHN1Yl92aWV3LmJ1ZjsKLSAgICAgICAgc2xlbiA9IHN1Yl92aWV3LmxlbjsKLSAgICB9Ci0gICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwotCi0gICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKLSAgICAgICAgLyogc3RhcnRzd2l0aCAqLwotICAgICAgICBpZiAoc3RhcnQrc2xlbiA+IGxlbikKLSAgICAgICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogZW5kc3dpdGggKi8KLSAgICAgICAgaWYgKGVuZC1zdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCi0gICAgICAgICAgICBnb3RvIG5vdGZvdW5kOwotCi0gICAgICAgIGlmIChlbmQtc2xlbiA+IHN0YXJ0KQotICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSBzbGVuOwotICAgIH0KLSAgICBpZiAoZW5kLXN0YXJ0IDwgc2xlbikKLSAgICAgICAgZ290byBub3Rmb3VuZDsKLSAgICBpZiAobWVtY21wKHN0citzdGFydCwgc3ViLCBzbGVuKSAhPSAwKQotICAgICAgICBnb3RvIG5vdGZvdW5kOwotCi0gICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViX3ZpZXcpOwotICAgIHJldHVybiAxOwotCi1ub3Rmb3VuZDoKLSAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotUHlEb2NfU1RSVkFSKHN0YXJ0c3dpdGhfX2RvY19fLAotIkIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXG5cCi1cblwKLVJldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKLVdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1wcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19zdGFydHN3aXRoKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygic3RhcnRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlc190YWlsbWF0Y2goc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RhcnRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgdHVwbGUgb2YgYnl0ZXMsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3N0YXJ0c3dpdGgoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KLVB5RG9jX1NUUlZBUihlbmRzd2l0aF9fZG9jX18sCi0iQi5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXG5cCi1cblwKLVJldHVybiBUcnVlIGlmIEIgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCi1XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAotc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfZW5kc3dpdGgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJlbmRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlc190YWlsbWF0Y2goc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgKzEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiZW5kc3dpdGggZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIGJ5dGVzLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19lbmRzd2l0aChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIApAQCAtMjk0Niw5ICsyMjU3LDkgQEAKIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX2RlY29kZV9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgY29uc3QgY2hhciAqZW5jb2RpbmcsCitieXRlc19kZWNvZGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICplbmNvZGluZywKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yZDIwMTZmZjhlMGJiMTc2IGlucHV0PTk1ODE3NDc2OWQyYTQwY2FdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NjQ5YTUzZGRlMjdiMzE0IGlucHV0PTk1ODE3NDc2OWQyYTQwY2FdKi8KIHsKICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KChQeU9iamVjdCopc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiB9CkBAIC0yOTY2LDggKzIyNzcsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRsaW5lc19pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgaW50IGtlZXBlbmRzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk5NWMzNTk4Zjc4MzNjYWQgaW5wdXQ9N2Y0YWFjNjcxNDRmOTk0NF0qLworYnl0ZXNfc3BsaXRsaW5lc19pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIGludCBrZWVwZW5kcykKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zNDg0MTQ5YTVkODgwZmZiIGlucHV0PTdmNGFhYzY3MTQ0Zjk5NDRdKi8KIHsKICAgICByZXR1cm4gc3RyaW5nbGliX3NwbGl0bGluZXMoCiAgICAgICAgIChQeU9iamVjdCopIHNlbGYsIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLApAQCAtMjk3NSwyMiArMjI4Niw2IEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKLWhleF9kaWdpdF90b19pbnQoUHlfVUNTNCBjKQotewotICAgIGlmIChjID49IDEyOCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChQeV9JU0RJR0lUKGMpKQotICAgICAgICByZXR1cm4gYyAtICcwJzsKLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKFB5X0lTVVBQRVIoYykpCi0gICAgICAgICAgICBjID0gUHlfVE9MT1dFUihjKTsKLSAgICAgICAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotICAgICAgICAgICAgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCiAvKltjbGluaWMgaW5wdXRdCiBAY2xhc3NtZXRob2QKIGJ5dGVzLmZyb21oZXgKQEAgLTMwMDgsNDcgKzIzMDMsODggQEAKIGJ5dGVzX2Zyb21oZXhfaW1wbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICpzdHJpbmcpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDk3M2FjYzYzNjYxYmIyZSBpbnB1dD1iZjRkMWMzNjE2NzBhY2QzXSovCiB7Ci0gICAgUHlPYmplY3QgKm5ld3N0cmluZzsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gX1B5Qnl0ZXNfRnJvbUhleChzdHJpbmcsIDApOworICAgIGlmICh0eXBlICE9ICZQeUJ5dGVzX1R5cGUgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygoUHlPYmplY3QgKil0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgTlVMTCkpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21IZXgoUHlPYmplY3QgKnN0cmluZywgaW50IHVzZV9ieXRlYXJyYXkpCit7CiAgICAgY2hhciAqYnVmOwotICAgIFB5X3NzaXplX3QgaGV4bGVuLCBieXRlc2xlbiwgaSwgajsKLSAgICBpbnQgdG9wLCBib3Q7Ci0gICAgdm9pZCAqZGF0YTsKLSAgICB1bnNpZ25lZCBpbnQga2luZDsKKyAgICBQeV9zc2l6ZV90IGhleGxlbiwgaW52YWxpZF9jaGFyOworICAgIHVuc2lnbmVkIGludCB0b3AsIGJvdDsKKyAgICBQeV9VQ1MxICpzdHIsICplbmQ7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOworCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKyAgICB3cml0ZXIudXNlX2J5dGVhcnJheSA9IHVzZV9ieXRlYXJyYXk7CiAKICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHN0cmluZykpOwogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyaW5nKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7Ci0gICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cmluZyk7CiAgICAgaGV4bGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyaW5nKTsKIAotICAgIGJ5dGVzbGVuID0gaGV4bGVuLzI7IC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCi0gICAgbmV3c3RyaW5nID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBieXRlc2xlbik7Ci0gICAgaWYgKCFuZXdzdHJpbmcpCisgICAgaWYgKCFQeVVuaWNvZGVfSVNfQVNDSUkoc3RyaW5nKSkgeworICAgICAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHJpbmcpOworICAgICAgICBQeV9zc2l6ZV90IGk7CisKKyAgICAgICAgLyogc2VhcmNoIGZvciB0aGUgZmlyc3Qgbm9uLUFTQ0lJIGNoYXJhY3RlciAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGV4bGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA+PSAxMjgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW52YWxpZF9jaGFyID0gaTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQoc3RyaW5nKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgc3RyID0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKKworICAgIC8qIFRoaXMgb3ZlcmVzdGltYXRlcyBpZiB0aGVyZSBhcmUgc3BhY2VzICovCisgICAgYnVmID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgaGV4bGVuIC8gMik7CisgICAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBidWYgPSBQeUJ5dGVzX0FTX1NUUklORyhuZXdzdHJpbmcpOwotICAgIGZvciAoaSA9IGogPSAwOyBpIDwgaGV4bGVuOyBpICs9IDIpIHsKKworICAgIGVuZCA9IHN0ciArIGhleGxlbjsKKyAgICB3aGlsZSAoc3RyIDwgZW5kKSB7CiAgICAgICAgIC8qIHNraXAgb3ZlciBzcGFjZXMgaW4gdGhlIGlucHV0ICovCi0gICAgICAgIHdoaWxlIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSA9PSAnICcpCi0gICAgICAgICAgICBpKys7Ci0gICAgICAgIGlmIChpID49IGhleGxlbikKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB0b3AgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgYm90ID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKzEpKTsKLSAgICAgICAgaWYgKHRvcCA9PSAtMSB8fCBib3QgPT0gLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJub24taGV4YWRlY2ltYWwgbnVtYmVyIGZvdW5kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpKTsKKyAgICAgICAgaWYgKCpzdHIgPT0gJyAnKSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc3RyKys7CisgICAgICAgICAgICB9IHdoaWxlICgqc3RyID09ICcgJyk7CisgICAgICAgICAgICBpZiAoc3RyID49IGVuZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHRvcCA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsqc3RyXTsKKyAgICAgICAgaWYgKHRvcCA+PSAxNikgeworICAgICAgICAgICAgaW52YWxpZF9jaGFyID0gc3RyIC0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgYnVmW2orK10gPSAodG9wIDw8IDQpICsgYm90OworICAgICAgICBzdHIrKzsKKworICAgICAgICBib3QgPSBfUHlMb25nX0RpZ2l0VmFsdWVbKnN0cl07CisgICAgICAgIGlmIChib3QgPj0gMTYpIHsKKyAgICAgICAgICAgIGludmFsaWRfY2hhciA9IHN0ciAtIFB5VW5pY29kZV8xQllURV9EQVRBKHN0cmluZyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHN0cisrOworCisgICAgICAgICpidWYrKyA9ICh1bnNpZ25lZCBjaGFyKSgodG9wIDw8IDQpICsgYm90KTsKICAgICB9Ci0gICAgaWYgKGogIT0gYnl0ZXNsZW4gJiYgX1B5Qnl0ZXNfUmVzaXplKCZuZXdzdHJpbmcsIGopIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICByZXR1cm4gbmV3c3RyaW5nOworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBidWYpOwogCiAgIGVycm9yOgotICAgIFB5X1hERUNSRUYobmV3c3RyaW5nKTsKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgorICAgICAgICAgICAgICAgICAiZnJvbWhleCgpIGFyZyBhdCBwb3NpdGlvbiAlemQiLCBpbnZhbGlkX2NoYXIpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTMwNzgsMTcgKzI0MTQsMjAgQEAKICAgICB7Il9fZ2V0bmV3YXJnc19fIiwgICAgICAgICAgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2dldG5ld2FyZ3MsICBNRVRIX05PQVJHU30sCiAgICAgeyJjYXBpdGFsaXplIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jYXBpdGFsaXplLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2NhcGl0YWxpemVfX2RvY19ffSwKLSAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIGNlbnRlcl9fZG9jX199LAotICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKKyAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2VudGVyLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9jZW50ZXJfX2RvY19ffSwKKyAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2NvdW50LCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9jb3VudF9fZG9jX199LAogICAgIEJZVEVTX0RFQ09ERV9NRVRIT0RERUYKICAgICB7ImVuZHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2VuZHN3aXRoLCBNRVRIX1ZBUkFSR1MsCi0gICAgIGVuZHN3aXRoX19kb2NfX30sCisgICAgIF9QeV9lbmRzd2l0aF9fZG9jX199LAogICAgIHsiZXhwYW5kdGFicyIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfZXhwYW5kdGFicywgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAgZXhwYW5kdGFic19fZG9jX199LAotICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlc19maW5kLCBNRVRIX1ZBUkFSR1MsIGZpbmRfX2RvY19ffSwKKyAgICAgX1B5X2V4cGFuZHRhYnNfX2RvY19ffSwKKyAgICB7ImZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZmluZCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfZmluZF9fZG9jX199LAogICAgIEJZVEVTX0ZST01IRVhfTUVUSE9EREVGCiAgICAgeyJoZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfaGV4LCBNRVRIX05PQVJHUywgaGV4X19kb2NfX30sCi0gICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19pbmRleCwgTUVUSF9WQVJBUkdTLCBpbmRleF9fZG9jX199LAorICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfaW5kZXgsIE1FVEhfVkFSQVJHUywgX1B5X2luZGV4X19kb2NfX30sCiAgICAgeyJpc2FsbnVtIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc2FsbnVtLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2lzYWxudW1fX2RvY19ffSwKICAgICB7ImlzYWxwaGEiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzYWxwaGEsIE1FVEhfTk9BUkdTLApAQCAtMzEwNCwzOCArMjQ0Myw0MCBAQAogICAgIHsiaXN1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXN1cHBlciwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9pc3VwcGVyX19kb2NfX30sCiAgICAgQllURVNfSk9JTl9NRVRIT0RERUYKLSAgICB7ImxqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sanVzdCwgTUVUSF9WQVJBUkdTLCBsanVzdF9fZG9jX199LAorICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIF9QeV9sanVzdF9fZG9jX199LAogICAgIHsibG93ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xvd2VyLCBNRVRIX05PQVJHUywgX1B5X2xvd2VyX19kb2NfX30sCiAgICAgQllURVNfTFNUUklQX01FVEhPRERFRgogICAgIEJZVEVTX01BS0VUUkFOU19NRVRIT0RERUYKICAgICBCWVRFU19QQVJUSVRJT05fTUVUSE9EREVGCiAgICAgQllURVNfUkVQTEFDRV9NRVRIT0RERUYKLSAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JmaW5kLCBNRVRIX1ZBUkFSR1MsIHJmaW5kX19kb2NfX30sCi0gICAgeyJyaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIHJpbmRleF9fZG9jX199LAotICAgIHsicmp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3JqdXN0LCBNRVRIX1ZBUkFSR1MsIHJqdXN0X19kb2NfX30sCisgICAgeyJyZmluZCIsIChQeUNGdW5jdGlvbilieXRlc19yZmluZCwgTUVUSF9WQVJBUkdTLCBfUHlfcmZpbmRfX2RvY19ffSwKKyAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19yaW5kZXgsIE1FVEhfVkFSQVJHUywgX1B5X3JpbmRleF9fZG9jX199LAorICAgIHsicmp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3JqdXN0LCBNRVRIX1ZBUkFSR1MsIF9QeV9yanVzdF9fZG9jX199LAogICAgIEJZVEVTX1JQQVJUSVRJT05fTUVUSE9EREVGCiAgICAgQllURVNfUlNQTElUX01FVEhPRERFRgogICAgIEJZVEVTX1JTVFJJUF9NRVRIT0RERUYKICAgICBCWVRFU19TUExJVF9NRVRIT0RERUYKICAgICBCWVRFU19TUExJVExJTkVTX01FVEhPRERFRgogICAgIHsic3RhcnRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlc19zdGFydHN3aXRoLCBNRVRIX1ZBUkFSR1MsCi0gICAgIHN0YXJ0c3dpdGhfX2RvY19ffSwKKyAgICAgX1B5X3N0YXJ0c3dpdGhfX2RvY19ffSwKICAgICBCWVRFU19TVFJJUF9NRVRIT0RERUYKICAgICB7InN3YXBjYXNlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9zd2FwY2FzZSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9zd2FwY2FzZV9fZG9jX199LAogICAgIHsidGl0bGUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3RpdGxlLCBNRVRIX05PQVJHUywgX1B5X3RpdGxlX19kb2NfX30sCiAgICAgQllURVNfVFJBTlNMQVRFX01FVEhPRERFRgogICAgIHsidXBwZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3VwcGVyLCBNRVRIX05PQVJHUywgX1B5X3VwcGVyX19kb2NfX30sCi0gICAgeyJ6ZmlsbCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfemZpbGwsIE1FVEhfVkFSQVJHUywgemZpbGxfX2RvY19ffSwKKyAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl96ZmlsbCwgTUVUSF9WQVJBUkdTLCBfUHlfemZpbGxfX2RvY19ffSwKICAgICB7TlVMTCwgICAgIE5VTEx9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnRpbmVsICovCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfbW9kKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdykKK2J5dGVzX21vZChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLSAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sodikpCisgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHNlbGYpKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT1RJTVBMRU1FTlRFRDsKLSAgICByZXR1cm4gX1B5Qnl0ZXNfRm9ybWF0KHYsIHcpOworICAgIH0KKyAgICByZXR1cm4gX1B5Qnl0ZXNfRm9ybWF0RXgoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZywgMCk7CiB9CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgYnl0ZXNfYXNfbnVtYmVyID0gewpAQCAtMzI0NCwxMDggKzI1ODUsOTMgQEAKICAgICByZXR1cm4gUHlCeXRlc19Gcm9tT2JqZWN0KHgpOwogfQogCi1QeU9iamVjdCAqCi1QeUJ5dGVzX0Zyb21PYmplY3QoUHlPYmplY3QgKngpCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tQnVmZmVyKFB5T2JqZWN0ICp4KQogewotICAgIFB5T2JqZWN0ICpuZXcsICppdDsKKyAgICBQeU9iamVjdCAqbmV3OworICAgIFB5X2J1ZmZlciB2aWV3OworCisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcih4LCAmdmlldywgUHlCVUZfRlVMTF9STykgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdmlldy5sZW4pOworICAgIGlmICghbmV3KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKFB5QnVmZmVyX1RvQ29udGlndW91cygoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsLAorICAgICAgICAgICAgICAgICZ2aWV3LCB2aWV3LmxlbiwgJ0MnKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICByZXR1cm4gbmV3OworCitmYWlsOgorICAgIFB5X1hERUNSRUYobmV3KTsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBHRVRfSVRFTSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICpieXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfc3NpemVfdCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNoYXIgKnN0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeU9iamVjdCAqaXRlbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJ5dGVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYnl0ZXMgPT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ciA9ICgoUHlCeXRlc09iamVjdCAqKWJ5dGVzKS0+b2Jfc3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoeCk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpdGVtID0gR0VUX0lURU0oKHgpLCBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfVmFsdWVFcnJvcik7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBieXRlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnJvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X0RFQ1JFRihieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tTGlzdChQeU9iamVjdCAqeCkKK3sKKyAgICBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBQeUxpc3RfR0VUX0lURU0pOworfQorCitzdGF0aWMgUHlPYmplY3QqCitfUHlCeXRlc19Gcm9tVHVwbGUoUHlPYmplY3QgKngpCit7CisgICAgX1B5Qnl0ZXNfRlJPTV9MSVNUX0JPRFkoeCwgUHlUdXBsZV9HRVRfSVRFTSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitfUHlCeXRlc19Gcm9tSXRlcmF0b3IoUHlPYmplY3QgKml0LCBQeU9iamVjdCAqeCkKK3sKKyAgICBjaGFyICpzdHI7CiAgICAgUHlfc3NpemVfdCBpLCBzaXplOwotCi0gICAgaWYgKHggPT0gTlVMTCkgewotICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdCh4KSkgewotICAgICAgICBQeV9JTkNSRUYoeCk7Ci0gICAgICAgIHJldHVybiB4OwotICAgIH0KLQotICAgIC8qIFVzZSB0aGUgbW9kZXJuIGJ1ZmZlciBpbnRlcmZhY2UgKi8KLSAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoeCkpIHsKLSAgICAgICAgUHlfYnVmZmVyIHZpZXc7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoeCwgJnZpZXcsIFB5QlVGX0ZVTExfUk8pIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHZpZXcubGVuKTsKLSAgICAgICAgaWYgKCFuZXcpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGlmIChQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXMoKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmlldywgdmlldy5sZW4sICdDJykgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICAgIGZhaWw6Ci0gICAgICAgIFB5X1hERUNSRUYobmV3KTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmlldyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHgpKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgdW5pY29kZSBvYmplY3QgdG8gYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7Ci0gICAgICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KAotICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTSh4LCBpKSwgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3OwotICAgIH0KLSAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgUHlfU0laRSh4KSk7Ci0gICAgICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KAotICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oeCwgaSksIFB5RXhjX1ZhbHVlRXJyb3IpOwotICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWxbaV0gPSAoY2hhcikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldzsKLSAgICB9CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgLyogRm9yIGl0ZXJhdG9yIHZlcnNpb24sIGNyZWF0ZSBhIHN0cmluZyBvYmplY3QgYW5kIHJlc2l6ZSBhcyBuZWVkZWQgKi8KICAgICBzaXplID0gUHlPYmplY3RfTGVuZ3RoSGludCh4LCA2NCk7CiAgICAgaWYgKHNpemUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgLyogQWxsb2NhdGUgYW4gZXh0cmEgYnl0ZSB0byBwcmV2ZW50IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKSBmcm9tCi0gICAgICAgcmV0dXJuaW5nIGEgc2hhcmVkIGVtcHR5IGJ5dGVzIHN0cmluZy4gVGhpcyByZXF1aXJlZCBiZWNhdXNlIHdlCi0gICAgICAgd2FudCB0byBjYWxsIF9QeUJ5dGVzX1Jlc2l6ZSgpIHRoZSByZXR1cm5lZCBvYmplY3QsIHdoaWNoIHdlIGNhbgotICAgICAgIG9ubHkgZG8gb24gYnl0ZXMgb2JqZWN0cyB3aXRoIHJlZmNvdW50ID09IDEuICovCi0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgc2l6ZSA9IDE7Ci0gICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLSAgICBpZiAobmV3ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzc2VydChQeV9SRUZDTlQobmV3KSA9PSAxKTsKIAotICAgIC8qIEdldCB0aGUgaXRlcmF0b3IgKi8KLSAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoeCk7Ci0gICAgaWYgKGl0ID09IE5VTEwpCi0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOworICAgIHNpemUgPSB3cml0ZXIuYWxsb2NhdGVkOwogCiAgICAgLyogUnVuIHRoZSBpdGVyYXRvciB0byBleGhhdXN0aW9uICovCiAgICAgZm9yIChpID0gMDsgOyBpKyspIHsKQEAgLTMzNzUsMjEgKzI3MDEsNTggQEAKIAogICAgICAgICAvKiBBcHBlbmQgdGhlIGJ5dGUgKi8KICAgICAgICAgaWYgKGkgPj0gc2l6ZSkgewotICAgICAgICAgICAgc2l6ZSA9IDIgKiBzaXplICsgMTsKLSAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJm5ldywgc2l6ZSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoJndyaXRlciwgc3RyLCBzaXplKzEpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKKyAgICAgICAgKnN0cisrID0gKGNoYXIpIHZhbHVlOwogICAgIH0KLSAgICBfUHlCeXRlc19SZXNpemUoJm5ldywgaSk7CiAKLSAgICAvKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIHJldHVybiBuZXc7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIGVycm9yOgotICAgIFB5X1hERUNSRUYoaXQpOwotICAgIFB5X1hERUNSRUYobmV3KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOworfQorCitQeU9iamVjdCAqCitQeUJ5dGVzX0Zyb21PYmplY3QoUHlPYmplY3QgKngpCit7CisgICAgUHlPYmplY3QgKml0LCAqcmVzdWx0OworCisgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdCh4KSkgeworICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIFVzZSB0aGUgbW9kZXJuIGJ1ZmZlciBpbnRlcmZhY2UgKi8KKyAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoeCkpCisgICAgICAgIHJldHVybiBfUHlCeXRlc19Gcm9tQnVmZmVyKHgpOworCisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUxpc3QoeCk7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbVR1cGxlKHgpOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soeCkpIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOworICAgICAgICBpZiAoaXQgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKGl0LCB4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0ICclLjIwMHMnIG9iamVjdCB0byBieXRlcyIsCisgICAgICAgICAgICAgICAgIHgtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zNzQwLDMgKzMxMDMsMjgyIEBACiAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CisKKworLyogX1B5Qnl0ZXNXcml0ZXIgQVBJICovCisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKK3ZvaWQKK19QeUJ5dGVzV3JpdGVyX0luaXQoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICAvKiBTZXQgYWxsIGF0dHJpYnV0ZXMgYmVmb3JlIHNtYWxsX2J1ZmZlciB0byAwICovCisgICAgbWVtc2V0KHdyaXRlciwgMCwgb2Zmc2V0b2YoX1B5Qnl0ZXNXcml0ZXIsIHNtYWxsX2J1ZmZlcikpOworI2lmZGVmIFB5X0RFQlVHCisgICAgbWVtc2V0KHdyaXRlci0+c21hbGxfYnVmZmVyLCAweENCLCBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpKTsKKyNlbmRpZgorfQorCit2b2lkCitfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIpCit7CisgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworfQorCitQeV9MT0NBTF9JTkxJTkUoY2hhciopCitfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyKQoreworICAgIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyID09IE5VTEwpOworICAgICAgICByZXR1cm4gd3JpdGVyLT5zbWFsbF9idWZmZXI7CisgICAgfQorICAgIGVsc2UgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIHJldHVybiBQeUJ5dGVBcnJheV9BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+YnVmZmVyICE9IE5VTEwpOworICAgICAgICByZXR1cm4gUHlCeXRlc19BU19TVFJJTkcod3JpdGVyLT5idWZmZXIpOworICAgIH0KK30KKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitfUHlCeXRlc1dyaXRlcl9HZXRTaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyAgICBjaGFyICpzdGFydCA9IF9QeUJ5dGVzV3JpdGVyX0FzU3RyaW5nKHdyaXRlcik7CisgICAgYXNzZXJ0KHN0ciAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RyID49IHN0YXJ0KTsKKyAgICBhc3NlcnQoc3RyIC0gc3RhcnQgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIHJldHVybiBzdHIgLSBzdGFydDsKK30KKworUHlfTE9DQUxfSU5MSU5FKHZvaWQpCitfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0cikKK3sKKyNpZmRlZiBQeV9ERUJVRworICAgIGNoYXIgKnN0YXJ0LCAqZW5kOworCisgICAgaWYgKHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlcikgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgPT0gTlVMTCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhc3NlcnQod3JpdGVyLT5idWZmZXIgIT0gTlVMTCk7CisgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlQXJyYXlfQ2hlY2tFeGFjdCh3cml0ZXItPmJ1ZmZlcikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVja0V4YWN0KHdyaXRlci0+YnVmZmVyKSk7CisgICAgICAgIGFzc2VydChQeV9SRUZDTlQod3JpdGVyLT5idWZmZXIpID09IDEpOworICAgIH0KKworICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgLyogYnl0ZWFycmF5IGhhcyBpdHMgb3duIG92ZXJhbGxvY2F0aW9uIGFsZ29yaXRobSwKKyAgICAgICAgICAgd3JpdGVyIG92ZXJhbGxvY2F0aW9uIG11c3QgYmUgZGlzYWJsZWQgKi8KKyAgICAgICAgYXNzZXJ0KCF3cml0ZXItPm92ZXJhbGxvY2F0ZSk7CisgICAgfQorCisgICAgYXNzZXJ0KDAgPD0gd3JpdGVyLT5hbGxvY2F0ZWQpOworICAgIGFzc2VydCgwIDw9IHdyaXRlci0+bWluX3NpemUgJiYgd3JpdGVyLT5taW5fc2l6ZSA8PSB3cml0ZXItPmFsbG9jYXRlZCk7CisgICAgLyogdGhlIGxhc3QgYnl0ZSBtdXN0IGFsd2F5cyBiZSBudWxsICovCisgICAgc3RhcnQgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpOworICAgIGFzc2VydChzdGFydFt3cml0ZXItPmFsbG9jYXRlZF0gPT0gMCk7CisKKyAgICBlbmQgPSBzdGFydCArIHdyaXRlci0+YWxsb2NhdGVkOworICAgIGFzc2VydChzdHIgIT0gTlVMTCk7CisgICAgYXNzZXJ0KHN0YXJ0IDw9IHN0ciAmJiBzdHIgPD0gZW5kKTsKKyNlbmRpZgorfQorCit2b2lkKgorX1B5Qnl0ZXNXcml0ZXJfUmVzaXplKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnN0ciwgUHlfc3NpemVfdCBzaXplKQoreworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkLCBwb3M7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQod3JpdGVyLT5hbGxvY2F0ZWQgPCBzaXplKTsKKworICAgIGFsbG9jYXRlZCA9IHNpemU7CisgICAgaWYgKHdyaXRlci0+b3ZlcmFsbG9jYXRlCisgICAgICAgICYmIGFsbG9jYXRlZCA8PSAoUFlfU1NJWkVfVF9NQVggLSBhbGxvY2F0ZWQgLyBPVkVSQUxMT0NBVEVfRkFDVE9SKSkgeworICAgICAgICAvKiBvdmVyYWxsb2NhdGUgdG8gbGltaXQgdGhlIG51bWJlciBvZiByZWFsbG9jKCkgKi8KKyAgICAgICAgYWxsb2NhdGVkICs9IGFsbG9jYXRlZCAvIE9WRVJBTExPQ0FURV9GQUNUT1I7CisgICAgfQorCisgICAgcG9zID0gX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZSh3cml0ZXIsIHN0cik7CisgICAgaWYgKCF3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZSh3cml0ZXItPmJ1ZmZlciwgYWxsb2NhdGVkKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgLyogd3JpdGVyLT5hbGxvY2F0ZWQgY2FuIGJlIHNtYWxsZXIgdGhhbiB3cml0ZXItPmJ1ZmZlci0+b2JfYWxsb2MsCisgICAgICAgICAgICAgICBidXQgd2UgY2Fubm90IHVzZSBvYl9hbGxvYyBiZWNhdXNlIGJ5dGVzIG1heSBuZWVkIHRvIGJlIG1vdmVkCisgICAgICAgICAgICAgICB0byB1c2UgdGhlIHdob2xlIGJ1ZmZlci4gYnl0ZWFycmF5IHVzZXMgYW4gaW50ZXJuYWwgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICB0byBhdm9pZCBtb3Zpbmcgb3IgY29weWluZyBieXRlcyB3aGVuIGJ5dGVzIGFyZSByZW1vdmVkIGF0IHRoZQorICAgICAgICAgICAgICAgYmVnaW5uaW5nIChleDogZGVsIGJ5dGVhcnJheVs6MV0pLiAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmd3JpdGVyLT5idWZmZXIsIGFsbG9jYXRlZCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogY29udmVydCBmcm9tIHN0YWNrIGJ1ZmZlciB0byBieXRlcyBvYmplY3QgYnVmZmVyICovCisgICAgICAgIGFzc2VydCh3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKworICAgICAgICBpZiAod3JpdGVyLT51c2VfYnl0ZWFycmF5KQorICAgICAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhbGxvY2F0ZWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYWxsb2NhdGVkKTsKKyAgICAgICAgaWYgKHdyaXRlci0+YnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIGlmIChwb3MgIT0gMCkgeworICAgICAgICAgICAgY2hhciAqZGVzdDsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyh3cml0ZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHdyaXRlci0+YnVmZmVyKTsKKyAgICAgICAgICAgIFB5X01FTUNQWShkZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci0+c21hbGxfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIHBvcyk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIgPSAwOworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgIG1lbXNldCh3cml0ZXItPnNtYWxsX2J1ZmZlciwgMHhEQiwgc2l6ZW9mKHdyaXRlci0+c21hbGxfYnVmZmVyKSk7CisjZW5kaWYKKyAgICB9CisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBhbGxvY2F0ZWQ7CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Bc1N0cmluZyh3cml0ZXIpICsgcG9zOworICAgIF9QeUJ5dGVzV3JpdGVyX0NoZWNrQ29uc2lzdGVuY3kod3JpdGVyLCBzdHIpOworICAgIHJldHVybiBzdHI7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCoKK19QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgdm9pZCAqc3RyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgUHlfc3NpemVfdCBuZXdfbWluX3NpemU7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIGlmICh3cml0ZXItPm1pbl9zaXplID4gUFlfU1NJWkVfVF9NQVggLSBzaXplKSB7CisgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2Mod3JpdGVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG5ld19taW5fc2l6ZSA9IHdyaXRlci0+bWluX3NpemUgKyBzaXplOworCisgICAgaWYgKG5ld19taW5fc2l6ZSA+IHdyaXRlci0+YWxsb2NhdGVkKQorICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUod3JpdGVyLCBzdHIsIG5ld19taW5fc2l6ZSk7CisKKyAgICB3cml0ZXItPm1pbl9zaXplID0gbmV3X21pbl9zaXplOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9BbGxvYyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBQeV9zc2l6ZV90IHNpemUpCit7CisgICAgLyogZW5zdXJlIHRoYXQgX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoKSBpcyBvbmx5IGNhbGxlZCBvbmNlICovCisgICAgYXNzZXJ0KHdyaXRlci0+bWluX3NpemUgPT0gMCAmJiB3cml0ZXItPmJ1ZmZlciA9PSBOVUxMKTsKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIHdyaXRlci0+dXNlX3NtYWxsX2J1ZmZlciA9IDE7CisjaWZkZWYgUHlfREVCVUcKKyAgICB3cml0ZXItPmFsbG9jYXRlZCA9IHNpemVvZih3cml0ZXItPnNtYWxsX2J1ZmZlcikgLSAxOworICAgIC8qIEluIGRlYnVnIG1vZGUsIGRvbid0IHVzZSB0aGUgZnVsbCBzbWFsbCBidWZmZXIgYmVjYXVzZSBpdCBpcyBsZXNzCisgICAgICAgZWZmaWNpZW50IHRoYW4gYnl0ZXMgYW5kIGJ5dGVhcnJheSBvYmplY3RzIHRvIGRldGVjdCBidWZmZXIgdW5kZXJmbG93CisgICAgICAgYW5kIGJ1ZmZlciBvdmVyZmxvdy4gVXNlIDEwIGJ5dGVzIG9mIHRoZSBzbWFsbCBidWZmZXIgdG8gdGVzdCBhbHNvCisgICAgICAgY29kZSB1c2luZyB0aGUgc21hbGxlciBidWZmZXIgaW4gZGVidWcgbW9kZS4KKworICAgICAgIERvbid0IG1vZGlmeSB0aGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlICh1c2UgYSBzaG9ydGVyIHNtYWxsIGJ1ZmZlcikKKyAgICAgICBpbiBkZWJ1ZyBtb2RlIHRvIGFsc28gYmUgYWJsZSB0byBkZXRlY3Qgc3RhY2sgb3ZlcmZsb3cgd2hlbiBydW5uaW5nCisgICAgICAgdGVzdHMgaW4gZGVidWcgbW9kZS4gVGhlIF9QeUJ5dGVzV3JpdGVyIGlzIGxhcmdlIChtb3JlIHRoYW4gNTEyIGJ5dGVzKSwKKyAgICAgICBpZiBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoKSBpcyBub3QgdXNlZCBpbiBkZWVwIEMgY2FsbGJhY2ssIHdlIG1heSBoaXQgYQorICAgICAgIHN0YWNrIG92ZXJmbG93LiAqLworICAgIHdyaXRlci0+YWxsb2NhdGVkID0gUHlfTUlOKHdyaXRlci0+YWxsb2NhdGVkLCAxMCk7CisgICAgLyogX1B5Qnl0ZXNXcml0ZXJfQ2hlY2tDb25zaXN0ZW5jeSgpIHJlcXVpcmVzIHRoZSBsYXN0IGJ5dGUgdG8gYmUgMCwKKyAgICAgICB0byBkZXRlY3QgYnVmZmVyIG92ZXJmbG93ICovCisgICAgd3JpdGVyLT5zbWFsbF9idWZmZXJbd3JpdGVyLT5hbGxvY2F0ZWRdID0gMDsKKyNlbHNlCisgICAgd3JpdGVyLT5hbGxvY2F0ZWQgPSBzaXplb2Yod3JpdGVyLT5zbWFsbF9idWZmZXIpOworI2VuZGlmCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCB3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7Cit9CisKK1B5T2JqZWN0ICoKK19QeUJ5dGVzV3JpdGVyX0ZpbmlzaChfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCB2b2lkICpzdHIpCit7CisgICAgUHlfc3NpemVfdCBzaXplOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9DaGVja0NvbnNpc3RlbmN5KHdyaXRlciwgc3RyKTsKKworICAgIHNpemUgPSBfUHlCeXRlc1dyaXRlcl9HZXRTaXplKHdyaXRlciwgc3RyKTsKKyAgICBpZiAoc2l6ZSA9PSAwICYmICF3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworICAgICAgICAvKiBHZXQgdGhlIGVtcHR5IGJ5dGUgc3RyaW5nIHNpbmdsZXRvbiAqLworICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOworICAgIH0KKyAgICBlbHNlIGlmICh3cml0ZXItPnVzZV9zbWFsbF9idWZmZXIpIHsKKyAgICAgICAgaWYgKHdyaXRlci0+dXNlX2J5dGVhcnJheSkgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUod3JpdGVyLT5zbWFsbF9idWZmZXIsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSh3cml0ZXItPnNtYWxsX2J1ZmZlciwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IHdyaXRlci0+YnVmZmVyOworICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKHNpemUgIT0gd3JpdGVyLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgICAgIGlmICh3cml0ZXItPnVzZV9ieXRlYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKHJlc3VsdCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlc3VsdCA9PSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQqCitfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIHZvaWQgKnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnl0ZXMsIFB5X3NzaXplX3Qgc2l6ZSkKK3sKKyAgICBjaGFyICpzdHIgPSAoY2hhciAqKXB0cjsKKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBQeV9NRU1DUFkoc3RyLCBieXRlcywgc2l6ZSk7CisgICAgc3RyICs9IHNpemU7CisKKyAgICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGluaWMvYnl0ZWFycmF5b2JqZWN0LmMuaCBiL09iamVjdHMvY2xpbmljL2J5dGVhcnJheW9iamVjdC5jLmgKaW5kZXggZTg3YTIyMS4uZTFjZjAzYiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvYnl0ZWFycmF5b2JqZWN0LmMuaAorKysgYi9PYmplY3RzL2NsaW5pYy9ieXRlYXJyYXlvYmplY3QuYy5oCkBAIC02NSwxMiArNjUsMTQgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dHJhbnNsYXRlIiwgJnRhYmxlKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0cmFuc2xhdGUiLCAmdGFibGUpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhbnNsYXRlIiwgJnRhYmxlLCAmZGVsZXRlY2hhcnMpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzp0cmFuc2xhdGUiLCAmdGFibGUsICZkZWxldGVjaGFycykpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMTA4LDE3ICsxMTAsMjAgQEAKICAgICBQeV9idWZmZXIgdG8gPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6bWFrZXRyYW5zIiwKLSAgICAgICAgJmZybSwgJnRvKSkKKyAgICAgICAgJmZybSwgJnRvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9tYWtldHJhbnNfaW1wbCgmZnJtLCAmdG8pOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZybSAqLwotICAgIGlmIChmcm0ub2JqKQorICAgIGlmIChmcm0ub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJtKTsKKyAgICB9CiAgICAgLyogQ2xlYW51cCBmb3IgdG8gKi8KLSAgICBpZiAodG8ub2JqKQorICAgIGlmICh0by5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ0byk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE1MiwxNyArMTU3LDIwIEBACiAgICAgUHlfc3NpemVfdCBjb3VudCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqfG46cmVwbGFjZSIsCi0gICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpCisgICAgICAgICZvbGQsICZuZXcsICZjb3VudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfcmVwbGFjZV9pbXBsKHNlbGYsICZvbGQsICZuZXcsIGNvdW50KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBvbGQgKi8KLSAgICBpZiAob2xkLm9iaikKKyAgICBpZiAob2xkLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9sZCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIG5ldyAqLwotICAgIGlmIChuZXcub2JqKQorICAgIGlmIChuZXcub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmbmV3KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTk3LDggKzIwNSw5IEBACiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9uOnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3NwbGl0X2ltcGwoc2VsZiwgc2VwLCBtYXhzcGxpdCk7CiAKIGV4aXQ6CkBAIC0yNjksOCArMjc4LDkgQEAKICAgICBQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T246cnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JzcGxpdF9pbXBsKHNlbGYsIHNlcCwgbWF4c3BsaXQpOwogCiBleGl0OgpAQCAtMzIwLDggKzMzMCw5IEBACiAgICAgaW50IGl0ZW07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm5PJjppbnNlcnQiLAotICAgICAgICAmaW5kZXgsIF9nZXRieXRldmFsdWUsICZpdGVtKSkKKyAgICAgICAgJmluZGV4LCBfZ2V0Ynl0ZXZhbHVlLCAmaXRlbSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfaW5zZXJ0X2ltcGwoc2VsZiwgaW5kZXgsIGl0ZW0pOwogCiBleGl0OgpAQCAtMzQ5LDggKzM2MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGl0ZW07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmFwcGVuZCIsIF9nZXRieXRldmFsdWUsICZpdGVtKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmFwcGVuZCIsIF9nZXRieXRldmFsdWUsICZpdGVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9hcHBlbmRfaW1wbChzZWxmLCBpdGVtKTsKIAogZXhpdDoKQEAgLTM5NCw4ICs0MDYsOSBAQAogICAgIFB5X3NzaXplX3QgaW5kZXggPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cG9wIiwKLSAgICAgICAgJmluZGV4KSkKKyAgICAgICAgJmluZGV4KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9wb3BfaW1wbChzZWxmLCBpbmRleCk7CiAKIGV4aXQ6CkBAIC00MjMsOCArNDM2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnJlbW92ZSIsIF9nZXRieXRldmFsdWUsICZ2YWx1ZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpyZW1vdmUiLCBfZ2V0Ynl0ZXZhbHVlLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JlbW92ZV9pbXBsKHNlbGYsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTQ1Myw4ICs0NjcsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3N0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtNDgzLDggKzQ5OCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X2xzdHJpcF9pbXBsKHNlbGYsIGJ5dGVzKTsKIAogZXhpdDoKQEAgLTUxMyw4ICs1MjksOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicnN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9yc3RyaXBfaW1wbChzZWxmLCBieXRlcyk7CiAKIGV4aXQ6CkBAIC01NTIsOCArNTY5LDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifHNzOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVhcnJheV9kZWNvZGVfaW1wbChzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTU5Niw4ICs2MTQsOSBAQAogICAgIGludCBrZWVwZW5kcyA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8aTpzcGxpdGxpbmVzIiwgX2tleXdvcmRzLAotICAgICAgICAma2VlcGVuZHMpKQorICAgICAgICAma2VlcGVuZHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3NwbGl0bGluZXNfaW1wbChzZWxmLCBrZWVwZW5kcyk7CiAKIGV4aXQ6CkBAIC02MTcsMTcgKzYzNiwxOCBAQAogICAgIHsiZnJvbWhleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZnJvbWhleCwgTUVUSF9PfE1FVEhfQ0xBU1MsIGJ5dGVhcnJheV9mcm9taGV4X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlYXJyYXlfZnJvbWhleF9pbXBsKFB5T2JqZWN0KmNscywgUHlPYmplY3QgKnN0cmluZyk7CitieXRlYXJyYXlfZnJvbWhleF9pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnN0cmluZyk7CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlYXJyYXlfZnJvbWhleChQeVR5cGVPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZykKK2J5dGVhcnJheV9mcm9taGV4KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3RyaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmZyb21oZXgiLCAmc3RyaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6ZnJvbWhleCIsICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfZnJvbWhleF9pbXBsKChQeU9iamVjdCopY2xzLCBzdHJpbmcpOworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBieXRlYXJyYXlfZnJvbWhleF9pbXBsKHR5cGUsIHN0cmluZyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKQEAgLTY3MCw4ICs2OTAsOSBAQAogICAgIGludCBwcm90byA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9fcmVkdWNlX2V4X18iLAotICAgICAgICAmcHJvdG8pKQorICAgICAgICAmcHJvdG8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZWFycmF5X3JlZHVjZV9leF9pbXBsKHNlbGYsIHByb3RvKTsKIAogZXhpdDoKQEAgLTY5NSw0ICs3MTYsNCBAQAogewogICAgIHJldHVybiBieXRlYXJyYXlfc2l6ZW9mX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTY2YzE1ZmYyMmM1ZTI0MyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YTMyZjE4M2ViZWYxNTljYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9PYmplY3RzL2NsaW5pYy9ieXRlc29iamVjdC5jLmggYi9PYmplY3RzL2NsaW5pYy9ieXRlc29iamVjdC5jLmgKaW5kZXggNWExYTVlOS4uMGNjZWQ4ZSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvYnl0ZXNvYmplY3QuYy5oCisrKyBiL09iamVjdHMvY2xpbmljL2J5dGVzb2JqZWN0LmMuaApAQCAtMjAsMTAgKzIwLDEwIEBACiAgICAgeyJzcGxpdCIsIChQeUNGdW5jdGlvbilieXRlc19zcGxpdCwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsIGJ5dGVzX3NwbGl0X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCk7CitieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXQoUHlCeXRlc09iamVjdCpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK2J5dGVzX3NwbGl0KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic2VwIiwgIm1heHNwbGl0IiwgTlVMTH07CkBAIC0zMSw4ICszMSw5IEBACiAgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9uOnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfc3BsaXRfaW1wbChzZWxmLCBzZXAsIG1heHNwbGl0KTsKIAogZXhpdDoKQEAgLTY0LDE0ICs2NSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBzZXAgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnBhcnRpdGlvbiIsICZzZXApKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cGFydGl0aW9uIiwgJnNlcCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19wYXJ0aXRpb25faW1wbChzZWxmLCAmc2VwKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBzZXAgKi8KLSAgICBpZiAoc2VwLm9iaikKKyAgICBpZiAoc2VwLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnNlcCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEwMSwxNCArMTA0LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIHNlcCA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cnBhcnRpdGlvbiIsICZzZXApKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cnBhcnRpdGlvbiIsICZzZXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcnBhcnRpdGlvbl9pbXBsKHNlbGYsICZzZXApOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHNlcCAqLwotICAgIGlmIChzZXAub2JqKQorICAgIGlmIChzZXAub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc2VwKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTMzLDEwICsxMzgsMTAgQEAKICAgICB7InJzcGxpdCIsIChQeUNGdW5jdGlvbilieXRlc19yc3BsaXQsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBieXRlc19yc3BsaXRfX2RvY19ffSwKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3JzcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCk7CitieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJ5dGVzX3JzcGxpdChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorYnl0ZXNfcnNwbGl0KFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsic2VwIiwgIm1heHNwbGl0IiwgTlVMTH07CkBAIC0xNDQsOCArMTQ5LDkgQEAKICAgICBQeV9zc2l6ZV90IG1heHNwbGl0ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T246cnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKQorICAgICAgICAmc2VwLCAmbWF4c3BsaXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcnNwbGl0X2ltcGwoc2VsZiwgc2VwLCBtYXhzcGxpdCk7CiAKIGV4aXQ6CkBAIC0xODksOCArMTk1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN0cmlwIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmJ5dGVzKSkKKyAgICAgICAgJmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3N0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjE5LDggKzIyNiw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJsc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfbHN0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjQ5LDggKzI1Nyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJyc3RyaXAiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYnl0ZXMpKQorICAgICAgICAmYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfcnN0cmlwX2ltcGwoc2VsZiwgYnl0ZXMpOwogCiBleGl0OgpAQCAtMjg0LDEyICsyOTMsMTQgQEAKIAogICAgIHN3aXRjaCAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSkgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dHJhbnNsYXRlIiwgJnRhYmxlKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzp0cmFuc2xhdGUiLCAmdGFibGUpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT086dHJhbnNsYXRlIiwgJnRhYmxlLCAmZGVsZXRlY2hhcnMpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPTzp0cmFuc2xhdGUiLCAmdGFibGUsICZkZWxldGVjaGFycykpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9yaWdodF8xID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtMzI3LDE3ICszMzgsMjAgQEAKICAgICBQeV9idWZmZXIgdG8gPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6bWFrZXRyYW5zIiwKLSAgICAgICAgJmZybSwgJnRvKSkKKyAgICAgICAgJmZybSwgJnRvKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX21ha2V0cmFuc19pbXBsKCZmcm0sICZ0byk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJtICovCi0gICAgaWYgKGZybS5vYmopCisgICAgaWYgKGZybS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcm0pOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciB0byAqLwotICAgIGlmICh0by5vYmopCisgICAgaWYgKHRvLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnRvKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzU5LDExICszNzMsMTEgQEAKICAgICB7InJlcGxhY2UiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmVwbGFjZSwgTUVUSF9WQVJBUkdTLCBieXRlc19yZXBsYWNlX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeV9idWZmZXIgKm9sZCwgUHlfYnVmZmVyICpuZXcsCitieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfcmVwbGFjZShQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzKQorYnl0ZXNfcmVwbGFjZShQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgb2xkID0ge05VTEwsIE5VTEx9OwpAQCAtMzcxLDE3ICszODUsMjAgQEAKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSp8bjpyZXBsYWNlIiwKLSAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkKKyAgICAgICAgJm9sZCwgJm5ldywgJmNvdW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ5dGVzX3JlcGxhY2VfaW1wbChzZWxmLCAmb2xkLCAmbmV3LCBjb3VudCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3Igb2xkICovCi0gICAgaWYgKG9sZC5vYmopCisgICAgaWYgKG9sZC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZvbGQpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciBuZXcgKi8KLSAgICBpZiAobmV3Lm9iaikKKyAgICBpZiAobmV3Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm5ldyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQwNSwxMSArNDIyLDExIEBACiAgICAgeyJkZWNvZGUiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZGVjb2RlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfZGVjb2RlX19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19kZWNvZGVfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfZGVjb2RlKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitieXRlc19kZWNvZGUoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJlbmNvZGluZyIsICJlcnJvcnMiLCBOVUxMfTsKQEAgLTQxNyw4ICs0MzQsOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8c3M6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgICAgICAmZW5jb2RpbmcsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfZGVjb2RlX2ltcGwoc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC00MzgsMTggKzQ1NiwxOSBAQAogICAgIHsic3BsaXRsaW5lcyIsIChQeUNGdW5jdGlvbilieXRlc19zcGxpdGxpbmVzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgYnl0ZXNfc3BsaXRsaW5lc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRsaW5lc19pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgaW50IGtlZXBlbmRzKTsKK2J5dGVzX3NwbGl0bGluZXNfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBpbnQga2VlcGVuZHMpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfc3BsaXRsaW5lcyhQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQorYnl0ZXNfc3BsaXRsaW5lcyhQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBzdGF0aWMgY2hhciAqX2tleXdvcmRzW10gPSB7ImtlZXBlbmRzIiwgTlVMTH07CiAgICAgaW50IGtlZXBlbmRzID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpOnNwbGl0bGluZXMiLCBfa2V5d29yZHMsCi0gICAgICAgICZrZWVwZW5kcykpCisgICAgICAgICZrZWVwZW5kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBieXRlc19zcGxpdGxpbmVzX2ltcGwoc2VsZiwga2VlcGVuZHMpOwogCiBleGl0OgpAQCAtNDc3LDExICs0OTYsMTIgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqc3RyaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmZyb21oZXgiLCAmc3RyaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6ZnJvbWhleCIsICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnl0ZXNfZnJvbWhleF9pbXBsKHR5cGUsIHN0cmluZyk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iZDBjZThmMjVkN2UxOGY0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02ZmU4ODRhNzRlN2Q0OWNmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY2xpbmljL2RpY3RvYmplY3QuYy5oIGIvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKaW5kZXggNTI4OGI5YS4uZDBjZGZjMyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKKysrIGIvT2JqZWN0cy9jbGluaWMvZGljdG9iamVjdC5jLmgKQEAgLTIzLDggKzIzLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZyb21rZXlzIiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJml0ZXJhYmxlLCAmdmFsdWUpKQorICAgICAgICAmaXRlcmFibGUsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkaWN0X2Zyb21rZXlzX2ltcGwodHlwZSwgaXRlcmFibGUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTM5LDQgKzQwLDQgQEAKIAogI2RlZmluZSBESUNUX19fQ09OVEFJTlNfX19NRVRIT0RERUYgICAgXAogICAgIHsiX19jb250YWluc19fIiwgKFB5Q0Z1bmN0aW9uKWRpY3RfX19jb250YWluc19fLCBNRVRIX098TUVUSF9DT0VYSVNULCBkaWN0X19fY29udGFpbnNfX19fZG9jX199LAotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlNzRkNjc2MzMyZmRiYTYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkyNjMyNjEwOWUzZDk4MzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jbGluaWMvdW5pY29kZW9iamVjdC5jLmggYi9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaAppbmRleCBkNDJhNzAwLi44OTFlOTBjIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaAorKysgYi9PYmplY3RzL2NsaW5pYy91bmljb2Rlb2JqZWN0LmMuaApAQCAtMzEsMTEgKzMxLDEyIEBACiAgICAgUHlPYmplY3QgKnogPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfFVVOm1ha2V0cmFucyIsCi0gICAgICAgICZ4LCAmeSwgJnopKQorICAgICAgICAmeCwgJnksICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVfbWFrZXRyYW5zX2ltcGwoeCwgeSwgeik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NGFmZmRmZjViMmRhZmY1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00YTg2ZGQxMDhkOTJkMTA0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvY29kZW9iamVjdC5jIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKaW5kZXggOTY0YWU2Mi4uZjA4OWY3NSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jb2Rlb2JqZWN0LmMKQEAgLTY5NCw3ICs2OTQsOCBAQAogICAgICAgICBhZGRyICs9ICpwKys7CiAgICAgICAgIGlmIChhZGRyID4gYWRkcnEpCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgbGluZSArPSAqcCsrOworICAgICAgICBsaW5lICs9IChzaWduZWQgY2hhcikqcDsKKyAgICAgICAgcCsrOwogICAgIH0KICAgICByZXR1cm4gbGluZTsKIH0KQEAgLTcyOSwxNyArNzMwLDE5IEBACiAgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgIGlmICgqcCkKKyAgICAgICAgaWYgKChzaWduZWQgY2hhcikqcCkKICAgICAgICAgICAgIGJvdW5kcy0+YXBfbG93ZXIgPSBhZGRyOwotICAgICAgICBsaW5lICs9ICpwKys7CisgICAgICAgIGxpbmUgKz0gKHNpZ25lZCBjaGFyKSpwOworICAgICAgICBwKys7CiAgICAgICAgIC0tc2l6ZTsKICAgICB9CiAKICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICAgd2hpbGUgKC0tc2l6ZSA+PSAwKSB7CiAgICAgICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgICAgICBpZiAoKnArKykKKyAgICAgICAgICAgIGlmICgoc2lnbmVkIGNoYXIpKnApCiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CiAgICAgICAgIH0KICAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IGFkZHI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCmluZGV4IGRhNjhlM2IuLjRiYzczYjkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTIyLDcgKzIyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNoYXIgKmZvcm1hdCkKK2Rlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNvbnN0IGNoYXIgKmZvcm1hdCkKIHsKICAgICBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CiAgICAgaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IGQ3NzQ1ODYuLjMxYzQ1ZWYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogICAgIGFzc2VydChzaXplID49IFB5RGljdF9NSU5TSVpFX1NQTElUKTsKICAgICBhc3NlcnQoSVNfUE9XRVJfT0ZfMihzaXplKSk7Ci0gICAgZGsgPSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpICsKKyAgICBkayA9IFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlEaWN0S2V5c09iamVjdCkgKwogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeURpY3RLZXlFbnRyeSkgKiAoc2l6ZS0xKSk7CiAgICAgaWYgKGRrID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTM1Myw3ICszNTMsNyBAQAogICAgICAgICBQeV9YREVDUkVGKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgUHlfWERFQ1JFRihlbnRyaWVzW2ldLm1lX3ZhbHVlKTsKICAgICB9Ci0gICAgUHlNZW1fRlJFRShrZXlzKTsKKyAgICBQeU9iamVjdF9GUkVFKGtleXMpOwogfQogCiAjZGVmaW5lIG5ld192YWx1ZXMoc2l6ZSkgUHlNZW1fTkVXKFB5T2JqZWN0ICosIHNpemUpCkBAIC05NjQsNyArOTY0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhc3NlcnQob2xka2V5cy0+ZGtfcmVmY250ID09IDEpOwotICAgICAgICBES19ERUJVR19ERUNSRUYgUHlNZW1fRlJFRShvbGRrZXlzKTsKKyAgICAgICAgREtfREVCVUdfREVDUkVGIFB5T2JqZWN0X0ZSRUUob2xka2V5cyk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTE2MywzOSArMTE2Myw0MiBAQAogICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcihkcCwga3YpOwogfQogCi0vKiBGYXN0IHZlcnNpb24gb2YgZ2xvYmFsIHZhbHVlIGxvb2t1cC4KKy8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwIChMT0FEX0dMT0JBTCkuCiAgKiBMb29rdXAgaW4gZ2xvYmFscywgdGhlbiBidWlsdGlucy4KKyAqCisgKiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkIChleDogY29tcHV0aW5nIHRoZQorICoga2V5IGhhc2ggZmFpbGVkLCBrZXkgY29tcGFyaXNvbiBmYWlsZWQsIC4uLikuIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lc24ndAorICogZXhpc3QuIFJldHVybiB0aGUgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMuCiAgKi8KIFB5T2JqZWN0ICoKIF9QeURpY3RfTG9hZEdsb2JhbChQeURpY3RPYmplY3QgKmdsb2JhbHMsIFB5RGljdE9iamVjdCAqYnVpbHRpbnMsIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgUHlPYmplY3QgKng7Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpIHsKLSAgICAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKWtleSktPmhhc2g7Ci0gICAgICAgIGlmIChoYXNoICE9IC0xKSB7Ci0gICAgICAgICAgICBQeURpY3RLZXlFbnRyeSAqZTsKLSAgICAgICAgICAgIGUgPSBnbG9iYWxzLT5tYV9rZXlzLT5ka19sb29rdXAoZ2xvYmFscywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICAgICAgZSA9IGJ1aWx0aW5zLT5tYV9rZXlzLT5ka19sb29rdXAoYnVpbHRpbnMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCA9ICp2YWx1ZV9hZGRyOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KKyAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBQeURpY3RLZXlFbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHggPSBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcigoUHlPYmplY3QgKilnbG9iYWxzLCBrZXkpOwotICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiB4OwotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorCisgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KKyAgICBlbnRyeSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWJ1aWx0aW5zLCBrZXkpOworICAgIHZhbHVlID0gKnZhbHVlX2FkZHI7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIC8qIG5hbWVzcGFjZSAyOiBidWlsdGlucyAqLworICAgIGVudHJ5ID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAqdmFsdWVfYWRkcjsKIH0KIAogLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKQEAgLTE5MjAsNyArMTkyMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKK2RpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjb25zdCBjaGFyICptZXRobmFtZSkKIHsKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggYWFmZjBiYy4uN2JjOTMxMCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTU5LDE1ICs1OSwxMSBAQAogc3RhdGljIGludAogQmFzZUV4Y2VwdGlvbl9pbml0KFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICB0bXAgPSBzZWxmLT5hcmdzOwotICAgIHNlbGYtPmFyZ3MgPSBhcmdzOwotICAgIFB5X0lOQ1JFRihzZWxmLT5hcmdzKTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIFB5X1hTRVRSRUYoc2VsZi0+YXJncywgYXJncyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTMyOCwxMSArMzI0LDEwIEBACiAKIC8qIFN0ZWFscyBhIHJlZmVyZW5jZSB0byBjYXVzZSAqLwogdm9pZAotUHlFeGNlcHRpb25fU2V0Q2F1c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjYXVzZSkgewotICAgIFB5T2JqZWN0ICpvbGRfY2F1c2UgPSAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZTsKLSAgICAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZSA9IGNhdXNlOworUHlFeGNlcHRpb25fU2V0Q2F1c2UoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpjYXVzZSkKK3sKICAgICAoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5zdXBwcmVzc19jb250ZXh0ID0gMTsKLSAgICBQeV9YREVDUkVGKG9sZF9jYXVzZSk7CisgICAgUHlfWFNFVFJFRigoKFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqKXNlbGYpLT5jYXVzZSwgY2F1c2UpOwogfQogCiBQeU9iamVjdCAqCkBAIC0zNDQsMTAgKzMzOSw5IEBACiAKIC8qIFN0ZWFscyBhIHJlZmVyZW5jZSB0byBjb250ZXh0ICovCiB2b2lkCi1QeUV4Y2VwdGlvbl9TZXRDb250ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY29udGV4dCkgewotICAgIFB5T2JqZWN0ICpvbGRfY29udGV4dCA9ICgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNvbnRleHQ7Ci0gICAgKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+Y29udGV4dCA9IGNvbnRleHQ7Ci0gICAgUHlfWERFQ1JFRihvbGRfY29udGV4dCk7CitQeUV4Y2VwdGlvbl9TZXRDb250ZXh0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqY29udGV4dCkKK3sKKyAgICBQeV9YU0VUUkVGKCgoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZiktPmNvbnRleHQsIGNvbnRleHQpOwogfQogCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvZmxvYXRvYmplY3QuYyBiL09iamVjdHMvZmxvYXRvYmplY3QuYwppbmRleCBkOTJiZWMzLi5kYTYwMGY0IDEwMDY0NAotLS0gYS9PYmplY3RzL2Zsb2F0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9mbG9hdG9iamVjdC5jCkBAIC0yMTUsMzUgKzIxNSw0OSBAQAogUHlGbG9hdF9Bc0RvdWJsZShQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlOdW1iZXJNZXRob2RzICpuYjsKLSAgICBQeUZsb2F0T2JqZWN0ICpmbzsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIGRvdWJsZSB2YWw7CiAKLSAgICBpZiAob3AgJiYgUHlGbG9hdF9DaGVjayhvcCkpCi0gICAgICAgIHJldHVybiBQeUZsb2F0X0FTX0RPVUJMRSgoUHlGbG9hdE9iamVjdCopIG9wKTsKLQogICAgIGlmIChvcCA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEFyZ3VtZW50KCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoKG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcikgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYSBmbG9hdCBpcyByZXF1aXJlZCIpOworICAgIGlmIChQeUZsb2F0X0NoZWNrKG9wKSkgeworICAgICAgICByZXR1cm4gUHlGbG9hdF9BU19ET1VCTEUob3ApOworICAgIH0KKworICAgIG5iID0gUHlfVFlQRShvcCktPnRwX2FzX251bWJlcjsKKyAgICBpZiAobmIgPT0gTlVMTCB8fCBuYi0+bmJfZmxvYXQgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAibXVzdCBiZSByZWFsIG51bWJlciwgbm90ICUuNTBzIiwKKyAgICAgICAgICAgICAgICAgICAgIG9wLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZvID0gKFB5RmxvYXRPYmplY3QqKSAoKm5iLT5uYl9mbG9hdCkgKG9wKTsKLSAgICBpZiAoZm8gPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmICghUHlGbG9hdF9DaGVjayhmbykpIHsKLSAgICAgICAgUHlfREVDUkVGKGZvKTsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJuYl9mbG9hdCBzaG91bGQgcmV0dXJuIGZsb2F0IG9iamVjdCIpOworICAgIHJlcyA9ICgqbmItPm5iX2Zsb2F0KSAob3ApOworICAgIGlmIChyZXMgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmICghUHlGbG9hdF9DaGVja0V4YWN0KHJlcykpIHsKKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKHJlcykpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcC0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAiJS41MHMuX19mbG9hdF9fIHJldHVybmVkIG5vbi1mbG9hdCAodHlwZSAlLjUwcykuICAiCisgICAgICAgICAgICAgICAgIlRoZSBhYmlsaXR5IHRvIHJldHVybiBhbiBpbnN0YW5jZSBvZiBhIHN0cmljdCBzdWJjbGFzcyBvZiBmbG9hdCAiCisgICAgICAgICAgICAgICAgImlzIGRlcHJlY2F0ZWQsIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFB5dGhvbi4iLAorICAgICAgICAgICAgICAgIG9wLT5vYl90eXBlLT50cF9uYW1lLCByZXMtPm9iX3R5cGUtPnRwX25hbWUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKGZvKTsKLSAgICBQeV9ERUNSRUYoZm8pOwotCisgICAgdmFsID0gUHlGbG9hdF9BU19ET1VCTEUocmVzKTsKKyAgICBQeV9ERUNSRUYocmVzKTsKICAgICByZXR1cm4gdmFsOwogfQogCkBAIC0xMTk1LDcgKzEyMDksNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIGZsb2F0X2Zyb21oZXgoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0X2FzX2Zsb2F0LCAqcmVzdWx0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgZG91YmxlIHg7CiAgICAgbG9uZyBleHAsIHRvcF9leHAsIGxzYiwga2V5X2RpZ2l0OwogICAgIGNoYXIgKnMsICpjb2VmZl9zdGFydCwgKnNfc3RvcmUsICpjb2VmZl9lbmQsICpleHBfc3RhcnQsICpzX2VuZDsKQEAgLTE0MTAsMTEgKzE0MjQsMTAgQEAKICAgICAgICAgcysrOwogICAgIGlmIChzICE9IHNfZW5kKQogICAgICAgICBnb3RvIHBhcnNlX2Vycm9yOwotICAgIHJlc3VsdF9hc19mbG9hdCA9IFB5X0J1aWxkVmFsdWUoIihkKSIsIG5lZ2F0ZSA/IC14IDogeCk7Ci0gICAgaWYgKHJlc3VsdF9hc19mbG9hdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBQeU9iamVjdF9DYWxsT2JqZWN0KGNscywgcmVzdWx0X2FzX2Zsb2F0KTsKLSAgICBQeV9ERUNSRUYocmVzdWx0X2FzX2Zsb2F0KTsKKyAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUobmVnYXRlID8gLXggOiB4KTsKKyAgICBpZiAoY2xzICE9IChQeU9iamVjdCAqKSZQeUZsb2F0X1R5cGUgJiYgcmVzdWx0ICE9IE5VTEwpIHsKKyAgICAgICAgUHlfU0VUUkVGKHJlc3VsdCwgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhjbHMsIHJlc3VsdCwgTlVMTCkpOworICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogCiAgIG92ZXJmbG93X2Vycm9yOgpAQCAtMTQ1MSwyOSArMTQ2NCwyMyBAQAogICAgIGludCBleHBvbmVudDsKICAgICBpbnQgaTsKIAotICAgIFB5T2JqZWN0ICpwcmV2OwogICAgIFB5T2JqZWN0ICpweV9leHBvbmVudCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm51bWVyYXRvciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmRlbm9taW5hdG9yID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVzdWx0X3BhaXIgPSBOVUxMOwogICAgIFB5TnVtYmVyTWV0aG9kcyAqbG9uZ19tZXRob2RzID0gUHlMb25nX1R5cGUudHBfYXNfbnVtYmVyOwogCi0jZGVmaW5lIElOUExBQ0VfVVBEQVRFKG9iaiwgY2FsbCkgXAotICAgIHByZXYgPSBvYmo7IFwKLSAgICBvYmogPSBjYWxsOyBcCi0gICAgUHlfREVDUkVGKHByZXYpOyBcCi0KICAgICBDT05WRVJUX1RPX0RPVUJMRSh2LCBzZWxmKTsKIAogICAgIGlmIChQeV9JU19JTkZJTklUWShzZWxmKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXNzIGluZmluaXR5IHRvIGZsb2F0LmFzX2ludGVnZXJfcmF0aW8uIik7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKFB5X0lTX05BTihzZWxmKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBwYXNzIE5hTiB0byBmbG9hdC5hc19pbnRlZ2VyX3JhdGlvLiIpOwotICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoImFzX2ludGVnZXJfcmF0aW8iLCBnb3RvIGVycm9yKTsKQEAgLTE0ODksMjkgKzE0OTYsMzEgQEAKICAgICAgICB0byBiZSB0cnVuY2F0ZWQgYnkgUHlMb25nX0Zyb21Eb3VibGUoKS4gKi8KIAogICAgIG51bWVyYXRvciA9IFB5TG9uZ19Gcm9tRG91YmxlKGZsb2F0X3BhcnQpOwotICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgZ290byBlcnJvcjsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7CisgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcoUHlfQUJTKGV4cG9uZW50KSk7CisgICAgaWYgKHB5X2V4cG9uZW50ID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICAvKiBmb2xkIGluIDIqKmV4cG9uZW50ICovCi0gICAgZGVub21pbmF0b3IgPSBQeUxvbmdfRnJvbUxvbmcoMSk7Ci0gICAgcHlfZXhwb25lbnQgPSBQeUxvbmdfRnJvbUxvbmcobGFicygobG9uZylleHBvbmVudCkpOwotICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwotICAgIElOUExBQ0VfVVBEQVRFKHB5X2V4cG9uZW50LAotICAgICAgICAgICAgICAgICAgIGxvbmdfbWV0aG9kcy0+bmJfbHNoaWZ0KGRlbm9taW5hdG9yLCBweV9leHBvbmVudCkpOwotICAgIGlmIChweV9leHBvbmVudCA9PSBOVUxMKSBnb3RvIGVycm9yOwogICAgIGlmIChleHBvbmVudCA+IDApIHsKLSAgICAgICAgSU5QTEFDRV9VUERBVEUobnVtZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX211bHRpcGx5KG51bWVyYXRvciwgcHlfZXhwb25lbnQpKTsKLSAgICAgICAgaWYgKG51bWVyYXRvciA9PSBOVUxMKSBnb3RvIGVycm9yOworICAgICAgICBQeV9TRVRSRUYobnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgbG9uZ19tZXRob2RzLT5uYl9sc2hpZnQobnVtZXJhdG9yLCBweV9leHBvbmVudCkpOworICAgICAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgUHlfREVDUkVGKGRlbm9taW5hdG9yKTsKLSAgICAgICAgZGVub21pbmF0b3IgPSBweV9leHBvbmVudDsKLSAgICAgICAgcHlfZXhwb25lbnQgPSBOVUxMOworICAgICAgICBQeV9TRVRSRUYoZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICBsb25nX21ldGhvZHMtPm5iX2xzaGlmdChkZW5vbWluYXRvciwgcHlfZXhwb25lbnQpKTsKKyAgICAgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIHJlc3VsdF9wYWlyID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwogCi0jdW5kZWYgSU5QTEFDRV9VUERBVEUKIGVycm9yOgogICAgIFB5X1hERUNSRUYocHlfZXhwb25lbnQpOwogICAgIFB5X1hERUNSRUYoZGVub21pbmF0b3IpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jIGIvT2JqZWN0cy9mcmFtZW9iamVjdC5jCmluZGV4IDlhYWRkNjEuLmIxMTU2MTQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnJhbWVvYmplY3QuYworKysgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICBuZXdfbGFzdGkgPSAtMTsKICAgICAgICAgZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCBsbm90YWJfbGVuOyBvZmZzZXQgKz0gMikgewogICAgICAgICAgICAgYWRkciArPSBsbm90YWJbb2Zmc2V0XTsKLSAgICAgICAgICAgIGxpbmUgKz0gbG5vdGFiW29mZnNldCsxXTsKKyAgICAgICAgICAgIGxpbmUgKz0gKHNpZ25lZCBjaGFyKWxub3RhYltvZmZzZXQrMV07CiAgICAgICAgICAgICBpZiAobGluZSA+PSBuZXdfbGluZW5vKSB7CiAgICAgICAgICAgICAgICAgbmV3X2xhc3RpID0gYWRkcjsKICAgICAgICAgICAgICAgICBuZXdfbGluZW5vID0gbGluZTsKQEAgLTE4OSw3ICsxODksNyBAQAogICAgIG1lbXNldChibG9ja3N0YWNrLCAnXDAnLCBzaXplb2YoYmxvY2tzdGFjaykpOwogICAgIG1lbXNldChpbl9maW5hbGx5LCAnXDAnLCBzaXplb2YoaW5fZmluYWxseSkpOwogICAgIGJsb2Nrc3RhY2tfdG9wID0gMDsKLSAgICBmb3IgKGFkZHIgPSAwOyBhZGRyIDwgY29kZV9sZW47IGFkZHIrKykgeworICAgIGZvciAoYWRkciA9IDA7IGFkZHIgPCBjb2RlX2xlbjsgYWRkciArPSAyKSB7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgb3AgPSBjb2RlW2FkZHJdOwogICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgIGNhc2UgU0VUVVBfTE9PUDoKQEAgLTI1MSwxMCArMjUxLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBpZiAob3AgPj0gSEFWRV9BUkdVTUVOVCkgewotICAgICAgICAgICAgYWRkciArPSAyOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyogVmVyaWZ5IHRoYXQgdGhlIGJsb2Nrc3RhY2sgdHJhY2tpbmcgY29kZSBkaWRuJ3QgZ2V0IGxvc3QuICovCkBAIC0yNzcsNyArMjczLDcgQEAKICAgICAgKiBjYW4gdGVsbCB3aGV0aGVyIHRoZSBqdW1wIGdvZXMgaW50byBhbnkgYmxvY2tzIHdpdGhvdXQgY29taW5nIG91dAogICAgICAqIGFnYWluIC0gaW4gdGhhdCBjYXNlIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbiBiZWxvdy4gKi8KICAgICBkZWx0YV9pYmxvY2sgPSAwOwotICAgIGZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIrKykgeworICAgIGZvciAoYWRkciA9IG1pbl9hZGRyOyBhZGRyIDwgbWF4X2FkZHI7IGFkZHIgKz0gMikgewogICAgICAgICB1bnNpZ25lZCBjaGFyIG9wID0gY29kZVthZGRyXTsKICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICBjYXNlIFNFVFVQX0xPT1A6CkBAIC0yOTQsMTAgKzI5MCw2IEBACiAgICAgICAgIH0KIAogICAgICAgICBtaW5fZGVsdGFfaWJsb2NrID0gUHlfTUlOKG1pbl9kZWx0YV9pYmxvY2ssIGRlbHRhX2libG9jayk7Ci0KLSAgICAgICAgaWYgKG9wID49IEhBVkVfQVJHVU1FTlQpIHsKLSAgICAgICAgICAgIGFkZHIgKz0gMjsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qIERlcml2ZSB0aGUgYWJzb2x1dGUgaWJsb2NrIHZhbHVlcyBmcm9tIHRoZSBkZWx0YXMuICovCmRpZmYgLS1naXQgYS9PYmplY3RzL2Z1bmNvYmplY3QuYyBiL09iamVjdHMvZnVuY29iamVjdC5jCmluZGV4IGU2YzMyN2QuLjI2MWMxNmQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZnVuY29iamVjdC5jCisrKyBiL09iamVjdHMvZnVuY29iamVjdC5jCkBAIC0yNDksNyArMjQ5LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2NvZGUoUHlGdW5jdGlvbk9iamVjdCAqb3AsIFB5T2JqZWN0ICp2YWx1ZSkKIHsKLSAgICBQeU9iamVjdCAqdG1wOwogICAgIFB5X3NzaXplX3QgbmZyZWUsIG5jbG9zdXJlOwogCiAgICAgLyogTm90IGxlZ2FsIHRvIGRlbCBmLmZ1bmNfY29kZSBvciB0byBzZXQgaXQgdG8gYW55dGhpbmcKQEAgLTI3MCwxMCArMjY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgIG5jbG9zdXJlLCBuZnJlZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfY29kZTsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2NvZGUgPSB2YWx1ZTsKLSAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2NvZGUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjg3LDggKzI4NCw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9uYW1lKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5mdW5jX25hbWUgb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTI5NiwxMCArMjkxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX25hbWVfXyBtdXN0IGJlIHNldCB0byBhIHN0cmluZyBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19uYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmZ1bmNfbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfbmFtZSwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zMTMsOCArMzA2LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X3F1YWxuYW1lKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIC8qIE5vdCBsZWdhbCB0byBkZWwgZi5fX3F1YWxuYW1lX18gb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTMyMiwxMCArMzEzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfcXVhbG5hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19xdWFsbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfcXVhbG5hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzQzLDggKzMzMiw2IEBACiBzdGF0aWMgaW50CiBmdW5jX3NldF9kZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBMZWdhbCB0byBkZWwgZi5mdW5jX2RlZmF1bHRzLgogICAgICAqIENhbiBvbmx5IHNldCBmdW5jX2RlZmF1bHRzIHRvIE5VTEwgb3IgYSB0dXBsZS4gKi8KICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKQEAgLTM1NCwxMCArMzQxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX2RlZmF1bHRzX18gbXVzdCBiZSBzZXQgdG8gYSB0dXBsZSBvYmplY3QiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICB0bXAgPSBvcC0+ZnVuY19kZWZhdWx0czsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19kZWZhdWx0cyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICBQeV9YU0VUUkVGKG9wLT5mdW5jX2RlZmF1bHRzLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM3NSw4ICszNjAsNiBAQAogc3RhdGljIGludAogZnVuY19zZXRfa3dkZWZhdWx0cyhQeUZ1bmN0aW9uT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkKICAgICAgICAgdmFsdWUgPSBOVUxMOwogICAgIC8qIExlZ2FsIHRvIGRlbCBmLmZ1bmNfa3dkZWZhdWx0cy4KQEAgLTM4NiwxMCArMzY5LDggQEAKICAgICAgICAgICAgICJfX2t3ZGVmYXVsdHNfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Qgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmZ1bmNfa3dkZWZhdWx0czsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+ZnVuY19rd2RlZmF1bHRzID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfa3dkZWZhdWx0cywgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MDgsOCArMzg5LDYgQEAKIHN0YXRpYyBpbnQKIGZ1bmNfc2V0X2Fubm90YXRpb25zKFB5RnVuY3Rpb25PYmplY3QgKm9wLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKQogICAgICAgICB2YWx1ZSA9IE5VTEw7CiAgICAgLyogTGVnYWwgdG8gZGVsIGYuZnVuY19hbm5vdGF0aW9ucy4KQEAgLTQyMCwxMCArMzk5LDggQEAKICAgICAgICAgICAgICJfX2Fubm90YXRpb25zX18gbXVzdCBiZSBzZXQgdG8gYSBkaWN0IG9iamVjdCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHRtcCA9IG9wLT5mdW5jX2Fubm90YXRpb25zOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgIG9wLT5mdW5jX2Fubm90YXRpb25zID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmZ1bmNfYW5ub3RhdGlvbnMsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9nZW5vYmplY3QuYyBiL09iamVjdHMvZ2Vub2JqZWN0LmMKaW5kZXggYjNlMGE0Ni4uYzAyOGRiNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9nZW5vYmplY3QuYworKysgYi9PYmplY3RzL2dlbm9iamVjdC5jCkBAIC0xODcsNyArMTg3LDcgQEAKICAgICAgICAgICAgIC8qIFBvcCB0aGUgZXhjZXB0aW9uIGJlZm9yZSBpc3N1aW5nIGEgd2FybmluZy4gKi8KICAgICAgICAgICAgIFB5RXJyX0ZldGNoKCZleGMsICZ2YWwsICZ0Yik7CiAKLSAgICAgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yICclLjUwUycgcmFpc2VkIFN0b3BJdGVyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuLT5naV9xdWFsbmFtZSkpIHsKICAgICAgICAgICAgICAgICAvKiBXYXJuaW5nIHdhcyBjb252ZXJ0ZWQgdG8gYW4gZXJyb3IuICovCkBAIC0yNzcsNyArMjc3LDcgQEAKICAgICAgICAgUHlPYmplY3QgKmJ5dGVjb2RlID0gZi0+Zl9jb2RlLT5jb19jb2RlOwogICAgICAgICB1bnNpZ25lZCBjaGFyICpjb2RlID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhieXRlY29kZSk7CiAKLSAgICAgICAgaWYgKGNvZGVbZi0+Zl9sYXN0aSArIDFdICE9IFlJRUxEX0ZST00pCisgICAgICAgIGlmIChjb2RlW2YtPmZfbGFzdGkgKyAyXSAhPSBZSUVMRF9GUk9NKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHlmID0gZi0+Zl9zdGFja3RvcFstMV07CiAgICAgICAgIFB5X0lOQ1JFRih5Zik7CkBAIC0zNzYsNyArMzc2LDcgQEAKICAgICAgICAgICAgIGFzc2VydChyZXQgPT0geWYpOwogICAgICAgICAgICAgUHlfREVDUkVGKHJldCk7CiAgICAgICAgICAgICAvKiBUZXJtaW5hdGlvbiByZXBldGl0aW9uIG9mIFlJRUxEX0ZST00gKi8KLSAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkrKzsKKyAgICAgICAgICAgIGdlbi0+Z2lfZnJhbWUtPmZfbGFzdGkgKz0gMjsKICAgICAgICAgICAgIGlmIChfUHlHZW5fRmV0Y2hTdG9wSXRlcmF0aW9uVmFsdWUoJnZhbCkgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldCA9IGdlbl9zZW5kX2V4KGdlbiwgdmFsLCAwLCAwKTsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsKTsKQEAgLTUxOSw4ICs1MTksNiBAQAogc3RhdGljIGludAogZ2VuX3NldF9uYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5naV9uYW1lIG9yIHRvIHNldCBpdCB0byBhbnl0aGluZwogICAgICAqIG90aGVyIHRoYW4gYSBzdHJpbmcgb2JqZWN0LiAqLwogICAgIGlmICh2YWx1ZSA9PSBOVUxMIHx8ICFQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CkBAIC01MjgsMTAgKzUyNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiX19uYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX25hbWU7CiAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICBvcC0+Z2lfbmFtZSA9IHZhbHVlOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYob3AtPmdpX25hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTQ1LDggKzU0MSw2IEBACiBzdGF0aWMgaW50CiBnZW5fc2V0X3F1YWxuYW1lKFB5R2VuT2JqZWN0ICpvcCwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICAvKiBOb3QgbGVnYWwgdG8gZGVsIGdlbi5fX3F1YWxuYW1lX18gb3IgdG8gc2V0IGl0IHRvIGFueXRoaW5nCiAgICAgICogb3RoZXIgdGhhbiBhIHN0cmluZyBvYmplY3QuICovCiAgICAgaWYgKHZhbHVlID09IE5VTEwgfHwgIVB5VW5pY29kZV9DaGVjayh2YWx1ZSkpIHsKQEAgLTU1NCwxMCArNTQ4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJfX3F1YWxuYW1lX18gbXVzdCBiZSBzZXQgdG8gYSBzdHJpbmcgb2JqZWN0Iik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgdG1wID0gb3AtPmdpX3F1YWxuYW1lOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgb3AtPmdpX3F1YWxuYW1lID0gdmFsdWU7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfWFNFVFJFRihvcC0+Z2lfcXVhbG5hbWUsIHZhbHVlKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0b2JqZWN0LmMgYi9PYmplY3RzL2xpc3RvYmplY3QuYwppbmRleCBkNjg4MTc5Li5kZGMwZmVlIDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3RvYmplY3QuYworKysgYi9PYmplY3RzL2xpc3RvYmplY3QuYwpAQCAtODIsNiArODIsMTYgQEAKIHN0YXRpYyB2b2lkCiBzaG93X2FsbG9jKHZvaWQpCiB7CisgICAgUHlPYmplY3QgKnhvcHRpb25zLCAqdmFsdWU7CisgICAgX1B5X0lERU5USUZJRVIoc2hvd2FsbG9jY291bnQpOworCisgICAgeG9wdGlvbnMgPSBQeVN5c19HZXRYT3B0aW9ucygpOworICAgIGlmICh4b3B0aW9ucyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgdmFsdWUgPSBfUHlEaWN0X0dldEl0ZW1JZCh4b3B0aW9ucywgJlB5SWRfc2hvd2FsbG9jY291bnQpOworICAgIGlmICh2YWx1ZSAhPSBQeV9UcnVlKQorICAgICAgICByZXR1cm47CisKICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgYWxsb2NhdGlvbnM6ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsCiAgICAgICAgIGNvdW50X2FsbG9jKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkxpc3QgcmV1c2UgdGhyb3VnaCBmcmVlbGlzdDogJSIgUFlfRk9STUFUX1NJWkVfVApAQCAtMjE2LDcgKzIyNiw2IEBACiBQeUxpc3RfU2V0SXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwKICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuZXdpdGVtKQogewotICAgIFB5T2JqZWN0ICpvbGRpdGVtOwogICAgIFB5T2JqZWN0ICoqcDsKICAgICBpZiAoIVB5TGlzdF9DaGVjayhvcCkpIHsKICAgICAgICAgUHlfWERFQ1JFRihuZXdpdGVtKTsKQEAgLTIzMCw5ICsyMzksNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIHAgPSAoKFB5TGlzdE9iamVjdCAqKW9wKSAtPiBvYl9pdGVtICsgaTsKLSAgICBvbGRpdGVtID0gKnA7Ci0gICAgKnAgPSBuZXdpdGVtOwotICAgIFB5X1hERUNSRUYob2xkaXRlbSk7CisgICAgUHlfWFNFVFJFRigqcCwgbmV3aXRlbSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI1MSw3ICsyNTgsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPT0gLTEpCisgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG4rMSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAod2hlcmUgPCAwKSB7CkBAIC0yOTEsNyArMjk4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBuKzEpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgUHlfSU5DUkVGKHYpOwpAQCAtNzExLDcgKzcxOCw3IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogICAgIH0KIAotICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pID09IC0xKQorICAgIGlmIChsaXN0X3Jlc2l6ZShzZWxmLCBzaXplKm4pIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBwID0gc2l6ZTsKQEAgLTczMCw3ICs3MzcsNiBAQAogc3RhdGljIGludAogbGlzdF9hc3NfaXRlbShQeUxpc3RPYmplY3QgKmEsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpCiB7Ci0gICAgUHlPYmplY3QgKm9sZF92YWx1ZTsKICAgICBpZiAoaSA8IDAgfHwgaSA+PSBQeV9TSVpFKGEpKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKQEAgLTczOSw5ICs3NDUsNyBAQAogICAgIGlmICh2ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBsaXN0X2Fzc19zbGljZShhLCBpLCBpKzEsIHYpOwogICAgIFB5X0lOQ1JFRih2KTsKLSAgICBvbGRfdmFsdWUgPSBhLT5vYl9pdGVtW2ldOwotICAgIGEtPm9iX2l0ZW1baV0gPSB2OwotICAgIFB5X0RFQ1JFRihvbGRfdmFsdWUpOworICAgIFB5X1NFVFJFRihhLT5vYl9pdGVtW2ldLCB2KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODA0LDcgKzgwOCw3IEBACiAgICAgICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICAgICAgfQogICAgICAgICBtID0gUHlfU0laRShzZWxmKTsKLSAgICAgICAgaWYgKGxpc3RfcmVzaXplKHNlbGYsIG0gKyBuKSA9PSAtMSkgeworICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbSArIG4pIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTgzMiw3ICs4MzYsNyBAQAogCiAgICAgLyogR3Vlc3MgYSByZXN1bHQgbGlzdCBzaXplLiAqLwogICAgIG4gPSBQeU9iamVjdF9MZW5ndGhIaW50KGIsIDgpOwotICAgIGlmIChuID09IC0xKSB7CisgICAgaWYgKG4gPCAwKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTg0MCw3ICs4NDQsNyBAQAogICAgIG1uID0gbSArIG47CiAgICAgaWYgKG1uID49IG0pIHsKICAgICAgICAgLyogTWFrZSByb29tLiAqLwotICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pID09IC0xKQorICAgICAgICBpZiAobGlzdF9yZXNpemUoc2VsZiwgbW4pIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIC8qIE1ha2UgdGhlIGxpc3Qgc2FuZSBhZ2Fpbi4gKi8KICAgICAgICAgUHlfU0laRShzZWxmKSA9IG07CmRpZmYgLS1naXQgYS9PYmplY3RzL2xpc3Rzb3J0LnR4dCBiL09iamVjdHMvbGlzdHNvcnQudHh0CmluZGV4IDgzMmU0ZjIuLmZlZjk4MmYgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbGlzdHNvcnQudHh0CisrKyBiL09iamVjdHMvbGlzdHNvcnQudHh0CkBAIC00ODYsNyArNDg2LDcgQEAKIEkgZmlyc3QgbGVhcm5lZCBhYm91dCB0aGUgZ2FsbG9waW5nIHN0cmF0ZWd5IGluIGEgcmVsYXRlZCBjb250ZXh0OyBzZWU6CiAKICAgICAiQWRhcHRpdmUgU2V0IEludGVyc2VjdGlvbnMsIFVuaW9ucywgYW5kIERpZmZlcmVuY2VzIiAoMjAwMCkKLSAgICBFcmlrIEQuIERlbWFpbmUsIEFsZWphbmRybyBM83Blei1PcnRpeiwgSi4gSWFuIE11bnJvCisgICAgRXJpayBELiBEZW1haW5lLCBBbGVqYW5kcm8gTMOzcGV6LU9ydGl6LCBKLiBJYW4gTXVucm8KIAogYW5kIGl0cyBmb2xsb3d1cChzKS4gIEFuIGVhcmxpZXIgcGFwZXIgY2FsbGVkIHRoZSBzYW1lIHN0cmF0ZWd5CiAiZXhwb25lbnRpYWwgc2VhcmNoIjoKZGlmZiAtLWdpdCBhL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dCBiL09iamVjdHMvbG5vdGFiX25vdGVzLnR4dAppbmRleCBkMjQ3ZWRkLi41MTUzNzU3IDEwMDY0NAotLS0gYS9PYmplY3RzL2xub3RhYl9ub3Rlcy50eHQKKysrIGIvT2JqZWN0cy9sbm90YWJfbm90ZXMudHh0CkBAIC0xMiw0MiArMTIsNDcgQEAKICAgICAgICAgMAkJICAgIDEKICAgICAgICAgNgkJICAgIDIKICAgICAgICA1MAkJICAgIDcKLSAgICAgIDM1MCAgICAgICAgICAgICAgICAgMzA3Ci0gICAgICAzNjEgICAgICAgICAgICAgICAgIDMwOAorICAgICAgMzUwICAgICAgICAgICAgICAgICAyMDcKKyAgICAgIDM2MSAgICAgICAgICAgICAgICAgMjA4CiAKIEluc3RlYWQgb2Ygc3RvcmluZyB0aGVzZSBudW1iZXJzIGxpdGVyYWxseSwgd2UgY29tcHJlc3MgdGhlIGxpc3QgYnkgc3RvcmluZyBvbmx5Ci10aGUgaW5jcmVtZW50cyBmcm9tIG9uZSByb3cgdG8gdGhlIG5leHQuICBDb25jZXB0dWFsbHksIHRoZSBzdG9yZWQgbGlzdCBtaWdodAordGhlIGRpZmZlcmVuY2UgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LiAgQ29uY2VwdHVhbGx5LCB0aGUgc3RvcmVkIGxpc3QgbWlnaHQKIGxvb2sgbGlrZToKIAotICAgIDAsIDEsICA2LCAxLCAgNDQsIDUsICAzMDAsIDMwMCwgIDExLCAxCisgICAgMCwgMSwgIDYsIDEsICA0NCwgNSwgIDMwMCwgMjAwLCAgMTEsIDEKIAotVGhlIGFib3ZlIGRvZXNuJ3QgcmVhbGx5IHdvcmssIGJ1dCBpdCdzIGEgc3RhcnQuIE5vdGUgdGhhdCBhbiB1bnNpZ25lZCBieXRlCi1jYW4ndCBob2xkIG5lZ2F0aXZlIHZhbHVlcywgb3IgdmFsdWVzIGxhcmdlciB0aGFuIDI1NSwgYW5kIHRoZSBhYm92ZSBleGFtcGxlCi1jb250YWlucyB0d28gc3VjaCB2YWx1ZXMuIFNvIHdlIG1ha2UgdHdvIHR3ZWFrczoKK1RoZSBhYm92ZSBkb2Vzbid0IHJlYWxseSB3b3JrLCBidXQgaXQncyBhIHN0YXJ0LiBBbiB1bnNpZ25lZCBieXRlIChieXRlIGNvZGUKK29mZnNldCkgY2FuJ3QgaG9sZCBuZWdhdGl2ZSB2YWx1ZXMsIG9yIHZhbHVlcyBsYXJnZXIgdGhhbiAyNTUsIGEgc2lnbmVkIGJ5dGUKKyhsaW5lIG51bWJlcikgY2FuJ3QgaG9sZCB2YWx1ZXMgbGFyZ2VyIHRoYW4gMTI3IG9yIGxlc3MgdGhhbiAtMTI4LCBhbmQgdGhlCithYm92ZSBleGFtcGxlIGNvbnRhaW5zIHR3byBzdWNoIHZhbHVlcy4gU28gd2UgbWFrZSB0d28gdHdlYWtzOgogCi0gKGEpIHRoZXJlJ3MgYSBkZWVwIGFzc3VtcHRpb24gdGhhdCBieXRlIGNvZGUgb2Zmc2V0cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZwotIGxpbmUgI3MgYm90aCBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LCBhbmQKLSAoYikgaWYgYXQgbGVhc3Qgb25lIGNvbHVtbiBqdW1wcyBieSBtb3JlIHRoYW4gMjU1IGZyb20gb25lIHJvdyB0byB0aGUgbmV4dCwKLSBtb3JlIHRoYW4gb25lIHBhaXIgaXMgd3JpdHRlbiB0byB0aGUgdGFibGUuIEluIGNhc2UgI2IsIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cKLSBmcm9tIGxvb2tpbmcgYXQgdGhlIHRhYmxlIGxhdGVyIGhvdyBtYW55IHdlcmUgd3JpdHRlbi4gIFRoYXQncyB0aGUgZGVsaWNhdGUKLSBwYXJ0LiAgQSB1c2VyIG9mIGNvX2xub3RhYiBkZXNpcmluZyB0byBmaW5kIHRoZSBzb3VyY2UgbGluZSBudW1iZXIKLSBjb3JyZXNwb25kaW5nIHRvIGEgYnl0ZWNvZGUgYWRkcmVzcyBBIHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzCisgKGEpIHRoZXJlJ3MgYSBkZWVwIGFzc3VtcHRpb24gdGhhdCBieXRlIGNvZGUgb2Zmc2V0cyBpbmNyZWFzZSBtb25vdG9uaWNhbGx5LAorIGFuZAorIChiKSBpZiBieXRlIGNvZGUgb2Zmc2V0IGp1bXBzIGJ5IG1vcmUgdGhhbiAyNTUgZnJvbSBvbmUgcm93IHRvIHRoZSBuZXh0LCBvciBpZgorIHNvdXJjZSBjb2RlIGxpbmUgbnVtYmVyIGp1bXBzIGJ5IG1vcmUgdGhhbiAxMjcgb3IgbGVzcyB0aGFuIC0xMjggZnJvbSBvbmUgcm93CisgdG8gdGhlIG5leHQsIG1vcmUgdGhhbiBvbmUgcGFpciBpcyB3cml0dGVuIHRvIHRoZSB0YWJsZS4gSW4gY2FzZSAjYiwKKyB0aGVyZSdzIG5vIHdheSB0byBrbm93IGZyb20gbG9va2luZyBhdCB0aGUgdGFibGUgbGF0ZXIgaG93IG1hbnkgd2VyZSB3cml0dGVuLgorIFRoYXQncyB0aGUgZGVsaWNhdGUgcGFydC4gIEEgdXNlciBvZiBjb19sbm90YWIgZGVzaXJpbmcgdG8gZmluZCB0aGUgc291cmNlCisgbGluZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byBhIGJ5dGVjb2RlIGFkZHJlc3MgQSBzaG91bGQgZG8gc29tZXRoaW5nIGxpa2UKKyB0aGlzOgogCiAgICAgbGluZW5vID0gYWRkciA9IDAKICAgICBmb3IgYWRkcl9pbmNyLCBsaW5lX2luY3IgaW4gY29fbG5vdGFiOgogICAgICAgICBhZGRyICs9IGFkZHJfaW5jcgogICAgICAgICBpZiBhZGRyID4gQToKICAgICAgICAgICAgIHJldHVybiBsaW5lbm8KKyAgICAgICAgaWYgbGluZV9pbmNyID49IDB4ODA6CisgICAgICAgICAgICBsaW5lX2luY3IgLT0gMHgxMDAKICAgICAgICAgbGluZW5vICs9IGxpbmVfaW5jcgogCiAoSW4gQywgdGhpcyBpcyBpbXBsZW1lbnRlZCBieSBQeUNvZGVfQWRkcjJMaW5lKCkuKSAgSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywKIHdoZW4gdGhlIGFkZHIgZmllbGQgaW5jcmVtZW50cyBieSBtb3JlIHRoYW4gMjU1LCB0aGUgbGluZSAjIGluY3JlbWVudCBpbiBlYWNoCiBwYWlyIGdlbmVyYXRlZCBtdXN0IGJlIDAgdW50aWwgdGhlIHJlbWFpbmluZyBhZGRyIGluY3JlbWVudCBpcyA8IDI1Ni4gIFNvLCBpbgogdGhlIGV4YW1wbGUgYWJvdmUsIGFzc2VtYmxlX2xub3RhYiBpbiBjb21waWxlLmMgc2hvdWxkIG5vdCAoYXMgd2FzIGFjdHVhbGx5IGRvbmUKLXVudGlsIDIuMikgZXhwYW5kIDMwMCwgMzAwIHRvCit1bnRpbCAyLjIpIGV4cGFuZCAzMDAsIDIwMCB0bwogICAgIDI1NSwgMjU1LCA0NSwgNDUsCiBidXQgdG8KLSAgICAyNTUsIDAsIDQ1LCAyNTUsIDAsIDQ1LgorICAgIDI1NSwgMCwgNDUsIDEyOCwgMCwgNzIuCiAKIFRoZSBhYm92ZSBpcyBzdWZmaWNpZW50IHRvIHJlY29uc3RydWN0IGxpbmUgbnVtYmVycyBmb3IgdHJhY2ViYWNrcywgYnV0IG5vdCBmb3IKIGxpbmUgdHJhY2luZy4gIFRyYWNpbmcgaXMgaGFuZGxlZCBieSBQeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKCkgaW4gY29kZW9iamVjdC5jCkBAIC05MCwxNiArOTUsMTYgQEAKICAgICAgICAgICAgICAgNiBQT1BfSlVNUF9JRl9GQUxTRSAgICAgICAxNwogCiAgIDMgICAgICAgICAgIDkgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgMTIgUFJJTlRfSVRFTSAgICAgICAgICAKKyAgICAgICAgICAgICAxMiBQUklOVF9JVEVNCiAKLSAgNCAgICAgICAgICAxMyBCUkVBS19MT09QICAgICAgICAgIAorICA0ICAgICAgICAgIDEzIEJSRUFLX0xPT1AKICAgICAgICAgICAgICAxNCBKVU1QX0FCU09MVVRFICAgICAgICAgICAgMwotICAgICAgICA+PiAgIDE3IFBPUF9CTE9DSyAgICAgICAgICAgCisgICAgICAgID4+ICAgMTcgUE9QX0JMT0NLCiAKICAgNiAgICAgICAgICAxOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMikKLSAgICAgICAgICAgICAyMSBQUklOVF9JVEVNICAgICAgICAgIAorICAgICAgICAgICAgIDIxIFBSSU5UX0lURU0KICAgICAgICAgPj4gICAyMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAyNSBSRVRVUk5fVkFMVUUgICAgICAgIAorICAgICAgICAgICAgIDI1IFJFVFVSTl9WQUxVRQogCiBJZiAnYScgaXMgZmFsc2UsIGV4ZWN1dGlvbiB3aWxsIGp1bXAgdG8gdGhlIFBPUF9CTE9DSyBpbnN0cnVjdGlvbiBhdCBvZmZzZXQgMTcKIGFuZCB0aGUgY29fbG5vdGFiIHdpbGwgY2xhaW0gdGhhdCBleGVjdXRpb24gaGFzIG1vdmVkIHRvIGxpbmUgNCwgd2hpY2ggaXMgd3JvbmcuCmRpZmYgLS1naXQgYS9PYmplY3RzL2xvbmdvYmplY3QuYyBiL09iamVjdHMvbG9uZ29iamVjdC5jCmluZGV4IGY2OGQxNWUuLjQ3MzI1NDUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbG9uZ29iamVjdC5jCisrKyBiL09iamVjdHMvbG9uZ29iamVjdC5jCkBAIC0xNTgyLDEwICsxNTgyLDEyIEBACiBzdGF0aWMgaW50CiBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKFB5T2JqZWN0ICphYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUJ5dGVzV3JpdGVyICpieXRlc193cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKipieXRlc19zdHIpCiB7CiAgICAgUHlMb25nT2JqZWN0ICpzY3JhdGNoLCAqYTsKLSAgICBQeU9iamVjdCAqc3RyOworICAgIFB5T2JqZWN0ICpzdHIgPSBOVUxMOwogICAgIFB5X3NzaXplX3Qgc2l6ZSwgc3RybGVuLCBzaXplX2EsIGksIGo7CiAgICAgZGlnaXQgKnBvdXQsICpwaW4sIHJlbSwgdGVucG93OwogICAgIGludCBuZWdhdGl2ZTsKQEAgLTE2NjIsNyArMTY2NCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGtpbmQgPSB3cml0ZXItPmtpbmQ7Ci0gICAgICAgIHN0ciA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAqYnl0ZXNfc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZShieXRlc193cml0ZXIsICpieXRlc19zdHIsIHN0cmxlbik7CisgICAgICAgIGlmICgqYnl0ZXNfc3RyID09IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgc3RyID0gUHlVbmljb2RlX05ldyhzdHJsZW4sICc5Jyk7CkBAIC0xNjczLDEzICsxNjgxLDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CiAgICAgfQogCi0jZGVmaW5lIFdSSVRFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAvKiBwb3V0WzBdIHRocm91Z2ggcG91dFtzaXplLTJdIGNvbnRyaWJ1dGUgZXhhY3RseSAgICAgICAgICAgIFwKICAgICAgICAgICAgX1B5TG9uZ19ERUNJTUFMX1NISUZUIGRpZ2l0cyBlYWNoICovICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZSAtIDE7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTY5OSw2ICsxNzAyLDE2IEBACiAgICAgICAgIC8qIGFuZCBzaWduICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAobmVnYXRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICotLXAgPSAnLSc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN0cmxlbjsgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAgPSAoVFlQRSopUHlVbmljb2RlX0RBVEEoc3RyKSArIHN0cmxlbjsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBXUklURV9ESUdJVFMocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIC8qIGNoZWNrIHdlJ3ZlIGNvdW50ZWQgY29ycmVjdGx5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3MDgsMjUgKzE3MjEsMzQgQEAKICAgICB9IHdoaWxlICgwKQogCiAgICAgLyogZmlsbCB0aGUgc3RyaW5nIHJpZ2h0LXRvLWxlZnQgKi8KLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgeworICAgIGlmIChieXRlc193cml0ZXIpIHsKKyAgICAgICAgY2hhciAqcCA9ICpieXRlc19zdHIgKyBzdHJsZW47CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIFB5X0RFQ1JFRihzY3JhdGNoKTsKICAgICBpZiAod3JpdGVyKSB7CiAgICAgICAgIHdyaXRlci0+cG9zICs9IHN0cmxlbjsKICAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICgqYnl0ZXNfc3RyKSArPSBzdHJsZW47CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHN0ciwgMSkpOwogICAgICAgICAqcF9vdXRwdXQgPSAoUHlPYmplY3QgKilzdHI7CkBAIC0xNzM4LDcgKzE3NjAsNyBAQAogbG9uZ190b19kZWNpbWFsX3N0cmluZyhQeU9iamVjdCAqYWEpCiB7CiAgICAgUHlPYmplY3QgKnY7Ci0gICAgaWYgKGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwoYWEsICZ2LCBOVUxMKSA9PSAtMSkKKyAgICBpZiAobG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChhYSwgJnYsIE5VTEwsIE5VTEwsIE5VTEwpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gdjsKIH0KQEAgLTE3NTAsMTAgKzE3NzIsMTEgQEAKIAogc3RhdGljIGludAogbG9uZ19mb3JtYXRfYmluYXJ5KFB5T2JqZWN0ICphYSwgaW50IGJhc2UsIGludCBhbHRlcm5hdGUsCi0gICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipwX291dHB1dCwgX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQorICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqcF9vdXRwdXQsIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwKKyAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqYnl0ZXNfd3JpdGVyLCBjaGFyICoqYnl0ZXNfc3RyKQogewogICAgIFB5TG9uZ09iamVjdCAqYSA9IChQeUxvbmdPYmplY3QgKilhYTsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBQeU9iamVjdCAqdiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzejsKICAgICBQeV9zc2l6ZV90IHNpemVfYTsKICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CkBAIC0xODEwLDcgKzE4MzMsMTEgQEAKICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN6LCAneCcpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBraW5kID0gd3JpdGVyLT5raW5kOwotICAgICAgICB2ID0gTlVMTDsKKyAgICB9CisgICAgZWxzZSBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgICpieXRlc19zdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKGJ5dGVzX3dyaXRlciwgKmJ5dGVzX3N0ciwgc3opOworICAgICAgICBpZiAoKmJ5dGVzX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdiA9IFB5VW5pY29kZV9OZXcoc3osICd4Jyk7CkBAIC0xODE5LDEzICsxODQ2LDggQEAKICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHYpOwogICAgIH0KIAotI2RlZmluZSBXUklURV9ESUdJVFMoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBXUklURV9ESUdJVFMocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCi0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChzaXplX2EgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJzAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xODYwLDMwICsxODgyLDUwIEBACiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChuZWdhdGl2ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAqLS1wID0gJy0nOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBXUklURV9VTklDT0RFX0RJR0lUUyhUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAod3JpdGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA9IChUWVBFKilQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcikgKyB3cml0ZXItPnBvcyArIHN6OyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwID0gKFRZUEUqKVB5VW5pY29kZV9EQVRBKHYpICsgc3o7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh3cml0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBhc3NlcnQocCA9PSAoKFRZUEUqKVB5VW5pY29kZV9EQVRBKHdyaXRlci0+YnVmZmVyKSArIHdyaXRlci0+cG9zKSk7IFwKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGFzc2VydChwID09IChUWVBFKilQeVVuaWNvZGVfREFUQSh2KSk7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlICgwKQogCi0gICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKKyAgICBpZiAoYnl0ZXNfd3JpdGVyKSB7CisgICAgICAgIGNoYXIgKnAgPSAqYnl0ZXNfc3RyICsgc3o7CisgICAgICAgIFdSSVRFX0RJR0lUUyhwKTsKKyAgICAgICAgYXNzZXJ0KHAgPT0gKmJ5dGVzX3N0cik7CisgICAgfQorICAgIGVsc2UgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgUHlfVUNTMSAqcDsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzEpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1MxKTsKICAgICB9CiAgICAgZWxzZSBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMkJZVEVfS0lORCkgewogICAgICAgICBQeV9VQ1MyICpwOwotICAgICAgICBXUklURV9ESUdJVFMoUHlfVUNTMik7CisgICAgICAgIFdSSVRFX1VOSUNPREVfRElHSVRTKFB5X1VDUzIpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlfVUNTNCAqcDsKICAgICAgICAgYXNzZXJ0IChraW5kID09IFB5VW5pY29kZV80QllURV9LSU5EKTsKLSAgICAgICAgV1JJVEVfRElHSVRTKFB5X1VDUzQpOworICAgICAgICBXUklURV9VTklDT0RFX0RJR0lUUyhQeV9VQ1M0KTsKICAgICB9CiAjdW5kZWYgV1JJVEVfRElHSVRTCisjdW5kZWYgV1JJVEVfVU5JQ09ERV9ESUdJVFMKIAogICAgIGlmICh3cml0ZXIpIHsKICAgICAgICAgd3JpdGVyLT5wb3MgKz0gc3o7CiAgICAgfQorICAgIGVsc2UgaWYgKGJ5dGVzX3dyaXRlcikgeworICAgICAgICAoKmJ5dGVzX3N0cikgKz0gc3o7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHYsIDEpKTsKICAgICAgICAgKnBfb3V0cHV0ID0gdjsKQEAgLTE4OTcsOSArMTkzOSw5IEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBpbnQgZXJyOwogICAgIGlmIChiYXNlID09IDEwKQotICAgICAgICBlcnIgPSBsb25nX3RvX2RlY2ltYWxfc3RyaW5nX2ludGVybmFsKG9iaiwgJnN0ciwgTlVMTCk7CisgICAgICAgIGVyciA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBlbHNlCi0gICAgICAgIGVyciA9IGxvbmdfZm9ybWF0X2JpbmFyeShvYmosIGJhc2UsIDEsICZzdHIsIE5VTEwpOworICAgICAgICBlcnIgPSBsb25nX2Zvcm1hdF9iaW5hcnkob2JqLCBiYXNlLCAxLCAmc3RyLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICBpZiAoZXJyID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gc3RyOwpAQCAtMTkxMSw5ICsxOTUzLDMxIEBACiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZSwgaW50IGFsdGVybmF0ZSkKIHsKICAgICBpZiAoYmFzZSA9PSAxMCkKLSAgICAgICAgcmV0dXJuIGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ190b19kZWNpbWFsX3N0cmluZ19pbnRlcm5hbChvYmosIE5VTEwsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIpOworICAgICAgICByZXR1cm4gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7Cit9CisKK2NoYXIqCitfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UsIGludCBhbHRlcm5hdGUpCit7CisgICAgY2hhciAqc3RyMjsKKyAgICBpbnQgcmVzOworICAgIHN0cjIgPSBzdHI7CisgICAgaWYgKGJhc2UgPT0gMTApCisgICAgICAgIHJlcyA9IGxvbmdfdG9fZGVjaW1hbF9zdHJpbmdfaW50ZXJuYWwob2JqLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlciwgJnN0cjIpOworICAgIGVsc2UKKyAgICAgICAgcmVzID0gbG9uZ19mb3JtYXRfYmluYXJ5KG9iaiwgYmFzZSwgYWx0ZXJuYXRlLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLCAmc3RyMik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGFzc2VydChzdHIyICE9IE5VTEwpOworICAgIHJldHVybiBzdHIyOwogfQogCiAvKiBUYWJsZSBvZiBkaWdpdCB2YWx1ZXMgZm9yIDgtYml0IHN0cmluZyAtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCkBAIC0yNzA1LDYgKzI3NjksMTMgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKTsKICAgICAgICAgcmV0dXJuIC0xLjA7CiAgICAgfQorICAgIGlmIChQeV9BQlMoUHlfU0laRSh2KSkgPD0gMSkgeworICAgICAgICAvKiBGYXN0IHBhdGg7IHNpbmdsZSBkaWdpdCBsb25nICgzMSBiaXRzKSB3aWxsIGNhc3Qgc2FmZWx5CisJICAgdG8gZG91YmxlLiAgVGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvZiBGUC9sb25nIG9wZXJhdGlvbnMKKwkgICBieSAyMCUuCisgICAgICAgICovCisgICAgICAgIHJldHVybiAoZG91YmxlKU1FRElVTV9WQUxVRSgoUHlMb25nT2JqZWN0ICopdik7CisgICAgfQogICAgIHggPSBfUHlMb25nX0ZyZXhwKChQeUxvbmdPYmplY3QgKil2LCAmZXhwb25lbnQpOwogICAgIGlmICgoeCA9PSAtMS4wICYmIFB5RXJyX09jY3VycmVkKCkpIHx8IGV4cG9uZW50ID4gREJMX01BWF9FWFApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCkBAIC0yOTUxLDggKzMwMjIsMTQgQEAKICAgICBpZiAoUHlfU0laRShhKSA8IDApIHsKICAgICAgICAgaWYgKFB5X1NJWkUoYikgPCAwKSB7CiAgICAgICAgICAgICB6ID0geF9hZGQoYSwgYik7Ci0gICAgICAgICAgICBpZiAoeiAhPSBOVUxMICYmIFB5X1NJWkUoeikgIT0gMCkKKyAgICAgICAgICAgIGlmICh6ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiB4X2FkZCByZWNlaXZlZCBhdCBsZWFzdCBvbmUgbXVsdGlwbGUtZGlnaXQgaW50LAorICAgICAgICAgICAgICAgICAgIGFuZCB0aHVzIHogbXVzdCBiZSBhIG11bHRpcGxlLWRpZ2l0IGludC4KKyAgICAgICAgICAgICAgICAgICBUaGF0IGFsc28gbWVhbnMgeiBpcyBub3QgYW4gZWxlbWVudCBvZgorICAgICAgICAgICAgICAgICAgIHNtYWxsX2ludHMsIHNvIG5lZ2F0aW5nIGl0IGluLXBsYWNlIGlzIHNhZmUuICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5X1JFRkNOVCh6KSA9PSAxKTsKICAgICAgICAgICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICB6ID0geF9zdWIoYiwgYSk7CkBAIC0yOTgzLDggKzMwNjAsMTAgQEAKICAgICAgICAgICAgIHogPSB4X3N1YihhLCBiKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgeiA9IHhfYWRkKGEsIGIpOwotICAgICAgICBpZiAoeiAhPSBOVUxMICYmIFB5X1NJWkUoeikgIT0gMCkKKyAgICAgICAgaWYgKHogIT0gTlVMTCkgeworICAgICAgICAgICAgYXNzZXJ0KFB5X1NJWkUoeikgPT0gMCB8fCBQeV9SRUZDTlQoeikgPT0gMSk7CiAgICAgICAgICAgICBQeV9TSVpFKHopID0gLShQeV9TSVpFKHopKTsKKyAgICAgICAgfQogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgaWYgKFB5X1NJWkUoYikgPCAwKQpAQCAtMzQzMSw2ICszNTEwLDUyIEBACiAgICAgcmV0dXJuIChQeU9iamVjdCAqKXo7CiB9CiAKKy8qIEZhc3QgbW9kdWxvIGRpdmlzaW9uIGZvciBzaW5nbGUtZGlnaXQgbG9uZ3MuICovCitzdGF0aWMgUHlPYmplY3QgKgorZmFzdF9tb2QoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCit7CisgICAgc2RpZ2l0IGxlZnQgPSBhLT5vYl9kaWdpdFswXTsKKyAgICBzZGlnaXQgcmlnaHQgPSBiLT5vYl9kaWdpdFswXTsKKyAgICBzZGlnaXQgbW9kOworCisgICAgYXNzZXJ0KFB5X0FCUyhQeV9TSVpFKGEpKSA9PSAxKTsKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYikpID09IDEpOworCisgICAgaWYgKFB5X1NJWkUoYSkgPT0gUHlfU0laRShiKSkgeworICAgICAgICAvKiAnYScgYW5kICdiJyBoYXZlIHRoZSBzYW1lIHNpZ24uICovCisgICAgICAgIG1vZCA9IGxlZnQgJSByaWdodDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEVpdGhlciAnYScgb3IgJ2InIGlzIG5lZ2F0aXZlLiAqLworICAgICAgICBtb2QgPSByaWdodCAtIDEgLSAobGVmdCAtIDEpICUgcmlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhtb2QgKiAoc2RpZ2l0KVB5X1NJWkUoYikpOworfQorCisvKiBGYXN0IGZsb29yIGRpdmlzaW9uIGZvciBzaW5nbGUtZGlnaXQgbG9uZ3MuICovCitzdGF0aWMgUHlPYmplY3QgKgorZmFzdF9mbG9vcl9kaXYoUHlMb25nT2JqZWN0ICphLCBQeUxvbmdPYmplY3QgKmIpCit7CisgICAgc2RpZ2l0IGxlZnQgPSBhLT5vYl9kaWdpdFswXTsKKyAgICBzZGlnaXQgcmlnaHQgPSBiLT5vYl9kaWdpdFswXTsKKyAgICBzZGlnaXQgZGl2OworCisgICAgYXNzZXJ0KFB5X0FCUyhQeV9TSVpFKGEpKSA9PSAxKTsKKyAgICBhc3NlcnQoUHlfQUJTKFB5X1NJWkUoYikpID09IDEpOworCisgICAgaWYgKFB5X1NJWkUoYSkgPT0gUHlfU0laRShiKSkgeworICAgICAgICAvKiAnYScgYW5kICdiJyBoYXZlIHRoZSBzYW1lIHNpZ24uICovCisgICAgICAgIGRpdiA9IGxlZnQgLyByaWdodDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIEVpdGhlciAnYScgb3IgJ2InIGlzIG5lZ2F0aXZlLiAqLworICAgICAgICBkaXYgPSAtMSAtIChsZWZ0IC0gMSkgLyByaWdodDsKKyAgICB9CisKKyAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKGRpdik7Cit9CisKIC8qIFRoZSAvIGFuZCAlIG9wZXJhdG9ycyBhcmUgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgZGl2bW9kKCkuCiAgICBUaGUgZXhwcmVzc2lvbiBhIG1vZCBiIGhhcyB0aGUgdmFsdWUgYSAtIGIqZmxvb3IoYS9iKS4KICAgIFRoZSBsb25nX2RpdnJlbSBmdW5jdGlvbiBnaXZlcyB0aGUgcmVtYWluZGVyIGFmdGVyIGRpdmlzaW9uIG9mCkBAIC0zNDU4LDYgKzM1ODMsMzAgQEAKIHsKICAgICBQeUxvbmdPYmplY3QgKmRpdiwgKm1vZDsKIAorICAgIGlmIChQeV9BQlMoUHlfU0laRSh2KSkgPT0gMSAmJiBQeV9BQlMoUHlfU0laRSh3KSkgPT0gMSkgeworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHNpbmdsZS1kaWdpdCBsb25ncyAqLworICAgICAgICBkaXYgPSBOVUxMOworICAgICAgICBpZiAocGRpdiAhPSBOVUxMKSB7CisgICAgICAgICAgICBkaXYgPSAoUHlMb25nT2JqZWN0ICopZmFzdF9mbG9vcl9kaXYodiwgdyk7CisgICAgICAgICAgICBpZiAoZGl2ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBtb2QgIT0gTlVMTCkgeworICAgICAgICAgICAgbW9kID0gKFB5TG9uZ09iamVjdCAqKWZhc3RfbW9kKHYsIHcpOworICAgICAgICAgICAgaWYgKG1vZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihkaXYpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwbW9kID0gbW9kOworICAgICAgICB9CisgICAgICAgIGlmIChwZGl2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIFdlIG9ubHkgd2FudCB0byBzZXQgYCpwZGl2YCB3aGVuIGAqcG1vZGAgaXMKKyAgICAgICAgICAgICAgIHNldCBzdWNjZXNzZnVsbHkuICovCisgICAgICAgICAgICAqcGRpdiA9IGRpdjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaWYgKGxvbmdfZGl2cmVtKHYsIHcsICZkaXYsICZtb2QpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmICgoUHlfU0laRShtb2QpIDwgMCAmJiBQeV9TSVpFKHcpID4gMCkgfHwKQEAgLTM1MDIsNiArMzY1MSwxMSBAQAogICAgIFB5TG9uZ09iamVjdCAqZGl2OwogCiAgICAgQ0hFQ0tfQklOT1AoYSwgYik7CisKKyAgICBpZiAoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEgJiYgUHlfQUJTKFB5X1NJWkUoYikpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGZhc3RfZmxvb3JfZGl2KChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIpOworICAgIH0KKwogICAgIGlmIChsX2Rpdm1vZCgoUHlMb25nT2JqZWN0KilhLCAoUHlMb25nT2JqZWN0KiliLCAmZGl2LCBOVUxMKSA8IDApCiAgICAgICAgIGRpdiA9IE5VTEw7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRpdjsKQEAgLTM3NzcsNiArMzkzMSwxMCBAQAogCiAgICAgQ0hFQ0tfQklOT1AoYSwgYik7CiAKKyAgICBpZiAoUHlfQUJTKFB5X1NJWkUoYSkpID09IDEgJiYgUHlfQUJTKFB5X1NJWkUoYikpID09IDEpIHsKKyAgICAgICAgcmV0dXJuIGZhc3RfbW9kKChQeUxvbmdPYmplY3QqKWEsIChQeUxvbmdPYmplY3QqKWIpOworICAgIH0KKwogICAgIGlmIChsX2Rpdm1vZCgoUHlMb25nT2JqZWN0KilhLCAoUHlMb25nT2JqZWN0KiliLCBOVUxMLCAmbW9kKSA8IDApCiAgICAgICAgIG1vZCA9IE5VTEw7CiAgICAgcmV0dXJuIChQeU9iamVjdCAqKW1vZDsKZGlmZiAtLWdpdCBhL09iamVjdHMvbWVtb3J5b2JqZWN0LmMgYi9PYmplY3RzL21lbW9yeW9iamVjdC5jCmluZGV4IDEwMTYyY2IuLmUzNTVhODMgMTAwNjQ0Ci0tLSBhL09iamVjdHMvbWVtb3J5b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9tZW1vcnlvYmplY3QuYwpAQCAtMTEzMyw3ICsxMTMzLDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLVB5X0xPQ0FMX0lOTElORShjaGFyICopCitQeV9MT0NBTF9JTkxJTkUoY29uc3QgY2hhciAqKQogZ2V0X25hdGl2ZV9mbXRzdHIoY29uc3QgY2hhciAqZm10KQogewogICAgIGludCBhdCA9IDA7CkBAIC0xMjIxLDcgKzEyMjEsNyBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICB2aWV3LT5mb3JtYXQgPSBnZXRfbmF0aXZlX2ZtdHN0cihQeUJ5dGVzX0FTX1NUUklORyhhc2NpaWZtdCkpOworICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopZ2V0X25hdGl2ZV9mbXRzdHIoUHlCeXRlc19BU19TVFJJTkcoYXNjaWlmbXQpKTsKICAgICBpZiAodmlldy0+Zm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgLyogTk9UX1JFQUNIRUQ6IGdldF9uYXRpdmVfZm10Y2hhcigpIGFscmVhZHkgdmFsaWRhdGVzIHRoZSBmb3JtYXQuICovCiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCmRpZmYgLS1naXQgYS9PYmplY3RzL29iamVjdC5jIGIvT2JqZWN0cy9vYmplY3QuYwppbmRleCA4MDI0ODg5Li41NTk3OTRmIDEwMDY0NAotLS0gYS9PYmplY3RzL29iamVjdC5jCisrKyBiL09iamVjdHMvb2JqZWN0LmMKQEAgLTEwOSw2ICsxMDksMTUgQEAKIGR1bXBfY291bnRzKEZJTEUqIGYpCiB7CiAgICAgUHlUeXBlT2JqZWN0ICp0cDsKKyAgICBQeU9iamVjdCAqeG9wdGlvbnMsICp2YWx1ZTsKKyAgICBfUHlfSURFTlRJRklFUihzaG93YWxsb2Njb3VudCk7CisKKyAgICB4b3B0aW9ucyA9IFB5U3lzX0dldFhPcHRpb25zKCk7CisgICAgaWYgKHhvcHRpb25zID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKyAgICB2YWx1ZSA9IF9QeURpY3RfR2V0SXRlbUlkKHhvcHRpb25zLCAmUHlJZF9zaG93YWxsb2Njb3VudCk7CisgICAgaWYgKHZhbHVlICE9IFB5X1RydWUpCisgICAgICAgIHJldHVybjsKIAogICAgIGZvciAodHAgPSB0eXBlX2xpc3Q7IHRwOyB0cCA9IHRwLT50cF9uZXh0KQogICAgICAgICBmcHJpbnRmKGYsICIlcyBhbGxvYydkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkLCAiCkBAIC02NDQsNyArNjUzLDcgQEAKIC8qIE1hcCByaWNoIGNvbXBhcmlzb24gb3BlcmF0b3JzIHRvIHRoZWlyIHN3YXBwZWQgdmVyc2lvbiwgZS5nLiBMVCA8LS0+IEdUICovCiBpbnQgX1B5X1N3YXBwZWRPcFtdID0ge1B5X0dULCBQeV9HRSwgUHlfRVEsIFB5X05FLCBQeV9MVCwgUHlfTEV9OwogCi1zdGF0aWMgY2hhciAqb3BzdHJpbmdzW10gPSB7IjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHN0cmluZ3NbXSA9IHsiPCIsICI8PSIsICI9PSIsICIhPSIsICI+IiwgIj49In07CiAKIC8qIFBlcmZvcm0gYSByaWNoIGNvbXBhcmlzb24sIHJhaXNpbmcgVHlwZUVycm9yIHdoZW4gdGhlIHJlcXVlc3RlZCBjb21wYXJpc29uCiAgICBvcGVyYXRvciBpcyBub3Qgc3VwcG9ydGVkLiAqLwpAQCAtNjg2LDExICs2OTUsMTAgQEAKICAgICAgICAgcmVzID0gKHYgIT0gdykgPyBQeV9UcnVlIDogUHlfRmFsc2U7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIFhYWCBTcGVjaWFsLWNhc2UgTm9uZSBzbyBpdCBkb2Vzbid0IHNob3cgYXMgTm9uZVR5cGUoKSAqLwogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgInVub3JkZXJhYmxlIHR5cGVzOiAlLjEwMHMoKSAlcyAlLjEwMHMoKSIsCi0gICAgICAgICAgICAgICAgICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIiclcycgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnJS4xMDBzJyBhbmQgJyUuMTAwcyciLAogICAgICAgICAgICAgICAgICAgICAgb3BzdHJpbmdzW29wXSwKKyAgICAgICAgICAgICAgICAgICAgIHYtPm9iX3R5cGUtPnRwX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICB3LT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTA0MSw4ICsxMDQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZWxzZQotICAgICAgICBQeV9JTkNSRUYobmFtZSk7CisgICAgUHlfSU5DUkVGKG5hbWUpOwogCiAgICAgaWYgKHRwLT50cF9kaWN0ID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5VHlwZV9SZWFkeSh0cCkgPCAwKQpAQCAtMTA1MCwxMCArMTA1NywxMCBAQAogICAgIH0KIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCiAgICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9nZXQ7CiAgICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CiAgICAgICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIChQeU9iamVjdCAqKW9iai0+b2JfdHlwZSk7CkBAIC0xMDczLDggKzEwODAsOSBAQAogICAgICAgICAgICAgICAgIGlmICh0c2l6ZSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHRzaXplID0gLXRzaXplOwogICAgICAgICAgICAgICAgIHNpemUgPSBfUHlPYmplY3RfVkFSX1NJWkUodHAsIHRzaXplKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc2l6ZSA8PSBQWV9TU0laRV9UX01BWCk7CiAKLSAgICAgICAgICAgICAgICBkaWN0b2Zmc2V0ICs9IChsb25nKXNpemU7CisgICAgICAgICAgICAgICAgZGljdG9mZnNldCArPSAoUHlfc3NpemVfdClzaXplOwogICAgICAgICAgICAgICAgIGFzc2VydChkaWN0b2Zmc2V0ID4gMCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KGRpY3RvZmZzZXQgJSBTSVpFT0ZfVk9JRF9QID09IDApOwogICAgICAgICAgICAgfQpAQCAtMTE0MiwxMiArMTE1MCwxMSBAQAogICAgIFB5X0lOQ1JFRihuYW1lKTsKIAogICAgIGRlc2NyID0gX1B5VHlwZV9Mb29rdXAodHAsIG5hbWUpOwotICAgIFB5X1hJTkNSRUYoZGVzY3IpOwogCi0gICAgZiA9IE5VTEw7CiAgICAgaWYgKGRlc2NyICE9IE5VTEwpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRlc2NyKTsKICAgICAgICAgZiA9IGRlc2NyLT5vYl90eXBlLT50cF9kZXNjcl9zZXQ7Ci0gICAgICAgIGlmIChmICE9IE5VTEwgJiYgUHlEZXNjcl9Jc0RhdGEoZGVzY3IpKSB7CisgICAgICAgIGlmIChmICE9IE5VTEwpIHsKICAgICAgICAgICAgIHJlcyA9IGYoZGVzY3IsIG9iaiwgdmFsdWUpOwogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9CkBAIC0xMTU1LDQwICsxMTYyLDMyIEBACiAKICAgICBpZiAoZGljdCA9PSBOVUxMKSB7CiAgICAgICAgIGRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihvYmopOwotICAgICAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZXMgPSBfUHlPYmplY3REaWN0X1NldEl0ZW0oUHlfVFlQRShvYmopLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzIDwgMCAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOworICAgICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoZGVzY3IgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclLjEwMHMnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclVSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJS41MHMnIG9iamVjdCBhdHRyaWJ1dGUgJyVVJyBpcyByZWFkLW9ubHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cC0+dHBfbmFtZSwgbmFtZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgIH0KKyAgICAgICAgcmVzID0gX1B5T2JqZWN0RGljdF9TZXRJdGVtKHRwLCBkaWN0cHRyLCBuYW1lLCB2YWx1ZSk7CiAgICAgfQotICAgIGlmIChkaWN0ICE9IE5VTEwpIHsKKyAgICBlbHNlIHsKICAgICAgICAgUHlfSU5DUkVGKGRpY3QpOwogICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCkKICAgICAgICAgICAgIHJlcyA9IFB5RGljdF9EZWxJdGVtKGRpY3QsIG5hbWUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXMgPSBQeURpY3RfU2V0SXRlbShkaWN0LCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKLSAgICAgICAgaWYgKHJlcyA8IDAgJiYgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCi0gICAgICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwotICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQorICAgIGlmIChyZXMgPCAwICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQorICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfQXR0cmlidXRlRXJyb3IsIG5hbWUpOwogCi0gICAgaWYgKGYgIT0gTlVMTCkgewotICAgICAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIGlmIChkZXNjciA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJVUnIiwKLSAgICAgICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIiclLjUwcycgb2JqZWN0IGF0dHJpYnV0ZSAnJVUnIGlzIHJlYWQtb25seSIsCi0gICAgICAgICAgICAgICAgIHRwLT50cF9uYW1lLCBuYW1lKTsKICAgZG9uZToKICAgICBQeV9YREVDUkVGKGRlc2NyKTsKICAgICBQeV9ERUNSRUYobmFtZSk7CkBAIC0xMjA0LDcgKzEyMDMsNyBAQAogaW50CiBQeU9iamVjdF9HZW5lcmljU2V0RGljdChQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqdmFsdWUsIHZvaWQgKmNvbnRleHQpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKG9iaik7CisgICAgUHlPYmplY3QgKipkaWN0cHRyID0gX1B5T2JqZWN0X0dldERpY3RQdHIob2JqKTsKICAgICBpZiAoZGljdHB0ciA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIG9iamVjdCBoYXMgbm8gX19kaWN0X18iKTsKQEAgLTEyMjAsMTAgKzEyMTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGRpY3QgPSAqZGljdHB0cjsKLSAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICAqZGljdHB0ciA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9YU0VUUkVGKCpkaWN0cHRyLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JtYWxsb2MuYyBiL09iamVjdHMvb2JtYWxsb2MuYwppbmRleCA3Y2M4ODlmLi4zZjk1MTMzIDEwMDY0NAotLS0gYS9PYmplY3RzL29ibWFsbG9jLmMKKysrIGIvT2JqZWN0cy9vYm1hbGxvYy5jCkBAIC0xLDE3ICsxLDM4IEBACiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKKworLyogRGVmaW5lZCBpbiB0cmFjZW1hbGxvYy5jICovCitleHRlcm4gdm9pZCBfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cik7CisKKwogLyogUHl0aG9uJ3MgbWFsbG9jIHdyYXBwZXJzIChzZWUgcHltZW0uaCkgKi8KIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHICAgLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLworLyoKKyAqIEJhc2ljIHR5cGVzCisgKiBJIGRvbid0IGNhcmUgaWYgdGhlc2UgYXJlIGRlZmluZWQgaW4gPHN5cy90eXBlcy5oPiBvciBlbHNld2hlcmUuIEF4aW9tLgorICovCisjdW5kZWYgIHVjaGFyCisjZGVmaW5lIHVjaGFyICAgdW5zaWduZWQgY2hhciAgIC8qIGFzc3VtaW5nID09IDggYml0cyAgKi8KKworI3VuZGVmICB1aW50CisjZGVmaW5lIHVpbnQgICAgdW5zaWduZWQgaW50ICAgIC8qIGFzc3VtaW5nID49IDE2IGJpdHMgKi8KKworI3VuZGVmIHVwdHIKKyNkZWZpbmUgdXB0ciAgICBQeV91aW50cHRyX3QKKwogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdSYXdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOworc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1Jhd1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z1Jhd0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKKwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKTsKIHN0YXRpYyB2b2lkKiBfUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwotc3RhdGljIHZvaWQgX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnApOwogc3RhdGljIHZvaWQqIF9QeU1lbV9EZWJ1Z1JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK3N0YXRpYyB2b2lkIF9QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwKTsKIAogc3RhdGljIHZvaWQgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CiBzdGF0aWMgdm9pZCBfUHlNZW1fRGVidWdDaGVja0FkZHJlc3MoY2hhciBhcGlfaWQsIGNvbnN0IHZvaWQgKnApOwotI2VuZGlmCiAKICNpZiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpICAvKiBDbGFuZyAqLwogICNpZiBfX2hhc19mZWF0dXJlKGFkZHJlc3Nfc2FuaXRpemVyKSAgLyogaXMgQVNBTiBlbmFibGVkPyAqLwpAQCAtMTQ1LDkgKzE2Niw4IEBACiAjZWxzZQogIyAgZGVmaW5lIFBZT0JKX0ZVTkNTIFBZUkFXX0ZVTkNTCiAjZW5kaWYKLSNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlSQVdfRlVOQ1MKKyNkZWZpbmUgUFlNRU1fRlVOQ1MgUFlPQkpfRlVOQ1MKIAotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogV2UgdGFnIGVhY2ggYmxvY2sgd2l0aCBhbiBBUEkgSUQgaW4gb3JkZXIgdG8gdGFnIEFQSSB2aW9sYXRpb25zICovCiAgICAgY2hhciBhcGlfaWQ7CkBAIC0xNjMsMTkgKzE4MywyMSBAQAogICAgIHsnbycsIHtOVUxMLCBQWU9CSl9GVU5DU319CiAgICAgfTsKIAotI2RlZmluZSBQWURCR19GVU5DUyBfUHlNZW1fRGVidWdNYWxsb2MsIF9QeU1lbV9EZWJ1Z0NhbGxvYywgX1B5TWVtX0RlYnVnUmVhbGxvYywgX1B5TWVtX0RlYnVnRnJlZQotI2VuZGlmCisjZGVmaW5lIFBZUkFXREJHX0ZVTkNTIFwKKyAgICBfUHlNZW1fRGVidWdSYXdNYWxsb2MsIF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYywgX1B5TWVtX0RlYnVnUmF3UmVhbGxvYywgX1B5TWVtX0RlYnVnUmF3RnJlZQorI2RlZmluZSBQWURCR19GVU5DUyBcCisgICAgX1B5TWVtX0RlYnVnTWFsbG9jLCBfUHlNZW1fRGVidWdDYWxsb2MsIF9QeU1lbV9EZWJ1Z1JlYWxsb2MsIF9QeU1lbV9EZWJ1Z0ZyZWUKIAogc3RhdGljIFB5TWVtQWxsb2NhdG9yRXggX1B5TWVtX1JhdyA9IHsKLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgICZfUHlNZW1fRGVidWcucmF3LCBQWURCR19GVU5DUworI2lmZGVmIFB5X0RFQlVHCisgICAgJl9QeU1lbV9EZWJ1Zy5yYXcsIFBZUkFXREJHX0ZVTkNTCiAjZWxzZQogICAgIE5VTEwsIFBZUkFXX0ZVTkNTCiAjZW5kaWYKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlNZW0gPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcubWVtLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU1FTV9GVU5DUwpAQCAtMTgzLDE2ICsyMDUsNzYgQEAKICAgICB9OwogCiBzdGF0aWMgUHlNZW1BbGxvY2F0b3JFeCBfUHlPYmplY3QgPSB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKKyNpZmRlZiBQeV9ERUJVRwogICAgICZfUHlNZW1fRGVidWcub2JqLCBQWURCR19GVU5DUwogI2Vsc2UKICAgICBOVUxMLCBQWU9CSl9GVU5DUwogI2VuZGlmCiAgICAgfTsKIAoraW50CitfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKGNvbnN0IGNoYXIgKm9wdCkKK3sKKyAgICBpZiAob3B0ID09IE5VTEwgfHwgKm9wdCA9PSAnXDAnKSB7CisgICAgICAgIC8qIFBZVEhPTk1BTExPQyBpcyBlbXB0eSBvciBpcyBub3Qgc2V0IG9yIGlnbm9yZWQgKC1FLy1JIGNvbW1hbmQgbGluZQorICAgICAgICAgICBvcHRpb25zKTogdXNlIGRlZmF1bHQgYWxsb2NhdG9ycyAqLworI2lmZGVmIFB5X0RFQlVHCisjICBpZmRlZiBXSVRIX1BZTUFMTE9DCisgICAgICAgIG9wdCA9ICJweW1hbGxvY19kZWJ1ZyI7CisjICBlbHNlCisgICAgICAgIG9wdCA9ICJtYWxsb2NfZGVidWciOworIyAgZW5kaWYKKyNlbHNlCisgICAvKiAhUHlfREVCVUcgKi8KKyMgIGlmZGVmIFdJVEhfUFlNQUxMT0MKKyAgICAgICAgb3B0ID0gInB5bWFsbG9jIjsKKyMgIGVsc2UKKyAgICAgICAgb3B0ID0gIm1hbGxvYyI7CisjICBlbmRpZgorI2VuZGlmCisgICAgfQorCisgICAgaWYgKHN0cmNtcChvcHQsICJkZWJ1ZyIpID09IDApIHsKKyAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJtYWxsb2MiKSA9PSAwIHx8IHN0cmNtcChvcHQsICJtYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCBhbGxvYyA9IHtOVUxMLCBQWVJBV19GVU5DU307CisKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9SQVcsICZhbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmYWxsb2MpOworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX09CSiwgJmFsbG9jKTsKKworICAgICAgICBpZiAoc3RyY21wKG9wdCwgIm1hbGxvY19kZWJ1ZyIpID09IDApCisgICAgICAgICAgICBQeU1lbV9TZXR1cERlYnVnSG9va3MoKTsKKyAgICB9CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGVsc2UgaWYgKHN0cmNtcChvcHQsICJweW1hbGxvYyIpID09IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgIHsKKyAgICAgICAgUHlNZW1BbGxvY2F0b3JFeCByYXdfYWxsb2MgPSB7TlVMTCwgUFlSQVdfRlVOQ1N9OworICAgICAgICBQeU1lbUFsbG9jYXRvckV4IG1lbV9hbGxvYyA9IHtOVUxMLCBQWU1FTV9GVU5DU307CisgICAgICAgIFB5TWVtQWxsb2NhdG9yRXggb2JqX2FsbG9jID0ge05VTEwsIFBZT0JKX0ZVTkNTfTsKKworICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJnJhd19hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmbWVtX2FsbG9jKTsKKyAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZvYmpfYWxsb2MpOworCisgICAgICAgIGlmIChzdHJjbXAob3B0LCAicHltYWxsb2NfZGVidWciKSA9PSAwKQorICAgICAgICAgICAgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKCk7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIC8qIHVua25vd24gYWxsb2NhdG9yICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKICN1bmRlZiBQWVJBV19GVU5DUwogI3VuZGVmIFBZTUVNX0ZVTkNTCiAjdW5kZWYgUFlPQkpfRlVOQ1MKKyN1bmRlZiBQWVJBV0RCR19GVU5DUwogI3VuZGVmIFBZREJHX0ZVTkNTCiAKIHN0YXRpYyBQeU9iamVjdEFyZW5hQWxsb2NhdG9yIF9QeU9iamVjdF9BcmVuYSA9IHtOVUxMLApAQCAtMjA1LDIzICsyODcsNDYgQEAKICNlbmRpZgogICAgIH07CiAKKyNpZmRlZiBXSVRIX1BZTUFMTE9DCitzdGF0aWMgaW50CitfUHlNZW1fRGVidWdFbmFibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIChfUHlPYmplY3QubWFsbG9jID09IF9QeU1lbV9EZWJ1Z01hbGxvYyk7Cit9CisKK2ludAorX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCh2b2lkKQoreworICAgIGlmIChfUHlNZW1fRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChfUHlNZW1fRGVidWcub2JqLmFsbG9jLm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAoX1B5T2JqZWN0Lm1hbGxvYyA9PSBfUHlPYmplY3RfTWFsbG9jKTsKKyAgICB9Cit9CisjZW5kaWYKKwogdm9pZAogUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKHZvaWQpCiB7Ci0jaWZkZWYgUFlNQUxMT0NfREVCVUcKICAgICBQeU1lbUFsbG9jYXRvckV4IGFsbG9jOwogCisgICAgYWxsb2MubWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3TWFsbG9jOworICAgIGFsbG9jLmNhbGxvYyA9IF9QeU1lbV9EZWJ1Z1Jhd0NhbGxvYzsKKyAgICBhbGxvYy5yZWFsbG9jID0gX1B5TWVtX0RlYnVnUmF3UmVhbGxvYzsKKyAgICBhbGxvYy5mcmVlID0gX1B5TWVtX0RlYnVnUmF3RnJlZTsKKworICAgIGlmIChfUHlNZW1fUmF3Lm1hbGxvYyAhPSBfUHlNZW1fRGVidWdSYXdNYWxsb2MpIHsKKyAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5yYXc7CisgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmX1B5TWVtX0RlYnVnLnJhdy5hbGxvYyk7CisgICAgICAgIFB5TWVtX1NldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fUkFXLCAmYWxsb2MpOworICAgIH0KKwogICAgIGFsbG9jLm1hbGxvYyA9IF9QeU1lbV9EZWJ1Z01hbGxvYzsKICAgICBhbGxvYy5jYWxsb2MgPSBfUHlNZW1fRGVidWdDYWxsb2M7CiAgICAgYWxsb2MucmVhbGxvYyA9IF9QeU1lbV9EZWJ1Z1JlYWxsb2M7CiAgICAgYWxsb2MuZnJlZSA9IF9QeU1lbV9EZWJ1Z0ZyZWU7CiAKLSAgICBpZiAoX1B5TWVtX1Jhdy5tYWxsb2MgIT0gX1B5TWVtX0RlYnVnTWFsbG9jKSB7Ci0gICAgICAgIGFsbG9jLmN0eCA9ICZfUHlNZW1fRGVidWcucmF3OwotICAgICAgICBQeU1lbV9HZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJl9QeU1lbV9EZWJ1Zy5yYXcuYWxsb2MpOwotICAgICAgICBQeU1lbV9TZXRBbGxvY2F0b3IoUFlNRU1fRE9NQUlOX1JBVywgJmFsbG9jKTsKLSAgICB9Ci0KICAgICBpZiAoX1B5TWVtLm1hbGxvYyAhPSBfUHlNZW1fRGVidWdNYWxsb2MpIHsKICAgICAgICAgYWxsb2MuY3R4ID0gJl9QeU1lbV9EZWJ1Zy5tZW07CiAgICAgICAgIFB5TWVtX0dldEFsbG9jYXRvcihQWU1FTV9ET01BSU5fTUVNLCAmX1B5TWVtX0RlYnVnLm1lbS5hbGxvYyk7CkBAIC0yMzMsNyArMzM4LDYgQEAKICAgICAgICAgUHlNZW1fR2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZfUHlNZW1fRGVidWcub2JqLmFsbG9jKTsKICAgICAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvYyk7CiAgICAgfQotI2VuZGlmCiB9CiAKIHZvaWQKQEAgLTI2NCw3ICszNjgsNiBAQAogICAgIGNhc2UgUFlNRU1fRE9NQUlOX09CSjogX1B5T2JqZWN0ID0gKmFsbG9jYXRvcjsgYnJlYWs7CiAgICAgLyogaWdub3JlIHVua25vd24gZG9tYWluICovCiAgICAgfQotCiB9CiAKIHZvaWQKQEAgLTY0MiwyMiArNzQ1LDYgQEAKICNkZWZpbmUgU0lNUExFTE9DS19MT0NLKGxvY2spICAgLyogYWNxdWlyZSByZWxlYXNlZCBsb2NrICovCiAjZGVmaW5lIFNJTVBMRUxPQ0tfVU5MT0NLKGxvY2spIC8qIHJlbGVhc2UgYWNxdWlyZWQgbG9jayAqLwogCi0vKgotICogQmFzaWMgdHlwZXMKLSAqIEkgZG9uJ3QgY2FyZSBpZiB0aGVzZSBhcmUgZGVmaW5lZCBpbiA8c3lzL3R5cGVzLmg+IG9yIGVsc2V3aGVyZS4gQXhpb20uCi0gKi8KLSN1bmRlZiAgdWNoYXIKLSNkZWZpbmUgdWNoYXIgICB1bnNpZ25lZCBjaGFyICAgLyogYXNzdW1pbmcgPT0gOCBiaXRzICAqLwotCi0jdW5kZWYgIHVpbnQKLSNkZWZpbmUgdWludCAgICB1bnNpZ25lZCBpbnQgICAgLyogYXNzdW1pbmcgPj0gMTYgYml0cyAqLwotCi0jdW5kZWYgIHVsb25nCi0jZGVmaW5lIHVsb25nICAgdW5zaWduZWQgbG9uZyAgIC8qIGFzc3VtaW5nID49IDMyIGJpdHMgKi8KLQotI3VuZGVmIHVwdHIKLSNkZWZpbmUgdXB0ciAgICBQeV91aW50cHRyX3QKLQogLyogV2hlbiB5b3Ugc2F5IG1lbW9yeSwgbXkgbWluZCByZWFzb25zIGluIHRlcm1zIG9mIChwb2ludGVycyB0bykgYmxvY2tzICovCiB0eXBlZGVmIHVjaGFyIGJsb2NrOwogCkBAIC05NDksMTEgKzEwMzYsMTUgQEAKICAgICBzdHJ1Y3QgYXJlbmFfb2JqZWN0KiBhcmVuYW9iajsKICAgICB1aW50IGV4Y2VzczsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyBhYm92ZSBwb29sIGFsaWdubWVudCAqLwogICAgIHZvaWQgKmFkZHJlc3M7CisgICAgc3RhdGljIGludCBkZWJ1Z19zdGF0cyA9IC0xOwogCi0jaWZkZWYgUFlNQUxMT0NfREVCVUcKLSAgICBpZiAoUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpKQorICAgIGlmIChkZWJ1Z19zdGF0cyA9PSAtMSkgeworICAgICAgICBjaGFyICpvcHQgPSBQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIik7CisgICAgICAgIGRlYnVnX3N0YXRzID0gKG9wdCAhPSBOVUxMICYmICpvcHQgIT0gJ1wwJyk7CisgICAgfQorICAgIGlmIChkZWJ1Z19zdGF0cykKICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKLSNlbmRpZgorCiAgICAgaWYgKHVudXNlZF9hcmVuYV9vYmplY3RzID09IE5VTEwpIHsKICAgICAgICAgdWludCBpOwogICAgICAgICB1aW50IG51bWFyZW5hczsKQEAgLTE3MDksNyArMTgwMCw3IEBACiAKICNlbmRpZiAvKiBXSVRIX1BZTUFMTE9DICovCiAKLSNpZmRlZiBQWU1BTExPQ19ERUJVRworCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIC8qIEEgeC1wbGF0Zm9ybSBkZWJ1Z2dpbmcgYWxsb2NhdG9yLiAgVGhpcyBkb2Vzbid0IG1hbmFnZSBtZW1vcnkgZGlyZWN0bHksCiAgKiBpdCB3cmFwcyBhIHJlYWwgYWxsb2NhdG9yLCBhZGRpbmcgZXh0cmEgZGVidWdnaW5nIGluZm8gdG8gdGhlIG1lbW9yeSBibG9ja3MuCkBAIC0xNzY3LDMxICsxODU4LDYgQEAKICAgICB9CiB9CiAKLSNpZmRlZiBQeV9ERUJVRwotLyogSXMgdGFyZ2V0IGluIHRoZSBsaXN0PyAgVGhlIGxpc3QgaXMgdHJhdmVyc2VkIHZpYSB0aGUgbmV4dHBvb2wgcG9pbnRlcnMuCi0gKiBUaGUgbGlzdCBtYXkgYmUgTlVMTC10ZXJtaW5hdGVkLCBvciBjaXJjdWxhci4gIFJldHVybiAxIGlmIHRhcmdldCBpcyBpbgotICogbGlzdCwgZWxzZSAwLgotICovCi1zdGF0aWMgaW50Ci1wb29sX2lzX2luX2xpc3QoY29uc3QgcG9vbHAgdGFyZ2V0LCBwb29scCBsaXN0KQotewotICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKLSAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOwotICAgIGlmIChsaXN0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAwOwotICAgIGRvIHsKLSAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKLSAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIHBvb2xfaXNfaW5fbGlzdChYLCBZKSAxCi0KLSNlbmRpZiAgLyogUHlfREVCVUcgKi8KLQogLyogTGV0IFMgPSBzaXplb2Yoc2l6ZV90KS4gIFRoZSBkZWJ1ZyBtYWxsb2MgYXNrcyBmb3IgNCpTIGV4dHJhIGJ5dGVzIGFuZAogICAgZmlsbHMgdGhlbSB3aXRoIHVzZWZ1bCBzdHVmZiwgaGVyZSBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIG1hbGxvYydzIHJlc3VsdCBwOgogCkBAIC0xODE5LDcgKzE4ODUsNyBAQAogKi8KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnQWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKK19QeU1lbV9EZWJ1Z1Jhd0FsbG9jKGludCB1c2VfY2FsbG9jLCB2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCiB7CiAgICAgZGVidWdfYWxsb2NfYXBpX3QgKmFwaSA9IChkZWJ1Z19hbGxvY19hcGlfdCAqKWN0eDsKICAgICB1Y2hhciAqcDsgICAgICAgICAgIC8qIGJhc2UgYWRkcmVzcyBvZiBtYWxsb2MnZWQgYmxvY2sgKi8KQEAgLTE4NTYsMTggKzE5MjIsMTggQEAKIH0KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnTWFsbG9jKHZvaWQgKmN0eCwgc2l6ZV90IG5ieXRlcykKK19QeU1lbV9EZWJ1Z1Jhd01hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuYnl0ZXMpCiB7Ci0gICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKKyAgICByZXR1cm4gX1B5TWVtX0RlYnVnUmF3QWxsb2MoMCwgY3R4LCBuYnl0ZXMpOwogfQogCiBzdGF0aWMgdm9pZCAqCi1fUHlNZW1fRGVidWdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCitfUHlNZW1fRGVidWdSYXdDYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CiAgICAgc2l6ZV90IG5ieXRlczsKICAgICBhc3NlcnQoZWxzaXplID09IDAgfHwgbmVsZW0gPD0gUFlfU1NJWkVfVF9NQVggLyBlbHNpemUpOwogICAgIG5ieXRlcyA9IG5lbGVtICogZWxzaXplOwotICAgIHJldHVybiBfUHlNZW1fRGVidWdBbGxvYygxLCBjdHgsIG5ieXRlcyk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0FsbG9jKDEsIGN0eCwgbmJ5dGVzKTsKIH0KIAogLyogVGhlIGRlYnVnIGZyZWUgZmlyc3QgY2hlY2tzIHRoZSAyKlNTVCBieXRlcyBvbiBlYWNoIGVuZCBmb3Igc2FuaXR5IChpbgpAQCAtMTg3Niw3ICsxOTQyLDcgQEAKICAgIFRoZW4gY2FsbHMgdGhlIHVuZGVybHlpbmcgZnJlZS4KICovCiBzdGF0aWMgdm9pZAotX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpjdHgsIHZvaWQgKnApCitfUHlNZW1fRGVidWdSYXdGcmVlKHZvaWQgKmN0eCwgdm9pZCAqcCkKIHsKICAgICBkZWJ1Z19hbGxvY19hcGlfdCAqYXBpID0gKGRlYnVnX2FsbG9jX2FwaV90ICopY3R4OwogICAgIHVjaGFyICpxID0gKHVjaGFyICopcCAtIDIqU1NUOyAgLyogYWRkcmVzcyByZXR1cm5lZCBmcm9tIG1hbGxvYyAqLwpAQCAtMTg5Myw3ICsxOTU5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgKgotX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpCitfUHlNZW1fRGVidWdSYXdSZWFsbG9jKHZvaWQgKmN0eCwgdm9pZCAqcCwgc2l6ZV90IG5ieXRlcykKIHsKICAgICBkZWJ1Z19hbGxvY19hcGlfdCAqYXBpID0gKGRlYnVnX2FsbG9jX2FwaV90ICopY3R4OwogICAgIHVjaGFyICpxID0gKHVjaGFyICopcCwgKm9sZHE7CkBAIC0xOTAzLDcgKzE5NjksNyBAQAogICAgIGludCBpOwogCiAgICAgaWYgKHAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd0FsbG9jKDAsIGN0eCwgbmJ5dGVzKTsKIAogICAgIF9QeU1lbV9EZWJ1Z0NoZWNrQWRkcmVzcyhhcGktPmFwaV9pZCwgcCk7CiAgICAgYnVtcHNlcmlhbG5vKCk7CkBAIC0xOTQ2LDYgKzIwMTIsNDQgQEAKICAgICByZXR1cm4gcTsKIH0KIAorc3RhdGljIHZvaWQKK19QeU1lbV9EZWJ1Z0NoZWNrR0lMKHZvaWQpCit7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBpZiAoIVB5R0lMU3RhdGVfQ2hlY2soKSkKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBob2xkaW5nIHRoZSBHSUwiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqCitfUHlNZW1fRGVidWdNYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmJ5dGVzKQoreworICAgIF9QeU1lbV9EZWJ1Z0NoZWNrR0lMKCk7CisgICAgcmV0dXJuIF9QeU1lbV9EZWJ1Z1Jhd01hbGxvYyhjdHgsIG5ieXRlcyk7Cit9CisKK3N0YXRpYyB2b2lkICoKK19QeU1lbV9EZWJ1Z0NhbGxvYyh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdDYWxsb2MoY3R4LCBuZWxlbSwgZWxzaXplKTsKK30KKworc3RhdGljIHZvaWQKK19QeU1lbV9EZWJ1Z0ZyZWUodm9pZCAqY3R4LCB2b2lkICpwdHIpCit7CisgICAgX1B5TWVtX0RlYnVnQ2hlY2tHSUwoKTsKKyAgICBfUHlNZW1fRGVidWdSYXdGcmVlKGN0eCwgcHRyKTsKK30KKworc3RhdGljIHZvaWQgKgorX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ieXRlcykKK3sKKyAgICBfUHlNZW1fRGVidWdDaGVja0dJTCgpOworICAgIHJldHVybiBfUHlNZW1fRGVidWdSYXdSZWFsbG9jKGN0eCwgcHRyLCBuYnl0ZXMpOworfQorCiAvKiBDaGVjayB0aGUgZm9yYmlkZGVuIGJ5dGVzIG9uIGJvdGggZW5kcyBvZiB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgcC4KICAqIElmIGFueXRoaW5nIGlzIHdyb25nLCBwcmludCBpbmZvIHRvIHN0ZGVyciB2aWEgX1B5T2JqZWN0X0RlYnVnRHVtcEFkZHJlc3MsCiAgKiBhbmQgY2FsbCBQeV9GYXRhbEVycm9yIHRvIGtpbGwgdGhlIHByb2dyYW0uCkBAIC0yMTA0LDkgKzIyMDgsMTIgQEAKICAgICAgICAgfQogICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOwogICAgIH0KKyAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworCisgICAgZmZsdXNoKHN0ZGVycik7CisgICAgX1B5TWVtX0R1bXBUcmFjZWJhY2soZmlsZW5vKHN0ZGVyciksIHApOwogfQogCi0jZW5kaWYgIC8qIFBZTUFMTE9DX0RFQlVHICovCiAKIHN0YXRpYyBzaXplX3QKIHByaW50b25lKEZJTEUgKm91dCwgY29uc3QgY2hhciogbXNnLCBzaXplX3QgdmFsdWUpCkBAIC0yMTU4LDggKzIyNjUsMzAgQEAKICAgICAodm9pZClwcmludG9uZShvdXQsIGJ1ZjIsIG51bV9ibG9ja3MgKiBzaXplb2ZfYmxvY2spOwogfQogCisKICNpZmRlZiBXSVRIX1BZTUFMTE9DCiAKKyNpZmRlZiBQeV9ERUJVRworLyogSXMgdGFyZ2V0IGluIHRoZSBsaXN0PyAgVGhlIGxpc3QgaXMgdHJhdmVyc2VkIHZpYSB0aGUgbmV4dHBvb2wgcG9pbnRlcnMuCisgKiBUaGUgbGlzdCBtYXkgYmUgTlVMTC10ZXJtaW5hdGVkLCBvciBjaXJjdWxhci4gIFJldHVybiAxIGlmIHRhcmdldCBpcyBpbgorICogbGlzdCwgZWxzZSAwLgorICovCitzdGF0aWMgaW50Citwb29sX2lzX2luX2xpc3QoY29uc3QgcG9vbHAgdGFyZ2V0LCBwb29scCBsaXN0KQoreworICAgIHBvb2xwIG9yaWdsaXN0ID0gbGlzdDsKKyAgICBhc3NlcnQodGFyZ2V0ICE9IE5VTEwpOworICAgIGlmIChsaXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworICAgIGRvIHsKKyAgICAgICAgaWYgKHRhcmdldCA9PSBsaXN0KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0cG9vbDsKKyAgICB9IHdoaWxlIChsaXN0ICE9IE5VTEwgJiYgbGlzdCAhPSBvcmlnbGlzdCk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogLyogUHJpbnQgc3VtbWFyeSBpbmZvIHRvICJvdXQiIGFib3V0IHRoZSBzdGF0ZSBvZiBweW1hbGxvYydzIHN0cnVjdHVyZXMuCiAgKiBJbiBQeV9ERUJVRyBtb2RlLCBhbHNvIHBlcmZvcm0gc29tZSBleHBlbnNpdmUgaW50ZXJuYWwgY29uc2lzdGVuY3kKICAqIGNoZWNrcy4KQEAgLTIyMzMsNyArMjM2Miw5IEBACiAKICAgICAgICAgICAgIGlmIChwLT5yZWYuY291bnQgPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNpZmRlZiBQeV9ERUJVRwogICAgICAgICAgICAgICAgIGFzc2VydChwb29sX2lzX2luX2xpc3QocCwgYXJlbmFzW2ldLmZyZWVwb29scykpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICArK251bXBvb2xzW3N6XTsKQEAgLTIyNzMsOSArMjQwNCw4IEBACiAgICAgICAgIHF1YW50aXphdGlvbiArPSBwICogKChQT09MX1NJWkUgLSBQT09MX09WRVJIRUFEKSAlIHNpemUpOwogICAgIH0KICAgICBmcHV0YygnXG4nLCBvdXQpOwotI2lmZGVmIFBZTUFMTE9DX0RFQlVHCi0gICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyB0aW1lcyBvYmplY3QgbWFsbG9jIGNhbGxlZCIsIHNlcmlhbG5vKTsKLSNlbmRpZgorICAgIGlmIChfUHlNZW1fRGVidWdFbmFibGVkKCkpCisgICAgICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgdGltZXMgb2JqZWN0IG1hbGxvYyBjYWxsZWQiLCBzZXJpYWxubyk7CiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyBhcmVuYXMgYWxsb2NhdGVkIHRvdGFsIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCk7CiAgICAgKHZvaWQpcHJpbnRvbmUob3V0LCAiIyBhcmVuYXMgcmVjbGFpbWVkIiwgbnRpbWVzX2FyZW5hX2FsbG9jYXRlZCAtIG5hcmVuYXMpOwogICAgICh2b2lkKXByaW50b25lKG91dCwgIiMgYXJlbmFzIGhpZ2h3YXRlciBtYXJrIiwgbmFyZW5hc19oaWdod2F0ZXIpOwpAQCAtMjMwMyw2ICsyNDMzLDcgQEAKIAogI2VuZGlmIC8qICNpZmRlZiBXSVRIX1BZTUFMTE9DICovCiAKKwogI2lmZGVmIFB5X1VTSU5HX01FTU9SWV9ERUJVR0dFUgogLyogTWFrZSB0aGlzIGZ1bmN0aW9uIGxhc3Qgc28gZ2NjIHdvbid0IGlubGluZSBpdCBzaW5jZSB0aGUgZGVmaW5pdGlvbiBpcwogICogYWZ0ZXIgdGhlIHJlZmVyZW5jZS4KZGlmZiAtLWdpdCBhL09iamVjdHMvb2RpY3RvYmplY3QuYyBiL09iamVjdHMvb2RpY3RvYmplY3QuYwppbmRleCAxYWJkZDAyLi45YWYwYjBlIDEwMDY0NAotLS0gYS9PYmplY3RzL29kaWN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vZGljdG9iamVjdC5jCkBAIC0xNDI0LDE0ICsxNDI0LDEzIEBACiAgKiBPcmRlcmVkRGljdCBtZW1iZXJzCiAgKi8KIAotLyogdHBfbWVtYmVycyAqLworLyogdHBfZ2V0c2V0ICovCiAKLXN0YXRpYyBQeU1lbWJlckRlZiBvZGljdF9tZW1iZXJzW10gPSB7Ci0gICAgeyJfX2RpY3RfXyIsIFRfT0JKRUNULCBvZmZzZXRvZihQeU9EaWN0T2JqZWN0LCBvZF9pbnN0X2RpY3QpLCBSRUFET05MWX0sCi0gICAgezB9CitzdGF0aWMgUHlHZXRTZXREZWYgb2RpY3RfZ2V0c2V0W10gPSB7CisgICAgeyJfX2RpY3RfXyIsIFB5T2JqZWN0X0dlbmVyaWNHZXREaWN0LCBQeU9iamVjdF9HZW5lcmljU2V0RGljdH0sCisgICAge05VTEx9CiB9OwogCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIE9yZGVyZWREaWN0IHR5cGUgc2xvdCBtZXRob2RzCiAgKi8KQEAgLTE0NjMsNyArMTQ2Miw3IEBACiAgICAgKyt0c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOwogCiAgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQoc2VsZikKLX07Cit9CiAKIC8qIHRwX3JlcHIgKi8KIApAQCAtMTU0MCw3ICsxNTM5LDcgQEAKICAgICBQeV9YREVDUkVGKHBpZWNlcyk7CiAgICAgUHlfUmVwckxlYXZlKChQeU9iamVjdCAqKXNlbGYpOwogICAgIHJldHVybiByZXN1bHQ7Ci19OworfQogCiAvKiB0cF9kb2MgKi8KIApAQCAtMTYxMiw3ICsxNjExLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7CiAgICAgfQotfTsKK30KIAogLyogdHBfaXRlciAqLwogCkBAIC0xNjIwLDcgKzE2MTksNyBAQAogb2RpY3RfaXRlcihQeU9EaWN0T2JqZWN0ICpvZCkKIHsKICAgICByZXR1cm4gb2RpY3RpdGVyX25ldyhvZCwgX29kaWN0X0lURVJfS0VZUyk7Ci19OworfQogCiAvKiB0cF9pbml0ICovCiAKQEAgLTE2NDYsMjcgKzE2NDUsMTkgQEAKICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLX07Cit9CiAKIC8qIHRwX25ldyAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb2RpY3RfbmV3KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5T0RpY3RPYmplY3QgKm9kOwogCi0gICAgZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgICBpZiAoZGljdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIG9kID0gKFB5T0RpY3RPYmplY3QgKilQeURpY3RfVHlwZS50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0gICAgaWYgKG9kID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKGRpY3QpOworICAgIGlmIChvZCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICBvZC0+b2RfaW5zdF9kaWN0ID0gZGljdDsKICAgICAvKiB0eXBlIGNvbnN0cnVjdG9yIGZpbGxzIHRoZSBtZW1vcnkgd2l0aCB6ZXJvcyAoc2VlCiAgICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygpKSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgdGhlbSB0byB6ZXJvIGFnYWluICovCiAgICAgaWYgKF9vZGljdF9yZXNpemUob2QpIDwgMCkgewpAQCAtMTcwOCw4ICsxNjk5LDggQEAKICAgICAoZ2V0aXRlcmZ1bmMpb2RpY3RfaXRlciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXJuZXh0ICovCiAgICAgb2RpY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCi0gICAgb2RpY3RfbWVtYmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICBvZGljdF9nZXRzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLwogICAgICZQeURpY3RfVHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCkBAIC0xNzI5LDcgKzE3MjAsNyBAQAogUHlPYmplY3QgKgogUHlPRGljdF9OZXcodm9pZCkgewogICAgIHJldHVybiBvZGljdF9uZXcoJlB5T0RpY3RfVHlwZSwgTlVMTCwgTlVMTCk7Ci19OworfQogCiBzdGF0aWMgaW50CiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2YWx1ZSwKQEAgLTE3NDcsNyArMTczOCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJlczsKLX07Cit9CiAKIGludAogUHlPRGljdF9TZXRJdGVtKFB5T2JqZWN0ICpvZCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnZhbHVlKQpAQCAtMTc1Niw3ICsxNzQ3LDcgQEAKICAgICBpZiAoaGFzaCA9PSAtMSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBfUHlPRGljdF9TZXRJdGVtX0tub3duSGFzaChvZCwga2V5LCB2YWx1ZSwgaGFzaCk7Ci19OworfQogCiBpbnQKIFB5T0RpY3RfRGVsSXRlbShQeU9iamVjdCAqb2QsIFB5T2JqZWN0ICprZXkpCkBAIC0xNzY5LDcgKzE3NjAsNyBAQAogICAgIGlmIChyZXMgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgcmV0dXJuIF9QeURpY3RfRGVsSXRlbV9Lbm93bkhhc2gob2QsIGtleSwgaGFzaCk7Ci19OworfQogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL09iamVjdHMvcmFuZ2VvYmplY3QuYyBiL09iamVjdHMvcmFuZ2VvYmplY3QuYwppbmRleCAwZTllYjIwLi4yODRhMTAwIDEwMDY0NAotLS0gYS9PYmplY3RzL3Jhbmdlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9yYW5nZW9iamVjdC5jCkBAIC0yOSwxNyArMjksMTAgQEAKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygxKTsKIAogICAgIHN0ZXAgPSBQeU51bWJlcl9JbmRleChzdGVwKTsKLSAgICBpZiAoc3RlcCkgewotICAgICAgICBQeV9zc2l6ZV90IGlzdGVwID0gUHlOdW1iZXJfQXNTc2l6ZV90KHN0ZXAsIE5VTEwpOwotICAgICAgICBpZiAoaXN0ZXAgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgLyogSWdub3JlIE92ZXJmbG93RXJyb3IsIHdlIGtub3cgdGhlIHZhbHVlIGlzbid0IDAuICovCi0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGlzdGVwID09IDApIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSgpIGFyZyAzIG11c3Qgbm90IGJlIHplcm8iKTsKLSAgICAgICAgICAgIFB5X0NMRUFSKHN0ZXApOwotICAgICAgICB9CisgICAgaWYgKHN0ZXAgJiYgX1B5TG9uZ19TaWduKHN0ZXApID09IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmFuZ2UoKSBhcmcgMyBtdXN0IG5vdCBiZSB6ZXJvIik7CisgICAgICAgIFB5X0NMRUFSKHN0ZXApOwogICAgIH0KIAogICAgIHJldHVybiBzdGVwOwpAQCAtMTI5LDkgKzEyMiw5IEBACiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKikgb2JqOwogCiAgICAgLyogRmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QsIHJlbGVhc2UgYXR0cmlidXRlcyAqLwotICAgIFB5X1hERUNSRUYoc3RhcnQpOwotICAgIFB5X1hERUNSRUYoc3RvcCk7Ci0gICAgUHlfWERFQ1JFRihzdGVwKTsKKyAgICBQeV9ERUNSRUYoc3RhcnQpOworICAgIFB5X0RFQ1JFRihzdG9wKTsKKyAgICBQeV9ERUNSRUYoc3RlcCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE5Niw3ICsxODksNyBAQAogICAgIC8qIGlmIChsbyA+PSBoaSksIHJldHVybiBsZW5ndGggb2YgMC4gKi8KICAgICBjbXBfcmVzdWx0ID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGxvLCBoaSwgUHlfR0UpOwogICAgIGlmIChjbXBfcmVzdWx0ICE9IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdGVwKTsKKyAgICAgICAgUHlfREVDUkVGKHN0ZXApOwogICAgICAgICBpZiAoY21wX3Jlc3VsdCA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKQEAgLTIyNSw5ICsyMTgsOSBAQAogICAgIHJldHVybiByZXN1bHQ7CiAKICAgRmFpbDoKKyAgICBQeV9ERUNSRUYoc3RlcCk7CiAgICAgUHlfWERFQ1JFRih0bXAyKTsKICAgICBQeV9YREVDUkVGKGRpZmYpOwotICAgIFB5X1hERUNSRUYoc3RlcCk7CiAgICAgUHlfWERFQ1JFRih0bXAxKTsKICAgICBQeV9YREVDUkVGKG9uZSk7CiAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9PYmplY3RzL3NldG9iamVjdC5jIGIvT2JqZWN0cy9zZXRvYmplY3QuYwppbmRleCA0ZWY2OTJkLi42ZGQ0MDNmIDEwMDY0NAotLS0gYS9PYmplY3RzL3NldG9iamVjdC5jCisrKyBiL09iamVjdHMvc2V0b2JqZWN0LmMKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgotI2luY2x1ZGUgInN0cmluZ2xpYi9lcS5oIgogCiAvKiBPYmplY3QgdXNlZCBhcyBkdW1teSBrZXkgdG8gZmlsbCBkZWxldGVkIGVudHJpZXMgKi8KIHN0YXRpYyBQeU9iamVjdCBfZHVtbXlfc3RydWN0OwpAQCAtNDgsMTkgKzQ3LDIwIEBACiBzdGF0aWMgc2V0ZW50cnkgKgogc2V0X2xvb2trZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBzZXRlbnRyeSAqdGFibGUgPSBzby0+dGFibGU7Ci0gICAgc2V0ZW50cnkgKmZyZWVzbG90ID0gTlVMTDsKKyAgICBzZXRlbnRyeSAqdGFibGU7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwotICAgIHNpemVfdCBwZXJ0dXJiID0gaGFzaDsKKyAgICBzaXplX3QgcGVydHVyYjsKICAgICBzaXplX3QgbWFzayA9IHNvLT5tYXNrOwogICAgIHNpemVfdCBpID0gKHNpemVfdCloYXNoICYgbWFzazsgLyogVW5zaWduZWQgZm9yIGRlZmluZWQgb3ZlcmZsb3cgYmVoYXZpb3IgKi8KICAgICBzaXplX3QgajsKICAgICBpbnQgY21wOwogCi0gICAgZW50cnkgPSAmdGFibGVbaV07CisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOwogICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBlbnRyeTsKIAorICAgIHBlcnR1cmIgPSBoYXNoOworCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CkBAIC03MCw4ICs3MCw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0YXJ0a2V5KQogICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKLSAgICAgICAgICAgICAgICAmJiB1bmljb2RlX2VxKHN0YXJ0a2V5LCBrZXkpKQorICAgICAgICAgICAgICAgICYmIF9QeVVuaWNvZGVfRVEoc3RhcnRrZXksIGtleSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgICAgICAgICBQeV9JTkNSRUYoc3RhcnRrZXkpOwogICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGFydGtleSk7CkBAIC04MywxNCArODQsMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7ICAgICAgICAgICAgICAgICAvKiBoZWxwIGF2b2lkIGEgcmVnaXN0ZXIgc3BpbGwgKi8KICAgICAgICAgfQotICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gLTEgJiYgZnJlZXNsb3QgPT0gTlVMTCkKLSAgICAgICAgICAgIGZyZWVzbG90ID0gZW50cnk7CiAKICAgICAgICAgaWYgKGkgKyBMSU5FQVJfUFJPQkVTIDw9IG1hc2spIHsKICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgTElORUFSX1BST0JFUyA7IGorKykgewogICAgICAgICAgICAgICAgIGVudHJ5Kys7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZF9udWxsOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSAwICYmIGVudHJ5LT5rZXkgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwogICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGFydGtleSAhPSBkdW1teSk7CkBAIC05OCw4ICs5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHVuaWNvZGVfZXEoc3RhcnRrZXksIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBfUHlVbmljb2RlX0VRKHN0YXJ0a2V5LCBrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKICAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKICAgICAgICAgICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKQEAgLTExMSw3ICsxMTEsMTA0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBzby0+bWFzazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IC0xICYmIGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOworICAgICAgICBpID0gKGkgKiA1ICsgMSArIHBlcnR1cmIpICYgbWFzazsKKworICAgICAgICBlbnRyeSA9ICZzby0+dGFibGVbaV07CisgICAgICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNldF90YWJsZV9yZXNpemUoUHlTZXRPYmplY3QgKiwgUHlfc3NpemVfdCk7CisKK3N0YXRpYyBpbnQKK3NldF9hZGRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKK3sKKyAgICBzZXRlbnRyeSAqdGFibGU7CisgICAgc2V0ZW50cnkgKmZyZWVzbG90OworICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBzaXplX3QgcGVydHVyYjsKKyAgICBzaXplX3QgbWFzazsKKyAgICBzaXplX3QgaTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuc2lnbmVkIGZvciBkZWZpbmVkIG92ZXJmbG93IGJlaGF2aW9yICovCisgICAgc2l6ZV90IGo7CisgICAgaW50IGNtcDsKKworICAgIC8qIFByZS1pbmNyZW1lbnQgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgYXJiaXRyYXJ5IGNvZGUgaW4gdGhlIHJpY2gKKyAgICAgICBjb21wYXJpc29uIGZyb20gZGVhbGxvY2F0aW5nIHRoZSBrZXkganVzdCBiZWZvcmUgdGhlIGluc2VydGlvbi4gKi8KKyAgICBQeV9JTkNSRUYoa2V5KTsKKworICByZXN0YXJ0OgorCisgICAgbWFzayA9IHNvLT5tYXNrOworICAgIGkgPSAoc2l6ZV90KWhhc2ggJiBtYXNrOworCisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgIGdvdG8gZm91bmRfdW51c2VkOworCisgICAgZnJlZXNsb3QgPSBOVUxMOworICAgIHBlcnR1cmIgPSBoYXNoOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGVudHJ5LT5oYXNoID09IGhhc2gpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICAvKiBzdGFydGtleSBjYW5ub3QgYmUgYSBkdW1teSBiZWNhdXNlIHRoZSBkdW1teSBoYXNoIGZpZWxkIGlzIC0xICovCisgICAgICAgICAgICBhc3NlcnQoc3RhcnRrZXkgIT0gZHVtbXkpOworICAgICAgICAgICAgaWYgKHN0YXJ0a2V5ID09IGtleSkKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzdGFydGtleSkKKyAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpCisgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgIHRhYmxlID0gc28tPnRhYmxlOworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChzdGFydGtleSwga2V5LCBQeV9FUSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3RhcnRrZXkpOworICAgICAgICAgICAgaWYgKGNtcCA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGlrZWx5ICovCisgICAgICAgICAgICAgICAgZ290byBmb3VuZF9hY3RpdmU7CisgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGNvbXBhcmlzb25fZXJyb3I7CisgICAgICAgICAgICAvKiBDb250aW51aW5nIHRoZSBzZWFyY2ggZnJvbSB0aGUgY3VycmVudCBlbnRyeSBvbmx5IG1ha2VzCisgICAgICAgICAgICAgICBzZW5zZSBpZiB0aGUgdGFibGUgYW5kIGVudHJ5IGFyZSB1bmNoYW5nZWQ7IG90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIHdlIGhhdmUgdG8gcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBzby0+dGFibGUgfHwgZW50cnktPmtleSAhPSBzdGFydGtleSkKKyAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgICAgICAgICBtYXNrID0gc28tPm1hc2s7ICAgICAgICAgICAgICAgICAvKiBoZWxwIGF2b2lkIGEgcmVnaXN0ZXIgc3BpbGwgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQorICAgICAgICAgICAgZnJlZXNsb3QgPSBlbnRyeTsKKworICAgICAgICBpZiAoaSArIExJTkVBUl9QUk9CRVMgPD0gbWFzaykgeworICAgICAgICAgICAgZm9yIChqID0gMCA7IGogPCBMSU5FQVJfUFJPQkVTIDsgaisrKSB7CisgICAgICAgICAgICAgICAgZW50cnkrKzsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnktPmhhc2ggPT0gMCAmJiBlbnRyeS0+a2V5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfdW51c2VkX29yX2R1bW15OworICAgICAgICAgICAgICAgIGlmIChlbnRyeS0+aGFzaCA9PSBoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGFydGtleSA9IGVudHJ5LT5rZXk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGFydGtleSAhPSBkdW1teSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydGtleSA9PSBrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHN0YXJ0a2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgX1B5VW5pY29kZV9FUShzdGFydGtleSwga2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZm91bmRfYWN0aXZlOworICAgICAgICAgICAgICAgICAgICB0YWJsZSA9IHNvLT50YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHN0YXJ0a2V5LCBrZXksIFB5X0VRKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHN0YXJ0a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kX2FjdGl2ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNvbXBhcmlzb25fZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZSAhPSBzby0+dGFibGUgfHwgZW50cnktPmtleSAhPSBzdGFydGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IHNvLT5tYXNrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyeS0+aGFzaCA9PSAtMSAmJiBmcmVlc2xvdCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBmcmVlc2xvdCA9IGVudHJ5OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMTksMjkgKzIxNiw1MSBAQAogICAgICAgICBwZXJ0dXJiID4+PSBQRVJUVVJCX1NISUZUOwogICAgICAgICBpID0gKGkgKiA1ICsgMSArIHBlcnR1cmIpICYgbWFzazsKIAotICAgICAgICBlbnRyeSA9ICZ0YWJsZVtpXTsKKyAgICAgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOwogICAgICAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBmb3VuZF9udWxsOworICAgICAgICAgICAgZ290byBmb3VuZF91bnVzZWRfb3JfZHVtbXk7CiAgICAgfQotICBmb3VuZF9udWxsOgotICAgIHJldHVybiBmcmVlc2xvdCA9PSBOVUxMID8gZW50cnkgOiBmcmVlc2xvdDsKKworICBmb3VuZF91bnVzZWRfb3JfZHVtbXk6CisgICAgaWYgKGZyZWVzbG90ID09IE5VTEwpCisgICAgICAgIGdvdG8gZm91bmRfdW51c2VkOworICAgIHNvLT51c2VkKys7CisgICAgZnJlZXNsb3QtPmtleSA9IGtleTsKKyAgICBmcmVlc2xvdC0+aGFzaCA9IGhhc2g7CisgICAgcmV0dXJuIDA7CisKKyAgZm91bmRfdW51c2VkOgorICAgIHNvLT5maWxsKys7CisgICAgc28tPnVzZWQrKzsKKyAgICBlbnRyeS0+a2V5ID0ga2V5OworICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKKyAgICBpZiAoKHNpemVfdClzby0+ZmlsbCozIDwgbWFzayoyKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2V0X3RhYmxlX3Jlc2l6ZShzbywgc28tPnVzZWQpOworCisgIGZvdW5kX2FjdGl2ZToKKyAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICByZXR1cm4gMDsKKworICBjb21wYXJpc29uX2Vycm9yOgorICAgIFB5X0RFQ1JFRihrZXkpOworICAgIHJldHVybiAtMTsKIH0KIAogLyoKIEludGVybmFsIHJvdXRpbmUgdXNlZCBieSBzZXRfdGFibGVfcmVzaXplKCkgdG8gaW5zZXJ0IGFuIGl0ZW0gd2hpY2ggaXMKIGtub3duIHRvIGJlIGFic2VudCBmcm9tIHRoZSBzZXQuICBUaGlzIHJvdXRpbmUgYWxzbyBhc3N1bWVzIHRoYXQKIHRoZSBzZXQgY29udGFpbnMgbm8gZGVsZXRlZCBlbnRyaWVzLiAgQmVzaWRlcyB0aGUgcGVyZm9ybWFuY2UgYmVuZWZpdCwKLXVzaW5nIHNldF9pbnNlcnRfY2xlYW4oKSBpbiBzZXRfdGFibGVfcmVzaXplKCkgaXMgZGFuZ2Vyb3VzIChTRiBidWcgIzE0NTYyMDkpLgotTm90ZSB0aGF0IG5vIHJlZmNvdW50cyBhcmUgY2hhbmdlZCBieSB0aGlzIHJvdXRpbmU7IGlmIG5lZWRlZCwgdGhlIGNhbGxlcgotaXMgcmVzcG9uc2libGUgZm9yIGluY3JlZidpbmcgYGtleWAuCit0aGVyZSBpcyBhbHNvIHNhZmV0eSBiZW5lZml0IHNpbmNlIHVzaW5nIHNldF9hZGRfZW50cnkoKSByaXNrcyBtYWtpbmcKK2EgY2FsbGJhY2sgaW4gdGhlIG1pZGRsZSBvZiBhIHNldF90YWJsZV9yZXNpemUoKSwgc2VlIGlzc3VlIDE0NTYyMDkuCitUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyB0aGUga2V5J3MgcmVmZXJlbmNlIGNvdW50IGFuZAordGhlIHNldG9iamVjdCdzIGZpbGwgYW5kIHVzZWQgZmllbGRzLgogKi8KIHN0YXRpYyB2b2lkCi1zZXRfaW5zZXJ0X2NsZWFuKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgUHlfaGFzaF90IGhhc2gpCitzZXRfaW5zZXJ0X2NsZWFuKHNldGVudHJ5ICp0YWJsZSwgc2l6ZV90IG1hc2ssIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQogewotICAgIHNldGVudHJ5ICp0YWJsZSA9IHNvLT50YWJsZTsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgc2l6ZV90IHBlcnR1cmIgPSBoYXNoOwotICAgIHNpemVfdCBtYXNrID0gKHNpemVfdClzby0+bWFzazsKICAgICBzaXplX3QgaSA9IChzaXplX3QpaGFzaCAmIG1hc2s7CiAgICAgc2l6ZV90IGo7CiAKQEAgLTE2Miw0NSArMjgxLDExIEBACiAgIGZvdW5kX251bGw6CiAgICAgZW50cnktPmtleSA9IGtleTsKICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgc28tPmZpbGwrKzsKLSAgICBzby0+dXNlZCsrOwogfQogCiAvKiA9PT09PT09PSBFbmQgbG9naWMgZm9yIHByb2JpbmcgdGhlIGhhc2ggdGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi0KLS8qCi1JbnRlcm5hbCByb3V0aW5lIHRvIGluc2VydCBhIG5ldyBrZXkgaW50byB0aGUgdGFibGUuCi1Vc2VkIGJ5IHRoZSBwdWJsaWMgaW5zZXJ0IHJvdXRpbmUuCi1FYXRzIGEgcmVmZXJlbmNlIHRvIGtleS4KLSovCi1zdGF0aWMgaW50Ci1zZXRfaW5zZXJ0X2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIFB5X2hhc2hfdCBoYXNoKQotewotICAgIHNldGVudHJ5ICplbnRyeTsKLQotICAgIGVudHJ5ID0gc2V0X2xvb2trZXkoc28sIGtleSwgaGFzaCk7Ci0gICAgaWYgKGVudHJ5ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoZW50cnktPmtleSA9PSBOVUxMKSB7Ci0gICAgICAgIC8qIFVOVVNFRCAqLwotICAgICAgICBlbnRyeS0+a2V5ID0ga2V5OwotICAgICAgICBlbnRyeS0+aGFzaCA9IGhhc2g7Ci0gICAgICAgIHNvLT5maWxsKys7Ci0gICAgICAgIHNvLT51c2VkKys7Ci0gICAgfSBlbHNlIGlmIChlbnRyeS0+a2V5ID09IGR1bW15KSB7Ci0gICAgICAgIC8qIERVTU1ZICovCi0gICAgICAgIGVudHJ5LT5rZXkgPSBrZXk7Ci0gICAgICAgIGVudHJ5LT5oYXNoID0gaGFzaDsKLSAgICAgICAgc28tPnVzZWQrKzsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBBQ1RJVkUgKi8KLSAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiAvKgogUmVzdHJ1Y3R1cmUgdGhlIHRhYmxlIGJ5IGFsbG9jYXRpbmcgYSBuZXcgdGFibGUgYW5kIHJlaW5zZXJ0aW5nIGFsbAoga2V5cyBhZ2Fpbi4gIFdoZW4gZW50cmllcyBoYXZlIGJlZW4gZGVsZXRlZCwgdGhlIG5ldyB0YWJsZSBtYXkKQEAgLTIxMywxMCArMjk4LDEzIEBACiAgICAgc2V0ZW50cnkgKm9sZHRhYmxlLCAqbmV3dGFibGUsICplbnRyeTsKICAgICBQeV9zc2l6ZV90IG9sZGZpbGwgPSBzby0+ZmlsbDsKICAgICBQeV9zc2l6ZV90IG9sZHVzZWQgPSBzby0+dXNlZDsKKyAgICBQeV9zc2l6ZV90IG9sZG1hc2sgPSBzby0+bWFzazsKKyAgICBzaXplX3QgbmV3bWFzazsKICAgICBpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CiAgICAgc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKIAogICAgIGFzc2VydChtaW51c2VkID49IDApOworICAgIG1pbnVzZWQgPSAobWludXNlZCA+IDUwMDAwKSA/IG1pbnVzZWQgKiAyIDogbWludXNlZCAqIDQ7CiAKICAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCB0YWJsZSBzaXplID4gbWludXNlZC4gKi8KICAgICAvKiBYWFggc3BlZWQtdXAgd2l0aCBpbnRyaW5zaWNzICovCkBAIC0yNjQsMjUgKzM1MiwyNCBAQAogICAgIC8qIE1ha2UgdGhlIHNldCBlbXB0eSwgdXNpbmcgdGhlIG5ldyB0YWJsZS4gKi8KICAgICBhc3NlcnQobmV3dGFibGUgIT0gb2xkdGFibGUpOwogICAgIG1lbXNldChuZXd0YWJsZSwgMCwgc2l6ZW9mKHNldGVudHJ5KSAqIG5ld3NpemUpOwotICAgIHNvLT5maWxsID0gMDsKLSAgICBzby0+dXNlZCA9IDA7CisgICAgc28tPmZpbGwgPSBvbGR1c2VkOworICAgIHNvLT51c2VkID0gb2xkdXNlZDsKICAgICBzby0+bWFzayA9IG5ld3NpemUgLSAxOwogICAgIHNvLT50YWJsZSA9IG5ld3RhYmxlOwogCiAgICAgLyogQ29weSB0aGUgZGF0YSBvdmVyOyB0aGlzIGlzIHJlZmNvdW50LW5ldXRyYWwgZm9yIGFjdGl2ZSBlbnRyaWVzOwogICAgICAgIGR1bW15IGVudHJpZXMgYXJlbid0IGNvcGllZCBvdmVyLCBvZiBjb3Vyc2UgKi8KKyAgICBuZXdtYXNrID0gKHNpemVfdClzby0+bWFzazsKICAgICBpZiAob2xkZmlsbCA9PSBvbGR1c2VkKSB7Ci0gICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgb2xkdXNlZCA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBlbnRyeSA8PSBvbGR0YWJsZSArIG9sZG1hc2s7IGVudHJ5KyspIHsKICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBvbGR1c2VkLS07Ci0gICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAgICAgIHNldF9pbnNlcnRfY2xlYW4obmV3dGFibGUsIG5ld21hc2ssIGVudHJ5LT5rZXksIGVudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoZW50cnkgPSBvbGR0YWJsZTsgb2xkdXNlZCA+IDA7IGVudHJ5KyspIHsKKyAgICAgICAgZm9yIChlbnRyeSA9IG9sZHRhYmxlOyBlbnRyeSA8PSBvbGR0YWJsZSArIG9sZG1hc2s7IGVudHJ5KyspIHsKICAgICAgICAgICAgIGlmIChlbnRyeS0+a2V5ICE9IE5VTEwgJiYgZW50cnktPmtleSAhPSBkdW1teSkgewotICAgICAgICAgICAgICAgIG9sZHVzZWQtLTsKLSAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICAgICAgc2V0X2luc2VydF9jbGVhbihuZXd0YWJsZSwgbmV3bWFzaywgZW50cnktPmtleSwgZW50cnktPmhhc2gpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjkyLDU3ICszNzksMzAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogQ0FVVElPTjogc2V0X2FkZF9rZXkvZW50cnkoKSBtdXN0IGd1YXJhbnRlZSBpdCB3b24ndCByZXNpemUgdGhlIHRhYmxlICovCi0KIHN0YXRpYyBpbnQKLXNldF9hZGRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCitzZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKLSAgICBQeV9zc2l6ZV90IG5fdXNlZDsKLSAgICBQeU9iamVjdCAqa2V5ID0gZW50cnktPmtleTsKLSAgICBQeV9oYXNoX3QgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgIHNldGVudHJ5ICplbnRyeTsKIAotICAgIGFzc2VydChzby0+ZmlsbCA8PSBzby0+bWFzayk7ICAvKiBhdCBsZWFzdCBvbmUgZW1wdHkgc2xvdCAqLwotICAgIG5fdXNlZCA9IHNvLT51c2VkOwotICAgIFB5X0lOQ1JFRihrZXkpOwotICAgIGlmIChzZXRfaW5zZXJ0X2tleShzbywga2V5LCBoYXNoKSkgewotICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoIShzby0+dXNlZCA+IG5fdXNlZCAmJiBzby0+ZmlsbCozID49IChzby0+bWFzaysxKSoyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOwotfQotCi1zdGF0aWMgaW50Ci1zZXRfYWRkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCi17Ci0gICAgc2V0ZW50cnkgZW50cnk7Ci0gICAgUHlfaGFzaF90IGhhc2g7Ci0KLSAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKLSAgICAgICAgKGhhc2ggPSAoKFB5QVNDSUlPYmplY3QgKikga2V5KS0+aGFzaCkgPT0gLTEpIHsKLSAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLSAgICAgICAgaWYgKGhhc2ggPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICByZXR1cm4gc2V0X2FkZF9lbnRyeShzbywgJmVudHJ5KTsKKyAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBrZXksIGhhc2gpOworICAgIGlmIChlbnRyeSAhPSBOVUxMKQorICAgICAgICByZXR1cm4gZW50cnktPmtleSAhPSBOVUxMOworICAgIHJldHVybiAtMTsKIH0KIAogI2RlZmluZSBESVNDQVJEX05PVEZPVU5EIDAKICNkZWZpbmUgRElTQ0FSRF9GT1VORCAxCiAKIHN0YXRpYyBpbnQKLXNldF9kaXNjYXJkX2VudHJ5KFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKm9sZGVudHJ5KQorc2V0X2Rpc2NhcmRfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBQeV9oYXNoX3QgaGFzaCkKIHsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlPYmplY3QgKm9sZF9rZXk7CiAKLSAgICBlbnRyeSA9IHNldF9sb29ra2V5KHNvLCBvbGRlbnRyeS0+a2V5LCBvbGRlbnRyeS0+aGFzaCk7CisgICAgZW50cnkgPSBzZXRfbG9va2tleShzbywga2V5LCBoYXNoKTsKICAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwgIHx8ICBlbnRyeS0+a2V5ID09IGR1bW15KQorICAgIGlmIChlbnRyeS0+a2V5ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBESVNDQVJEX05PVEZPVU5EOwogICAgIG9sZF9rZXkgPSBlbnRyeS0+a2V5OwogICAgIGVudHJ5LT5rZXkgPSBkdW1teTsKQEAgLTM1MywyMiArNDEzLDQ1IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9kaXNjYXJkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCitzZXRfYWRkX2tleShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgc2V0ZW50cnkgZW50cnk7CiAgICAgUHlfaGFzaF90IGhhc2g7CiAKLSAgICBhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7Ci0KICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwKICAgICAgICAgKGhhc2ggPSAoKFB5QVNDSUlPYmplY3QgKikga2V5KS0+aGFzaCkgPT0gLTEpIHsKICAgICAgICAgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGVudHJ5LmtleSA9IGtleTsKLSAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICByZXR1cm4gc2V0X2Rpc2NhcmRfZW50cnkoc28sICZlbnRyeSk7CisgICAgcmV0dXJuIHNldF9hZGRfZW50cnkoc28sIGtleSwgaGFzaCk7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQoreworICAgIFB5X2hhc2hfdCBoYXNoOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworfQorCitzdGF0aWMgaW50CitzZXRfZGlzY2FyZF9rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQoreworICAgIFB5X2hhc2hfdCBoYXNoOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8CisgICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc2V0X2Rpc2NhcmRfZW50cnkoc28sIGtleSwgaGFzaCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC00NDksMjAgKzUzMiwyMiBAQAogewogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeV9zc2l6ZV90IG1hc2s7Ci0gICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICplbnRyeTsKIAogICAgIGFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKICAgICBpID0gKnBvc19wdHI7CiAgICAgYXNzZXJ0KGkgPj0gMCk7Ci0gICAgdGFibGUgPSBzby0+dGFibGU7CiAgICAgbWFzayA9IHNvLT5tYXNrOwotICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKHRhYmxlW2ldLmtleSA9PSBOVUxMIHx8IHRhYmxlW2ldLmtleSA9PSBkdW1teSkpCisgICAgZW50cnkgPSAmc28tPnRhYmxlW2ldOworICAgIHdoaWxlIChpIDw9IG1hc2sgJiYgKGVudHJ5LT5rZXkgPT0gTlVMTCB8fCBlbnRyeS0+a2V5ID09IGR1bW15KSkgewogICAgICAgICBpKys7CisgICAgICAgIGVudHJ5Kys7CisgICAgfQogICAgICpwb3NfcHRyID0gaSsxOwogICAgIGlmIChpID4gbWFzaykKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgYXNzZXJ0KHRhYmxlW2ldLmtleSAhPSBOVUxMKTsKLSAgICAqZW50cnlfcHRyID0gJnRhYmxlW2ldOworICAgIGFzc2VydChlbnRyeSAhPSBOVUxMKTsKKyAgICAqZW50cnlfcHRyID0gZW50cnk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTU2MCw4ICs2NDUsOCBAQAogICAgICAqIGluY3JlbWVudGFsbHkgcmVzaXppbmcgYXMgd2UgaW5zZXJ0IG5ldyBrZXlzLiAgRXhwZWN0CiAgICAgICogdGhhdCB0aGVyZSB3aWxsIGJlIG5vIChvciBmZXcpIG92ZXJsYXBwaW5nIGtleXMuCiAgICAgICovCi0gICAgaWYgKChzby0+ZmlsbCArIG90aGVyLT51c2VkKSozID49IChzby0+bWFzaysxKSoyKSB7Ci0gICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIChzby0+dXNlZCArIG90aGVyLT51c2VkKSoyKSAhPSAwKQorICAgIGlmICgoc28tPmZpbGwgKyBvdGhlci0+dXNlZCkqMyA+PSBzby0+bWFzayoyKSB7CisgICAgICAgaWYgKHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkICsgb3RoZXItPnVzZWQpICE9IDApCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgc29fZW50cnkgPSBzby0+dGFibGU7CkBAIC01ODYsMTEgKzY3MSwxNSBAQAogCiAgICAgLyogSWYgb3VyIHRhYmxlIGlzIGVtcHR5LCB3ZSBjYW4gdXNlIHNldF9pbnNlcnRfY2xlYW4oKSAqLwogICAgIGlmIChzby0+ZmlsbCA9PSAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPD0gb3RoZXItPm1hc2s7IGkrKywgb3RoZXJfZW50cnkrKykgeworICAgICAgICBzZXRlbnRyeSAqbmV3dGFibGUgPSBzby0+dGFibGU7CisgICAgICAgIHNpemVfdCBuZXdtYXNrID0gKHNpemVfdClzby0+bWFzazsKKyAgICAgICAgc28tPmZpbGwgPSBvdGhlci0+dXNlZDsKKyAgICAgICAgc28tPnVzZWQgPSBvdGhlci0+dXNlZDsKKyAgICAgICAgZm9yIChpID0gb3RoZXItPm1hc2sgKyAxOyBpID4gMCA7IGktLSwgb3RoZXJfZW50cnkrKykgewogICAgICAgICAgICAga2V5ID0gb3RoZXJfZW50cnktPmtleTsKICAgICAgICAgICAgIGlmIChrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXkpIHsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKLSAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKHNvLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKTsKKyAgICAgICAgICAgICAgICBzZXRfaW5zZXJ0X2NsZWFuKG5ld3RhYmxlLCBuZXdtYXNrLCBrZXksIG90aGVyX2VudHJ5LT5oYXNoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKQEAgLTYwMSw0NiArNjkwLDEzIEBACiAgICAgICAgIG90aGVyX2VudHJ5ID0gJm90aGVyLT50YWJsZVtpXTsKICAgICAgICAga2V5ID0gb3RoZXJfZW50cnktPmtleTsKICAgICAgICAgaWYgKGtleSAhPSBOVUxMICYmIGtleSAhPSBkdW1teSkgewotICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBpZiAoc2V0X2luc2VydF9rZXkoc28sIGtleSwgb3RoZXJfZW50cnktPmhhc2gpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBvdGhlcl9lbnRyeS0+aGFzaCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1zZXRfY29udGFpbnNfZW50cnkoUHlTZXRPYmplY3QgKnNvLCBzZXRlbnRyeSAqZW50cnkpCi17Ci0gICAgUHlPYmplY3QgKmtleTsKLSAgICBzZXRlbnRyeSAqbHVfZW50cnk7Ci0KLSAgICBsdV9lbnRyeSA9IHNldF9sb29ra2V5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7Ci0gICAgaWYgKGx1X2VudHJ5ID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBrZXkgPSBsdV9lbnRyeS0+a2V5OwotICAgIHJldHVybiBrZXkgIT0gTlVMTCAmJiBrZXkgIT0gZHVtbXk7Ci19Ci0KLXN0YXRpYyBpbnQKLXNldF9jb250YWluc19rZXkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQotewotICAgIHNldGVudHJ5IGVudHJ5OwotICAgIFB5X2hhc2hfdCBoYXNoOwotCi0gICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChrZXkpIHx8Ci0gICAgICAgIChoYXNoID0gKChQeUFTQ0lJT2JqZWN0ICopIGtleSktPmhhc2gpID09IC0xKSB7Ci0gICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7Ci0gICAgICAgIGlmIChoYXNoID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgZW50cnkuaGFzaCA9IGhhc2g7Ci0gICAgcmV0dXJuIHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9wb3AoUHlTZXRPYmplY3QgKnNvKQogewpAQCAtNjgyLDQzICs3MzgsNjQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyogV29yayB0byBpbmNyZWFzZSB0aGUgYml0IGRpc3BlcnNpb24gZm9yIGNsb3NlbHkgc3BhY2VkIGhhc2ggdmFsdWVzLgorICAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBzb21lIHVzZSBjYXNlcyBoYXZlIG1hbnkgY29tYmluYXRpb25zIG9mIGEKKyAgIHNtYWxsIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIG5lYXJieSBoYXNoZXMgc28gdGhhdCBtYW55IGRpc3RpbmN0CisgICBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seSBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCisKK3N0YXRpYyBQeV91aGFzaF90Citfc2h1ZmZsZV9iaXRzKFB5X3VoYXNoX3QgaCkKK3sKKyAgICByZXR1cm4gKChoIF4gODk4Njk3NDdVTCkgXiAoaCA8PCAxNikpICogMzY0NDc5ODE2N1VMOworfQorCisvKiBNb3N0IG9mIHRoZSBjb25zdGFudHMgaW4gdGhpcyBoYXNoIGFsZ29yaXRobSBhcmUgcmFuZG9tbHkgY2hvc2VuCisgICBsYXJnZSBwcmltZXMgd2l0aCAiaW50ZXJlc3RpbmcgYml0IHBhdHRlcm5zIiBhbmQgdGhhdCBwYXNzZWQgdGVzdHMKKyAgIGZvciBnb29kIGNvbGxpc2lvbiBzdGF0aXN0aWNzIG9uIGEgdmFyaWV0eSBvZiBwcm9ibGVtYXRpYyBkYXRhc2V0cworICAgaW5jbHVkaW5nIHBvd2Vyc2V0cyBhbmQgZ3JhcGggc3RydWN0dXJlcyAoc3VjaCBhcyBEYXZpZCBFcHBzdGVpbidzCisgICBncmFwaCByZWNpcGVzIGluIExpYi90ZXN0L3Rlc3Rfc2V0LnB5KSAqLworCiBzdGF0aWMgUHlfaGFzaF90CiBmcm96ZW5zZXRfaGFzaChQeU9iamVjdCAqc2VsZikKIHsKLSAgICAvKiBNb3N0IG9mIHRoZSBjb25zdGFudHMgaW4gdGhpcyBoYXNoIGFsZ29yaXRobSBhcmUgcmFuZG9tbHkgY2hvb3NlbgotICAgICAgIGxhcmdlIHByaW1lcyB3aXRoICJpbnRlcmVzdGluZyBiaXQgcGF0dGVybnMiIGFuZCB0aGF0IHBhc3NlZAotICAgICAgIHRlc3RzIGZvciBnb29kIGNvbGxpc2lvbiBzdGF0aXN0aWNzIG9uIGEgdmFyaWV0eSBvZiBwcm9ibGVtYXRpYwotICAgICAgIGRhdGFzZXRzIHN1Y2ggYXM6Ci0KLSAgICAgICAgICBwcyA9IFtdCi0gICAgICAgICAgZm9yIHIgaW4gcmFuZ2UoMjEpOgotICAgICAgICAgICAgICBwcyArPSBpdGVydG9vbHMuY29tYmluYXRpb25zKHJhbmdlKDIwKSwgcikKLSAgICAgICAgICBudW1fZGlzdGluY3RfaGFzaGVzID0gbGVuKHtoYXNoKGZyb3plbnNldChzKSkgZm9yIHMgaW4gcHN9KQotCi0gICAgKi8KICAgICBQeVNldE9iamVjdCAqc28gPSAoUHlTZXRPYmplY3QgKilzZWxmOwotICAgIFB5X3VoYXNoX3QgaCwgaGFzaCA9IDE5Mjc4NjgyMzdVTDsKKyAgICBQeV91aGFzaF90IGhhc2ggPSAwOwogICAgIHNldGVudHJ5ICplbnRyeTsKLSAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CiAKICAgICBpZiAoc28tPmhhc2ggIT0gLTEpCiAgICAgICAgIHJldHVybiBzby0+aGFzaDsKIAotICAgIGhhc2ggKj0gKFB5X3VoYXNoX3QpUHlTZXRfR0VUX1NJWkUoc2VsZikgKyAxOwotICAgIHdoaWxlIChzZXRfbmV4dChzbywgJnBvcywgJmVudHJ5KSkgewotICAgICAgICAvKiBXb3JrIHRvIGluY3JlYXNlIHRoZSBiaXQgZGlzcGVyc2lvbiBmb3IgY2xvc2VseSBzcGFjZWQgaGFzaAotICAgICAgICAgICB2YWx1ZXMuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHNvbWUgdXNlIGNhc2VzIGhhdmUgbWFueQotICAgICAgICAgICBjb21iaW5hdGlvbnMgb2YgYSBzbWFsbCBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBuZWFyYnkKLSAgICAgICAgICAgaGFzaGVzIHNvIHRoYXQgbWFueSBkaXN0aW5jdCBjb21iaW5hdGlvbnMgY29sbGFwc2UgdG8gb25seQotICAgICAgICAgICBhIGhhbmRmdWwgb2YgZGlzdGluY3QgaGFzaCB2YWx1ZXMuICovCi0gICAgICAgIGggPSBlbnRyeS0+aGFzaDsKLSAgICAgICAgaGFzaCBePSAoKGggXiA4OTg2OTc0N1VMKSBeIChoIDw8IDE2KSkgKiAzNjQ0Nzk4MTY3VUw7Ci0gICAgfQotICAgIC8qIE1ha2UgdGhlIGZpbmFsIHJlc3VsdCBzcHJlYWQtb3V0IGluIGEgZGlmZmVyZW50IHBhdHRlcm4KLSAgICAgICB0aGFuIHRoZSBhbGdvcml0aG0gZm9yIHR1cGxlcyBvciBvdGhlciBweXRob24gb2JqZWN0cy4gKi8KKyAgICAvKiBYb3ItaW4gc2h1ZmZsZWQgYml0cyBmcm9tIGV2ZXJ5IGVudHJ5J3MgaGFzaCBmaWVsZCBiZWNhdXNlIHhvciBpcworICAgICAgIGNvbW11dGF0aXZlIGFuZCBhIGZyb3plbnNldCBoYXNoIHNob3VsZCBiZSBpbmRlcGVuZGVudCBvZiBvcmRlci4KKworICAgICAgIEZvciBzcGVlZCwgaW5jbHVkZSBudWxsIGVudHJpZXMgYW5kIGR1bW15IGVudHJpZXMgYW5kIHRoZW4KKyAgICAgICBzdWJ0cmFjdCBvdXQgdGhlaXIgZWZmZWN0IGFmdGVyd2FyZHMgc28gdGhhdCB0aGUgZmluYWwgaGFzaAorICAgICAgIGRlcGVuZHMgb25seSBvbiBhY3RpdmUgZW50cmllcy4gIFRoaXMgYWxsb3dzIHRoZSBjb2RlIHRvIGJlCisgICAgICAgdmVjdG9yaXplZCBieSB0aGUgY29tcGlsZXIgYW5kIGl0IHNhdmVzIHRoZSB1bnByZWRpY3RhYmxlCisgICAgICAgYnJhbmNoZXMgdGhhdCB3b3VsZCBhcmlzZSB3aGVuIHRyeWluZyB0byBleGNsdWRlIG51bGwgYW5kIGR1bW15CisgICAgICAgZW50cmllcyBvbiBldmVyeSBpdGVyYXRpb24uICovCisKKyAgICBmb3IgKGVudHJ5ID0gc28tPnRhYmxlOyBlbnRyeSA8PSAmc28tPnRhYmxlW3NvLT5tYXNrXTsgZW50cnkrKykKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKGVudHJ5LT5oYXNoKTsKKworICAgIC8qIFJlbW92ZSB0aGUgZWZmZWN0IG9mIGFuIG9kZCBudW1iZXIgb2YgTlVMTCBlbnRyaWVzICovCisgICAgaWYgKChzby0+bWFzayArIDEgLSBzby0+ZmlsbCkgJiAxKQorICAgICAgICBoYXNoIF49IF9zaHVmZmxlX2JpdHMoMCk7CisKKyAgICAvKiBSZW1vdmUgdGhlIGVmZmVjdCBvZiBhbiBvZGQgbnVtYmVyIG9mIGR1bW15IGVudHJpZXMgKi8KKyAgICBpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICYgMSkKKyAgICAgICAgaGFzaCBePSBfc2h1ZmZsZV9iaXRzKC0xKTsKKworICAgIC8qIEZhY3RvciBpbiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBlbnRyaWVzICovCisgICAgaGFzaCBePSAoKFB5X3VoYXNoX3QpUHlTZXRfR0VUX1NJWkUoc2VsZikgKyAxKSAqIDE5Mjc4NjgyMzdVTDsKKworICAgIC8qIERpc3BlcnNlIHBhdHRlcm5zIGFyaXNpbmcgaW4gbmVzdGVkIGZyb3plbnNldHMgKi8KICAgICBoYXNoID0gaGFzaCAqIDY5MDY5VSArIDkwNzEzMzkyM1VMOworCisgICAgLyogLTEgaXMgcmVzZXJ2ZWQgYXMgYW4gZXJyb3IgY29kZSAqLwogICAgIGlmIChoYXNoID09IChQeV91aGFzaF90KS0xKQogICAgICAgICBoYXNoID0gNTkwOTIzNzEzVUw7CisKICAgICBzby0+aGFzaCA9IGhhc2g7CiAgICAgcmV0dXJuIGhhc2g7CiB9CkBAIC04NjUsNyArOTQyLDcgQEAKICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCi0gICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLC8qIHRwX2ZsYWdzICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX0dDLCAgICAvKiB0cF9mbGFncyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgKHRyYXZlcnNlcHJvYylzZXRpdGVyX3RyYXZlcnNlLCAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KQEAgLTkxMCwxOCArOTg3LDE0IEBACiAgICAgICAgICogaW5jcmVtZW50YWxseSByZXNpemluZyBhcyB3ZSBpbnNlcnQgbmV3IGtleXMuICBFeHBlY3QKICAgICAgICAgKiB0aGF0IHRoZXJlIHdpbGwgYmUgbm8gKG9yIGZldykgb3ZlcmxhcHBpbmcga2V5cy4KICAgICAgICAgKi8KLSAgICAgICAgaWYgKGRpY3RzaXplID09IC0xKQorICAgICAgICBpZiAoZGljdHNpemUgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoKHNvLT5maWxsICsgZGljdHNpemUpKjMgPj0gKHNvLT5tYXNrKzEpKjIpIHsKLSAgICAgICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCAoc28tPnVzZWQgKyBkaWN0c2l6ZSkqMikgIT0gMCkKKyAgICAgICAgaWYgKChzby0+ZmlsbCArIGRpY3RzaXplKSozID49IHNvLT5tYXNrKjIpIHsKKyAgICAgICAgICAgIGlmIChzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCArIGRpY3RzaXplKSAhPSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoX1B5RGljdF9OZXh0KG90aGVyLCAmcG9zLCAma2V5LCAmdmFsdWUsICZoYXNoKSkgewotICAgICAgICAgICAgc2V0ZW50cnkgYW5fZW50cnk7Ci0KLSAgICAgICAgICAgIGFuX2VudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICAgICAgYW5fZW50cnkua2V5ID0ga2V5OwotICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkpCisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CkBAIC05NzAsOSArMTA0Myw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogbWFrZV9uZXdfc2V0KFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewotICAgIFB5U2V0T2JqZWN0ICpzbyA9IE5VTEw7CisgICAgUHlTZXRPYmplY3QgKnNvOwogCi0gICAgLyogY3JlYXRlIFB5U2V0T2JqZWN0IHN0cnVjdHVyZSAqLwogICAgIHNvID0gKFB5U2V0T2JqZWN0ICopdHlwZS0+dHBfYWxsb2ModHlwZSwgMCk7CiAgICAgaWYgKHNvID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTAxNSw3ICsxMDg3LDggQEAKIHsKICAgICBQeU9iamVjdCAqaXRlcmFibGUgPSBOVUxMLCAqcmVzdWx0OwogCi0gICAgaWYgKHR5cGUgPT0gJlB5RnJvemVuU2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJmcm96ZW5zZXQoKSIsIGt3ZHMpKQorICAgIGlmIChrd2RzICE9IE5VTEwgJiYgdHlwZSA9PSAmUHlGcm96ZW5TZXRfVHlwZQorICAgICAgICAmJiAhX1B5QXJnX05vS2V5d29yZHMoImZyb3plbnNldCgpIiwga3dkcykpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCB0eXBlLT50cF9uYW1lLCAwLCAxLCAmaXRlcmFibGUpKQpAQCAtMTA0MiwyNCArMTExNSw5IEBACiAgICAgcmV0dXJuIGVtcHR5ZnJvemVuc2V0OwogfQogCi1pbnQKLVB5U2V0X0NsZWFyRnJlZUxpc3Qodm9pZCkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZAotUHlTZXRfRmluaSh2b2lkKQotewotICAgIFB5X0NMRUFSKGVtcHR5ZnJvemVuc2V0KTsKLX0KLQogc3RhdGljIFB5T2JqZWN0ICoKIHNldF9uZXcoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgaWYgKHR5cGUgPT0gJlB5U2V0X1R5cGUgJiYgIV9QeUFyZ19Ob0tleXdvcmRzKCJzZXQoKSIsIGt3ZHMpKQotICAgICAgICByZXR1cm4gTlVMTDsKLQogICAgIHJldHVybiBtYWtlX25ld19zZXQodHlwZSwgTlVMTCk7CiB9CiAKQEAgLTEyMDEsNiArMTI1OSw4IEBACiB7CiAgICAgUHlTZXRPYmplY3QgKnJlc3VsdDsKICAgICBQeU9iamVjdCAqa2V5LCAqaXQsICp0bXA7CisgICAgUHlfaGFzaF90IGhhc2g7CisgICAgaW50IHJ2OwogCiAgICAgaWYgKChQeU9iamVjdCAqKXNvID09IG90aGVyKQogICAgICAgICByZXR1cm4gc2V0X2NvcHkoc28pOwpAQCAtMTIyMCwxMyArMTI4MCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJ2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkocmVzdWx0LCBlbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyNDIsMzIgKzEzMDQsMTUgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBpbnQgcnY7Ci0gICAgICAgIHNldGVudHJ5IGVudHJ5OwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9IFB5T2JqZWN0X0hhc2goa2V5KTsKLQotICAgICAgICBpZiAoaGFzaCA9PSAtMSkgewotICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgZW50cnkua2V5ID0ga2V5OwotICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywgJmVudHJ5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGtleSwgaGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICBpZiAocnYpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHJlc3VsdCwgJmVudHJ5KSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShyZXN1bHQsIGtleSwgaGFzaCkpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICB9CkBAIC0xMjc3LDYgKzEzMjIsMTEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisgIGVycm9yOgorICAgIFB5X0RFQ1JFRihpdCk7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgUHlfREVDUkVGKGtleSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMzYzLDYgKzE0MTMsNyBAQAogc2V0X2lzZGlzam9pbnQoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXIpCiB7CiAgICAgUHlPYmplY3QgKmtleSwgKml0LCAqdG1wOworICAgIGludCBydjsKIAogICAgIGlmICgoUHlPYmplY3QgKilzbyA9PSBvdGhlcikgewogICAgICAgICBpZiAoUHlTZXRfR0VUX1NJWkUoc28pID09IDApCkBAIC0xMzgxLDggKzE0MzIsOCBAQAogICAgICAgICAgICAgb3RoZXIgPSB0bXA7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKHNldF9uZXh0KChQeVNldE9iamVjdCAqKW90aGVyLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgICAgICBpbnQgcnYgPSBzZXRfY29udGFpbnNfZW50cnkoc28sIGVudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJ2KQogICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTEzOTUsOCArMTQ0Niw2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgd2hpbGUgKChrZXkgPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgaW50IHJ2OwotICAgICAgICBzZXRlbnRyeSBlbnRyeTsKICAgICAgICAgUHlfaGFzaF90IGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CiAKICAgICAgICAgaWYgKGhhc2ggPT0gLTEpIHsKQEAgLTE0MDQsMTEgKzE0NTMsOSBAQAogICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIGVudHJ5Lmhhc2ggPSBoYXNoOwotICAgICAgICBlbnRyeS5rZXkgPSBrZXk7Ci0gICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KHNvLCAmZW50cnkpOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeShzbywga2V5LCBoYXNoKTsKICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTE0MzcsNyArMTQ4NCw3IEBACiAgICAgICAgIFB5X3NzaXplX3QgcG9zID0gMDsKIAogICAgICAgICB3aGlsZSAoc2V0X25leHQoKFB5U2V0T2JqZWN0ICopb3RoZXIsICZwb3MsICZlbnRyeSkpCi0gICAgICAgICAgICBpZiAoc2V0X2Rpc2NhcmRfZW50cnkoc28sIGVudHJ5KSA9PSAtMSkKKyAgICAgICAgICAgIGlmIChzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnktPmtleSwgZW50cnktPmhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUHlPYmplY3QgKmtleSwgKml0OwpAQCAtMTQ0Niw3ICsxNDkzLDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICB3aGlsZSAoKGtleSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA9PSAtMSkgeworICAgICAgICAgICAgaWYgKHNldF9kaXNjYXJkX2tleShzbywga2V5KSA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTE0NTcsMTAgKzE1MDQsMTAgQEAKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIC8qIElmIG1vcmUgdGhhbiAxLzUgYXJlIGR1bW1pZXMsIHRoZW4gcmVzaXplIHRoZW0gYXdheS4gKi8KLSAgICBpZiAoKHNvLT5maWxsIC0gc28tPnVzZWQpICogNSA8IHNvLT5tYXNrKQorICAgIC8qIElmIG1vcmUgdGhhbiAxLzR0aCBhcmUgZHVtbWllcywgdGhlbiByZXNpemUgdGhlbSBhd2F5LiAqLworICAgIGlmICgoc2l6ZV90KShzby0+ZmlsbCAtIHNvLT51c2VkKSA8PSAoc2l6ZV90KXNvLT5tYXNrIC8gNCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHNldF90YWJsZV9yZXNpemUoc28sIHNvLT51c2VkPjUwMDAwID8gc28tPnVzZWQqMiA6IHNvLT51c2VkKjQpOworICAgIHJldHVybiBzZXRfdGFibGVfcmVzaXplKHNvLCBzby0+dXNlZCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDg3LDcgKzE1MzQsNyBAQAogICAgIHJlc3VsdCA9IHNldF9jb3B5KHNvKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpICE9IC0xKQorICAgIGlmIChzZXRfZGlmZmVyZW5jZV91cGRhdGVfaW50ZXJuYWwoKFB5U2V0T2JqZWN0ICopIHJlc3VsdCwgb3RoZXIpID09IDApCiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNDk3LDggKzE1NDQsMTEgQEAKIHNldF9kaWZmZXJlbmNlKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKm90aGVyKQogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKmtleTsKKyAgICBQeV9oYXNoX3QgaGFzaDsKICAgICBzZXRlbnRyeSAqZW50cnk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIGludCBydjsKIAogICAgIGlmICghUHlBbnlTZXRfQ2hlY2sob3RoZXIpICAmJiAhUHlEaWN0X0NoZWNrRXhhY3Qob3RoZXIpKSB7CiAgICAgICAgIHJldHVybiBzZXRfY29weV9hbmRfZGlmZmVyZW5jZShzbywgb3RoZXIpOwpAQCAtMTUxNiwxNyArMTU2NiwxNSBAQAogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICB3aGlsZSAoc2V0X25leHQoc28sICZwb3MsICZlbnRyeSkpIHsKLSAgICAgICAgICAgIHNldGVudHJ5IGVudHJ5Y29weTsKLSAgICAgICAgICAgIGludCBydjsKLSAgICAgICAgICAgIGVudHJ5Y29weS5oYXNoID0gZW50cnktPmhhc2g7Ci0gICAgICAgICAgICBlbnRyeWNvcHkua2V5ID0gZW50cnktPmtleTsKLSAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwgZW50cnktPmtleSwgZW50cnktPmhhc2gpOworICAgICAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgICAgIGhhc2ggPSBlbnRyeS0+aGFzaDsKKyAgICAgICAgICAgIHJ2ID0gX1B5RGljdF9Db250YWlucyhvdGhlciwga2V5LCBoYXNoKTsKICAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcnYpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsICZlbnRyeWNvcHkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTM3LDEzICsxNTg1LDE1IEBACiAKICAgICAvKiBJdGVyYXRlIG92ZXIgc28sIGNoZWNraW5nIGZvciBjb21tb24gZWxlbWVudHMgaW4gb3RoZXIuICovCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwga2V5LCBoYXNoKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXJ2KSB7Ci0gICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeSgoUHlTZXRPYmplY3QgKilyZXN1bHQsIGVudHJ5KSkgeworICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoKFB5U2V0T2JqZWN0ICopcmVzdWx0LCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xNjA1LDI5ICsxNjU1LDI0IEBACiAgICAgUHlTZXRPYmplY3QgKm90aGVyc2V0OwogICAgIFB5T2JqZWN0ICprZXk7CiAgICAgUHlfc3NpemVfdCBwb3MgPSAwOworICAgIFB5X2hhc2hfdCBoYXNoOwogICAgIHNldGVudHJ5ICplbnRyeTsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoKFB5T2JqZWN0ICopc28gPT0gb3RoZXIpCiAgICAgICAgIHJldHVybiBzZXRfY2xlYXIoc28pOwogCiAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdmFsdWU7Ci0gICAgICAgIGludCBydjsKLSAgICAgICAgUHlfaGFzaF90IGhhc2g7CiAgICAgICAgIHdoaWxlIChfUHlEaWN0X05leHQob3RoZXIsICZwb3MsICZrZXksICZ2YWx1ZSwgJmhhc2gpKSB7Ci0gICAgICAgICAgICBzZXRlbnRyeSBhbl9lbnRyeTsKLQogICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7Ci0gICAgICAgICAgICBhbl9lbnRyeS5oYXNoID0gaGFzaDsKLSAgICAgICAgICAgIGFuX2VudHJ5LmtleSA9IGtleTsKLQotICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgJmFuX2VudHJ5KTsKLSAgICAgICAgICAgIGlmIChydiA9PSAtMSkgeworICAgICAgICAgICAgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywga2V5LCBoYXNoKTsKKyAgICAgICAgICAgIGlmIChydiA8IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChydiA9PSBESVNDQVJEX05PVEZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNldF9hZGRfZW50cnkoc28sICZhbl9lbnRyeSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2V0X2FkZF9lbnRyeShzbywga2V5LCBoYXNoKSkgewogICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY0NywxMyArMTY5MiwxNSBAQAogICAgIH0KIAogICAgIHdoaWxlIChzZXRfbmV4dChvdGhlcnNldCwgJnBvcywgJmVudHJ5KSkgewotICAgICAgICBpbnQgcnYgPSBzZXRfZGlzY2FyZF9lbnRyeShzbywgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpIHsKKyAgICAgICAga2V5ID0gZW50cnktPmtleTsKKyAgICAgICAgaGFzaCA9IGVudHJ5LT5oYXNoOworICAgICAgICBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBrZXksIGhhc2gpOworICAgICAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYob3RoZXJzZXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKLSAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBlbnRyeSkpIHsKKyAgICAgICAgICAgIGlmIChzZXRfYWRkX2VudHJ5KHNvLCBrZXksIGhhc2gpKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG90aGVyc2V0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTE3MTUsNiArMTc2Miw3IEBACiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwogICAgIFB5X3NzaXplX3QgcG9zID0gMDsKKyAgICBpbnQgcnY7CiAKICAgICBpZiAoIVB5QW55U2V0X0NoZWNrKG90aGVyKSkgewogICAgICAgICBQeU9iamVjdCAqdG1wLCAqcmVzdWx0OwpAQCAtMTcyOSw4ICsxNzc3LDggQEAKICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogCiAgICAgd2hpbGUgKHNldF9uZXh0KHNvLCAmcG9zLCAmZW50cnkpKSB7Ci0gICAgICAgIGludCBydiA9IHNldF9jb250YWluc19lbnRyeSgoUHlTZXRPYmplY3QgKilvdGhlciwgZW50cnkpOwotICAgICAgICBpZiAocnYgPT0gLTEpCisgICAgICAgIHJ2ID0gc2V0X2NvbnRhaW5zX2VudHJ5KChQeVNldE9iamVjdCAqKW90aGVyLCBlbnRyeS0+a2V5LCBlbnRyeS0+aGFzaCk7CisgICAgICAgIGlmIChydiA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKCFydikKICAgICAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKQEAgLTE4MjEsNyArMTg2OSw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfY29udGFpbnNfa2V5KHNvLCBrZXkpOwotICAgIGlmIChydiA9PSAtMSkgeworICAgIGlmIChydiA8IDApIHsKICAgICAgICAgaWYgKCFQeVNldF9DaGVjayhrZXkpIHx8ICFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODQwLDcgKzE4ODgsNyBAQAogICAgIGxvbmcgcmVzdWx0OwogCiAgICAgcmVzdWx0ID0gc2V0X2NvbnRhaW5zKHNvLCBrZXkpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgaWYgKHJlc3VsdCA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KQEAgLTE4NTQsNyArMTkwMiw3IEBACiAgICAgaW50IHJ2OwogCiAgICAgcnYgPSBzZXRfZGlzY2FyZF9rZXkoc28sIGtleSk7Ci0gICAgaWYgKHJ2ID09IC0xKSB7CisgICAgaWYgKHJ2IDwgMCkgewogICAgICAgICBpZiAoIVB5U2V0X0NoZWNrKGtleSkgfHwgIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMTg2Myw3ICsxOTExLDcgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywgdG1wa2V5KTsKICAgICAgICAgUHlfREVDUkVGKHRtcGtleSk7Ci0gICAgICAgIGlmIChydiA9PSAtMSkKKyAgICAgICAgaWYgKHJ2IDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTg4Niw3ICsxOTM0LDcgQEAKICAgICBpbnQgcnY7CiAKICAgICBydiA9IHNldF9kaXNjYXJkX2tleShzbywga2V5KTsKLSAgICBpZiAocnYgPT0gLTEpIHsKKyAgICBpZiAocnYgPCAwKSB7CiAgICAgICAgIGlmICghUHlTZXRfQ2hlY2soa2V5KSB8fCAhUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0xODk1LDcgKzE5NDMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHJ2ID0gc2V0X2Rpc2NhcmRfa2V5KHNvLCB0bXBrZXkpOwogICAgICAgICBQeV9ERUNSRUYodG1wa2V5KTsKLSAgICAgICAgaWYgKHJ2ID09IC0xKQorICAgICAgICBpZiAocnYgPCAwKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIFB5X1JFVFVSTl9OT05FOwpAQCAtMTk0OSwxMyArMTk5NywxMiBAQAogewogICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QW55U2V0X0NoZWNrKHNlbGYpKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5U2V0X0NoZWNrKHNlbGYpICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKKyAgICBpZiAoa3dkcyAhPSBOVUxMICYmICFfUHlBcmdfTm9LZXl3b3Jkcygic2V0KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSwgMCwgMSwgJml0ZXJhYmxlKSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHNldF9jbGVhcl9pbnRlcm5hbChzZWxmKTsKKyAgICBpZiAoc2VsZi0+ZmlsbCkKKyAgICAgICAgc2V0X2NsZWFyX2ludGVybmFsKHNlbGYpOwogICAgIHNlbGYtPmhhc2ggPSAtMTsKICAgICBpZiAoaXRlcmFibGUgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMTIyLDcgKzIxNjksNyBAQAogICAgICBjb3B5X2RvY30sCiAgICAgeyJkaWZmZXJlbmNlIiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2RpZmZlcmVuY2VfbXVsdGksICAgICAgTUVUSF9WQVJBUkdTLAogICAgICBkaWZmZXJlbmNlX2RvY30sCi0gICAgeyJpbnRlcnNlY3Rpb24iLChQeUNGdW5jdGlvbilzZXRfaW50ZXJzZWN0aW9uX211bHRpLCAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgIHsiaW50ZXJzZWN0aW9uIiwgICAgKFB5Q0Z1bmN0aW9uKXNldF9pbnRlcnNlY3Rpb25fbXVsdGksICAgIE1FVEhfVkFSQVJHUywKICAgICAgaW50ZXJzZWN0aW9uX2RvY30sCiAgICAgeyJpc2Rpc2pvaW50IiwgICAgICAoUHlDRnVuY3Rpb24pc2V0X2lzZGlzam9pbnQsICAgIE1FVEhfTywKICAgICAgaXNkaXNqb2ludF9kb2N9LApAQCAtMjE5Myw3ICsyMjQwLDcgQEAKICAgICAodHJhdmVyc2Vwcm9jKXNldF90cmF2ZXJzZSwgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgIChpbnF1aXJ5KXNldF9jbGVhcl9pbnRlcm5hbCwgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgKHJpY2hjbXBmdW5jKXNldF9yaWNoY29tcGFyZSwgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZihQeVNldE9iamVjdCwgd2Vha3JlZmxpc3QpLCAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgb2Zmc2V0b2YoUHlTZXRPYmplY3QsIHdlYWtyZWZsaXN0KSwgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KICAgICAoZ2V0aXRlcmZ1bmMpc2V0X2l0ZXIsICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KICAgICBmcm96ZW5zZXRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCkBAIC0yMjc3LDYgKzIzMjQsMTggQEAKIH0KIAogaW50CitQeVNldF9DbGVhckZyZWVMaXN0KHZvaWQpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK1B5U2V0X0Zpbmkodm9pZCkKK3sKKyAgICBQeV9DTEVBUihlbXB0eWZyb3plbnNldCk7Cit9CisKK2ludAogX1B5U2V0X05leHRFbnRyeShQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5LCBQeV9oYXNoX3QgKmhhc2gpCiB7CiAgICAgc2V0ZW50cnkgKmVudHJ5OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvY29kZWNzLmggYi9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaAppbmRleCAwZmM2YjU4Li4yODQ2ZDdlIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9jb2RlY3MuaApAQCAtMSw2ICsxLDggQEAKIC8qIHN0cmluZ2xpYjogY29kZWMgaW1wbGVtZW50YXRpb25zICovCiAKLSNpZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQorI2lmICFTVFJJTkdMSUJfSVNfVU5JQ09ERQorIyBlcnJvciAiY29kZWNzLmggaXMgc3BlY2lmaWMgdG8gVW5pY29kZSIKKyNlbmRpZgogCiAvKiBNYXNrIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciBhIEMgJ2xvbmcnIGNvbnRhaW5zIGEKICAgIG5vbi1BU0NJSSwgVVRGOC1lbmNvZGVkIGNoYXIuICovCkBAIC0yNjMsNDkgKzI2NSwzMyBAQAogI2RlZmluZSBNQVhfU0hPUlRfVU5JQ0hBUlMgMzAwICAvKiBsYXJnZXN0IHNpemUgd2UnbGwgZG8gb24gdGhlIHN0YWNrICovCiAKICAgICBQeV9zc2l6ZV90IGk7ICAgICAgICAgICAgICAgIC8qIGluZGV4IGludG8gcyBvZiBuZXh0IGlucHV0IGJ5dGUgKi8KLSAgICBQeU9iamVjdCAqcmVzdWx0OyAgICAgICAgICAgIC8qIHJlc3VsdCBzdHJpbmcgb2JqZWN0ICovCiAgICAgY2hhciAqcDsgICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGZyZWUgYnl0ZSBpbiBvdXRwdXQgYnVmZmVyICovCi0gICAgUHlfc3NpemVfdCBuYWxsb2NhdGVkOyAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgYWxsb2NhdGVkICovCi0gICAgUHlfc3NpemVfdCBubmVlZGVkOyAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXN1bHQgYnl0ZXMgbmVlZGVkICovCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcCA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogI2VuZGlmCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKICAgICBjb25zdCBQeV9zc2l6ZV90IG1heF9jaGFyX3NpemUgPSAyOwotICAgIGNoYXIgc3RhY2tidWZbTUFYX1NIT1JUX1VOSUNIQVJTICogMl07CiAjZWxpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMgogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDM7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiAzXTsKICNlbHNlIC8qICBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gNCAqLwogICAgIGNvbnN0IFB5X3NzaXplX3QgbWF4X2NoYXJfc2l6ZSA9IDQ7Ci0gICAgY2hhciBzdGFja2J1ZltNQVhfU0hPUlRfVU5JQ0hBUlMgKiA0XTsKICNlbmRpZgorICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGFzc2VydChzaXplID49IDApOworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAKLSAgICBpZiAoc2l6ZSA8PSBNQVhfU0hPUlRfVU5JQ0hBUlMpIHsKLSAgICAgICAgLyogV3JpdGUgaW50byB0aGUgc3RhY2sgYnVmZmVyOyBuYWxsb2NhdGVkIGNhbid0IG92ZXJmbG93LgotICAgICAgICAgKiBBdCB0aGUgZW5kLCB3ZSdsbCBhbGxvY2F0ZSBleGFjdGx5IGFzIG11Y2ggaGVhcCBzcGFjZSBhcyBpdAotICAgICAgICAgKiB0dXJucyBvdXQgd2UgbmVlZC4KLSAgICAgICAgICovCi0gICAgICAgIG5hbGxvY2F0ZWQgPSBQeV9TQUZFX0RPV05DQVNUKHNpemVvZihzdGFja2J1ZiksIHNpemVfdCwgaW50KTsKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsgICAvKiB3aWxsIGFsbG9jYXRlIGFmdGVyIHdlJ3JlIGRvbmUgKi8KLSAgICAgICAgcCA9IHN0YWNrYnVmOworICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLyBtYXhfY2hhcl9zaXplKSB7CisgICAgICAgIC8qIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC8gbWF4X2NoYXJfc2l6ZSkgewotICAgICAgICAgICAgLyogaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogT3ZlcmFsbG9jYXRlIG9uIHRoZSBoZWFwLCBhbmQgZ2l2ZSB0aGUgZXhjZXNzIGJhY2sgYXQgdGhlIGVuZC4gKi8KLSAgICAgICAgbmFsbG9jYXRlZCA9IHNpemUgKiBtYXhfY2hhcl9zaXplOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5hbGxvY2F0ZWQpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgfQorCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUgKiBtYXhfY2hhcl9zaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOykgewogICAgICAgICBQeV9VQ1M0IGNoID0gZGF0YVtpKytdOwpAQCAtMzI2LDcyICszMTIsMTE4IEBACiAgICAgICAgIH0KICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgICAgICAgIGVsc2UgaWYgKFB5X1VOSUNPREVfSVNfU1VSUk9HQVRFKGNoKSkgewotICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIGssIHN0YXJ0cG9zOworICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgZW5kcG9zLCBuZXdwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGs7CisgICAgICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKwogICAgICAgICAgICAgc3RhcnRwb3MgPSBpLTE7Ci0gICAgICAgICAgICByZXAgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigKLSAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwgInV0Zi04IiwgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiLAotICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIHN0YXJ0cG9zKzEsICZuZXdwb3MpOwotICAgICAgICAgICAgaWYgKCFyZXApCi0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGVuZHBvcyA9IHN0YXJ0cG9zKzE7CiAKLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpCi0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5Qnl0ZXNfR0VUX1NJWkUocmVwKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKKyAgICAgICAgICAgIHdoaWxlICgoZW5kcG9zIDwgc2l6ZSkgJiYgUHlfVU5JQ09ERV9JU19TVVJST0dBVEUoZGF0YVtlbmRwb3NdKSkKKyAgICAgICAgICAgICAgICBlbmRwb3MrKzsKIAotICAgICAgICAgICAgaWYgKHJlcHNpemUgPiBtYXhfY2hhcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAvKiBPbmx5IG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHdyaXRlICovCisgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gKGVuZHBvcyA8IHNpemUpOwogCi0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBwIC0gc3RhY2tidWY7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHAsICc/JywgZW5kcG9zIC0gc3RhcnRwb3MpOworICAgICAgICAgICAgICAgIHAgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggdGhlIGlnbm9yZSBoYW5kbGVyICovCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGlmIChuYWxsb2NhdGVkID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplICsgbWF4X2NoYXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAvKiBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOgorICAgICAgICAgICAgICAgIGZvciAoaz1zdGFydHBvczsgazxlbmRwb3M7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBjaCA9IGRhdGFba107CisgICAgICAgICAgICAgICAgICAgICpwKysgPSAoY2hhcikoMHhlMCB8IChjaCA+PiAxMikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoKGNoID4+IDYpICYgMHgzZikpOworICAgICAgICAgICAgICAgICAgICAqcCsrID0gKGNoYXIpKDB4ODAgfCAoY2ggJiAweDNmKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbGxvY2F0ZWQgKz0gcmVwc2l6ZSAtIG1heF9jaGFyX3NpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbmFsbG9jYXRlZCkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG5hbGxvY2F0ZWQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICBQeV9NRU1DUFkoUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KSwgc3RhY2tidWYsIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpICsgb2Zmc2V0OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKLSAgICAgICAgICAgICAgICBjaGFyICpwcmVwID0gUHlCeXRlc19BU19TVFJJTkcocmVwKTsKLSAgICAgICAgICAgICAgICBmb3IoayA9IHJlcHNpemU7IGsgPiAwOyBrLS0pCi0gICAgICAgICAgICAgICAgICAgICpwKysgPSAqcHJlcCsrOwotICAgICAgICAgICAgfSBlbHNlIC8qIHJlcCBpcyB1bmljb2RlICovIHsKLSAgICAgICAgICAgICAgICBlbnVtIFB5VW5pY29kZV9LaW5kIHJlcGtpbmQ7Ci0gICAgICAgICAgICAgICAgdm9pZCAqcmVwZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gbWF4X2NoYXJfc2l6ZSAqIChlbmRwb3MgLSBzdGFydHBvcyk7CisgICAgICAgICAgICAgICAgcCA9IGJhY2tzbGFzaHJlcGxhY2UoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlLCBzdGFydHBvcywgZW5kcG9zKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIHJlcGtpbmQgPSBQeVVuaWNvZGVfS0lORChyZXApOwotICAgICAgICAgICAgICAgIHJlcGRhdGEgPSBQeVVuaWNvZGVfREFUQShyZXApOworICAgICAgICAgICAgICAgIGkgKz0gKGVuZHBvcyAtIHN0YXJ0cG9zIC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBmb3Ioaz0wOyBrPHJlcHNpemU7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGMgPSBQeVVuaWNvZGVfUkVBRChyZXBraW5kLCByZXBkYXRhLCBrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKDB4ODAgPD0gYykgeworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSBtYXhfY2hhcl9zaXplICogKGVuZHBvcyAtIHN0YXJ0cG9zKTsKKyAgICAgICAgICAgICAgICBwID0geG1sY2hhcnJlZnJlcGxhY2UoJndyaXRlciwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgc3RhcnRwb3MsIGVuZHBvcyk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpICs9IChlbmRwb3MgLSBzdGFydHBvcyAtIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChrPXN0YXJ0cG9zOyBrPGVuZHBvczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gZGF0YVtrXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoMHhEQzgwIDw9IGNoICYmIGNoIDw9IDB4RENGRikpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKShjaCAmIDB4ZmYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoayA+PSBlbmRwb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaSArPSAoZW5kcG9zIC0gc3RhcnRwb3MgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXJ0cG9zID0gazsKKyAgICAgICAgICAgICAgICBhc3NlcnQoc3RhcnRwb3MgPCBlbmRwb3MpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCB0aGUgZGVmYXVsdCBoYW5kbGVyICovCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKAorICAgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLCAidXRmLTgiLCAic3Vycm9nYXRlcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgJmV4Yywgc3RhcnRwb3MsIGVuZHBvcywgJm5ld3Bvcyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZXApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IG1heF9jaGFyX3NpemU7CisKKyAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXApKSB7CisgICAgICAgICAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocmVwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiByZXAgaXMgdW5pY29kZSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHJlcCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShyZXApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsICJ1dGYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktMSwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1cnJvZ2F0ZXMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnArKyA9IChjaGFyKWM7CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlcCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworICAgICAgICAgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfREFUQShyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXApKTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKHJlcCk7CisKKyAgICAgICAgICAgICAgICBpID0gbmV3cG9zOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IGkgPT0gc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDIKQEAgLTQxNiwzMSArNDQ4LDE4IEBACiAjZW5kaWYgLyogU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMSAqLwogICAgIH0KIAotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICAvKiBUaGlzIHdhcyBzdGFjayBhbGxvY2F0ZWQuICovCi0gICAgICAgIG5uZWVkZWQgPSBwIC0gc3RhY2tidWY7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHN0YWNrYnVmLCBubmVlZGVkKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8qIEN1dCBiYWNrIHRvIHNpemUgYWN0dWFsbHkgbmVlZGVkLiAqLwotICAgICAgICBubmVlZGVkID0gcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydChubmVlZGVkIDw9IG5hbGxvY2F0ZWQpOwotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnJlc3VsdCwgbm5lZWRlZCk7Ci0gICAgfQotCiAjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID4gMQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAjZW5kaWYKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CiAKICNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPiAxCiAgZXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXApOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihyZXN1bHQpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiAjZW5kaWYKIApAQCAtODA2LDUgKzgyNSwzIEBACiAjdW5kZWYgU1dBQjQKIAogI2VuZGlmCi0KLSNlbmRpZiAvKiBTVFJJTkdMSUJfSVNfVU5JQ09ERSAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaCBiL09iamVjdHMvc3RyaW5nbGliL2N0eXBlLmgKaW5kZXggNzM5Y2YzZC4uZjA1NDYyNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9jdHlwZS5oCkBAIC0xLDUgKzEsNiBAQAotLyogTk9URTogdGhpcyBBUEkgaXMgLU9OTFktIGZvciB1c2Ugd2l0aCBzaW5nbGUgYnl0ZSBjaGFyYWN0ZXIgc3RyaW5ncy4gKi8KLS8qIERvIG5vdCB1c2UgaXQgd2l0aCBVbmljb2RlLiAqLworI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCisjIGVycm9yICJjdHlwZS5oIG9ubHkgY29tcGF0aWJsZSB3aXRoIGJ5dGUtd2lzZSBzdHJpbmdzIgorI2VuZGlmCiAKICNpbmNsdWRlICJieXRlc19tZXRob2RzLmgiCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaCBiL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaAppbmRleCBjZGE2OGU3Li45ODE2NWFkIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmFzdHNlYXJjaC5oCkBAIC0zMiw1MiArMzIsOTggQEAKICNkZWZpbmUgU1RSSU5HTElCX0JMT09NKG1hc2ssIGNoKSAgICAgXAogICAgICgobWFzayAmICAoMVVMIDw8ICgoY2gpICYgKFNUUklOR0xJQl9CTE9PTV9XSURUSCAtMSkpKSkpCiAKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorU1RSSU5HTElCKGZpbmRfY2hhcikoY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwgU1RSSU5HTElCX0NIQVIgY2gpCit7CisgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKnAsICplOworCisgICAgcCA9IHM7CisgICAgZSA9IHMgKyBuOworICAgIGlmIChuID4gMTApIHsKKyNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMQorICAgICAgICBwID0gbWVtY2hyKHMsIGNoLCBuKTsKKyAgICAgICAgaWYgKHAgIT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAocCAtIHMpOworICAgICAgICByZXR1cm4gLTE7CisjZWxzZQorICAgICAgICAvKiB1c2UgbWVtY2hyIGlmIHdlIGNhbiBjaG9vc2UgYSBuZWVkbGUgd2l0aG91dCB0d28gbWFueSBsaWtlbHkKKyAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gY2ggJiAweGZmOworICAgICAgICAvKiBJZiBsb29raW5nIGZvciBhIG11bHRpcGxlIG9mIDI1Niwgd2UnZCBoYXZlIHRvbworICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKKyAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLworICAgICAgICBpZiAobmVlZGxlICE9IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChwIDwgZSkgeworICAgICAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbWNocihwLCBuZWVkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlIC0gcCkgKiBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBwID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopCisgICAgICAgICAgICAgICAgICAgICAgICBfUHlfQUxJR05fRE9XTihjYW5kaWRhdGUsIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KKyAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICB3aGlsZSAocCA8IGUpIHsKKyAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLVNUUklOR0xJQihmYXN0c2VhcmNoX21lbWNocl8xY2hhcikoY29uc3QgU1RSSU5HTElCX0NIQVIqIHMsIFB5X3NzaXplX3QgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSSU5HTElCX0NIQVIgY2gsIHVuc2lnbmVkIGNoYXIgbmVlZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkKK1NUUklOR0xJQihyZmluZF9jaGFyKShjb25zdCBTVFJJTkdMSUJfQ0hBUiogcywgUHlfc3NpemVfdCBuLCBTVFJJTkdMSUJfQ0hBUiBjaCkKIHsKLSAgICBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkgewotICAgICAgICBjb25zdCBTVFJJTkdMSUJfQ0hBUiAqcHRyID0gczsKLSAgICAgICAgY29uc3QgU1RSSU5HTElCX0NIQVIgKmUgPSBzICsgbjsKLSAgICAgICAgd2hpbGUgKHB0ciA8IGUpIHsKLSAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbWNocigoY29uc3Qgdm9pZCAqKSBwdHIsIG5lZWRsZSwgKGUgLSBwdHIpICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgcHRyID0gKGNvbnN0IFNUUklOR0xJQl9DSEFSICopIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSA9PSAxIHx8ICpwdHIgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIChwdHIgLSBzKTsKLSAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCi0gICAgICAgICAgICBwdHIrKzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpwOwogI2lmZGVmIEhBVkVfTUVNUkNIUgogICAgIC8qIG1lbXJjaHIoKSBpcyBhIEdOVSBleHRlbnNpb24sIGF2YWlsYWJsZSBzaW5jZSBnbGliYyAyLjEuOTEuCiAgICAgICAgaXQgZG9lc24ndCBzZWVtIGFzIG9wdGltaXplZCBhcyBtZW1jaHIoKSwgYnV0IGlzIHN0aWxsIHF1aXRlCi0gICAgICAgZmFzdGVyIHRoYW4gb3VyIGhhbmQtd3JpdHRlbiBsb29wIGluIEZBU1RTRUFSQ0ggYmVsb3cgKi8KLSAgICBlbHNlIGlmIChtb2RlID09IEZBU1RfUlNFQVJDSCkgewotICAgICAgICB3aGlsZSAobiA+IDApIHsKLSAgICAgICAgICAgIGNvbnN0IFNUUklOR0xJQl9DSEFSICpmb3VuZDsKLSAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbXJjaHIoKGNvbnN0IHZvaWQgKikgcywgbmVlZGxlLCBuICogc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IE5VTEwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgZm91bmQgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikgX1B5X0FMSUdOX0RPV04oY2FuZGlkYXRlLCBzaXplb2YoU1RSSU5HTElCX0NIQVIpKTsKLSAgICAgICAgICAgIG4gPSBmb3VuZCAtIHM7Ci0gICAgICAgICAgICBpZiAoc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSA9PSAxIHx8ICpmb3VuZCA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIC8qIEZhbHNlIHBvc2l0aXZlICovCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSNlbmRpZgotICAgIGVsc2UgewotICAgICAgICBhc3NlcnQoMCk7IC8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CisgICAgICAgZmFzdGVyIHRoYW4gb3VyIGhhbmQtd3JpdHRlbiBsb29wIGJlbG93ICovCiAKLSN1bmRlZiBET19NRU1DSFIKKyAgICBpZiAobiA+IDEwKSB7CisjaWYgU1RSSU5HTElCX1NJWkVPRl9DSEFSID09IDEKKyAgICAgICAgcCA9IG1lbXJjaHIocywgY2gsIG4pOworICAgICAgICBpZiAocCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgICAgIHJldHVybiAtMTsKKyNlbHNlCisgICAgICAgIC8qIHVzZSBtZW1yY2hyIGlmIHdlIGNhbiBjaG9vc2UgYSBuZWVkbGUgd2l0aG91dCB0d28gbWFueSBsaWtlbHkKKyAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCisgICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gY2ggJiAweGZmOworICAgICAgICAvKiBJZiBsb29raW5nIGZvciBhIG11bHRpcGxlIG9mIDI1Niwgd2UnZCBoYXZlIHRvbworICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKKyAgICAgICAgICAgYW5kIFVDUzQgcmVwcmVzZW50YXRpb25zLiAqLworICAgICAgICBpZiAobmVlZGxlICE9IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChuID4gMCkgeworICAgICAgICAgICAgICAgIHZvaWQgKmNhbmRpZGF0ZSA9IG1lbXJjaHIocywgbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiAqIHNpemVvZihTVFJJTkdMSUJfQ0hBUikpOworICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHAgPSAoY29uc3QgU1RSSU5HTElCX0NIQVIgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9BTElHTl9ET1dOKGNhbmRpZGF0ZSwgc2l6ZW9mKFNUUklOR0xJQl9DSEFSKSk7CisgICAgICAgICAgICAgICAgbiA9IHAgLSBzOworICAgICAgICAgICAgICAgIGlmICgqcCA9PSBjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICAgICAgLyogRmFsc2UgcG9zaXRpdmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorI2VuZGlmICAvKiBIQVZFX01FTVJDSFIgKi8KKyAgICBwID0gcyArIG47CisgICAgd2hpbGUgKHAgPiBzKSB7CisgICAgICAgIHAtLTsKKyAgICAgICAgaWYgKCpwID09IGNoKQorICAgICAgICAgICAgcmV0dXJuIChwIC0gcyk7CisgICAgfQorICAgIHJldHVybiAtMTsKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCkBAIC05OSwyNSArMTQ1LDExIEBACiAgICAgICAgIGlmIChtIDw9IDApCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIC8qIHVzZSBzcGVjaWFsIGNhc2UgZm9yIDEtY2hhcmFjdGVyIHN0cmluZ3MgKi8KLSAgICAgICAgaWYgKG4gPiAxMCAmJiAobW9kZSA9PSBGQVNUX1NFQVJDSAotI2lmZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgICAgICAgICB8fCBtb2RlID09IEZBU1RfUlNFQVJDSAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICkpIHsKLSAgICAgICAgICAgIC8qIHVzZSBtZW1jaHIgaWYgd2UgY2FuIGNob29zZSBhIG5lZWRsZSB3aXRob3V0IHR3byBtYW55IGxpa2VseQotICAgICAgICAgICAgICAgZmFsc2UgcG9zaXRpdmVzICovCi0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIG5lZWRsZTsKLSAgICAgICAgICAgIG5lZWRsZSA9IHBbMF0gJiAweGZmOwotI2lmIFNUUklOR0xJQl9TSVpFT0ZfQ0hBUiA+IDEKLSAgICAgICAgICAgIC8qIElmIGxvb2tpbmcgZm9yIGEgbXVsdGlwbGUgb2YgMjU2LCB3ZSdkIGhhdmUgdG9vCi0gICAgICAgICAgICAgICBtYW55IGZhbHNlIHBvc2l0aXZlcyBsb29raW5nIGZvciB0aGUgJ1wwJyBieXRlIGluIFVDUzIKLSAgICAgICAgICAgICAgIGFuZCBVQ1M0IHJlcHJlc2VudGF0aW9ucy4gKi8KLSAgICAgICAgICAgIGlmIChuZWVkbGUgIT0gMCkKLSNlbmRpZgotICAgICAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUIoZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIpCi0gICAgICAgICAgICAgICAgICAgICAgIChzLCBuLCBwWzBdLCBuZWVkbGUsIG1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlID09IEZBU1RfQ09VTlQpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gRkFTVF9TRUFSQ0gpCisgICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCKGZpbmRfY2hhcikocywgbiwgcFswXSk7CisgICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gRkFTVF9SU0VBUkNIKQorICAgICAgICAgICAgcmV0dXJuIFNUUklOR0xJQihyZmluZF9jaGFyKShzLCBuLCBwWzBdKTsKKyAgICAgICAgZWxzZSB7ICAvKiBGQVNUX0NPVU5UICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgICAgIGlmIChzW2ldID09IHBbMF0pIHsKICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKQEAgLTEyNSwxNCArMTU3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhjb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBGQVNUX1NFQVJDSCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PSBwWzBdKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgfSBlbHNlIHsgICAgLyogRkFTVF9SU0VBUkNIICovCi0gICAgICAgICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+IC0xOyBpLS0pCi0gICAgICAgICAgICAgICAgaWYgKHNbaV0gPT0gcFswXSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaCBiL09iamVjdHMvc3RyaW5nbGliL2ZpbmQuaAppbmRleCAxNDgxNWY2Li41MDliOTI5IDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oCkBAIC0xMTcsODUgKzExNywzIEBACiB9CiAKICN1bmRlZiBGT1JNQVRfQlVGRkVSX1NJWkUKLQotI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCi0KLS8qCi1XcmFwcyBzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpIGFuZCBhZGRpdGlvbmFsbHkgZW5zdXJlcyB0aGF0IHRoZQotZmlyc3QgYXJndW1lbnQgaXMgYSB1bmljb2RlIG9iamVjdC4KLQotTm90ZSB0aGF0IHdlIHJlY2VpdmUgYSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIG9mIHRoZSBzdWJzdHJpbmcgb2JqZWN0LAotc28gd2hlbiB3ZSBjcmVhdGUgdGhhdCBvYmplY3QgaW4gdGhpcyBmdW5jdGlvbiB3ZSBkb24ndCBERUNSRUYgaXQsCi1iZWNhdXNlIGl0IGNvbnRpbnVlcyBsaXZpbmcgaW4gdGhlIGNhbGxlciBmdW5jdGlvbnMgKHRob3NlIGZ1bmN0aW9ucywKLWFmdGVyIGZpbmlzaGluZyB1c2luZyB0aGUgc3Vic3RyaW5nLCBtdXN0IERFQ1JFRiBpdCkuCi0qLwotCi1QeV9MT0NBTF9JTkxJTkUoaW50KQotU1RSSU5HTElCKHBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSkoY29uc3QgY2hhciAqIGZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKLXsKLSAgICBQeU9iamVjdCAqdG1wX3N1YnN0cmluZzsKLQotICAgIGlmKFNUUklOR0xJQihwYXJzZV9hcmdzX2ZpbmRzKShmdW5jdGlvbl9uYW1lLCBhcmdzLCAmdG1wX3N1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkgewotICAgICAgICB0bXBfc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3QodG1wX3N1YnN0cmluZyk7Ci0gICAgICAgIGlmICghdG1wX3N1YnN0cmluZykKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAqc3Vic3RyaW5nID0gdG1wX3N1YnN0cmluZzsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0jZWxzZSAvKiAhU1RSSU5HTElCX0lTX1VOSUNPREUgKi8KLQotLyoKLVdyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBjaGVja3Mgd2hldGhlciB0aGUKLWZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVnZXIgaW4gcmFuZ2UoMCwgMjU2KS4KLQotSWYgdGhpcyBpcyB0aGUgY2FzZSwgd3JpdGVzIHRoZSBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBieXRlIHBhcmFtZXRlcgotYW5kIHNldHMgc3Vib2JqIHRvIE5VTEwuIE90aGVyd2lzZSwgc2V0cyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc3Vib2JqCi1hbmQgZG9lc24ndCB0b3VjaCBieXRlLiBUaGUgb3RoZXIgcGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byB0aG9zZSBvZgotc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKS4KLSovCi0KLVB5X0xPQ0FMX0lOTElORShpbnQpCi1TVFJJTkdMSUIocGFyc2VfYXJnc19maW5kc19ieXRlKShjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vib2JqLCBjaGFyICpieXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKLXsKLSAgICBQeU9iamVjdCAqdG1wX3N1Ym9iajsKLSAgICBQeV9zc2l6ZV90IGl2YWw7Ci0gICAgUHlPYmplY3QgKmVycjsKLQotICAgIGlmKCFTVFJJTkdMSUIocGFyc2VfYXJnc19maW5kcykoZnVuY3Rpb25fbmFtZSwgYXJncywgJnRtcF9zdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIVB5TnVtYmVyX0NoZWNrKHRtcF9zdWJvYmopKSB7Ci0gICAgICAgICpzdWJvYmogPSB0bXBfc3Vib2JqOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KHRtcF9zdWJvYmosIFB5RXhjX092ZXJmbG93RXJyb3IpOwotICAgIGlmIChpdmFsID09IC0xKSB7Ci0gICAgICAgIGVyciA9IFB5RXJyX09jY3VycmVkKCk7Ci0gICAgICAgIGlmIChlcnIgJiYgIVB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhlcnIsIFB5RXhjX092ZXJmbG93RXJyb3IpKSB7Ci0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgKnN1Ym9iaiA9IHRtcF9zdWJvYmo7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpdmFsIDwgMCB8fCBpdmFsID4gMjU1KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgKnN1Ym9iaiA9IE5VTEw7Ci0gICAgKmJ5dGUgPSAoY2hhcilpdmFsOwotICAgIHJldHVybiAxOwotfQotCi0jZW5kaWYgLyogU1RSSU5HTElCX0lTX1VOSUNPREUgKi8KZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2ZpbmRfbWF4X2NoYXIuaCBiL09iamVjdHMvc3RyaW5nbGliL2ZpbmRfbWF4X2NoYXIuaAppbmRleCBlYjNmZTg4Li44Y2NiYzMwIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9maW5kX21heF9jaGFyLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvZmluZF9tYXhfY2hhci5oCkBAIC0xLDYgKzEsOCBAQAogLyogRmluZGluZyB0aGUgb3B0aW1hbCB3aWR0aCBvZiB1bmljb2RlIGNoYXJhY3RlcnMgaW4gYSBidWZmZXIgKi8KIAotI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCisjaWYgIVNUUklOR0xJQl9JU19VTklDT0RFCisjIGVycm9yICJmaW5kX21heF9jaGFyLmggaXMgc3BlY2lmaWMgdG8gVW5pY29kZSIKKyNlbmRpZgogCiAvKiBNYXNrIHRvIHF1aWNrbHkgY2hlY2sgd2hldGhlciBhIEMgJ2xvbmcnIGNvbnRhaW5zIGEKICAgIG5vbi1BU0NJSSwgVVRGOC1lbmNvZGVkIGNoYXIuICovCkBAIC0xMjksNSArMTMxLDQgQEAKICN1bmRlZiBNQVhfQ0hBUl9VQ1M0CiAKICNlbmRpZiAvKiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgPT0gMSAqLwotI2VuZGlmIC8qIFNUUklOR0xJQl9JU19VTklDT0RFICovCiAKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL2pvaW4uaCBiL09iamVjdHMvc3RyaW5nbGliL2pvaW4uaAppbmRleCBjYmY4MWJlLi45MGY5NjZkIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi9qb2luLmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvam9pbi5oCkBAIC0xLDYgKzEsNiBAQAogLyogc3RyaW5nbGliOiBieXRlcyBqb2luaW5nIGltcGxlbWVudGF0aW9uICovCiAKLSNpZiBTVFJJTkdMSUJfU0laRU9GX0NIQVIgIT0gMQorI2lmIFNUUklOR0xJQl9JU19VTklDT0RFCiAjZXJyb3Igam9pbi5oIG9ubHkgY29tcGF0aWJsZSB3aXRoIGJ5dGUtd2lzZSBzdHJpbmdzCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCmluZGV4IDZlMmYwNzMuLmRmNTAxZWQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaAorKysgYi9PYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmgKQEAgLTIsOCArMiw4IEBACiAKICNpbmNsdWRlIDxsb2NhbGUuaD4KIAotI2lmbmRlZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQotIyAgIGVycm9yICJsb2NhbGV1dGlsIGlzIHNwZWNpZmljIHRvIFVuaWNvZGUiCisjaWYgIVNUUklOR0xJQl9JU19VTklDT0RFCisjICAgZXJyb3IgImxvY2FsZXV0aWwuaCBpcyBzcGVjaWZpYyB0byBVbmljb2RlIgogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHsKZGlmZiAtLWdpdCBhL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKaW5kZXggYjU1OWI1My4uNjI1NTA3ZCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKKysrIGIvT2JqZWN0cy9zdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgKQEAgLTEsMTQgKzEsMjEgQEAKLS8qIE5PVEU6IHRoaXMgQVBJIGlzIC1PTkxZLSBmb3IgdXNlIHdpdGggc2luZ2xlIGJ5dGUgY2hhcmFjdGVyIHN0cmluZ3MuICovCi0vKiBEbyBub3QgdXNlIGl0IHdpdGggVW5pY29kZS4gKi8KKyNpZiBTVFJJTkdMSUJfSVNfVU5JQ09ERQorIyBlcnJvciAidHJhbnNtb2dyaWZ5Lmggb25seSBjb21wYXRpYmxlIHdpdGggYnl0ZS13aXNlIHN0cmluZ3MiCisjZW5kaWYKIAogLyogdGhlIG1vcmUgY29tcGxpY2F0ZWQgbWV0aG9kcy4gIHBhcnRzIG9mIHRoZXNlIHNob3VsZCBiZSBwdWxsZWQgb3V0IGludG8gdGhlCiAgICBzaGFyZWQgY29kZSBpbiBieXRlc19tZXRob2RzLmMgdG8gY3V0IGRvd24gb24gZHVwbGljYXRlIGNvZGUgYmxvYXQuICAqLwogCi1QeURvY19TVFJWQVIoZXhwYW5kdGFic19fZG9jX18sCi0iQi5leHBhbmR0YWJzKHRhYnNpemU9OCkgLT4gY29weSBvZiBCXG5cCi1cblwKLVJldHVybiBhIGNvcHkgb2YgQiB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIGV4cGFuZGVkIHVzaW5nIHNwYWNlcy5cblwKLUlmIHRhYnNpemUgaXMgbm90IGdpdmVuLCBhIHRhYiBzaXplIG9mIDggY2hhcmFjdGVycyBpcyBhc3N1bWVkLiIpOworUHlfTE9DQUxfSU5MSU5FKFB5T2JqZWN0ICopCityZXR1cm5fc2VsZihQeU9iamVjdCAqc2VsZikKK3sKKyNpZiAhU1RSSU5HTElCX01VVEFCTEUKKyAgICBpZiAoU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7CisgICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKKyAgICAgICAgcmV0dXJuIHNlbGY7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Cit9CiAKIHN0YXRpYyBQeU9iamVjdCoKIHN0cmluZ2xpYl9leHBhbmR0YWJzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCkBAIC05MywzOSArMTAwLDI1IEBACiAgICAgaWYgKHJpZ2h0IDwgMCkKICAgICAgICAgcmlnaHQgPSAwOwogCi0gICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QgKilzZWxmOwotI2VuZGlmIC8qIFNUUklOR0xJQl9NVVRBQkxFICovCisgICAgaWYgKGxlZnQgPT0gMCAmJiByaWdodCA9PSAwKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKICAgICB9CiAKLSAgICB1ID0gU1RSSU5HTElCX05FVyhOVUxMLAotCQkJCSAgIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOworICAgIHUgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpICsgcmlnaHQpOwogICAgIGlmICh1KSB7CiAgICAgICAgIGlmIChsZWZ0KQogICAgICAgICAgICAgbWVtc2V0KFNUUklOR0xJQl9TVFIodSksIGZpbGwsIGxlZnQpOwogICAgICAgICBQeV9NRU1DUFkoU1RSSU5HTElCX1NUUih1KSArIGxlZnQsCi0JICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCi0JICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOworICAgICAgICAgICAgICAgU1RSSU5HTElCX1NUUihzZWxmKSwKKyAgICAgICAgICAgICAgIFNUUklOR0xJQl9MRU4oc2VsZikpOwogICAgICAgICBpZiAocmlnaHQpCiAgICAgICAgICAgICBtZW1zZXQoU1RSSU5HTElCX1NUUih1KSArIGxlZnQgKyBTVFJJTkdMSUJfTEVOKHNlbGYpLAotCQkgICBmaWxsLCByaWdodCk7CisgICAgICAgICAgICAgICAgICAgZmlsbCwgcmlnaHQpOwogICAgIH0KIAogICAgIHJldHVybiB1OwogfQogCi1QeURvY19TVFJWQVIobGp1c3RfX2RvY19fLAotIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xuIgotImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIHN0cmluZ2xpYl9sanVzdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC0xMzUsMjcgKzEyOCwxNCBAQAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxjOmxqdXN0IiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIHJldHVybiBwYWQoc2VsZiwgMCwgd2lkdGggLSBTVFJJTkdMSUJfTEVOKHNlbGYpLCBmaWxsY2hhcik7CiB9CiAKIAotUHlEb2NfU1RSVkFSKHJqdXN0X19kb2NfXywKLSJCLnJqdXN0KHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKLSJcbiIKLSJSZXR1cm4gQiByaWdodCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiBQYWRkaW5nIGlzXG4iCi0iZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBzdHJpbmdsaWJfcmp1c3QoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtMTY1LDI3ICsxNDUsMTQgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58YzpyanVzdCIsICZ3aWR0aCwgJmZpbGxjaGFyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCAmJiBTVFJJTkdMSUJfQ0hFQ0tfRVhBQ1Qoc2VsZikpIHsKLSNpZiBTVFJJTkdMSUJfTVVUQUJMRQotICAgICAgICAvKiBXZSdyZSBkZWZpbmVkIGFzIHJldHVybmluZyBhIGNvcHk7ICBJZiB0aGUgb2JqZWN0IGlzIG11dGFibGUKLSAgICAgICAgICogdGhhdCBtZWFucyB3ZSBtdXN0IG1ha2UgYW4gaWRlbnRpY2FsIGNvcHkuICovCi0gICAgICAgIHJldHVybiBTVFJJTkdMSUJfTkVXKFNUUklOR0xJQl9TVFIoc2VsZiksIFNUUklOR0xJQl9MRU4oc2VsZikpOwotI2Vsc2UKLSAgICAgICAgUHlfSU5DUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSNlbmRpZgorICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoKSB7CisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKICAgICB9CiAKICAgICByZXR1cm4gcGFkKHNlbGYsIHdpZHRoIC0gU1RSSU5HTElCX0xFTihzZWxmKSwgMCwgZmlsbGNoYXIpOwogfQogCiAKLVB5RG9jX1NUUlZBUihjZW50ZXJfX2RvY19fLAotIkIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKSAtPiBjb3B5IG9mIEJcbiIKLSJcbiIKLSJSZXR1cm4gQiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguICBQYWRkaW5nIGlzXG4iCi0iZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkIGZpbGwgY2hhcmFjdGVyIChkZWZhdWx0IGlzIGEgc3BhY2UpLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nbGliX2NlbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CkBAIC0xOTYsMTUgKzE2Myw4IEBACiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJufGM6Y2VudGVyIiwgJndpZHRoLCAmZmlsbGNoYXIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChTVFJJTkdMSUJfTEVOKHNlbGYpID49IHdpZHRoICYmIFNUUklOR0xJQl9DSEVDS19FWEFDVChzZWxmKSkgewotI2lmIFNUUklOR0xJQl9NVVRBQkxFCi0gICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgKiB0aGF0IG1lYW5zIHdlIG11c3QgbWFrZSBhbiBpZGVudGljYWwgY29weS4gKi8KLSAgICAgICAgcmV0dXJuIFNUUklOR0xJQl9ORVcoU1RSSU5HTElCX1NUUihzZWxmKSwgU1RSSU5HTElCX0xFTihzZWxmKSk7Ci0jZWxzZQotICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgIHJldHVybiAoUHlPYmplY3QqKSBzZWxmOwotI2VuZGlmCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPj0gd2lkdGgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIG1hcmcgPSB3aWR0aCAtIFNUUklOR0xJQl9MRU4oc2VsZik7CkBAIC0yMTMsMTIgKzE3Myw2IEBACiAgICAgcmV0dXJuIHBhZChzZWxmLCBsZWZ0LCBtYXJnIC0gbGVmdCwgZmlsbGNoYXIpOwogfQogCi1QeURvY19TVFJWQVIoemZpbGxfX2RvY19fLAotIkIuemZpbGwod2lkdGgpIC0+IGNvcHkgb2YgQlxuIgotIlxuIgotIlBhZCBhIG51bWVyaWMgc3RyaW5nIEIgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkXG4iCi0ib2YgdGhlIHNwZWNpZmllZCB3aWR0aC4gIEIgaXMgbmV2ZXIgdHJ1bmNhdGVkLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nbGliX3pmaWxsKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTIzMSwyMSArMTg1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAoU1RSSU5HTElCX0xFTihzZWxmKSA+PSB3aWR0aCkgewotICAgICAgICBpZiAoU1RSSU5HTElCX0NIRUNLX0VYQUNUKHNlbGYpKSB7Ci0jaWYgU1RSSU5HTElCX01VVEFCTEUKLSAgICAgICAgICAgIC8qIFdlJ3JlIGRlZmluZWQgYXMgcmV0dXJuaW5nIGEgY29weTsgIElmIHRoZSBvYmplY3QgaXMgbXV0YWJsZQotICAgICAgICAgICAgICogdGhhdCBtZWFucyB3ZSBtdXN0IG1ha2UgYW4gaWRlbnRpY2FsIGNvcHkuICovCi0gICAgICAgICAgICByZXR1cm4gU1RSSU5HTElCX05FVyhTVFJJTkdMSUJfU1RSKHNlbGYpLCBTVFJJTkdMSUJfTEVOKHNlbGYpKTsKLSNlbHNlCi0gICAgICAgICAgICBQeV9JTkNSRUYoc2VsZik7Ci0gICAgICAgICAgICByZXR1cm4gKFB5T2JqZWN0Kikgc2VsZjsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBTVFJJTkdMSUJfTkVXKAotICAgICAgICAgICAgICAgIFNUUklOR0xJQl9TVFIoc2VsZiksCi0gICAgICAgICAgICAgICAgU1RSSU5HTElCX0xFTihzZWxmKQotICAgICAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogICAgIH0KIAogICAgIGZpbGwgPSB3aWR0aCAtIFNUUklOR0xJQl9MRU4oc2VsZik7CkBAIC0yNjIsNSArMjAyLDUwMCBAQAogICAgICAgICBwW2ZpbGxdID0gJzAnOwogICAgIH0KIAotICAgIHJldHVybiAoUHlPYmplY3QqKSBzOworICAgIHJldHVybiBzOwogfQorCisKKy8qIGZpbmQgYW5kIGNvdW50IGNoYXJhY3RlcnMgYW5kIHN1YnN0cmluZ3MgKi8KKworI2RlZmluZSBmaW5kY2hhcih0YXJnZXQsIHRhcmdldF9sZW4sIGMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKChjaGFyICopbWVtY2hyKChjb25zdCB2b2lkICopKHRhcmdldCksIGMsIHRhcmdldF9sZW4pKQorCisKK1B5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQorY291bnRjaGFyKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLCBjaGFyIGMsCisgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKKyAgICBjb25zdCBjaGFyICpzdGFydCA9IHRhcmdldDsKKyAgICBjb25zdCBjaGFyICplbmQgPSB0YXJnZXQgKyB0YXJnZXRfbGVuOworCisgICAgd2hpbGUgKChzdGFydCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQgLSBzdGFydCwgYykpICE9IE5VTEwpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworCisvKiBBbGdvcml0aG1zIGZvciBkaWZmZXJlbnQgY2FzZXMgb2Ygc3RyaW5nIHJlcGxhY2VtZW50ICovCisKKy8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9pbnRlcmxlYXZlKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3M7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBpOworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICAvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlcjsKKyAgICAgICBjb3VudCA9IG1pbihtYXhjb3VudCwgc2VsZl9sZW4gKyAxKSAqLworICAgIGlmIChtYXhjb3VudCA8PSBzZWxmX2xlbikgeworICAgICAgICBjb3VudCA9IG1heGNvdW50OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogQ2FuJ3Qgb3ZlcmZsb3c6IHNlbGZfbGVuICsgMSA8PSBtYXhjb3VudCA8PSBQWV9TU0laRV9UX01BWC4gKi8KKyAgICAgICAgY291bnQgPSBzZWxmX2xlbiArIDE7CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCisgICAgLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KKyAgICBhc3NlcnQoY291bnQgPiAwKTsKKyAgICBpZiAodG9fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSBieXRlcyBhcmUgdG9vIGxvbmciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOworICAgIHJlc3VsdCA9IFNUUklOR0xJQl9ORVcoTlVMTCwgcmVzdWx0X2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBpZiAodG9fbGVuID4gMSkgeworICAgICAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgIGNvdW50IC09IDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXN1bHRfc1swXSA9IHRvX3NbMF07CisgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgY291bnQgLT0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOworICAgICAgICAgICAgcmVzdWx0X3NbMF0gPSB0b19zWzBdOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCisgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuIC0gaSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBTcGVjaWFsIGNhc2UgZm9yIGRlbGV0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciAqLworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIHRvPSIiLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudDsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgc2VsZl9sZW4gPSBTVFJJTkdMSUJfTEVOKHNlbGYpOworICAgIHNlbGZfcyA9IFNUUklOR0xJQl9TVFIoc2VsZik7CisKKyAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCisgICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOworCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCByZXN1bHRfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworCisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kIC0gc3RhcnQsIGZyb21fYyk7CisgICAgICAgIGlmIChuZXh0ID09IE5VTEwpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCArIDE7CisgICAgfQorICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KKworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKKworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworCisgICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKKworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKKyAgICBhc3NlcnQgKHJlc3VsdF9sZW4+PTApOworCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCByZXN1bHRfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworCisgICAgc3RhcnQgPSBzZWxmX3M7CisgICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47CisgICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7CisgICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OworCisgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQgLSBzdGFydCk7CisKKyAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgIHN0YXJ0ID0gbmV4dCArIGZyb21fbGVuOworICAgIH0KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCitQeV9MT0NBTChQeU9iamVjdCAqKQorc3RyaW5nbGliX3JlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZShQeU9iamVjdCAqc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIGNoYXIgdG9fYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKm5leHQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworCisgICAgLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKKworICAgIGlmIChuZXh0ID09IE5VTEwpIHsKKyAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBieXRlcyAqLworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgLyogTmVlZCB0byBtYWtlIGEgbmV3IGJ5dGVzICovCisgICAgcmVzdWx0ID0gU1RSSU5HTElCX05FVyhOVUxMLCBzZWxmX2xlbik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfcyA9IFNUUklOR0xJQl9TVFIocmVzdWx0KTsKKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOworCisgICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KKyAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0IC0gc2VsZl9zKTsKKyAgICAqc3RhcnQgPSB0b19jOworICAgIHN0YXJ0Kys7CisgICAgZW5kID0gcmVzdWx0X3MgKyBzZWxmX2xlbjsKKworICAgIHdoaWxlICgtLW1heGNvdW50ID4gMCkgeworICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZCAtIHN0YXJ0LCBmcm9tX2MpOworICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICpuZXh0ID0gdG9fYzsKKyAgICAgICAgc3RhcnQgPSBuZXh0ICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zLCAqc3RhcnQ7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICAvKiBUaGUgcmVzdWx0IGJ5dGVzIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLworCisgICAgc2VsZl9zID0gU1RSSU5HTElCX1NUUihzZWxmKTsKKyAgICBzZWxmX2xlbiA9IFNUUklOR0xJQl9MRU4oc2VsZik7CisKKyAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzZWxmX3MsIHNlbGZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgYnl0ZXMgKi8KKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHNlbGZfbGVuKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJlc3VsdF9zID0gU1RSSU5HTElCX1NUUihyZXN1bHQpOworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7CisKKyAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLworICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OworICAgIFB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOworICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47CisKKyAgICB3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7CisgICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0ICsgb2Zmc2V0LCB0b19zLCBmcm9tX2xlbik7CisgICAgICAgIHN0YXJ0ICs9IG9mZnNldCArIGZyb21fbGVuOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKK3sKKyAgICBjb25zdCBjaGFyICpzZWxmX3MsICpzdGFydCwgKm5leHQsICplbmQ7CisgICAgY2hhciAqcmVzdWx0X3M7CisgICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKKyAgICBQeV9zc2l6ZV90IGNvdW50OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOworICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KKyAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KKyAgICBhc3NlcnQoY291bnQgPiAwKTsKKyAgICBpZiAodG9fbGVuIC0gMSA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBieXRlcyBpcyB0b28gbG9uZyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuIC0gMSk7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQgLSBzdGFydCwgZnJvbV9jKTsKKyAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQgLSBzdGFydCk7CisgICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dCAtIHN0YXJ0KTsKKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCArIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgYnl0ZXMgKi8KKyAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQgLSBzdGFydCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT49MiwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KK1B5X0xPQ0FMKFB5T2JqZWN0ICopCitzdHJpbmdsaWJfcmVwbGFjZV9zdWJzdHJpbmcoUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCit7CisgICAgY29uc3QgY2hhciAqc2VsZl9zLCAqc3RhcnQsICpuZXh0LCAqZW5kOworICAgIGNoYXIgKnJlc3VsdF9zOworICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CisgICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OworICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisKKyAgICBzZWxmX3MgPSBTVFJJTkdMSUJfU1RSKHNlbGYpOworICAgIHNlbGZfbGVuID0gU1RSSU5HTElCX0xFTihzZWxmKTsKKworICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7CisKKyAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCisgICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KKyAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCisgICAgYXNzZXJ0KGNvdW50ID4gMCk7CisgICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsICJyZXBsYWNlIGJ5dGVzIGlzIHRvbyBsb25nIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSBmcm9tX2xlbik7CisKKyAgICByZXN1bHQgPSBTVFJJTkdMSUJfTkVXKE5VTEwsIHJlc3VsdF9sZW4pOworICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmVzdWx0X3MgPSBTVFJJTkdMSUJfU1RSKHJlc3VsdCk7CisKKyAgICBzdGFydCA9IHNlbGZfczsKKyAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKKyAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKKyAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7CisgICAgICAgIGlmIChuZXh0ID09IHN0YXJ0KSB7CisgICAgICAgICAgICAvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KKyAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKKyAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKKyAgICAgICAgICAgIHN0YXJ0ICs9IGZyb21fbGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0IC0gc3RhcnQpOworICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQgLSBzdGFydCk7CisgICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7CisgICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47CisgICAgICAgICAgICBzdGFydCA9IG5leHQgKyBmcm9tX2xlbjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBieXRlcyAqLworICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworUHlfTE9DQUwoUHlPYmplY3QgKikKK3N0cmluZ2xpYl9yZXBsYWNlKFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCisgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQoreworICAgIGlmIChtYXhjb3VudCA8IDApIHsKKyAgICAgICAgbWF4Y291bnQgPSBQWV9TU0laRV9UX01BWDsKKyAgICB9IGVsc2UgaWYgKG1heGNvdW50ID09IDAgfHwgU1RSSU5HTElCX0xFTihzZWxmKSA9PSAwKSB7CisgICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KKyAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOworICAgIH0KKworICAgIC8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCisgICAgaWYgKGZyb21fbGVuID09IDApIHsKKyAgICAgICAgaWYgKHRvX2xlbiA9PSAwKSB7CisgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgICAgIH0KKyAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIGJ5dGVzIGV2ZXJ5d2hlcmUuICAgICovCisgICAgICAgIC8qICAgID4+PiBiIlB5dGhvbiIucmVwbGFjZShiIiIsIGIiLiIpICAqLworICAgICAgICAvKiAgICBiJy5QLnkudC5oLm8ubi4nICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CisgICAgfQorCisgICAgLyogRXhjZXB0IGZvciBiIiIucmVwbGFjZShiIiIsIGIiQSIpID09IGIiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCisgICAgLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgYnl0ZXMgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgYnl0ZXMgKi8KKyAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IGJ5dGVzICovCisgICAgaWYgKFNUUklOR0xJQl9MRU4oc2VsZikgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7CisgICAgfQorCisgICAgaWYgKHRvX2xlbiA9PSAwKSB7CisgICAgICAgIC8qIGRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgJ2Zyb20nIGJ5dGVzICovCisgICAgICAgIGlmIChmcm9tX2xlbiA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCisgICAgICAgICAgICAgICAgc2VsZiwgZnJvbV9zWzBdLCBtYXhjb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nbGliX3JlcGxhY2VfZGVsZXRlX3N1YnN0cmluZygKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggYnl0ZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KKworICAgIGlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKKyAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKAorICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgdG9fc1swXSwgbWF4Y291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCisgICAgaWYgKGZyb21fbGVuID09IDEpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoCisgICAgICAgICAgICBzZWxmLCBmcm9tX3NbMF0sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KKyAgICAgICAgcmV0dXJuIHN0cmluZ2xpYl9yZXBsYWNlX3N1YnN0cmluZygKKyAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOworICAgIH0KK30KKworI3VuZGVmIGZpbmRjaGFyCmRpZmYgLS1naXQgYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oIGIvT2JqZWN0cy9zdHJpbmdsaWIvdW5pY29kZV9mb3JtYXQuaAppbmRleCBiZTA5YjVmLi4xNGZhMjhlIDEwMDY0NAotLS0gYS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlX2Zvcm1hdC5oCisrKyBiL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVfZm9ybWF0LmgKQEAgLTY3LDcgKzY3LDcgQEAKICAgICByZXR1cm4gUHlVbmljb2RlX1N1YnN0cmluZyhzdHItPnN0ciwgc3RyLT5zdGFydCwgc3RyLT5lbmQpOwogfQogCi0vKiByZXR1cm4gYSBuZXcgc3RyaW5nLiAgaWYgc3RyLT5zdHIgaXMgTlVMTCwgcmV0dXJuIE5vbmUgKi8KKy8qIHJldHVybiBhIG5ldyBzdHJpbmcuICBpZiBzdHItPnN0ciBpcyBOVUxMLCByZXR1cm4gYSBuZXcgZW1wdHkgc3RyaW5nICovCiBQeV9MT0NBTF9JTkxJTkUoUHlPYmplY3QgKikKIFN1YlN0cmluZ19uZXdfb2JqZWN0X29yX2VtcHR5KFN1YlN0cmluZyAqc3RyKQogewpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYyBiL09iamVjdHMvc3RydWN0c2VxLmMKaW5kZXggNjY0MzQ0Yi4uZTMxNWNiYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJ1Y3RzZXEuYworKysgYi9PYmplY3RzL3N0cnVjdHNlcS5jCkBAIC00LDkgKzQsOSBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi1zdGF0aWMgY2hhciB2aXNpYmxlX2xlbmd0aF9rZXlbXSA9ICJuX3NlcXVlbmNlX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciByZWFsX2xlbmd0aF9rZXlbXSA9ICJuX2ZpZWxkcyI7Ci1zdGF0aWMgY2hhciB1bm5hbWVkX2ZpZWxkc19rZXlbXSA9ICJuX3VubmFtZWRfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHZpc2libGVfbGVuZ3RoX2tleVtdID0gIm5fc2VxdWVuY2VfZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJlYWxfbGVuZ3RoX2tleVtdID0gIm5fZmllbGRzIjsKK3N0YXRpYyBjb25zdCBjaGFyIHVubmFtZWRfZmllbGRzX2tleVtdID0gIm5fdW5uYW1lZF9maWVsZHMiOwogCiAvKiBGaWVsZHMgd2l0aCB0aGlzIG5hbWUgaGF2ZSBvbmx5IGEgZmllbGQgaW5kZXgsIG5vdCBhIGZpZWxkIG5hbWUuCiAgICBUaGV5IGFyZSBvbmx5IGFsbG93ZWQgZm9yIGluZGljZXMgPCBuX3Zpc2libGVfZmllbGRzLiAqLwpAQCAtMTYsMTQgKzE2LDE0IEBACiBfUHlfSURFTlRJRklFUihuX3VubmFtZWRfZmllbGRzKTsKIAogI2RlZmluZSBWSVNJQkxFX1NJWkUob3ApIFB5X1NJWkUob3ApCi0jZGVmaW5lIFZJU0lCTEVfU0laRV9UUCh0cCkgUHlMb25nX0FzTG9uZyggXAorI2RlZmluZSBWSVNJQkxFX1NJWkVfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3NlcXVlbmNlX2ZpZWxkcykpCiAKLSNkZWZpbmUgUkVBTF9TSVpFX1RQKHRwKSBQeUxvbmdfQXNMb25nKCBcCisjZGVmaW5lIFJFQUxfU0laRV9UUCh0cCkgUHlMb25nX0FzU3NpemVfdCggXAogICAgICAgICAgICAgICAgICAgICAgIF9QeURpY3RfR2V0SXRlbUlkKCh0cCktPnRwX2RpY3QsICZQeUlkX25fZmllbGRzKSkKICNkZWZpbmUgUkVBTF9TSVpFKG9wKSBSRUFMX1NJWkVfVFAoUHlfVFlQRShvcCkpCiAKLSNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc0xvbmcoIFwKKyNkZWZpbmUgVU5OQU1FRF9GSUVMRFNfVFAodHApIFB5TG9uZ19Bc1NzaXplX3QoIFwKICAgICAgICAgICAgICAgICAgICAgICBfUHlEaWN0X0dldEl0ZW1JZCgodHApLT50cF9kaWN0LCAmUHlJZF9uX3VubmFtZWRfZmllbGRzKSkKICNkZWZpbmUgVU5OQU1FRF9GSUVMRFMob3ApIFVOTkFNRURfRklFTERTX1RQKFB5X1RZUEUob3ApKQogCkBAIC0xNjQsNyArMTY0LDggQEAKICNkZWZpbmUgVFlQRV9NQVhTSVpFIDEwMAogCiAgICAgUHlUeXBlT2JqZWN0ICp0eXAgPSBQeV9UWVBFKG9iaik7Ci0gICAgaW50IGksIHJlbW92ZWxhc3QgPSAwOworICAgIFB5X3NzaXplX3QgaTsKKyAgICBpbnQgcmVtb3ZlbGFzdCA9IDA7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgY2hhciBidWZbUkVQUl9CVUZGRVJfU0laRV07CiAgICAgY2hhciAqZW5kb2ZidWYsICpwYnVmID0gYnVmOwpAQCAtMjM2LDggKzIzNyw3IEBACiAgICAgUHlPYmplY3QqIHR1cCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIGRpY3QgPSBOVUxMOwogICAgIFB5T2JqZWN0KiByZXN1bHQ7Ci0gICAgUHlfc3NpemVfdCBuX2ZpZWxkcywgbl92aXNpYmxlX2ZpZWxkcywgbl91bm5hbWVkX2ZpZWxkczsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG5fZmllbGRzLCBuX3Zpc2libGVfZmllbGRzLCBuX3VubmFtZWRfZmllbGRzLCBpOwogCiAgICAgbl9maWVsZHMgPSBSRUFMX1NJWkUoc2VsZik7CiAgICAgbl92aXNpYmxlX2ZpZWxkcyA9IFZJU0lCTEVfU0laRShzZWxmKTsKQEAgLTMyNSw3ICszMjUsNyBAQAogewogICAgIFB5T2JqZWN0ICpkaWN0OwogICAgIFB5TWVtYmVyRGVmKiBtZW1iZXJzOwotICAgIGludCBuX21lbWJlcnMsIG5fdW5uYW1lZF9tZW1iZXJzLCBpLCBrOworICAgIFB5X3NzaXplX3Qgbl9tZW1iZXJzLCBuX3VubmFtZWRfbWVtYmVycywgaSwgazsKICAgICBQeU9iamVjdCAqdjsKIAogI2lmZGVmIFB5X1RSQUNFX1JFRlMKQEAgLTM3Myw5ICszNzMsOSBAQAogICAgIFB5X0lOQ1JFRih0eXBlKTsKIAogICAgIGRpY3QgPSB0eXBlLT50cF9kaWN0OwotI2RlZmluZSBTRVRfRElDVF9GUk9NX0lOVChrZXksIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgU0VUX0RJQ1RfRlJPTV9TSVpFKGtleSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB2ID0gUHlMb25nX0Zyb21Mb25nKChsb25nKSB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdiA9IFB5TG9uZ19Gcm9tU3NpemVfdCh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmICh2ID09IE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIGtleSwgdikgPCAwKSB7ICAgICAgICAgICBcCkBAIC0zODUsOSArMzg1LDkgQEAKICAgICAgICAgUHlfREVDUkVGKHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAotICAgIFNFVF9ESUNUX0ZST01fSU5UKHZpc2libGVfbGVuZ3RoX2tleSwgZGVzYy0+bl9pbl9zZXF1ZW5jZSk7Ci0gICAgU0VUX0RJQ1RfRlJPTV9JTlQocmVhbF9sZW5ndGhfa2V5LCBuX21lbWJlcnMpOwotICAgIFNFVF9ESUNUX0ZST01fSU5UKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOworICAgIFNFVF9ESUNUX0ZST01fU0laRSh2aXNpYmxlX2xlbmd0aF9rZXksIGRlc2MtPm5faW5fc2VxdWVuY2UpOworICAgIFNFVF9ESUNUX0ZST01fU0laRShyZWFsX2xlbmd0aF9rZXksIG5fbWVtYmVycyk7CisgICAgU0VUX0RJQ1RfRlJPTV9TSVpFKHVubmFtZWRfZmllbGRzX2tleSwgbl91bm5hbWVkX21lbWJlcnMpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL3R1cGxlb2JqZWN0LmMgYi9PYmplY3RzL3R1cGxlb2JqZWN0LmMKaW5kZXggNzkyMGZlYy4uMWI0MTI1OCAxMDA2NDQKLS0tIGEvT2JqZWN0cy90dXBsZW9iamVjdC5jCisrKyBiL09iamVjdHMvdHVwbGVvYmplY3QuYwpAQCAtMzYsNiArMzYsMTYgQEAKIHN0YXRpYyB2b2lkCiBzaG93X3RyYWNrKHZvaWQpCiB7CisgICAgUHlPYmplY3QgKnhvcHRpb25zLCAqdmFsdWU7CisgICAgX1B5X0lERU5USUZJRVIoc2hvd2FsbG9jY291bnQpOworCisgICAgeG9wdGlvbnMgPSBQeVN5c19HZXRYT3B0aW9ucygpOworICAgIGlmICh4b3B0aW9ucyA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisgICAgdmFsdWUgPSBfUHlEaWN0X0dldEl0ZW1JZCh4b3B0aW9ucywgJlB5SWRfc2hvd2FsbG9jY291bnQpOworICAgIGlmICh2YWx1ZSAhPSBQeV9UcnVlKQorICAgICAgICByZXR1cm47CisKICAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyBjcmVhdGVkOiAlIiBQWV9GT1JNQVRfU0laRV9UICJkXG4iLAogICAgICAgICBjb3VudF90cmFja2VkICsgY291bnRfdW50cmFja2VkKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlR1cGxlcyB0cmFja2VkIGJ5IHRoZSBHQzogJSIgUFlfRk9STUFUX1NJWkVfVApAQCAtMTQ5LDcgKzE1OSw2IEBACiBpbnQKIFB5VHVwbGVfU2V0SXRlbShQeU9iamVjdCAqb3AsIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKm5ld2l0ZW0pCiB7Ci0gICAgUHlPYmplY3QgKm9sZGl0ZW07CiAgICAgUHlPYmplY3QgKipwOwogICAgIGlmICghUHlUdXBsZV9DaGVjayhvcCkgfHwgb3AtPm9iX3JlZmNudCAhPSAxKSB7CiAgICAgICAgIFB5X1hERUNSRUYobmV3aXRlbSk7CkBAIC0xNjMsOSArMTcyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBwID0gKChQeVR1cGxlT2JqZWN0ICopb3ApIC0+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9YU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCAzMTczMzRmLi5kNDIwNTRhIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX21vZHVsZV9fIik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeV9YSU5DUkVGKG1vZCk7CisgICAgICAgIFB5X0lOQ1JFRihtb2QpOwogICAgICAgICByZXR1cm4gbW9kOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTUwMCw3ICs1MDAsNyBAQAogICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBtZXNzYWdlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICBQeV9JTkNSRUYobW9kKTsKICAgICByZXR1cm4gbW9kOwogfQogCkBAIC01NDgsNyArNTQ4LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKik7CiBQeV9MT0NBTF9JTkxJTkUoaW50KSB0eXBlX2lzX3N1YnR5cGVfYmFzZV9jaGFpbihQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwotc3RhdGljIGludCBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGFkZF9zdWJjbGFzcyhQeVR5cGVPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKIHN0YXRpYyBpbnQgYWRkX2FsbF9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwpAQCAtODU5LDkgKzg1OSw5IEBACiAgICAgfQogCiAgICAgaWYgKG1vZCAhPSBOVUxMICYmIF9QeVVuaWNvZGVfQ29tcGFyZVdpdGhJZChtb2QsICZQeUlkX2J1aWx0aW5zKSkKLSAgICAgICAgcnRuID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIjxjbGFzcyAnJVUuJVUnPiIsIG1vZCwgbmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBydG4gPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiPGNsYXNzICclcyc+IiwgdHlwZS0+dHBfbmFtZSk7CisgICAgICAgIHJ0biA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8Y2xhc3MgJyVVLiVVJyBhdCAlcD4iLCBtb2QsIG5hbWUsIHR5cGUpOworICAgIGVsc2UgICAgCisgICAgICAgIHJ0biA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8Y2xhc3MgJyVzJyBhdCAlcD4iLCB0eXBlLT50cF9uYW1lLCB0eXBlKTsKIAogICAgIFB5X1hERUNSRUYobW9kKTsKICAgICBQeV9ERUNSRUYobmFtZSk7CkBAIC04ODgsMjUgKzg4OCwzMyBAQAogI2VuZGlmCiAKICAgICBvYmogPSB0eXBlLT50cF9uZXcodHlwZSwgYXJncywga3dkcyk7Ci0gICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCi0gICAgICAgICAgIGRvbid0IGNhbGwgdHBfaW5pdCBvbiB0aGUgcmVzdWx0LiAqLwotICAgICAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKLSAgICAgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCi0gICAgICAgICAgICAoa3dkcyA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCi0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICAvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAotICAgICAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KLSAgICAgICAgaWYgKCFQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2JqKSwgdHlwZSkpCi0gICAgICAgICAgICByZXR1cm4gb2JqOwotICAgICAgICB0eXBlID0gUHlfVFlQRShvYmopOwotICAgICAgICBpZiAodHlwZS0+dHBfaW5pdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbnQgcmVzID0gdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpOwotICAgICAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKLSAgICAgICAgICAgICAgICBvYmogPSBOVUxMOwotICAgICAgICAgICAgfQorICAgIG9iaiA9IF9QeV9DaGVja0Z1bmN0aW9uUmVzdWx0KChQeU9iamVjdCopdHlwZSwgb2JqLCBOVUxMKTsKKyAgICBpZiAob2JqID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogVWdseSBleGNlcHRpb246IHdoZW4gdGhlIGNhbGwgd2FzIHR5cGUoc29tZXRoaW5nKSwKKyAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KKyAgICBpZiAodHlwZSA9PSAmUHlUeXBlX1R5cGUgJiYKKyAgICAgICAgUHlUdXBsZV9DaGVjayhhcmdzKSAmJiBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpID09IDEgJiYKKyAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAorICAgICAgICAgKFB5RGljdF9DaGVjayhrd2RzKSAmJiBQeURpY3RfU2l6ZShrd2RzKSA9PSAwKSkpCisgICAgICAgIHJldHVybiBvYmo7CisKKyAgICAvKiBJZiB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB0eXBlLAorICAgICAgIGl0IHdvbid0IGJlIGluaXRpYWxpemVkLiAqLworICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKQorICAgICAgICByZXR1cm4gb2JqOworCisgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKKyAgICBpZiAodHlwZS0+dHBfaW5pdCAhPSBOVUxMKSB7CisgICAgICAgIGludCByZXMgPSB0eXBlLT50cF9pbml0KG9iaiwgYXJncywga3dkcyk7CisgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICBhc3NlcnQoUHlFcnJfT2NjdXJyZWQoKSk7CisgICAgICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgICAgICAgIG9iaiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoIVB5RXJyX09jY3VycmVkKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvYmo7CkBAIC0xNDExLDcgKzE0MTksNyBAQAogICAgYXMgbG9va3VwX21ldGhvZCB0byBjYWNoZSB0aGUgaW50ZXJuZWQgbmFtZSBzdHJpbmcgb2JqZWN0LiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9tZXRob2QoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNoYXIgKmZvcm1hdCwgLi4uKQorY2FsbF9tZXRob2QoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmE7CiAgICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKQEAgLTE0NDcsNyArMTQ1NSw3IEBACiAvKiBDbG9uZSBvZiBjYWxsX21ldGhvZCgpIHRoYXQgcmV0dXJucyBOb3RJbXBsZW1lbnRlZCB3aGVuIHRoZSBsb29rdXAgZmFpbHMuICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX21heWJlKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjaGFyICpmb3JtYXQsIC4uLikKK2NhbGxfbWF5YmUoUHlPYmplY3QgKm8sIF9QeV9JZGVudGlmaWVyICpuYW1laWQsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIHZhX2xpc3QgdmE7CiAgICAgUHlPYmplY3QgKmFyZ3MsICpmdW5jID0gMCwgKnJldHZhbDsKQEAgLTE1MjYsNyArMTUzNCw2IEBACiAgICAgUHlPYmplY3QgKm5hbWUgPSBfUHlPYmplY3RfR2V0QXR0cklkKGNscywgJlB5SWRfX19uYW1lX18pOwogICAgIGlmIChuYW1lID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgUHlfWERFQ1JFRihuYW1lKTsKICAgICAgICAgbmFtZSA9IFB5T2JqZWN0X1JlcHIoY2xzKTsKICAgICB9CiAgICAgaWYgKG5hbWUgPT0gTlVMTCkKQEAgLTIwODQsNyArMjA5MSw3IEBACiBzdGF0aWMgaW50CiBzdWJ0eXBlX3NldGRpY3QoUHlPYmplY3QgKm9iaiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjb250ZXh0KQogewotICAgIFB5T2JqZWN0ICpkaWN0LCAqKmRpY3RwdHI7CisgICAgUHlPYmplY3QgKipkaWN0cHRyOwogICAgIFB5VHlwZU9iamVjdCAqYmFzZTsKIAogICAgIGJhc2UgPSBnZXRfYnVpbHRpbl9iYXNlX3dpdGhfZGljdChQeV9UWVBFKG9iaikpOwpAQCAtMjExNSwxMCArMjEyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAibm90IGEgJyUuMjAwcyciLCBQeV9UWVBFKHZhbHVlKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgZGljdCA9ICpkaWN0cHRyOwogICAgIFB5X1hJTkNSRUYodmFsdWUpOwotICAgICpkaWN0cHRyID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRihkaWN0KTsKKyAgICBQeV9YU0VUUkVGKCpkaWN0cHRyLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI2NzMsNyArMjY3OCw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzaG9ydCBzbG90b2Zmc2V0c1tdID0geworc3RhdGljIGNvbnN0IHNob3J0IHNsb3RvZmZzZXRzW10gPSB7CiAgICAgLTEsIC8qIGludmFsaWQgc2xvdCAqLwogI2luY2x1ZGUgInR5cGVzbG90cy5pbmMiCiB9OwpAQCAtMzU5Miw3ICszNTk3LDcgQEAKIH0KIAogc3RhdGljIGludAotY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZHRvLCBQeVR5cGVPYmplY3QqIG5ld3RvLCBjaGFyKiBhdHRyKQorY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QqIG9sZHRvLCBQeVR5cGVPYmplY3QqIG5ld3RvLCBjb25zdCBjaGFyKiBhdHRyKQogewogICAgIFB5VHlwZU9iamVjdCAqbmV3YmFzZSwgKm9sZGJhc2U7CiAKQEAgLTM4NjgsNiArMzg3MywyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgYXNzZXJ0KHNsb3RuYW1lcyA9PSBQeV9Ob25lIHx8IFB5TGlzdF9DaGVjayhzbG90bmFtZXMpKTsKKyAgICAgICAgaWYgKHJlcXVpcmVkKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGJhc2ljc2l6ZSA9IFB5QmFzZU9iamVjdF9UeXBlLnRwX2Jhc2ljc2l6ZTsKKyAgICAgICAgICAgIGlmIChvYmotPm9iX3R5cGUtPnRwX2RpY3RvZmZzZXQpCisgICAgICAgICAgICAgICAgYmFzaWNzaXplICs9IHNpemVvZihQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGlmIChvYmotPm9iX3R5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0KQorICAgICAgICAgICAgICAgIGJhc2ljc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgICAgICBpZiAoc2xvdG5hbWVzICE9IFB5X05vbmUpCisgICAgICAgICAgICAgICAgYmFzaWNzaXplICs9IHNpemVvZihQeU9iamVjdCAqKSAqIFB5X1NJWkUoc2xvdG5hbWVzKTsKKyAgICAgICAgICAgIGlmIChvYmotPm9iX3R5cGUtPnRwX2Jhc2ljc2l6ZSA+IGJhc2ljc2l6ZSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzbG90bmFtZXMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzdGF0ZSk7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHBpY2tsZSAlLjIwMHMgb2JqZWN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc2xvdG5hbWVzICE9IFB5X05vbmUgJiYgUHlfU0laRShzbG90bmFtZXMpID4gMCkgewogICAgICAgICAgICAgUHlPYmplY3QgKnNsb3RzOwogICAgICAgICAgICAgUHlfc3NpemVfdCBzbG90bmFtZXNfc2l6ZSwgaTsKQEAgLTM5MjIsNyArMzk0NSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIElmIHdlIGZvdW5kIHNvbWUgc2xvdCBhdHRyaWJ1dGVzLCBwYWNrIHRoZW0gaW4gYSB0dXBsZSBhbG9uZwotICAgICAgICAgICAgICAgdGhlIG9yZ2luYWwgYXR0cmlidXRlIGRpY3Rpb25hcnkuICovCisgICAgICAgICAgICAgICB0aGUgb3JpZ2luYWwgYXR0cmlidXRlIGRpY3Rpb25hcnkuICovCiAgICAgICAgICAgICBpZiAoUHlEaWN0X1NpemUoc2xvdHMpID4gMCkgewogICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdGF0ZTI7CiAKQEAgLTQwOTEsNyArNDExNCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1yZWR1Y2VfbmV3b2JqKFB5T2JqZWN0ICpvYmosIGludCBwcm90bykKK3JlZHVjZV9uZXdvYmooUHlPYmplY3QgKm9iaikKIHsKICAgICBQeU9iamVjdCAqYXJncyA9IE5VTEwsICprd2FyZ3MgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpjb3B5cmVnOwpAQCAtNDE0NCw3ICs0MTY3LDcgQEAKICAgICAgICAgfQogICAgICAgICBQeV9YREVDUkVGKGFyZ3MpOwogICAgIH0KLSAgICBlbHNlIGlmIChwcm90byA+PSA0KSB7CisgICAgZWxzZSB7CiAgICAgICAgIF9QeV9JREVOVElGSUVSKF9fbmV3b2JqX2V4X18pOwogCiAgICAgICAgIG5ld29iaiA9IF9QeU9iamVjdF9HZXRBdHRySWQoY29weXJlZywgJlB5SWRfX19uZXdvYmpfZXhfXyk7CkBAIC00MTYyLDE2ICs0MTg1LDYgQEAKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQotICAgIGVsc2UgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IHVzZSBwcm90b2NvbCA0IG9yIGdyZWF0ZXIgdG8gY29weSB0aGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3Q7IHNpbmNlIF9fZ2V0bmV3YXJnc19leF9fIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJrZXl3b3JkIGFyZ3VtZW50cy4iKTsKLSAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwotICAgICAgICBQeV9ERUNSRUYoa3dhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGNvcHlyZWcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBzdGF0ZSA9IF9QeU9iamVjdF9HZXRTdGF0ZShvYmosCiAgICAgICAgICAgICAgICAgIWhhc2FyZ3MgJiYgIVB5TGlzdF9DaGVjayhvYmopICYmICFQeURpY3RfQ2hlY2sob2JqKSk7CkBAIC00MjE3LDcgKzQyMzAsNyBAQAogICAgIFB5T2JqZWN0ICpjb3B5cmVnLCAqcmVzOwogCiAgICAgaWYgKHByb3RvID49IDIpCi0gICAgICAgIHJldHVybiByZWR1Y2VfbmV3b2JqKHNlbGYsIHByb3RvKTsKKyAgICAgICAgcmV0dXJuIHJlZHVjZV9uZXdvYmooc2VsZik7CiAKICAgICBjb3B5cmVnID0gaW1wb3J0X2NvcHlyZWcoKTsKICAgICBpZiAoIWNvcHlyZWcpCkBAIC01MzQ0LDcgKzUzNTcsNyBAQAogLyogSGVscGVyIHRvIGNoZWNrIGZvciBvYmplY3QuX19zZXRhdHRyX18gb3IgX19kZWxhdHRyX18gYXBwbGllZCB0byBhIHR5cGUuCiAgICBUaGlzIGlzIGNhbGxlZCB0aGUgQ2FybG8gVmVycmUgaGFjayBhZnRlciBpdHMgZGlzY292ZXJlci4gKi8KIHN0YXRpYyBpbnQKLWhhY2tjaGVjayhQeU9iamVjdCAqc2VsZiwgc2V0YXR0cm9mdW5jIGZ1bmMsIGNoYXIgKndoYXQpCitoYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjb25zdCBjaGFyICp3aGF0KQogewogICAgIFB5VHlwZU9iamVjdCAqdHlwZSA9IFB5X1RZUEUoc2VsZik7CiAgICAgd2hpbGUgKHR5cGUgJiYgdHlwZS0+dHBfZmxhZ3MgJiBQeV9UUEZMQUdTX0hFQVBUWVBFKQpAQCAtNTc2NCw4ICs1Nzc3LDggQEAKICAgICAgICAgICAgIGlmIChhcmdzICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZ3MsIDAsIGl2YWwpOwogICAgICAgICAgICAgICAgIHJldHZhbCA9IFB5T2JqZWN0X0NhbGwoZnVuYywgYXJncywgTlVMTCk7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKLSAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZ1bmMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwppbmRleCAxZmNjODNlLi5kYjZhNTFjIDEwMDY0NAotLS0gYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYworKysgYi9PYmplY3RzL3VuaWNvZGVvYmplY3QuYwpAQCAtNDIsNiArNDIsNyBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInVjbmhhc2guaCIKICNpbmNsdWRlICJieXRlc19tZXRob2RzLmgiCisjaW5jbHVkZSAic3RyaW5nbGliL2VxLmgiCiAKICNpZmRlZiBNU19XSU5ET1dTCiAjaW5jbHVkZSA8d2luZG93cy5oPgpAQCAtMTYyLDYgKzE2MywxNCBAQAogICAgICAgICAgICAgKl90bysrID0gKHRvX3R5cGUpICpfaXRlcisrOyAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAorI2lmZGVmIE1TX1dJTkRPV1MKKyAgIC8qIE9uIFdpbmRvd3MsIG92ZXJhbGxvY2F0ZSBieSA1MCUgaXMgdGhlIGJlc3QgZmFjdG9yICovCisjICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiAyCisjZWxzZQorICAgLyogT24gTGludXgsIG92ZXJhbGxvY2F0ZSBieSAyNSUgaXMgdGhlIGJlc3QgZmFjdG9yICovCisjICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiA0CisjZW5kaWYKKwogLyogVGhpcyBkaWN0aW9uYXJ5IGhvbGRzIGFsbCBpbnRlcm5lZCB1bmljb2RlIHN0cmluZ3MuICBOb3RlIHRoYXQgcmVmZXJlbmNlcwogICAgdG8gc3RyaW5ncyBpbiB0aGlzIGRpY3Rpb25hcnkgYXJlICpub3QqIGNvdW50ZWQgaW4gdGhlIHN0cmluZydzIG9iX3JlZmNudC4KICAgIFdoZW4gdGhlIGludGVybmVkIHN0cmluZyByZWFjaGVzIGEgcmVmY250IG9mIDAgdGhlIHN0cmluZyBkZWFsbG9jYXRpb24KQEAgLTI2Myw3ICsyNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWFzb24pOwogCiAvKiBTYW1lIGZvciBsaW5lYnJlYWtzICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBhc2NpaV9saW5lYnJlYWtbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzY2lpX2xpbmVicmVha1tdID0gewogICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAvKiAgICAgICAgIDB4MDAwQSwgKiBMSU5FIEZFRUQgKi8KIC8qICAgICAgICAgMHgwMDBCLCAqIExJTkUgVEFCVUxBVElPTiAqLwpAQCAtMjkyLDYgKzMwMSwzOCBAQAogCiAjaW5jbHVkZSAiY2xpbmljL3VuaWNvZGVvYmplY3QuYy5oIgogCit0eXBlZGVmIGVudW0geworICAgIF9QeV9FUlJPUl9VTktOT1dOPTAsCisgICAgX1B5X0VSUk9SX1NUUklDVCwKKyAgICBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFLAorICAgIF9QeV9FUlJPUl9SRVBMQUNFLAorICAgIF9QeV9FUlJPUl9JR05PUkUsCisgICAgX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0UsCisgICAgX1B5X0VSUk9SX1NVUlJPR0FURVBBU1MsCisgICAgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFLAorICAgIF9QeV9FUlJPUl9PVEhFUgorfSBfUHlfZXJyb3JfaGFuZGxlcjsKKworc3RhdGljIF9QeV9lcnJvcl9oYW5kbGVyCitnZXRfZXJyb3JfaGFuZGxlcihjb25zdCBjaGFyICplcnJvcnMpCit7CisgICAgaWYgKGVycm9ycyA9PSBOVUxMIHx8IHN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NUUklDVDsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgInN1cnJvZ2F0ZWVzY2FwZSIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfUkVQTEFDRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgImlnbm9yZSIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfSUdOT1JFOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAiYmFja3NsYXNocmVwbGFjZSIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfQkFDS1NMQVNIUkVQTEFDRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgInN1cnJvZ2F0ZXBhc3MiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NVUlJPR0FURVBBU1M7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJ4bWxjaGFycmVmcmVwbGFjZSIpID09IDApCisgICAgICAgIHJldHVybiBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U7CisgICAgcmV0dXJuIF9QeV9FUlJPUl9PVEhFUjsKK30KKwogLyogVGhlIG1heCB1bmljb2RlIHZhbHVlIGlzIGFsd2F5cyAweDEwRkZGRiB3aGlsZSB1c2luZyB0aGUgUEVQLTM5MyBBUEkuCiAgICBUaGlzIGZ1bmN0aW9uIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIEFQSS4gKi8KIFB5X1VOSUNPREUKQEAgLTUyMSw2ICs1NjIsMTI5IEBACiAgICAgICAgIHJldHVybiBfUHlVbmljb2RlX0NvcHkodW5pY29kZSk7CiB9CiAKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSAiYmFja3NsYXNocmVwbGFjZSIgZXJyb3IgaGFuZGxlciBmb3IgOC1iaXQgZW5jb2RpbmdzOgorICAgQVNDSUksIExhdGluMSwgVVRGLTgsIGV0Yy4gKi8KK3N0YXRpYyBjaGFyKgorYmFja3NsYXNocmVwbGFjZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlLCBQeV9zc2l6ZV90IGNvbGxzdGFydCwgUHlfc3NpemVfdCBjb2xsZW5kKQoreworICAgIFB5X3NzaXplX3Qgc2l6ZSwgaTsKKyAgICBQeV9VQ1M0IGNoOworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZDsKKyAgICB2b2lkICpkYXRhOworCisgICAgYXNzZXJ0KFB5VW5pY29kZV9JU19SRUFEWSh1bmljb2RlKSk7CisgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHVuaWNvZGUpOworICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh1bmljb2RlKTsKKworICAgIHNpemUgPSAwOworICAgIC8qIGRldGVybWluZSByZXBsYWNlbWVudCBzaXplICovCisgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaW5jcjsKKworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICBpZiAoY2ggPCAweDEwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzI7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMHgxMDAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzQ7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKyAgICAgICAgICAgIGluY3IgPSAyKzg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3IpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBzaXplICs9IGluY3I7CisgICAgfQorCisgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSh3cml0ZXIsIHN0ciwgc2l6ZSk7CisgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICovCisgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICpzdHIrKyA9ICdcXCc7CisgICAgICAgIGlmIChjaCA+PSAweDAwMDEwMDAwKSB7CisgICAgICAgICAgICAqc3RyKysgPSAnVSc7CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yOCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjI0KSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjApJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xNikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjEyKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+OCkmMHhmXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjaCA+PSAweDEwMCkgeworICAgICAgICAgICAgKnN0cisrID0gJ3UnOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTIpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj44KSYweGZdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpzdHIrKyA9ICd4JzsKKyAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+NCkmMHhmXTsKKyAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzW2NoJjB4Zl07CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKKy8qIEltcGxlbWVudGF0aW9uIG9mIHRoZSAieG1sY2hhcnJlZnJlcGxhY2UiIGVycm9yIGhhbmRsZXIgZm9yIDgtYml0IGVuY29kaW5nczoKKyAgIEFTQ0lJLCBMYXRpbjEsIFVURi04LCBldGMuICovCitzdGF0aWMgY2hhcioKK3htbGNoYXJyZWZyZXBsYWNlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsIGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp1bmljb2RlLCBQeV9zc2l6ZV90IGNvbGxzdGFydCwgUHlfc3NpemVfdCBjb2xsZW5kKQoreworICAgIFB5X3NzaXplX3Qgc2l6ZSwgaTsKKyAgICBQeV9VQ1M0IGNoOworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZDsKKyAgICB2b2lkICpkYXRhOworCisgICAgYXNzZXJ0KFB5VW5pY29kZV9JU19SRUFEWSh1bmljb2RlKSk7CisgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHVuaWNvZGUpOworICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh1bmljb2RlKTsKKworICAgIHNpemUgPSAwOworICAgIC8qIGRldGVybWluZSByZXBsYWNlbWVudCBzaXplICovCisgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgIFB5X3NzaXplX3QgaW5jcjsKKworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICBpZiAoY2ggPCAxMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzErMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDApCisgICAgICAgICAgICBpbmNyID0gMisyKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzMrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzQrMTsKKyAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDApCisgICAgICAgICAgICBpbmNyID0gMis1KzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwMCkKKyAgICAgICAgICAgIGluY3IgPSAyKzYrMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworICAgICAgICAgICAgaW5jciA9IDIrNysxOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBpbmNyOworICAgIH0KKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBzdHIgKz0gc3ByaW50ZihzdHIsICImIyVkOyIsIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKwogLyogLS0tIEJsb29tIEZpbHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyogc3R1ZmYgdG8gaW1wbGVtZW50IHNpbXBsZSAiYmxvb20gZmlsdGVycyIgZm9yIFVuaWNvZGUgY2hhcmFjdGVycy4KQEAgLTU4Nyw2ICs3NTEsMTggQEAKICN1bmRlZiBCTE9PTV9VUERBVEUKIH0KIAorc3RhdGljIGludAorZW5zdXJlX3VuaWNvZGUoUHlPYmplY3QgKm9iaikKK3sKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gUHlVbmljb2RlX1JFQURZKG9iaik7Cit9CisKIC8qIENvbXBpbGF0aW9uIG9mIHRlbXBsYXRlZCByb3V0aW5lcyAqLwogCiAjaW5jbHVkZSAic3RyaW5nbGliL2FzY2lpbGliLmgiCkBAIC02NDcsMjcgKzgyMywyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSwgUHlfVUNTNCBjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIGludCBtb2RlID0gKGRpcmVjdGlvbiA9PSAxKSA/IEZBU1RfU0VBUkNIIDogRkFTVF9SU0VBUkNIOwotCiAgICAgc3dpdGNoIChraW5kKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKLSAgICAgICAgewotICAgICAgICAgICAgUHlfVUNTMSBjaDEgPSAoUHlfVUNTMSkgY2g7Ci0gICAgICAgICAgICBpZiAoY2gxID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX2Zhc3RzZWFyY2goKFB5X1VDUzEgKikgcywgc2l6ZSwgJmNoMSwgMSwgMCwgbW9kZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGlmICgoUHlfVUNTMSkgY2ggIT0gY2gpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczFsaWJfZmluZF9jaGFyKChQeV9VQ1MxICopIHMsIHNpemUsIChQeV9VQ1MxKSBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX3JmaW5kX2NoYXIoKFB5X1VDUzEgKikgcywgc2l6ZSwgKFB5X1VDUzEpIGNoKTsKICAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOgotICAgICAgICB7Ci0gICAgICAgICAgICBQeV9VQ1MyIGNoMiA9IChQeV9VQ1MyKSBjaDsKLSAgICAgICAgICAgIGlmIChjaDIgPT0gY2gpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfZmFzdHNlYXJjaCgoUHlfVUNTMiAqKSBzLCBzaXplLCAmY2gyLCAxLCAwLCBtb2RlKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKChQeV9VQ1MyKSBjaCAhPSBjaCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzMmxpYl9maW5kX2NoYXIoKFB5X1VDUzIgKikgcywgc2l6ZSwgKFB5X1VDUzIpIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfcmZpbmRfY2hhcigoUHlfVUNTMiAqKSBzLCBzaXplLCAoUHlfVUNTMikgY2gpOwogICAgIGNhc2UgUHlVbmljb2RlXzRCWVRFX0tJTkQ6Ci0gICAgICAgIHJldHVybiB1Y3M0bGliX2Zhc3RzZWFyY2goKFB5X1VDUzQgKikgcywgc2l6ZSwgJmNoLCAxLCAwLCBtb2RlKTsKKyAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDApCisgICAgICAgICAgICByZXR1cm4gdWNzNGxpYl9maW5kX2NoYXIoKFB5X1VDUzQgKikgcywgc2l6ZSwgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzNGxpYl9yZmluZF9jaGFyKChQeV9VQ1M0ICopIHMsIHNpemUsIGNoKTsKICAgICBkZWZhdWx0OgogICAgICAgICBhc3NlcnQoMCk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTI5MDMsNyArMzA3OCw3IEBACiAgICAgLyogUmV0cmlldmUgYSBieXRlcyBidWZmZXIgdmlldyB0aHJvdWdoIHRoZSBQRVAgMzExOCBidWZmZXIgaW50ZXJmYWNlICovCiAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmosICZidWZmZXIsIFB5QlVGX1NJTVBMRSkgPCAwKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiY29lcmNpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsICUuODBzIGZvdW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICJkZWNvZGluZyB0byBzdHI6IG5lZWQgYSBieXRlcy1saWtlIG9iamVjdCwgJS44MHMgZm91bmQiLAogICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzE2NywyNCArMzM0MiwyMiBAQAogc3RhdGljIGludAogbG9jYWxlX2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgKnN1cnJvZ2F0ZWVzY2FwZSkKIHsKLSAgICBpZiAoZXJyb3JzID09IE5VTEwpIHsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKyAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpCisgICAgeworICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDA7CiAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewotICAgICAgICAqc3Vycm9nYXRlZXNjYXBlID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChzdHJjbXAoZXJyb3JzLCAic3Vycm9nYXRlZXNjYXBlIikgPT0gMCkgeworICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKICAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDE7CiAgICAgICAgIHJldHVybiAwOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm9ubHkgJ3N0cmljdCcgYW5kICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXJzICIKKyAgICAgICAgICAgICAgICAgICAgICJhcmUgc3VwcG9ydGVkLCBub3QgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvcnMpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAib25seSAnc3RyaWN0JyBhbmQgJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlcnMgIgotICAgICAgICAgICAgICAgICAiYXJlIHN1cHBvcnRlZCwgbm90ICclcyciLAotICAgICAgICAgICAgICAgICBlcnJvcnMpOwotICAgIHJldHVybiAtMTsKIH0KIAogUHlPYmplY3QgKgpAQCAtMzYyNiwxOSArMzc5OSwxNyBAQAogICAgICAgICBvdXRwdXQgPSBhcmc7CiAgICAgICAgIFB5X0lOQ1JFRihvdXRwdXQpOwogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgYXJnID0gUHlVbmljb2RlX0Zyb21PYmplY3QoYXJnKTsKLSAgICAgICAgaWYgKCFhcmcpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewogICAgICAgICBvdXRwdXQgPSBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0KGFyZyk7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmcpOwogICAgICAgICBpZiAoIW91dHB1dCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sob3V0cHV0KSkgewotICAgICAgICAgICAgUHlfREVDUkVGKG91dHB1dCk7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2RlciBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhvdXRwdXQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIgb3IgYnl0ZXMsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHNpemUgPSBQeUJ5dGVzX0dFVF9TSVpFKG91dHB1dCk7CiAgICAgZGF0YSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG91dHB1dCk7CkBAIC0zNzE2LDcgKzM4ODcsNyBAQAogCiAgICAgaWYgKFB5VW5pY29kZV9VVEY4KHVuaWNvZGUpID09IE5VTEwpIHsKICAgICAgICAgYXNzZXJ0KCFQeVVuaWNvZGVfSVNfQ09NUEFDVF9BU0NJSSh1bmljb2RlKSk7Ci0gICAgICAgIGJ5dGVzID0gX1B5VW5pY29kZV9Bc1VURjhTdHJpbmcodW5pY29kZSwgInN0cmljdCIpOworICAgICAgICBieXRlcyA9IF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsIE5VTEwpOwogICAgICAgICBpZiAoYnl0ZXMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICBfUHlVbmljb2RlX1VURjgodW5pY29kZSkgPSBQeU9iamVjdF9NQUxMT0MoUHlCeXRlc19HRVRfU0laRShieXRlcykgKyAxKTsKQEAgLTM5ODIsNyArNDE1Myw3IEBACiAgICAgUHlfc3NpemVfdCAqZW5kaW5wb3MsIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LCBjb25zdCBjaGFyICoqaW5wdHIsCiAgICAgUHlPYmplY3QgKipvdXRwdXQsIFB5X3NzaXplX3QgKm91dHBvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlPYmplY3QgKnJlc3R1cGxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7CkBAIC00MDkwLDcgKzQyNjEsNyBAQAogICAgIFB5X3NzaXplX3QgKmVuZGlucG9zLCBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwgY29uc3QgY2hhciAqKmlucHRyLAogICAgIF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciAvKiBQeU9iamVjdCAqKm91dHB1dCwgUHlfc3NpemVfdCAqb3V0cG9zICovKQogewotICAgIHN0YXRpYyBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CiAKICAgICBQeU9iamVjdCAqcmVzdHVwbGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlID0gTlVMTDsKQEAgLTQ2OTYsOCArNDg2Nyw5IEBACiAgICAgUHlfc3NpemVfdCBzdGFydGlucG9zOwogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgY29uc3QgY2hhciAqZXJybXNnID0gIiI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAKICAgICBpZiAoc2l6ZSA9PSAwKSB7CiAgICAgICAgIGlmIChjb25zdW1lZCkKQEAgLTQ3MjIsNiArNDg5NCw3IEBACiAgICAgd2hpbGUgKHMgPCBlbmQpIHsKICAgICAgICAgUHlfVUNTNCBjaDsKICAgICAgICAgaW50IGtpbmQgPSB3cml0ZXIua2luZDsKKwogICAgICAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCkgewogICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSSh3cml0ZXIuYnVmZmVyKSkKICAgICAgICAgICAgICAgICBjaCA9IGFzY2lpbGliX3V0ZjhfZGVjb2RlKCZzLCBlbmQsIHdyaXRlci5kYXRhLCAmd3JpdGVyLnBvcyk7CkBAIC00NzYwLDI0ICs0OTMzLDU2IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcl93cml0ZXIoCi0gICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAotICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKLSAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZW5kLCAmc3RhcnRpbnBvcywgJmVuZGlucG9zLCAmZXhjLCAmcywKLSAgICAgICAgICAgICAgICAmd3JpdGVyKSkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgorICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9Xcml0ZUNoYXJJbmxpbmUoJndyaXRlciwgMHhmZmZkKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRToKKyAgICAgICAgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworCisgICAgICAgICAgICBpZiAoX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgmd3JpdGVyLCBQeVVuaWNvZGVfMkJZVEVfS0lORCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIGZvciAoaT1zdGFydGlucG9zOyBpPGVuZGlucG9zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaCA9IChQeV9VQ1M0KSh1bnNpZ25lZCBjaGFyKShzdGFydHNbaV0pOworICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURSh3cml0ZXIua2luZCwgd3JpdGVyLmRhdGEsIHdyaXRlci5wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoICsgMHhkYzAwKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIucG9zKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzICs9IChlbmRpbnBvcyAtIHN0YXJ0aW5wb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICJ1dGYtOCIsIGVycm1zZywKKyAgICAgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCisgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgfQogICAgIH0KIAogRW5kOgogICAgIGlmIChjb25zdW1lZCkKICAgICAgICAgKmNvbnN1bWVkID0gcyAtIHN0YXJ0czsKIAotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiBvbkVycm9yOgotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgIHJldHVybiBOVUxMOwpAQCAtNTg2OCwxMSArNjA3MywxMCBAQAogUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIHsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgUHlfc3NpemVfdCBleHBhbmRzaXplID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICAvKiBJbml0aWFsIGFsbG9jYXRpb24gaXMgYmFzZWQgb24gdGhlIGxvbmdlc3QtcG9zc2libGUgY2hhcmFjdGVyCiAgICAgICAgZXNjYXBlLgpAQCAtNTg4OCwzNSArNjA5MiwyOCBAQAogICAgIH0KICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwotICAgIHN3aXRjaCAoa2luZCkgewotICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSA0OyBicmVhazsKLSAgICBjYXNlIFB5VW5pY29kZV8yQllURV9LSU5EOiBleHBhbmRzaXplID0gNjsgYnJlYWs7Ci0gICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDEwOyBicmVhazsKLSAgICB9CiAKLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotCi0gICAgaWYgKGxlbiA+IChQWV9TU0laRV9UX01BWCAtIDIgLSAxKSAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCi0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBhbmRzaXplKmxlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMSk7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBwID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CiAKICAgICAgICAgLyogRXNjYXBlIGJhY2tzbGFzaGVzICovCiAgICAgICAgIGlmIChjaCA9PSAnXFwnKSB7CisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTkyNSw2ICs2MTIyLDExIEBACiAgICAgICAgIC8qIE1hcCAyMS1iaXQgY2hhcmFjdGVycyB0byAnXFUwMHh4eHh4eCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMTAtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICdVJzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDI4KSAmIDB4MDAwMDAwMEZdOwpAQCAtNTk0MCw2ICs2MTQyLDEwIEBACiAKICAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAyNTYpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDYtMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd1JzsKICAgICAgICAgICAgICpwKysgPSBQeV9oZXhkaWdpdHNbKGNoID4+IDEyKSAmIDB4MDAwRl07CkBAIC01OTUwLDIwICs2MTU2LDM3IEBACiAKICAgICAgICAgLyogTWFwIHNwZWNpYWwgd2hpdGVzcGFjZSB0byAnXHQnLCBcbicsICdccicgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1x0JykgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3QnOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICduJzsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChjaCA9PSAnXHInKSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAncic7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBNYXAgbm9uLXByaW50YWJsZSBVUyBBU0NJSSB0byAnXHhoaCcgKi8KICAgICAgICAgZWxzZSBpZiAoY2ggPCAnICcgfHwgY2ggPj0gMHg3RikgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA0LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAneCc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiA0KSAmIDB4MDAwRl07CkBAIC01OTc1LDEwICs2MTk4LDExIEBACiAgICAgICAgICAgICAqcCsrID0gKGNoYXIpIGNoOwogICAgIH0KIAotICAgIGFzc2VydChwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikgPiAwKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gUHlCeXRlc19BU19TVFJJTkcocmVwcikpIDwgMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHJlcHI7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgpAQCAtNjEwNywxMyArNjMzMSwxMiBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyhQeU9iamVjdCAqdW5pY29kZSkKIHsKLSAgICBQeU9iamVjdCAqcmVwcjsKICAgICBjaGFyICpwOwotICAgIGNoYXIgKnE7Ci0gICAgUHlfc3NpemVfdCBleHBhbmRzaXplLCBwb3M7CisgICAgUHlfc3NpemVfdCBwb3M7CiAgICAgaW50IGtpbmQ7CiAgICAgdm9pZCAqZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh1bmljb2RlKSkgewogICAgICAgICBQeUVycl9CYWRBcmd1bWVudCgpOwpAQCAtNjEyMSwyOCArNjM0NCwyOSBAQAogICAgIH0KICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHVuaWNvZGUpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodW5pY29kZSk7CiAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHVuaWNvZGUpOwogICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHVuaWNvZGUpOwotICAgIC8qIDQgYnl0ZSBjaGFyYWN0ZXJzIGNhbiB0YWtlIHVwIDEwIGJ5dGVzLCAyIGJ5dGUgY2hhcmFjdGVycyBjYW4gdGFrZSB1cCA2Ci0gICAgICAgYnl0ZXMsIGFuZCAxIGJ5dGUgY2hhcmFjdGVycyA0LiAqLwotICAgIGV4cGFuZHNpemUgPSBraW5kICogMiArIDI7CiAKLSAgICBpZiAobGVuID4gUFlfU1NJWkVfVF9NQVggLyBleHBhbmRzaXplKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcmVwciA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgZXhwYW5kc2l6ZSAqIGxlbik7Ci0gICAgaWYgKHJlcHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gcmVwcjsKLQotICAgIHAgPSBxID0gUHlCeXRlc19BU19TVFJJTkcocmVwcik7CiAgICAgZm9yIChwb3MgPSAwOyBwb3MgPCBsZW47IHBvcysrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwogICAgICAgICAvKiBNYXAgMzItYml0IGNoYXJhY3RlcnMgdG8gJ1xVeHh4eHh4eHgnICovCiAgICAgICAgIGlmIChjaCA+PSAweDEwMDAwKSB7CiAgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOworCisgICAgICAgICAgICAvKiAtMTogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweGZdOwpAQCAtNjE1Niw2ICs2MzgwLDExIEBACiAgICAgICAgIH0KICAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzIHRvICdcdXh4eHgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoID49IDI1NikgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA2LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweGZdOwpAQCAtNjE2OCwxMCArNjM5NywxMSBAQAogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAKLSAgICBhc3NlcnQocCA+IHEpOwotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcHIsIHAgLSBxKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTYzNDgsNyArNjU3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IGVuZHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqYXJncGFyc2UgPSAiT247ZW5jb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyL2J5dGVzLCBpbnQpIHR1cGxlIjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CiAgICAgUHlPYmplY3QgKnJlc3VuaWNvZGU7CkBAIC02NDAyLDI1ICs2NjMyLDIyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogdW5pY29kZV9lbmNvZGVfdWNzMShQeU9iamVjdCAqdW5pY29kZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGltaXQpCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X1VDUzQgbGltaXQpCiB7CiAgICAgLyogaW5wdXQgc3RhdGUgKi8KICAgICBQeV9zc2l6ZV90IHBvcz0wLCBzaXplOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7Ci0gICAgLyogb3V0cHV0IG9iamVjdCAqLwotICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgLyogcG9pbnRlciBpbnRvIHRoZSBvdXRwdXQgKi8KICAgICBjaGFyICpzdHI7Ci0gICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KLSAgICBQeV9zc2l6ZV90IHJlc3NpemU7CiAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgPSAobGltaXQgPT0gMjU2KSA/ICJsYXRpbi0xIiA6ICJhc2NpaSI7CiAgICAgY29uc3QgY2hhciAqcmVhc29uID0gKGxpbWl0ID09IDI1NikgPyAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMjU2KSIgOiAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSI7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCi0gICAgICogLTE9bm90IGluaXRpYWxpemVkLCAwPXVua25vd24sIDE9c3RyaWN0LCAyPXJlcGxhY2UsIDM9aWdub3JlLCA0PXhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgaW50IGtub3duX2Vycm9ySGFuZGxlciA9IC0xOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKKyAgICBQeU9iamVjdCAqcmVwID0gTlVMTDsKKyAgICAvKiBvdXRwdXQgb2JqZWN0ICovCisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC02NDMxLDE4NiArNjY1OCwxNTcgQEAKICAgICAgICByZXBsYWNlbWVudHMsIGlmIHdlIG5lZWQgbW9yZSwgd2UnbGwgcmVzaXplICovCiAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7Ci0gICAgcmVzID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLSAgICBpZiAocmVzID09IE5VTEwpCisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICByZXNzaXplID0gc2l6ZTsKIAogICAgIHdoaWxlIChwb3MgPCBzaXplKSB7Ci0gICAgICAgIFB5X1VDUzQgYyA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIHBvcyk7CisgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOwogCiAgICAgICAgIC8qIGNhbiB3ZSBlbmNvZGUgdGhpcz8gKi8KLSAgICAgICAgaWYgKGM8bGltaXQpIHsKKyAgICAgICAgaWYgKGNoIDwgbGltaXQpIHsKICAgICAgICAgICAgIC8qIG5vIG92ZXJmbG93IGNoZWNrLCBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUgc3BhY2UgaXMgZW5vdWdoICovCi0gICAgICAgICAgICAqc3RyKysgPSAoY2hhciljOworICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpY2g7CiAgICAgICAgICAgICArK3BvczsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGU7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcHNpemUsIG5ld3BvcywgcmVzcG9zLCBpOworICAgICAgICAgICAgUHlfc3NpemVfdCBuZXdwb3MsIGk7CiAgICAgICAgICAgICAvKiBzdGFydHBvcyBmb3IgY29sbGVjdGluZyB1bmVuY29kYWJsZSBjaGFycyAqLwogICAgICAgICAgICAgUHlfc3NpemVfdCBjb2xsc3RhcnQgPSBwb3M7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBwb3M7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGNvbGxlbmQgPSBjb2xsc3RhcnQgKyAxOwogICAgICAgICAgICAgLyogZmluZCBhbGwgdW5lY29kYWJsZSBjaGFyYWN0ZXJzICovCisKICAgICAgICAgICAgIHdoaWxlICgoY29sbGVuZCA8IHNpemUpICYmIChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBjb2xsZW5kKSA+PSBsaW1pdCkpCiAgICAgICAgICAgICAgICAgKytjb2xsZW5kOworCisgICAgICAgICAgICAvKiBPbmx5IG92ZXJhbGxvY2F0ZSB0aGUgYnVmZmVyIGlmIGl0J3Mgbm90IHRoZSBsYXN0IHdyaXRlICovCisgICAgICAgICAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gKGNvbGxlbmQgPCBzaXplKTsKKwogICAgICAgICAgICAgLyogY2FjaGUgY2FsbGJhY2sgbmFtZSBsb29rdXAgKGlmIG5vdCBkb25lIHlldCwgaS5lLiBpdCdzIHRoZSBmaXJzdCBlcnJvcikgKi8KLSAgICAgICAgICAgIGlmIChrbm93bl9lcnJvckhhbmRsZXI9PS0xKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChlcnJvcnM9PU5VTEwpIHx8ICghc3RyY21wKGVycm9ycywgInN0cmljdCIpKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgImlnbm9yZSIpKQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAzOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gNDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGtub3duX2Vycm9ySGFuZGxlcikgewotICAgICAgICAgICAgY2FzZSAxOiAvKiBzdHJpY3QgKi8KKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpIHsKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLCBjb2xsc3RhcnQsIGNvbGxlbmQsIHJlYXNvbik7CiAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgY2FzZSAyOiAvKiByZXBsYWNlICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbGxzdGFydCsrIDwgY29sbGVuZCkKLSAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gJz8nOyAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGNhc2UgMzogLyogaWdub3JlICovCisKKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CisgICAgICAgICAgICAgICAgbWVtc2V0KHN0ciwgJz8nLCBjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgKz0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCBpZ25vcmUgZXJyb3IgaGFuZGxlciAqLworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfSUdOT1JFOgogICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IC8qIHhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgICAgICAgICAgICAgcmVzcG9zID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSByZXNwb3M7Ci0gICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHJlcGxhY2VtZW50IHNpemUgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwotICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGluY3I7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDEwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMSsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzIrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrMysxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNCsxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzUrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNisxOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis3KzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBpbmNyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSAoc2l6ZSAtIGNvbGxlbmQpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBzaXplIC0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gcmVzc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA8PSBQWV9TU0laRV9UX01BWC8yICYmIHJlcXVpcmVkc2l6ZSA8IDIqcmVzc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IDIqcmVzc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXF1aXJlZHNpemUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICByZXNzaXplID0gcmVxdWlyZWRzaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHIgKz0gc3ByaW50ZihzdHIsICImIyVkOyIsIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0LCBjb2xsZW5kLCAmbmV3cG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocmVwdW5pY29kZSA9PSBOVUxMIHx8IChQeVVuaWNvZGVfQ2hlY2socmVwdW5pY29kZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRFkocmVwdW5pY29kZSkgPT0gLTEpKQorCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFOgorICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gKGNvbGxlbmQgLSBjb2xsc3RhcnQpOworICAgICAgICAgICAgICAgIHN0ciA9IGJhY2tzbGFzaHJlcGxhY2UoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayhyZXB1bmljb2RlKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RseSBjb3B5IGJ5dGVzIHJlc3VsdCB0byBvdXRwdXQuICovCi0gICAgICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeUJ5dGVzX1NpemUocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXBzaXplID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFrZSByb29tIGZvciBhbGwgYWRkaXRpb25hbCBieXRlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gcmVwc2l6ZSAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgcmVzc2l6ZStyZXBzaXplLTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNzaXplICs9IHJlcHNpemUtMTsKKyAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRToKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgPSB4bWxjaGFycmVmcmVwbGFjZSgmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8IDB4ZGM4MCB8fCAweGRjZmYgPCBjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm90IGEgVVRGLThiIHN1cnJvZ2F0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN0ciwgUHlCeXRlc19Bc1N0cmluZyhyZXB1bmljb2RlKSwgcmVwc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciArPSByZXBzaXplOwotICAgICAgICAgICAgICAgICAgICBwb3MgPSBuZXdwb3M7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpKGNoIC0gMHhkYzAwKTsKKyAgICAgICAgICAgICAgICAgICAgKytwb3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID49IGNvbGxlbmQpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBuZWVkIG1vcmUgc3BhY2U/IChhdCBsZWFzdCBlbm91Z2ggZm9yIHdoYXQgd2UKLSAgICAgICAgICAgICAgICAgICBoYXZlK3RoZSByZXBsYWNlbWVudCt0aGUgcmVzdCBvZiB0aGUgc3RyaW5nLCBzbwotICAgICAgICAgICAgICAgICAgIHdlIHdvbid0IGhhdmUgdG8gY2hlY2sgc3BhY2UgZm9yIGVuY29kYWJsZSBjaGFyYWN0ZXJzKSAqLwotICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgcmVwc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IHJlc3BvczsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSByZXBzaXplKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSByZXBzaXplOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIChzaXplIC0gY29sbGVuZCkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplICs9IHNpemUgLSBjb2xsZW5kOwotICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiByZXNzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXNzaXplIDw9IFBZX1NTSVpFX1RfTUFYLzIgJiYgcmVxdWlyZWRzaXplIDwgMipyZXNzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gMipyZXNzaXplOwotICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlcXVpcmVkc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKKyAgICAgICAgICAgICAgICBjb2xsc3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgYXNzZXJ0KGNvbGxzdGFydCAhPSBjb2xsZW5kKTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsYmFjayB0byBnZW5lcmFsIGVycm9yIGhhbmRsaW5nICovCisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVwID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIHJlYXNvbiwgdW5pY29kZSwgJmV4YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnQsIGNvbGxlbmQsICZuZXdwb3MpOworICAgICAgICAgICAgICAgIGlmIChyZXAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworCisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAxOworCisgICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwKSkgeworICAgICAgICAgICAgICAgICAgICAvKiBEaXJlY3RseSBjb3B5IGJ5dGVzIHJlc3VsdCB0byBvdXRwdXQuICovCisgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1dyaXRlQnl0ZXMoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRShyZXApKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcykgKyByZXNwb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3NpemUgPSByZXF1aXJlZHNpemU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHVuZW5jb2RhYmxlIGluIHRoZSByZXBsYWNlbWVudAotICAgICAgICAgICAgICAgICAgIGFuZCBjb3B5IGl0IHRvIHRoZSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgewotICAgICAgICAgICAgICAgICAgICBjID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXB1bmljb2RlLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gbGltaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlX2VuY29kZV9leGNlcHRpb24oJmV4YywgZW5jb2RpbmcsIHVuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2socmVwKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShyZXApIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aDogYWxsIGNoYXJhY3RlcnMgYXJlIHNtYWxsZXIgdGhhbiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGxpbWl0ID49IDEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0tJTkQocmVwKSA9PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0RBVEEocmVwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCByZXBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmVwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBzdHIsIHJlcHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgdGhlcmUgaXMgYW55dGhpbmcgdW5lbmNvZGFibGUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCBhbmQgY29weSBpdCB0byB0aGUgb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyByZXBzaXplLS0+MDsgKytpLCArK3N0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQURfQ0hBUihyZXAsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA+PSBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcywgcG9zKzEsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0ciA9IChjaGFyKWNoOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcyA9IG5ld3BvczsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgUHlfQ0xFQVIocmVwKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgIHdyaXRlLiBPdGhlcndpc2UsIHdlIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIGFzc2VydCh3cml0ZXIub3ZlcmFsbG9jYXRlIHx8IHBvcyA9PSBzaXplKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiBSZXNpemUgaWYgd2UgYWxsb2NhdGVkIHRvIG11Y2ggKi8KLSAgICBzaXplID0gc3RyIC0gUHlCeXRlc19BU19TVFJJTkcocmVzKTsKLSAgICBpZiAoc2l6ZSA8IHJlc3NpemUpIHsgLyogSWYgdGhpcyBmYWxscyByZXMgd2lsbCBiZSBOVUxMICovCi0gICAgICAgIGFzc2VydChzaXplID49IDApOwotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHNpemUpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICB9CiAKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIHJldHVybiByZXM7Ci0KLSAgb3ZlcmZsb3c6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRihyZXMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKHJlcCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02NjcwLDggKzY4NjgsOSBAQAogICAgIFB5X3NzaXplX3QgZW5kaW5wb3M7CiAgICAgUHlfc3NpemVfdCBvdXRwb3M7CiAgICAgY29uc3QgY2hhciAqZTsKLSAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZXJyb3JfaGFuZGxlcl9vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKIAogICAgIGlmIChzaXplID09IDApCiAgICAgICAgIF9QeV9SRVRVUk5fVU5JQ09ERV9FTVBUWSgpOwpAQCAtNjcwMCwxMiArNjg5OSw0MiBAQAogICAgICAgICAgICAgUHlVbmljb2RlX1dSSVRFKGtpbmQsIGRhdGEsIHdyaXRlci5wb3MsIGMpOwogICAgICAgICAgICAgd3JpdGVyLnBvcysrOwogICAgICAgICAgICAgKytzOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisKKyAgICAgICAgLyogYnl0ZSBvdXRzaXplIHJhbmdlIDB4MDAuLjB4N2Y6IGNhbGwgdGhlIGVycm9yIGhhbmRsZXIgKi8KKworICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgIGVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgICAgIHN3aXRjaCAoZXJyb3JfaGFuZGxlcikKKyAgICAgICAgeworICAgICAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgorICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgICAgICAvKiBGYXN0LXBhdGg6IHRoZSBlcnJvciBoYW5kbGVyIG9ubHkgd3JpdGVzIG9uZSBjaGFyYWN0ZXIsCisgICAgICAgICAgICAgICBidXQgd2UgbWF5IHN3aXRjaCB0byBVQ1MyIGF0IHRoZSBmaXJzdCB3cml0ZSAqLworICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoJndyaXRlciwgUHlVbmljb2RlXzJCWVRFX0tJTkQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBraW5kID0gd3JpdGVyLmtpbmQ7CisgICAgICAgICAgICBkYXRhID0gd3JpdGVyLmRhdGE7CisKKyAgICAgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9SRVBMQUNFKQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCAweGZmZmQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCBjICsgMHhkYzAwKTsKKyAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGFydGlucG9zID0gcy1zdGFydHM7CiAgICAgICAgICAgICBlbmRpbnBvcyA9IHN0YXJ0aW5wb3MgKyAxOwogICAgICAgICAgICAgaWYgKHVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyX3dyaXRlcigKLSAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBlcnJvcnMsICZlcnJvcl9oYW5kbGVyX29iaiwKICAgICAgICAgICAgICAgICAgICAgImFzY2lpIiwgIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiLAogICAgICAgICAgICAgICAgICAgICAmc3RhcnRzLCAmZSwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCiAgICAgICAgICAgICAgICAgICAgICZ3cml0ZXIpKQpAQCAtNjcxNCwxMyArNjk0MywxMyBAQAogICAgICAgICAgICAgZGF0YSA9IHdyaXRlci5kYXRhOwogICAgICAgICB9CiAgICAgfQotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZ3cml0ZXIpOwogCiAgIG9uRXJyb3I6CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CkBAIC02Nzc1LDcgKzcwMDQsNyBAQAogIyAgZGVmaW5lIFdDX0VSUl9JTlZBTElEX0NIQVJTIDB4MDA4MAogI2VuZGlmCiAKLXN0YXRpYyBjaGFyKgorc3RhdGljIGNvbnN0IGNoYXIqCiBjb2RlX3BhZ2VfbmFtZShVSU5UIGNvZGVfcGFnZSwgUHlPYmplY3QgKipvYmopCiB7CiAgICAgKm9iaiA9IE5VTEw7CkBAIC02ODgzLDcgKzcxMTIsNyBAQAogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICplbmNvZGluZ19vYmogPSBOVUxMOwotICAgIGNoYXIgKmVuY29kaW5nOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogICAgIERXT1JEIGVycjsKICAgICBpbnQgcmV0ID0gLTE7CiAKQEAgLTcxMTksNyArNzM0OCw2IEBACiAgICAgQk9PTCB1c2VkRGVmYXVsdENoYXIgPSBGQUxTRTsKICAgICBCT09MICpwdXNlZERlZmF1bHRDaGFyID0gJnVzZWREZWZhdWx0Q2hhcjsKICAgICBpbnQgb3V0c2l6ZTsKLSAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICB3Y2hhcl90ICpwOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKICAgICBjb25zdCBEV09SRCBmbGFncyA9IGVuY29kZV9jb2RlX3BhZ2VfZmxhZ3MoY29kZV9wYWdlLCBOVUxMKTsKQEAgLTcyMjgsNyArNzQ1Niw3IEBACiAgICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmVuY29kaW5nX29iaiA9IE5VTEw7Ci0gICAgY2hhciAqZW5jb2Rpbmc7CisgICAgY29uc3QgY2hhciAqZW5jb2Rpbmc7CiAgICAgUHlfc3NpemVfdCBuZXdwb3MsIG5ld291dHNpemU7CiAgICAgUHlPYmplY3QgKnJlcDsKICAgICBpbnQgcmV0ID0gLTE7CkBAIC04MDg2LDcgKzgzMTQsNyBAQAogY2hhcm1hcF9lbmNvZGluZ19lcnJvcigKICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCAqaW5wb3MsIFB5T2JqZWN0ICptYXBwaW5nLAogICAgIFB5T2JqZWN0ICoqZXhjZXB0aW9uT2JqZWN0LAotICAgIGludCAqa25vd25fZXJyb3JIYW5kbGVyLCBQeU9iamVjdCAqKmVycm9ySGFuZGxlciwgY29uc3QgY2hhciAqZXJyb3JzLAorICAgIF9QeV9lcnJvcl9oYW5kbGVyICplcnJvcl9oYW5kbGVyLCBQeU9iamVjdCAqKmVycm9yX2hhbmRsZXJfb2JqLCBjb25zdCBjaGFyICplcnJvcnMsCiAgICAgUHlPYmplY3QgKipyZXMsIFB5X3NzaXplX3QgKnJlc3BvcykKIHsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7IC8qIGluaXRpYWxpemUgdG8gcHJldmVudCBnY2Mgd2FybmluZyAqLwpAQCAtODEzMywyMyArODM2MSwxNSBAQAogICAgIH0KICAgICAvKiBjYWNoZSBjYWxsYmFjayBuYW1lIGxvb2t1cAogICAgICAqIChpZiBub3QgZG9uZSB5ZXQsIGkuZS4gaXQncyB0aGUgZmlyc3QgZXJyb3IpICovCi0gICAgaWYgKCprbm93bl9lcnJvckhhbmRsZXI9PS0xKSB7Ci0gICAgICAgIGlmICgoZXJyb3JzPT1OVUxMKSB8fCAoIXN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSkpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMTsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMjsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSkKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAzOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInhtbGNoYXJyZWZyZXBsYWNlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gNDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDA7Ci0gICAgfQotICAgIHN3aXRjaCAoKmtub3duX2Vycm9ySGFuZGxlcikgewotICAgIGNhc2UgMTogLyogc3RyaWN0ICovCisgICAgaWYgKCplcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAqZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICBzd2l0Y2ggKCplcnJvcl9oYW5kbGVyKSB7CisgICAgY2FzZSBfUHlfRVJST1JfU1RSSUNUOgogICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKGV4Y2VwdGlvbk9iamVjdCwgZW5jb2RpbmcsIHVuaWNvZGUsIGNvbGxzdGFydHBvcywgY29sbGVuZHBvcywgcmVhc29uKTsKICAgICAgICAgcmV0dXJuIC0xOwotICAgIGNhc2UgMjogLyogcmVwbGFjZSAqLworCisgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKICAgICAgICAgZm9yIChjb2xscG9zID0gY29sbHN0YXJ0cG9zOyBjb2xscG9zPGNvbGxlbmRwb3M7ICsrY29sbHBvcykgewogICAgICAgICAgICAgeCA9IGNoYXJtYXBlbmNvZGVfb3V0cHV0KCc/JywgbWFwcGluZywgcmVzLCByZXNwb3MpOwogICAgICAgICAgICAgaWYgKHg9PWVuY19FWENFUFRJT04pIHsKQEAgLTgxNjEsMTAgKzgzODEsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLSAgICBjYXNlIDM6IC8qIGlnbm9yZSAqLworICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKICAgICAgICAgKmlucG9zID0gY29sbGVuZHBvczsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAvKiB4bWxjaGFycmVmcmVwbGFjZSAqLworCisgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CiAgICAgICAgIC8qIGdlbmVyYXRlIHJlcGxhY2VtZW50ICh0ZW1wb3JhcmlseSAobWlzKXVzZXMgcCkgKi8KICAgICAgICAgZm9yIChjb2xscG9zID0gY29sbHN0YXJ0cG9zOyBjb2xscG9zIDwgY29sbGVuZHBvczsgKytjb2xscG9zKSB7CiAgICAgICAgICAgICBjaGFyIGJ1ZmZlclsyKzI5KzErMV07CkBAIC04MTgyLDggKzg0MDMsOSBAQAogICAgICAgICB9CiAgICAgICAgICppbnBvcyA9IGNvbGxlbmRwb3M7CiAgICAgICAgIGJyZWFrOworCiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgZXJyb3JIYW5kbGVyLAorICAgICAgICByZXB1bmljb2RlID0gdW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoZXJyb3JzLCBlcnJvcl9oYW5kbGVyX29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCByZWFzb24sIHVuaWNvZGUsIGV4Y2VwdGlvbk9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxzdGFydHBvcywgY29sbGVuZHBvcywgJm5ld3Bvcyk7CiAgICAgICAgIGlmIChyZXB1bmljb2RlID09IE5VTEwpCkBAIC04MjQ2LDEyICs4NDY4LDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgLyogY3VycmVudCBvdXRwdXQgcG9zaXRpb24gKi8KICAgICBQeV9zc2l6ZV90IHJlc3BvcyA9IDA7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKLSAgICAvKiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIGlzIHVzZWQgZm9yIGNhY2hpbmcgc3RyaW5nIGNvbXBhcmlzb25zCi0gICAgICogLTE9bm90IGluaXRpYWxpemVkLCAwPXVua25vd24sIDE9c3RyaWN0LCAyPXJlcGxhY2UsCi0gICAgICogMz1pZ25vcmUsIDQ9eG1sY2hhcnJlZnJlcGxhY2UgKi8KLSAgICBpbnQga25vd25fZXJyb3JIYW5kbGVyID0gLTE7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogICAgIHZvaWQgKmRhdGE7CiAgICAgaW50IGtpbmQ7CiAKQEAgLTgyODIsNyArODUwMSw3IEBACiAgICAgICAgIGlmICh4PT1lbmNfRkFJTEVEKSB7IC8qIHVuZW5jb2RhYmxlIGNoYXJhY3RlciAqLwogICAgICAgICAgICAgaWYgKGNoYXJtYXBfZW5jb2RpbmdfZXJyb3IodW5pY29kZSwgJmlucG9zLCBtYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrbm93bl9lcnJvckhhbmRsZXIsICZlcnJvckhhbmRsZXIsIGVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvcl9oYW5kbGVyLCAmZXJyb3JfaGFuZGxlcl9vYmosIGVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXMsICZyZXNwb3MpKSB7CiAgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgICAgICAgICAgfQpAQCAtODI5OCwxMyArODUxNywxMyBAQAogICAgICAgICAgICAgZ290byBvbkVycm9yOwogCiAgICAgUHlfWERFQ1JFRihleGMpOwotICAgIFB5X1hERUNSRUYoZXJyb3JIYW5kbGVyKTsKKyAgICBQeV9YREVDUkVGKGVycm9yX2hhbmRsZXJfb2JqKTsKICAgICByZXR1cm4gcmVzOwogCiAgIG9uRXJyb3I6CiAgICAgUHlfWERFQ1JFRihyZXMpOwogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTgzNzEsNyArODU5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0cG9zLCBQeV9zc2l6ZV90IGVuZHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm5ld3BvcykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO3RyYW5zbGF0aW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjt0cmFuc2xhdGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlfc3NpemVfdCBpX25ld3BvczsKICAgICBQeU9iamVjdCAqcmVzdHVwbGU7CkBAIC04NjI4LDcgKzg4NDcsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLVB5T2JqZWN0ICoKK3N0YXRpYyBQeU9iamVjdCAqCiBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoUHlPYmplY3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICptYXBwaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKQEAgLTg2NTcsMTAgKzg4NzYsOCBAQAogICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChpbnB1dCk7CiAgICAgc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGlucHV0KTsKIAotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgUHlfSU5DUkVGKGlucHV0KTsKLSAgICAgICAgcmV0dXJuIGlucHV0OwotICAgIH0KKyAgICBpZiAoc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PYmplY3QoaW5wdXQpOwogCiAgICAgLyogYWxsb2NhdGUgZW5vdWdoIGZvciBhIHNpbXBsZSAxOjEgdHJhbnNsYXRpb24gd2l0aG91dAogICAgICAgIHJlcGxhY2VtZW50cywgaWYgd2UgbmVlZCBtb3JlLCB3ZSdsbCByZXNpemUgKi8KQEAgLTg3NzEsMTQgKzg5ODgsOSBAQAogICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQogewotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdCA9IF9QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gX1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKTsKIH0KIAogc3RhdGljIFB5X1VDUzQKQEAgLTg5NjAsOSArOTE3MiwxMCBAQAogICAgIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLWFueV9maW5kX3NsaWNlKGludCBkaXJlY3Rpb24sIFB5T2JqZWN0KiBzMSwgUHlPYmplY3QqIHMyLAorYW55X2ZpbmRfc2xpY2UoUHlPYmplY3QqIHMxLCBQeU9iamVjdCogczIsCiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAotICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQpCisgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKKyAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKQEAgLTkxMzEsNTQgKzkzNDQsMzUgQEAKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCkKIHsKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKLSAgICBQeU9iamVjdCogc3RyX29iajsKLSAgICBQeU9iamVjdCogc3ViX29iajsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEgPSBOVUxMLCAqYnVmMiA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yOwogCi0gICAgc3RyX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKCFzdHJfb2JqKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHN1Yl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJzdHIpOwotICAgIGlmICghc3ViX29iaikgewotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJfb2JqKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyX29iaikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CiAKLSAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cl9vYmopOwotICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3ViX29iaik7Ci0gICAgaWYgKGtpbmQxIDwga2luZDIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CisgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHIpOworICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3Vic3RyKTsKKyAgICBpZiAoa2luZDEgPCBraW5kMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCi0gICAgbGVuMSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cl9vYmopOwotICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJfb2JqKTsKKyAgICBsZW4xID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKTsKKyAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3Vic3RyKTsKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4xKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOworICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KIAotICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHJfb2JqKTsKLSAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3ViX29iaik7CisgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisgICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1YnN0cik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7Ci0gICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWJfb2JqLCBraW5kMSk7CisgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWJzdHIsIGtpbmQxKTsKICAgICAgICAgaWYgKCFidWYyKQogICAgICAgICAgICAgZ290byBvbkVycm9yOwogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgotICAgICAgICBpZiAoUHlVbmljb2RlX0lTX0FTQ0lJKHN0cl9vYmopICYmIFB5VW5pY29kZV9JU19BU0NJSShzdWJfb2JqKSkKKyAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSShzdHIpICYmIFB5VW5pY29kZV9JU19BU0NJSShzdWJzdHIpKQogICAgICAgICAgICAgcmVzdWx0ID0gYXNjaWlsaWJfY291bnQoCiAgICAgICAgICAgICAgICAgKChQeV9VQ1MxKilidWYxKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKICAgICAgICAgICAgICAgICBidWYyLCBsZW4yLCBQWV9TU0laRV9UX01BWApAQCAtOTIwNSwxNiArOTM5OSwxMSBAQAogICAgICAgICBhc3NlcnQoMCk7IHJlc3VsdCA9IDA7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLQogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAogICAgIHJldHVybiByZXN1bHQ7CiAgIG9uRXJyb3I6Ci0gICAgUHlfREVDUkVGKHN1Yl9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEgJiYgYnVmMikKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKICAgICByZXR1cm4gLTE7CkBAIC05MjIyLDM1ICs5NDExLDE1IEBACiAKIFB5X3NzaXplX3QKIFB5VW5pY29kZV9GaW5kKFB5T2JqZWN0ICpzdHIsCi0gICAgICAgICAgICAgICBQeU9iamVjdCAqc3ViLAorICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YnN0ciwKICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhcnQsCiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGVuZCwKICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQ7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmICghc3RyKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCkKICAgICAgICAgcmV0dXJuIC0yOwotICAgIHN1YiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN1Yik7Ci0gICAgaWYgKCFzdWIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWIpID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIC0yOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKGRpcmVjdGlvbiwKLSAgICAgICAgc3RyLCBzdWIsIHN0YXJ0LCBlbmQKLSAgICAgICAgKTsKLQotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIFB5X0RFQ1JFRihzdWIpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gYW55X2ZpbmRfc2xpY2Uoc3RyLCBzdWJzdHIsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CiB9CiAKIFB5X3NzaXplX3QKQEAgLTkzNTMsMjIgKzk1MjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCiAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQ7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzdWJzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJzdHIpOwotICAgIGlmIChzdWJzdHIgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KIAotICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzdHIsIHN1YnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiB0YWlsbWF0Y2goc3RyLCBzdWJzdHIsIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7CiB9CiAKIC8qIEFwcGx5IGZpeGZjdCBmaWx0ZXIgdG8gdGhlIFVuaWNvZGUgb2JqZWN0IHNlbGYgYW5kIHJldHVybiBhCkBAIC05OTc0LDEzICsxMDEzMSw4IEBACiB7CiAgICAgUHlPYmplY3QgKmxpc3Q7CiAKLSAgICBzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJpbmcpOwotICAgIGlmIChzdHJpbmcgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyaW5nKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAgc3dpdGNoIChQeVVuaWNvZGVfS0lORChzdHJpbmcpKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKQEAgLTEwMDA3LDcgKzEwMTU5LDYgQEAKICAgICAgICAgYXNzZXJ0KDApOwogICAgICAgICBsaXN0ID0gMDsKICAgICB9Ci0gICAgUHlfREVDUkVGKHN0cmluZyk7CiAgICAgcmV0dXJuIGxpc3Q7CiB9CiAKQEAgLTEwNTY4LDI4ICsxMDcxOSwyNyBAQAogfQogCiAKLS8qIEFyZ3VtZW50IGNvbnZlcnRlci4gIENvZXJjZXMgdG8gYSBzaW5nbGUgdW5pY29kZSBjaGFyYWN0ZXIgKi8KKy8qIEFyZ3VtZW50IGNvbnZlcnRlci4gQWNjZXB0cyBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KIAogc3RhdGljIGludAogY29udmVydF91YyhQeU9iamVjdCAqb2JqLCB2b2lkICphZGRyKQogewogICAgIFB5X1VDUzQgKmZpbGxjaGFybG9jID0gKFB5X1VDUzQgKilhZGRyOwotICAgIFB5T2JqZWN0ICp1bmlvYmo7CiAKLSAgICB1bmlvYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChvYmopOwotICAgIGlmICh1bmlvYmogPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBmaWxsIGNoYXJhY3RlciBjYW5ub3QgYmUgY29udmVydGVkIHRvIFVuaWNvZGUiKTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgYSB1bmljb2RlIGNoYXJhY3RlciwgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjEwMHMiLCBQeV9UWVBFKG9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKHVuaW9iaikgIT0gMSkgeworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkob2JqKSA8IDApCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSChvYmopICE9IDEpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlsbCBjaGFyYWN0ZXIgbXVzdCBiZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgbG9uZyIpOwotICAgICAgICBQeV9ERUNSRUYodW5pb2JqKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgICpmaWxsY2hhcmxvYyA9IFB5VW5pY29kZV9SRUFEX0NIQVIodW5pb2JqLCAwKTsKLSAgICBQeV9ERUNSRUYodW5pb2JqKTsKKyAgICAqZmlsbGNoYXJsb2MgPSBQeVVuaWNvZGVfUkVBRF9DSEFSKG9iaiwgMCk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTEwOTA1LDU5ICsxMTA1NSw0OSBAQAogfQogCiBpbnQKLVB5VW5pY29kZV9Db250YWlucyhQeU9iamVjdCAqY29udGFpbmVyLCBQeU9iamVjdCAqZWxlbWVudCkKK19QeVVuaWNvZGVfRVEoUHlPYmplY3QgKmFhLCBQeU9iamVjdCAqYmIpCiB7Ci0gICAgUHlPYmplY3QgKnN0ciwgKnN1YjsKKyAgICByZXR1cm4gdW5pY29kZV9lcShhYSwgYmIpOworfQorCitpbnQKK1B5VW5pY29kZV9Db250YWlucyhQeU9iamVjdCAqc3RyLCBQeU9iamVjdCAqc3Vic3RyKQorewogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yOwogICAgIGludCByZXN1bHQ7CiAKLSAgICAvKiBDb2VyY2UgdGhlIHR3byBhcmd1bWVudHMgKi8KLSAgICBzdWIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChlbGVtZW50KTsKLSAgICBpZiAoIXN1YikgeworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1YnN0cikpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICInaW4gPHN0cmluZz4nIHJlcXVpcmVzIHN0cmluZyBhcyBsZWZ0IG9wZXJhbmQsIG5vdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBlbGVtZW50LT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICInaW4gPHN0cmluZz4nIHJlcXVpcmVzIHN0cmluZyBhcyBsZWZ0IG9wZXJhbmQsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHIpLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGNvbnRhaW5lcik7Ci0gICAgaWYgKCFzdHIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHIpID09IC0xKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOwogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHIpOwotICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3ViKTsKLSAgICBpZiAoa2luZDEgPCBraW5kMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHIpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAgICAgbGVuMSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7Ci0gICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1Yik7Ci0gICAgaWYgKGxlbjEgPCBsZW4yKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3Vic3RyKTsKKyAgICBpZiAobGVuMSA8IGxlbjIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKLSAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3ViKTsKKyAgICBidWYyID0gUHlVbmljb2RlX0RBVEEoc3Vic3RyKTsKICAgICBpZiAobGVuMiA9PSAxKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kMiwgYnVmMiwgMCk7CiAgICAgICAgIHJlc3VsdCA9IGZpbmRjaGFyKChjb25zdCBjaGFyICopYnVmMSwga2luZDEsIGxlbjEsIGNoLCAxKSAhPSAtMTsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKLSAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHN1Yiwga2luZDEpOwotICAgICAgICBpZiAoIWJ1ZjIpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWJzdHIsIGtpbmQxKTsKKyAgICAgICAgaWYgKCFidWYyKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewpAQCAtMTA5NzUsOSArMTExMTUsNiBAQAogICAgICAgICBhc3NlcnQoMCk7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgUHlfREVDUkVGKHN1Yik7Ci0KICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKQEAgLTEwOTg5LDU2ICsxMTEyNiw0MCBAQAogUHlPYmplY3QgKgogUHlVbmljb2RlX0NvbmNhdChQeU9iamVjdCAqbGVmdCwgUHlPYmplY3QgKnJpZ2h0KQogewotICAgIFB5T2JqZWN0ICp1ID0gTlVMTCwgKnYgPSBOVUxMLCAqdzsKKyAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5X1VDUzQgbWF4Y2hhciwgbWF4Y2hhcjI7Ci0gICAgUHlfc3NpemVfdCB1X2xlbiwgdl9sZW4sIG5ld19sZW47CisgICAgUHlfc3NpemVfdCBsZWZ0X2xlbiwgcmlnaHRfbGVuLCBuZXdfbGVuOwogCi0gICAgLyogQ29lcmNlIHRoZSB0d28gYXJndW1lbnRzICovCi0gICAgdSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGxlZnQpOwotICAgIGlmICh1ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICB2ID0gUHlVbmljb2RlX0Zyb21PYmplY3QocmlnaHQpOwotICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUobGVmdCkgPCAwIHx8IGVuc3VyZV91bmljb2RlKHJpZ2h0KSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogU2hvcnRjdXRzICovCi0gICAgaWYgKHYgPT0gdW5pY29kZV9lbXB0eSkgewotICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgIHJldHVybiB1OwotICAgIH0KLSAgICBpZiAodSA9PSB1bmljb2RlX2VtcHR5KSB7Ci0gICAgICAgIFB5X0RFQ1JFRih1KTsKLSAgICAgICAgcmV0dXJuIHY7Ci0gICAgfQorICAgIGlmIChsZWZ0ID09IHVuaWNvZGVfZW1wdHkpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbU9iamVjdChyaWdodCk7CisgICAgaWYgKHJpZ2h0ID09IHVuaWNvZGVfZW1wdHkpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbU9iamVjdChsZWZ0KTsKIAotICAgIHVfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodSk7Ci0gICAgdl9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh2KTsKLSAgICBpZiAodV9sZW4gPiBQWV9TU0laRV9UX01BWCAtIHZfbGVuKSB7CisgICAgbGVmdF9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChsZWZ0KTsKKyAgICByaWdodF9sZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyaWdodCk7CisgICAgaWYgKGxlZnRfbGVuID4gUFlfU1NJWkVfVF9NQVggLSByaWdodF9sZW4pIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyBhcmUgdG9vIGxhcmdlIHRvIGNvbmNhdCIpOwotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBuZXdfbGVuID0gdV9sZW4gKyB2X2xlbjsKKyAgICBuZXdfbGVuID0gbGVmdF9sZW4gKyByaWdodF9sZW47CiAKLSAgICBtYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHUpOwotICAgIG1heGNoYXIyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHYpOworICAgIG1heGNoYXIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUobGVmdCk7CisgICAgbWF4Y2hhcjIgPSBQeVVuaWNvZGVfTUFYX0NIQVJfVkFMVUUocmlnaHQpOwogICAgIG1heGNoYXIgPSBQeV9NQVgobWF4Y2hhciwgbWF4Y2hhcjIpOwogCiAgICAgLyogQ29uY2F0IHRoZSB0d28gVW5pY29kZSBzdHJpbmdzICovCi0gICAgdyA9IFB5VW5pY29kZV9OZXcobmV3X2xlbiwgbWF4Y2hhcik7Ci0gICAgaWYgKHcgPT0gTlVMTCkKLSAgICAgICAgZ290byBvbkVycm9yOwotICAgIF9QeVVuaWNvZGVfRmFzdENvcHlDaGFyYWN0ZXJzKHcsIDAsIHUsIDAsIHVfbGVuKTsKLSAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyh3LCB1X2xlbiwgdiwgMCwgdl9sZW4pOwotICAgIFB5X0RFQ1JFRih1KTsKLSAgICBQeV9ERUNSRUYodik7Ci0gICAgYXNzZXJ0KF9QeVVuaWNvZGVfQ2hlY2tDb25zaXN0ZW5jeSh3LCAxKSk7Ci0gICAgcmV0dXJuIHc7Ci0KLSAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHUpOwotICAgIFB5X1hERUNSRUYodik7Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlVbmljb2RlX05ldyhuZXdfbGVuLCBtYXhjaGFyKTsKKyAgICBpZiAocmVzdWx0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIF9QeVVuaWNvZGVfRmFzdENvcHlDaGFyYWN0ZXJzKHJlc3VsdCwgMCwgbGVmdCwgMCwgbGVmdF9sZW4pOworICAgIF9QeVVuaWNvZGVfRmFzdENvcHlDaGFyYWN0ZXJzKHJlc3VsdCwgbGVmdF9sZW4sIHJpZ2h0LCAwLCByaWdodF9sZW4pOworICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3kocmVzdWx0LCAxKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZApAQCAtMTExMjksNiArMTEyNTAsMjUgQEAKICAgICBQeV9YREVDUkVGKHJpZ2h0KTsKIH0KIAorLyoKK1dyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBlbnN1cmVzIHRoYXQgdGhlCitmaXJzdCBhcmd1bWVudCBpcyBhIHVuaWNvZGUgb2JqZWN0LgorKi8KKworUHlfTE9DQUxfSU5MSU5FKGludCkKK3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZShjb25zdCBjaGFyICogZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipzdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKK3sKKyAgICBpZihzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcyhmdW5jdGlvbl9uYW1lLCBhcmdzLCBzdWJzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCkpIHsKKyAgICAgICAgaWYgKGVuc3VyZV91bmljb2RlKCpzdWJzdHJpbmcpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIFB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCiAgICAgICAgICAgICAgIlMuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCiBcblwKQEAgLTExMTQ3LDMxICsxMTI4NywyNiBAQAogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMiwgaXJlc3VsdDsKIAotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiY291bnQiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJjb3VudCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzZWxmKTsKICAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1YnN0cmluZyk7Ci0gICAgaWYgKGtpbmQxIDwga2luZDIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKGtpbmQxIDwga2luZDIpCiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMCk7Ci0gICAgfQorCiAgICAgbGVuMSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHNlbGYpOwogICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWJzdHJpbmcpOwogICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbjEpOwotICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikKICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygwKTsKLSAgICB9CisKICAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc2VsZik7CiAgICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1YnN0cmluZyk7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7CiAgICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWJzdHJpbmcsIGtpbmQxKTsKLSAgICAgICAgaWYgKCFidWYyKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICAgICAgaWYgKCFidWYyKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KICAgICB9CiAgICAgc3dpdGNoIChraW5kMSkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6CkBAIC0xMTIwMSw4ICsxMTMzNiw2IEBACiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xMTMzNiwyMiArMTE0NjksMTMgQEAKICAgICBQeV9zc2l6ZV90IGVuZCA9IDA7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImZpbmQiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJmaW5kIiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKDEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIDEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTQyNCwyMiArMTE1NDgsMTMgQEAKICAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKICAgICBQeV9zc2l6ZV90IGVuZCA9IDA7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImluZGV4IiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoMSwgc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kKTsKLQotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgMSk7CiAKICAgICBpZiAocmVzdWx0ID09IC0yKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExOTUzLDcgKzEyMDY4LDcgQEAKICNkZWZpbmUgQk9USFNUUklQIDIKIAogLyogQXJyYXlzIGluZGV4ZWQgYnkgYWJvdmUgKi8KLXN0YXRpYyBjb25zdCBjaGFyICpzdHJpcGZvcm1hdFtdID0geyJ8Tzpsc3RyaXAiLCAifE86cnN0cmlwIiwgInxPOnN0cmlwIn07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0cmlwZm9ybWF0W10gPSB7InxPOmxzdHJpcCIsICJ8Tzpyc3RyaXAiLCAifE86c3RyaXAifTsKIAogI2RlZmluZSBTVFJJUE5BTUUoaSkgKHN0cmlwZm9ybWF0W2ldKzMpCiAKQEAgLTEyMjQ4LDQwICsxMjM2MywxNSBAQAogfQogCiBQeU9iamVjdCAqCi1QeVVuaWNvZGVfUmVwbGFjZShQeU9iamVjdCAqb2JqLAotICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1Ym9iaiwKLSAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXBsb2JqLAorUHlVbmljb2RlX1JlcGxhY2UoUHlPYmplY3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVwbHN0ciwKICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0gICAgUHlPYmplY3QgKnNlbGY7Ci0gICAgUHlPYmplY3QgKnN0cjE7Ci0gICAgUHlPYmplY3QgKnN0cjI7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGYgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChvYmopOwotICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwIHx8CisgICAgICAgICAgICBlbnN1cmVfdW5pY29kZShyZXBsc3RyKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cjEgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJvYmopOwotICAgIGlmIChzdHIxID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3RyMiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHJlcGxvYmopOwotICAgIGlmIChzdHIyID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xIHx8Ci0gICAgICAgIFB5VW5pY29kZV9SRUFEWShzdHIxKSA9PSAtMSB8fAotICAgICAgICBQeVVuaWNvZGVfUkVBRFkoc3RyMikgPT0gLTEpCi0gICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSByZXBsYWNlKHNlbGYsIHN0cjEsIHN0cjIsIG1heGNvdW50KTsKLSAgICBQeV9ERUNSRUYoc2VsZik7Ci0gICAgUHlfREVDUkVGKHN0cjEpOwotICAgIFB5X0RFQ1JFRihzdHIyKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXBsYWNlKHN0ciwgc3Vic3RyLCByZXBsc3RyLCBtYXhjb3VudCk7CiB9CiAKIFB5RG9jX1NUUlZBUihyZXBsYWNlX19kb2NfXywKQEAgLTEyMjk3LDI4ICsxMjM4NywxMiBAQAogICAgIFB5T2JqZWN0ICpzdHIxOwogICAgIFB5T2JqZWN0ICpzdHIyOwogICAgIFB5X3NzaXplX3QgbWF4Y291bnQgPSAtMTsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLCAmc3RyMSwgJnN0cjIsICZtYXhjb3VudCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVVXxuOnJlcGxhY2UiLCAmc3RyMSwgJnN0cjIsICZtYXhjb3VudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0cjEgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIxKTsKLSAgICBpZiAoc3RyMSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyMik7Ci0gICAgaWYgKHN0cjIgPT0gTlVMTCkgewotICAgICAgICBQeV9ERUNSRUYoc3RyMSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cjEpID09IC0xIHx8IFB5VW5pY29kZV9SRUFEWShzdHIyKSA9PSAtMSkKLSAgICAgICAgcmVzdWx0ID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIHJlc3VsdCA9IHJlcGxhY2Uoc2VsZiwgc3RyMSwgc3RyMiwgbWF4Y291bnQpOwotCi0gICAgUHlfREVDUkVGKHN0cjEpOwotICAgIFB5X0RFQ1JFRihzdHIyKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByZXBsYWNlKHNlbGYsIHN0cjEsIHN0cjIsIG1heGNvdW50KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEyNTAzLDIyICsxMjU3NywxMyBAQAogICAgIFB5X3NzaXplX3QgZW5kID0gMDsKICAgICBQeV9zc2l6ZV90IHJlc3VsdDsKIAotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgicmZpbmQiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyZmluZCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgtMSwgc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kKTsKLQotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMjU0MCwyMiArMTI2MDUsMTMgQEAKICAgICBQeV9zc2l6ZV90IGVuZCA9IDA7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoInJpbmRleCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoInJpbmRleCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgtMSwgc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kKTsKLQotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMjU5NSwyNCArMTI2NTEsMTAgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9TcGxpdChQeU9iamVjdCAqcywgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgcyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHMpOwotICAgIGlmIChzID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHMpIDwgMCB8fCAoc2VwICE9IE5VTEwgJiYgZW5zdXJlX3VuaWNvZGUoc2VwKSA8IDApKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2VwICE9IE5VTEwpIHsKLSAgICAgICAgc2VwID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwKTsKLSAgICAgICAgaWYgKHNlcCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KIAotICAgIHJlc3VsdCA9IHNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwotCi0gICAgUHlfREVDUkVGKHMpOwotICAgIFB5X1hERUNSRUYoc2VwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKIH0KIAogUHlEb2NfU1RSVkFSKHNwbGl0X19kb2NfXywKQEAgLTEyNjM3LDM1ICsxMjY3OSwyNiBAQAogCiAgICAgaWYgKHN1YnN0cmluZyA9PSBQeV9Ob25lKQogICAgICAgICByZXR1cm4gc3BsaXQoc2VsZiwgTlVMTCwgbWF4Y291bnQpOwotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQorCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQogICAgICAgICByZXR1cm4gc3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlVbmljb2RlX1NwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOworCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyIG9yIE5vbmUsIG5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCi1QeVVuaWNvZGVfUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfaW4sIFB5T2JqZWN0ICpzZXBfaW4pCitQeVVuaWNvZGVfUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfb2JqLCBQeU9iamVjdCAqc2VwX29iaikKIHsKLSAgICBQeU9iamVjdCogc3RyX29iajsKLSAgICBQeU9iamVjdCogc2VwX29iajsKICAgICBQeU9iamVjdCogb3V0OwogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yOwogCi0gICAgc3RyX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cl9pbik7Ci0gICAgaWYgKCFzdHJfb2JqKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHJfb2JqKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc2VwX29iaikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzZXBfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwX2luKTsKLSAgICBpZiAoIXNlcF9vYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZXBfb2JqKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyX29iaikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyX29iaik7CiAgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzZXBfb2JqKTsKQEAgLTEyNjc5LDggKzEyNzEyLDYgQEAKICAgICAgICAgICAgIG91dCA9IFB5VHVwbGVfUGFjaygzLCBzdHJfb2JqLCB1bmljb2RlX2VtcHR5LCB1bmljb2RlX2VtcHR5KTsKICAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlX2VtcHR5KTsKICAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cl9vYmopOwpAQCAtMTI2ODgsNyArMTI3MTksNyBAQAogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewogICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc2VwX29iaiwga2luZDEpOwogICAgICAgICBpZiAoIWJ1ZjIpCi0gICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CkBAIC0xMjcwOSwzOSArMTI3NDAsMjMgQEAKICAgICAgICAgb3V0ID0gMDsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAogICAgIHJldHVybiBvdXQ7Ci0gIG9uRXJyb3I6Ci0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICBpZiAoa2luZDIgIT0ga2luZDEgJiYgYnVmMikKLSAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKLSAgICByZXR1cm4gTlVMTDsKIH0KIAogCiBQeU9iamVjdCAqCi1QeVVuaWNvZGVfUlBhcnRpdGlvbihQeU9iamVjdCAqc3RyX2luLCBQeU9iamVjdCAqc2VwX2luKQorUHlVbmljb2RlX1JQYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9vYmosIFB5T2JqZWN0ICpzZXBfb2JqKQogewotICAgIFB5T2JqZWN0KiBzdHJfb2JqOwotICAgIFB5T2JqZWN0KiBzZXBfb2JqOwogICAgIFB5T2JqZWN0KiBvdXQ7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjI7CiAKLSAgICBzdHJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyX2luKTsKLSAgICBpZiAoIXN0cl9vYmopCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cl9vYmopIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzZXBfb2JqKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHNlcF9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXBfaW4pOwotICAgIGlmICghc2VwX29iaikgewotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyX29iaik7CiAgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzZXBfb2JqKTsKQEAgLTEyNzU1LDggKzEyNzcwLDYgQEAKICAgICAgICAgICAgIG91dCA9IFB5VHVwbGVfUGFjaygzLCB1bmljb2RlX2VtcHR5LCB1bmljb2RlX2VtcHR5LCBzdHJfb2JqKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRih1bmljb2RlX2VtcHR5KTsKICAgICAgICAgfQotICAgICAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cl9vYmopOwpAQCAtMTI3NjQsNyArMTI3NzcsNyBAQAogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewogICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc2VwX29iaiwga2luZDEpOwogICAgICAgICBpZiAoIWJ1ZjIpCi0gICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CkBAIC0xMjc4NSwxOCArMTI3OTgsMTAgQEAKICAgICAgICAgb3V0ID0gMDsKICAgICB9CiAKLSAgICBQeV9ERUNSRUYoc2VwX29iaik7Ci0gICAgUHlfREVDUkVGKHN0cl9vYmopOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAogICAgIHJldHVybiBvdXQ7Ci0gIG9uRXJyb3I6Ci0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICBpZiAoa2luZDIgIT0ga2luZDEgJiYgYnVmMikKLSAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKLSAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHBhcnRpdGlvbl9fZG9jX18sCkBAIC0xMjgyOCwyNCArMTI4MzMsMTAgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9SU3BsaXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHMgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzKTsKLSAgICBpZiAocyA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzKSA8IDAgfHwgKHNlcCAhPSBOVUxMICYmIGVuc3VyZV91bmljb2RlKHNlcCkgPCAwKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHNlcCAhPSBOVUxMKSB7Ci0gICAgICAgIHNlcCA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcCk7Ci0gICAgICAgIGlmIChzZXAgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICByZXN1bHQgPSByc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7Ci0KLSAgICBQeV9ERUNSRUYocyk7Ci0gICAgUHlfWERFQ1JFRihzZXApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIHJzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKIH0KIAogUHlEb2NfU1RSVkFSKHJzcGxpdF9fZG9jX18sCkBAIC0xMjg3MCwxMCArMTI4NjEsMTQgQEAKIAogICAgIGlmIChzdWJzdHJpbmcgPT0gUHlfTm9uZSkKICAgICAgICAgcmV0dXJuIHJzcGxpdChzZWxmLCBOVUxMLCBtYXhjb3VudCk7Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCisKKyAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpCiAgICAgICAgIHJldHVybiByc3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlVbmljb2RlX1JTcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciBvciBOb25lLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlEb2NfU1RSVkFSKHNwbGl0bGluZXNfX2RvY19fLApAQCAtMTMxNTQsMTEgKzEzMTQ5LDE1IEBACiAgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewogICAgICAgICBQeV9zc2l6ZV90IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3QoUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpKTsKLSAgICAgICAgICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKTsKKyAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1YnN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHVwbGUgZm9yIHN0YXJ0c3dpdGggbXVzdCBvbmx5IGNvbnRhaW4gc3RyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKQEAgLTEzMTY4LDE1ICsxMzE2NywxMyBAQAogICAgICAgICAvKiBub3RoaW5nIG1hdGNoZWQgKi8KICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KLSAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJvYmopOwotICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICUuMTAwcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKQEAgLTEzMjA2LDEyICsxMzIwMywxNSBAQAogICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKICAgICAgICAgUHlfc3NpemVfdCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KAotICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSk7Ci0gICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGZvciBlbmRzd2l0aCBtdXN0IG9ubHkgY29udGFpbiBzdHIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjEwMHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHN1YnN0cmluZyktPnRwX25hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgKzEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKHJlc3VsdCkgewpAQCAtMTMyMjAsMTUgKzEzMjIwLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwogICAgIH0KLSAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWJvYmopOwotICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgorICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJS4xMDBzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKTsKLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7CiAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwpAQCAtMTMyMzcsNDQgKzEzMjM1LDUwIEBACiBQeV9MT0NBTF9JTkxJTkUodm9pZCkKIF9QeVVuaWNvZGVXcml0ZXJfVXBkYXRlKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKIHsKLSAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpCisgICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKKyAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7CisKKyAgICBpZiAoIXdyaXRlci0+cmVhZG9ubHkpIHsKKyAgICAgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogICAgICAgICB3cml0ZXItPnNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcik7CisgICAgfQogICAgIGVsc2UgeworICAgICAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgICAgICBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkgd2lsbCBjb3B5IHRoZSBidWZmZXIuICovCisgICAgICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9XQ0hBUl9LSU5EOworICAgICAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKwogICAgICAgICAvKiBDb3B5LW9uLXdyaXRlIG1vZGU6IHNldCBidWZmZXIgc2l6ZSB0byAwIHNvCiAgICAgICAgICAqIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZSgpIHdpbGwgY29weSAoYW5kIGVubGFyZ2UpIHRoZSBidWZmZXIgb24KICAgICAgICAgICogbmV4dCB3cml0ZS4gKi8KICAgICAgICAgd3JpdGVyLT5zaXplID0gMDsKICAgICB9Ci0gICAgd3JpdGVyLT5tYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHdyaXRlci0+YnVmZmVyKTsKLSAgICB3cml0ZXItPmRhdGEgPSBQeVVuaWNvZGVfREFUQSh3cml0ZXItPmJ1ZmZlcik7Ci0gICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX0tJTkQod3JpdGVyLT5idWZmZXIpOwogfQogCiB2b2lkCiBfUHlVbmljb2RlV3JpdGVyX0luaXQoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyKQogewogICAgIG1lbXNldCh3cml0ZXIsIDAsIHNpemVvZigqd3JpdGVyKSk7Ci0jaWZkZWYgUHlfREVCVUcKLSAgICB3cml0ZXItPmtpbmQgPSA1OyAgICAvKiBpbnZhbGlkIGtpbmQgKi8KLSNlbmRpZgorCisgICAgLyogQVNDSUkgaXMgdGhlIGJhcmUgbWluaW11bSAqLwogICAgIHdyaXRlci0+bWluX2NoYXIgPSAxMjc7CisKKyAgICAvKiB1c2UgYSB2YWx1ZSBzbWFsbGVyIHRoYW4gUHlVbmljb2RlXzFCWVRFX0tJTkQoKSBzbworICAgICAgIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoKSB3aWxsIGNvcHkgdGhlIGJ1ZmZlci4gKi8KKyAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfV0NIQVJfS0lORDsKKyAgICBhc3NlcnQod3JpdGVyLT5raW5kIDw9IFB5VW5pY29kZV8xQllURV9LSU5EKTsKIH0KIAogaW50CiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbmd0aCwgUHlfVUNTNCBtYXhjaGFyKQogewotI2lmZGVmIE1TX1dJTkRPV1MKLSAgIC8qIE9uIFdpbmRvd3MsIG92ZXJhbGxvY2F0ZSBieSA1MCUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiAyCi0jZWxzZQotICAgLyogT24gTGludXgsIG92ZXJhbGxvY2F0ZSBieSAyNSUgaXMgdGhlIGJlc3QgZmFjdG9yICovCi0jICBkZWZpbmUgT1ZFUkFMTE9DQVRFX0ZBQ1RPUiA0Ci0jZW5kaWYKICAgICBQeV9zc2l6ZV90IG5ld2xlbjsKICAgICBQeU9iamVjdCAqbmV3YnVmZmVyOwogCi0gICAgYXNzZXJ0KGxlbmd0aCA+IDApOworICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUgbWFjcm8gd2FzIHVzZWQgKi8KKyAgICBhc3NlcnQoKG1heGNoYXIgPiB3cml0ZXItPm1heGNoYXIgJiYgbGVuZ3RoID49IDApCisgICAgICAgICAgIHx8IGxlbmd0aCA+IDApOwogCiAgICAgaWYgKGxlbmd0aCA+IFBZX1NTSVpFX1RfTUFYIC0gd3JpdGVyLT5wb3MpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTEzMzQwLDYgKzEzMzQ0LDI4IEBACiAjdW5kZWYgT1ZFUkFMTE9DQVRFX0ZBQ1RPUgogfQogCitpbnQKK19QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmRJbnRlcm5hbChfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kKQoreworICAgIFB5X1VDUzQgbWF4Y2hhcjsKKworICAgIC8qIGVuc3VyZSB0aGF0IHRoZSBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kIG1hY3JvIHdhcyB1c2VkICovCisgICAgYXNzZXJ0KHdyaXRlci0+a2luZCA8IGtpbmQpOworCisgICAgc3dpdGNoIChraW5kKQorICAgIHsKKyAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOiBtYXhjaGFyID0gMHhmZjsgYnJlYWs7CisgICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDogbWF4Y2hhciA9IDB4ZmZmZjsgYnJlYWs7CisgICAgY2FzZSBQeVVuaWNvZGVfNEJZVEVfS0lORDogbWF4Y2hhciA9IDB4MTBmZmZmOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCAmJiAiaW52YWxpZCBraW5kIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlSW50ZXJuYWwod3JpdGVyLCAwLCBtYXhjaGFyKTsKK30KKwogUHlfTE9DQUxfSU5MSU5FKGludCkKIF9QeVVuaWNvZGVXcml0ZXJfV3JpdGVDaGFySW5saW5lKF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlciwgUHlfVUNTNCBjaCkKIHsKQEAgLTEzNTEwLDE3ICsxMzUzNiwyNiBAQAogICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSB3cml0ZXItPnBvcyk7CiAgICAgICAgIHJldHVybiBzdHI7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSCh3cml0ZXItPmJ1ZmZlcikgIT0gd3JpdGVyLT5wb3MpIHsKLSAgICAgICAgUHlPYmplY3QgKm5ld2J1ZmZlcjsKLSAgICAgICAgbmV3YnVmZmVyID0gcmVzaXplX2NvbXBhY3Qod3JpdGVyLT5idWZmZXIsIHdyaXRlci0+cG9zKTsKLSAgICAgICAgaWYgKG5ld2J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IG5ld2J1ZmZlcjsKKyAgICBpZiAod3JpdGVyLT5wb3MgPT0gMCkgeworICAgICAgICBQeV9DTEVBUih3cml0ZXItPmJ1ZmZlcik7CisKKyAgICAgICAgLyogR2V0IHRoZSBlbXB0eSBVbmljb2RlIHN0cmluZyBzaW5nbGV0b24gKCcnKSAqLworICAgICAgICBfUHlfSU5DUkVGX1VOSUNPREVfRU1QVFkoKTsKKyAgICAgICAgc3RyICA9IHVuaWNvZGVfZW1wdHk7CiAgICAgfQotICAgIHN0ciA9IHdyaXRlci0+YnVmZmVyOwotICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKyAgICBlbHNlIHsKKyAgICAgICAgc3RyID0gd3JpdGVyLT5idWZmZXI7CisgICAgICAgIHdyaXRlci0+YnVmZmVyID0gTlVMTDsKKworICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAhPSB3cml0ZXItPnBvcykgeworICAgICAgICAgICAgUHlPYmplY3QgKnN0cjI7CisgICAgICAgICAgICBzdHIyID0gcmVzaXplX2NvbXBhY3Qoc3RyLCB3cml0ZXItPnBvcyk7CisgICAgICAgICAgICBpZiAoc3RyMiA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc3RyID0gc3RyMjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3koc3RyLCAxKSk7CiAgICAgcmV0dXJuIHVuaWNvZGVfcmVzdWx0X3JlYWR5KHN0cik7CiB9CkBAIC0xNDY2MSwxMyArMTQ2OTYsMTAgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY3R4LmZtdHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGZvcm1hdCk7Ci0gICAgaWYgKGN0eC5mbXRzdHIgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoZm9ybWF0KSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoY3R4LmZtdHN0cikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKGN0eC5mbXRzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisKKyAgICBjdHguZm10c3RyID0gZm9ybWF0OwogICAgIGN0eC5mbXRkYXRhID0gUHlVbmljb2RlX0RBVEEoY3R4LmZtdHN0cik7CiAgICAgY3R4LmZtdGtpbmQgPSBQeVVuaWNvZGVfS0lORChjdHguZm10c3RyKTsKICAgICBjdHguZm10Y250ID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoY3R4LmZtdHN0cik7CkBAIC0xNDcyNywxMSArMTQ3NTksOSBAQAogICAgIGlmIChjdHguYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoY3R4LmFyZ3MpOwogICAgIH0KLSAgICBQeV9ERUNSRUYoY3R4LmZtdHN0cik7CiAgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfRmluaXNoKCZjdHgud3JpdGVyKTsKIAogICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihjdHguZm10c3RyKTsKICAgICBfUHlVbmljb2RlV3JpdGVyX0RlYWxsb2MoJmN0eC53cml0ZXIpOwogICAgIGlmIChjdHguYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoY3R4LmFyZ3MpOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCA3ZTZmMzY0Li5mNzViMWU4IDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBhcnNlX3dlYWtyZWZfaW5pdF9hcmdzKGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywKK3BhcnNlX3dlYWtyZWZfaW5pdF9hcmdzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncywKICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqb2JwLCBQeU9iamVjdCAqKmNhbGxiYWNrcCkKIHsKICAgICByZXR1cm4gUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgZnVuY25hbWUsIDEsIDIsIG9icCwgY2FsbGJhY2twKTsKZGlmZiAtLWdpdCBhL1BDL19tc2kuYyBiL1BDL19tc2kuYwppbmRleCA4NmE1OTQzLi5iNjZiMThiIDEwMDY0NAotLS0gYS9QQy9fbXNpLmMKKysrIGIvUEMvX21zaS5jCkBAIC0xMDMyLDEyICsxMDMyLDEyIEBACiAgICAgaWYgKG0gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURURJUkVDVCIsIChpbnQpTVNJREJPUEVOX0NSRUFURURJUkVDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEUiLCAoaW50KU1TSURCT1BFTl9DUkVBVEUpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fRElSRUNUIiwgKGludClNU0lEQk9QRU5fRElSRUNUKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1JFQURPTkxZIiwgKGludClNU0lEQk9QRU5fUkVBRE9OTFkpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fVFJBTlNBQ1QiLCAoaW50KU1TSURCT1BFTl9UUkFOU0FDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9QQVRDSEZJTEUiLCAoaW50KU1TSURCT1BFTl9QQVRDSEZJTEUpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFRElSRUNUIiwgKGxvbmcpTVNJREJPUEVOX0NSRUFURURJUkVDVCk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEUiLCAobG9uZylNU0lEQk9QRU5fQ1JFQVRFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0RJUkVDVCIsIChsb25nKU1TSURCT1BFTl9ESVJFQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUkVBRE9OTFkiLCAobG9uZylNU0lEQk9QRU5fUkVBRE9OTFkpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fVFJBTlNBQ1QiLCAobG9uZylNU0lEQk9QRU5fVFJBTlNBQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUEFUQ0hGSUxFIiwgKGxvbmcpTVNJREJPUEVOX1BBVENIRklMRSk7CiAKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBNU0lDT0xJTkZPX05BTUVTKTsKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBNU0lDT0xJTkZPX1RZUEVTKTsKZGlmZiAtLWdpdCBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKaW5kZXggY2IwMzdmZi4uZTAxZGJhNiAxMDA2NDQKLS0tIGEvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKKysrIGIvUEMvYmRpc3Rfd2luaW5zdC9pbnN0YWxsLmMKQEAgLTcxOCw3ICs3MTgsNyBAQAogICogMSBpZiB0aGUgUHl0aG9uLWRsbCBkb2VzIG5vdCBleHBvcnQgdGhlIGZ1bmN0aW9ucyB3ZSBuZWVkCiAgKiAyIGlmIG5vIGluc3RhbGwtc2NyaXB0IGlzIHNwZWNpZmllZCBpbiBwYXRobmFtZQogICogMyBpZiB0aGUgaW5zdGFsbC1zY3JpcHQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkCi0gKiB0aGUgcmV0dXJuIHZhbHVlIG9mIFB5UnVuX1NpbXBsZVN0cmluZygpIG90aGVyd2lzZSwKKyAqIHRoZSByZXR1cm4gdmFsdWUgb2YgUHlSdW5fU2ltcGxlU3RyaW5nKCkgb3IgUHlfRmluYWxpemVFeCgpIG90aGVyd2lzZSwKICAqIHdoaWNoIGlzIDAgaWYgZXZlcnl0aGluZyBpcyBvaywgLTEgaWYgYW4gZXhjZXB0aW9uIGhhZCBvY2N1cnJlZAogICogaW4gdGhlIGluc3RhbGwtc2NyaXB0LgogICovCkBAIC03MzEsNyArNzMxLDcgQEAKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9Jbml0aWFsaXplLCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlTeXNfU2V0QXJndiwgKGludCwgd2NoYXJfdCAqKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlSdW5fU2ltcGxlU3RyaW5nLCAoY2hhciAqKSk7Ci0gICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfRmluYWxpemUsICh2b2lkKSk7CisgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeV9GaW5hbGl6ZUV4LCAodm9pZCkpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5X0J1aWxkVmFsdWUsIChjaGFyICosIC4uLikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5Q0Z1bmN0aW9uX05ldywKICAgICAgICAgICAgICAoUHlNZXRob2REZWYgKiwgUHlPYmplY3QgKikpOwpAQCAtNzM5LDcgKzczOSw3IEBACiAgICAgREVDTFBST0MoaFB5dGhvbiwgUHlPYmplY3QgKiwgUHlFcnJfRm9ybWF0LCAoUHlPYmplY3QgKiwgY2hhciAqKSk7CiAKICAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5U3lzX1NldEFyZ3YKLSAgICAgICAgfHwgIVB5UnVuX1NpbXBsZVN0cmluZyB8fCAhUHlfRmluYWxpemUpCisgICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplRXgpCiAgICAgICAgIHJldHVybiAxOwogCiAgICAgaWYgKCFQeV9CdWlsZFZhbHVlIHx8ICFQeUFyZ19QYXJzZVR1cGxlIHx8ICFQeUVycl9Gb3JtYXQpCkBAIC03ODYsNyArNzg2LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJlc3VsdCA9IC0xOworICAgIH0KIAogICAgIGNsb3NlKGZoKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtODQ4LDExICs4NTAsMTEgQEAKICAgICBpbnQgcmM7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9TZXRQcm9ncmFtTmFtZSwgKHdjaGFyX3QgKikpOwotICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlfRmluYWxpemVFeCwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5RXJyX1ByaW50LCAodm9pZCkpOwogCi0gICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemUgfHwKKyAgICBpZiAoIVB5X0luaXRpYWxpemUgfHwgIVB5X1NldFByb2dyYW1OYW1lIHx8ICFQeV9GaW5hbGl6ZUV4IHx8CiAgICAgICAgICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5RXJyX1ByaW50KQogICAgICAgICByZXR1cm4gLTE7CiAKQEAgLTg2Miw3ICs4NjQsOSBAQAogICAgIHJjID0gUHlSdW5fU2ltcGxlU3RyaW5nKHNjcmlwdCk7CiAgICAgaWYgKHJjKQogICAgICAgICBQeUVycl9QcmludCgpOwotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CiAgICAgcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaCBiL1BDL2NsaW5pYy9tc3ZjcnRtb2R1bGUuYy5oCmluZGV4IGM4ZTZlZDguLjI0ZTE4Y2QgMTAwNjQ0Ci0tLSBhL1BDL2NsaW5pYy9tc3ZjcnRtb2R1bGUuYy5oCisrKyBiL1BDL2NsaW5pYy9tc3ZjcnRtb2R1bGUuYy5oCkBAIC01MSw4ICs1MSw5IEBACiAgICAgbG9uZyBuYnl0ZXM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpbDpsb2NraW5nIiwKLSAgICAgICAgJmZkLCAmbW9kZSwgJm5ieXRlcykpCisgICAgICAgICZmZCwgJm1vZGUsICZuYnl0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X2xvY2tpbmdfaW1wbChtb2R1bGUsIGZkLCBtb2RlLCBuYnl0ZXMpOwogCiBleGl0OgpAQCAtODUsMTEgKzg2LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpzZXRtb2RlIiwKLSAgICAgICAgJmZkLCAmZmxhZ3MpKQorICAgICAgICAmZmQsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3NldG1vZGVfaW1wbChtb2R1bGUsIGZkLCBmbGFncyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEyMiwxMSArMTI1LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiX1B5X1BBUlNFX0lOVFBUUiJpOm9wZW5fb3NmaGFuZGxlIiwKLSAgICAgICAgJmhhbmRsZSwgJmZsYWdzKSkKKyAgICAgICAgJmhhbmRsZSwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfb3Blbl9vc2ZoYW5kbGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgZmxhZ3MpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xNTQsMTEgKzE1OSwxMyBAQAogICAgIGludCBmZDsKICAgICBQeV9pbnRwdHJfdCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9vc2ZoYW5kbGUiLCAmZmQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfb3NmaGFuZGxlIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfZ2V0X29zZmhhbmRsZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE4NCw4ICsxOTEsOSBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfa2JoaXRfaW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMTIsOCArMzIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjaGFyIGNoYXJfdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6cHV0Y2giLCAmY2hhcl92YWx1ZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJjOnB1dGNoIiwgJmNoYXJfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3B1dGNoX2ltcGwobW9kdWxlLCBjaGFyX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTMzOCw4ICszNDcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB1bmljb2RlX2NoYXI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6cHV0d2NoIiwgJnVuaWNvZGVfY2hhcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOnB1dHdjaCIsICZ1bmljb2RlX2NoYXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3B1dHdjaF9pbXBsKG1vZHVsZSwgdW5pY29kZV9jaGFyKTsKIAogZXhpdDoKQEAgLTM2OCw4ICszNzgsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNoYXIgY2hhcl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzp1bmdldGNoIiwgJmNoYXJfdmFsdWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzp1bmdldGNoIiwgJmNoYXJfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3VuZ2V0Y2hfaW1wbChtb2R1bGUsIGNoYXJfdmFsdWUpOwogCiBleGl0OgpAQCAtMzk0LDggKzQwNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHVuaWNvZGVfY2hhcjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzp1bmdldHdjaCIsICZ1bmljb2RlX2NoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzp1bmdldHdjaCIsICZ1bmljb2RlX2NoYXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X3VuZ2V0d2NoX2ltcGwobW9kdWxlLCB1bmljb2RlX2NoYXIpOwogCiBleGl0OgpAQCAtNDI3LDExICs0MzksMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkNydFNldFJlcG9ydEZpbGUiLAotICAgICAgICAmdHlwZSwgJmZpbGUpKQorICAgICAgICAmdHlwZSwgJmZpbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9DcnRTZXRSZXBvcnRGaWxlX2ltcGwobW9kdWxlLCB0eXBlLCBmaWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDY1LDExICs0NzksMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOkNydFNldFJlcG9ydE1vZGUiLAotICAgICAgICAmdHlwZSwgJm1vZGUpKQorICAgICAgICAmdHlwZSwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9DcnRTZXRSZXBvcnRNb2RlX2ltcGwobW9kdWxlLCB0eXBlLCBtb2RlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTAxLDExICs1MTcsMTMgQEAKICAgICBpbnQgbW9kZTsKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6c2V0X2Vycm9yX21vZGUiLCAmbW9kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnNldF9lcnJvcl9tb2RlIiwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9zZXRfZXJyb3JfbW9kZV9pbXBsKG1vZHVsZSwgbW9kZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUzMiw4ICs1NTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVuc2lnbmVkIGludCBtb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOlNldEVycm9yTW9kZSIsICZtb2RlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkk6U2V0RXJyb3JNb2RlIiwgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X1NldEVycm9yTW9kZV9pbXBsKG1vZHVsZSwgbW9kZSk7CiAKIGV4aXQ6CkBAIC01NTEsNCArNTcwLDQgQEAKICNpZm5kZWYgTVNWQ1JUX1NFVF9FUlJPUl9NT0RFX01FVEhPRERFRgogICAgICNkZWZpbmUgTVNWQ1JUX1NFVF9FUlJPUl9NT0RFX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTY2MTNkMzExOWExZmQ0NCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjM2ZGUzNDYwYWVjYmNhNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9QQy9jbGluaWMvd2lucmVnLmMuaCBiL1BDL2NsaW5pYy93aW5yZWcuYy5oCmluZGV4IDMzOGUzM2QuLmYzYTRjZDEgMTAwNjQ0Ci0tLSBhL1BDL2NsaW5pYy93aW5yZWcuYy5oCisrKyBiL1BDL2NsaW5pYy93aW5yZWcuYy5oCkBAIC05Myw4ICs5Myw5IEBACiAgICAgUHlPYmplY3QgKnRyYWNlYmFjazsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PTzpfX2V4aXRfXyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmV4Y190eXBlLCAmZXhjX3ZhbHVlLCAmdHJhY2ViYWNrKSkKKyAgICAgICAgJmV4Y190eXBlLCAmZXhjX3ZhbHVlLCAmdHJhY2ViYWNrKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19IS0VZVHlwZV9fX2V4aXRfX19pbXBsKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk7CiAKIGV4aXQ6CkBAIC0xNDcsMTEgKzE0OCwxMyBAQAogICAgIEhLRVkgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiWk8mOkNvbm5lY3RSZWdpc3RyeSIsCi0gICAgICAgICZjb21wdXRlcl9uYW1lLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgICAgICAmY29tcHV0ZXJfbmFtZSwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfQ29ubmVjdFJlZ2lzdHJ5X2ltcGwobW9kdWxlLCBjb21wdXRlcl9uYW1lLCBrZXkpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE5MiwxMSArMTk1LDEzIEBACiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6Q3JlYXRlS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19DcmVhdGVLZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjQ3LDExICsyNTIsMTMgQEAKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJlp8aWk6Q3JlYXRlS2V5RXgiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX0NyZWF0ZUtleUV4X2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXksIHJlc2VydmVkLCBhY2Nlc3MpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTI5MCw4ICsyOTcsOSBAQAogICAgIFB5X1VOSUNPREUgKnN1Yl9rZXk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mdTpEZWxldGVLZXkiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGVsZXRlS2V5X2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXkpOwogCiBleGl0OgpAQCAtMzQxLDggKzM0OSw5IEBACiAgICAgaW50IHJlc2VydmVkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mdXxpaTpEZWxldGVLZXlFeCIsIF9rZXl3b3JkcywKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmFjY2VzcywgJnJlc2VydmVkKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmFjY2VzcywgJnJlc2VydmVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EZWxldGVLZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCBhY2Nlc3MsIHJlc2VydmVkKTsKIAogZXhpdDoKQEAgLTM3NCw4ICszODMsOSBAQAogICAgIFB5X1VOSUNPREUgKnZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6RGVsZXRlVmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EZWxldGVWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MTEsOCArNDIxLDkgQEAKICAgICBpbnQgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpFbnVtS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRW51bUtleV9pbXBsKG1vZHVsZSwga2V5LCBpbmRleCk7CiAKIGV4aXQ6CkBAIC00NTcsOCArNDY4LDkgQEAKICAgICBpbnQgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8maTpFbnVtVmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmluZGV4KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FbnVtVmFsdWVfaW1wbChtb2R1bGUsIGtleSwgaW5kZXgpOwogCiBleGl0OgpAQCAtNDgzLDggKzQ5NSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfVU5JQ09ERSAqc3RyaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ1OkV4cGFuZEVudmlyb25tZW50U3RyaW5ncyIsICZzdHJpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidTpFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FeHBhbmRFbnZpcm9ubWVudFN0cmluZ3NfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC01MjIsOCArNTM1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Rmx1c2hLZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6Rmx1c2hLZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0ZsdXNoS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtNTc0LDggKzU4OCw5IEBACiAgICAgUHlfVU5JQ09ERSAqZmlsZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnV1OkxvYWRLZXkiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmZmlsZV9uYW1lKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmZpbGVfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfTG9hZEtleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCBmaWxlX25hbWUpOwogCiBleGl0OgpAQCAtNjIwLDExICs2MzUsMTMgQEAKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJlp8aWk6T3BlbktleSIsIF9rZXl3b3JkcywKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnJlc2VydmVkLCAmYWNjZXNzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfT3BlbktleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC02NjksMTEgKzY4NiwxMyBAQAogICAgIEhLRVkgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mWnxpaTpPcGVuS2V5RXgiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX09wZW5LZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC03MDcsOCArNzI2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlJbmZvS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlF1ZXJ5SW5mb0tleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlJbmZvS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtNzQ5LDggKzc2OSw5IEBACiAgICAgUHlfVU5JQ09ERSAqc3ViX2tleTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOlF1ZXJ5VmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5KTsKIAogZXhpdDoKQEAgLTc4Nyw4ICs4MDgsOSBAQAogICAgIFB5X1VOSUNPREUgKm5hbWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWjpRdWVyeVZhbHVlRXgiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZuYW1lKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlWYWx1ZUV4X2ltcGwobW9kdWxlLCBrZXksIG5hbWUpOwogCiBleGl0OgpAQCAtODMwLDggKzg1Miw5IEBACiAgICAgUHlfVU5JQ09ERSAqZmlsZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnU6U2F2ZUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmZpbGVfbmFtZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmZpbGVfbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfU2F2ZUtleV9pbXBsKG1vZHVsZSwga2V5LCBmaWxlX25hbWUpOwogCiBleGl0OgpAQCAtODgzLDggKzkwNiw5IEBACiAgICAgUHlfc3NpemVfY2xlYW5fdCB2YWx1ZV9sZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWmt1IzpTZXRWYWx1ZSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZ0eXBlLCAmdmFsdWUsICZ2YWx1ZV9sZW5ndGgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmdHlwZSwgJnZhbHVlLCAmdmFsdWVfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19TZXRWYWx1ZV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCB0eXBlLCB2YWx1ZSwgdmFsdWVfbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTkwNyw3ICs5MzEsNyBAQAogIiAgICBBbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhLCBvbmUgb2Y6XG4iCiAiICAgIFJFR19CSU5BUlkgLS0gQmluYXJ5IGRhdGEgaW4gYW55IGZvcm0uXG4iCiAiICAgIFJFR19EV09SRCAtLSBBIDMyLWJpdCBudW1iZXIuXG4iCi0iICAgIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC5cbiIKKyIgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIFJFR19EV09SRFxuIgogIiAgICBSRUdfRFdPUkRfQklHX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuXG4iCiAiICAgIFJFR19FWFBBTkRfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgY29udGFpbnMgdW5leHBhbmRlZFxuIgogIiAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIChmb3IgZXhhbXBsZSxcbiIKQEAgLTkxNyw2ICs5NDEsOCBAQAogIiAgICAgICAgICAgICAgICAgICAgYnkgdHdvIG51bGwgY2hhcmFjdGVycy4gIE5vdGUgdGhhdCBQeXRob24gaGFuZGxlc1xuIgogIiAgICAgICAgICAgICAgICAgICAgdGhpcyB0ZXJtaW5hdGlvbiBhdXRvbWF0aWNhbGx5LlxuIgogIiAgICBSRUdfTk9ORSAtLSBObyBkZWZpbmVkIHZhbHVlIHR5cGUuXG4iCisiICAgIFJFR19RV09SRCAtLSBBIDY0LWJpdCBudW1iZXIuXG4iCisiICAgIFJFR19RV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgNjQtYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byBSRUdfUVdPUkQuXG4iCiAiICAgIFJFR19SRVNPVVJDRV9MSVNUIC0tIEEgZGV2aWNlLWRyaXZlciByZXNvdXJjZSBsaXN0LlxuIgogIiAgICBSRUdfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLlxuIgogIiAgdmFsdWVcbiIKQEAgLTk1MCw4ICs5NzYsOSBAQAogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaT2tPOlNldFZhbHVlRXgiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZV9uYW1lLCAmcmVzZXJ2ZWQsICZ0eXBlLCAmdmFsdWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZV9uYW1lLCAmcmVzZXJ2ZWQsICZ0eXBlLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1NldFZhbHVlRXhfaW1wbChtb2R1bGUsIGtleSwgdmFsdWVfbmFtZSwgcmVzZXJ2ZWQsIHR5cGUsIHZhbHVlKTsKIAogZXhpdDoKQEAgLTk4NSw4ICsxMDEyLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RGlzYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0Rpc2FibGVSZWZsZWN0aW9uS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtMTAxOCw4ICsxMDQ2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RW5hYmxlUmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpFbmFibGVSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19FbmFibGVSZWZsZWN0aW9uS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgpAQCAtMTA0OSwxMSArMTA3OCwxMiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhLRVkga2V5OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpRdWVyeVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19RdWVyeVJlZmxlY3Rpb25LZXlfaW1wbChtb2R1bGUsIGtleSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZTM0NmRjY2MyOTZmOWYxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jYTEyOGJmYTIxMmQ4ZDFmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1BDL2NsaW5pYy93aW5zb3VuZC5jLmggYi9QQy9jbGluaWMvd2luc291bmQuYy5oCmluZGV4IGRjYTVhNDIuLmU2NDkzNjMgMTAwNjQ0Ci0tLSBhL1BDL2NsaW5pYy93aW5zb3VuZC5jLmgKKysrIGIvUEMvY2xpbmljL3dpbnNvdW5kLmMuaApAQCAtMjcsOCArMjcsOSBAQAogICAgIGludCBmbGFnczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiWmk6UGxheVNvdW5kIiwKLSAgICAgICAgJnNvdW5kLCAmZmxhZ3MpKQorICAgICAgICAmc291bmQsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9QbGF5U291bmRfaW1wbChtb2R1bGUsIHNvdW5kLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC02MSw4ICs2Miw5IEBACiAgICAgaW50IGR1cmF0aW9uOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpCZWVwIiwKLSAgICAgICAgJmZyZXF1ZW5jeSwgJmR1cmF0aW9uKSkKKyAgICAgICAgJmZyZXF1ZW5jeSwgJmR1cmF0aW9uKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnNvdW5kX0JlZXBfaW1wbChtb2R1bGUsIGZyZXF1ZW5jeSwgZHVyYXRpb24pOwogCiBleGl0OgpAQCAtOTAsMTEgKzkyLDEyIEBACiAgICAgaW50IHggPSBNQl9PSzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6TWVzc2FnZUJlZXAiLAotICAgICAgICAmeCkpCisgICAgICAgICZ4KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnNvdW5kX01lc3NhZ2VCZWVwX2ltcGwobW9kdWxlLCB4KTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM1YjAxOGFjOWRjMWY1MDAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE1ZjUzZTQyZDQzOTZiYjQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUEMvZ2V0cGF0aHAuYyBiL1BDL2dldHBhdGhwLmMKaW5kZXggYzdkZGYxZS4uY2I5ZjFkYiAxMDA2NDQKLS0tIGEvUEMvZ2V0cGF0aHAuYworKysgYi9QQy9nZXRwYXRocC5jCkBAIC0xMzUsNyArMTM1LDcgQEAKIHN0YXRpYyBpbnQKIGlzbW9kdWxlKHdjaGFyX3QgKmZpbGVuYW1lLCBpbnQgdXBkYXRlX2ZpbGVuYW1lKSAvKiBJcyBtb2R1bGUgLS0gY2hlY2sgZm9yIC5weWMvLnB5byB0b28gKi8KIHsKLSAgICBpbnQgbjsKKyAgICBzaXplX3QgbjsKIAogICAgIGlmIChleGlzdHMoZmlsZW5hbWUpKQogICAgICAgICByZXR1cm4gMTsKQEAgLTU1Myw3ICs1NTMsNyBAQAogICAgICAgICAgICAgICAgIGVudnBhdGggPSBOVUxMOwogICAgICAgICAgICAgICAgIHB5dGhvbmhvbWUgPSBhcmd2MF9wYXRoOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisKICAgICAgICAgICAgIC8qIExvb2sgZm9yIGEgJ2hvbWUnIHZhcmlhYmxlIGFuZCBzZXQgYXJndjBfcGF0aCB0byBpdCwgaWYgZm91bmQgKi8KICAgICAgICAgICAgIGlmIChmaW5kX2Vudl9jb25maWdfdmFsdWUoZW52X2ZpbGUsIEwiaG9tZSIsIHRtcGJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICB3Y3NjcHlfcyhhcmd2MF9wYXRoLCBNQVhQQVRITEVOKzEsIHRtcGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9QQy9sYXVuY2hlci5jIGIvUEMvbGF1bmNoZXIuYwppbmRleCA0MGQ0Y2I1Li5mYTY5NDM4IDEwMDY0NAotLS0gYS9QQy9sYXVuY2hlci5jCisrKyBiL1BDL2xhdW5jaGVyLmMKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBNZXNzYWdlQm94KE5VTEwsIG1lc3NhZ2UsIFRFWFQoIlB5dGhvbiBMYXVuY2hlciBpcyBzb3JyeSB0byBzYXkgLi4uIiksCiAgICAgICAgICAgICAgICBNQl9PSyk7CiAjZW5kaWYKLSAgICBFeGl0UHJvY2VzcyhyYyk7CisgICAgZXhpdChyYyk7CiB9CiAKIC8qCkBAIC00NjUsNyArNDY1LDcgQEAKIH0KIAogc3RhdGljIElOU1RBTExFRF9QWVRIT04gKgotbG9jYXRlX3B5dGhvbih3Y2hhcl90ICogd2FudGVkX3ZlcikKK2xvY2F0ZV9weXRob24od2NoYXJfdCAqIHdhbnRlZF92ZXIsIEJPT0wgZnJvbV9zaGViYW5nKQogewogICAgIHN0YXRpYyB3Y2hhcl90IGNvbmZpZ19rZXkgW10gPSB7IEwicHl0aG9uWCIgfTsKICAgICBzdGF0aWMgd2NoYXJfdCAqIGxhc3RfY2hhciA9ICZjb25maWdfa2V5W3NpemVvZihjb25maWdfa2V5KSAvCkBAIC00OTcsMTAgKzQ5NywxNyBAQAogICAgICAgICBjb25maWd1cmVkX3ZhbHVlID0gZ2V0X2NvbmZpZ3VyZWRfdmFsdWUoY29uZmlnX2tleSk7CiAgICAgICAgIGlmIChjb25maWd1cmVkX3ZhbHVlKQogICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihjb25maWd1cmVkX3ZhbHVlKTsKKyAgICAgICAgLyogTm90IGZvdW5kIGEgdmFsdWUgeWV0IC0gdHJ5IGJ5IG1ham9yIHZlcnNpb24uCisgICAgICAgICAqIElmIHdlJ3JlIGxvb2tpbmcgZm9yIGFuIGludGVycHJldGVyIHNwZWNpZmllZCBpbiBhIHNoZWJhbmcgbGluZSwKKyAgICAgICAgICogd2Ugd2FudCB0byB0cnkgUHl0aG9uIDIgZmlyc3QsIHRoZW4gUHl0aG9uIDMgKGZvciBVbml4IGFuZCBiYWNrd2FyZAorICAgICAgICAgKiBjb21wYXRpYmlsaXR5KS4gSWYgd2UncmUgYmVpbmcgY2FsbGVkIGludGVyYWN0aXZlbHksIGFzc3VtZSB0aGUgdXNlcgorICAgICAgICAgKiB3YW50cyB0aGUgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlLCBzbyB0cnkgUHl0aG9uIDMgZmlyc3QsIHRoZW4KKyAgICAgICAgICogUHl0aG9uIDIuCisgICAgICAgICAqLwogICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKEwiMiIpOworICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihmcm9tX3NoZWJhbmcgPyBMIjIiIDogTCIzIik7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oTCIzIik7CisgICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKGZyb21fc2hlYmFuZyA/IEwiMyIgOiBMIjIiKTsKICAgICAgICAgZGVidWcoTCJzZWFyY2ggZm9yIGRlZmF1bHQgUHl0aG9uIGZvdW5kICIpOwogICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICBkZWJ1ZyhMInZlcnNpb24gJWxzIGF0ICclbHMnXG4iLApAQCAtNjU1LDcgKzY2Miw3IEBACiAgICAgaWYgKCFvaykKICAgICAgICAgZXJyb3IoUkNfQ1JFQVRFX1BST0NFU1MsIEwiRmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcyIpOwogICAgIGRlYnVnKEwiY2hpbGQgcHJvY2VzcyBleGl0IGNvZGU6ICVkXG4iLCByYyk7Ci0gICAgRXhpdFByb2Nlc3MocmMpOworICAgIGV4aXQocmMpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTA4Miw3ICsxMDg5LDcgQEAKICAgICB7IDMxOTAsIDMyMzAsIEwiMy4zIiB9LAogICAgIHsgMzI1MCwgMzMxMCwgTCIzLjQiIH0sCiAgICAgeyAzMzIwLCAzMzUxLCBMIjMuNSIgfSwKLSAgICB7IDMzNjAsIDMzNjEsIEwiMy42IiB9LAorICAgIHsgMzM2MCwgMzM3MSwgTCIzLjYiIH0sCiAgICAgeyAwIH0KIH07CiAKQEAgLTEwOTQsNyArMTEwMSw3IEBACiAKICAgICBmb3IgKG1wID0gbWFnaWNfdmFsdWVzOyBtcC0+bWluOyBtcCsrKSB7CiAgICAgICAgIGlmICgobWFnaWMgPj0gbXAtPm1pbikgJiYgKG1hZ2ljIDw9IG1wLT5tYXgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBsb2NhdGVfcHl0aG9uKG1wLT52ZXJzaW9uKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGxvY2F0ZV9weXRob24obXAtPnZlcnNpb24sIEZBTFNFKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTExNCw3ICsxMTIxLDcgQEAKICAqLwogICAgIEZJTEUgKiBmcDsKICAgICBlcnJub190IHJjID0gX3dmb3Blbl9zKCZmcCwgKmFyZ3YsIEwicmIiKTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltCVUZTSVpFXTsKKyAgICBjaGFyIGJ1ZmZlcltCVUZTSVpFXTsKICAgICB3Y2hhcl90IHNoZWJhbmdfbGluZVtCVUZTSVpFICsgMV07CiAgICAgc2l6ZV90IHJlYWQ7CiAgICAgY2hhciAqcDsKQEAgLTExMzYsNyArMTE0Myw4IEBACiAgICAgICAgIGZjbG9zZShmcCk7CiAKICAgICAgICAgaWYgKChyZWFkID49IDQpICYmIChidWZmZXJbM10gPT0gJ1xuJykgJiYgKGJ1ZmZlclsyXSA9PSAnXHInKSkgewotICAgICAgICAgICAgaXAgPSBmaW5kX2J5X21hZ2ljKChidWZmZXJbMV0gPDwgOCB8IGJ1ZmZlclswXSkgJiAweEZGRkYpOworICAgICAgICAgICAgaXAgPSBmaW5kX2J5X21hZ2ljKCgoKHVuc2lnbmVkIGNoYXIpYnVmZmVyWzFdKSA8PCA4IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpYnVmZmVyWzBdKSAmIDB4RkZGRik7CiAgICAgICAgICAgICBpZiAoaXAgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRlYnVnKEwic2NyaXB0IGZpbGUgaXMgY29tcGlsZWQgYWdhaW5zdCBQeXRob24gJWxzXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGlwLT52ZXJzaW9uKTsKQEAgLTEyNzgsNyArMTI4Niw3IEBACiBmb2xsb3dlZCBieSBhIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyLlxuUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIGNvdWxkIGNhbGwgdmFsaWRhdGVfdmVyc2lvbihjb21tYW5kKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKGNvbW1hbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKGNvbW1hbmQsIFRSVUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcihSQ19OT19QWVRIT04sIEwiUmVxdWVzdGVkIFB5dGhvbiB2ZXJzaW9uIFwKICglbHMpIGlzIG5vdCBpbnN0YWxsZWQiLCBjb21tYW5kKTsKQEAgLTEzNjIsNiArMTM3MCw3IEBACiAgICAgd2NoYXJfdCAqIGF2WzJdOwogI2VuZGlmCiAKKyAgICBzZXR2YnVmKHN0ZGVyciwgKGNoYXIgKilOVUxMLCBfSU9OQkYsIDApOwogICAgIHdwID0gZ2V0X2VudihMIlBZTEFVTkNIX0RFQlVHIik7CiAgICAgaWYgKCh3cCAhPSBOVUxMKSAmJiAoKndwICE9IEwnXDAnKSkKICAgICAgICAgbG9nX2ZwID0gc3RkZXJyOwpAQCAtMTQ4Myw3ICsxNDkyLDcgQEAKICAgICAgICAgcGxlbiA9IHdjc2xlbihwKTsKICAgICAgICAgdmFsaWQgPSAoKnAgPT0gTCctJykgJiYgdmFsaWRhdGVfdmVyc2lvbigmcFsxXSk7CiAgICAgICAgIGlmICh2YWxpZCkgewotICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKCZwWzFdKTsKKyAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbigmcFsxXSwgRkFMU0UpOwogICAgICAgICAgICAgaWYgKGlwID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIlJlcXVlc3RlZCBQeXRob24gdmVyc2lvbiAoJWxzKSBub3QgXAogaW5zdGFsbGVkIiwgJnBbMV0pOwpAQCAtMTUxMCw3ICsxNTE5LDcgQEAKIAogICAgICAgICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBvbmUsIGxvb2sgZm9yIHRoZSBkZWZhdWx0IFB5dGhvbiAqLwogICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oTCIiKTsKKyAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihMIiIsIEZBTFNFKTsKICAgICAgICAgICAgIGlmIChpcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGVycm9yKFJDX05PX1BZVEhPTiwgTCJDYW4ndCBmaW5kIGEgZGVmYXVsdCBQeXRob24uIik7CiAgICAgICAgICAgICBleGVjdXRhYmxlID0gaXAtPmV4ZWN1dGFibGU7CmRpZmYgLS1naXQgYS9QQy9tc3ZjcnRtb2R1bGUuYyBiL1BDL21zdmNydG1vZHVsZS5jCmluZGV4IDUyZDQxMDAuLmQ3M2NlNzkgMTAwNjQ0Ci0tLSBhL1BDL21zdmNydG1vZHVsZS5jCisrKyBiL1BDL21zdmNydG1vZHVsZS5jCkBAIC01NDEsNyArNTQxLDYgQEAKICNlbmRpZgogCiAgICAgLyogY29uc3RhbnRzIGZvciB0aGUgY3J0IHZlcnNpb25zICovCi0gICAgKHZvaWQpc3Q7CiAjaWZkZWYgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOCiAgICAgc3QgPSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiVkNfQVNTRU1CTFlfUFVCTElDS0VZVE9LRU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1ZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOKTsKQEAgLTU2Nyw2ICs1NjYsOCBAQAogICAgIHN0ID0gUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJDUlRfQVNTRU1CTFlfVkVSU0lPTiIsIHZlcnNpb24pOwogICAgIGlmIChzdCA8IDApIHJldHVybiBOVUxMOwogI2VuZGlmCisgICAgLyogbWFrZSBjb21waWxlciB3YXJuaW5nIHF1aWV0IGlmIHN0IGlzIHVudXNlZCAqLworICAgICh2b2lkKXN0OwogCiAgICAgcmV0dXJuIG07CiB9CmRpZmYgLS1naXQgYS9QQy9weWNvbmZpZy5oIGIvUEMvcHljb25maWcuaAppbmRleCBhYzRmOGYyLi4xNDYzZWU2IDEwMDY0NAotLS0gYS9QQy9weWNvbmZpZy5oCisrKyBiL1BDL3B5Y29uZmlnLmgKQEAgLTMxMiwxMSArMzEyLDExIEBACiAJCQl0aGVpciBNYWtlZmlsZSAob3RoZXIgY29tcGlsZXJzIGFyZSBnZW5lcmFsbHkKIAkJCXRha2VuIGNhcmUgb2YgYnkgZGlzdHV0aWxzLikgKi8KICMJCQlpZiBkZWZpbmVkKF9ERUJVRykKLSMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNV9kLmxpYiIpCisjCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzZfZC5saWIiKQogIwkJCWVsaWYgZGVmaW5lZChQeV9MSU1JVEVEX0FQSSkKICMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zLmxpYiIpCiAjCQkJZWxzZQotIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM1LmxpYiIpCisjCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzYubGliIikKICMJCQllbmRpZiAvKiBfREVCVUcgKi8KICMJCWVuZGlmIC8qIF9NU0NfVkVSICovCiAjCWVuZGlmIC8qIFB5X0JVSUxEX0NPUkUgKi8KZGlmZiAtLWdpdCBhL1BDL3B5dGhvbjMuZGVmIGIvUEMvcHl0aG9uMy5kZWYKaW5kZXggODhjMDc0Mi4uZThkMmQ4YyAxMDA2NDQKLS0tIGEvUEMvcHl0aG9uMy5kZWYKKysrIGIvUEMvcHl0aG9uMy5kZWYKQEAgLTIsNzEyICsyLDcxMyBAQAogOyBJdCBpcyB1c2VkIHdoZW4gYnVpbGRpbmcgcHl0aG9uM2RsbC52Y3hwcm9qCiBMSUJSQVJZCSJweXRob24zIgogRVhQT1JUUwotICBQeUFyZ19QYXJzZT1weXRob24zNS5QeUFyZ19QYXJzZQotICBQeUFyZ19QYXJzZVR1cGxlPXB5dGhvbjM1LlB5QXJnX1BhcnNlVHVwbGUKLSAgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM1LlB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcwotICBQeUFyZ19VbnBhY2tUdXBsZT1weXRob24zNS5QeUFyZ19VbnBhY2tUdXBsZQotICBQeUFyZ19WYVBhcnNlPXB5dGhvbjM1LlB5QXJnX1ZhUGFyc2UKLSAgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzUuUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMKLSAgUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzPXB5dGhvbjM1LlB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cwotICBQeUJhc2VPYmplY3RfVHlwZT1weXRob24zNS5QeUJhc2VPYmplY3RfVHlwZSBEQVRBCi0gIFB5Qm9vbF9Gcm9tTG9uZz1weXRob24zNS5QeUJvb2xfRnJvbUxvbmcKLSAgUHlCb29sX1R5cGU9cHl0aG9uMzUuUHlCb29sX1R5cGUgREFUQQotICBQeUJ5dGVBcnJheUl0ZXJfVHlwZT1weXRob24zNS5QeUJ5dGVBcnJheUl0ZXJfVHlwZSBEQVRBCi0gIFB5Qnl0ZUFycmF5X0FzU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0FzU3RyaW5nCi0gIFB5Qnl0ZUFycmF5X0NvbmNhdD1weXRob24zNS5QeUJ5dGVBcnJheV9Db25jYXQKLSAgUHlCeXRlQXJyYXlfRnJvbU9iamVjdD1weXRob24zNS5QeUJ5dGVBcnJheV9Gcm9tT2JqZWN0Ci0gIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZUFycmF5X1Jlc2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9SZXNpemUKLSAgUHlCeXRlQXJyYXlfU2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9TaXplCi0gIFB5Qnl0ZUFycmF5X1R5cGU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfVHlwZSBEQVRBCi0gIFB5Qnl0ZXNJdGVyX1R5cGU9cHl0aG9uMzUuUHlCeXRlc0l0ZXJfVHlwZSBEQVRBCi0gIFB5Qnl0ZXNfQXNTdHJpbmc9cHl0aG9uMzUuUHlCeXRlc19Bc1N0cmluZwotICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVzX0NvbmNhdD1weXRob24zNS5QeUJ5dGVzX0NvbmNhdAotICBQeUJ5dGVzX0NvbmNhdEFuZERlbD1weXRob24zNS5QeUJ5dGVzX0NvbmNhdEFuZERlbAotICBQeUJ5dGVzX0RlY29kZUVzY2FwZT1weXRob24zNS5QeUJ5dGVzX0RlY29kZUVzY2FwZQotICBQeUJ5dGVzX0Zyb21Gb3JtYXQ9cHl0aG9uMzUuUHlCeXRlc19Gcm9tRm9ybWF0Ci0gIFB5Qnl0ZXNfRnJvbUZvcm1hdFY9cHl0aG9uMzUuUHlCeXRlc19Gcm9tRm9ybWF0VgotICBQeUJ5dGVzX0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlCeXRlc19Gcm9tT2JqZWN0Ci0gIFB5Qnl0ZXNfRnJvbVN0cmluZz1weXRob24zNS5QeUJ5dGVzX0Zyb21TdHJpbmcKLSAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5Qnl0ZXNfUmVwcj1weXRob24zNS5QeUJ5dGVzX1JlcHIKLSAgUHlCeXRlc19TaXplPXB5dGhvbjM1LlB5Qnl0ZXNfU2l6ZQotICBQeUJ5dGVzX1R5cGU9cHl0aG9uMzUuUHlCeXRlc19UeXBlIERBVEEKLSAgUHlDRnVuY3Rpb25fQ2FsbD1weXRob24zNS5QeUNGdW5jdGlvbl9DYWxsCi0gIFB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzUuUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdAotICBQeUNGdW5jdGlvbl9HZXRGbGFncz1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRGbGFncwotICBQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbj1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRGdW5jdGlvbgotICBQeUNGdW5jdGlvbl9HZXRTZWxmPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0dldFNlbGYKLSAgUHlDRnVuY3Rpb25fTmV3PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX05ldwotICBQeUNGdW5jdGlvbl9OZXdFeD1weXRob24zNS5QeUNGdW5jdGlvbl9OZXdFeAotICBQeUNGdW5jdGlvbl9UeXBlPXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX1R5cGUgREFUQQotICBQeUNhbGxJdGVyX05ldz1weXRob24zNS5QeUNhbGxJdGVyX05ldwotICBQeUNhbGxJdGVyX1R5cGU9cHl0aG9uMzUuUHlDYWxsSXRlcl9UeXBlIERBVEEKLSAgUHlDYWxsYWJsZV9DaGVjaz1weXRob24zNS5QeUNhbGxhYmxlX0NoZWNrCi0gIFB5Q2Fwc3VsZV9HZXRDb250ZXh0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXRDb250ZXh0Ci0gIFB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yCi0gIFB5Q2Fwc3VsZV9HZXROYW1lPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXROYW1lCi0gIFB5Q2Fwc3VsZV9HZXRQb2ludGVyPXB5dGhvbjM1LlB5Q2Fwc3VsZV9HZXRQb2ludGVyCi0gIFB5Q2Fwc3VsZV9JbXBvcnQ9cHl0aG9uMzUuUHlDYXBzdWxlX0ltcG9ydAotICBQeUNhcHN1bGVfSXNWYWxpZD1weXRob24zNS5QeUNhcHN1bGVfSXNWYWxpZAotICBQeUNhcHN1bGVfTmV3PXB5dGhvbjM1LlB5Q2Fwc3VsZV9OZXcKLSAgUHlDYXBzdWxlX1NldENvbnRleHQ9cHl0aG9uMzUuUHlDYXBzdWxlX1NldENvbnRleHQKLSAgUHlDYXBzdWxlX1NldERlc3RydWN0b3I9cHl0aG9uMzUuUHlDYXBzdWxlX1NldERlc3RydWN0b3IKLSAgUHlDYXBzdWxlX1NldE5hbWU9cHl0aG9uMzUuUHlDYXBzdWxlX1NldE5hbWUKLSAgUHlDYXBzdWxlX1NldFBvaW50ZXI9cHl0aG9uMzUuUHlDYXBzdWxlX1NldFBvaW50ZXIKLSAgUHlDYXBzdWxlX1R5cGU9cHl0aG9uMzUuUHlDYXBzdWxlX1R5cGUgREFUQQotICBQeUNsYXNzTWV0aG9kRGVzY3JfVHlwZT1weXRob24zNS5QeUNsYXNzTWV0aG9kRGVzY3JfVHlwZSBEQVRBCi0gIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnMKLSAgUHlDb2RlY19EZWNvZGU9cHl0aG9uMzUuUHlDb2RlY19EZWNvZGUKLSAgUHlDb2RlY19EZWNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfRGVjb2RlcgotICBQeUNvZGVjX0VuY29kZT1weXRob24zNS5QeUNvZGVjX0VuY29kZQotICBQeUNvZGVjX0VuY29kZXI9cHl0aG9uMzUuUHlDb2RlY19FbmNvZGVyCi0gIFB5Q29kZWNfSWdub3JlRXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfSWdub3JlRXJyb3JzCi0gIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyCi0gIFB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyCi0gIFB5Q29kZWNfS25vd25FbmNvZGluZz1weXRob24zNS5QeUNvZGVjX0tub3duRW5jb2RpbmcKLSAgUHlDb2RlY19Mb29rdXBFcnJvcj1weXRob24zNS5QeUNvZGVjX0xvb2t1cEVycm9yCi0gIFB5Q29kZWNfUmVnaXN0ZXI9cHl0aG9uMzUuUHlDb2RlY19SZWdpc3RlcgotICBQeUNvZGVjX1JlZ2lzdGVyRXJyb3I9cHl0aG9uMzUuUHlDb2RlY19SZWdpc3RlckVycm9yCi0gIFB5Q29kZWNfUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX1JlcGxhY2VFcnJvcnMKLSAgUHlDb2RlY19TdHJlYW1SZWFkZXI9cHl0aG9uMzUuUHlDb2RlY19TdHJlYW1SZWFkZXIKLSAgUHlDb2RlY19TdHJlYW1Xcml0ZXI9cHl0aG9uMzUuUHlDb2RlY19TdHJlYW1Xcml0ZXIKLSAgUHlDb2RlY19TdHJpY3RFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19TdHJpY3RFcnJvcnMKLSAgUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycz1weXRob24zNS5QeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzCi0gIFB5Q29tcGxleF9Gcm9tRG91Ymxlcz1weXRob24zNS5QeUNvbXBsZXhfRnJvbURvdWJsZXMKLSAgUHlDb21wbGV4X0ltYWdBc0RvdWJsZT1weXRob24zNS5QeUNvbXBsZXhfSW1hZ0FzRG91YmxlCi0gIFB5Q29tcGxleF9SZWFsQXNEb3VibGU9cHl0aG9uMzUuUHlDb21wbGV4X1JlYWxBc0RvdWJsZQotICBQeUNvbXBsZXhfVHlwZT1weXRob24zNS5QeUNvbXBsZXhfVHlwZSBEQVRBCi0gIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2Q9cHl0aG9uMzUuUHlEZXNjcl9OZXdDbGFzc01ldGhvZAotICBQeURlc2NyX05ld0dldFNldD1weXRob24zNS5QeURlc2NyX05ld0dldFNldAotICBQeURlc2NyX05ld01lbWJlcj1weXRob24zNS5QeURlc2NyX05ld01lbWJlcgotICBQeURlc2NyX05ld01ldGhvZD1weXRob24zNS5QeURlc2NyX05ld01ldGhvZAotICBQeURpY3RJdGVtc19UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZW1zX1R5cGUgREFUQQotICBQeURpY3RJdGVySXRlbV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJJdGVtX1R5cGUgREFUQQotICBQeURpY3RJdGVyS2V5X1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlcktleV9UeXBlIERBVEEKLSAgUHlEaWN0SXRlclZhbHVlX1R5cGU9cHl0aG9uMzUuUHlEaWN0SXRlclZhbHVlX1R5cGUgREFUQQotICBQeURpY3RLZXlzX1R5cGU9cHl0aG9uMzUuUHlEaWN0S2V5c19UeXBlIERBVEEKLSAgUHlEaWN0UHJveHlfTmV3PXB5dGhvbjM1LlB5RGljdFByb3h5X05ldwotICBQeURpY3RQcm94eV9UeXBlPXB5dGhvbjM1LlB5RGljdFByb3h5X1R5cGUgREFUQQotICBQeURpY3RWYWx1ZXNfVHlwZT1weXRob24zNS5QeURpY3RWYWx1ZXNfVHlwZSBEQVRBCi0gIFB5RGljdF9DbGVhcj1weXRob24zNS5QeURpY3RfQ2xlYXIKLSAgUHlEaWN0X0NvbnRhaW5zPXB5dGhvbjM1LlB5RGljdF9Db250YWlucwotICBQeURpY3RfQ29weT1weXRob24zNS5QeURpY3RfQ29weQotICBQeURpY3RfRGVsSXRlbT1weXRob24zNS5QeURpY3RfRGVsSXRlbQotICBQeURpY3RfRGVsSXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfRGVsSXRlbVN0cmluZwotICBQeURpY3RfR2V0SXRlbT1weXRob24zNS5QeURpY3RfR2V0SXRlbQotICBQeURpY3RfR2V0SXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfR2V0SXRlbVN0cmluZwotICBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcj1weXRob24zNS5QeURpY3RfR2V0SXRlbVdpdGhFcnJvcgotICBQeURpY3RfSXRlbXM9cHl0aG9uMzUuUHlEaWN0X0l0ZW1zCi0gIFB5RGljdF9LZXlzPXB5dGhvbjM1LlB5RGljdF9LZXlzCi0gIFB5RGljdF9NZXJnZT1weXRob24zNS5QeURpY3RfTWVyZ2UKLSAgUHlEaWN0X01lcmdlRnJvbVNlcTI9cHl0aG9uMzUuUHlEaWN0X01lcmdlRnJvbVNlcTIKLSAgUHlEaWN0X05ldz1weXRob24zNS5QeURpY3RfTmV3Ci0gIFB5RGljdF9OZXh0PXB5dGhvbjM1LlB5RGljdF9OZXh0Ci0gIFB5RGljdF9TZXRJdGVtPXB5dGhvbjM1LlB5RGljdF9TZXRJdGVtCi0gIFB5RGljdF9TZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5RGljdF9TZXRJdGVtU3RyaW5nCi0gIFB5RGljdF9TaXplPXB5dGhvbjM1LlB5RGljdF9TaXplCi0gIFB5RGljdF9UeXBlPXB5dGhvbjM1LlB5RGljdF9UeXBlIERBVEEKLSAgUHlEaWN0X1VwZGF0ZT1weXRob24zNS5QeURpY3RfVXBkYXRlCi0gIFB5RGljdF9WYWx1ZXM9cHl0aG9uMzUuUHlEaWN0X1ZhbHVlcwotICBQeUVsbGlwc2lzX1R5cGU9cHl0aG9uMzUuUHlFbGxpcHNpc19UeXBlIERBVEEKLSAgUHlFbnVtX1R5cGU9cHl0aG9uMzUuUHlFbnVtX1R5cGUgREFUQQotICBQeUVycl9CYWRBcmd1bWVudD1weXRob24zNS5QeUVycl9CYWRBcmd1bWVudAotICBQeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzUuUHlFcnJfQmFkSW50ZXJuYWxDYWxsCi0gIFB5RXJyX0NoZWNrU2lnbmFscz1weXRob24zNS5QeUVycl9DaGVja1NpZ25hbHMKLSAgUHlFcnJfQ2xlYXI9cHl0aG9uMzUuUHlFcnJfQ2xlYXIKLSAgUHlFcnJfRGlzcGxheT1weXRob24zNS5QeUVycl9EaXNwbGF5Ci0gIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzUuUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcwotICBQeUVycl9GZXRjaD1weXRob24zNS5QeUVycl9GZXRjaAotICBQeUVycl9Gb3JtYXQ9cHl0aG9uMzUuUHlFcnJfRm9ybWF0Ci0gIFB5RXJyX0Zvcm1hdFY9cHl0aG9uMzUuUHlFcnJfRm9ybWF0VgotICBQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXM9cHl0aG9uMzUuUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzCi0gIFB5RXJyX05ld0V4Y2VwdGlvbj1weXRob24zNS5QeUVycl9OZXdFeGNlcHRpb24KLSAgUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYz1weXRob24zNS5QeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jCi0gIFB5RXJyX05vTWVtb3J5PXB5dGhvbjM1LlB5RXJyX05vTWVtb3J5Ci0gIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbj1weXRob24zNS5QeUVycl9Ob3JtYWxpemVFeGNlcHRpb24KLSAgUHlFcnJfT2NjdXJyZWQ9cHl0aG9uMzUuUHlFcnJfT2NjdXJyZWQKLSAgUHlFcnJfUHJpbnQ9cHl0aG9uMzUuUHlFcnJfUHJpbnQKLSAgUHlFcnJfUHJpbnRFeD1weXRob24zNS5QeUVycl9QcmludEV4Ci0gIFB5RXJyX1Byb2dyYW1UZXh0PXB5dGhvbjM1LlB5RXJyX1Byb2dyYW1UZXh0Ci0gIFB5RXJyX1Jlc3RvcmU9cHl0aG9uMzUuUHlFcnJfUmVzdG9yZQotICBQeUVycl9TZXRGcm9tRXJybm89cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vCi0gIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZT1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUKLSAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdAotICBQeUVycl9TZXRJbnRlcnJ1cHQ9cHl0aG9uMzUuUHlFcnJfU2V0SW50ZXJydXB0Ci0gIFB5RXJyX1NldE5vbmU9cHl0aG9uMzUuUHlFcnJfU2V0Tm9uZQotICBQeUVycl9TZXRPYmplY3Q9cHl0aG9uMzUuUHlFcnJfU2V0T2JqZWN0Ci0gIFB5RXJyX1NldFN0cmluZz1weXRob24zNS5QeUVycl9TZXRTdHJpbmcKLSAgUHlFcnJfU3ludGF4TG9jYXRpb249cHl0aG9uMzUuUHlFcnJfU3ludGF4TG9jYXRpb24KLSAgUHlFcnJfV2FybkV4PXB5dGhvbjM1LlB5RXJyX1dhcm5FeAotICBQeUVycl9XYXJuRXhwbGljaXQ9cHl0aG9uMzUuUHlFcnJfV2FybkV4cGxpY2l0Ci0gIFB5RXJyX1dhcm5Gb3JtYXQ9cHl0aG9uMzUuUHlFcnJfV2FybkZvcm1hdAotICBQeUVycl9Xcml0ZVVucmFpc2FibGU9cHl0aG9uMzUuUHlFcnJfV3JpdGVVbnJhaXNhYmxlCi0gIFB5RXZhbF9BY3F1aXJlTG9jaz1weXRob24zNS5QeUV2YWxfQWNxdWlyZUxvY2sKLSAgUHlFdmFsX0FjcXVpcmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX0FjcXVpcmVUaHJlYWQKLSAgUHlFdmFsX0NhbGxGdW5jdGlvbj1weXRob24zNS5QeUV2YWxfQ2FsbEZ1bmN0aW9uCi0gIFB5RXZhbF9DYWxsTWV0aG9kPXB5dGhvbjM1LlB5RXZhbF9DYWxsTWV0aG9kCi0gIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzPXB5dGhvbjM1LlB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzCi0gIFB5RXZhbF9FdmFsQ29kZT1weXRob24zNS5QeUV2YWxfRXZhbENvZGUKLSAgUHlFdmFsX0V2YWxDb2RlRXg9cHl0aG9uMzUuUHlFdmFsX0V2YWxDb2RlRXgKLSAgUHlFdmFsX0V2YWxGcmFtZT1weXRob24zNS5QeUV2YWxfRXZhbEZyYW1lCi0gIFB5RXZhbF9FdmFsRnJhbWVFeD1weXRob24zNS5QeUV2YWxfRXZhbEZyYW1lRXgKLSAgUHlFdmFsX0dldEJ1aWx0aW5zPXB5dGhvbjM1LlB5RXZhbF9HZXRCdWlsdGlucwotICBQeUV2YWxfR2V0Q2FsbFN0YXRzPXB5dGhvbjM1LlB5RXZhbF9HZXRDYWxsU3RhdHMKLSAgUHlFdmFsX0dldEZyYW1lPXB5dGhvbjM1LlB5RXZhbF9HZXRGcmFtZQotICBQeUV2YWxfR2V0RnVuY0Rlc2M9cHl0aG9uMzUuUHlFdmFsX0dldEZ1bmNEZXNjCi0gIFB5RXZhbF9HZXRGdW5jTmFtZT1weXRob24zNS5QeUV2YWxfR2V0RnVuY05hbWUKLSAgUHlFdmFsX0dldEdsb2JhbHM9cHl0aG9uMzUuUHlFdmFsX0dldEdsb2JhbHMKLSAgUHlFdmFsX0dldExvY2Fscz1weXRob24zNS5QeUV2YWxfR2V0TG9jYWxzCi0gIFB5RXZhbF9Jbml0VGhyZWFkcz1weXRob24zNS5QeUV2YWxfSW5pdFRocmVhZHMKLSAgUHlFdmFsX1JlSW5pdFRocmVhZHM9cHl0aG9uMzUuUHlFdmFsX1JlSW5pdFRocmVhZHMKLSAgUHlFdmFsX1JlbGVhc2VMb2NrPXB5dGhvbjM1LlB5RXZhbF9SZWxlYXNlTG9jawotICBQeUV2YWxfUmVsZWFzZVRocmVhZD1weXRob24zNS5QeUV2YWxfUmVsZWFzZVRocmVhZAotICBQeUV2YWxfUmVzdG9yZVRocmVhZD1weXRob24zNS5QeUV2YWxfUmVzdG9yZVRocmVhZAotICBQeUV2YWxfU2F2ZVRocmVhZD1weXRob24zNS5QeUV2YWxfU2F2ZVRocmVhZAotICBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkPXB5dGhvbjM1LlB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQKLSAgUHlFeGNfQXJpdGhtZXRpY0Vycm9yPXB5dGhvbjM1LlB5RXhjX0FyaXRobWV0aWNFcnJvciBEQVRBCi0gIFB5RXhjX0Fzc2VydGlvbkVycm9yPXB5dGhvbjM1LlB5RXhjX0Fzc2VydGlvbkVycm9yIERBVEEKLSAgUHlFeGNfQXR0cmlidXRlRXJyb3I9cHl0aG9uMzUuUHlFeGNfQXR0cmlidXRlRXJyb3IgREFUQQotICBQeUV4Y19CYXNlRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXhjX0Jhc2VFeGNlcHRpb24gREFUQQotICBQeUV4Y19CdWZmZXJFcnJvcj1weXRob24zNS5QeUV4Y19CdWZmZXJFcnJvciBEQVRBCi0gIFB5RXhjX0J5dGVzV2FybmluZz1weXRob24zNS5QeUV4Y19CeXRlc1dhcm5pbmcgREFUQQotICBQeUV4Y19EZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKLSAgUHlFeGNfRU9GRXJyb3I9cHl0aG9uMzUuUHlFeGNfRU9GRXJyb3IgREFUQQotICBQeUV4Y19FbnZpcm9ubWVudEVycm9yPXB5dGhvbjM1LlB5RXhjX0Vudmlyb25tZW50RXJyb3IgREFUQQotICBQeUV4Y19FeGNlcHRpb249cHl0aG9uMzUuUHlFeGNfRXhjZXB0aW9uIERBVEEKLSAgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yPXB5dGhvbjM1LlB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvciBEQVRBCi0gIFB5RXhjX0Z1dHVyZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfRnV0dXJlV2FybmluZyBEQVRBCi0gIFB5RXhjX0dlbmVyYXRvckV4aXQ9cHl0aG9uMzUuUHlFeGNfR2VuZXJhdG9yRXhpdCBEQVRBCi0gIFB5RXhjX0lPRXJyb3I9cHl0aG9uMzUuUHlFeGNfSU9FcnJvciBEQVRBCi0gIFB5RXhjX0ltcG9ydEVycm9yPXB5dGhvbjM1LlB5RXhjX0ltcG9ydEVycm9yIERBVEEKLSAgUHlFeGNfSW1wb3J0V2FybmluZz1weXRob24zNS5QeUV4Y19JbXBvcnRXYXJuaW5nIERBVEEKLSAgUHlFeGNfSW5kZW50YXRpb25FcnJvcj1weXRob24zNS5QeUV4Y19JbmRlbnRhdGlvbkVycm9yIERBVEEKLSAgUHlFeGNfSW5kZXhFcnJvcj1weXRob24zNS5QeUV4Y19JbmRleEVycm9yIERBVEEKLSAgUHlFeGNfS2V5RXJyb3I9cHl0aG9uMzUuUHlFeGNfS2V5RXJyb3IgREFUQQotICBQeUV4Y19LZXlib2FyZEludGVycnVwdD1weXRob24zNS5QeUV4Y19LZXlib2FyZEludGVycnVwdCBEQVRBCi0gIFB5RXhjX0xvb2t1cEVycm9yPXB5dGhvbjM1LlB5RXhjX0xvb2t1cEVycm9yIERBVEEKLSAgUHlFeGNfTWVtb3J5RXJyb3I9cHl0aG9uMzUuUHlFeGNfTWVtb3J5RXJyb3IgREFUQQotICBQeUV4Y19NZW1vcnlFcnJvckluc3Q9cHl0aG9uMzUuUHlFeGNfTWVtb3J5RXJyb3JJbnN0IERBVEEKLSAgUHlFeGNfTmFtZUVycm9yPXB5dGhvbjM1LlB5RXhjX05hbWVFcnJvciBEQVRBCi0gIFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I9cHl0aG9uMzUuUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciBEQVRBCi0gIFB5RXhjX09TRXJyb3I9cHl0aG9uMzUuUHlFeGNfT1NFcnJvciBEQVRBCi0gIFB5RXhjX092ZXJmbG93RXJyb3I9cHl0aG9uMzUuUHlFeGNfT3ZlcmZsb3dFcnJvciBEQVRBCi0gIFB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmc9cHl0aG9uMzUuUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCi0gIFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdD1weXRob24zNS5QeUV4Y19SZWN1cnNpb25FcnJvckluc3QgREFUQQotICBQeUV4Y19SZWZlcmVuY2VFcnJvcj1weXRob24zNS5QeUV4Y19SZWZlcmVuY2VFcnJvciBEQVRBCi0gIFB5RXhjX1J1bnRpbWVFcnJvcj1weXRob24zNS5QeUV4Y19SdW50aW1lRXJyb3IgREFUQQotICBQeUV4Y19SdW50aW1lV2FybmluZz1weXRob24zNS5QeUV4Y19SdW50aW1lV2FybmluZyBEQVRBCi0gIFB5RXhjX1N0b3BJdGVyYXRpb249cHl0aG9uMzUuUHlFeGNfU3RvcEl0ZXJhdGlvbiBEQVRBCi0gIFB5RXhjX1N5bnRheEVycm9yPXB5dGhvbjM1LlB5RXhjX1N5bnRheEVycm9yIERBVEEKLSAgUHlFeGNfU3ludGF4V2FybmluZz1weXRob24zNS5QeUV4Y19TeW50YXhXYXJuaW5nIERBVEEKLSAgUHlFeGNfU3lzdGVtRXJyb3I9cHl0aG9uMzUuUHlFeGNfU3lzdGVtRXJyb3IgREFUQQotICBQeUV4Y19TeXN0ZW1FeGl0PXB5dGhvbjM1LlB5RXhjX1N5c3RlbUV4aXQgREFUQQotICBQeUV4Y19UYWJFcnJvcj1weXRob24zNS5QeUV4Y19UYWJFcnJvciBEQVRBCi0gIFB5RXhjX1R5cGVFcnJvcj1weXRob24zNS5QeUV4Y19UeXBlRXJyb3IgREFUQQotICBQeUV4Y19VbmJvdW5kTG9jYWxFcnJvcj1weXRob24zNS5QeUV4Y19VbmJvdW5kTG9jYWxFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlV2FybmluZz1weXRob24zNS5QeUV4Y19Vbmljb2RlV2FybmluZyBEQVRBCi0gIFB5RXhjX1VzZXJXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1VzZXJXYXJuaW5nIERBVEEKLSAgUHlFeGNfVmFsdWVFcnJvcj1weXRob24zNS5QeUV4Y19WYWx1ZUVycm9yIERBVEEKLSAgUHlFeGNfV2FybmluZz1weXRob24zNS5QeUV4Y19XYXJuaW5nIERBVEEKLSAgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IgREFUQQotICBQeUV4Y2VwdGlvbl9HZXRDYXVzZT1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRDYXVzZQotICBQeUV4Y2VwdGlvbl9HZXRDb250ZXh0PXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldENvbnRleHQKLSAgUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrPXB5dGhvbjM1LlB5RXhjZXB0aW9uX0dldFRyYWNlYmFjawotICBQeUV4Y2VwdGlvbl9TZXRDYXVzZT1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRDYXVzZQotICBQeUV4Y2VwdGlvbl9TZXRDb250ZXh0PXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldENvbnRleHQKLSAgUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrPXB5dGhvbjM1LlB5RXhjZXB0aW9uX1NldFRyYWNlYmFjawotICBQeUZpbGVfRnJvbUZkPXB5dGhvbjM1LlB5RmlsZV9Gcm9tRmQKLSAgUHlGaWxlX0dldExpbmU9cHl0aG9uMzUuUHlGaWxlX0dldExpbmUKLSAgUHlGaWxlX1dyaXRlT2JqZWN0PXB5dGhvbjM1LlB5RmlsZV9Xcml0ZU9iamVjdAotICBQeUZpbGVfV3JpdGVTdHJpbmc9cHl0aG9uMzUuUHlGaWxlX1dyaXRlU3RyaW5nCi0gIFB5RmlsdGVyX1R5cGU9cHl0aG9uMzUuUHlGaWx0ZXJfVHlwZSBEQVRBCi0gIFB5RmxvYXRfQXNEb3VibGU9cHl0aG9uMzUuUHlGbG9hdF9Bc0RvdWJsZQotICBQeUZsb2F0X0Zyb21Eb3VibGU9cHl0aG9uMzUuUHlGbG9hdF9Gcm9tRG91YmxlCi0gIFB5RmxvYXRfRnJvbVN0cmluZz1weXRob24zNS5QeUZsb2F0X0Zyb21TdHJpbmcKLSAgUHlGbG9hdF9HZXRJbmZvPXB5dGhvbjM1LlB5RmxvYXRfR2V0SW5mbwotICBQeUZsb2F0X0dldE1heD1weXRob24zNS5QeUZsb2F0X0dldE1heAotICBQeUZsb2F0X0dldE1pbj1weXRob24zNS5QeUZsb2F0X0dldE1pbgotICBQeUZsb2F0X1R5cGU9cHl0aG9uMzUuUHlGbG9hdF9UeXBlIERBVEEKLSAgUHlGcm96ZW5TZXRfTmV3PXB5dGhvbjM1LlB5RnJvemVuU2V0X05ldwotICBQeUZyb3plblNldF9UeXBlPXB5dGhvbjM1LlB5RnJvemVuU2V0X1R5cGUgREFUQQotICBQeUdDX0NvbGxlY3Q9cHl0aG9uMzUuUHlHQ19Db2xsZWN0Ci0gIFB5R0lMU3RhdGVfRW5zdXJlPXB5dGhvbjM1LlB5R0lMU3RhdGVfRW5zdXJlCi0gIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlPXB5dGhvbjM1LlB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlCi0gIFB5R0lMU3RhdGVfUmVsZWFzZT1weXRob24zNS5QeUdJTFN0YXRlX1JlbGVhc2UKLSAgUHlHZXRTZXREZXNjcl9UeXBlPXB5dGhvbjM1LlB5R2V0U2V0RGVzY3JfVHlwZSBEQVRBCi0gIFB5SW1wb3J0X0FkZE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9BZGRNb2R1bGUKLSAgUHlJbXBvcnRfQXBwZW5kSW5pdHRhYj1weXRob24zNS5QeUltcG9ydF9BcHBlbmRJbml0dGFiCi0gIFB5SW1wb3J0X0NsZWFudXA9cHl0aG9uMzUuUHlJbXBvcnRfQ2xlYW51cAotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZT1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZQotICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4PXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzPXB5dGhvbjM1LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcwotICBQeUltcG9ydF9HZXRJbXBvcnRlcj1weXRob24zNS5QeUltcG9ydF9HZXRJbXBvcnRlcgotICBQeUltcG9ydF9HZXRNYWdpY051bWJlcj1weXRob24zNS5QeUltcG9ydF9HZXRNYWdpY051bWJlcgotICBQeUltcG9ydF9HZXRNYWdpY1RhZz1weXRob24zNS5QeUltcG9ydF9HZXRNYWdpY1RhZwotICBQeUltcG9ydF9HZXRNb2R1bGVEaWN0PXB5dGhvbjM1LlB5SW1wb3J0X0dldE1vZHVsZURpY3QKLSAgUHlJbXBvcnRfSW1wb3J0PXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydAotICBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGUKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWw9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwKLSAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaz1weXRob24zNS5QeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrCi0gIFB5SW1wb3J0X1JlbG9hZE1vZHVsZT1weXRob24zNS5QeUltcG9ydF9SZWxvYWRNb2R1bGUKLSAgUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyPXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcgotICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlPXB5dGhvbjM1LlB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUKLSAgUHlJbnRlcnByZXRlclN0YXRlX05ldz1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfTmV3Ci0gIFB5SXRlcl9OZXh0PXB5dGhvbjM1LlB5SXRlcl9OZXh0Ci0gIFB5TGlzdEl0ZXJfVHlwZT1weXRob24zNS5QeUxpc3RJdGVyX1R5cGUgREFUQQotICBQeUxpc3RSZXZJdGVyX1R5cGU9cHl0aG9uMzUuUHlMaXN0UmV2SXRlcl9UeXBlIERBVEEKLSAgUHlMaXN0X0FwcGVuZD1weXRob24zNS5QeUxpc3RfQXBwZW5kCi0gIFB5TGlzdF9Bc1R1cGxlPXB5dGhvbjM1LlB5TGlzdF9Bc1R1cGxlCi0gIFB5TGlzdF9HZXRJdGVtPXB5dGhvbjM1LlB5TGlzdF9HZXRJdGVtCi0gIFB5TGlzdF9HZXRTbGljZT1weXRob24zNS5QeUxpc3RfR2V0U2xpY2UKLSAgUHlMaXN0X0luc2VydD1weXRob24zNS5QeUxpc3RfSW5zZXJ0Ci0gIFB5TGlzdF9OZXc9cHl0aG9uMzUuUHlMaXN0X05ldwotICBQeUxpc3RfUmV2ZXJzZT1weXRob24zNS5QeUxpc3RfUmV2ZXJzZQotICBQeUxpc3RfU2V0SXRlbT1weXRob24zNS5QeUxpc3RfU2V0SXRlbQotICBQeUxpc3RfU2V0U2xpY2U9cHl0aG9uMzUuUHlMaXN0X1NldFNsaWNlCi0gIFB5TGlzdF9TaXplPXB5dGhvbjM1LlB5TGlzdF9TaXplCi0gIFB5TGlzdF9Tb3J0PXB5dGhvbjM1LlB5TGlzdF9Tb3J0Ci0gIFB5TGlzdF9UeXBlPXB5dGhvbjM1LlB5TGlzdF9UeXBlIERBVEEKLSAgUHlMb25nUmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzUuUHlMb25nUmFuZ2VJdGVyX1R5cGUgREFUQQotICBQeUxvbmdfQXNEb3VibGU9cHl0aG9uMzUuUHlMb25nX0FzRG91YmxlCi0gIFB5TG9uZ19Bc0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzTG9uZwotICBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93Ci0gIFB5TG9uZ19Bc0xvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdMb25nCi0gIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3c9cHl0aG9uMzUuUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdwotICBQeUxvbmdfQXNTaXplX3Q9cHl0aG9uMzUuUHlMb25nX0FzU2l6ZV90Ci0gIFB5TG9uZ19Bc1NzaXplX3Q9cHl0aG9uMzUuUHlMb25nX0FzU3NpemVfdAotICBQeUxvbmdfQXNVbnNpZ25lZExvbmc9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nCi0gIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZwotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzaz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFzawotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2sKLSAgUHlMb25nX0FzVm9pZFB0cj1weXRob24zNS5QeUxvbmdfQXNWb2lkUHRyCi0gIFB5TG9uZ19Gcm9tRG91YmxlPXB5dGhvbjM1LlB5TG9uZ19Gcm9tRG91YmxlCi0gIFB5TG9uZ19Gcm9tTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbUxvbmcKLSAgUHlMb25nX0Zyb21Mb25nTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbUxvbmdMb25nCi0gIFB5TG9uZ19Gcm9tU2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Gcm9tU2l6ZV90Ci0gIFB5TG9uZ19Gcm9tU3NpemVfdD1weXRob24zNS5QeUxvbmdfRnJvbVNzaXplX3QKLSAgUHlMb25nX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21TdHJpbmcKLSAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21VbnNpZ25lZExvbmcKLSAgUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZwotICBQeUxvbmdfRnJvbVZvaWRQdHI9cHl0aG9uMzUuUHlMb25nX0Zyb21Wb2lkUHRyCi0gIFB5TG9uZ19HZXRJbmZvPXB5dGhvbjM1LlB5TG9uZ19HZXRJbmZvCi0gIFB5TG9uZ19UeXBlPXB5dGhvbjM1LlB5TG9uZ19UeXBlIERBVEEKLSAgUHlNYXBfVHlwZT1weXRob24zNS5QeU1hcF9UeXBlIERBVEEKLSAgUHlNYXBwaW5nX0NoZWNrPXB5dGhvbjM1LlB5TWFwcGluZ19DaGVjawotICBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfR2V0SXRlbVN0cmluZwotICBQeU1hcHBpbmdfSGFzS2V5PXB5dGhvbjM1LlB5TWFwcGluZ19IYXNLZXkKLSAgUHlNYXBwaW5nX0hhc0tleVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfSGFzS2V5U3RyaW5nCi0gIFB5TWFwcGluZ19JdGVtcz1weXRob24zNS5QeU1hcHBpbmdfSXRlbXMKLSAgUHlNYXBwaW5nX0tleXM9cHl0aG9uMzUuUHlNYXBwaW5nX0tleXMKLSAgUHlNYXBwaW5nX0xlbmd0aD1weXRob24zNS5QeU1hcHBpbmdfTGVuZ3RoCi0gIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nPXB5dGhvbjM1LlB5TWFwcGluZ19TZXRJdGVtU3RyaW5nCi0gIFB5TWFwcGluZ19TaXplPXB5dGhvbjM1LlB5TWFwcGluZ19TaXplCi0gIFB5TWFwcGluZ19WYWx1ZXM9cHl0aG9uMzUuUHlNYXBwaW5nX1ZhbHVlcwotICBQeU1lbV9GcmVlPXB5dGhvbjM1LlB5TWVtX0ZyZWUKLSAgUHlNZW1fTWFsbG9jPXB5dGhvbjM1LlB5TWVtX01hbGxvYwotICBQeU1lbV9SZWFsbG9jPXB5dGhvbjM1LlB5TWVtX1JlYWxsb2MKLSAgUHlNZW1iZXJEZXNjcl9UeXBlPXB5dGhvbjM1LlB5TWVtYmVyRGVzY3JfVHlwZSBEQVRBCi0gIFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0Ci0gIFB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzPXB5dGhvbjM1LlB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzCi0gIFB5TWVtb3J5Vmlld19UeXBlPXB5dGhvbjM1LlB5TWVtb3J5Vmlld19UeXBlIERBVEEKLSAgUHlNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM1LlB5TWV0aG9kRGVzY3JfVHlwZSBEQVRBCi0gIFB5TW9kdWxlX0FkZEludENvbnN0YW50PXB5dGhvbjM1LlB5TW9kdWxlX0FkZEludENvbnN0YW50Ci0gIFB5TW9kdWxlX0FkZE9iamVjdD1weXRob24zNS5QeU1vZHVsZV9BZGRPYmplY3QKLSAgUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQ9cHl0aG9uMzUuUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQKLSAgUHlNb2R1bGVfQ3JlYXRlMj1weXRob24zNS5QeU1vZHVsZV9DcmVhdGUyCi0gIFB5TW9kdWxlX0dldERlZj1weXRob24zNS5QeU1vZHVsZV9HZXREZWYKLSAgUHlNb2R1bGVfR2V0RGljdD1weXRob24zNS5QeU1vZHVsZV9HZXREaWN0Ci0gIFB5TW9kdWxlX0dldEZpbGVuYW1lPXB5dGhvbjM1LlB5TW9kdWxlX0dldEZpbGVuYW1lCi0gIFB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0PXB5dGhvbjM1LlB5TW9kdWxlX0dldEZpbGVuYW1lT2JqZWN0Ci0gIFB5TW9kdWxlX0dldE5hbWU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0TmFtZQotICBQeU1vZHVsZV9HZXRTdGF0ZT1weXRob24zNS5QeU1vZHVsZV9HZXRTdGF0ZQotICBQeU1vZHVsZV9OZXc9cHl0aG9uMzUuUHlNb2R1bGVfTmV3Ci0gIFB5TW9kdWxlX1R5cGU9cHl0aG9uMzUuUHlNb2R1bGVfVHlwZSBEQVRBCi0gIFB5TW9kdWxlRGVmX0luaXQ9cHl0aG9uMzUuUHlNb2R1bGVEZWZfSW5pdAotICBQeU1vZHVsZURlZl9UeXBlPXB5dGhvbjM1LlB5TW9kdWxlRGVmX1R5cGUgREFUQQotICBQeU51bGxJbXBvcnRlcl9UeXBlPXB5dGhvbjM1LlB5TnVsbEltcG9ydGVyX1R5cGUgREFUQQotICBQeU51bWJlcl9BYnNvbHV0ZT1weXRob24zNS5QeU51bWJlcl9BYnNvbHV0ZQotICBQeU51bWJlcl9BZGQ9cHl0aG9uMzUuUHlOdW1iZXJfQWRkCi0gIFB5TnVtYmVyX0FuZD1weXRob24zNS5QeU51bWJlcl9BbmQKLSAgUHlOdW1iZXJfQXNTc2l6ZV90PXB5dGhvbjM1LlB5TnVtYmVyX0FzU3NpemVfdAotICBQeU51bWJlcl9DaGVjaz1weXRob24zNS5QeU51bWJlcl9DaGVjawotICBQeU51bWJlcl9EaXZtb2Q9cHl0aG9uMzUuUHlOdW1iZXJfRGl2bW9kCi0gIFB5TnVtYmVyX0Zsb2F0PXB5dGhvbjM1LlB5TnVtYmVyX0Zsb2F0Ci0gIFB5TnVtYmVyX0Zsb29yRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0Zsb29yRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VBZGQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZUFkZAotICBQeU51bWJlcl9JblBsYWNlQW5kPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VBbmQKLSAgUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZQotICBQeU51bWJlcl9JblBsYWNlTHNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VMc2hpZnQKLSAgUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VNdWx0aXBseQotICBQeU51bWJlcl9JblBsYWNlT3I9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZU9yCi0gIFB5TnVtYmVyX0luUGxhY2VQb3dlcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUG93ZXIKLSAgUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcj1weXRob24zNS5QeU51bWJlcl9JblBsYWNlUmVtYWluZGVyCi0gIFB5TnVtYmVyX0luUGxhY2VSc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVJzaGlmdAotICBQeU51bWJlcl9JblBsYWNlU3VidHJhY3Q9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0Ci0gIFB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VUcnVlRGl2aWRlCi0gIFB5TnVtYmVyX0luUGxhY2VYb3I9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVhvcgotICBQeU51bWJlcl9JbmRleD1weXRob24zNS5QeU51bWJlcl9JbmRleAotICBQeU51bWJlcl9JbnZlcnQ9cHl0aG9uMzUuUHlOdW1iZXJfSW52ZXJ0Ci0gIFB5TnVtYmVyX0xvbmc9cHl0aG9uMzUuUHlOdW1iZXJfTG9uZwotICBQeU51bWJlcl9Mc2hpZnQ9cHl0aG9uMzUuUHlOdW1iZXJfTHNoaWZ0Ci0gIFB5TnVtYmVyX011bHRpcGx5PXB5dGhvbjM1LlB5TnVtYmVyX011bHRpcGx5Ci0gIFB5TnVtYmVyX05lZ2F0aXZlPXB5dGhvbjM1LlB5TnVtYmVyX05lZ2F0aXZlCi0gIFB5TnVtYmVyX09yPXB5dGhvbjM1LlB5TnVtYmVyX09yCi0gIFB5TnVtYmVyX1Bvc2l0aXZlPXB5dGhvbjM1LlB5TnVtYmVyX1Bvc2l0aXZlCi0gIFB5TnVtYmVyX1Bvd2VyPXB5dGhvbjM1LlB5TnVtYmVyX1Bvd2VyCi0gIFB5TnVtYmVyX1JlbWFpbmRlcj1weXRob24zNS5QeU51bWJlcl9SZW1haW5kZXIKLSAgUHlOdW1iZXJfUnNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX1JzaGlmdAotICBQeU51bWJlcl9TdWJ0cmFjdD1weXRob24zNS5QeU51bWJlcl9TdWJ0cmFjdAotICBQeU51bWJlcl9Ub0Jhc2U9cHl0aG9uMzUuUHlOdW1iZXJfVG9CYXNlCi0gIFB5TnVtYmVyX1RydWVEaXZpZGU9cHl0aG9uMzUuUHlOdW1iZXJfVHJ1ZURpdmlkZQotICBQeU51bWJlcl9Yb3I9cHl0aG9uMzUuUHlOdW1iZXJfWG9yCi0gIFB5T1NfQWZ0ZXJGb3JrPXB5dGhvbjM1LlB5T1NfQWZ0ZXJGb3JrCi0gIFB5T1NfSW5pdEludGVycnVwdHM9cHl0aG9uMzUuUHlPU19Jbml0SW50ZXJydXB0cwotICBQeU9TX0lucHV0SG9vaz1weXRob24zNS5QeU9TX0lucHV0SG9vayBEQVRBCi0gIFB5T1NfSW50ZXJydXB0T2NjdXJyZWQ9cHl0aG9uMzUuUHlPU19JbnRlcnJ1cHRPY2N1cnJlZAotICBQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyPXB5dGhvbjM1LlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIgREFUQQotICBQeU9TX2RvdWJsZV90b19zdHJpbmc9cHl0aG9uMzUuUHlPU19kb3VibGVfdG9fc3RyaW5nCi0gIFB5T1NfZ2V0c2lnPXB5dGhvbjM1LlB5T1NfZ2V0c2lnCi0gIFB5T1NfbXlzdHJpY21wPXB5dGhvbjM1LlB5T1NfbXlzdHJpY21wCi0gIFB5T1NfbXlzdHJuaWNtcD1weXRob24zNS5QeU9TX215c3RybmljbXAKLSAgUHlPU19zZXRzaWc9cHl0aG9uMzUuUHlPU19zZXRzaWcKLSAgUHlPU19zbnByaW50Zj1weXRob24zNS5QeU9TX3NucHJpbnRmCi0gIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZT1weXRob24zNS5QeU9TX3N0cmluZ190b19kb3VibGUKLSAgUHlPU19zdHJ0b2w9cHl0aG9uMzUuUHlPU19zdHJ0b2wKLSAgUHlPU19zdHJ0b3VsPXB5dGhvbjM1LlB5T1Nfc3RydG91bAotICBQeU9TX3ZzbnByaW50Zj1weXRob24zNS5QeU9TX3ZzbnByaW50ZgotICBQeU9iamVjdF9BU0NJST1weXRob24zNS5QeU9iamVjdF9BU0NJSQotICBQeU9iamVjdF9Bc0NoYXJCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNDaGFyQnVmZmVyCi0gIFB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3I9cHl0aG9uMzUuUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcgotICBQeU9iamVjdF9Bc1JlYWRCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNSZWFkQnVmZmVyCi0gIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcgotICBQeU9iamVjdF9CeXRlcz1weXRob24zNS5QeU9iamVjdF9CeXRlcwotICBQeU9iamVjdF9DYWxsPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGwKLSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxGdW5jdGlvbgotICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MKLSAgUHlPYmplY3RfQ2FsbE1ldGhvZD1weXRob24zNS5QeU9iamVjdF9DYWxsTWV0aG9kCi0gIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzPXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzCi0gIFB5T2JqZWN0X0NhbGxPYmplY3Q9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE9iamVjdAotICBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXI9cHl0aG9uMzUuUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyCi0gIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnM9cHl0aG9uMzUuUHlPYmplY3RfQ2xlYXJXZWFrUmVmcwotICBQeU9iamVjdF9EZWxJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X0RlbEl0ZW0KLSAgUHlPYmplY3RfRGVsSXRlbVN0cmluZz1weXRob24zNS5QeU9iamVjdF9EZWxJdGVtU3RyaW5nCi0gIFB5T2JqZWN0X0Rpcj1weXRob24zNS5QeU9iamVjdF9EaXIKLSAgUHlPYmplY3RfRm9ybWF0PXB5dGhvbjM1LlB5T2JqZWN0X0Zvcm1hdAotICBQeU9iamVjdF9GcmVlPXB5dGhvbjM1LlB5T2JqZWN0X0ZyZWUKLSAgUHlPYmplY3RfR0NfRGVsPXB5dGhvbjM1LlB5T2JqZWN0X0dDX0RlbAotICBQeU9iamVjdF9HQ19UcmFjaz1weXRob24zNS5QeU9iamVjdF9HQ19UcmFjawotICBQeU9iamVjdF9HQ19VblRyYWNrPXB5dGhvbjM1LlB5T2JqZWN0X0dDX1VuVHJhY2sKLSAgUHlPYmplY3RfR2VuZXJpY0dldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2VuZXJpY0dldEF0dHIKLSAgUHlPYmplY3RfR2VuZXJpY1NldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2VuZXJpY1NldEF0dHIKLSAgUHlPYmplY3RfR2V0QXR0cj1weXRob24zNS5QeU9iamVjdF9HZXRBdHRyCi0gIFB5T2JqZWN0X0dldEF0dHJTdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfR2V0QXR0clN0cmluZwotICBQeU9iamVjdF9HZXRJdGVtPXB5dGhvbjM1LlB5T2JqZWN0X0dldEl0ZW0KLSAgUHlPYmplY3RfR2V0SXRlcj1weXRob24zNS5QeU9iamVjdF9HZXRJdGVyCi0gIFB5T2JqZWN0X0hhc0F0dHI9cHl0aG9uMzUuUHlPYmplY3RfSGFzQXR0cgotICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0hhc0F0dHJTdHJpbmcKLSAgUHlPYmplY3RfSGFzaD1weXRob24zNS5QeU9iamVjdF9IYXNoCi0gIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZD1weXRob24zNS5QeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQKLSAgUHlPYmplY3RfSW5pdD1weXRob24zNS5QeU9iamVjdF9Jbml0Ci0gIFB5T2JqZWN0X0luaXRWYXI9cHl0aG9uMzUuUHlPYmplY3RfSW5pdFZhcgotICBQeU9iamVjdF9Jc0luc3RhbmNlPXB5dGhvbjM1LlB5T2JqZWN0X0lzSW5zdGFuY2UKLSAgUHlPYmplY3RfSXNTdWJjbGFzcz1weXRob24zNS5QeU9iamVjdF9Jc1N1YmNsYXNzCi0gIFB5T2JqZWN0X0lzVHJ1ZT1weXRob24zNS5QeU9iamVjdF9Jc1RydWUKLSAgUHlPYmplY3RfTGVuZ3RoPXB5dGhvbjM1LlB5T2JqZWN0X0xlbmd0aAotICBQeU9iamVjdF9NYWxsb2M9cHl0aG9uMzUuUHlPYmplY3RfTWFsbG9jCi0gIFB5T2JqZWN0X05vdD1weXRob24zNS5QeU9iamVjdF9Ob3QKLSAgUHlPYmplY3RfUmVhbGxvYz1weXRob24zNS5QeU9iamVjdF9SZWFsbG9jCi0gIFB5T2JqZWN0X1JlcHI9cHl0aG9uMzUuUHlPYmplY3RfUmVwcgotICBQeU9iamVjdF9SaWNoQ29tcGFyZT1weXRob24zNS5QeU9iamVjdF9SaWNoQ29tcGFyZQotICBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2w9cHl0aG9uMzUuUHlPYmplY3RfUmljaENvbXBhcmVCb29sCi0gIFB5T2JqZWN0X1NlbGZJdGVyPXB5dGhvbjM1LlB5T2JqZWN0X1NlbGZJdGVyCi0gIFB5T2JqZWN0X1NldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfU2V0QXR0cgotICBQeU9iamVjdF9TZXRBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X1NldEF0dHJTdHJpbmcKLSAgUHlPYmplY3RfU2V0SXRlbT1weXRob24zNS5QeU9iamVjdF9TZXRJdGVtCi0gIFB5T2JqZWN0X1NpemU9cHl0aG9uMzUuUHlPYmplY3RfU2l6ZQotICBQeU9iamVjdF9TdHI9cHl0aG9uMzUuUHlPYmplY3RfU3RyCi0gIFB5T2JqZWN0X1R5cGU9cHl0aG9uMzUuUHlPYmplY3RfVHlwZSBEQVRBCi0gIFB5T0RpY3RfRGVsSXRlbT1weXRob24zNS5QeU9EaWN0X0RlbEl0ZW0KLSAgUHlPRGljdF9OZXc9cHl0aG9uMzUuUHlPRGljdF9OZXcKLSAgUHlPRGljdF9TZXRJdGVtPXB5dGhvbjM1LlB5T0RpY3RfU2V0SXRlbQotICBQeU9EaWN0X1R5cGU9cHl0aG9uMzUuUHlPRGljdF9UeXBlIERBVEEKLSAgUHlPRGljdEl0ZW1zX1R5cGU9cHl0aG9uMzUuUHlPRGljdEl0ZW1zX1R5cGUgREFUQQotICBQeU9EaWN0SXRlcl9UeXBlPXB5dGhvbjM1LlB5T0RpY3RJdGVyX1R5cGUgREFUQQotICBQeU9EaWN0S2V5c19UeXBlPXB5dGhvbjM1LlB5T0RpY3RLZXlzX1R5cGUgREFUQQotICBQeU9EaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzUuUHlPRGljdFZhbHVlc19UeXBlIERBVEEKLSAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3M9cHl0aG9uMzUuUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MKLSAgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncz1weXRob24zNS5QeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzCi0gIFB5UHJvcGVydHlfVHlwZT1weXRob24zNS5QeVByb3BlcnR5X1R5cGUgREFUQQotICBQeVJhbmdlSXRlcl9UeXBlPXB5dGhvbjM1LlB5UmFuZ2VJdGVyX1R5cGUgREFUQQotICBQeVJhbmdlX1R5cGU9cHl0aG9uMzUuUHlSYW5nZV9UeXBlIERBVEEKLSAgUHlSZXZlcnNlZF9UeXBlPXB5dGhvbjM1LlB5UmV2ZXJzZWRfVHlwZSBEQVRBCi0gIFB5U2VxSXRlcl9OZXc9cHl0aG9uMzUuUHlTZXFJdGVyX05ldwotICBQeVNlcUl0ZXJfVHlwZT1weXRob24zNS5QeVNlcUl0ZXJfVHlwZSBEQVRBCi0gIFB5U2VxdWVuY2VfQ2hlY2s9cHl0aG9uMzUuUHlTZXF1ZW5jZV9DaGVjawotICBQeVNlcXVlbmNlX0NvbmNhdD1weXRob24zNS5QeVNlcXVlbmNlX0NvbmNhdAotICBQeVNlcXVlbmNlX0NvbnRhaW5zPXB5dGhvbjM1LlB5U2VxdWVuY2VfQ29udGFpbnMKLSAgUHlTZXF1ZW5jZV9Db3VudD1weXRob24zNS5QeVNlcXVlbmNlX0NvdW50Ci0gIFB5U2VxdWVuY2VfRGVsSXRlbT1weXRob24zNS5QeVNlcXVlbmNlX0RlbEl0ZW0KLSAgUHlTZXF1ZW5jZV9EZWxTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX0RlbFNsaWNlCi0gIFB5U2VxdWVuY2VfRmFzdD1weXRob24zNS5QeVNlcXVlbmNlX0Zhc3QKLSAgUHlTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfR2V0SXRlbQotICBQeVNlcXVlbmNlX0dldFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfR2V0U2xpY2UKLSAgUHlTZXF1ZW5jZV9Jbj1weXRob24zNS5QeVNlcXVlbmNlX0luCi0gIFB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdD1weXRob24zNS5QeVNlcXVlbmNlX0luUGxhY2VDb25jYXQKLSAgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdAotICBQeVNlcXVlbmNlX0luZGV4PXB5dGhvbjM1LlB5U2VxdWVuY2VfSW5kZXgKLSAgUHlTZXF1ZW5jZV9MZW5ndGg9cHl0aG9uMzUuUHlTZXF1ZW5jZV9MZW5ndGgKLSAgUHlTZXF1ZW5jZV9MaXN0PXB5dGhvbjM1LlB5U2VxdWVuY2VfTGlzdAotICBQeVNlcXVlbmNlX1JlcGVhdD1weXRob24zNS5QeVNlcXVlbmNlX1JlcGVhdAotICBQeVNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9TZXRJdGVtCi0gIFB5U2VxdWVuY2VfU2V0U2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9TZXRTbGljZQotICBQeVNlcXVlbmNlX1NpemU9cHl0aG9uMzUuUHlTZXF1ZW5jZV9TaXplCi0gIFB5U2VxdWVuY2VfVHVwbGU9cHl0aG9uMzUuUHlTZXF1ZW5jZV9UdXBsZQotICBQeVNldEl0ZXJfVHlwZT1weXRob24zNS5QeVNldEl0ZXJfVHlwZSBEQVRBCi0gIFB5U2V0X0FkZD1weXRob24zNS5QeVNldF9BZGQKLSAgUHlTZXRfQ2xlYXI9cHl0aG9uMzUuUHlTZXRfQ2xlYXIKLSAgUHlTZXRfQ29udGFpbnM9cHl0aG9uMzUuUHlTZXRfQ29udGFpbnMKLSAgUHlTZXRfRGlzY2FyZD1weXRob24zNS5QeVNldF9EaXNjYXJkCi0gIFB5U2V0X05ldz1weXRob24zNS5QeVNldF9OZXcKLSAgUHlTZXRfUG9wPXB5dGhvbjM1LlB5U2V0X1BvcAotICBQeVNldF9TaXplPXB5dGhvbjM1LlB5U2V0X1NpemUKLSAgUHlTZXRfVHlwZT1weXRob24zNS5QeVNldF9UeXBlIERBVEEKLSAgUHlTbGljZV9HZXRJbmRpY2VzPXB5dGhvbjM1LlB5U2xpY2VfR2V0SW5kaWNlcwotICBQeVNsaWNlX0dldEluZGljZXNFeD1weXRob24zNS5QeVNsaWNlX0dldEluZGljZXNFeAotICBQeVNsaWNlX05ldz1weXRob24zNS5QeVNsaWNlX05ldwotICBQeVNsaWNlX1R5cGU9cHl0aG9uMzUuUHlTbGljZV9UeXBlIERBVEEKLSAgUHlTb3J0V3JhcHBlcl9UeXBlPXB5dGhvbjM1LlB5U29ydFdyYXBwZXJfVHlwZSBEQVRBCi0gIFB5U3RhdGVfRmluZE1vZHVsZT1weXRob24zNS5QeVN0YXRlX0ZpbmRNb2R1bGUKLSAgUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9BZGRNb2R1bGUKLSAgUHlTdGF0ZV9SZW1vdmVNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9SZW1vdmVNb2R1bGUKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbQotICBQeVN0cnVjdFNlcXVlbmNlX05ldz1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX05ldwotICBQeVN0cnVjdFNlcXVlbmNlX05ld1R5cGU9cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlCi0gIFB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW0KLSAgUHlTdXBlcl9UeXBlPXB5dGhvbjM1LlB5U3VwZXJfVHlwZSBEQVRBCi0gIFB5U3lzX0FkZFdhcm5PcHRpb249cHl0aG9uMzUuUHlTeXNfQWRkV2Fybk9wdGlvbgotICBQeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZT1weXRob24zNS5QeVN5c19BZGRXYXJuT3B0aW9uVW5pY29kZQotICBQeVN5c19Gb3JtYXRTdGRlcnI9cHl0aG9uMzUuUHlTeXNfRm9ybWF0U3RkZXJyCi0gIFB5U3lzX0Zvcm1hdFN0ZG91dD1weXRob24zNS5QeVN5c19Gb3JtYXRTdGRvdXQKLSAgUHlTeXNfR2V0T2JqZWN0PXB5dGhvbjM1LlB5U3lzX0dldE9iamVjdAotICBQeVN5c19IYXNXYXJuT3B0aW9ucz1weXRob24zNS5QeVN5c19IYXNXYXJuT3B0aW9ucwotICBQeVN5c19SZXNldFdhcm5PcHRpb25zPXB5dGhvbjM1LlB5U3lzX1Jlc2V0V2Fybk9wdGlvbnMKLSAgUHlTeXNfU2V0QXJndj1weXRob24zNS5QeVN5c19TZXRBcmd2Ci0gIFB5U3lzX1NldEFyZ3ZFeD1weXRob24zNS5QeVN5c19TZXRBcmd2RXgKLSAgUHlTeXNfU2V0T2JqZWN0PXB5dGhvbjM1LlB5U3lzX1NldE9iamVjdAotICBQeVN5c19TZXRQYXRoPXB5dGhvbjM1LlB5U3lzX1NldFBhdGgKLSAgUHlTeXNfV3JpdGVTdGRlcnI9cHl0aG9uMzUuUHlTeXNfV3JpdGVTdGRlcnIKLSAgUHlTeXNfV3JpdGVTdGRvdXQ9cHl0aG9uMzUuUHlTeXNfV3JpdGVTdGRvdXQKLSAgUHlUaHJlYWRTdGF0ZV9DbGVhcj1weXRob24zNS5QeVRocmVhZFN0YXRlX0NsZWFyCi0gIFB5VGhyZWFkU3RhdGVfRGVsZXRlPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfRGVsZXRlCi0gIFB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudD1weXRob24zNS5QeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQKLSAgUHlUaHJlYWRTdGF0ZV9HZXQ9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9HZXQKLSAgUHlUaHJlYWRTdGF0ZV9HZXREaWN0PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfR2V0RGljdAotICBQeVRocmVhZFN0YXRlX05ldz1weXRob24zNS5QeVRocmVhZFN0YXRlX05ldwotICBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMKLSAgUHlUaHJlYWRTdGF0ZV9Td2FwPXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfU3dhcAotICBQeVRyYWNlQmFja19IZXJlPXB5dGhvbjM1LlB5VHJhY2VCYWNrX0hlcmUKLSAgUHlUcmFjZUJhY2tfUHJpbnQ9cHl0aG9uMzUuUHlUcmFjZUJhY2tfUHJpbnQKLSAgUHlUcmFjZUJhY2tfVHlwZT1weXRob24zNS5QeVRyYWNlQmFja19UeXBlIERBVEEKLSAgUHlUdXBsZUl0ZXJfVHlwZT1weXRob24zNS5QeVR1cGxlSXRlcl9UeXBlIERBVEEKLSAgUHlUdXBsZV9DbGVhckZyZWVMaXN0PXB5dGhvbjM1LlB5VHVwbGVfQ2xlYXJGcmVlTGlzdAotICBQeVR1cGxlX0dldEl0ZW09cHl0aG9uMzUuUHlUdXBsZV9HZXRJdGVtCi0gIFB5VHVwbGVfR2V0U2xpY2U9cHl0aG9uMzUuUHlUdXBsZV9HZXRTbGljZQotICBQeVR1cGxlX05ldz1weXRob24zNS5QeVR1cGxlX05ldwotICBQeVR1cGxlX1BhY2s9cHl0aG9uMzUuUHlUdXBsZV9QYWNrCi0gIFB5VHVwbGVfU2V0SXRlbT1weXRob24zNS5QeVR1cGxlX1NldEl0ZW0KLSAgUHlUdXBsZV9TaXplPXB5dGhvbjM1LlB5VHVwbGVfU2l6ZQotICBQeVR1cGxlX1R5cGU9cHl0aG9uMzUuUHlUdXBsZV9UeXBlIERBVEEKLSAgUHlUeXBlX0NsZWFyQ2FjaGU9cHl0aG9uMzUuUHlUeXBlX0NsZWFyQ2FjaGUKLSAgUHlUeXBlX0Zyb21TcGVjPXB5dGhvbjM1LlB5VHlwZV9Gcm9tU3BlYwotICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXM9cHl0aG9uMzUuUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzCi0gIFB5VHlwZV9HZW5lcmljQWxsb2M9cHl0aG9uMzUuUHlUeXBlX0dlbmVyaWNBbGxvYwotICBQeVR5cGVfR2VuZXJpY05ldz1weXRob24zNS5QeVR5cGVfR2VuZXJpY05ldwotICBQeVR5cGVfR2V0RmxhZ3M9cHl0aG9uMzUuUHlUeXBlX0dldEZsYWdzCi0gIFB5VHlwZV9HZXRTbG90PXB5dGhvbjM1LlB5VHlwZV9HZXRTbG90Ci0gIFB5VHlwZV9Jc1N1YnR5cGU9cHl0aG9uMzUuUHlUeXBlX0lzU3VidHlwZQotICBQeVR5cGVfTW9kaWZpZWQ9cHl0aG9uMzUuUHlUeXBlX01vZGlmaWVkCi0gIFB5VHlwZV9SZWFkeT1weXRob24zNS5QeVR5cGVfUmVhZHkKLSAgUHlUeXBlX1R5cGU9cHl0aG9uMzUuUHlUeXBlX1R5cGUgREFUQQotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGU9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZwotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlSXRlcl9UeXBlPXB5dGhvbjM1LlB5VW5pY29kZUl0ZXJfVHlwZSBEQVRBCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0Ci0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbgotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRTdGFydAotICBQeVVuaWNvZGVfQXBwZW5kPXB5dGhvbjM1LlB5VW5pY29kZV9BcHBlbmQKLSAgUHlVbmljb2RlX0FwcGVuZEFuZERlbD1weXRob24zNS5QeVVuaWNvZGVfQXBwZW5kQW5kRGVsCi0gIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nCi0gIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZwotICBQeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3QKLSAgUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0FzRGVjb2RlZFVuaWNvZGUKLSAgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZwotICBQeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZT1weXRob24zNS5QeVVuaWNvZGVfQXNFbmNvZGVkVW5pY29kZQotICBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZwotICBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEYxNlN0cmluZwotICBQeVVuaWNvZGVfQXNVVEYzMlN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEYzMlN0cmluZwotICBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1VURjhTdHJpbmcKLSAgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nCi0gIFB5VW5pY29kZV9Bc1dpZGVDaGFyPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1dpZGVDaGFyCi0gIFB5VW5pY29kZV9DbGVhckZyZWVsaXN0PXB5dGhvbjM1LlB5VW5pY29kZV9DbGVhckZyZWVsaXN0Ci0gIFB5VW5pY29kZV9Db21wYXJlPXB5dGhvbjM1LlB5VW5pY29kZV9Db21wYXJlCi0gIFB5VW5pY29kZV9Db25jYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0NvbmNhdAotICBQeVVuaWNvZGVfQ29udGFpbnM9cHl0aG9uMzUuUHlVbmljb2RlX0NvbnRhaW5zCi0gIFB5VW5pY29kZV9Db3VudD1weXRob24zNS5QeVVuaWNvZGVfQ291bnQKLSAgUHlVbmljb2RlX0RlY29kZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlCi0gIFB5VW5pY29kZV9EZWNvZGVBU0NJST1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlQVNDSUkKLSAgUHlVbmljb2RlX0RlY29kZUNoYXJtYXA9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUNoYXJtYXAKLSAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0Ci0gIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHRBbmRTaXplCi0gIFB5VW5pY29kZV9EZWNvZGVMYXRpbjE9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUxhdGluMQotICBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQotICBQeVVuaWNvZGVfRGVjb2RlVVRGMTY9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjE2Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYzMj1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMzIKLSAgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwKLSAgUHlVbmljb2RlX0RlY29kZVVURjg9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjgKLSAgUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlCi0gIFB5VW5pY29kZV9GU0NvbnZlcnRlcj1weXRob24zNS5QeVVuaWNvZGVfRlNDb252ZXJ0ZXIKLSAgUHlVbmljb2RlX0ZTRGVjb2Rlcj1weXRob24zNS5QeVVuaWNvZGVfRlNEZWNvZGVyCi0gIFB5VW5pY29kZV9GaW5kPXB5dGhvbjM1LlB5VW5pY29kZV9GaW5kCi0gIFB5VW5pY29kZV9Gb3JtYXQ9cHl0aG9uMzUuUHlVbmljb2RlX0Zvcm1hdAotICBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Gcm9tRm9ybWF0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRm9ybWF0Ci0gIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vj1weXRob24zNS5QeVVuaWNvZGVfRnJvbUZvcm1hdFYKLSAgUHlVbmljb2RlX0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21PYmplY3QKLSAgUHlVbmljb2RlX0Zyb21PcmRpbmFsPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tT3JkaW5hbAotICBQeVVuaWNvZGVfRnJvbVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfRnJvbVN0cmluZwotICBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplCi0gIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXI9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21XaWRlQ2hhcgotICBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2RpbmcKLSAgUHlVbmljb2RlX0dldFNpemU9cHl0aG9uMzUuUHlVbmljb2RlX0dldFNpemUKLSAgUHlVbmljb2RlX0lzSWRlbnRpZmllcj1weXRob24zNS5QeVVuaWNvZGVfSXNJZGVudGlmaWVyCi0gIFB5VW5pY29kZV9Kb2luPXB5dGhvbjM1LlB5VW5pY29kZV9Kb2luCi0gIFB5VW5pY29kZV9QYXJ0aXRpb249cHl0aG9uMzUuUHlVbmljb2RlX1BhcnRpdGlvbgotICBQeVVuaWNvZGVfUlBhcnRpdGlvbj1weXRob24zNS5QeVVuaWNvZGVfUlBhcnRpdGlvbgotICBQeVVuaWNvZGVfUlNwbGl0PXB5dGhvbjM1LlB5VW5pY29kZV9SU3BsaXQKLSAgUHlVbmljb2RlX1JlcGxhY2U9cHl0aG9uMzUuUHlVbmljb2RlX1JlcGxhY2UKLSAgUHlVbmljb2RlX1Jlc2l6ZT1weXRob24zNS5QeVVuaWNvZGVfUmVzaXplCi0gIFB5VW5pY29kZV9SaWNoQ29tcGFyZT1weXRob24zNS5QeVVuaWNvZGVfUmljaENvbXBhcmUKLSAgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nCi0gIFB5VW5pY29kZV9TcGxpdD1weXRob24zNS5QeVVuaWNvZGVfU3BsaXQKLSAgUHlVbmljb2RlX1NwbGl0bGluZXM9cHl0aG9uMzUuUHlVbmljb2RlX1NwbGl0bGluZXMKLSAgUHlVbmljb2RlX1RhaWxtYXRjaD1weXRob24zNS5QeVVuaWNvZGVfVGFpbG1hdGNoCi0gIFB5VW5pY29kZV9UcmFuc2xhdGU9cHl0aG9uMzUuUHlVbmljb2RlX1RyYW5zbGF0ZQotICBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcD1weXRob24zNS5QeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcAotICBQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZwotICBQeVVuaWNvZGVfRGVjb2RlVVRGNz1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGNwotICBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWwKLSAgUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdD1weXRob24zNS5QeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0Ci0gIFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nCi0gIFB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbD1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWwKLSAgUHlVbmljb2RlX0ludGVybkluUGxhY2U9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkluUGxhY2UKLSAgUHlVbmljb2RlX1R5cGU9cHl0aG9uMzUuUHlVbmljb2RlX1R5cGUgREFUQQotICBQeVdlYWtyZWZfR2V0T2JqZWN0PXB5dGhvbjM1LlB5V2Vha3JlZl9HZXRPYmplY3QgREFUQQotICBQeVdlYWtyZWZfTmV3UHJveHk9cHl0aG9uMzUuUHlXZWFrcmVmX05ld1Byb3h5Ci0gIFB5V2Vha3JlZl9OZXdSZWY9cHl0aG9uMzUuUHlXZWFrcmVmX05ld1JlZgotICBQeVdyYXBwZXJEZXNjcl9UeXBlPXB5dGhvbjM1LlB5V3JhcHBlckRlc2NyX1R5cGUgREFUQQotICBQeVdyYXBwZXJfTmV3PXB5dGhvbjM1LlB5V3JhcHBlcl9OZXcKLSAgUHlaaXBfVHlwZT1weXRob24zNS5QeVppcF9UeXBlIERBVEEKLSAgUHlfQWRkUGVuZGluZ0NhbGw9cHl0aG9uMzUuUHlfQWRkUGVuZGluZ0NhbGwKLSAgUHlfQXRFeGl0PXB5dGhvbjM1LlB5X0F0RXhpdAotICBQeV9CdWlsZFZhbHVlPXB5dGhvbjM1LlB5X0J1aWxkVmFsdWUKLSAgUHlfQ29tcGlsZVN0cmluZz1weXRob24zNS5QeV9Db21waWxlU3RyaW5nCi0gIFB5X0RlY1JlZj1weXRob24zNS5QeV9EZWNSZWYKLSAgUHlfRW5kSW50ZXJwcmV0ZXI9cHl0aG9uMzUuUHlfRW5kSW50ZXJwcmV0ZXIKLSAgUHlfRXhpdD1weXRob24zNS5QeV9FeGl0Ci0gIFB5X0ZhdGFsRXJyb3I9cHl0aG9uMzUuUHlfRmF0YWxFcnJvcgotICBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQotICBQeV9GaW5hbGl6ZT1weXRob24zNS5QeV9GaW5hbGl6ZQotICBQeV9HZXRCdWlsZEluZm89cHl0aG9uMzUuUHlfR2V0QnVpbGRJbmZvCi0gIFB5X0dldENvbXBpbGVyPXB5dGhvbjM1LlB5X0dldENvbXBpbGVyCi0gIFB5X0dldENvcHlyaWdodD1weXRob24zNS5QeV9HZXRDb3B5cmlnaHQKLSAgUHlfR2V0RXhlY1ByZWZpeD1weXRob24zNS5QeV9HZXRFeGVjUHJlZml4Ci0gIFB5X0dldFBhdGg9cHl0aG9uMzUuUHlfR2V0UGF0aAotICBQeV9HZXRQbGF0Zm9ybT1weXRob24zNS5QeV9HZXRQbGF0Zm9ybQotICBQeV9HZXRQcmVmaXg9cHl0aG9uMzUuUHlfR2V0UHJlZml4Ci0gIFB5X0dldFByb2dyYW1GdWxsUGF0aD1weXRob24zNS5QeV9HZXRQcm9ncmFtRnVsbFBhdGgKLSAgUHlfR2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzUuUHlfR2V0UHJvZ3JhbU5hbWUKLSAgUHlfR2V0UHl0aG9uSG9tZT1weXRob24zNS5QeV9HZXRQeXRob25Ib21lCi0gIFB5X0dldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1LlB5X0dldFJlY3Vyc2lvbkxpbWl0Ci0gIFB5X0dldFZlcnNpb249cHl0aG9uMzUuUHlfR2V0VmVyc2lvbgotICBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM1LlB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQotICBQeV9JbmNSZWY9cHl0aG9uMzUuUHlfSW5jUmVmCi0gIFB5X0luaXRpYWxpemU9cHl0aG9uMzUuUHlfSW5pdGlhbGl6ZQotICBQeV9Jbml0aWFsaXplRXg9cHl0aG9uMzUuUHlfSW5pdGlhbGl6ZUV4Ci0gIFB5X0lzSW5pdGlhbGl6ZWQ9cHl0aG9uMzUuUHlfSXNJbml0aWFsaXplZAotICBQeV9NYWluPXB5dGhvbjM1LlB5X01haW4KLSAgUHlfTWFrZVBlbmRpbmdDYWxscz1weXRob24zNS5QeV9NYWtlUGVuZGluZ0NhbGxzCi0gIFB5X05ld0ludGVycHJldGVyPXB5dGhvbjM1LlB5X05ld0ludGVycHJldGVyCi0gIFB5X1JlcHJFbnRlcj1weXRob24zNS5QeV9SZXByRW50ZXIKLSAgUHlfUmVwckxlYXZlPXB5dGhvbjM1LlB5X1JlcHJMZWF2ZQotICBQeV9TZXRQcm9ncmFtTmFtZT1weXRob24zNS5QeV9TZXRQcm9ncmFtTmFtZQotICBQeV9TZXRQeXRob25Ib21lPXB5dGhvbjM1LlB5X1NldFB5dGhvbkhvbWUKLSAgUHlfU2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuUHlfU2V0UmVjdXJzaW9uTGltaXQKLSAgUHlfU3ltdGFibGVTdHJpbmc9cHl0aG9uMzUuUHlfU3ltdGFibGVTdHJpbmcKLSAgUHlfVmFCdWlsZFZhbHVlPXB5dGhvbjM1LlB5X1ZhQnVpbGRWYWx1ZQotICBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM1Ll9QeUVycl9CYWRJbnRlcm5hbENhbGwKLSAgX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVD1weXRob24zNS5fUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUCi0gIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUPXB5dGhvbjM1Ll9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUCi0gIF9QeU9iamVjdF9HQ19NYWxsb2M9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX01hbGxvYwotICBfUHlPYmplY3RfR0NfTmV3PXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19OZXcKLSAgX1B5T2JqZWN0X0dDX05ld1Zhcj1weXRob24zNS5fUHlPYmplY3RfR0NfTmV3VmFyCi0gIF9QeU9iamVjdF9HQ19SZXNpemU9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX1Jlc2l6ZQotICBfUHlPYmplY3RfTmV3PXB5dGhvbjM1Ll9QeU9iamVjdF9OZXcKLSAgX1B5T2JqZWN0X05ld1Zhcj1weXRob24zNS5fUHlPYmplY3RfTmV3VmFyCi0gIF9QeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNS5fUHlTdGF0ZV9BZGRNb2R1bGUKLSAgX1B5VGhyZWFkU3RhdGVfSW5pdD1weXRob24zNS5fUHlUaHJlYWRTdGF0ZV9Jbml0Ci0gIF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jPXB5dGhvbjM1Ll9QeVRocmVhZFN0YXRlX1ByZWFsbG9jCi0gIF9QeVRyYXNoX2RlbGV0ZV9sYXRlcj1weXRob24zNS5fUHlUcmFzaF9kZWxldGVfbGF0ZXIgREFUQQotICBfUHlUcmFzaF9kZWxldGVfbmVzdGluZz1weXRob24zNS5fUHlUcmFzaF9kZWxldGVfbmVzdGluZyBEQVRBCi0gIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0PXB5dGhvbjM1Ll9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0Ci0gIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW49cHl0aG9uMzUuX1B5VHJhc2hfZGVzdHJveV9jaGFpbgotICBfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlPXB5dGhvbjM1Ll9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUgREFUQQotICBfUHlXZWFrcmVmX1Byb3h5VHlwZT1weXRob24zNS5fUHlXZWFrcmVmX1Byb3h5VHlwZSBEQVRBCi0gIF9QeVdlYWtyZWZfUmVmVHlwZT1weXRob24zNS5fUHlXZWFrcmVmX1JlZlR5cGUgREFUQQotICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfQnVpbGRWYWx1ZV9TaXplVAotICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdD1weXRob24zNS5fUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCBEQVRBCi0gIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGw9cHl0aG9uMzUuX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbAotICBfUHlfRGVhbGxvYz1weXRob24zNS5fUHlfRGVhbGxvYwotICBfUHlfRWxsaXBzaXNPYmplY3Q9cHl0aG9uMzUuX1B5X0VsbGlwc2lzT2JqZWN0IERBVEEKLSAgX1B5X0ZhbHNlU3RydWN0PXB5dGhvbjM1Ll9QeV9GYWxzZVN0cnVjdCBEQVRBCi0gIF9QeV9Ob25lU3RydWN0PXB5dGhvbjM1Ll9QeV9Ob25lU3RydWN0IERBVEEKLSAgX1B5X05vdEltcGxlbWVudGVkU3RydWN0PXB5dGhvbjM1Ll9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCBEQVRBCi0gIF9QeV9Td2FwcGVkT3A9cHl0aG9uMzUuX1B5X1N3YXBwZWRPcCBEQVRBCi0gIF9QeV9UcnVlU3RydWN0PXB5dGhvbjM1Ll9QeV9UcnVlU3RydWN0IERBVEEKLSAgX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNS5fUHlfVmFCdWlsZFZhbHVlX1NpemVUCi0gIF9QeUFyZ19QYXJzZV9TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQKLSAgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNS5fUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCi0gIF9QeUFyZ19WYVBhcnNlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19WYVBhcnNlX1NpemVUCi0gIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNS5fUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKLSAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKKyAgUHlBcmdfUGFyc2U9cHl0aG9uMzYuUHlBcmdfUGFyc2UKKyAgUHlBcmdfUGFyc2VUdXBsZT1weXRob24zNi5QeUFyZ19QYXJzZVR1cGxlCisgIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNi5QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMKKyAgUHlBcmdfVW5wYWNrVHVwbGU9cHl0aG9uMzYuUHlBcmdfVW5wYWNrVHVwbGUKKyAgUHlBcmdfVmFQYXJzZT1weXRob24zNi5QeUFyZ19WYVBhcnNlCisgIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM2LlB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCisgIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cz1weXRob24zNi5QeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHMKKyAgUHlCYXNlT2JqZWN0X1R5cGU9cHl0aG9uMzYuUHlCYXNlT2JqZWN0X1R5cGUgREFUQQorICBQeUJvb2xfRnJvbUxvbmc9cHl0aG9uMzYuUHlCb29sX0Zyb21Mb25nCisgIFB5Qm9vbF9UeXBlPXB5dGhvbjM2LlB5Qm9vbF9UeXBlIERBVEEKKyAgUHlCeXRlQXJyYXlJdGVyX1R5cGU9cHl0aG9uMzYuUHlCeXRlQXJyYXlJdGVyX1R5cGUgREFUQQorICBQeUJ5dGVBcnJheV9Bc1N0cmluZz1weXRob24zNi5QeUJ5dGVBcnJheV9Bc1N0cmluZworICBQeUJ5dGVBcnJheV9Db25jYXQ9cHl0aG9uMzYuUHlCeXRlQXJyYXlfQ29uY2F0CisgIFB5Qnl0ZUFycmF5X0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlCeXRlQXJyYXlfRnJvbU9iamVjdAorICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVBcnJheV9SZXNpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfUmVzaXplCisgIFB5Qnl0ZUFycmF5X1NpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfU2l6ZQorICBQeUJ5dGVBcnJheV9UeXBlPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1R5cGUgREFUQQorICBQeUJ5dGVzSXRlcl9UeXBlPXB5dGhvbjM2LlB5Qnl0ZXNJdGVyX1R5cGUgREFUQQorICBQeUJ5dGVzX0FzU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZXNfQXNTdHJpbmcKKyAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUKKyAgUHlCeXRlc19Db25jYXQ9cHl0aG9uMzYuUHlCeXRlc19Db25jYXQKKyAgUHlCeXRlc19Db25jYXRBbmREZWw9cHl0aG9uMzYuUHlCeXRlc19Db25jYXRBbmREZWwKKyAgUHlCeXRlc19EZWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlCeXRlc19EZWNvZGVFc2NhcGUKKyAgUHlCeXRlc19Gcm9tRm9ybWF0PXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbUZvcm1hdAorICBQeUJ5dGVzX0Zyb21Gb3JtYXRWPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbUZvcm1hdFYKKyAgUHlCeXRlc19Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbU9iamVjdAorICBQeUJ5dGVzX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlCeXRlc19Gcm9tU3RyaW5nCisgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeUJ5dGVzX1JlcHI9cHl0aG9uMzYuUHlCeXRlc19SZXByCisgIFB5Qnl0ZXNfU2l6ZT1weXRob24zNi5QeUJ5dGVzX1NpemUKKyAgUHlCeXRlc19UeXBlPXB5dGhvbjM2LlB5Qnl0ZXNfVHlwZSBEQVRBCisgIFB5Q0Z1bmN0aW9uX0NhbGw9cHl0aG9uMzYuUHlDRnVuY3Rpb25fQ2FsbAorICBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QKKyAgUHlDRnVuY3Rpb25fR2V0RmxhZ3M9cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0RmxhZ3MKKyAgUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb249cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24KKyAgUHlDRnVuY3Rpb25fR2V0U2VsZj1weXRob24zNi5QeUNGdW5jdGlvbl9HZXRTZWxmCisgIFB5Q0Z1bmN0aW9uX05ldz1weXRob24zNi5QeUNGdW5jdGlvbl9OZXcKKyAgUHlDRnVuY3Rpb25fTmV3RXg9cHl0aG9uMzYuUHlDRnVuY3Rpb25fTmV3RXgKKyAgUHlDRnVuY3Rpb25fVHlwZT1weXRob24zNi5QeUNGdW5jdGlvbl9UeXBlIERBVEEKKyAgUHlDYWxsSXRlcl9OZXc9cHl0aG9uMzYuUHlDYWxsSXRlcl9OZXcKKyAgUHlDYWxsSXRlcl9UeXBlPXB5dGhvbjM2LlB5Q2FsbEl0ZXJfVHlwZSBEQVRBCisgIFB5Q2FsbGFibGVfQ2hlY2s9cHl0aG9uMzYuUHlDYWxsYWJsZV9DaGVjaworICBQeUNhcHN1bGVfR2V0Q29udGV4dD1weXRob24zNi5QeUNhcHN1bGVfR2V0Q29udGV4dAorICBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3Rvcj1weXRob24zNi5QeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcgorICBQeUNhcHN1bGVfR2V0TmFtZT1weXRob24zNi5QeUNhcHN1bGVfR2V0TmFtZQorICBQeUNhcHN1bGVfR2V0UG9pbnRlcj1weXRob24zNi5QeUNhcHN1bGVfR2V0UG9pbnRlcgorICBQeUNhcHN1bGVfSW1wb3J0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9JbXBvcnQKKyAgUHlDYXBzdWxlX0lzVmFsaWQ9cHl0aG9uMzYuUHlDYXBzdWxlX0lzVmFsaWQKKyAgUHlDYXBzdWxlX05ldz1weXRob24zNi5QeUNhcHN1bGVfTmV3CisgIFB5Q2Fwc3VsZV9TZXRDb250ZXh0PXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXRDb250ZXh0CisgIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yCisgIFB5Q2Fwc3VsZV9TZXROYW1lPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXROYW1lCisgIFB5Q2Fwc3VsZV9TZXRQb2ludGVyPXB5dGhvbjM2LlB5Q2Fwc3VsZV9TZXRQb2ludGVyCisgIFB5Q2Fwc3VsZV9UeXBlPXB5dGhvbjM2LlB5Q2Fwc3VsZV9UeXBlIERBVEEKKyAgUHlDbGFzc01ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzYuUHlDbGFzc01ldGhvZERlc2NyX1R5cGUgREFUQQorICBQeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzCisgIFB5Q29kZWNfRGVjb2RlPXB5dGhvbjM2LlB5Q29kZWNfRGVjb2RlCisgIFB5Q29kZWNfRGVjb2Rlcj1weXRob24zNi5QeUNvZGVjX0RlY29kZXIKKyAgUHlDb2RlY19FbmNvZGU9cHl0aG9uMzYuUHlDb2RlY19FbmNvZGUKKyAgUHlDb2RlY19FbmNvZGVyPXB5dGhvbjM2LlB5Q29kZWNfRW5jb2RlcgorICBQeUNvZGVjX0lnbm9yZUVycm9ycz1weXRob24zNi5QeUNvZGVjX0lnbm9yZUVycm9ycworICBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcj1weXRob24zNi5QeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcgorICBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcj1weXRob24zNi5QeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcgorICBQeUNvZGVjX0tub3duRW5jb2Rpbmc9cHl0aG9uMzYuUHlDb2RlY19Lbm93bkVuY29kaW5nCisgIFB5Q29kZWNfTG9va3VwRXJyb3I9cHl0aG9uMzYuUHlDb2RlY19Mb29rdXBFcnJvcgorICBQeUNvZGVjX1JlZ2lzdGVyPXB5dGhvbjM2LlB5Q29kZWNfUmVnaXN0ZXIKKyAgUHlDb2RlY19SZWdpc3RlckVycm9yPXB5dGhvbjM2LlB5Q29kZWNfUmVnaXN0ZXJFcnJvcgorICBQeUNvZGVjX1JlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19SZXBsYWNlRXJyb3JzCisgIFB5Q29kZWNfU3RyZWFtUmVhZGVyPXB5dGhvbjM2LlB5Q29kZWNfU3RyZWFtUmVhZGVyCisgIFB5Q29kZWNfU3RyZWFtV3JpdGVyPXB5dGhvbjM2LlB5Q29kZWNfU3RyZWFtV3JpdGVyCisgIFB5Q29kZWNfU3RyaWN0RXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfU3RyaWN0RXJyb3JzCisgIFB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycworICBQeUNvbXBsZXhfRnJvbURvdWJsZXM9cHl0aG9uMzYuUHlDb21wbGV4X0Zyb21Eb3VibGVzCisgIFB5Q29tcGxleF9JbWFnQXNEb3VibGU9cHl0aG9uMzYuUHlDb21wbGV4X0ltYWdBc0RvdWJsZQorICBQeUNvbXBsZXhfUmVhbEFzRG91YmxlPXB5dGhvbjM2LlB5Q29tcGxleF9SZWFsQXNEb3VibGUKKyAgUHlDb21wbGV4X1R5cGU9cHl0aG9uMzYuUHlDb21wbGV4X1R5cGUgREFUQQorICBQeURlc2NyX05ld0NsYXNzTWV0aG9kPXB5dGhvbjM2LlB5RGVzY3JfTmV3Q2xhc3NNZXRob2QKKyAgUHlEZXNjcl9OZXdHZXRTZXQ9cHl0aG9uMzYuUHlEZXNjcl9OZXdHZXRTZXQKKyAgUHlEZXNjcl9OZXdNZW1iZXI9cHl0aG9uMzYuUHlEZXNjcl9OZXdNZW1iZXIKKyAgUHlEZXNjcl9OZXdNZXRob2Q9cHl0aG9uMzYuUHlEZXNjcl9OZXdNZXRob2QKKyAgUHlEaWN0SXRlbXNfVHlwZT1weXRob24zNi5QeURpY3RJdGVtc19UeXBlIERBVEEKKyAgUHlEaWN0SXRlckl0ZW1fVHlwZT1weXRob24zNi5QeURpY3RJdGVySXRlbV9UeXBlIERBVEEKKyAgUHlEaWN0SXRlcktleV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJLZXlfVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJWYWx1ZV9UeXBlPXB5dGhvbjM2LlB5RGljdEl0ZXJWYWx1ZV9UeXBlIERBVEEKKyAgUHlEaWN0S2V5c19UeXBlPXB5dGhvbjM2LlB5RGljdEtleXNfVHlwZSBEQVRBCisgIFB5RGljdFByb3h5X05ldz1weXRob24zNi5QeURpY3RQcm94eV9OZXcKKyAgUHlEaWN0UHJveHlfVHlwZT1weXRob24zNi5QeURpY3RQcm94eV9UeXBlIERBVEEKKyAgUHlEaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzYuUHlEaWN0VmFsdWVzX1R5cGUgREFUQQorICBQeURpY3RfQ2xlYXI9cHl0aG9uMzYuUHlEaWN0X0NsZWFyCisgIFB5RGljdF9Db250YWlucz1weXRob24zNi5QeURpY3RfQ29udGFpbnMKKyAgUHlEaWN0X0NvcHk9cHl0aG9uMzYuUHlEaWN0X0NvcHkKKyAgUHlEaWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlEaWN0X0RlbEl0ZW0KKyAgUHlEaWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X0RlbEl0ZW1TdHJpbmcKKyAgUHlEaWN0X0dldEl0ZW09cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW0KKyAgUHlEaWN0X0dldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW1TdHJpbmcKKyAgUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3I9cHl0aG9uMzYuUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IKKyAgUHlEaWN0X0l0ZW1zPXB5dGhvbjM2LlB5RGljdF9JdGVtcworICBQeURpY3RfS2V5cz1weXRob24zNi5QeURpY3RfS2V5cworICBQeURpY3RfTWVyZ2U9cHl0aG9uMzYuUHlEaWN0X01lcmdlCisgIFB5RGljdF9NZXJnZUZyb21TZXEyPXB5dGhvbjM2LlB5RGljdF9NZXJnZUZyb21TZXEyCisgIFB5RGljdF9OZXc9cHl0aG9uMzYuUHlEaWN0X05ldworICBQeURpY3RfTmV4dD1weXRob24zNi5QeURpY3RfTmV4dAorICBQeURpY3RfU2V0SXRlbT1weXRob24zNi5QeURpY3RfU2V0SXRlbQorICBQeURpY3RfU2V0SXRlbVN0cmluZz1weXRob24zNi5QeURpY3RfU2V0SXRlbVN0cmluZworICBQeURpY3RfU2l6ZT1weXRob24zNi5QeURpY3RfU2l6ZQorICBQeURpY3RfVHlwZT1weXRob24zNi5QeURpY3RfVHlwZSBEQVRBCisgIFB5RGljdF9VcGRhdGU9cHl0aG9uMzYuUHlEaWN0X1VwZGF0ZQorICBQeURpY3RfVmFsdWVzPXB5dGhvbjM2LlB5RGljdF9WYWx1ZXMKKyAgUHlFbGxpcHNpc19UeXBlPXB5dGhvbjM2LlB5RWxsaXBzaXNfVHlwZSBEQVRBCisgIFB5RW51bV9UeXBlPXB5dGhvbjM2LlB5RW51bV9UeXBlIERBVEEKKyAgUHlFcnJfQmFkQXJndW1lbnQ9cHl0aG9uMzYuUHlFcnJfQmFkQXJndW1lbnQKKyAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM2LlB5RXJyX0JhZEludGVybmFsQ2FsbAorICBQeUVycl9DaGVja1NpZ25hbHM9cHl0aG9uMzYuUHlFcnJfQ2hlY2tTaWduYWxzCisgIFB5RXJyX0NsZWFyPXB5dGhvbjM2LlB5RXJyX0NsZWFyCisgIFB5RXJyX0Rpc3BsYXk9cHl0aG9uMzYuUHlFcnJfRGlzcGxheQorICBQeUVycl9FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM2LlB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMKKyAgUHlFcnJfRmV0Y2g9cHl0aG9uMzYuUHlFcnJfRmV0Y2gKKyAgUHlFcnJfRm9ybWF0PXB5dGhvbjM2LlB5RXJyX0Zvcm1hdAorICBQeUVycl9Gb3JtYXRWPXB5dGhvbjM2LlB5RXJyX0Zvcm1hdFYKKyAgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM2LlB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcworICBQeUVycl9OZXdFeGNlcHRpb249cHl0aG9uMzYuUHlFcnJfTmV3RXhjZXB0aW9uCisgIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2M9cHl0aG9uMzYuUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYworICBQeUVycl9Ob01lbW9yeT1weXRob24zNi5QeUVycl9Ob01lbW9yeQorICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb249cHl0aG9uMzYuUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uCisgIFB5RXJyX09jY3VycmVkPXB5dGhvbjM2LlB5RXJyX09jY3VycmVkCisgIFB5RXJyX1ByaW50PXB5dGhvbjM2LlB5RXJyX1ByaW50CisgIFB5RXJyX1ByaW50RXg9cHl0aG9uMzYuUHlFcnJfUHJpbnRFeAorICBQeUVycl9Qcm9ncmFtVGV4dD1weXRob24zNi5QeUVycl9Qcm9ncmFtVGV4dAorICBQeUVycl9SZXN0b3JlPXB5dGhvbjM2LlB5RXJyX1Jlc3RvcmUKKyAgUHlFcnJfU2V0RnJvbUVycm5vPXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJubworICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU9cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lCisgIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdD1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QKKyAgUHlFcnJfU2V0SW50ZXJydXB0PXB5dGhvbjM2LlB5RXJyX1NldEludGVycnVwdAorICBQeUVycl9TZXROb25lPXB5dGhvbjM2LlB5RXJyX1NldE5vbmUKKyAgUHlFcnJfU2V0T2JqZWN0PXB5dGhvbjM2LlB5RXJyX1NldE9iamVjdAorICBQeUVycl9TZXRTdHJpbmc9cHl0aG9uMzYuUHlFcnJfU2V0U3RyaW5nCisgIFB5RXJyX1N5bnRheExvY2F0aW9uPXB5dGhvbjM2LlB5RXJyX1N5bnRheExvY2F0aW9uCisgIFB5RXJyX1dhcm5FeD1weXRob24zNi5QeUVycl9XYXJuRXgKKyAgUHlFcnJfV2FybkV4cGxpY2l0PXB5dGhvbjM2LlB5RXJyX1dhcm5FeHBsaWNpdAorICBQeUVycl9XYXJuRm9ybWF0PXB5dGhvbjM2LlB5RXJyX1dhcm5Gb3JtYXQKKyAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlPXB5dGhvbjM2LlB5RXJyX1dyaXRlVW5yYWlzYWJsZQorICBQeUV2YWxfQWNxdWlyZUxvY2s9cHl0aG9uMzYuUHlFdmFsX0FjcXVpcmVMb2NrCisgIFB5RXZhbF9BY3F1aXJlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9BY3F1aXJlVGhyZWFkCisgIFB5RXZhbF9DYWxsRnVuY3Rpb249cHl0aG9uMzYuUHlFdmFsX0NhbGxGdW5jdGlvbgorICBQeUV2YWxfQ2FsbE1ldGhvZD1weXRob24zNi5QeUV2YWxfQ2FsbE1ldGhvZAorICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcz1weXRob24zNi5QeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcworICBQeUV2YWxfRXZhbENvZGU9cHl0aG9uMzYuUHlFdmFsX0V2YWxDb2RlCisgIFB5RXZhbF9FdmFsQ29kZUV4PXB5dGhvbjM2LlB5RXZhbF9FdmFsQ29kZUV4CisgIFB5RXZhbF9FdmFsRnJhbWU9cHl0aG9uMzYuUHlFdmFsX0V2YWxGcmFtZQorICBQeUV2YWxfRXZhbEZyYW1lRXg9cHl0aG9uMzYuUHlFdmFsX0V2YWxGcmFtZUV4CisgIFB5RXZhbF9HZXRCdWlsdGlucz1weXRob24zNi5QeUV2YWxfR2V0QnVpbHRpbnMKKyAgUHlFdmFsX0dldENhbGxTdGF0cz1weXRob24zNi5QeUV2YWxfR2V0Q2FsbFN0YXRzCisgIFB5RXZhbF9HZXRGcmFtZT1weXRob24zNi5QeUV2YWxfR2V0RnJhbWUKKyAgUHlFdmFsX0dldEZ1bmNEZXNjPXB5dGhvbjM2LlB5RXZhbF9HZXRGdW5jRGVzYworICBQeUV2YWxfR2V0RnVuY05hbWU9cHl0aG9uMzYuUHlFdmFsX0dldEZ1bmNOYW1lCisgIFB5RXZhbF9HZXRHbG9iYWxzPXB5dGhvbjM2LlB5RXZhbF9HZXRHbG9iYWxzCisgIFB5RXZhbF9HZXRMb2NhbHM9cHl0aG9uMzYuUHlFdmFsX0dldExvY2FscworICBQeUV2YWxfSW5pdFRocmVhZHM9cHl0aG9uMzYuUHlFdmFsX0luaXRUaHJlYWRzCisgIFB5RXZhbF9SZUluaXRUaHJlYWRzPXB5dGhvbjM2LlB5RXZhbF9SZUluaXRUaHJlYWRzCisgIFB5RXZhbF9SZWxlYXNlTG9jaz1weXRob24zNi5QeUV2YWxfUmVsZWFzZUxvY2sKKyAgUHlFdmFsX1JlbGVhc2VUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1JlbGVhc2VUaHJlYWQKKyAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1Jlc3RvcmVUaHJlYWQKKyAgUHlFdmFsX1NhdmVUaHJlYWQ9cHl0aG9uMzYuUHlFdmFsX1NhdmVUaHJlYWQKKyAgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZD1weXRob24zNi5QeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkCisgIFB5RXhjX0FyaXRobWV0aWNFcnJvcj1weXRob24zNi5QeUV4Y19Bcml0aG1ldGljRXJyb3IgREFUQQorICBQeUV4Y19Bc3NlcnRpb25FcnJvcj1weXRob24zNi5QeUV4Y19Bc3NlcnRpb25FcnJvciBEQVRBCisgIFB5RXhjX0F0dHJpYnV0ZUVycm9yPXB5dGhvbjM2LlB5RXhjX0F0dHJpYnV0ZUVycm9yIERBVEEKKyAgUHlFeGNfQmFzZUV4Y2VwdGlvbj1weXRob24zNi5QeUV4Y19CYXNlRXhjZXB0aW9uIERBVEEKKyAgUHlFeGNfQnVmZmVyRXJyb3I9cHl0aG9uMzYuUHlFeGNfQnVmZmVyRXJyb3IgREFUQQorICBQeUV4Y19CeXRlc1dhcm5pbmc9cHl0aG9uMzYuUHlFeGNfQnl0ZXNXYXJuaW5nIERBVEEKKyAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCisgIFB5RXhjX0VPRkVycm9yPXB5dGhvbjM2LlB5RXhjX0VPRkVycm9yIERBVEEKKyAgUHlFeGNfRW52aXJvbm1lbnRFcnJvcj1weXRob24zNi5QeUV4Y19FbnZpcm9ubWVudEVycm9yIERBVEEKKyAgUHlFeGNfRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXhjX0V4Y2VwdGlvbiBEQVRBCisgIFB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvcj1weXRob24zNi5QeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IgREFUQQorICBQeUV4Y19GdXR1cmVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0Z1dHVyZVdhcm5pbmcgREFUQQorICBQeUV4Y19HZW5lcmF0b3JFeGl0PXB5dGhvbjM2LlB5RXhjX0dlbmVyYXRvckV4aXQgREFUQQorICBQeUV4Y19JT0Vycm9yPXB5dGhvbjM2LlB5RXhjX0lPRXJyb3IgREFUQQorICBQeUV4Y19JbXBvcnRFcnJvcj1weXRob24zNi5QeUV4Y19JbXBvcnRFcnJvciBEQVRBCisgIFB5RXhjX0ltcG9ydFdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfSW1wb3J0V2FybmluZyBEQVRBCisgIFB5RXhjX0luZGVudGF0aW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfSW5kZW50YXRpb25FcnJvciBEQVRBCisgIFB5RXhjX0luZGV4RXJyb3I9cHl0aG9uMzYuUHlFeGNfSW5kZXhFcnJvciBEQVRBCisgIFB5RXhjX0tleUVycm9yPXB5dGhvbjM2LlB5RXhjX0tleUVycm9yIERBVEEKKyAgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ9cHl0aG9uMzYuUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQgREFUQQorICBQeUV4Y19Mb29rdXBFcnJvcj1weXRob24zNi5QeUV4Y19Mb29rdXBFcnJvciBEQVRBCisgIFB5RXhjX01lbW9yeUVycm9yPXB5dGhvbjM2LlB5RXhjX01lbW9yeUVycm9yIERBVEEKKyAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0PXB5dGhvbjM2LlB5RXhjX01lbW9yeUVycm9ySW5zdCBEQVRBCisgIFB5RXhjX05hbWVFcnJvcj1weXRob24zNi5QeUV4Y19OYW1lRXJyb3IgREFUQQorICBQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yPXB5dGhvbjM2LlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IgREFUQQorICBQeUV4Y19PU0Vycm9yPXB5dGhvbjM2LlB5RXhjX09TRXJyb3IgREFUQQorICBQeUV4Y19PdmVyZmxvd0Vycm9yPXB5dGhvbjM2LlB5RXhjX092ZXJmbG93RXJyb3IgREFUQQorICBQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgREFUQQorICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q9cHl0aG9uMzYuUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0IERBVEEKKyAgUHlFeGNfUmVmZXJlbmNlRXJyb3I9cHl0aG9uMzYuUHlFeGNfUmVmZXJlbmNlRXJyb3IgREFUQQorICBQeUV4Y19SdW50aW1lRXJyb3I9cHl0aG9uMzYuUHlFeGNfUnVudGltZUVycm9yIERBVEEKKyAgUHlFeGNfUnVudGltZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfUnVudGltZVdhcm5pbmcgREFUQQorICBQeUV4Y19TdG9wSXRlcmF0aW9uPXB5dGhvbjM2LlB5RXhjX1N0b3BJdGVyYXRpb24gREFUQQorICBQeUV4Y19TeW50YXhFcnJvcj1weXRob24zNi5QeUV4Y19TeW50YXhFcnJvciBEQVRBCisgIFB5RXhjX1N5bnRheFdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfU3ludGF4V2FybmluZyBEQVRBCisgIFB5RXhjX1N5c3RlbUVycm9yPXB5dGhvbjM2LlB5RXhjX1N5c3RlbUVycm9yIERBVEEKKyAgUHlFeGNfU3lzdGVtRXhpdD1weXRob24zNi5QeUV4Y19TeXN0ZW1FeGl0IERBVEEKKyAgUHlFeGNfVGFiRXJyb3I9cHl0aG9uMzYuUHlFeGNfVGFiRXJyb3IgREFUQQorICBQeUV4Y19UeXBlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVHlwZUVycm9yIERBVEEKKyAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZURlY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZVdhcm5pbmc9cHl0aG9uMzYuUHlFeGNfVW5pY29kZVdhcm5pbmcgREFUQQorICBQeUV4Y19Vc2VyV2FybmluZz1weXRob24zNi5QeUV4Y19Vc2VyV2FybmluZyBEQVRBCisgIFB5RXhjX1ZhbHVlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVmFsdWVFcnJvciBEQVRBCisgIFB5RXhjX1dhcm5pbmc9cHl0aG9uMzYuUHlFeGNfV2FybmluZyBEQVRBCisgIFB5RXhjX1plcm9EaXZpc2lvbkVycm9yPXB5dGhvbjM2LlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIERBVEEKKyAgUHlFeGNlcHRpb25fR2V0Q2F1c2U9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0Q2F1c2UKKyAgUHlFeGNlcHRpb25fR2V0Q29udGV4dD1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRDb250ZXh0CisgIFB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaz1weXRob24zNi5QeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2sKKyAgUHlFeGNlcHRpb25fU2V0Q2F1c2U9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0Q2F1c2UKKyAgUHlFeGNlcHRpb25fU2V0Q29udGV4dD1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRDb250ZXh0CisgIFB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaz1weXRob24zNi5QeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sKKyAgUHlGaWxlX0Zyb21GZD1weXRob24zNi5QeUZpbGVfRnJvbUZkCisgIFB5RmlsZV9HZXRMaW5lPXB5dGhvbjM2LlB5RmlsZV9HZXRMaW5lCisgIFB5RmlsZV9Xcml0ZU9iamVjdD1weXRob24zNi5QeUZpbGVfV3JpdGVPYmplY3QKKyAgUHlGaWxlX1dyaXRlU3RyaW5nPXB5dGhvbjM2LlB5RmlsZV9Xcml0ZVN0cmluZworICBQeUZpbHRlcl9UeXBlPXB5dGhvbjM2LlB5RmlsdGVyX1R5cGUgREFUQQorICBQeUZsb2F0X0FzRG91YmxlPXB5dGhvbjM2LlB5RmxvYXRfQXNEb3VibGUKKyAgUHlGbG9hdF9Gcm9tRG91YmxlPXB5dGhvbjM2LlB5RmxvYXRfRnJvbURvdWJsZQorICBQeUZsb2F0X0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlGbG9hdF9Gcm9tU3RyaW5nCisgIFB5RmxvYXRfR2V0SW5mbz1weXRob24zNi5QeUZsb2F0X0dldEluZm8KKyAgUHlGbG9hdF9HZXRNYXg9cHl0aG9uMzYuUHlGbG9hdF9HZXRNYXgKKyAgUHlGbG9hdF9HZXRNaW49cHl0aG9uMzYuUHlGbG9hdF9HZXRNaW4KKyAgUHlGbG9hdF9UeXBlPXB5dGhvbjM2LlB5RmxvYXRfVHlwZSBEQVRBCisgIFB5RnJvemVuU2V0X05ldz1weXRob24zNi5QeUZyb3plblNldF9OZXcKKyAgUHlGcm96ZW5TZXRfVHlwZT1weXRob24zNi5QeUZyb3plblNldF9UeXBlIERBVEEKKyAgUHlHQ19Db2xsZWN0PXB5dGhvbjM2LlB5R0NfQ29sbGVjdAorICBQeUdJTFN0YXRlX0Vuc3VyZT1weXRob24zNi5QeUdJTFN0YXRlX0Vuc3VyZQorICBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZT1weXRob24zNi5QeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZQorICBQeUdJTFN0YXRlX1JlbGVhc2U9cHl0aG9uMzYuUHlHSUxTdGF0ZV9SZWxlYXNlCisgIFB5R2V0U2V0RGVzY3JfVHlwZT1weXRob24zNi5QeUdldFNldERlc2NyX1R5cGUgREFUQQorICBQeUltcG9ydF9BZGRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfQWRkTW9kdWxlCisgIFB5SW1wb3J0X0FwcGVuZEluaXR0YWI9cHl0aG9uMzYuUHlJbXBvcnRfQXBwZW5kSW5pdHRhYgorICBQeUltcG9ydF9DbGVhbnVwPXB5dGhvbjM2LlB5SW1wb3J0X0NsZWFudXAKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUKKyAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeD1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4CisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcz1weXRob24zNi5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXMKKyAgUHlJbXBvcnRfR2V0SW1wb3J0ZXI9cHl0aG9uMzYuUHlJbXBvcnRfR2V0SW1wb3J0ZXIKKyAgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXI9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIKKyAgUHlJbXBvcnRfR2V0TWFnaWNUYWc9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TWFnaWNUYWcKKyAgUHlJbXBvcnRfR2V0TW9kdWxlRGljdD1weXRob24zNi5QeUltcG9ydF9HZXRNb2R1bGVEaWN0CisgIFB5SW1wb3J0X0ltcG9ydD1weXRob24zNi5QeUltcG9ydF9JbXBvcnQKKyAgUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZQorICBQeUltcG9ydF9JbXBvcnRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsCisgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2s9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jaworICBQeUltcG9ydF9SZWxvYWRNb2R1bGU9cHl0aG9uMzYuUHlJbXBvcnRfUmVsb2FkTW9kdWxlCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcj1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfQ2xlYXIKKyAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZT1weXRob24zNi5QeUludGVycHJldGVyU3RhdGVfRGVsZXRlCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXc9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX05ldworICBQeUl0ZXJfTmV4dD1weXRob24zNi5QeUl0ZXJfTmV4dAorICBQeUxpc3RJdGVyX1R5cGU9cHl0aG9uMzYuUHlMaXN0SXRlcl9UeXBlIERBVEEKKyAgUHlMaXN0UmV2SXRlcl9UeXBlPXB5dGhvbjM2LlB5TGlzdFJldkl0ZXJfVHlwZSBEQVRBCisgIFB5TGlzdF9BcHBlbmQ9cHl0aG9uMzYuUHlMaXN0X0FwcGVuZAorICBQeUxpc3RfQXNUdXBsZT1weXRob24zNi5QeUxpc3RfQXNUdXBsZQorICBQeUxpc3RfR2V0SXRlbT1weXRob24zNi5QeUxpc3RfR2V0SXRlbQorICBQeUxpc3RfR2V0U2xpY2U9cHl0aG9uMzYuUHlMaXN0X0dldFNsaWNlCisgIFB5TGlzdF9JbnNlcnQ9cHl0aG9uMzYuUHlMaXN0X0luc2VydAorICBQeUxpc3RfTmV3PXB5dGhvbjM2LlB5TGlzdF9OZXcKKyAgUHlMaXN0X1JldmVyc2U9cHl0aG9uMzYuUHlMaXN0X1JldmVyc2UKKyAgUHlMaXN0X1NldEl0ZW09cHl0aG9uMzYuUHlMaXN0X1NldEl0ZW0KKyAgUHlMaXN0X1NldFNsaWNlPXB5dGhvbjM2LlB5TGlzdF9TZXRTbGljZQorICBQeUxpc3RfU2l6ZT1weXRob24zNi5QeUxpc3RfU2l6ZQorICBQeUxpc3RfU29ydD1weXRob24zNi5QeUxpc3RfU29ydAorICBQeUxpc3RfVHlwZT1weXRob24zNi5QeUxpc3RfVHlwZSBEQVRBCisgIFB5TG9uZ1JhbmdlSXRlcl9UeXBlPXB5dGhvbjM2LlB5TG9uZ1JhbmdlSXRlcl9UeXBlIERBVEEKKyAgUHlMb25nX0FzRG91YmxlPXB5dGhvbjM2LlB5TG9uZ19Bc0RvdWJsZQorICBQeUxvbmdfQXNMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmcKKyAgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdworICBQeUxvbmdfQXNMb25nTG9uZz1weXRob24zNi5QeUxvbmdfQXNMb25nTG9uZworICBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM2LlB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cKKyAgUHlMb25nX0FzU2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Bc1NpemVfdAorICBQeUxvbmdfQXNTc2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Bc1NzaXplX3QKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZworICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2s9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrCisgIFB5TG9uZ19Bc1ZvaWRQdHI9cHl0aG9uMzYuUHlMb25nX0FzVm9pZFB0cgorICBQeUxvbmdfRnJvbURvdWJsZT1weXRob24zNi5QeUxvbmdfRnJvbURvdWJsZQorICBQeUxvbmdfRnJvbUxvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21Mb25nCisgIFB5TG9uZ19Gcm9tTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21Mb25nTG9uZworICBQeUxvbmdfRnJvbVNpemVfdD1weXRob24zNi5QeUxvbmdfRnJvbVNpemVfdAorICBQeUxvbmdfRnJvbVNzaXplX3Q9cHl0aG9uMzYuUHlMb25nX0Zyb21Tc2l6ZV90CisgIFB5TG9uZ19Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tU3RyaW5nCisgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nCisgIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKKyAgUHlMb25nX0Zyb21Wb2lkUHRyPXB5dGhvbjM2LlB5TG9uZ19Gcm9tVm9pZFB0cgorICBQeUxvbmdfR2V0SW5mbz1weXRob24zNi5QeUxvbmdfR2V0SW5mbworICBQeUxvbmdfVHlwZT1weXRob24zNi5QeUxvbmdfVHlwZSBEQVRBCisgIFB5TWFwX1R5cGU9cHl0aG9uMzYuUHlNYXBfVHlwZSBEQVRBCisgIFB5TWFwcGluZ19DaGVjaz1weXRob24zNi5QeU1hcHBpbmdfQ2hlY2sKKyAgUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcKKyAgUHlNYXBwaW5nX0hhc0tleT1weXRob24zNi5QeU1hcHBpbmdfSGFzS2V5CisgIFB5TWFwcGluZ19IYXNLZXlTdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX0hhc0tleVN0cmluZworICBQeU1hcHBpbmdfSXRlbXM9cHl0aG9uMzYuUHlNYXBwaW5nX0l0ZW1zCisgIFB5TWFwcGluZ19LZXlzPXB5dGhvbjM2LlB5TWFwcGluZ19LZXlzCisgIFB5TWFwcGluZ19MZW5ndGg9cHl0aG9uMzYuUHlNYXBwaW5nX0xlbmd0aAorICBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZz1weXRob24zNi5QeU1hcHBpbmdfU2V0SXRlbVN0cmluZworICBQeU1hcHBpbmdfU2l6ZT1weXRob24zNi5QeU1hcHBpbmdfU2l6ZQorICBQeU1hcHBpbmdfVmFsdWVzPXB5dGhvbjM2LlB5TWFwcGluZ19WYWx1ZXMKKyAgUHlNZW1fRnJlZT1weXRob24zNi5QeU1lbV9GcmVlCisgIFB5TWVtX01hbGxvYz1weXRob24zNi5QeU1lbV9NYWxsb2MKKyAgUHlNZW1fUmVhbGxvYz1weXRob24zNi5QeU1lbV9SZWFsbG9jCisgIFB5TWVtYmVyRGVzY3JfVHlwZT1weXRob24zNi5QeU1lbWJlckRlc2NyX1R5cGUgREFUQQorICBQeU1lbW9yeVZpZXdfRnJvbU9iamVjdD1weXRob24zNi5QeU1lbW9yeVZpZXdfRnJvbU9iamVjdAorICBQeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cz1weXRob24zNi5QeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cworICBQeU1lbW9yeVZpZXdfVHlwZT1weXRob24zNi5QeU1lbW9yeVZpZXdfVHlwZSBEQVRBCisgIFB5TWV0aG9kRGVzY3JfVHlwZT1weXRob24zNi5QeU1ldGhvZERlc2NyX1R5cGUgREFUQQorICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudD1weXRob24zNi5QeU1vZHVsZV9BZGRJbnRDb25zdGFudAorICBQeU1vZHVsZV9BZGRPYmplY3Q9cHl0aG9uMzYuUHlNb2R1bGVfQWRkT2JqZWN0CisgIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50PXB5dGhvbjM2LlB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50CisgIFB5TW9kdWxlX0NyZWF0ZTI9cHl0aG9uMzYuUHlNb2R1bGVfQ3JlYXRlMgorICBQeU1vZHVsZV9HZXREZWY9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RGVmCisgIFB5TW9kdWxlX0dldERpY3Q9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RGljdAorICBQeU1vZHVsZV9HZXRGaWxlbmFtZT1weXRob24zNi5QeU1vZHVsZV9HZXRGaWxlbmFtZQorICBQeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdD1weXRob24zNi5QeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdAorICBQeU1vZHVsZV9HZXROYW1lPXB5dGhvbjM2LlB5TW9kdWxlX0dldE5hbWUKKyAgUHlNb2R1bGVfR2V0U3RhdGU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0U3RhdGUKKyAgUHlNb2R1bGVfTmV3PXB5dGhvbjM2LlB5TW9kdWxlX05ldworICBQeU1vZHVsZV9UeXBlPXB5dGhvbjM2LlB5TW9kdWxlX1R5cGUgREFUQQorICBQeU1vZHVsZURlZl9Jbml0PXB5dGhvbjM2LlB5TW9kdWxlRGVmX0luaXQKKyAgUHlNb2R1bGVEZWZfVHlwZT1weXRob24zNi5QeU1vZHVsZURlZl9UeXBlIERBVEEKKyAgUHlOdWxsSW1wb3J0ZXJfVHlwZT1weXRob24zNi5QeU51bGxJbXBvcnRlcl9UeXBlIERBVEEKKyAgUHlOdW1iZXJfQWJzb2x1dGU9cHl0aG9uMzYuUHlOdW1iZXJfQWJzb2x1dGUKKyAgUHlOdW1iZXJfQWRkPXB5dGhvbjM2LlB5TnVtYmVyX0FkZAorICBQeU51bWJlcl9BbmQ9cHl0aG9uMzYuUHlOdW1iZXJfQW5kCisgIFB5TnVtYmVyX0FzU3NpemVfdD1weXRob24zNi5QeU51bWJlcl9Bc1NzaXplX3QKKyAgUHlOdW1iZXJfQ2hlY2s9cHl0aG9uMzYuUHlOdW1iZXJfQ2hlY2sKKyAgUHlOdW1iZXJfRGl2bW9kPXB5dGhvbjM2LlB5TnVtYmVyX0Rpdm1vZAorICBQeU51bWJlcl9GbG9hdD1weXRob24zNi5QeU51bWJlcl9GbG9hdAorICBQeU51bWJlcl9GbG9vckRpdmlkZT1weXRob24zNi5QeU51bWJlcl9GbG9vckRpdmlkZQorICBQeU51bWJlcl9JblBsYWNlQWRkPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VBZGQKKyAgUHlOdW1iZXJfSW5QbGFjZUFuZD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlQW5kCisgIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZUxzaGlmdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlTHNoaWZ0CisgIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlTXVsdGlwbHkKKyAgUHlOdW1iZXJfSW5QbGFjZU9yPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VPcgorICBQeU51bWJlcl9JblBsYWNlUG93ZXI9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVBvd2VyCisgIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcgorICBQeU51bWJlcl9JblBsYWNlUnNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VSc2hpZnQKKyAgUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0PXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdAorICBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZT1weXRob24zNi5QeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZQorICBQeU51bWJlcl9JblBsYWNlWG9yPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VYb3IKKyAgUHlOdW1iZXJfSW5kZXg9cHl0aG9uMzYuUHlOdW1iZXJfSW5kZXgKKyAgUHlOdW1iZXJfSW52ZXJ0PXB5dGhvbjM2LlB5TnVtYmVyX0ludmVydAorICBQeU51bWJlcl9Mb25nPXB5dGhvbjM2LlB5TnVtYmVyX0xvbmcKKyAgUHlOdW1iZXJfTHNoaWZ0PXB5dGhvbjM2LlB5TnVtYmVyX0xzaGlmdAorICBQeU51bWJlcl9NdWx0aXBseT1weXRob24zNi5QeU51bWJlcl9NdWx0aXBseQorICBQeU51bWJlcl9OZWdhdGl2ZT1weXRob24zNi5QeU51bWJlcl9OZWdhdGl2ZQorICBQeU51bWJlcl9Pcj1weXRob24zNi5QeU51bWJlcl9PcgorICBQeU51bWJlcl9Qb3NpdGl2ZT1weXRob24zNi5QeU51bWJlcl9Qb3NpdGl2ZQorICBQeU51bWJlcl9Qb3dlcj1weXRob24zNi5QeU51bWJlcl9Qb3dlcgorICBQeU51bWJlcl9SZW1haW5kZXI9cHl0aG9uMzYuUHlOdW1iZXJfUmVtYWluZGVyCisgIFB5TnVtYmVyX1JzaGlmdD1weXRob24zNi5QeU51bWJlcl9Sc2hpZnQKKyAgUHlOdW1iZXJfU3VidHJhY3Q9cHl0aG9uMzYuUHlOdW1iZXJfU3VidHJhY3QKKyAgUHlOdW1iZXJfVG9CYXNlPXB5dGhvbjM2LlB5TnVtYmVyX1RvQmFzZQorICBQeU51bWJlcl9UcnVlRGl2aWRlPXB5dGhvbjM2LlB5TnVtYmVyX1RydWVEaXZpZGUKKyAgUHlOdW1iZXJfWG9yPXB5dGhvbjM2LlB5TnVtYmVyX1hvcgorICBQeU9TX0FmdGVyRm9yaz1weXRob24zNi5QeU9TX0FmdGVyRm9yaworICBQeU9TX0luaXRJbnRlcnJ1cHRzPXB5dGhvbjM2LlB5T1NfSW5pdEludGVycnVwdHMKKyAgUHlPU19JbnB1dEhvb2s9cHl0aG9uMzYuUHlPU19JbnB1dEhvb2sgREFUQQorICBQeU9TX0ludGVycnVwdE9jY3VycmVkPXB5dGhvbjM2LlB5T1NfSW50ZXJydXB0T2NjdXJyZWQKKyAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcj1weXRob24zNi5QeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyIERBVEEKKyAgUHlPU19kb3VibGVfdG9fc3RyaW5nPXB5dGhvbjM2LlB5T1NfZG91YmxlX3RvX3N0cmluZworICBQeU9TX2dldHNpZz1weXRob24zNi5QeU9TX2dldHNpZworICBQeU9TX215c3RyaWNtcD1weXRob24zNi5QeU9TX215c3RyaWNtcAorICBQeU9TX215c3RybmljbXA9cHl0aG9uMzYuUHlPU19teXN0cm5pY21wCisgIFB5T1Nfc2V0c2lnPXB5dGhvbjM2LlB5T1Nfc2V0c2lnCisgIFB5T1Nfc25wcmludGY9cHl0aG9uMzYuUHlPU19zbnByaW50ZgorICBQeU9TX3N0cmluZ190b19kb3VibGU9cHl0aG9uMzYuUHlPU19zdHJpbmdfdG9fZG91YmxlCisgIFB5T1Nfc3RydG9sPXB5dGhvbjM2LlB5T1Nfc3RydG9sCisgIFB5T1Nfc3RydG91bD1weXRob24zNi5QeU9TX3N0cnRvdWwKKyAgUHlPU192c25wcmludGY9cHl0aG9uMzYuUHlPU192c25wcmludGYKKyAgUHlPYmplY3RfQVNDSUk9cHl0aG9uMzYuUHlPYmplY3RfQVNDSUkKKyAgUHlPYmplY3RfQXNDaGFyQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzQ2hhckJ1ZmZlcgorICBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yPXB5dGhvbjM2LlB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IKKyAgUHlPYmplY3RfQXNSZWFkQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzUmVhZEJ1ZmZlcgorICBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0FzV3JpdGVCdWZmZXIKKyAgUHlPYmplY3RfQnl0ZXM9cHl0aG9uMzYuUHlPYmplY3RfQnl0ZXMKKyAgUHlPYmplY3RfQ2FsbD1weXRob24zNi5QeU9iamVjdF9DYWxsCisgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbj1weXRob24zNi5QeU9iamVjdF9DYWxsRnVuY3Rpb24KKyAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncz1weXRob24zNi5QeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzCisgIFB5T2JqZWN0X0NhbGxNZXRob2Q9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE1ldGhvZAorICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncz1weXRob24zNi5QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncworICBQeU9iamVjdF9DYWxsT2JqZWN0PXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxPYmplY3QKKyAgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyPXB5dGhvbjM2LlB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcgorICBQeU9iamVjdF9DbGVhcldlYWtSZWZzPXB5dGhvbjM2LlB5T2JqZWN0X0NsZWFyV2Vha1JlZnMKKyAgUHlPYmplY3RfRGVsSXRlbT1weXRob24zNi5QeU9iamVjdF9EZWxJdGVtCisgIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfRGVsSXRlbVN0cmluZworICBQeU9iamVjdF9EaXI9cHl0aG9uMzYuUHlPYmplY3RfRGlyCisgIFB5T2JqZWN0X0Zvcm1hdD1weXRob24zNi5QeU9iamVjdF9Gb3JtYXQKKyAgUHlPYmplY3RfRnJlZT1weXRob24zNi5QeU9iamVjdF9GcmVlCisgIFB5T2JqZWN0X0dDX0RlbD1weXRob24zNi5QeU9iamVjdF9HQ19EZWwKKyAgUHlPYmplY3RfR0NfVHJhY2s9cHl0aG9uMzYuUHlPYmplY3RfR0NfVHJhY2sKKyAgUHlPYmplY3RfR0NfVW5UcmFjaz1weXRob24zNi5QeU9iamVjdF9HQ19VblRyYWNrCisgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyCisgIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyCisgIFB5T2JqZWN0X0dldEF0dHI9cHl0aG9uMzYuUHlPYmplY3RfR2V0QXR0cgorICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0dldEF0dHJTdHJpbmcKKyAgUHlPYmplY3RfR2V0SXRlbT1weXRob24zNi5QeU9iamVjdF9HZXRJdGVtCisgIFB5T2JqZWN0X0dldEl0ZXI9cHl0aG9uMzYuUHlPYmplY3RfR2V0SXRlcgorICBQeU9iamVjdF9IYXNBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0hhc0F0dHIKKyAgUHlPYmplY3RfSGFzQXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9IYXNBdHRyU3RyaW5nCisgIFB5T2JqZWN0X0hhc2g9cHl0aG9uMzYuUHlPYmplY3RfSGFzaAorICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ9cHl0aG9uMzYuUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkCisgIFB5T2JqZWN0X0luaXQ9cHl0aG9uMzYuUHlPYmplY3RfSW5pdAorICBQeU9iamVjdF9Jbml0VmFyPXB5dGhvbjM2LlB5T2JqZWN0X0luaXRWYXIKKyAgUHlPYmplY3RfSXNJbnN0YW5jZT1weXRob24zNi5QeU9iamVjdF9Jc0luc3RhbmNlCisgIFB5T2JqZWN0X0lzU3ViY2xhc3M9cHl0aG9uMzYuUHlPYmplY3RfSXNTdWJjbGFzcworICBQeU9iamVjdF9Jc1RydWU9cHl0aG9uMzYuUHlPYmplY3RfSXNUcnVlCisgIFB5T2JqZWN0X0xlbmd0aD1weXRob24zNi5QeU9iamVjdF9MZW5ndGgKKyAgUHlPYmplY3RfTWFsbG9jPXB5dGhvbjM2LlB5T2JqZWN0X01hbGxvYworICBQeU9iamVjdF9Ob3Q9cHl0aG9uMzYuUHlPYmplY3RfTm90CisgIFB5T2JqZWN0X1JlYWxsb2M9cHl0aG9uMzYuUHlPYmplY3RfUmVhbGxvYworICBQeU9iamVjdF9SZXByPXB5dGhvbjM2LlB5T2JqZWN0X1JlcHIKKyAgUHlPYmplY3RfUmljaENvbXBhcmU9cHl0aG9uMzYuUHlPYmplY3RfUmljaENvbXBhcmUKKyAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sPXB5dGhvbjM2LlB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbAorICBQeU9iamVjdF9TZWxmSXRlcj1weXRob24zNi5QeU9iamVjdF9TZWxmSXRlcgorICBQeU9iamVjdF9TZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X1NldEF0dHIKKyAgUHlPYmplY3RfU2V0QXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9TZXRBdHRyU3RyaW5nCisgIFB5T2JqZWN0X1NldEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfU2V0SXRlbQorICBQeU9iamVjdF9TaXplPXB5dGhvbjM2LlB5T2JqZWN0X1NpemUKKyAgUHlPYmplY3RfU3RyPXB5dGhvbjM2LlB5T2JqZWN0X1N0cgorICBQeU9iamVjdF9UeXBlPXB5dGhvbjM2LlB5T2JqZWN0X1R5cGUgREFUQQorICBQeU9EaWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlPRGljdF9EZWxJdGVtCisgIFB5T0RpY3RfTmV3PXB5dGhvbjM2LlB5T0RpY3RfTmV3CisgIFB5T0RpY3RfU2V0SXRlbT1weXRob24zNi5QeU9EaWN0X1NldEl0ZW0KKyAgUHlPRGljdF9UeXBlPXB5dGhvbjM2LlB5T0RpY3RfVHlwZSBEQVRBCisgIFB5T0RpY3RJdGVtc19UeXBlPXB5dGhvbjM2LlB5T0RpY3RJdGVtc19UeXBlIERBVEEKKyAgUHlPRGljdEl0ZXJfVHlwZT1weXRob24zNi5QeU9EaWN0SXRlcl9UeXBlIERBVEEKKyAgUHlPRGljdEtleXNfVHlwZT1weXRob24zNi5QeU9EaWN0S2V5c19UeXBlIERBVEEKKyAgUHlPRGljdFZhbHVlc19UeXBlPXB5dGhvbjM2LlB5T0RpY3RWYWx1ZXNfVHlwZSBEQVRBCisgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzPXB5dGhvbjM2LlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzCisgIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3M9cHl0aG9uMzYuUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncworICBQeVByb3BlcnR5X1R5cGU9cHl0aG9uMzYuUHlQcm9wZXJ0eV9UeXBlIERBVEEKKyAgUHlSYW5nZUl0ZXJfVHlwZT1weXRob24zNi5QeVJhbmdlSXRlcl9UeXBlIERBVEEKKyAgUHlSYW5nZV9UeXBlPXB5dGhvbjM2LlB5UmFuZ2VfVHlwZSBEQVRBCisgIFB5UmV2ZXJzZWRfVHlwZT1weXRob24zNi5QeVJldmVyc2VkX1R5cGUgREFUQQorICBQeVNlcUl0ZXJfTmV3PXB5dGhvbjM2LlB5U2VxSXRlcl9OZXcKKyAgUHlTZXFJdGVyX1R5cGU9cHl0aG9uMzYuUHlTZXFJdGVyX1R5cGUgREFUQQorICBQeVNlcXVlbmNlX0NoZWNrPXB5dGhvbjM2LlB5U2VxdWVuY2VfQ2hlY2sKKyAgUHlTZXF1ZW5jZV9Db25jYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db25jYXQKKyAgUHlTZXF1ZW5jZV9Db250YWlucz1weXRob24zNi5QeVNlcXVlbmNlX0NvbnRhaW5zCisgIFB5U2VxdWVuY2VfQ291bnQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db3VudAorICBQeVNlcXVlbmNlX0RlbEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9EZWxJdGVtCisgIFB5U2VxdWVuY2VfRGVsU2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9EZWxTbGljZQorICBQeVNlcXVlbmNlX0Zhc3Q9cHl0aG9uMzYuUHlTZXF1ZW5jZV9GYXN0CisgIFB5U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNi5QeVNlcXVlbmNlX0dldEl0ZW0KKyAgUHlTZXF1ZW5jZV9HZXRTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX0dldFNsaWNlCisgIFB5U2VxdWVuY2VfSW49cHl0aG9uMzYuUHlTZXF1ZW5jZV9JbgorICBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0CisgIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdD1weXRob24zNi5QeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQKKyAgUHlTZXF1ZW5jZV9JbmRleD1weXRob24zNi5QeVNlcXVlbmNlX0luZGV4CisgIFB5U2VxdWVuY2VfTGVuZ3RoPXB5dGhvbjM2LlB5U2VxdWVuY2VfTGVuZ3RoCisgIFB5U2VxdWVuY2VfTGlzdD1weXRob24zNi5QeVNlcXVlbmNlX0xpc3QKKyAgUHlTZXF1ZW5jZV9SZXBlYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9SZXBlYXQKKyAgUHlTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2V0SXRlbQorICBQeVNlcXVlbmNlX1NldFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2V0U2xpY2UKKyAgUHlTZXF1ZW5jZV9TaXplPXB5dGhvbjM2LlB5U2VxdWVuY2VfU2l6ZQorICBQeVNlcXVlbmNlX1R1cGxlPXB5dGhvbjM2LlB5U2VxdWVuY2VfVHVwbGUKKyAgUHlTZXRJdGVyX1R5cGU9cHl0aG9uMzYuUHlTZXRJdGVyX1R5cGUgREFUQQorICBQeVNldF9BZGQ9cHl0aG9uMzYuUHlTZXRfQWRkCisgIFB5U2V0X0NsZWFyPXB5dGhvbjM2LlB5U2V0X0NsZWFyCisgIFB5U2V0X0NvbnRhaW5zPXB5dGhvbjM2LlB5U2V0X0NvbnRhaW5zCisgIFB5U2V0X0Rpc2NhcmQ9cHl0aG9uMzYuUHlTZXRfRGlzY2FyZAorICBQeVNldF9OZXc9cHl0aG9uMzYuUHlTZXRfTmV3CisgIFB5U2V0X1BvcD1weXRob24zNi5QeVNldF9Qb3AKKyAgUHlTZXRfU2l6ZT1weXRob24zNi5QeVNldF9TaXplCisgIFB5U2V0X1R5cGU9cHl0aG9uMzYuUHlTZXRfVHlwZSBEQVRBCisgIFB5U2xpY2VfR2V0SW5kaWNlcz1weXRob24zNi5QeVNsaWNlX0dldEluZGljZXMKKyAgUHlTbGljZV9HZXRJbmRpY2VzRXg9cHl0aG9uMzYuUHlTbGljZV9HZXRJbmRpY2VzRXgKKyAgUHlTbGljZV9OZXc9cHl0aG9uMzYuUHlTbGljZV9OZXcKKyAgUHlTbGljZV9UeXBlPXB5dGhvbjM2LlB5U2xpY2VfVHlwZSBEQVRBCisgIFB5U29ydFdyYXBwZXJfVHlwZT1weXRob24zNi5QeVNvcnRXcmFwcGVyX1R5cGUgREFUQQorICBQeVN0YXRlX0ZpbmRNb2R1bGU9cHl0aG9uMzYuUHlTdGF0ZV9GaW5kTW9kdWxlCisgIFB5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfQWRkTW9kdWxlCisgIFB5U3RhdGVfUmVtb3ZlTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfUmVtb3ZlTW9kdWxlCisgIFB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW0KKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXc9cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZQorICBQeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtCisgIFB5U3VwZXJfVHlwZT1weXRob24zNi5QeVN1cGVyX1R5cGUgREFUQQorICBQeVN5c19BZGRXYXJuT3B0aW9uPXB5dGhvbjM2LlB5U3lzX0FkZFdhcm5PcHRpb24KKyAgUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGU9cHl0aG9uMzYuUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGUKKyAgUHlTeXNfRm9ybWF0U3RkZXJyPXB5dGhvbjM2LlB5U3lzX0Zvcm1hdFN0ZGVycgorICBQeVN5c19Gb3JtYXRTdGRvdXQ9cHl0aG9uMzYuUHlTeXNfRm9ybWF0U3Rkb3V0CisgIFB5U3lzX0dldE9iamVjdD1weXRob24zNi5QeVN5c19HZXRPYmplY3QKKyAgUHlTeXNfSGFzV2Fybk9wdGlvbnM9cHl0aG9uMzYuUHlTeXNfSGFzV2Fybk9wdGlvbnMKKyAgUHlTeXNfUmVzZXRXYXJuT3B0aW9ucz1weXRob24zNi5QeVN5c19SZXNldFdhcm5PcHRpb25zCisgIFB5U3lzX1NldEFyZ3Y9cHl0aG9uMzYuUHlTeXNfU2V0QXJndgorICBQeVN5c19TZXRBcmd2RXg9cHl0aG9uMzYuUHlTeXNfU2V0QXJndkV4CisgIFB5U3lzX1NldE9iamVjdD1weXRob24zNi5QeVN5c19TZXRPYmplY3QKKyAgUHlTeXNfU2V0UGF0aD1weXRob24zNi5QeVN5c19TZXRQYXRoCisgIFB5U3lzX1dyaXRlU3RkZXJyPXB5dGhvbjM2LlB5U3lzX1dyaXRlU3RkZXJyCisgIFB5U3lzX1dyaXRlU3Rkb3V0PXB5dGhvbjM2LlB5U3lzX1dyaXRlU3Rkb3V0CisgIFB5VGhyZWFkU3RhdGVfQ2xlYXI9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9DbGVhcgorICBQeVRocmVhZFN0YXRlX0RlbGV0ZT1weXRob24zNi5QeVRocmVhZFN0YXRlX0RlbGV0ZQorICBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50CisgIFB5VGhyZWFkU3RhdGVfR2V0PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfR2V0CisgIFB5VGhyZWFkU3RhdGVfR2V0RGljdD1weXRob24zNi5QeVRocmVhZFN0YXRlX0dldERpY3QKKyAgUHlUaHJlYWRTdGF0ZV9OZXc9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9OZXcKKyAgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yz1weXRob24zNi5QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjCisgIFB5VGhyZWFkU3RhdGVfU3dhcD1weXRob24zNi5QeVRocmVhZFN0YXRlX1N3YXAKKyAgUHlUcmFjZUJhY2tfSGVyZT1weXRob24zNi5QeVRyYWNlQmFja19IZXJlCisgIFB5VHJhY2VCYWNrX1ByaW50PXB5dGhvbjM2LlB5VHJhY2VCYWNrX1ByaW50CisgIFB5VHJhY2VCYWNrX1R5cGU9cHl0aG9uMzYuUHlUcmFjZUJhY2tfVHlwZSBEQVRBCisgIFB5VHVwbGVJdGVyX1R5cGU9cHl0aG9uMzYuUHlUdXBsZUl0ZXJfVHlwZSBEQVRBCisgIFB5VHVwbGVfQ2xlYXJGcmVlTGlzdD1weXRob24zNi5QeVR1cGxlX0NsZWFyRnJlZUxpc3QKKyAgUHlUdXBsZV9HZXRJdGVtPXB5dGhvbjM2LlB5VHVwbGVfR2V0SXRlbQorICBQeVR1cGxlX0dldFNsaWNlPXB5dGhvbjM2LlB5VHVwbGVfR2V0U2xpY2UKKyAgUHlUdXBsZV9OZXc9cHl0aG9uMzYuUHlUdXBsZV9OZXcKKyAgUHlUdXBsZV9QYWNrPXB5dGhvbjM2LlB5VHVwbGVfUGFjaworICBQeVR1cGxlX1NldEl0ZW09cHl0aG9uMzYuUHlUdXBsZV9TZXRJdGVtCisgIFB5VHVwbGVfU2l6ZT1weXRob24zNi5QeVR1cGxlX1NpemUKKyAgUHlUdXBsZV9UeXBlPXB5dGhvbjM2LlB5VHVwbGVfVHlwZSBEQVRBCisgIFB5VHlwZV9DbGVhckNhY2hlPXB5dGhvbjM2LlB5VHlwZV9DbGVhckNhY2hlCisgIFB5VHlwZV9Gcm9tU3BlYz1weXRob24zNi5QeVR5cGVfRnJvbVNwZWMKKyAgUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzPXB5dGhvbjM2LlB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcworICBQeVR5cGVfR2VuZXJpY0FsbG9jPXB5dGhvbjM2LlB5VHlwZV9HZW5lcmljQWxsb2MKKyAgUHlUeXBlX0dlbmVyaWNOZXc9cHl0aG9uMzYuUHlUeXBlX0dlbmVyaWNOZXcKKyAgUHlUeXBlX0dldEZsYWdzPXB5dGhvbjM2LlB5VHlwZV9HZXRGbGFncworICBQeVR5cGVfR2V0U2xvdD1weXRob24zNi5QeVR5cGVfR2V0U2xvdAorICBQeVR5cGVfSXNTdWJ0eXBlPXB5dGhvbjM2LlB5VHlwZV9Jc1N1YnR5cGUKKyAgUHlUeXBlX01vZGlmaWVkPXB5dGhvbjM2LlB5VHlwZV9Nb2RpZmllZAorICBQeVR5cGVfUmVhZHk9cHl0aG9uMzYuUHlUeXBlX1JlYWR5CisgIFB5VHlwZV9UeXBlPXB5dGhvbjM2LlB5VHlwZV9UeXBlIERBVEEKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZQorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZworICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZUl0ZXJfVHlwZT1weXRob24zNi5QeVVuaWNvZGVJdGVyX1R5cGUgREFUQQorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbgorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24KKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQKKyAgUHlVbmljb2RlX0FwcGVuZD1weXRob24zNi5QeVVuaWNvZGVfQXBwZW5kCisgIFB5VW5pY29kZV9BcHBlbmRBbmREZWw9cHl0aG9uMzYuUHlVbmljb2RlX0FwcGVuZEFuZERlbAorICBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNBU0NJSVN0cmluZworICBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcKKyAgUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0CisgIFB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlCisgIFB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdAorICBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcKKyAgUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGUKKyAgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0xhdGluMVN0cmluZworICBQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcKKyAgUHlVbmljb2RlX0FzVVRGOFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNVVEY4U3RyaW5nCisgIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZworICBQeVVuaWNvZGVfQXNXaWRlQ2hhcj1weXRob24zNi5QeVVuaWNvZGVfQXNXaWRlQ2hhcgorICBQeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdD1weXRob24zNi5QeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdAorICBQeVVuaWNvZGVfQ29tcGFyZT1weXRob24zNi5QeVVuaWNvZGVfQ29tcGFyZQorICBQeVVuaWNvZGVfQ29uY2F0PXB5dGhvbjM2LlB5VW5pY29kZV9Db25jYXQKKyAgUHlVbmljb2RlX0NvbnRhaW5zPXB5dGhvbjM2LlB5VW5pY29kZV9Db250YWlucworICBQeVVuaWNvZGVfQ291bnQ9cHl0aG9uMzYuUHlVbmljb2RlX0NvdW50CisgIFB5VW5pY29kZV9EZWNvZGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZQorICBQeVVuaWNvZGVfRGVjb2RlQVNDSUk9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUFTQ0lJCisgIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVDaGFybWFwCisgIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQ9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdAorICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZQorICBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVMYXRpbjEKKyAgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUKKyAgUHlVbmljb2RlX0RlY29kZVVURjE2PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYxNgorICBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVVRGMzI9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjMyCisgIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsCisgIFB5VW5pY29kZV9EZWNvZGVVVEY4PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY4CisgIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZQorICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXI9cHl0aG9uMzYuUHlVbmljb2RlX0ZTQ29udmVydGVyCisgIFB5VW5pY29kZV9GU0RlY29kZXI9cHl0aG9uMzYuUHlVbmljb2RlX0ZTRGVjb2RlcgorICBQeVVuaWNvZGVfRmluZD1weXRob24zNi5QeVVuaWNvZGVfRmluZAorICBQeVVuaWNvZGVfRm9ybWF0PXB5dGhvbjM2LlB5VW5pY29kZV9Gb3JtYXQKKyAgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdAorICBQeVVuaWNvZGVfRnJvbUZvcm1hdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbUZvcm1hdAorICBQeVVuaWNvZGVfRnJvbUZvcm1hdFY9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21Gb3JtYXRWCisgIFB5VW5pY29kZV9Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tT2JqZWN0CisgIFB5VW5pY29kZV9Gcm9tT3JkaW5hbD1weXRob24zNi5QeVVuaWNvZGVfRnJvbU9yZGluYWwKKyAgUHlVbmljb2RlX0Zyb21TdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21TdHJpbmcKKyAgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQorICBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tV2lkZUNoYXIKKyAgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nCisgIFB5VW5pY29kZV9HZXRTaXplPXB5dGhvbjM2LlB5VW5pY29kZV9HZXRTaXplCisgIFB5VW5pY29kZV9Jc0lkZW50aWZpZXI9cHl0aG9uMzYuUHlVbmljb2RlX0lzSWRlbnRpZmllcgorICBQeVVuaWNvZGVfSm9pbj1weXRob24zNi5QeVVuaWNvZGVfSm9pbgorICBQeVVuaWNvZGVfUGFydGl0aW9uPXB5dGhvbjM2LlB5VW5pY29kZV9QYXJ0aXRpb24KKyAgUHlVbmljb2RlX1JQYXJ0aXRpb249cHl0aG9uMzYuUHlVbmljb2RlX1JQYXJ0aXRpb24KKyAgUHlVbmljb2RlX1JTcGxpdD1weXRob24zNi5QeVVuaWNvZGVfUlNwbGl0CisgIFB5VW5pY29kZV9SZXBsYWNlPXB5dGhvbjM2LlB5VW5pY29kZV9SZXBsYWNlCisgIFB5VW5pY29kZV9SZXNpemU9cHl0aG9uMzYuUHlVbmljb2RlX1Jlc2l6ZQorICBQeVVuaWNvZGVfUmljaENvbXBhcmU9cHl0aG9uMzYuUHlVbmljb2RlX1JpY2hDb21wYXJlCisgIFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZworICBQeVVuaWNvZGVfU3BsaXQ9cHl0aG9uMzYuUHlVbmljb2RlX1NwbGl0CisgIFB5VW5pY29kZV9TcGxpdGxpbmVzPXB5dGhvbjM2LlB5VW5pY29kZV9TcGxpdGxpbmVzCisgIFB5VW5pY29kZV9UYWlsbWF0Y2g9cHl0aG9uMzYuUHlVbmljb2RlX1RhaWxtYXRjaAorICBQeVVuaWNvZGVfVHJhbnNsYXRlPXB5dGhvbjM2LlB5VW5pY29kZV9UcmFuc2xhdGUKKyAgUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXA9cHl0aG9uMzYuUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXAKKyAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcKKyAgUHlVbmljb2RlX0RlY29kZVVURjc9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjcKKyAgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsCisgIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQ9cHl0aG9uMzYuUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdAorICBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZworICBQeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWw9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkltbW9ydGFsCisgIFB5VW5pY29kZV9JbnRlcm5JblBsYWNlPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5JblBsYWNlCisgIFB5VW5pY29kZV9UeXBlPXB5dGhvbjM2LlB5VW5pY29kZV9UeXBlIERBVEEKKyAgUHlXZWFrcmVmX0dldE9iamVjdD1weXRob24zNi5QeVdlYWtyZWZfR2V0T2JqZWN0IERBVEEKKyAgUHlXZWFrcmVmX05ld1Byb3h5PXB5dGhvbjM2LlB5V2Vha3JlZl9OZXdQcm94eQorICBQeVdlYWtyZWZfTmV3UmVmPXB5dGhvbjM2LlB5V2Vha3JlZl9OZXdSZWYKKyAgUHlXcmFwcGVyRGVzY3JfVHlwZT1weXRob24zNi5QeVdyYXBwZXJEZXNjcl9UeXBlIERBVEEKKyAgUHlXcmFwcGVyX05ldz1weXRob24zNi5QeVdyYXBwZXJfTmV3CisgIFB5WmlwX1R5cGU9cHl0aG9uMzYuUHlaaXBfVHlwZSBEQVRBCisgIFB5X0FkZFBlbmRpbmdDYWxsPXB5dGhvbjM2LlB5X0FkZFBlbmRpbmdDYWxsCisgIFB5X0F0RXhpdD1weXRob24zNi5QeV9BdEV4aXQKKyAgUHlfQnVpbGRWYWx1ZT1weXRob24zNi5QeV9CdWlsZFZhbHVlCisgIFB5X0NvbXBpbGVTdHJpbmc9cHl0aG9uMzYuUHlfQ29tcGlsZVN0cmluZworICBQeV9EZWNSZWY9cHl0aG9uMzYuUHlfRGVjUmVmCisgIFB5X0VuZEludGVycHJldGVyPXB5dGhvbjM2LlB5X0VuZEludGVycHJldGVyCisgIFB5X0V4aXQ9cHl0aG9uMzYuUHlfRXhpdAorICBQeV9GYXRhbEVycm9yPXB5dGhvbjM2LlB5X0ZhdGFsRXJyb3IKKyAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNi5QeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKKyAgUHlfRmluYWxpemU9cHl0aG9uMzYuUHlfRmluYWxpemUKKyAgUHlfRmluYWxpemVFeD1weXRob24zNi5QeV9GaW5hbGl6ZUV4CisgIFB5X0dldEJ1aWxkSW5mbz1weXRob24zNi5QeV9HZXRCdWlsZEluZm8KKyAgUHlfR2V0Q29tcGlsZXI9cHl0aG9uMzYuUHlfR2V0Q29tcGlsZXIKKyAgUHlfR2V0Q29weXJpZ2h0PXB5dGhvbjM2LlB5X0dldENvcHlyaWdodAorICBQeV9HZXRFeGVjUHJlZml4PXB5dGhvbjM2LlB5X0dldEV4ZWNQcmVmaXgKKyAgUHlfR2V0UGF0aD1weXRob24zNi5QeV9HZXRQYXRoCisgIFB5X0dldFBsYXRmb3JtPXB5dGhvbjM2LlB5X0dldFBsYXRmb3JtCisgIFB5X0dldFByZWZpeD1weXRob24zNi5QeV9HZXRQcmVmaXgKKyAgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoPXB5dGhvbjM2LlB5X0dldFByb2dyYW1GdWxsUGF0aAorICBQeV9HZXRQcm9ncmFtTmFtZT1weXRob24zNi5QeV9HZXRQcm9ncmFtTmFtZQorICBQeV9HZXRQeXRob25Ib21lPXB5dGhvbjM2LlB5X0dldFB5dGhvbkhvbWUKKyAgUHlfR2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuUHlfR2V0UmVjdXJzaW9uTGltaXQKKyAgUHlfR2V0VmVyc2lvbj1weXRob24zNi5QeV9HZXRWZXJzaW9uCisgIFB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCisgIFB5X0luY1JlZj1weXRob24zNi5QeV9JbmNSZWYKKyAgUHlfSW5pdGlhbGl6ZT1weXRob24zNi5QeV9Jbml0aWFsaXplCisgIFB5X0luaXRpYWxpemVFeD1weXRob24zNi5QeV9Jbml0aWFsaXplRXgKKyAgUHlfSXNJbml0aWFsaXplZD1weXRob24zNi5QeV9Jc0luaXRpYWxpemVkCisgIFB5X01haW49cHl0aG9uMzYuUHlfTWFpbgorICBQeV9NYWtlUGVuZGluZ0NhbGxzPXB5dGhvbjM2LlB5X01ha2VQZW5kaW5nQ2FsbHMKKyAgUHlfTmV3SW50ZXJwcmV0ZXI9cHl0aG9uMzYuUHlfTmV3SW50ZXJwcmV0ZXIKKyAgUHlfUmVwckVudGVyPXB5dGhvbjM2LlB5X1JlcHJFbnRlcgorICBQeV9SZXByTGVhdmU9cHl0aG9uMzYuUHlfUmVwckxlYXZlCisgIFB5X1NldFByb2dyYW1OYW1lPXB5dGhvbjM2LlB5X1NldFByb2dyYW1OYW1lCisgIFB5X1NldFB5dGhvbkhvbWU9cHl0aG9uMzYuUHlfU2V0UHl0aG9uSG9tZQorICBQeV9TZXRSZWN1cnNpb25MaW1pdD1weXRob24zNi5QeV9TZXRSZWN1cnNpb25MaW1pdAorICBQeV9TeW10YWJsZVN0cmluZz1weXRob24zNi5QeV9TeW10YWJsZVN0cmluZworICBQeV9WYUJ1aWxkVmFsdWU9cHl0aG9uMzYuUHlfVmFCdWlsZFZhbHVlCisgIF9QeUVycl9CYWRJbnRlcm5hbENhbGw9cHl0aG9uMzYuX1B5RXJyX0JhZEludGVybmFsQ2FsbAorICBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUPXB5dGhvbjM2Ll9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKKyAgX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQ9cHl0aG9uMzYuX1B5T2JqZWN0X0NhbGxNZXRob2RfU2l6ZVQKKyAgX1B5T2JqZWN0X0dDX01hbGxvYz1weXRob24zNi5fUHlPYmplY3RfR0NfTWFsbG9jCisgIF9QeU9iamVjdF9HQ19OZXc9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX05ldworICBfUHlPYmplY3RfR0NfTmV3VmFyPXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19OZXdWYXIKKyAgX1B5T2JqZWN0X0dDX1Jlc2l6ZT1weXRob24zNi5fUHlPYmplY3RfR0NfUmVzaXplCisgIF9QeU9iamVjdF9OZXc9cHl0aG9uMzYuX1B5T2JqZWN0X05ldworICBfUHlPYmplY3RfTmV3VmFyPXB5dGhvbjM2Ll9QeU9iamVjdF9OZXdWYXIKKyAgX1B5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM2Ll9QeVN0YXRlX0FkZE1vZHVsZQorICBfUHlUaHJlYWRTdGF0ZV9Jbml0PXB5dGhvbjM2Ll9QeVRocmVhZFN0YXRlX0luaXQKKyAgX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2M9cHl0aG9uMzYuX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MKKyAgX1B5VHJhc2hfZGVsZXRlX2xhdGVyPXB5dGhvbjM2Ll9QeVRyYXNoX2RlbGV0ZV9sYXRlciBEQVRBCisgIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nPXB5dGhvbjM2Ll9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIERBVEEKKyAgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3Q9cHl0aG9uMzYuX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QKKyAgX1B5VHJhc2hfZGVzdHJveV9jaGFpbj1weXRob24zNi5fUHlUcmFzaF9kZXN0cm95X2NoYWluCisgIF9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGU9cHl0aG9uMzYuX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSBEQVRBCisgIF9QeVdlYWtyZWZfUHJveHlUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfUHJveHlUeXBlIERBVEEKKyAgX1B5V2Vha3JlZl9SZWZUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfUmVmVHlwZSBEQVRBCisgIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9CdWlsZFZhbHVlX1NpemVUCisgIF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2Ll9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0IERBVEEKKyAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbD1weXRob24zNi5fUHlfQ2hlY2tSZWN1cnNpdmVDYWxsCisgIF9QeV9EZWFsbG9jPXB5dGhvbjM2Ll9QeV9EZWFsbG9jCisgIF9QeV9FbGxpcHNpc09iamVjdD1weXRob24zNi5fUHlfRWxsaXBzaXNPYmplY3QgREFUQQorICBfUHlfRmFsc2VTdHJ1Y3Q9cHl0aG9uMzYuX1B5X0ZhbHNlU3RydWN0IERBVEEKKyAgX1B5X05vbmVTdHJ1Y3Q9cHl0aG9uMzYuX1B5X05vbmVTdHJ1Y3QgREFUQQorICBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3Q9cHl0aG9uMzYuX1B5X05vdEltcGxlbWVudGVkU3RydWN0IERBVEEKKyAgX1B5X1N3YXBwZWRPcD1weXRob24zNi5fUHlfU3dhcHBlZE9wIERBVEEKKyAgX1B5X1RydWVTdHJ1Y3Q9cHl0aG9uMzYuX1B5X1RydWVTdHJ1Y3QgREFUQQorICBfUHlfVmFCdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM2Ll9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZV9TaXplVAorICBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VUdXBsZV9TaXplVAorICBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyAgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1ZhUGFyc2VfU2l6ZVQKKyAgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAorICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfQnVpbGRWYWx1ZV9TaXplVApkaWZmIC0tZ2l0IGEvUEMvdGVzdHB5LnB5IGIvUEMvdGVzdHB5LnB5CmluZGV4IDRlZjNkNGYuLjcwOWYzNWMgMTAwNjQ0Ci0tLSBhL1BDL3Rlc3RweS5weQorKysgYi9QQy90ZXN0cHkucHkKQEAgLTI2LDUgKzI2LDUgQEAKICAgICAgICAgICAgICMgQWRkIHRoZSAidGVzdCIgZGlyZWN0b3J5IHRvIFBZVEhPTlBBVEguCiAgICAgICAgICAgICBzeXMucGF0aCA9IHN5cy5wYXRoICsgW3Rlc3RdCiAKLWltcG9ydCByZWdydGVzdCAjIFN0YW5kYXJkIFB5dGhvbiB0ZXN0ZXIuCi1yZWdydGVzdC5tYWluKCkKK2ltcG9ydCBsaWJyZWdydGVzdCAjIFN0YW5kYXJkIFB5dGhvbiB0ZXN0ZXIuCitsaWJyZWdydGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL1BDL3dpbnJlZy5jIGIvUEMvd2lucmVnLmMKaW5kZXggZDFjM2YzOS4uMjkzODI1ZCAxMDA2NDQKLS0tIGEvUEMvd2lucmVnLmMKKysrIGIvUEMvd2lucmVnLmMKQEAgLTU0OSw3ICs1NDksNyBAQAogICAgICAgICAgICAgaWYgKHZhbHVlICE9IFB5X05vbmUgJiYgIVB5TG9uZ19DaGVjayh2YWx1ZSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhEV09SRCwgMSk7Ci0gICAgICAgICAgICBpZiAoKnJldERhdGFCdWY9PU5VTEwpeworICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpewogICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgICAgICAgfQpAQCAtNTYzLDYgKzU2MywyNCBAQAogICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJmQsIHNpemVvZihEV09SRCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX1FXT1JEOgorICAgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQ2NCwgMSk7CisgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CisgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSBzaXplb2YoRFdPUkQ2NCk7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIERXT1JENjQgemVybyA9IDA7CisgICAgICAgICAgICAgICAgbWVtY3B5KCpyZXREYXRhQnVmLCAmemVybywgc2l6ZW9mKERXT1JENjQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIERXT1JENjQgZCA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOworICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJmQsIHNpemVvZihEV09SRDY0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRUdfU1o6CiAgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKICAgICAgICAgICAgIHsKQEAgLTYxOSw3ICs2MzcsNyBAQAogICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSA9IHNpemUgKyAyOwogICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXREYXRhU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICAgICB9CkBAIC02NjUsNyArNjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogCiAgICAgICAgICAgICAgICAgKnJldERhdGFCdWYgPSAoQllURSAqKVB5TWVtX05FVyhjaGFyLCB2aWV3Lmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgICAgICBpZiAoKnJldERhdGFCdWYgPT0gTlVMTCl7CiAgICAgICAgICAgICAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC02OTAsNyArNzA4LDEzIEBACiAgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkKICAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygwKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKGludCAqKXJldERhdGFCdWYpOworICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCooRFdPUkQgKilyZXREYXRhQnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19RV09SRDoKKyAgICAgICAgICAgIGlmIChyZXREYXRhU2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIG9iRGF0YSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZygwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoKihEV09SRDY0ICopcmV0RGF0YUJ1Zik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRUdfU1o6CiAgICAgICAgIGNhc2UgUkVHX0VYUEFORF9TWjoKQEAgLTE1OTksNyArMTYyMyw3IEBACiAgICAgICAgIEFuIGludGVnZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdGhlIGRhdGEsIG9uZSBvZjoKICAgICAgICAgUkVHX0JJTkFSWSAtLSBCaW5hcnkgZGF0YSBpbiBhbnkgZm9ybS4KICAgICAgICAgUkVHX0RXT1JEIC0tIEEgMzItYml0IG51bWJlci4KLSAgICAgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LgorICAgICAgICBSRUdfRFdPUkRfTElUVExFX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX0RXT1JECiAgICAgICAgIFJFR19EV09SRF9CSUdfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBiaWctZW5kaWFuIGZvcm1hdC4KICAgICAgICAgUkVHX0VYUEFORF9TWiAtLSBBIG51bGwtdGVybWluYXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB1bmV4cGFuZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKGZvciBleGFtcGxlLApAQCAtMTYwOSw2ICsxNjMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHR3byBudWxsIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgUHl0aG9uIGhhbmRsZXMKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVybWluYXRpb24gYXV0b21hdGljYWxseS4KICAgICAgICAgUkVHX05PTkUgLS0gTm8gZGVmaW5lZCB2YWx1ZSB0eXBlLgorICAgICAgICBSRUdfUVdPUkQgLS0gQSA2NC1iaXQgbnVtYmVyLgorICAgICAgICBSRUdfUVdPUkRfTElUVExFX0VORElBTiAtLSBBIDY0LWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX1FXT1JELgogICAgICAgICBSRUdfUkVTT1VSQ0VfTElTVCAtLSBBIGRldmljZS1kcml2ZXIgcmVzb3VyY2UgbGlzdC4KICAgICAgICAgUkVHX1NaIC0tIEEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KICAgICB2YWx1ZTogb2JqZWN0CkBAIC0xNjMxLDcgKzE2NTcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHdpbnJlZ19TZXRWYWx1ZUV4X2ltcGwoUHlNb2R1bGVEZWYgKm1vZHVsZSwgSEtFWSBrZXksIFB5X1VOSUNPREUgKnZhbHVlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpyZXNlcnZlZCwgRFdPUkQgdHlwZSwgUHlPYmplY3QgKnZhbHVlKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVhMDkyYTkzNWMzNjE1ODIgaW5wdXQ9ZjFiMTZjYmNjM2VkNDEwMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVhMDkyYTkzNWMzNjE1ODIgaW5wdXQ9OTAwYTllMzk5MGJmYjE5Nl0qLwogewogICAgIEJZVEUgKmRhdGE7CiAgICAgRFdPUkQgbGVuOwpAQCAtMTkxOCw2ICsxOTQ0LDggQEAKICAgICBBRERfSU5UKFJFR19EV09SRCk7CiAgICAgQUREX0lOVChSRUdfRFdPUkRfTElUVExFX0VORElBTik7CiAgICAgQUREX0lOVChSRUdfRFdPUkRfQklHX0VORElBTik7CisgICAgQUREX0lOVChSRUdfUVdPUkQpOworICAgIEFERF9JTlQoUkVHX1FXT1JEX0xJVFRMRV9FTkRJQU4pOwogICAgIEFERF9JTlQoUkVHX0xJTkspOwogICAgIEFERF9JTlQoUkVHX01VTFRJX1NaKTsKICAgICBBRERfSU5UKFJFR19SRVNPVVJDRV9MSVNUKTsKZGlmZiAtLWdpdCBhL1BDYnVpbGQvYnVpbGRfcGdvLmJhdCBiL1BDYnVpbGQvYnVpbGRfcGdvLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyYzM4Mi4uMDAwMDAwMAotLS0gYS9QQ2J1aWxkL2J1aWxkX3Bnby5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUBlY2hvIG9mZg0KLWVjaG8uRGVwcmVjYXRpb25XYXJuaW5nOg0KLWVjaG8uICAgIFRoaXMgc2NyaXB0IGlzIGRlcHJlY2F0ZWQsIHVzZSBgYnVpbGQuYmF0IC0tcGdvYCBpbnN0ZWFkLg0KLWVjaG8uDQotDQotY2FsbCAiJX5kcDBidWlsZC5iYXQiIC0tcGdvICUqDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAppbmRleCAxYmU3M2U2Li4yZjQxYWU4IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdAorKysgYi9QQ2J1aWxkL3ByZXBhcmVfc3NsLmJhdApAQCAtMywxMCArMywxMCBAQAogICBpZiAiJTEiIEVRVSAiRGVidWciICgNCiAgICAgc2hpZnQNCiAgICAgc2V0IEhPU1RfUFlUSE9OPXB5dGhvbl9kLmV4ZQ0KLSAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzVfZC5kbGwgZXhpdCAxDQorICAgIGlmIG5vdCBleGlzdCBweXRob24zNl9kLmRsbCBleGl0IDENCiAgICkgRUxTRSAoDQogICAgIHNldCBIT1NUX1BZVEhPTj1weXRob24uZXhlDQotICAgIGlmIG5vdCBleGlzdCBweXRob24zNS5kbGwgZXhpdCAxDQorICAgIGlmIG5vdCBleGlzdCBweXRob24zNi5kbGwgZXhpdCAxDQogICApDQogKQ0KICVIT1NUX1BZVEhPTiUgIiV+ZHAwcHJlcGFyZV9zc2wucHkiICUxDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ogYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvagppbmRleCAzYTFiNWJhLi45ZGZlOWUzIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvagorKysgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvagpAQCAtMTI0LDYgKzEyNCw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9kaWN0b2JqZWN0LmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9wY29kZS5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc2RlZnMuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3Ntb2R1bGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGFyc2V0b2suaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGF0Y2hsZXZlbC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwZ2VuLmgiIC8+CkBAIC0yMDksNiArMjEwLDcgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblxjb25kdmFyLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25caW1wb3J0ZGwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx0aHJlYWRfbnQuaCIgLz4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx3b3JkY29kZV9oZWxwZXJzLmgiIC8+CiAgIDwvSXRlbUdyb3VwPgogICA8SXRlbUdyb3VwPgogICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5cTW9kdWxlc1xfYmlzZWN0bW9kdWxlLmMiIC8+CkBAIC00MTYsNCArNDE4LDQgQEAKICAgPFRhcmdldCBOYW1lPSJfV2FybkFib3V0VG9vbHNldCIgQmVmb3JlVGFyZ2V0cz0iUHJlcGFyZUZvckJ1aWxkIiBDb25kaXRpb249IiQoUGxhdGZvcm1Ub29sc2V0KSAhPSAndjE0MCciPgogICAgIDxXYXJuaW5nIFRleHQ9IlRvb2xzZXQgJChQbGF0Zm9ybVRvb2xzZXQpIGlzIG5vdCB1c2VkIGZvciBvZmZpY2lhbCBidWlsZHMuIFlvdXIgYnVpbGQgbWF5IGhhdmUgZXJyb3JzIG9yIGluY29tcGF0aWJpbGl0aWVzLiIgLz4KICAgPC9UYXJnZXQ+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycyBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMKaW5kZXggODM3YjczNi4uY2UyZWE2MCAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycworKysgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzCkBAIC0xNzcsNiArMTc3LDkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3NkZWZzLmgiPgogICAgICAgPEZpbHRlcj5JbmNsdWRlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9zbW9kdWxlLmgiPgorICAgICAgPEZpbHRlcj5JbmNsdWRlPC9GaWx0ZXI+CisgICAgPC9DbEluY2x1ZGU+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXHBhcnNldG9rLmgiPgogICAgICAgPEZpbHRlcj5JbmNsdWRlPC9GaWx0ZXI+CiAgICAgPC9DbEluY2x1ZGU+CkBAIC00MjAsNiArNDIzLDkgQEAKICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx0aHJlYWRfbnQuaCI+CiAgICAgICA8RmlsdGVyPlB5dGhvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUHl0aG9uXHdvcmRjb2RlX2hlbHBlcnMuaCI+CisgICAgICA8RmlsdGVyPlB5dGhvbjwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUHl0aG9uXGNvbmR2YXIuaCI+CiAgICAgICA8RmlsdGVyPlB5dGhvbjwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtOTgwLDQgKzk4Niw0IEBACiAgICAgICA8RmlsdGVyPlJlc291cmNlIEZpbGVzPC9GaWx0ZXI+CiAgICAgPC9SZXNvdXJjZUNvbXBpbGU+CiAgIDwvSXRlbUdyb3VwPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcmVhZG1lLnR4dCBiL1BDYnVpbGQvcmVhZG1lLnR4dAppbmRleCBkNDVlYjI3Li4yMDQ2YWY5IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3JlYWRtZS50eHQKKysrIGIvUENidWlsZC9yZWFkbWUudHh0CkBAIC00OCw3ICs0OCw3IEBACiAgICAgVXNlZCB0byBidWlsZCBQeXRob24gd2l0aCBleHRyYSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLCBlcXVpdmFsZW50DQogICAgIHRvIHVzaW5nIC4vY29uZmlndXJlIC0td2l0aC1weWRlYnVnIG9uIFVOSVguICBBbGwgYmluYXJpZXMgYnVpbHQNCiAgICAgdXNpbmcgdGhpcyBjb25maWd1cmF0aW9uIGhhdmUgIl9kIiBhZGRlZCB0byB0aGVpciBuYW1lOg0KLSAgICBweXRob24zNV9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gIEJvdGggdGhlDQorICAgIHB5dGhvbjM2X2QuZGxsLCBweXRob25fZC5leGUsIHBhcnNlcl9kLnB5ZCwgYW5kIHNvIG9uLiAgQm90aCB0aGUNCiAgICAgYnVpbGQgYW5kIHJ0IChydW4gdGVzdCkgYmF0Y2ggZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYWNjZXB0IGEgLWQNCiAgICAgb3B0aW9uIGZvciBkZWJ1ZyBidWlsZHMuICBJZiB5b3UgYXJlIGJ1aWxkaW5nIFB5dGhvbiB0byBoZWxwIHdpdGgNCiAgICAgZGV2ZWxvcG1lbnQgb2YgQ1B5dGhvbiwgeW91IHdpbGwgbW9zdCBsaWtlbHkgdXNlIHRoaXMgY29uZmlndXJhdGlvbi4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3J0LmJhdCBiL1BDYnVpbGQvcnQuYmF0CmluZGV4IDJkOTNiODAuLjdkNGQwNzEgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcnQuYmF0CisrKyBiL1BDYnVpbGQvcnQuYmF0CkBAIC00Miw3ICs0Miw3IEBACiBpZiBOT1QgIiUxIj09IiIgKHNldCByZWdydGVzdGFyZ3M9JXJlZ3J0ZXN0YXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIHNldCBleGU9JXByZWZpeCVweXRob24lc3VmZml4JS5leGUNCi1zZXQgY21kPSIlZXhlJSIgJWRhc2hPJSAtV2QgLUUgLWJiICIlcGNidWlsZCUuLlxsaWJcdGVzdFxyZWdydGVzdC5weSIgJXJlZ3J0ZXN0YXJncyUNCitzZXQgY21kPSIlZXhlJSIgJWRhc2hPJSAtV2QgLUUgLWJiIC1tIHRlc3QgJXJlZ3J0ZXN0YXJncyUNCiBpZiBkZWZpbmVkIHFtb2RlIGdvdG8gUW1vZGUNCiANCiBlY2hvIERlbGV0aW5nIC5weWMvLnB5byBmaWxlcyAuLi4NCmRpZmYgLS1naXQgYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qIGIvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagppbmRleCAwMTQ0ZmE5Li45ZGJkYzc3IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCisrKyBiL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKQEAgLTYyLDcgKzYyLDcgQEAKICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbURlZmluaXRpb25Hcm91cD4KICAgICA8Q2xDb21waWxlPgotICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNTAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPiUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpO1B5X0xJTUlURURfQVBJPTB4MDMwNjAwMDA8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPgogICAgIDwvQ2xDb21waWxlPgogICAgIDxMaW5rPgogICAgICAgPEFkZGl0aW9uYWxEZXBlbmRlbmNpZXM+d3NvY2szMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4KZGlmZiAtLWdpdCBhL1BhcnNlci9QeXRob24uYXNkbCBiL1BhcnNlci9QeXRob24uYXNkbAppbmRleCBjZDA4MzJkLi5hYWRkZjYxIDEwMDY0NAotLS0gYS9QYXJzZXIvUHl0aG9uLmFzZGwKKysrIGIvUGFyc2VyL1B5dGhvbi5hc2RsCkBAIC0xLDQgKzEsOCBAQAotLS0gQVNETCdzIHNpeCBidWlsdGluIHR5cGVzIGFyZSBpZGVudGlmaWVyLCBpbnQsIHN0cmluZywgYnl0ZXMsIG9iamVjdCwgc2luZ2xldG9uCistLSBBU0RMJ3MgNyBidWlsdGluIHR5cGVzIGFyZToKKy0tIGlkZW50aWZpZXIsIGludCwgc3RyaW5nLCBieXRlcywgb2JqZWN0LCBzaW5nbGV0b24sIGNvbnN0YW50CistLQorLS0gc2luZ2xldG9uOiBOb25lLCBUcnVlIG9yIEZhbHNlCistLSBjb25zdGFudCBjYW4gYmUgTm9uZSwgd2hlcmVhcyBOb25lIG1lYW5zICJubyB2YWx1ZSIgZm9yIG9iamVjdC4KIAogbW9kdWxlIFB5dGhvbgogewpAQCAtNzEsOSArNzUsMTIgQEAKICAgICAgICAgIHwgQ2FsbChleHByIGZ1bmMsIGV4cHIqIGFyZ3MsIGtleXdvcmQqIGtleXdvcmRzKQogICAgICAgICAgfCBOdW0ob2JqZWN0IG4pIC0tIGEgbnVtYmVyIGFzIGEgUHlPYmplY3QuCiAgICAgICAgICB8IFN0cihzdHJpbmcgcykgLS0gbmVlZCB0byBzcGVjaWZ5IHJhdywgdW5pY29kZSwgZXRjPworICAgICAgICAgfCBGb3JtYXR0ZWRWYWx1ZShleHByIHZhbHVlLCBpbnQ/IGNvbnZlcnNpb24sIGV4cHI/IGZvcm1hdF9zcGVjKQorICAgICAgICAgfCBKb2luZWRTdHIoZXhwciogdmFsdWVzKQogICAgICAgICAgfCBCeXRlcyhieXRlcyBzKQogICAgICAgICAgfCBOYW1lQ29uc3RhbnQoc2luZ2xldG9uIHZhbHVlKQogICAgICAgICAgfCBFbGxpcHNpcworICAgICAgICAgfCBDb25zdGFudChjb25zdGFudCB2YWx1ZSkKIAogICAgICAgICAgLS0gdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIGNhbiBhcHBlYXIgaW4gYXNzaWdubWVudCBjb250ZXh0CiAgICAgICAgICB8IEF0dHJpYnV0ZShleHByIHZhbHVlLCBpZGVudGlmaWVyIGF0dHIsIGV4cHJfY29udGV4dCBjdHgpCmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbC5weSBiL1BhcnNlci9hc2RsLnB5CmluZGV4IDEyMWNkYWIuLjYyZjVjMTkgMTAwNjQ0Ci0tLSBhL1BhcnNlci9hc2RsLnB5CisrKyBiL1BhcnNlci9hc2RsLnB5CkBAIC0zMyw3ICszMyw4IEBACiAjIFNlZSB0aGUgRUJORiBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlIHRvIHVuZGVyc3RhbmQgdGhlIGxvZ2ljYWwgY29ubmVjdGlvbgogIyBiZXR3ZWVuIHRoZSB2YXJpb3VzIG5vZGUgdHlwZXMuCiAKLWJ1aWx0aW5fdHlwZXMgPSB7J2lkZW50aWZpZXInLCAnc3RyaW5nJywgJ2J5dGVzJywgJ2ludCcsICdvYmplY3QnLCAnc2luZ2xldG9uJ30KK2J1aWx0aW5fdHlwZXMgPSB7J2lkZW50aWZpZXInLCAnc3RyaW5nJywgJ2J5dGVzJywgJ2ludCcsICdvYmplY3QnLCAnc2luZ2xldG9uJywKKyAgICAgICAgICAgICAgICAgJ2NvbnN0YW50J30KIAogY2xhc3MgQVNUOgogICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKZGlmZiAtLWdpdCBhL1BhcnNlci9hc2RsX2MucHkgYi9QYXJzZXIvYXNkbF9jLnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZjM4YzI1My4uMTdjODUxNwotLS0gYS9QYXJzZXIvYXNkbF9jLnB5CisrKyBiL1BhcnNlci9hc2RsX2MucHkKQEAgLTgzNCw2ICs4MzQsNyBAQAogICAgIHJldHVybiAoUHlPYmplY3QqKW87CiB9CiAjZGVmaW5lIGFzdDJvYmpfc2luZ2xldG9uIGFzdDJvYmpfb2JqZWN0CisjZGVmaW5lIGFzdDJvYmpfY29uc3RhbnQgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9pZGVudGlmaWVyIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfc3RyaW5nIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfYnl0ZXMgYXN0Mm9ial9vYmplY3QKQEAgLTg3MSw2ICs4NzIsMTkgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvYmoyYXN0X2NvbnN0YW50KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKK3sKKyAgICBpZiAob2JqKSB7CisgICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGFyZW5hLCBvYmopIDwgMCkgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfQorICAgICpvdXQgPSBvYmo7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgb2JqMmFzdF9pZGVudGlmaWVyKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKIHsKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgJiYgb2JqICE9IFB5X05vbmUpIHsKQEAgLTkwNiw3ICs5MjAsNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpID0gKGludClQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaSA9IF9QeUxvbmdfQXNJbnQob2JqKTsKICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gMTsKICAgICAqb3V0ID0gaTsKZGlmZiAtLWdpdCBhL1BhcnNlci9wYXJzZXIuYyBiL1BhcnNlci9wYXJzZXIuYwppbmRleCA1NmVjNTE0Li40MTA3MmM0IDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2VyLmMKKysrIGIvUGFyc2VyL3BhcnNlci5jCkBAIC0xNDAsMjEgKzE0MCwyMCBAQAogICAgIGludCBuID0gZy0+Z19sbC5sbF9ubGFiZWxzOwogCiAgICAgaWYgKHR5cGUgPT0gTkFNRSkgewotICAgICAgICBjb25zdCBjaGFyICpzID0gc3RyOwogICAgICAgICBsYWJlbCAqbCA9IGctPmdfbGwubGxfbGFiZWw7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSBuOyBpID4gMDsgaS0tLCBsKyspIHsKICAgICAgICAgICAgIGlmIChsLT5sYl90eXBlICE9IE5BTUUgfHwgbC0+bGJfc3RyID09IE5VTEwgfHwKLSAgICAgICAgICAgICAgICBsLT5sYl9zdHJbMF0gIT0gc1swXSB8fAotICAgICAgICAgICAgICAgIHN0cmNtcChsLT5sYl9zdHIsIHMpICE9IDApCisgICAgICAgICAgICAgICAgbC0+bGJfc3RyWzBdICE9IHN0clswXSB8fAorICAgICAgICAgICAgICAgIHN0cmNtcChsLT5sYl9zdHIsIHN0cikgIT0gMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICNpZmRlZiBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKICNpZiAwCiAgICAgICAgICAgICAvKiBMZWF2aW5nIHRoaXMgaW4gYXMgYW4gZXhhbXBsZSAqLwogICAgICAgICAgICAgaWYgKCEocHMtPnBfZmxhZ3MgJiBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNbMF0gPT0gJ3cnICYmIHN0cmNtcChzLCAid2l0aCIpID09IDApCisgICAgICAgICAgICAgICAgaWYgKHN0clswXSA9PSAndycgJiYgc3RyY21wKHN0ciwgIndpdGgiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbm90IGEga2V5d29yZCB5ZXQgKi8KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzWzBdID09ICdhJyAmJiBzdHJjbXAocywgImFzIikgPT0gMCkKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHJbMF0gPT0gJ2EnICYmIHN0cmNtcChzdHIsICJhcyIpID09IDApCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBub3QgYSBrZXl3b3JkIHlldCAqLwogICAgICAgICAgICAgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2V0b2suYyBiL1BhcnNlci9wYXJzZXRvay5jCmluZGV4IDYyOWRlZTUuLmViZTk0OTUgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wYXJzZXRvay5jCisrKyBiL1BhcnNlci9wYXJzZXRvay5jCkBAIC0xNjEsMTAgKzE2MSwxMCBAQAogCiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiAjaWYgMAotc3RhdGljIGNoYXIgd2l0aF9tc2dbXSA9CitzdGF0aWMgY29uc3QgY2hhciB3aXRoX21zZ1tdID0KICIlczolZDogV2FybmluZzogJ3dpdGgnIHdpbGwgYmVjb21lIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBQeXRob24gMi42XG4iOwogCi1zdGF0aWMgY2hhciBhc19tc2dbXSA9CitzdGF0aWMgY29uc3QgY2hhciBhc19tc2dbXSA9CiAiJXM6JWQ6IFdhcm5pbmc6ICdhcycgd2lsbCBiZWNvbWUgYSByZXNlcnZlZCBrZXl3b3JkIGluIFB5dGhvbiAyLjZcbiI7CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbi5jIGIvUGFyc2VyL3BnZW4uYwppbmRleCBmMzAzMWFlLi5iZTM1ZTAyIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbi5jCisrKyBiL1BhcnNlci9wZ2VuLmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiAjaWZkZWYgUHlfREVCVUcKIAotc3RhdGljIGNoYXIgUkVRTkZNVFtdID0gIm1ldGFjb21waWxlOiBsZXNzIHRoYW4gJWQgY2hpbGRyZW5cbiI7CitzdGF0aWMgY29uc3QgY2hhciBSRVFORk1UW10gPSAibWV0YWNvbXBpbGU6IGxlc3MgdGhhbiAlZCBjaGlsZHJlblxuIjsKIAogI2RlZmluZSBSRVFOKGksIGNvdW50KSBkbyB7IFwKICAgICBpZiAoaSA8IGNvdW50KSB7IFwKQEAgLTM3OSw3ICszNzksNyBAQAogCiAvKiBGb3J3YXJkICovCiBzdGF0aWMgdm9pZCBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY29uc3QgY2hhciAqbXNnKTsKIHN0YXRpYyB2b2lkIHNpbXBsaWZ5KGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogc3RhdGljIHZvaWQgY29udmVydChkZmEgKmQsIGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUpOwogCkBAIC00OTQsNyArNDk0LDcgQEAKIAogc3RhdGljIHZvaWQKIHByaW50c3NkZmEoaW50IHh4X25zdGF0ZXMsIHNzX3N0YXRlICp4eF9zdGF0ZSwgaW50IG5iaXRzLAotICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjaGFyICptc2cpCisgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNvbnN0IGNoYXIgKm1zZykKIHsKICAgICBpbnQgaSwgaWJpdCwgaWFyYzsKICAgICBzc19zdGF0ZSAqeXk7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGdlbm1haW4uYyBiL1BhcnNlci9wZ2VubWFpbi5jCmluZGV4IDBmMDU1ZDYuLmU5ZDMwODIgMTAwNjQ0Ci0tLSBhL1BhcnNlci9wZ2VubWFpbi5jCisrKyBiL1BhcnNlci9wZ2VubWFpbi5jCkBAIC0yNyw3ICsyNyw3IEBACiBpbnQgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnOwogCiAvKiBGb3J3YXJkICovCi1ncmFtbWFyICpnZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKTsKK2dyYW1tYXIgKmdldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogCiB2b2lkIFB5X0V4aXQoaW50KSBfUHlfTk9fUkVUVVJOOwogCkBAIC0zNyw2ICszNywxNSBAQAogICAgIGV4aXQoc3RzKTsKIH0KIAorI2lmZGVmIFdJVEhfVEhSRUFECisvKiBOZWVkZWQgYnkgb2JtYWxsb2MuYyAqLworaW50IFB5R0lMU3RhdGVfQ2hlY2sodm9pZCkKK3sgcmV0dXJuIDE7IH0KKyNlbmRpZgorCit2b2lkIF9QeU1lbV9EdW1wVHJhY2ViYWNrKGludCBmZCwgY29uc3Qgdm9pZCAqcHRyKQore30KKwogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKQEAgLTc2LDcgKzg1LDcgQEAKIH0KIAogZ3JhbW1hciAqCi1nZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQorZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBGSUxFICpmcDsKICAgICBub2RlICpuOwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3Rva2VuaXplci5jIGIvUGFyc2VyL3Rva2VuaXplci5jCmluZGV4IDE4NGZmZTcuLjkwYTgyNzAgMTAwNjQ0Ci0tLSBhL1BhcnNlci90b2tlbml6ZXIuYworKysgYi9QYXJzZXIvdG9rZW5pemVyLmMKQEAgLTIwMiw4ICsyMDIsOCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICoKLWdldF9ub3JtYWxfbmFtZShjaGFyICpzKSAgICAgICAgLyogZm9yIHV0Zi04IGFuZCBsYXRpbi0xICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfbm9ybWFsX25hbWUoY29uc3QgY2hhciAqcykgIC8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLwogewogICAgIGNoYXIgYnVmWzEzXTsKICAgICBpbnQgaTsKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7CiAgICAgICAgICAgICAgICAgY2hhciogciA9IG5ld19zdHJpbmcoYmVnaW4sIHQgLSBiZWdpbiwgdG9rKTsKLSAgICAgICAgICAgICAgICBjaGFyKiBxOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHE7CiAgICAgICAgICAgICAgICAgaWYgKCFyKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICBxID0gZ2V0X25vcm1hbF9uYW1lKHIpOwpAQCAtMTQ3NSwxNyArMTQ3NSwxOSBAQAogICAgIG5vbmFzY2lpID0gMDsKICAgICBpZiAoaXNfcG90ZW50aWFsX2lkZW50aWZpZXJfc3RhcnQoYykpIHsKICAgICAgICAgLyogUHJvY2VzcyBiIiIsIHIiIiwgdSIiLCBiciIiIGFuZCByYiIiICovCi0gICAgICAgIGludCBzYXdfYiA9IDAsIHNhd19yID0gMCwgc2F3X3UgPSAwOworICAgICAgICBpbnQgc2F3X2IgPSAwLCBzYXdfciA9IDAsIHNhd191ID0gMCwgc2F3X2YgPSAwOwogICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaWYgKCEoc2F3X2IgfHwgc2F3X3UpICYmIChjID09ICdiJyB8fCBjID09ICdCJykpCisgICAgICAgICAgICBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfZikgJiYgKGMgPT0gJ2InIHx8IGMgPT0gJ0InKSkKICAgICAgICAgICAgICAgICBzYXdfYiA9IDE7CiAgICAgICAgICAgICAvKiBTaW5jZSB0aGlzIGlzIGEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBsaXRlcmFsIHdlIGRvbid0CiAgICAgICAgICAgICAgICB3YW50IHRvIHN1cHBvcnQgaXQgaW4gYXJiaXRyYXJ5IG9yZGVyIGxpa2UgYnl0ZSBsaXRlcmFscy4gKi8KLSAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X3IpICYmIChjID09ICd1JyB8fCBjID09ICdVJykpCisgICAgICAgICAgICBlbHNlIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19yIHx8IHNhd19mKSAmJiAoYyA9PSAndScgfHwgYyA9PSAnVScpKQogICAgICAgICAgICAgICAgIHNhd191ID0gMTsKICAgICAgICAgICAgIC8qIHVyIiIgYW5kIHJ1IiIgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X3IgfHwgc2F3X3UpICYmIChjID09ICdyJyB8fCBjID09ICdSJykpCiAgICAgICAgICAgICAgICAgc2F3X3IgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfZiB8fCBzYXdfYiB8fCBzYXdfdSkgJiYgKGMgPT0gJ2YnIHx8IGMgPT0gJ0YnKSkKKyAgICAgICAgICAgICAgICBzYXdfZiA9IDE7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7CkBAIC0xNTg1LDEwICsxNTg3LDYgQEAKICAgICAgICAgaWYgKGMgPT0gJzAnKSB7CiAgICAgICAgICAgICAvKiBIZXgsIG9jdGFsIG9yIGJpbmFyeSAtLSBtYXliZS4gKi8KICAgICAgICAgICAgIGMgPSB0b2tfbmV4dGModG9rKTsKLSAgICAgICAgICAgIGlmIChjID09ICcuJykKLSAgICAgICAgICAgICAgICBnb3RvIGZyYWN0aW9uOwotICAgICAgICAgICAgaWYgKGMgPT0gJ2onIHx8IGMgPT0gJ0onKQotICAgICAgICAgICAgICAgIGdvdG8gaW1hZ2luYXJ5OwogICAgICAgICAgICAgaWYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSB7CiAKICAgICAgICAgICAgICAgICAvKiBIZXggKi8KQEAgLTE3MzksNyArMTczNyw3IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBlbmRfcXVvdGVfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykKLSAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLworICAgICAgICAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7ICAvKiBza2lwIGVzY2FwZWQgY2hhciAqLwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL1Byb2dyYW1zL3B5dGhvbi5jIGIvUHJvZ3JhbXMvcHl0aG9uLmMKaW5kZXggMzdiMTBiOC4uYTdhZmJjNyAxMDA2NDQKLS0tIGEvUHJvZ3JhbXMvcHl0aG9uLmMKKysrIGIvUHJvZ3JhbXMvcHl0aG9uLmMKQEAgLTI0LDYgKzI0LDkgQEAKICAgICBpbnQgaSwgcmVzOwogICAgIGNoYXIgKm9sZGxvYzsKIAorICAgIC8qIEZvcmNlIG1hbGxvYygpIGFsbG9jYXRvciB0byBib290c3RyYXAgUHl0aG9uICovCisgICAgKHZvaWQpX1B5TWVtX1NldHVwQWxsb2NhdG9ycygibWFsbG9jIik7CisKICAgICBhcmd2X2NvcHkgPSAod2NoYXJfdCAqKilQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKHdjaGFyX3QqKSAqIChhcmdjKzEpKTsKICAgICBhcmd2X2NvcHkyID0gKHdjaGFyX3QgKiopUHlNZW1fUmF3TWFsbG9jKHNpemVvZih3Y2hhcl90KikgKiAoYXJnYysxKSk7CiAgICAgaWYgKCFhcmd2X2NvcHkgfHwgIWFyZ3ZfY29weTIpIHsKQEAgLTYyLDcgKzY1LDEzIEBACiAKICAgICBzZXRsb2NhbGUoTENfQUxMLCBvbGRsb2MpOwogICAgIFB5TWVtX1Jhd0ZyZWUob2xkbG9jKTsKKwogICAgIHJlcyA9IFB5X01haW4oYXJnYywgYXJndl9jb3B5KTsKKworICAgIC8qIEZvcmNlIGFnYWluIG1hbGxvYygpIGFsbG9jYXRvciB0byByZWxlYXNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICAgYmVmb3JlIFB5X01haW4oKSAqLworICAgICh2b2lkKV9QeU1lbV9TZXR1cEFsbG9jYXRvcnMoIm1hbGxvYyIpOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weTJbaV0pOwogICAgIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9QeXRob24tYXN0LmMgYi9QeXRob24vUHl0aG9uLWFzdC5jCmluZGV4IGVkZmNiYWQuLjExOTNjN2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9QeXRob24tYXN0LmMKKysrIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwpAQCAtMjg1LDYgKzI4NSwxOCBAQAogc3RhdGljIGNoYXIgKlN0cl9maWVsZHNbXT17CiAgICAgInMiLAogfTsKK3N0YXRpYyBQeVR5cGVPYmplY3QgKkZvcm1hdHRlZFZhbHVlX3R5cGU7CitfUHlfSURFTlRJRklFUihjb252ZXJzaW9uKTsKK19QeV9JREVOVElGSUVSKGZvcm1hdF9zcGVjKTsKK3N0YXRpYyBjaGFyICpGb3JtYXR0ZWRWYWx1ZV9maWVsZHNbXT17CisgICAgInZhbHVlIiwKKyAgICAiY29udmVyc2lvbiIsCisgICAgImZvcm1hdF9zcGVjIiwKK307CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpKb2luZWRTdHJfdHlwZTsKK3N0YXRpYyBjaGFyICpKb2luZWRTdHJfZmllbGRzW109eworICAgICJ2YWx1ZXMiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkJ5dGVzX3R5cGU7CiBzdGF0aWMgY2hhciAqQnl0ZXNfZmllbGRzW109ewogICAgICJzIiwKQEAgLTI5NCw2ICszMDYsMTAgQEAKICAgICAidmFsdWUiLAogfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkVsbGlwc2lzX3R5cGU7CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpDb25zdGFudF90eXBlOworc3RhdGljIGNoYXIgKkNvbnN0YW50X2ZpZWxkc1tdPXsKKyAgICAidmFsdWUiLAorfTsKIHN0YXRpYyBQeVR5cGVPYmplY3QgKkF0dHJpYnV0ZV90eXBlOwogX1B5X0lERU5USUZJRVIoYXR0cik7CiBfUHlfSURFTlRJRklFUihjdHgpOwpAQCAtNjk3LDYgKzcxMyw3IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopbzsKIH0KICNkZWZpbmUgYXN0Mm9ial9zaW5nbGV0b24gYXN0Mm9ial9vYmplY3QKKyNkZWZpbmUgYXN0Mm9ial9jb25zdGFudCBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2lkZW50aWZpZXIgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9zdHJpbmcgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9ieXRlcyBhc3Qyb2JqX29iamVjdApAQCAtNzM0LDYgKzc1MSwxOSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9iajJhc3RfY29uc3RhbnQoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQoreworICAgIGlmIChvYmopIHsKKyAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYXJlbmEsIG9iaikgPCAwKSB7CisgICAgICAgICAgICAqb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBQeV9JTkNSRUYob2JqKTsKKyAgICB9CisgICAgKm91dCA9IG9iajsKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBvYmoyYXN0X2lkZW50aWZpZXIoUHlPYmplY3QqIG9iaiwgUHlPYmplY3QqKiBvdXQsIFB5QXJlbmEqIGFyZW5hKQogewogICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qob2JqKSAmJiBvYmogIT0gUHlfTm9uZSkgewpAQCAtNzY5LDcgKzc5OSw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGkgPSAoaW50KVB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICBpID0gX1B5TG9uZ19Bc0ludChvYmopOwogICAgIGlmIChpID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgIHJldHVybiAxOwogICAgICpvdXQgPSBpOwpAQCAtOTE3LDYgKzk0NywxMSBAQAogICAgIGlmICghTnVtX3R5cGUpIHJldHVybiAwOwogICAgIFN0cl90eXBlID0gbWFrZV90eXBlKCJTdHIiLCBleHByX3R5cGUsIFN0cl9maWVsZHMsIDEpOwogICAgIGlmICghU3RyX3R5cGUpIHJldHVybiAwOworICAgIEZvcm1hdHRlZFZhbHVlX3R5cGUgPSBtYWtlX3R5cGUoIkZvcm1hdHRlZFZhbHVlIiwgZXhwcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0dGVkVmFsdWVfZmllbGRzLCAzKTsKKyAgICBpZiAoIUZvcm1hdHRlZFZhbHVlX3R5cGUpIHJldHVybiAwOworICAgIEpvaW5lZFN0cl90eXBlID0gbWFrZV90eXBlKCJKb2luZWRTdHIiLCBleHByX3R5cGUsIEpvaW5lZFN0cl9maWVsZHMsIDEpOworICAgIGlmICghSm9pbmVkU3RyX3R5cGUpIHJldHVybiAwOwogICAgIEJ5dGVzX3R5cGUgPSBtYWtlX3R5cGUoIkJ5dGVzIiwgZXhwcl90eXBlLCBCeXRlc19maWVsZHMsIDEpOwogICAgIGlmICghQnl0ZXNfdHlwZSkgcmV0dXJuIDA7CiAgICAgTmFtZUNvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIk5hbWVDb25zdGFudCIsIGV4cHJfdHlwZSwKQEAgLTkyNCw2ICs5NTksOCBAQAogICAgIGlmICghTmFtZUNvbnN0YW50X3R5cGUpIHJldHVybiAwOwogICAgIEVsbGlwc2lzX3R5cGUgPSBtYWtlX3R5cGUoIkVsbGlwc2lzIiwgZXhwcl90eXBlLCBOVUxMLCAwKTsKICAgICBpZiAoIUVsbGlwc2lzX3R5cGUpIHJldHVybiAwOworICAgIENvbnN0YW50X3R5cGUgPSBtYWtlX3R5cGUoIkNvbnN0YW50IiwgZXhwcl90eXBlLCBDb25zdGFudF9maWVsZHMsIDEpOworICAgIGlmICghQ29uc3RhbnRfdHlwZSkgcmV0dXJuIDA7CiAgICAgQXR0cmlidXRlX3R5cGUgPSBtYWtlX3R5cGUoIkF0dHJpYnV0ZSIsIGV4cHJfdHlwZSwgQXR0cmlidXRlX2ZpZWxkcywgMyk7CiAgICAgaWYgKCFBdHRyaWJ1dGVfdHlwZSkgcmV0dXJuIDA7CiAgICAgU3Vic2NyaXB0X3R5cGUgPSBtYWtlX3R5cGUoIlN1YnNjcmlwdCIsIGV4cHJfdHlwZSwgU3Vic2NyaXB0X2ZpZWxkcywgMyk7CkBAIC0yMDYzLDYgKzIxMDAsNDIgQEAKIH0KIAogZXhwcl90eQorRm9ybWF0dGVkVmFsdWUoZXhwcl90eSB2YWx1ZSwgaW50IGNvbnZlcnNpb24sIGV4cHJfdHkgZm9ybWF0X3NwZWMsIGludCBsaW5lbm8sCisgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgdmFsdWUgaXMgcmVxdWlyZWQgZm9yIEZvcm1hdHRlZFZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEZvcm1hdHRlZFZhbHVlX2tpbmQ7CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSA9IHZhbHVlOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbiA9IGNvbnZlcnNpb247CisgICAgcC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyA9IGZvcm1hdF9zcGVjOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQorSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpCit7CisgICAgZXhwcl90eSBwOworICAgIHAgPSAoZXhwcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gSm9pbmVkU3RyX2tpbmQ7CisgICAgcC0+di5Kb2luZWRTdHIudmFsdWVzID0gdmFsdWVzOworICAgIHAtPmxpbmVubyA9IGxpbmVubzsKKyAgICBwLT5jb2xfb2Zmc2V0ID0gY29sX29mZnNldDsKKyAgICByZXR1cm4gcDsKK30KKworZXhwcl90eQogQnl0ZXMoYnl0ZXMgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewogICAgIGV4cHJfdHkgcDsKQEAgLTIxMTQsNiArMjE4NywyNSBAQAogfQogCiBleHByX3R5CitDb25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBDb25zdGFudCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBDb25zdGFudF9raW5kOworICAgIHAtPnYuQ29uc3RhbnQudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEF0dHJpYnV0ZShleHByX3R5IHZhbHVlLCBpZGVudGlmaWVyIGF0dHIsIGV4cHJfY29udGV4dF90eSBjdHgsIGludCBsaW5lbm8sIGludAogICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQogewpAQCAtMzE2NCw2ICszMjU2LDM0IEBACiAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhGb3JtYXR0ZWRWYWx1ZV90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdmFsdWUsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfaW50KG8tPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbik7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2NvbnZlcnNpb24sIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfZXhwcihvLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfZm9ybWF0X3NwZWMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhKb2luZWRTdHJfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2xpc3Qoby0+di5Kb2luZWRTdHIudmFsdWVzLCBhc3Qyb2JqX2V4cHIpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZXMsIHZhbHVlKSA9PSAtMSkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEJ5dGVzX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC0zMTg2LDYgKzMzMDYsMTUgQEAKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoRWxsaXBzaXNfdHlwZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhDb25zdGFudF90eXBlLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOworICAgICAgICB2YWx1ZSA9IGFzdDJvYmpfY29uc3RhbnQoby0+di5Db25zdGFudC52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBdHRyaWJ1dGVfa2luZDoKICAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQXR0cmlidXRlX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CkBAIC02MDI1LDYgKzYxNTQsODYgQEAKICAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgIGludCBjb252ZXJzaW9uOworICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworCisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVcIiBtaXNzaW5nIGZyb20gRm9ybWF0dGVkVmFsdWUiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9jb252ZXJzaW9uKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF9jb252ZXJzaW9uKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2ludCh0bXAsICZjb252ZXJzaW9uLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnNpb24gPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChleGlzdHNfbm90X25vbmUob2JqLCAmUHlJZF9mb3JtYXRfc3BlYykpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfZm9ybWF0X3NwZWMpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcih0bXAsICZmb3JtYXRfc3BlYywgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXRfc3BlYyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IEZvcm1hdHRlZFZhbHVlKHZhbHVlLCBjb252ZXJzaW9uLCBmb3JtYXRfc3BlYywgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgYXJlbmEpOworICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilKb2luZWRTdHJfdHlwZSk7CisgICAgaWYgKGlzaW5zdGFuY2UgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChpc2luc3RhbmNlKSB7CisgICAgICAgIGFzZGxfc2VxKiB2YWx1ZXM7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZXMpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWVzKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBpZiAoIVB5TGlzdF9DaGVjayh0bXApKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkpvaW5lZFN0ciBmaWVsZCBcInZhbHVlc1wiIG11c3QgYmUgYSBsaXN0LCBub3QgYSAlLjIwMHMiLCB0bXAtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuID0gUHlMaXN0X0dFVF9TSVpFKHRtcCk7CisgICAgICAgICAgICB2YWx1ZXMgPSBfUHlfYXNkbF9zZXFfbmV3KGxlbiwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKFB5TGlzdF9HRVRfSVRFTSh0bXAsIGkpLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVCh2YWx1ZXMsIGksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZXNcIiBtaXNzaW5nIGZyb20gSm9pbmVkU3RyIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqb3V0ID0gSm9pbmVkU3RyKHZhbHVlcywgbGluZW5vLCBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUJ5dGVzX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNjA3OSw2ICs2Mjg4LDI4IEBACiAgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUNvbnN0YW50X3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBjb25zdGFudCB2YWx1ZTsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9jb25zdGFudCh0bXAsICZ2YWx1ZSwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAicmVxdWlyZWQgZmllbGQgXCJ2YWx1ZVwiIG1pc3NpbmcgZnJvbSBDb25zdGFudCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IENvbnN0YW50KHZhbHVlLCBsaW5lbm8sIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpOwogICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CiAgICAgICAgIHJldHVybiAxOwpAQCAtNzM0NiwxMiArNzU3NywxOCBAQAogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQ2FsbCIsIChQeU9iamVjdCopQ2FsbF90eXBlKSA8IDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiTnVtIiwgKFB5T2JqZWN0KilOdW1fdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN0ciIsIChQeU9iamVjdCopU3RyX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJGb3JtYXR0ZWRWYWx1ZSIsCisgICAgICAgIChQeU9iamVjdCopRm9ybWF0dGVkVmFsdWVfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkpvaW5lZFN0ciIsIChQeU9iamVjdCopSm9pbmVkU3RyX3R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJCeXRlcyIsIChQeU9iamVjdCopQnl0ZXNfdHlwZSkgPCAwKSByZXR1cm4KICAgICAgICAgTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk5hbWVDb25zdGFudCIsIChQeU9iamVjdCopTmFtZUNvbnN0YW50X3R5cGUpIDwKICAgICAgICAgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJFbGxpcHNpcyIsIChQeU9iamVjdCopRWxsaXBzaXNfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNvbnN0YW50IiwgKFB5T2JqZWN0KilDb25zdGFudF90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQXR0cmlidXRlIiwgKFB5T2JqZWN0KilBdHRyaWJ1dGVfdHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIlN1YnNjcmlwdCIsIChQeU9iamVjdCopU3Vic2NyaXB0X3R5cGUpIDwgMCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9fd2FybmluZ3MuYyBiL1B5dGhvbi9fd2FybmluZ3MuYwppbmRleCA5NzhiYWQxLi40MGY1YzhlIDEwMDY0NAotLS0gYS9QeXRob24vX3dhcm5pbmdzLmMKKysrIGIvUHl0aG9uL193YXJuaW5ncy5jCkBAIC00MCwxMiArNDAsMTEgQEAKICAgIEEgTlVMTCByZXR1cm4gdmFsdWUgY2FuIG1lYW4gZmFsc2Ugb3IgYW4gZXJyb3IuCiAqLwogc3RhdGljIFB5T2JqZWN0ICoKLWdldF93YXJuaW5nc19hdHRyKGNvbnN0IGNoYXIgKmF0dHIpCitnZXRfd2FybmluZ3NfYXR0cihjb25zdCBjaGFyICphdHRyLCBpbnQgdHJ5X2ltcG9ydCkKIHsKICAgICBzdGF0aWMgUHlPYmplY3QgKndhcm5pbmdzX3N0ciA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFsbF9tb2R1bGVzOwotICAgIFB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGU7Ci0gICAgaW50IHJlc3VsdDsKKyAgICBQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlLCAqb2JqOwogCiAgICAgaWYgKHdhcm5pbmdzX3N0ciA9PSBOVUxMKSB7CiAgICAgICAgIHdhcm5pbmdzX3N0ciA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCJ3YXJuaW5ncyIpOwpAQCAtNTMsMTUgKzUyLDM0IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKLSAgICByZXN1bHQgPSBQeURpY3RfQ29udGFpbnMoYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSB8fCByZXN1bHQgPT0gMCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKLSAgICBpZiAoIVB5T2JqZWN0X0hhc0F0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKSkKKyAgICAvKiBkb24ndCB0cnkgdG8gaW1wb3J0IGFmdGVyIHRoZSBzdGFydCBvZiB0aGUgUHl0aG9uIGZpbmFsbGl6YXRpb24gKi8KKyAgICBpZiAodHJ5X2ltcG9ydCAmJiBfUHlfRmluYWxpemluZyA9PSBOVUxMKSB7CisgICAgICAgIHdhcm5pbmdzX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydCh3YXJuaW5nc19zdHIpOworICAgICAgICBpZiAod2FybmluZ3NfbW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEZhbGxiYWNrIHRvIHRoZSBDIGltcGxlbWVudGF0aW9uIGlmIHdlIGNhbm5vdCBnZXQKKyAgICAgICAgICAgICAgIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gKi8KKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxfbW9kdWxlcyA9IFB5SW1wb3J0X0dldE1vZHVsZURpY3QoKTsKKworICAgICAgICB3YXJuaW5nc19tb2R1bGUgPSBQeURpY3RfR2V0SXRlbShhbGxfbW9kdWxlcywgd2FybmluZ3Nfc3RyKTsKKyAgICAgICAgaWYgKHdhcm5pbmdzX21vZHVsZSA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgUHlfSU5DUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgfQorCisgICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cikpIHsKKyAgICAgICAgUHlfREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKTsKKyAgICBQeV9ERUNSRUYod2FybmluZ3NfbW9kdWxlKTsKKyAgICByZXR1cm4gb2JqOwogfQogCiAKQEAgLTcwLDcgKzg4LDcgQEAKIHsKICAgICBQeU9iamVjdCAqcmVnaXN0cnk7CiAKLSAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiKTsKKyAgICByZWdpc3RyeSA9IGdldF93YXJuaW5nc19hdHRyKCJvbmNlcmVnaXN0cnkiLCAwKTsKICAgICBpZiAocmVnaXN0cnkgPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtODcsNyArMTA1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqZGVmYXVsdF9hY3Rpb247CiAKLSAgICBkZWZhdWx0X2FjdGlvbiA9IGdldF93YXJuaW5nc19hdHRyKCJkZWZhdWx0YWN0aW9uIik7CisgICAgZGVmYXVsdF9hY3Rpb24gPSBnZXRfd2FybmluZ3NfYXR0cigiZGVmYXVsdGFjdGlvbiIsIDApOwogICAgIGlmIChkZWZhdWx0X2FjdGlvbiA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExMCw3ICsxMjgsNyBAQAogICAgIFB5X3NzaXplX3QgaTsKICAgICBQeU9iamVjdCAqd2FybmluZ3NfZmlsdGVyczsKIAotICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIpOworICAgIHdhcm5pbmdzX2ZpbHRlcnMgPSBnZXRfd2FybmluZ3NfYXR0cigiZmlsdGVycyIsIDApOwogICAgIGlmICh3YXJuaW5nc19maWx0ZXJzID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI4Nyw4ICszMDUsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotc2hvd193YXJuaW5nKFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKnRleHQsIFB5T2JqZWN0Ci0gICAgICAgICAgICAgICAgKmNhdGVnb3J5LCBQeU9iamVjdCAqc291cmNlbGluZSkKK3Nob3dfd2FybmluZyhQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICp0ZXh0LAorICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUpCiB7CiAgICAgUHlPYmplY3QgKmZfc3RkZXJyOwogICAgIFB5T2JqZWN0ICpuYW1lOwpAQCAtMzU5LDEwICszNzcsNjQgQEAKICAgICBQeUVycl9DbGVhcigpOwogfQogCitzdGF0aWMgaW50CitjYWxsX3Nob3dfd2FybmluZyhQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICp0ZXh0LCBQeU9iamVjdCAqbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywgUHlPYmplY3QgKmxpbmVub19vYmosCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlbGluZSwgUHlPYmplY3QgKnNvdXJjZSkKK3sKKyAgICBQeU9iamVjdCAqc2hvd19mbiwgKm1zZywgKnJlcywgKndhcm5tc2dfY2xzID0gTlVMTDsKKworICAgIC8qIElmIHRoZSBzb3VyY2UgcGFyYW1ldGVyIGlzIHNldCwgdHJ5IHRvIGdldCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorICAgICAgIFRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byBsb2cgdGhlIHRyYWNlYmFjayB3aGVyZSB0aGUgc291cmNlCisgICAgICAgd2FzIGFsbG9jYXRlZCwgd2hlcmVhcyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBkb2VzbnQuICovCisgICAgc2hvd19mbiA9IGdldF93YXJuaW5nc19hdHRyKCJfc2hvd3dhcm5tc2ciLCBzb3VyY2UgIT0gTlVMTCk7CisgICAgaWYgKHNob3dfZm4gPT0gTlVMTCkgeworICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFQeUNhbGxhYmxlX0NoZWNrKHNob3dfZm4pKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIndhcm5pbmdzLl9zaG93d2Fybm1zZygpIG11c3QgYmUgc2V0IHRvIGEgY2FsbGFibGUiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB3YXJubXNnX2NscyA9IGdldF93YXJuaW5nc19hdHRyKCJXYXJuaW5nTWVzc2FnZSIsIDApOworICAgIGlmICh3YXJubXNnX2NscyA9PSBOVUxMKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgInVuYWJsZSB0byBnZXQgd2FybmluZ3MuV2FybmluZ01lc3NhZ2UiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBtc2cgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHdhcm5tc2dfY2xzLCBtZXNzYWdlLCBjYXRlZ29yeSwKKyAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm9fb2JqLCBQeV9Ob25lLCBQeV9Ob25lLCBzb3VyY2UsCisgICAgICAgICAgICBOVUxMKTsKKyAgICBQeV9ERUNSRUYod2Fybm1zZ19jbHMpOworICAgIGlmIChtc2cgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19mbiwgbXNnLCBOVUxMKTsKKyAgICBQeV9ERUNSRUYoc2hvd19mbik7CisgICAgUHlfREVDUkVGKG1zZyk7CisKKyAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFB5X0RFQ1JFRihyZXMpOworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKHNob3dfZm4pOworICAgIHJldHVybiAtMTsKK30KKwogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5fZXhwbGljaXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKICAgICAgICAgICAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLAotICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lKQorICAgICAgICAgICAgICBQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lLAorICAgICAgICAgICAgICBQeU9iamVjdCAqc291cmNlKQogewogICAgIFB5T2JqZWN0ICprZXkgPSBOVUxMLCAqdGV4dCA9IE5VTEwsICpyZXN1bHQgPSBOVUxMLCAqbGluZW5vX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKml0ZW0gPSBOVUxMOwpAQCAtNDcwLDMxICs1NDIsOSBAQAogICAgIGlmIChyYyA9PSAxKSAgLyogQWxyZWFkeSB3YXJuZWQgZm9yIHRoaXMgbW9kdWxlLiAqLwogICAgICAgICBnb3RvIHJldHVybl9ub25lOwogICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpzaG93X2Z4biA9IGdldF93YXJuaW5nc19hdHRyKCJzaG93d2FybmluZyIpOwotICAgICAgICBpZiAoc2hvd19meG4gPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgc2hvd193YXJuaW5nKGZpbGVuYW1lLCBsaW5lbm8sIHRleHQsIGNhdGVnb3J5LCBzb3VyY2VsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7Ci0KLSAgICAgICAgICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhzaG93X2Z4bikpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxhYmxlIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHNob3dfZnhuKTsKLSAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3Moc2hvd19meG4sIG1lc3NhZ2UsIGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVub19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICBQeV9YREVDUkVGKHJlcyk7Ci0gICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICB9CisgICAgICAgIGlmIChjYWxsX3Nob3dfd2FybmluZyhjYXRlZ29yeSwgdGV4dCwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVub19vYmosIHNvdXJjZWxpbmUsIHNvdXJjZSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KICAgICBlbHNlIC8qIGlmIChyYyA9PSAtMSkgKi8KICAgICAgICAgZ290byBjbGVhbnVwOwpAQCAtNzM4LDcgKzc4OCw4IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1kb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCitkb193YXJuKFB5T2JqZWN0ICptZXNzYWdlLCBQeU9iamVjdCAqY2F0ZWdvcnksIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgICAgIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKmZpbGVuYW1lLCAqbW9kdWxlLCAqcmVnaXN0cnksICpyZXM7CiAgICAgaW50IGxpbmVubzsKQEAgLTc0Nyw3ICs3OTgsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHNvdXJjZSk7CiAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICAgICBQeV9ERUNSRUYocmVnaXN0cnkpOwogICAgIFB5X0RFQ1JFRihtb2R1bGUpOwpAQCAtNzU3LDI1ICs4MDgsMjcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3YXJuaW5nc193YXJuKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmt3X2xpc3RbXSA9IHsgIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAic3RhY2tsZXZlbCIsIDAgfTsKLSAgICBQeU9iamVjdCAqbWVzc2FnZSwgKmNhdGVnb3J5ID0gTlVMTDsKKyAgICBzdGF0aWMgY2hhciAqa3dfbGlzdFtdID0geyJtZXNzYWdlIiwgImNhdGVnb3J5IiwgInN0YWNrbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsIE5VTEx9OworICAgIFB5T2JqZWN0ICptZXNzYWdlLCAqY2F0ZWdvcnkgPSBOVUxMLCAqc291cmNlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsID0gMTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9uOndhcm4iLCBrd19saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk98T25POndhcm4iLCBrd19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmY2F0ZWdvcnksICZzdGFja19sZXZlbCwgJnNvdXJjZSkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgY2F0ZWdvcnkgPSBnZXRfY2F0ZWdvcnkobWVzc2FnZSwgY2F0ZWdvcnkpOwogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJldHVybiBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCwgc291cmNlKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIHdhcm5pbmdzX3dhcm5fZXhwbGljaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dkX2xpc3RbXSA9IHsibWVzc2FnZSIsICJjYXRlZ29yeSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIiwgInJlZ2lzdHJ5IiwgIm1vZHVsZV9nbG9iYWxzIiwgMH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUiLCAicmVnaXN0cnkiLCAibW9kdWxlX2dsb2JhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIiwgMH07CiAgICAgUHlPYmplY3QgKm1lc3NhZ2U7CiAgICAgUHlPYmplY3QgKmNhdGVnb3J5OwogICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKQEAgLTc4MywxMCArODM2LDExIEBACiAgICAgUHlPYmplY3QgKm1vZHVsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlZ2lzdHJ5ID0gTlVMTDsKICAgICBQeU9iamVjdCAqbW9kdWxlX2dsb2JhbHMgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzb3VyY2VvYmogPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgIk9PVWl8T09POndhcm5fZXhwbGljaXQiLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT1VpfE9PT086d2Fybl9leHBsaWNpdCIsCiAgICAgICAgICAgICAgICAga3dkX2xpc3QsICZtZXNzYWdlLCAmY2F0ZWdvcnksICZmaWxlbmFtZSwgJmxpbmVubywgJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAmcmVnaXN0cnksICZtb2R1bGVfZ2xvYmFscykpCisgICAgICAgICAgICAgICAgJnJlZ2lzdHJ5LCAmbW9kdWxlX2dsb2JhbHMsICZzb3VyY2VvYmopKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChtb2R1bGVfZ2xvYmFscykgewpAQCAtODQyLDE0ICs4OTYsMTQgQEAKIAogICAgICAgICAvKiBIYW5kbGUgdGhlIHdhcm5pbmcuICovCiAgICAgICAgIHJldHVybmVkID0gd2Fybl9leHBsaWNpdChjYXRlZ29yeSwgbWVzc2FnZSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIHNvdXJjZV9saW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSwgc291cmNlb2JqKTsKICAgICAgICAgUHlfREVDUkVGKHNvdXJjZV9saXN0KTsKICAgICAgICAgcmV0dXJuIHJldHVybmVkOwogICAgIH0KIAogIHN0YW5kYXJkX2NhbGw6CiAgICAgcmV0dXJuIHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIE5VTEwsIHNvdXJjZW9iaik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC04NjQsMTQgKzkxOCwxNCBAQAogCiBzdGF0aWMgaW50CiB3YXJuX3VuaWNvZGUoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqbWVzc2FnZSwKLSAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKQorICAgICAgICAgICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsIFB5T2JqZWN0ICpzb3VyY2UpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKIAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogCi0gICAgcmVzID0gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOworICAgIHJlcyA9IGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsLCBzb3VyY2UpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtODc5LDEyICs5MzMsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludAorX1B5RXJyX1dhcm5Gb3JtYXRWKFB5T2JqZWN0ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YXJncykKK3sKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBpbnQgcmVzOworCisgICAgbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihmb3JtYXQsIHZhcmdzKTsKKyAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXMgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsLCBzb3VyY2UpOworICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKKyAgICByZXR1cm4gcmVzOworfQorCiBpbnQKIFB5RXJyX1dhcm5Gb3JtYXQoUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAogICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKLSAgICBpbnQgcmV0OwotICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIGludCByZXM7CiAgICAgdmFfbGlzdCB2YXJnczsKIAogI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKQEAgLTg5MiwyNSArOTYyLDM4IEBACiAjZWxzZQogICAgIHZhX3N0YXJ0KHZhcmdzKTsKICNlbmRpZgotICAgIG1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICByZXQgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsKTsKLSAgICAgICAgUHlfREVDUkVGKG1lc3NhZ2UpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldCA9IC0xOworICAgIHJlcyA9IF9QeUVycl9XYXJuRm9ybWF0VihOVUxMLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwsIGZvcm1hdCwgdmFyZ3MpOwogICAgIHZhX2VuZCh2YXJncyk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gcmVzOwogfQogCiBpbnQKK1B5RXJyX1Jlc291cmNlV2FybmluZyhQeU9iamVjdCAqc291cmNlLCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICAgIGludCByZXM7CisgICAgdmFfbGlzdCB2YXJnczsKKworI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKKyAgICB2YV9zdGFydCh2YXJncywgZm9ybWF0KTsKKyNlbHNlCisgICAgdmFfc3RhcnQodmFyZ3MpOworI2VuZGlmCisgICAgcmVzID0gX1B5RXJyX1dhcm5Gb3JtYXRWKHNvdXJjZSwgUHlFeGNfUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19sZXZlbCwgZm9ybWF0LCB2YXJncyk7CisgICAgdmFfZW5kKHZhcmdzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKK2ludAogUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqdGV4dCwgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKIHsKICAgICBpbnQgcmV0OwogICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodGV4dCk7CiAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwpOworICAgIHJldCA9IHdhcm5fdW5pY29kZShjYXRlZ29yeSwgbWVzc2FnZSwgc3RhY2tfbGV2ZWwsIE5VTEwpOwogICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtOTIxLDcgKzEwMDQsNyBAQAogI3VuZGVmIFB5RXJyX1dhcm4KIAogUHlBUElfRlVOQyhpbnQpCi1QeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqdGV4dCkKK1B5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjb25zdCBjaGFyICp0ZXh0KQogewogICAgIHJldHVybiBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIHRleHQsIDEpOwogfQpAQCAtOTM2LDcgKzEwMTksNyBAQAogICAgIGlmIChjYXRlZ29yeSA9PSBOVUxMKQogICAgICAgICBjYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwogICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwsIE5VTEwpOwogICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIFB5X0RFQ1JFRihyZXMpOwpAQCAtMTAwMCw3ICsxMDgzLDcgQEAKICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7CiAgICAgICAgIFB5T2JqZWN0ICpyZXM7CiAgICAgICAgIHJlcyA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKICAgICAgICAgaWYgKHJlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9hc3QuYyBiL1B5dGhvbi9hc3QuYwppbmRleCA3NzQzYzMxLi44YzEzZTBiIDEwMDY0NAotLS0gYS9QeXRob24vYXN0LmMKKysrIGIvUHl0aG9uL2FzdC5jCkBAIC0xMzIsNiArMTMyLDUyIEBACiB9CiAKIHN0YXRpYyBpbnQKK3ZhbGlkYXRlX2NvbnN0YW50KFB5T2JqZWN0ICp2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUgPT0gUHlfTm9uZSB8fCB2YWx1ZSA9PSBQeV9FbGxpcHNpcykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUZsb2F0X0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUNvbXBsZXhfQ2hlY2tFeGFjdCh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5Qm9vbF9DaGVjayh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlCeXRlc19DaGVja0V4YWN0KHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHZhbHVlKSB8fCBQeUZyb3plblNldF9DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICBQeU9iamVjdCAqaXQ7CisKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHZhbHVlKTsKKyAgICAgICAgaWYgKGl0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgUHlPYmplY3QgKml0ZW0gPSBQeUl0ZXJfTmV4dChpdCk7CisgICAgICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGl0ZW0pKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgIH0KKworICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAogdmFsaWRhdGVfZXhwcihleHByX3R5IGV4cCwgZXhwcl9jb250ZXh0X3R5IGN0eCkKIHsKICAgICBpbnQgY2hlY2tfY3R4ID0gMTsKQEAgLTI0MCw2ICsyODYsMTQgQEAKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX2V4cHIoZXhwLT52LkNhbGwuZnVuYywgTG9hZCkgJiYKICAgICAgICAgICAgIHZhbGlkYXRlX2V4cHJzKGV4cC0+di5DYWxsLmFyZ3MsIExvYWQsIDApICYmCiAgICAgICAgICAgICB2YWxpZGF0ZV9rZXl3b3JkcyhleHAtPnYuQ2FsbC5rZXl3b3Jkcyk7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICBpZiAoIXZhbGlkYXRlX2NvbnN0YW50KGV4cC0+di5Db25zdGFudC52YWx1ZSkpIHsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBhbiBpbnZhbGlkIHR5cGUgaW4gQ29uc3RhbnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKGV4cC0+di5Db25zdGFudC52YWx1ZSktPnRwX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CiAgICAgY2FzZSBOdW1fa2luZDogewogICAgICAgICBQeU9iamVjdCAqbiA9IGV4cC0+di5OdW0ubjsKICAgICAgICAgaWYgKCFQeUxvbmdfQ2hlY2tFeGFjdChuKSAmJiAhUHlGbG9hdF9DaGVja0V4YWN0KG4pICYmCkBAIC0yNTcsNiArMzExLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQorICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHBycyhleHAtPnYuSm9pbmVkU3RyLnZhbHVlcywgTG9hZCwgMCk7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICBpZiAodmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUsIExvYWQpID09IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKGV4cC0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYywgTG9hZCk7CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgQnl0ZXNfa2luZDogewogICAgICAgICBQeU9iamVjdCAqYiA9IGV4cC0+di5CeXRlcy5zOwogICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2tFeGFjdChiKSkgewpAQCAtNDEzLDggKzQ3NSw4IEBACiAgICAgY2FzZSBJbXBvcnRfa2luZDoKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25vbmVtcHR5X3NlcShzdG10LT52LkltcG9ydC5uYW1lcywgIm5hbWVzIiwgIkltcG9ydCIpOwogICAgIGNhc2UgSW1wb3J0RnJvbV9raW5kOgotICAgICAgICBpZiAoc3RtdC0+di5JbXBvcnRGcm9tLmxldmVsIDwgLTEpIHsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiSW1wb3J0RnJvbSBsZXZlbCBsZXNzIHRoYW4gLTEiKTsKKyAgICAgICAgaWYgKHN0bXQtPnYuSW1wb3J0RnJvbS5sZXZlbCA8IDApIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiTmVnYXRpdmUgSW1wb3J0RnJvbSBsZXZlbCIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHZhbGlkYXRlX25vbmVtcHR5X3NlcShzdG10LT52LkltcG9ydEZyb20ubmFtZXMsICJuYW1lcyIsICJJbXBvcnRGcm9tIik7CkBAIC01MTIsOCArNTc0LDcgQEAKIAogLyogRGF0YSBzdHJ1Y3R1cmUgdXNlZCBpbnRlcm5hbGx5ICovCiBzdHJ1Y3QgY29tcGlsaW5nIHsKLSAgICBjaGFyICpjX2VuY29kaW5nOyAvKiBzb3VyY2UgZW5jb2RpbmcgKi8KLSAgICBQeUFyZW5hICpjX2FyZW5hOyAvKiBhcmVuYSBmb3IgYWxsb2NhdGluZyBtZW1lb3J5ICovCisgICAgUHlBcmVuYSAqY19hcmVuYTsgLyogQXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtb3J5LiAqLwogICAgIFB5T2JqZWN0ICpjX2ZpbGVuYW1lOyAvKiBmaWxlbmFtZSAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZTsgLyogTm9ybWFsaXphdGlvbiBmdW5jdGlvbiBmcm9tIHVuaWNvZGVkYXRhLiAqLwogICAgIFB5T2JqZWN0ICpjX25vcm1hbGl6ZV9hcmdzOyAvKiBOb3JtYWxpemF0aW9uIGFyZ3VtZW50IHR1cGxlLiAqLwpAQCAtNTM1LDkgKzU5Niw3IEBACiBzdGF0aWMgZXhwcl90eSBhc3RfZm9yX2NhbGwoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICosIGV4cHJfdHkpOwogCiBzdGF0aWMgUHlPYmplY3QgKnBhcnNlbnVtYmVyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBQeU9iamVjdCAqcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSk7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RycGx1cyhzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IG5vZGUgKm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ5dGVzbW9kZSk7CitzdGF0aWMgZXhwcl90eSBwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuKTsKIAogI2RlZmluZSBDT01QX0dFTkVYUCAgIDAKICNkZWZpbmUgQ09NUF9MSVNUQ09NUCAxCkBAIC03MDEsMjMgKzc2MCwxMSBAQAogICAgIGMuY19hcmVuYSA9IGFyZW5hOwogICAgIC8qIGJvcnJvd2VkIHJlZmVyZW5jZSAqLwogICAgIGMuY19maWxlbmFtZSA9IGZpbGVuYW1lOwotICAgIGMuY19ub3JtYWxpemUgPSBjLmNfbm9ybWFsaXplX2FyZ3MgPSBOVUxMOwotICAgIGlmIChmbGFncyAmJiBmbGFncy0+Y2ZfZmxhZ3MgJiBQeUNGX1NPVVJDRV9JU19VVEY4KSB7Ci0gICAgICAgIGMuY19lbmNvZGluZyA9ICJ1dGYtOCI7Ci0gICAgICAgIGlmIChUWVBFKG4pID09IGVuY29kaW5nX2RlY2wpIHsKLSNpZiAwCi0gICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImVuY29kaW5nIGRlY2xhcmF0aW9uIGluIFVuaWNvZGUgc3RyaW5nIik7Ci0gICAgICAgICAgICBnb3RvIG91dDsKLSNlbmRpZgotICAgICAgICAgICAgbiA9IENISUxEKG4sIDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChUWVBFKG4pID09IGVuY29kaW5nX2RlY2wpIHsKLSAgICAgICAgYy5jX2VuY29kaW5nID0gU1RSKG4pOworICAgIGMuY19ub3JtYWxpemUgPSBOVUxMOworICAgIGMuY19ub3JtYWxpemVfYXJncyA9IE5VTEw7CisKKyAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKQogICAgICAgICBuID0gQ0hJTEQobiwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogUEVQIDMxMjAgKi8KLSAgICAgICAgYy5jX2VuY29kaW5nID0gInV0Zi04IjsKLSAgICB9CiAKICAgICBrID0gMDsKICAgICBzd2l0Y2ggKFRZUEUobikpIHsKQEAgLTg2NCw3ICs5MTEsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIqIEZPUkJJRERFTltdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBGT1JCSURERU5bXSA9IHsKICAgICAiTm9uZSIsCiAgICAgIlRydWUiLAogICAgICJGYWxzZSIsCkBAIC04ODEsNyArOTI4LDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGlmIChmdWxsX2NoZWNrcykgewotICAgICAgICBjb25zdCBjaGFyICoqcDsKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwogICAgICAgICBmb3IgKHAgPSBGT1JCSURERU47ICpwOyBwKyspIHsKICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhuYW1lLCAqcCkgPT0gMCkgewogICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiYXNzaWdubWVudCB0byBrZXl3b3JkIik7CkBAIC05NDMsMTMgKzk5MCw4IEBACiAgICAgICAgICAgICBzID0gZS0+di5MaXN0LmVsdHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBUdXBsZV9raW5kOgotICAgICAgICAgICAgaWYgKGFzZGxfc2VxX0xFTihlLT52LlR1cGxlLmVsdHMpKSAgewotICAgICAgICAgICAgICAgIGUtPnYuVHVwbGUuY3R4ID0gY3R4OwotICAgICAgICAgICAgICAgIHMgPSBlLT52LlR1cGxlLmVsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBleHByX25hbWUgPSAiKCkiOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZS0+di5UdXBsZS5jdHggPSBjdHg7CisgICAgICAgICAgICBzID0gZS0+di5UdXBsZS5lbHRzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTGFtYmRhX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAibGFtYmRhIjsKQEAgLTk4Niw2ICsxMDI4LDggQEAKICAgICAgICAgY2FzZSBOdW1fa2luZDoKICAgICAgICAgY2FzZSBTdHJfa2luZDoKICAgICAgICAgY2FzZSBCeXRlc19raW5kOgorICAgICAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CiAgICAgICAgICAgICBleHByX25hbWUgPSAibGl0ZXJhbCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKQEAgLTEyNTksMTYgKzEzMDMsMjAgQEAKICAgICAgICBhbmQgdmFyYXJnc2xpc3QgKGxhbWJkYSBkZWZpbml0aW9uKS4KIAogICAgICAgIHBhcmFtZXRlcnM6ICcoJyBbdHlwZWRhcmdzbGlzdF0gJyknCi0gICAgICAgdHlwZWRhcmdzbGlzdDogKCh0ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICAgICAgICAgICAoJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXQotICAgICAgICAgICB8ICcqKicgdGZwZGVmKQotICAgICAgICAgICB8IHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKKyAgICAgICB0eXBlZGFyZ3NsaXN0OiAodGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWworICAgICAgICAgICAgICAgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKionIHRmcGRlZiBbJywnXSkKICAgICAgICB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotICAgICAgIHZhcmFyZ3NsaXN0OiAoKHZmcGRlZiBbJz0nIHRlc3RdICcsJykqCi0gICAgICAgICAgICgnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqICBbJywnICcqKicgdmZwZGVmXQotICAgICAgICAgICB8ICcqKicgdmZwZGVmKQotICAgICAgICAgICB8IHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKKyAgICAgICB2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgICAgICAgICcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgICAgIHwgJyoqJyB2ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyoqJyB2ZnBkZWYgWycsJ10KKyAgICAgICApCiAgICAgICAgdmZwZGVmOiBOQU1FCisKICAgICAqLwogICAgIGludCBpLCBqLCBrLCBucG9zYXJncyA9IDAsIG5rd29ubHlhcmdzID0gMDsKICAgICBpbnQgbnBvc2RlZmF1bHRzID0gMCwgZm91bmRfZGVmYXVsdCA9IDA7CkBAIC0xMzcwLDcgKzE0MTgsOCBAQAogICAgICAgICAgICAgICAgIGkgKz0gMjsgLyogdGhlIG5hbWUgYW5kIHRoZSBjb21tYSAqLwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTVEFSOgotICAgICAgICAgICAgICAgIGlmIChpKzEgPj0gTkNIKG4pKSB7CisgICAgICAgICAgICAgICAgaWYgKGkrMSA+PSBOQ0gobikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGkrMiA9PSBOQ0gobikgJiYgVFlQRShDSElMRChuLCBpKzEpKSA9PSBDT01NQSkpIHsKICAgICAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIENISUxEKG4sIGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVkIGFyZ3VtZW50cyBtdXN0IGZvbGxvdyBiYXJlICoiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xOTkzLDcgKzIwNDIsNiBAQAogICAgICAgIHwgJy4uLicgfCAnTm9uZScgfCAnVHJ1ZScgfCAnRmFsc2UnCiAgICAgKi8KICAgICBub2RlICpjaCA9IENISUxEKG4sIDApOwotICAgIGludCBieXRlc21vZGUgPSAwOwogCiAgICAgc3dpdGNoIChUWVBFKGNoKSkgewogICAgIGNhc2UgTkFNRTogewpAQCAtMjAxNSw3ICsyMDYzLDcgQEAKICAgICAgICAgcmV0dXJuIE5hbWUobmFtZSwgTG9hZCwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwogICAgIH0KICAgICBjYXNlIFNUUklORzogewotICAgICAgICBQeU9iamVjdCAqc3RyID0gcGFyc2VzdHJwbHVzKGMsIG4sICZieXRlc21vZGUpOworICAgICAgICBleHByX3R5IHN0ciA9IHBhcnNlc3RycGx1cyhjLCBuKTsKICAgICAgICAgaWYgKCFzdHIpIHsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycnR5cGUgPSBOVUxMOwogICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVW5pY29kZUVycm9yKSkKQEAgLTIwMzIsNiArMjA4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiglcykgJXMiLCBlcnJ0eXBlLCBzKTsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVycnN0cik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiKCVzKSB1bmtub3duIGVycm9yIiwgZXJydHlwZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCBidWYpOwpAQCAtMjA0MSwxNCArMjA5MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzdHIpIDwgMCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnl0ZXNtb2RlKQotICAgICAgICAgICAgcmV0dXJuIEJ5dGVzKHN0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gU3RyKHN0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgICAgICByZXR1cm4gc3RyOwogICAgIH0KICAgICBjYXNlIE5VTUJFUjogewogICAgICAgICBQeU9iamVjdCAqcHludW0gPSBwYXJzZW51bWJlcihjLCBTVFIoY2gpKTsKQEAgLTMyMDgsMTQgKzMyNTAsMTQgQEAKICAgICAgICAgICAgIGFsaWFzX3R5IGltcG9ydF9hbGlhcyA9IGFsaWFzX2Zvcl9pbXBvcnRfbmFtZShjLCBuLCAxKTsKICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCAwLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIDAsIGltcG9ydF9hbGlhcyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICBhbGlhc190eSBpbXBvcnRfYWxpYXMgPSBhbGlhc19mb3JfaW1wb3J0X25hbWUoYywgQ0hJTEQobiwgaSksIDEpOwogICAgICAgICAgICAgICAgIGlmICghaW1wb3J0X2FsaWFzKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGFsaWFzZXMsIGkgLyAyLCBpbXBvcnRfYWxpYXMpOworICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCBpIC8gMiwgaW1wb3J0X2FsaWFzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAobW9kICE9IE5VTEwpCkBAIC0zOTM1LDgyICszOTc3LDkzMiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVjb2RlX3VuaWNvZGUoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgaW50IHJhd21vZGUsIGNvbnN0IGNoYXIgKmVuY29kaW5nKQorZGVjb2RlX3VuaWNvZGVfd2l0aF9lc2NhcGVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCiB7CiAgICAgUHlPYmplY3QgKnYsICp1OwogICAgIGNoYXIgKmJ1ZjsKICAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKIAotICAgIGlmIChlbmNvZGluZyA9PSBOVUxMKSB7Ci0gICAgICAgIHUgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCi0gICAgICAgIGlmIChsZW4gPiBQWV9TSVpFX01BWCAvIDYpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgLyogIsOkIiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1Ci0gICAgICAgICAgICJcw6QiICgzIGJ5dGVzKSBtYXkgYmVjb21lICJcdTAwNWNcVTAwMDAwMEU0IiAoMTYgYnl0ZXMpLCBvciB+MTo2ICovCi0gICAgICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7Ci0gICAgICAgIGlmICh1ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7Ci0gICAgICAgIGVuZCA9IHMgKyBsZW47Ci0gICAgICAgIHdoaWxlIChzIDwgZW5kKSB7Ci0gICAgICAgICAgICBpZiAoKnMgPT0gJ1xcJykgewotICAgICAgICAgICAgICAgICpwKysgPSAqcysrOwotICAgICAgICAgICAgICAgIGlmICgqcyAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCpzICYgMHg4MCkgeyAvKiBYWFggaW5lZmZpY2llbnQgKi8KLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdzsKLSAgICAgICAgICAgICAgICBpbnQga2luZDsKLSAgICAgICAgICAgICAgICB2b2lkICpkYXRhOwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBpOwotICAgICAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKLSAgICAgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh3KTsKLSAgICAgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7Ci0gICAgICAgICAgICAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxcVSUwOHgiLCBjaHIpOwotICAgICAgICAgICAgICAgICAgICBwICs9IDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBTaG91bGQgYmUgaW1wb3NzaWJsZSB0byBvdmVyZmxvdyAqLwotICAgICAgICAgICAgICAgIGFzc2VydChwIC0gYnVmIDw9IFB5X1NJWkUodSkpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgLyogY2hlY2sgZm9yIGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICBpZiAobGVuID4gUFlfU0laRV9NQVggLyA2KQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAvKiAiw6QiICgyIGJ5dGVzKSBtYXkgYmVjb21lICJcVTAwMDAwMEU0IiAoMTAgYnl0ZXMpLCBvciAxOjUKKyAgICAgICAiXMOkIiAoMyBieXRlcykgbWF5IGJlY29tZSAiXHUwMDVjXFUwMDAwMDBFNCIgKDE2IGJ5dGVzKSwgb3IgfjE6NiAqLworICAgIHUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopTlVMTCwgbGVuICogNik7CisgICAgaWYgKHUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodSk7CisgICAgZW5kID0gcyArIGxlbjsKKyAgICB3aGlsZSAocyA8IGVuZCkgeworICAgICAgICBpZiAoKnMgPT0gJ1xcJykgeworICAgICAgICAgICAgKnArKyA9ICpzKys7CisgICAgICAgICAgICBpZiAoKnMgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHAsICJ1MDA1YyIpOworICAgICAgICAgICAgICAgIHAgKz0gNTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBsZW4gPSBwIC0gYnVmOwotICAgICAgICBzID0gYnVmOworICAgICAgICBpZiAoKnMgJiAweDgwKSB7IC8qIFhYWCBpbmVmZmljaWVudCAqLworICAgICAgICAgICAgUHlPYmplY3QgKnc7CisgICAgICAgICAgICBpbnQga2luZDsKKyAgICAgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKKyAgICAgICAgICAgIHcgPSBkZWNvZGVfdXRmOChjLCAmcywgZW5kKTsKKyAgICAgICAgICAgIGlmICh3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodyk7CisgICAgICAgICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodyk7CisgICAgICAgICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh3KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgICAgIFB5X1VDUzQgY2hyID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSk7CisgICAgICAgICAgICAgICAgc3ByaW50ZihwLCAiXFxVJTA4eCIsIGNocik7CisgICAgICAgICAgICAgICAgcCArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNob3VsZCBiZSBpbXBvc3NpYmxlIHRvIG92ZXJmbG93ICovCisgICAgICAgICAgICBhc3NlcnQocCAtIGJ1ZiA8PSBQeV9TSVpFKHUpKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwKysgPSAqcysrOworICAgICAgICB9CiAgICAgfQotICAgIGlmIChyYXdtb2RlKQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOworICAgIGxlbiA9IHAgLSBidWY7CisgICAgcyA9IGJ1ZjsKKworICAgIHYgPSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZShzLCBsZW4sIE5VTEwpOwogICAgIFB5X1hERUNSRUYodSk7CiAgICAgcmV0dXJuIHY7CiB9CiAKLS8qIHMgaXMgYSBQeXRob24gc3RyaW5nIGxpdGVyYWwsIGluY2x1ZGluZyB0aGUgYnJhY2tldGluZyBxdW90ZSBjaGFyYWN0ZXJzLAotICogYW5kIHIgJi9vciBiIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQgZXNjYXBlIHNlcXVlbmNlcyAoaWYgYW55KS4KLSAqIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlIGRlY29kZWQgUHl0aG9uIHN0cmluZyBvYmplY3QuCi0gKi8KKy8qIENvbXBpbGUgdGhpcyBleHByZXNzaW9uIGluIHRvIGFuIGV4cHJfdHkuIFdlIGtub3cgdGhhdCB3ZSBjYW4KKyAgIHRlbXBvcmFyaWx5IG1vZGlmeSB0aGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhpcyBzdHJpbmcKKyAgIChpdCdzICd7JyksIGFuZCB3ZSBrbm93IHdlIGNhbiB0ZW1wb3JhcmlseSBtb2RpZnkgdGhlIGNoYXJhY3RlcgorICAgYWZ0ZXIgdGhpcyBzdHJpbmcgKGl0IGlzIGEgJ30nKS4gIExldmVyYWdlIHRoaXMgdG8gY3JlYXRlIGEKKyAgIHN1Yi1zdHJpbmcgd2l0aCBlbm91Z2ggcm9vbSBmb3IgdXMgdG8gYWRkIHBhcmVucyBhcm91bmQgdGhlCisgICBleHByZXNzaW9uLiBUaGlzIGlzIHRvIGFsbG93IHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCBuZXdsaW5lcywgZm9yCisgICBleGFtcGxlLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfY29tcGlsZV9leHByKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgZXhwcl9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZXhwcl9lbmQsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCisKK3sKKyAgICBQeUNvbXBpbGVyRmxhZ3MgY2Y7CisgICAgbW9kX3R5IG1vZDsKKyAgICBjaGFyICp1dGZfZXhwcjsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfVUNTNCBlbmRfY2ggPSAtMTsKKyAgICBpbnQgYWxsX3doaXRlc3BhY2U7CisgICAgUHlPYmplY3QgKnN1YiA9IE5VTEw7CisKKyAgICAvKiBXZSBvbmx5IGRlY3JlZiBzdWIgaWYgd2UgYWxsb2NhdGVkIGl0IHdpdGggYSBQeVVuaWNvZGVfU3Vic3RyaW5nLgorICAgICAgIGRlY3JlZl9zdWIgcmVjb3JkcyB0aGF0LiAqLworICAgIGludCBkZWNyZWZfc3ViID0gMDsKKworICAgIGFzc2VydChzdHIpOworCisgICAgYXNzZXJ0KGV4cHJfc3RhcnQgPj0gMCAmJiBleHByX3N0YXJ0IDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kID49IDAgJiYgZXhwcl9lbmQgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPj0gZXhwcl9zdGFydCk7CisKKyAgICAvKiBUaGVyZSBoYXMgdG8gYmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvbiBlYWNoIHNpZGUgb2YgdGhlCisgICAgICAgZXhwcmVzc2lvbiBpbnNpZGUgdGhpcyBzdHIuIFRoaXMgd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGJlZm9yZQorICAgICAgIHdlJ3JlIGNhbGxlZC4gKi8KKyAgICBhc3NlcnQoZXhwcl9zdGFydCA+PSAxKTsKKyAgICBhc3NlcnQoZXhwcl9lbmQgPD0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKS0xKTsKKworICAgIC8qIElmIHRoZSBzdWJzdHJpbmcgaXMgYWxsIHdoaXRlc3BhY2UsIGl0J3MgYW4gZXJyb3IuIFdlIG5lZWQgdG8KKyAgICAgICAgY2F0Y2ggdGhpcyBoZXJlLCBhbmQgbm90IHdoZW4gd2UgY2FsbCBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nLAorICAgICAgICBiZWNhdXNlIHR1cm5pbmcgdGhlIGV4cHJlc3Npb24gJycgaW4gdG8gJygpJyB3b3VsZCBnbyBmcm9tCisgICAgICAgIGJlaW5nIGludmFsaWQgdG8gdmFsaWQuICovCisgICAgLyogTm90ZSB0aGF0IHRoaXMgY29kZSBzYXlzIGFuIGVtcHR5IHN0cmluZyBpcyBhbGwKKyAgICAgICAgd2hpdGVzcGFjZS4gVGhhdCdzIGltcG9ydGFudC4gVGhlcmUncyBhIHRlc3QgZm9yIGl0OiBmJ3t9Jy4gKi8KKyAgICBhbGxfd2hpdGVzcGFjZSA9IDE7CisgICAgZm9yIChpID0gZXhwcl9zdGFydDsgaSA8IGV4cHJfZW5kOyBpKyspIHsKKyAgICAgICAgaWYgKCFQeV9VTklDT0RFX0lTU1BBQ0UoUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsIGkpKSkgeworICAgICAgICAgICAgYWxsX3doaXRlc3BhY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGFsbF93aGl0ZXNwYWNlKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBJZiB0aGUgc3Vic3RyaW5nIHdpbGwgYmUgdGhlIGVudGlyZSBzb3VyY2Ugc3RyaW5nLCB3ZSBjYW4ndCB1c2UKKyAgICAgICAgUHlVbmljb2RlX1N1YnN0cmluZywgc2luY2UgaXQgd2lsbCByZXR1cm4gYW5vdGhlciByZWZlcmVuY2UgdG8KKyAgICAgICAgb3VyIG9yaWdpbmFsIHN0cmluZy4gQmVjYXVzZSB3ZSdyZSBtb2RpZnlpbmcgdGhlIHN0cmluZyBpbgorICAgICAgICBwbGFjZSwgdGhhdCdzIGEgbm8tbm8uIFNvLCBkZXRlY3QgdGhhdCBjYXNlIGFuZCBqdXN0IHVzZSBvdXIKKyAgICAgICAgc3RyaW5nIGRpcmVjdGx5LiAqLworCisgICAgaWYgKGV4cHJfc3RhcnQtMSA9PSAwICYmIGV4cHJfZW5kKzEgPT0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICAvKiBJZiBzdHIgaXMgd2VsbCBmb3JtZWQsIHRoZW4gdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXJzIG11c3QKKyAgICAgICAgICAgYmUgJ3snIGFuZCAnfScsIHJlc3BlY3RpdmVseS4gQnV0LCBpZiB0aGVyZSdzIGEgc3ludGF4CisgICAgICAgICAgIGVycm9yLCBmb3IgZXhhbXBsZSBmJ3szIScsIHRoZW4gdGhlIGxhc3QgY2hhciB3b24ndCBiZSBhCisgICAgICAgICAgIGNsb3NpbmcgYnJhY2UuIFNvLCByZW1lbWJlciB0aGUgbGFzdCBjaGFyYWN0ZXIgd2UgcmVhZCBpbgorICAgICAgICAgICBvcmRlciBmb3IgdXMgdG8gcmVzdG9yZSBpdC4gKi8KKyAgICAgICAgZW5kX2NoID0gUHlVbmljb2RlX1JlYWRDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxKTsKKyAgICAgICAgYXNzZXJ0KGVuZF9jaCAhPSAoUHlfVUNTNCktMSk7CisKKyAgICAgICAgLyogSW4gYWxsIGNhc2VzLCBob3dldmVyLCBzdGFydF9jaCBtdXN0IGJlICd7Jy4gKi8KKyAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9SZWFkQ2hhcihzdHIsIDApID09ICd7Jyk7CisKKyAgICAgICAgc3ViID0gc3RyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBhIHN1YnN0cmluZyBvYmplY3QuIEl0IG11c3QgYmUgYSBuZXcgb2JqZWN0LCB3aXRoCisgICAgICAgICAgIHJlZmNvdW50PT0xLCBzbyB0aGF0IHdlIGNhbiBtb2RpZnkgaXQuICovCisgICAgICAgIHN1YiA9IFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLCBleHByX3N0YXJ0LTEsIGV4cHJfZW5kKzEpOworICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGFzc2VydChzdWIgIT0gc3RyKTsgIC8qIE1ha2Ugc3VyZSBpdCdzIGEgbmV3IHN0cmluZy4gKi8KKyAgICAgICAgZGVjcmVmX3N1YiA9IDE7ICAgICAgLyogUmVtZW1iZXIgdG8gZGVhbGxvY2F0ZSBpdCBvbiBlcnJvci4gKi8KKyAgICB9CisKKyAgICAvKiBQdXQgKCkgYXJvdW5kIHRoZSBleHByZXNzaW9uLiAqLworICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN1YiwgMCwgJygnKSA8IDAgfHwKKyAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdWIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgJyknKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAvKiBObyBuZWVkIHRvIGZyZWUgdGhlIG1lbW9yeSByZXR1cm5lZCBoZXJlOiBpdCdzIG1hbmFnZWQgYnkgdGhlCisgICAgICAgc3RyaW5nLiAqLworICAgIHV0Zl9leHByID0gUHlVbmljb2RlX0FzVVRGOChzdWIpOworICAgIGlmICghdXRmX2V4cHIpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjZi5jZl9mbGFncyA9IFB5Q0ZfT05MWV9BU1Q7CisgICAgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyh1dGZfZXhwciwgIjxmc3RyaW5nPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ldmFsX2lucHV0LCAmY2YsIGMtPmNfYXJlbmEpOworICAgIGlmICghbW9kKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKHN1YiAhPSBzdHIpCisgICAgICAgIC8qIENsZWFyIGluc3RlYWQgb2YgZGVjcmVmIGluIGNhc2Ugd2UgZXZlciBtb2RpZnkgdGhpcyBjb2RlIHRvIGNoYW5nZQorICAgICAgICAgICB0aGUgZXJyb3IgaGFuZGxpbmc6IHRoaXMgaXMgc2FmZXN0IGJlY2F1c2UgdGhlIFhERUNSRUYgd29uJ3QgdHJ5CisgICAgICAgICAgIGFuZCBkZWNyZWYgaXQgd2hlbiBpdCdzIE5VTEwuICovCisgICAgICAgIC8qIE5vIG5lZWQgdG8gcmVzdG9yZSB0aGUgY2hhcnMgaW4gc3ViLCBzaW5jZSB3ZSBrbm93IGl0J3MgZ2V0dGluZworICAgICAgICAgICByZWFkeSB0byBnZXQgZGVsZXRlZCAocmVmY291bnQgbXVzdCBiZSAxLCBzaW5jZSB3ZSBnb3QgYSBuZXcgc3RyaW5nCisgICAgICAgICAgIGluIFB5VW5pY29kZV9TdWJzdHJpbmcpLiAqLworICAgICAgICBQeV9DTEVBUihzdWIpOworICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoIWRlY3JlZl9zdWIpOworICAgICAgICBhc3NlcnQoZW5kX2NoICE9IChQeV9VQ1M0KS0xKTsKKyAgICAgICAgLyogUmVzdG9yZSBzdHIsIHdoaWNoIHdlIGVhcmxpZXIgbW9kaWZpZWQgZGlyZWN0bHkuICovCisgICAgICAgIGlmIChQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgMCwgJ3snKSA8IDAgfHwKKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEsIGVuZF9jaCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIG1vZC0+di5FeHByZXNzaW9uLmJvZHk7CisKK2Vycm9yOgorICAgIC8qIE9ubHkgZGVjcmVmIHN1YiBpZiBpdCB3YXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gU3ViU3RyaW5nLiAqLworICAgIGlmIChkZWNyZWZfc3ViKQorICAgICAgICBQeV9YREVDUkVGKHN1Yik7CisKKyAgICBpZiAoZW5kX2NoICE9IChQeV9VQ1M0KS0xKSB7CisgICAgICAgIC8qIFdlIG9ubHkgZ2V0IGhlcmUgaWYgd2UgbW9kaWZpZWQgc3RyLiBNYWtlIHN1cmUgdGhhdCdzIHRoZQorICAgICAgICAgICBjYXNlOiBzdHIgd2lsbCBiZSBlcXVhbCB0byBzdWIuICovCisgICAgICAgIGlmIChzdHIgPT0gc3ViKSB7CisgICAgICAgICAgICAvKiBEb24ndCBjaGVjayB0aGUgZXJyb3IsIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBzZXQgdGhlCisgICAgICAgICAgICAgICBlcnJvciBzdGF0ZSAodGhhdCdzIHdoeSB3ZSdyZSBpbiAnZXJyb3InLCBhZnRlcgorICAgICAgICAgICAgICAgYWxsKS4gKi8KKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCAwLCAneycpOworICAgICAgICAgICAgUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSwgZW5kX2NoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGxpdGVyYWwuCisKKyAgIFJldHVybiAxIGlmIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsLCBidXQgd2Ugd2FudAorICAgdGhlIGNhbGxlciB0byBwcm9jZXNzIHRoZSBsaXRlcmFsIHVwIHRvIHRoaXMgcG9pbnQuIFVzZWQgZm9yCisgICBkb3VibGVkIGJyYWNlcy4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbChQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIFB5T2JqZWN0ICoqbGl0ZXJhbCwKKyAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNlX2x2bCwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICAvKiBHZXQgYW55IGxpdGVyYWwgc3RyaW5nLiBJdCBlbmRzIHdoZW4gd2UgaGl0IGFuIHVuLWRvdWJsZWQgYnJhY2UsIG9yIHRoZQorICAgICAgIGVuZCBvZiB0aGUgc3RyaW5nLiAqLworCisgICAgUHlfc3NpemVfdCBsaXRlcmFsX3N0YXJ0LCBsaXRlcmFsX2VuZDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKKyAgICBhc3NlcnQoKmxpdGVyYWwgPT0gTlVMTCk7CisKKyAgICBsaXRlcmFsX3N0YXJ0ID0gKm9mczsKKyAgICBmb3IgKDsgKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7ICpvZnMgKz0gMSkgeworICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAvKiBDaGVjayBmb3IgZG91YmxlZCBicmFjZXMsIGJ1dCBvbmx5IGF0IHRoZSB0b3AgbGV2ZWwuIElmCisgICAgICAgICAgICAgICB3ZSBjaGVja2VkIGF0IGV2ZXJ5IGxldmVsLCB0aGVuIGYnezA6ezN9fScgd291bGQgZmFpbAorICAgICAgICAgICAgICAgd2l0aCB0aGUgdHdvIGNsb3NpbmcgYnJhY2VzLiAqLworICAgICAgICAgICAgaWYgKHJlY3Vyc2VfbHZsID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKm9mcyArIDEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMgKyAxKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBnb2luZyB0byB0ZWxsIHRoZSBjYWxsZXIgdGhhdCB0aGUgbGl0ZXJhbCBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgIGhlcmUsIGJ1dCB0aGF0IHRoZXkgc2hvdWxkIGNvbnRpbnVlIHNjYW5uaW5nLiBCdXQgYWxzbworICAgICAgICAgICAgICAgICAgICAgICBza2lwIG92ZXIgdGhlIHNlY29uZCBicmFjZSB3aGVuIHdlIHJlc3VtZSBzY2FubmluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbF9lbmQgPSAqb2ZzICsgMTsKKyAgICAgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAxOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogV2hlcmUgYSBzaW5nbGUgJ3snIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBleHByZXNzaW9uLCBhCisgICAgICAgICAgICAgICAgICAgc2luZ2xlICd9JyBpcyBub3QgYWxsb3dlZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2UncmUgZWl0aGVyIGF0IGEgJ3snLCB3aGljaCBtZWFucyB3ZSdyZSBzdGFydGluZyBhbm90aGVyCisgICAgICAgICAgICAgICBleHByZXNzaW9uOyBvciBhICd9Jywgd2hpY2ggbWVhbnMgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzCisgICAgICAgICAgICAgICBmLXN0cmluZyAoZm9yIGEgbmVzdGVkIGZvcm1hdF9zcGVjKS4gKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGxpdGVyYWxfZW5kID0gKm9mczsKKworICAgIGFzc2VydCgqb2ZzID09IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ3snIHx8CisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd9Jyk7Citkb25lOgorICAgIGlmIChsaXRlcmFsX3N0YXJ0ICE9IGxpdGVyYWxfZW5kKSB7CisgICAgICAgICpsaXRlcmFsID0gUHlVbmljb2RlX1N1YnN0cmluZyhzdHIsIGxpdGVyYWxfc3RhcnQsIGxpdGVyYWxfZW5kKTsKKyAgICAgICAgaWYgKCEqbGl0ZXJhbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIGJlY2F1c2UgcGFyc2luZyBpcyByZWN1cnNpdmUuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19wYXJzZShQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbik7CisKKy8qIFBhcnNlIHRoZSBmLXN0cmluZyBzdHIsIHN0YXJ0aW5nIGF0IG9mcy4gV2Uga25vdyAqb2ZzIHN0YXJ0cyBhbgorICAgZXhwcmVzc2lvbiAoc28gaXQgbXVzdCBiZSBhICd7JykuIFJldHVybnMgdGhlIEZvcm1hdHRlZFZhbHVlIG5vZGUsCisgICB3aGljaCBpbmNsdWRlcyB0aGUgZXhwcmVzc2lvbiwgY29udmVyc2lvbiBjaGFyYWN0ZXIsIGFuZAorICAgZm9ybWF0X3NwZWMgZXhwcmVzc2lvbi4KKworICAgTm90ZSB0aGF0IEkgZG9uJ3QgZG8gYSBwZXJmZWN0IGpvYiBoZXJlOiBJIGRvbid0IG1ha2Ugc3VyZSB0aGF0IGEKKyAgIGNsb3NpbmcgYnJhY2UgZG9lc24ndCBtYXRjaCBhbiBvcGVuaW5nIHBhcmVuLCBmb3IgZXhhbXBsZS4gSXQKKyAgIGRvZXNuJ3QgbmVlZCB0byBlcnJvciBvbiBhbGwgaW52YWxpZCBleHByZXNzaW9ucywganVzdCBjb3JyZWN0bHkKKyAgIGZpbmQgdGhlIGVuZCBvZiBhbGwgdmFsaWQgb25lcy4gQW55IGVycm9ycyBpbnNpZGUgdGhlIGV4cHJlc3Npb24KKyAgIHdpbGwgYmUgY2F1Z2h0IHdoZW4gd2UgcGFyc2UgaXQgbGF0ZXIuICovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgIGV4cHJfdHkgKmV4cHJlc3Npb24sIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgLyogUmV0dXJuIC0xIG9uIGVycm9yLCBlbHNlIDAuICovCisKKyAgICBQeV9zc2l6ZV90IGV4cHJfc3RhcnQ7CisgICAgUHlfc3NpemVfdCBleHByX2VuZDsKKyAgICBleHByX3R5IHNpbXBsZV9leHByZXNzaW9uOworICAgIGV4cHJfdHkgZm9ybWF0X3NwZWMgPSBOVUxMOyAvKiBPcHRpb25hbCBmb3JtYXQgc3BlY2lmaWVyLiAqLworICAgIFB5X1VDUzQgY29udmVyc2lvbiA9IC0xOyAvKiBUaGUgY29udmVyc2lvbiBjaGFyLiAtMSBpZiBub3Qgc3BlY2lmaWVkLiAqLworCisgICAgZW51bSBQeVVuaWNvZGVfS2luZCBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICB2b2lkICpkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyKTsKKworICAgIC8qIDAgaWYgd2UncmUgbm90IGluIGEgc3RyaW5nLCBlbHNlIHRoZSBxdW90ZSBjaGFyIHdlJ3JlIHRyeWluZyB0bworICAgICAgIG1hdGNoIChzaW5nbGUgb3IgZG91YmxlIHF1b3RlKS4gKi8KKyAgICBQeV9VQ1M0IHF1b3RlX2NoYXIgPSAwOworCisgICAgLyogSWYgd2UncmUgaW5zaWRlIGEgc3RyaW5nLCAxPW5vcm1hbCwgMz10cmlwbGUtcXVvdGVkLiAqLworICAgIGludCBzdHJpbmdfdHlwZSA9IDA7CisKKyAgICAvKiBLZWVwIHRyYWNrIG9mIG5lc3RpbmcgbGV2ZWwgZm9yIGJyYWNlcy9wYXJlbnMvYnJhY2tldHMgaW4KKyAgICAgICBleHByZXNzaW9ucy4gKi8KKyAgICBQeV9zc2l6ZV90IG5lc3RlZF9kZXB0aCA9IDA7CisKKyAgICAvKiBDYW4gb25seSBuZXN0IG9uZSBsZXZlbCBkZWVwLiAqLworICAgIGlmIChyZWN1cnNlX2x2bCA+PSAyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cHJlc3Npb25zIG5lc3RlZCB0b28gZGVlcGx5Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBUaGUgZmlyc3QgY2hhciBtdXN0IGJlIGEgbGVmdCBicmFjZSwgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3R0ZW4KKyAgICAgICBoZXJlLiBTa2lwIG92ZXIgaXQuICovCisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd7Jyk7CisgICAgKm9mcyArPSAxOworCisgICAgZXhwcl9zdGFydCA9ICpvZnM7CisgICAgZm9yICg7ICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOyAqb2ZzICs9IDEpIHsKKyAgICAgICAgUHlfVUNTNCBjaDsKKworICAgICAgICAvKiBMb29wIGludmFyaWFudHMuICovCisgICAgICAgIGFzc2VydChuZXN0ZWRfZGVwdGggPj0gMCk7CisgICAgICAgIGFzc2VydCgqb2ZzID49IGV4cHJfc3RhcnQpOworICAgICAgICBpZiAocXVvdGVfY2hhcikKKyAgICAgICAgICAgIGFzc2VydChzdHJpbmdfdHlwZSA9PSAxIHx8IHN0cmluZ190eXBlID09IDMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoc3RyaW5nX3R5cGUgPT0gMCk7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgaWYgKHF1b3RlX2NoYXIpIHsKKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZy4gU2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQuICovCisgICAgICAgICAgICAvKiBUaGlzIGNvZGUgbmVlZHMgdG8gaW1wbGVtZW50IHRoZSBzYW1lIG5vbi1lcnJvciBsb2dpYworICAgICAgICAgICAgICAgYXMgdG9rX2dldCBmcm9tIHRva2VuaXplci5jLCBhdCB0aGUgbGV0dGVyX3F1b3RlCisgICAgICAgICAgICAgICBsYWJlbC4gVG8gYWN0dWFsbHkgc2hhcmUgdGhhdCBjb2RlIHdvdWxkIGJlIGEKKyAgICAgICAgICAgICAgIG5pZ2h0bWFyZS4gQnV0LCBpdCdzIHVubGlrZWx5IHRvIGNoYW5nZSBhbmQgaXMgc21hbGwsCisgICAgICAgICAgICAgICBzbyBkdXBsaWNhdGUgaXQgaGVyZS4gTm90ZSB3ZSBkb24ndCBuZWVkIHRvIGNhdGNoIGFsbAorICAgICAgICAgICAgICAgb2YgdGhlIGVycm9ycywgc2luY2UgdGhleSdsbCBiZSBjYXVnaHQgd2hlbiBwYXJzaW5nIHRoZQorICAgICAgICAgICAgICAgZXhwcmVzc2lvbi4gV2UganVzdCBuZWVkIHRvIG1hdGNoIHRoZSBub24tZXJyb3IKKyAgICAgICAgICAgICAgIGNhc2VzLiBUaHVzIHdlIGNhbiBpZ25vcmUgXG4gaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmdzLAorICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuIE9yIG5vbi10ZXJtaW5hdGVkIHN0cmluZ3MuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gcXVvdGVfY2hhcikgeworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyBtYXRjaCB0aGUgc3RyaW5nX3R5cGUgKHNpbmdsZSBvciB0cmlwbGUKKyAgICAgICAgICAgICAgICAgICBxdW90ZWQpPyAqLworICAgICAgICAgICAgICAgIGlmIChzdHJpbmdfdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgqb2ZzKzIgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09IGNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBhIG5vcm1hbCBzdHJpbmcuICovCisgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAwOworICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlJ3JlIGluc2lkZSBhIHN0cmluZywgYW5kIG5vdCBmaW5pc2hlZCB3aXRoIHRoZQorICAgICAgICAgICAgICAgc3RyaW5nLiBJZiB0aGlzIGlzIGEgYmFja3NsYXNoLCBza2lwIHRoZSBuZXh0IGNoYXIgKGl0CisgICAgICAgICAgICAgICBtaWdodCBiZSBhbiBlbmQgcXVvdGUgdGhhdCBuZWVkcyBza2lwcGluZykuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIGp1c3QgY29uc3VtZSB0aGlzIGNoYXJhY3RlciBub3JtYWxseS4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnXFwnICYmICpvZnMrMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IHNraXAgdGhlIG5leHQgY2hhciwgd2hhdGV2ZXIgaXQgaXMuICovCisgICAgICAgICAgICAgICAgKm9mcyArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcJycgfHwgY2ggPT0gJyInKSB7CisgICAgICAgICAgICAvKiBJcyB0aGlzIGEgdHJpcGxlIHF1b3RlZCBzdHJpbmc/ICovCisgICAgICAgICAgICBpZiAoKm9mcysyIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gY2ggJiYKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzIpID09IGNoKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAzOworICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgYSBub3JtYWwgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFN0YXJ0IGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHF1b3RlX2NoYXIgPSBjaDsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnWycgfHwgY2ggPT0gJ3snIHx8IGNoID09ICcoJykgeworICAgICAgICAgICAgbmVzdGVkX2RlcHRoKys7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJ10nIHx8IGNoID09ICd9JyB8fCBjaCA9PSAnKScpKSB7CisgICAgICAgICAgICBuZXN0ZWRfZGVwdGgtLTsKKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICAgICAgIC8qIEVycm9yOiBjYW4ndCBpbmNsdWRlIGEgY29tbWVudCBjaGFyYWN0ZXIsIGluc2lkZSBwYXJlbnMKKyAgICAgICAgICAgICAgIG9yIG5vdC4gKi8KKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmcgY2Fubm90IGluY2x1ZGUgJyMnIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobmVzdGVkX2RlcHRoID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAoY2ggPT0gJyEnIHx8IGNoID09ICc6JyB8fCBjaCA9PSAnfScpKSB7CisgICAgICAgICAgICAvKiBGaXJzdCwgdGVzdCBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiAiIT0iLiBTaW5jZSAnPScgaXMKKyAgICAgICAgICAgICAgIG5vdCBhbiBhbGxvd2VkIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBub3RoaW5nIGlzIGxvc3QgaW4KKyAgICAgICAgICAgICAgIHRoaXMgdGVzdC4gKi8KKyAgICAgICAgICAgIGlmIChjaCA9PSAnIScgJiYgKm9mcysxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSAnPScpCisgICAgICAgICAgICAgICAgLyogVGhpcyBpc24ndCBhIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBqdXN0IGNvbnRpbnVlLiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvKiBOb3JtYWwgd2F5IG91dCBvZiB0aGlzIGxvb3AuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEp1c3QgY29uc3VtZSB0aGlzIGNoYXIgYW5kIGxvb3AgYXJvdW5kLiAqLworICAgICAgICB9CisgICAgfQorICAgIGV4cHJfZW5kID0gKm9mczsKKyAgICAvKiBJZiB3ZSBsZWF2ZSB0aGlzIGxvb3AgaW4gYSBzdHJpbmcgb3Igd2l0aCBtaXNtYXRjaGVkIHBhcmVucywgd2UKKyAgICAgICBkb24ndCBjYXJlLiBXZSdsbCBnZXQgYSBzeW50YXggZXJyb3Igd2hlbiBjb21waWxpbmcgdGhlCisgICAgICAgZXhwcmVzc2lvbi4gQnV0LCB3ZSBjYW4gcHJvZHVjZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLCBzbworICAgICAgIGxldCdzIGp1c3QgZG8gdGhhdC4qLworICAgIGlmIChxdW90ZV9jaGFyKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAobmVzdGVkX2RlcHRoKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IG1pc21hdGNoZWQgJygnLCAneycsIG9yICdbJyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAvKiBDb21waWxlIHRoZSBleHByZXNzaW9uIGFzIHNvb24gYXMgcG9zc2libGUsIHNvIHdlIHNob3cgZXJyb3JzCisgICAgICAgcmVsYXRlZCB0byB0aGUgZXhwcmVzc2lvbiBiZWZvcmUgZXJyb3JzIHJlbGF0ZWQgdG8gdGhlCisgICAgICAgY29udmVyc2lvbiBvciBmb3JtYXRfc3BlYy4gKi8KKyAgICBzaW1wbGVfZXhwcmVzc2lvbiA9IGZzdHJpbmdfY29tcGlsZV9leHByKHN0ciwgZXhwcl9zdGFydCwgZXhwcl9lbmQsIGMsIG4pOworICAgIGlmICghc2ltcGxlX2V4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBhIGNvbnZlcnNpb24gY2hhciwgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJyEnKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIGNvbnZlcnNpb24gPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKTsKKyAgICAgICAgKm9mcyArPSAxOworCisgICAgICAgIC8qIFZhbGlkYXRlIHRoZSBjb252ZXJzaW9uLiAqLworICAgICAgICBpZiAoIShjb252ZXJzaW9uID09ICdzJyB8fCBjb252ZXJzaW9uID09ICdyJworICAgICAgICAgICAgICB8fCBjb252ZXJzaW9uID09ICdhJykpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGludmFsaWQgY29udmVyc2lvbiBjaGFyYWN0ZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJ3MnLCAncicsIG9yICdhJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2hlY2sgZm9yIHRoZSBmb3JtYXQgc3BlYywgaWYgcHJlc2VudC4gKi8KKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKyAgICBpZiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJzonKSB7CisgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgICAgIC8qIFBhcnNlIHRoZSBmb3JtYXQgc3BlYy4gKi8KKyAgICAgICAgZm9ybWF0X3NwZWMgPSBmc3RyaW5nX3BhcnNlKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCsxLCBjLCBuKTsKKyAgICAgICAgaWYgKCFmb3JtYXRfc3BlYykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKm9mcyA+PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgIT0gJ30nKQorICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgIC8qIFdlJ3JlIGF0IGEgcmlnaHQgYnJhY2UuIENvbnN1bWUgaXQuICovCisgICAgYXNzZXJ0KCpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKyAgICBhc3NlcnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcykgPT0gJ30nKTsKKyAgICAqb2ZzICs9IDE7CisKKyAgICAvKiBBbmQgbm93IGNyZWF0ZSB0aGUgRm9ybWF0dGVkVmFsdWUgbm9kZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBlbnRpcmUKKyAgICAgICBleHByZXNzaW9uIHdpdGggdGhlIGNvbnZlcnNpb24gYW5kIGZvcm1hdCBzcGVjLiAqLworICAgICpleHByZXNzaW9uID0gRm9ybWF0dGVkVmFsdWUoc2ltcGxlX2V4cHJlc3Npb24sIChpbnQpY29udmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgIGlmICghKmV4cHJlc3Npb24pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworCit1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc6CisgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgIHJldHVybiAtMTsKK30KKworLyogUmV0dXJuIC0xIG9uIGVycm9yLgorCisgICBSZXR1cm4gMCBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCAocG9zc2libGUgemVybyBsZW5ndGgpIGFuZCBhbgorICAgZXhwcmVzc2lvbiAoemVybyBsZW5ndGggaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorCisgICBSZXR1cm4gMSBpZiB3ZSBoYXZlIGEgbGl0ZXJhbCwgYnV0IG5vIGV4cHJlc3Npb24sIGFuZCB3ZSB3YW50IHRoZQorICAgY2FsbGVyIHRvIGNhbGwgdXMgYWdhaW4uIFRoaXMgaXMgdXNlZCB0byBkZWFsIHdpdGggZG91YmxlZAorICAgYnJhY2VzLgorCisgICBXaGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc3RyaW5nICdhe3tiezB9YycsIHRoaXMgZnVuY3Rpb24KKyAgIHdpbGwgcmV0dXJuOgorCisgICAxLiB0aGUgbGl0ZXJhbCAnYXsnIHdpdGggbm8gZXhwcmVzc2lvbiwgYW5kIGEgcmV0dXJuIHZhbHVlCisgICAgICBvZiAxLiBEZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlcmUncyBubyBleHByZXNzaW9uLCB0aGUgcmV0dXJuCisgICAgICB2YWx1ZSBvZiAxIG1lYW5zIHdlJ3JlIG5vdCBmaW5pc2hlZCB5ZXQuCisKKyAgIDIuIHRoZSBsaXRlcmFsICdiJyBhbmQgdGhlIGV4cHJlc3Npb24gJzAnLCB3aXRoIGEgcmV0dXJuIHZhbHVlIG9mCisgICAgICAwLiBUaGUgZmFjdCB0aGF0IHRoZXJlJ3MgYW4gZXhwcmVzc2lvbiBtZWFucyB3ZSdyZSBub3QgZmluaXNoZWQuCisKKyAgIDMuIGxpdGVyYWwgJ2MnIHdpdGggbm8gZXhwcmVzc2lvbiBhbmQgYSByZXR1cm4gdmFsdWUgb2YgMC4gVGhlCisgICAgICBjb21iaW5hdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIDAgd2l0aCBubyBleHByZXNzaW9uIG1lYW5zCisgICAgICB3ZSdyZSBmaW5pc2hlZC4KKyovCitzdGF0aWMgaW50Citmc3RyaW5nX2ZpbmRfbGl0ZXJhbF9hbmRfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqbGl0ZXJhbCwgZXhwcl90eSAqZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgaW50IHJlc3VsdDsKKworICAgIGFzc2VydCgqbGl0ZXJhbCA9PSBOVUxMICYmICpleHByZXNzaW9uID09IE5VTEwpOworCisgICAgLyogR2V0IGFueSBsaXRlcmFsIHN0cmluZy4gKi8KKyAgICByZXN1bHQgPSBmc3RyaW5nX2ZpbmRfbGl0ZXJhbChzdHIsIG9mcywgbGl0ZXJhbCwgcmVjdXJzZV9sdmwsIGMsIG4pOworICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYXNzZXJ0KHJlc3VsdCA9PSAwIHx8IHJlc3VsdCA9PSAxKTsKKworICAgIGlmIChyZXN1bHQgPT0gMSkKKyAgICAgICAgLyogV2UgaGF2ZSBhIGxpdGVyYWwsIGJ1dCBkb24ndCBsb29rIGF0IHRoZSBleHByZXNzaW9uLiAqLworICAgICAgICByZXR1cm4gMTsKKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ30nKQorICAgICAgICAvKiBXZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgb3IgdGhlIGVuZCBvZiBhIG5lc3RlZAorICAgICAgICAgICBmLXN0cmluZzogbm8gZXhwcmVzc2lvbi4gVGhlIHRvcC1sZXZlbCBlcnJvciBjYXNlIHdoZXJlIHdlCisgICAgICAgICAgIGV4cGVjdCB0byBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYnV0IHdlJ3JlIGF0IGEgJ30nIGlzCisgICAgICAgICAgIGhhbmRsZWQgbGF0ZXIuICovCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogV2UgbXVzdCBub3cgYmUgdGhlIHN0YXJ0IG9mIGFuIGV4cHJlc3Npb24sIG9uIGEgJ3snLiAqLworICAgIGFzc2VydCgqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgPT0gJ3snKTsKKworICAgIGlmIChmc3RyaW5nX2ZpbmRfZXhwcihzdHIsIG9mcywgcmVjdXJzZV9sdmwsIGV4cHJlc3Npb24sIGMsIG4pIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHJldHVybiAwOworCitlcnJvcjoKKyAgICBQeV9DTEVBUigqbGl0ZXJhbCk7CisgICAgcmV0dXJuIC0xOworfQorCisjZGVmaW5lIEVYUFJMSVNUX05fQ0FDSEVEICA2NAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogSW5jcmVtZW50YWxseSBidWlsZCBhbiBhcnJheSBvZiBleHByX3R5LCBzbyBiZSB1c2VkIGluIGFuCisgICAgICAgYXNkbF9zZXEuIENhY2hlIHNvbWUgc21hbGwgYnV0IHJlYXNvbmFibHkgc2l6ZWQgbnVtYmVyIG9mCisgICAgICAgZXhwcl90eSdzLCBhbmQgdGhlbiBhZnRlciB0aGF0IHN0YXJ0IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcsCisgICAgICAgZG91YmxpbmcgdGhlIG51bWJlciBhbGxvY2F0ZWQgZWFjaCB0aW1lLiBOb3RlIHRoYXQgdGhlIGYtc3RyaW5nCisgICAgICAgZid7MH1hezF9JyBjb250YWlucyAzIGV4cHJfdHknczogMiBGb3JtYXR0ZWRWYWx1ZSdzLCBhbmQgb25lCisgICAgICAgU3RyIGZvciB0aGUgbGl0ZXJhbCAnYScuIFNvIHlvdSBhZGQgZXhwcl90eSdzIGFib3V0IHR3aWNlIGFzCisgICAgICAgZmFzdCBhcyB5b3UgYWRkIGV4cmVzc2lvbnMgaW4gYW4gZi1zdHJpbmcuICovCisKKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsgIC8qIE51bWJlciB3ZSd2ZSBhbGxvY2F0ZWQuICovCisgICAgUHlfc3NpemVfdCBzaXplOyAgICAgICAvKiBOdW1iZXIgd2UndmUgdXNlZC4gKi8KKyAgICBleHByX3R5ICAgICpwOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSB3ZSdyZSBhY3R1YWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcuIFdpbGwgcG9pbnQgdG8gJ2RhdGEnIHVudGlsIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nLiAqLworICAgIGV4cHJfdHkgICAgZGF0YVtFWFBSTElTVF9OX0NBQ0hFRF07Cit9IEV4cHJMaXN0OworCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCkKKyNlbHNlCitzdGF0aWMgdm9pZAorRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhFeHByTGlzdCAqbCkKK3sKKyAgICAvKiBDaGVjayBvdXIgaW52YXJpYW50cy4gTWFrZSBzdXJlIHRoaXMgb2JqZWN0IGlzICJsaXZlIiwgYW5kCisgICAgICAgaGFzbid0IGJlZW4gZGVhbGxvY2F0ZWQuICovCisgICAgYXNzZXJ0KGwtPnNpemUgPj0gMCk7CisgICAgYXNzZXJ0KGwtPnAgIT0gTlVMTCk7CisgICAgaWYgKGwtPnNpemUgPD0gRVhQUkxJU1RfTl9DQUNIRUQpCisgICAgICAgIGFzc2VydChsLT5kYXRhID09IGwtPnApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9Jbml0KEV4cHJMaXN0ICpsKQoreworICAgIGwtPmFsbG9jYXRlZCA9IEVYUFJMSVNUX05fQ0FDSEVEOworICAgIGwtPnNpemUgPSAwOworCisgICAgLyogVW50aWwgd2Ugc3RhcnQgYWxsb2NhdGluZyBkeW5hbWljYWxseSwgcCBwb2ludHMgdG8gZGF0YS4gKi8KKyAgICBsLT5wID0gbC0+ZGF0YTsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7Cit9CisKK3N0YXRpYyBpbnQKK0V4cHJMaXN0X0FwcGVuZChFeHByTGlzdCAqbCwgZXhwcl90eSBleHApCit7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKyAgICBpZiAobC0+c2l6ZSA+PSBsLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgLyogV2UgbmVlZCB0byBhbGxvYyAob3IgcmVhbGxvYykgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgUHlfc3NpemVfdCBuZXdfc2l6ZSA9IGwtPmFsbG9jYXRlZCAqIDI7CisKKyAgICAgICAgLyogU2VlIGlmIHdlJ3ZlIGV2ZXIgYWxsb2NhdGVkIGFueXRoaW5nIGR5bmFtaWNhbGx5LiAqLworICAgICAgICBpZiAobC0+cCA9PSBsLT5kYXRhKSB7CisgICAgICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgICAgICAvKiBXZSdyZSBzdGlsbCB1c2luZyB0aGUgY2FjaGVkIGRhdGEuIFN3aXRjaCB0bworICAgICAgICAgICAgICAgYWxsb2MtaW5nLiAqLworICAgICAgICAgICAgbC0+cCA9IFB5TWVtX1Jhd01hbGxvYyhzaXplb2YoZXhwcl90eSkgKiBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWwtPnApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgLyogQ29weSB0aGUgY2FjaGVkIGRhdGEgaW50byB0aGUgbmV3IGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5zaXplOyBpKyspCisgICAgICAgICAgICAgICAgbC0+cFtpXSA9IGwtPmRhdGFbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IHJlYWxsb2MuICovCisgICAgICAgICAgICBleHByX3R5ICp0bXAgPSBQeU1lbV9SYXdSZWFsbG9jKGwtPnAsIHNpemVvZihleHByX3R5KSAqIG5ld19zaXplKTsKKyAgICAgICAgICAgIGlmICghdG1wKSB7CisgICAgICAgICAgICAgICAgUHlNZW1fUmF3RnJlZShsLT5wKTsKKyAgICAgICAgICAgICAgICBsLT5wID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLT5wID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgbC0+YWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgIGFzc2VydChsLT5hbGxvY2F0ZWQgPT0gMiAqIGwtPnNpemUpOworICAgIH0KKworICAgIGwtPnBbbC0+c2l6ZSsrXSA9IGV4cDsKKworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitFeHByTGlzdF9EZWFsbG9jKEV4cHJMaXN0ICpsKQoreworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisKKyAgICAvKiBJZiB0aGVyZSdzIGJlZW4gYW4gZXJyb3IsIG9yIHdlJ3ZlIG5ldmVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCwKKyAgICAgICBkbyBub3RoaW5nLiAqLworICAgIGlmICghbC0+cCB8fCBsLT5wID09IGwtPmRhdGEpIHsKKyAgICAgICAgLyogRG8gbm90aGluZy4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBXZSBoYXZlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gRnJlZSB0aGUgbWVtb3J5LiAqLworICAgICAgICBQeU1lbV9SYXdGcmVlKGwtPnApOworICAgIH0KKyAgICBsLT5wID0gTlVMTDsKKyAgICBsLT5zaXplID0gLTE7Cit9CisKK3N0YXRpYyBhc2RsX3NlcSAqCitFeHByTGlzdF9GaW5pc2goRXhwckxpc3QgKmwsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGFzZGxfc2VxICpzZXE7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGFzZGxfc2VxIGFuZCBjb3B5IHRoZSBleHByZXNzaW9ucyBpbiB0byBpdC4gKi8KKyAgICBzZXEgPSBfUHlfYXNkbF9zZXFfbmV3KGwtPnNpemUsIGFyZW5hKTsKKyAgICBpZiAoc2VxKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGwtPnNpemU7IGkrKykKKyAgICAgICAgICAgIGFzZGxfc2VxX1NFVChzZXEsIGksIGwtPnBbaV0pOworICAgIH0KKyAgICBFeHByTGlzdF9EZWFsbG9jKGwpOworICAgIHJldHVybiBzZXE7Cit9CisKKy8qIFRoZSBGc3RyaW5nUGFyc2VyIGlzIGRlc2lnbmVkIHRvIGFkZCBhIG1peCBvZiBzdHJpbmdzIGFuZAorICAgZi1zdHJpbmdzLCBhbmQgY29uY2F0IHRoZW0gdG9nZXRoZXIgYXMgbmVlZGVkLiBVbHRpbWF0ZWx5LCBpdAorICAgZ2VuZXJhdGVzIGFuIGV4cHJfdHkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3QgKmxhc3Rfc3RyOworICAgIEV4cHJMaXN0IGV4cHJfbGlzdDsKK30gRnN0cmluZ1BhcnNlcjsKKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpCisjZWxzZQorc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RhdGUtPmxhc3Rfc3RyKSk7CisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cygmc3RhdGUtPmV4cHJfbGlzdCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK0ZzdHJpbmdQYXJzZXJfSW5pdChGc3RyaW5nUGFyc2VyICpzdGF0ZSkKK3sKKyAgICBzdGF0ZS0+bGFzdF9zdHIgPSBOVUxMOworICAgIEV4cHJMaXN0X0luaXQoJnN0YXRlLT5leHByX2xpc3QpOworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX0RlYWxsb2MoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIFB5X1hERUNSRUYoc3RhdGUtPmxhc3Rfc3RyKTsKKyAgICBFeHByTGlzdF9EZWFsbG9jKCZzdGF0ZS0+ZXhwcl9saXN0KTsKK30KKworLyogTWFrZSBhIFN0ciBub2RlLCBidXQgZGVjcmVmIHRoZSBQeVVuaWNvZGUgb2JqZWN0IGJlaW5nIGFkZGVkLiAqLworc3RhdGljIGV4cHJfdHkKK21ha2Vfc3RyX25vZGVfYW5kX2RlbChQeU9iamVjdCAqKnN0ciwgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSogbikKK3sKKyAgICBQeU9iamVjdCAqcyA9ICpzdHI7CisgICAgKnN0ciA9IE5VTEw7CisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKyAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBzKSA8IDApIHsKKyAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFN0cihzLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7Cit9CisKKy8qIEFkZCBhIG5vbi1mLXN0cmluZyAodGhhdCBpcywgYSByZWd1bGFyIGxpdGVyYWwgc3RyaW5nKS4gc3RyIGlzCisgICBkZWNyZWYnZC4gKi8KK3N0YXRpYyBpbnQKK0ZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrRXhhY3Qoc3RyKSk7CisKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSA9PSAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICAvKiBXZSBkaWRuJ3QgaGF2ZSBhIHN0cmluZyBiZWZvcmUsIHNvIGp1c3QgcmVtZW1iZXIgdGhpcyBvbmUuICovCisgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDb25jYXRlbmF0ZSB0aGlzIHdpdGggdGhlIHByZXZpb3VzIHN0cmluZy4gKi8KKyAgICAgICAgUHlVbmljb2RlX0FwcGVuZEFuZERlbCgmc3RhdGUtPmxhc3Rfc3RyLCBzdHIpOworICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogUGFyc2UgYW4gZi1zdHJpbmcuIFRoZSBmLXN0cmluZyBpcyBpbiBzdHIsIHN0YXJ0aW5nIGF0IG9mcywgd2l0aCBubyAnZicKKyAgIG9yIHF1b3Rlcy4gc3RyIGlzIG5vdCBkZWNyZWYnZCwgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpdCdzIHVzZWQgZWxzZXdoZXJlLgorICAgQW5kIGlmIHdlJ3JlIG9ubHkgbG9va2luZyBhdCBhIHBhcnQgb2YgYSBzdHJpbmcsIHRoZW4gZGVjcmVmJ2luZyBpcworICAgZGVmaW5pdGVseSBub3QgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvISAqLworc3RhdGljIGludAorRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKEZzdHJpbmdQYXJzZXIgKnN0YXRlLCBQeU9iamVjdCAqc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKworICAgIC8qIFBhcnNlIHRoZSBmLXN0cmluZy4gKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBQeU9iamVjdCAqbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIGV4cHJfdHkgZXhwcmVzc2lvbiA9IE5VTEw7CisKKyAgICAgICAgLyogSWYgdGhlcmUncyBhIHplcm8gbGVuZ3RoIGxpdGVyYWwgaW4gZnJvbnQgb2YgdGhlCisgICAgICAgICAgIGV4cHJlc3Npb24sIGxpdGVyYWwgd2lsbCBiZSBOVUxMLiBJZiB3ZSdyZSBhdCB0aGUgZW5kIG9mCisgICAgICAgICAgIHRoZSBmLXN0cmluZywgZXhwcmVzc2lvbiB3aWxsIGJlIE5VTEwgKHVubGVzcyByZXN1bHQgPT0gMSwKKyAgICAgICAgICAgc2VlIGJlbG93KS4gKi8KKyAgICAgICAgaW50IHJlc3VsdCA9IGZzdHJpbmdfZmluZF9saXRlcmFsX2FuZF9leHByKHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXRlcmFsLCAmZXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIG4pOworICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvKiBBZGQgdGhlIGxpdGVyYWwsIGlmIGFueS4gKi8KKyAgICAgICAgaWYgKCFsaXRlcmFsKSB7CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiBKdXN0IGxlYXZlIGxhc3Rfc3RyIGFsb25lIChhbmQgcG9zc2libHkKKyAgICAgICAgICAgICAgIE5VTEwpLiAqLworICAgICAgICB9IGVsc2UgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IGxpdGVyYWw7CisgICAgICAgICAgICBsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBsaXRlcmFsLCBjb25jYXRlbmF0ZSBpdC4gKi8KKyAgICAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfR0VUX0xFTkdUSChsaXRlcmFsKSAhPSAwKTsKKyAgICAgICAgICAgIGlmIChGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbChzdGF0ZSwgbGl0ZXJhbCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGxpdGVyYWwgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGFzc2VydCghc3RhdGUtPmxhc3Rfc3RyIHx8CisgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdGF0ZS0+bGFzdF9zdHIpICE9IDApOworCisgICAgICAgIC8qIFdlJ3ZlIGRlYWx0IHdpdGggdGhlIGxpdGVyYWwgbm93LiBJdCBjYW4ndCBiZSBsZWFrZWQgb24gZnVydGhlcgorICAgICAgICAgICBlcnJvcnMuICovCisgICAgICAgIGFzc2VydChsaXRlcmFsID09IE5VTEwpOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSBzaG91bGQganVzdCBsb29wIGFyb3VuZCB0byBnZXQgdGhlIG5leHQgbGl0ZXJhbAorICAgICAgICAgICBhbmQgZXhwcmVzc2lvbiwgd2hpbGUgaWdub3JpbmcgdGhlIGV4cHJlc3Npb24gdGhpcworICAgICAgICAgICB0aW1lLiBUaGlzIGlzIHVzZWQgZm9yIHVuLWRvdWJsaW5nIGJyYWNlcywgYXMgYW4KKyAgICAgICAgICAgb3B0aW1pemF0aW9uLiAqLworICAgICAgICBpZiAocmVzdWx0ID09IDEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIWV4cHJlc3Npb24pCisgICAgICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhpcyBmLXN0cmluZy4gKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFdlIGtub3cgd2UgaGF2ZSBhbiBleHByZXNzaW9uLiBDb252ZXJ0IGFueSBleGlzdGluZyBzdHJpbmcKKyAgICAgICAgICAgdG8gYSBTdHIgbm9kZS4gKi8KKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIERvIG5vdGhpbmcuIE5vIHByZXZpb3VzIGxpdGVyYWwuICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJ0IHRoZSBleGlzdGluZyBsYXN0X3N0ciBsaXRlcmFsIHRvIGEgU3RyIG5vZGUuICovCisgICAgICAgICAgICBleHByX3R5IHN0ciA9IG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICAgICAgICAgIGlmICghc3RyIHx8IEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgc3RyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEV4cHJMaXN0X0FwcGVuZCgmc3RhdGUtPmV4cHJfbGlzdCwgZXhwcmVzc2lvbikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGFzc2VydCgqb2ZzIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworCisgICAgLyogSWYgcmVjdXJzZV9sdmwgaXMgemVybywgdGhlbiB3ZSBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgc3RyaW5nLiBPdGhlcndpc2UsIHdlIG11c3QgYmUgYXQgYSByaWdodCBicmFjZS4gKi8KKworICAgIGlmIChyZWN1cnNlX2x2bCA9PSAwICYmICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IHVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChyZWN1cnNlX2x2bCAhPSAwICYmIFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCAqb2ZzKSAhPSAnfScpIHsKKyAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCB0aGUgcGFydGlhbCBzdGF0ZSByZWZsZWN0ZWQgaW4gbGFzdF9zdHIgYW5kIGV4cHJfbGlzdCB0byBhbgorICAgZXhwcl90eS4gVGhlIGV4cHJfdHkgY2FuIGJlIGEgU3RyLCBvciBhIEpvaW5lZFN0ci4gKi8KK3N0YXRpYyBleHByX3R5CitGc3RyaW5nUGFyc2VyX0ZpbmlzaChGc3RyaW5nUGFyc2VyICpzdGF0ZSwgc3RydWN0IGNvbXBpbGluZyAqYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgKm4pCit7CisgICAgYXNkbF9zZXEgKnNlcTsKKworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICAvKiBJZiB3ZSdyZSBqdXN0IGEgY29uc3RhbnQgc3RyaW5nIHdpdGggbm8gZXhwcmVzc2lvbnMsIHJldHVybgorICAgICAgIHRoYXQuICovCisgICAgaWYoc3RhdGUtPmV4cHJfbGlzdC5zaXplID09IDApIHsKKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgICAgIC8qIENyZWF0ZSBhIHplcm8gbGVuZ3RoIHN0cmluZy4gKi8KKyAgICAgICAgICAgIHN0YXRlLT5sYXN0X3N0ciA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKKyAgICAgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBTdHIgbm9kZSBvdXQgb2YgbGFzdF9zdHIsIGlmIG5lZWRlZC4gSXQgd2lsbCBiZSB0aGUKKyAgICAgICBsYXN0IG5vZGUgaW4gb3VyIGV4cHJlc3Npb24gbGlzdC4gKi8KKyAgICBpZiAoc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgIGV4cHJfdHkgc3RyID0gbWFrZV9zdHJfbm9kZV9hbmRfZGVsKCZzdGF0ZS0+bGFzdF9zdHIsIGMsIG4pOworICAgICAgICBpZiAoIXN0ciB8fCBFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIHN0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgLyogVGhpcyBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkLiAqLworICAgIGFzc2VydChzdGF0ZS0+bGFzdF9zdHIgPT0gTlVMTCk7CisKKyAgICBzZXEgPSBFeHByTGlzdF9GaW5pc2goJnN0YXRlLT5leHByX2xpc3QsIGMtPmNfYXJlbmEpOworICAgIGlmICghc2VxKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogSWYgdGhlcmUncyBvbmx5IG9uZSBleHByZXNzaW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSwgd2UgbmVlZAorICAgICAgIHRvIGpvaW4gdGhlbSB0b2dldGhlci4gKi8KKyAgICBpZiAoc2VxLT5zaXplID09IDEpCisgICAgICAgIHJldHVybiBzZXEtPmVsZW1lbnRzWzBdOworCisgICAgcmV0dXJuIEpvaW5lZFN0cihzZXEsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKworZXJyb3I6CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKHN0YXRlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogR2l2ZW4gYW4gZi1zdHJpbmcgKHdpdGggbm8gJ2YnIG9yIHF1b3RlcykgdGhhdCdzIGluIHN0ciBzdGFydGluZyBhdAorICAgb2ZzLCBwYXJzZSBpdCBpbnRvIGFuIGV4cHJfdHkuIFJldHVybiBOVUxMIG9uIGVycm9yLiBEb2VzIG5vdAorICAgZGVjcmVmIHN0ci4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX3BhcnNlKFB5T2JqZWN0ICpzdHIsIFB5X3NzaXplX3QgKm9mcywgaW50IHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisKKyAgICBGc3RyaW5nUGFyc2VyX0luaXQoJnN0YXRlKTsKKyAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRGc3RyaW5nKCZzdGF0ZSwgc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgbikgPCAwKSB7CisgICAgICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKK30KKworLyogbiBpcyBhIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbCwgaW5jbHVkaW5nIHRoZSBicmFja2V0aW5nIHF1b3RlCisgICBjaGFyYWN0ZXJzLCBhbmQgciwgYiwgdSwgJi9vciBmIHByZWZpeGVzIChpZiBhbnkpLCBhbmQgZW1iZWRkZWQKKyAgIGVzY2FwZSBzZXF1ZW5jZXMgKGlmIGFueSkuIHBhcnNlc3RyIHBhcnNlcyBpdCwgYW5kIHJldHVybnMgdGhlCisgICBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LiAgSWYgdGhlIHN0cmluZyBpcyBhbiBmLXN0cmluZywgc2V0CisgICAqZm1vZGUgYW5kIHJldHVybiB0aGUgdW5wYXJzZWQgc3RyaW5nIG9iamVjdC4KKyovCiBzdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCitwYXJzZXN0cihzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuLCBpbnQgKmJ5dGVzbW9kZSwgaW50ICpmbW9kZSkKIHsKICAgICBzaXplX3QgbGVuOwogICAgIGNvbnN0IGNoYXIgKnMgPSBTVFIobik7CiAgICAgaW50IHF1b3RlID0gUHlfQ0hBUk1BU0soKnMpOwogICAgIGludCByYXdtb2RlID0gMDsKLSAgICBpbnQgbmVlZF9lbmNvZGluZzsKICAgICBpZiAoUHlfSVNBTFBIQShxdW90ZSkpIHsKICAgICAgICAgd2hpbGUgKCEqYnl0ZXNtb2RlIHx8ICFyYXdtb2RlKSB7CiAgICAgICAgICAgICBpZiAocXVvdGUgPT0gJ2InIHx8IHF1b3RlID09ICdCJykgewpAQCAtNDAyNCwxNSArNDkxNiwyNCBAQAogICAgICAgICAgICAgICAgIHF1b3RlID0gKisrczsKICAgICAgICAgICAgICAgICByYXdtb2RlID0gMTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1b3RlID09ICdmJyB8fCBxdW90ZSA9PSAnRicpIHsKKyAgICAgICAgICAgICAgICBxdW90ZSA9ICorK3M7CisgICAgICAgICAgICAgICAgKmZtb2RlID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIGlmICgqZm1vZGUgJiYgKmJ5dGVzbW9kZSkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGlmIChxdW90ZSAhPSAnXCcnICYmIHF1b3RlICE9ICdcIicpIHsKICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KKyAgICAvKiBTa2lwIHRoZSBsZWFkaW5nIHF1b3RlIGNoYXIuICovCiAgICAgcysrOwogICAgIGxlbiA9IHN0cmxlbihzKTsKICAgICBpZiAobGVuID4gSU5UX01BWCkgewpAQCAtNDA0MSwyMiArNDk0MiwyNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKHNbLS1sZW5dICE9IHF1b3RlKSB7CisgICAgICAgIC8qIExhc3QgcXVvdGUgY2hhciBtdXN0IG1hdGNoIHRoZSBmaXJzdC4gKi8KICAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAobGVuID49IDQgJiYgc1swXSA9PSBxdW90ZSAmJiBzWzFdID09IHF1b3RlKSB7CisgICAgICAgIC8qIEEgdHJpcGxlIHF1b3RlZCBzdHJpbmcuIFdlJ3ZlIGFscmVhZHkgc2tpcHBlZCBvbmUgcXVvdGUgYXQKKyAgICAgICAgICAgdGhlIHN0YXJ0IGFuZCBvbmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiBOb3cgc2tpcCB0aGUKKyAgICAgICAgICAgdHdvIGF0IHRoZSBzdGFydC4gKi8KICAgICAgICAgcyArPSAyOwogICAgICAgICBsZW4gLT0gMjsKKyAgICAgICAgLyogQW5kIGNoZWNrIHRoYXQgdGhlIGxhc3QgdHdvIG1hdGNoLiAqLwogICAgICAgICBpZiAoc1stLWxlbl0gIT0gcXVvdGUgfHwgc1stLWxlbl0gIT0gcXVvdGUpIHsKICAgICAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCEqYnl0ZXNtb2RlICYmICFyYXdtb2RlKSB7Ci0gICAgICAgIHJldHVybiBkZWNvZGVfdW5pY29kZShjLCBzLCBsZW4sIHJhd21vZGUsIGMtPmNfZW5jb2RpbmcpOwotICAgIH0KKyAgICAvKiBBdm9pZCBpbnZva2luZyBlc2NhcGUgZGVjb2Rpbmcgcm91dGluZXMgaWYgcG9zc2libGUuICovCisgICAgcmF3bW9kZSA9IHJhd21vZGUgfHwgc3RyY2hyKHMsICdcXCcpID09IE5VTEw7CiAgICAgaWYgKCpieXRlc21vZGUpIHsKLSAgICAgICAgLyogRGlzYWxsb3cgbm9uLWFzY2lpIGNoYXJhY3RlcnMgKGJ1dCBub3QgZXNjYXBlcykgKi8KKyAgICAgICAgLyogRGlzYWxsb3cgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuICovCiAgICAgICAgIGNvbnN0IGNoYXIgKmNoOwogICAgICAgICBmb3IgKGNoID0gczsgKmNoOyBjaCsrKSB7CiAgICAgICAgICAgICBpZiAoUHlfQ0hBUk1BU0soKmNoKSA+PSAweDgwKSB7CkBAIC00MDY1LDcxICs0OTcwLDkzIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9Ci0gICAgbmVlZF9lbmNvZGluZyA9ICghKmJ5dGVzbW9kZSAmJiBjLT5jX2VuY29kaW5nICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChjLT5jX2VuY29kaW5nLCAidXRmLTgiKSAhPSAwKTsKLSAgICBpZiAocmF3bW9kZSB8fCBzdHJjaHIocywgJ1xcJykgPT0gTlVMTCkgewotICAgICAgICBpZiAobmVlZF9lbmNvZGluZykgewotICAgICAgICAgICAgUHlPYmplY3QgKnYsICp1ID0gUHlVbmljb2RlX0RlY29kZVVURjgocywgbGVuLCBOVUxMKTsKLSAgICAgICAgICAgIGlmICh1ID09IE5VTEwgfHwgISpieXRlc21vZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHU7Ci0gICAgICAgICAgICB2ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1LCBjLT5jX2VuY29kaW5nLCBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9IGVsc2UgaWYgKCpieXRlc21vZGUpIHsKKyAgICAgICAgaWYgKHJhd21vZGUpCiAgICAgICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChjLT5jX2VuY29kaW5nLCAidXRmLTgiKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplKHMsIGxlbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZUxhdGluMShzLCBsZW4sIE5VTEwpOwotICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBQeUJ5dGVzX0RlY29kZUVzY2FwZShzLCBsZW4sIE5VTEwsIC8qIGlnbm9yZWQgKi8gMCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJhd21vZGUpCisgICAgICAgICAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bChzLCBsZW4sIE5VTEwsIE5VTEwpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZGVjb2RlX3VuaWNvZGVfd2l0aF9lc2NhcGVzKGMsIHMsIGxlbik7CiAgICAgfQotICAgIHJldHVybiBQeUJ5dGVzX0RlY29kZUVzY2FwZShzLCBsZW4sIE5VTEwsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2VuY29kaW5nID8gYy0+Y19lbmNvZGluZyA6IE5VTEwpOwogfQogCi0vKiBCdWlsZCBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IG91dCBvZiBhIFNUUklORysgYXRvbS4gIFRoaXMgdGFrZXMgY2FyZSBvZgotICogY29tcGlsZS10aW1lIGxpdGVyYWwgY2F0ZW5hdGlvbiwgY2FsbGluZyBwYXJzZXN0cigpIG9uIGVhY2ggcGllY2UsIGFuZAotICogcGFzdGluZyB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgdG9nZXRoZXIuCi0gKi8KLXN0YXRpYyBQeU9iamVjdCAqCi1wYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpCisvKiBBY2NlcHRzIGEgU1RSSU5HKyBhdG9tLCBhbmQgcHJvZHVjZXMgYW4gZXhwcl90eSBub2RlLiBSdW4gdGhyb3VnaAorICAgZWFjaCBTVFJJTkcgYXRvbSwgYW5kIHByb2Nlc3MgaXQgYXMgbmVlZGVkLiBGb3IgYnl0ZXMsIGp1c3QKKyAgIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXIsIGFuZCB0aGUgcmVzdWx0IHdpbGwgYmUgYSBCeXRlcyBub2RlLiBGb3IKKyAgIG5vcm1hbCBzdHJpbmdzIGFuZCBmLXN0cmluZ3MsIGNvbmNhdGVuYXRlIHRoZW0gdG9nZXRoZXIuIFRoZSByZXN1bHQKKyAgIHdpbGwgYmUgYSBTdHIgbm9kZSBpZiB0aGVyZSB3ZXJlIG5vIGYtc3RyaW5nczsgYSBGb3JtYXR0ZWRWYWx1ZQorICAgbm9kZSBpZiB0aGVyZSdzIGp1c3QgYW4gZi1zdHJpbmcgKHdpdGggbm8gbGVhZGluZyBvciB0cmFpbGluZworICAgbGl0ZXJhbHMpLCBvciBhIEpvaW5lZFN0ciBub2RlIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBmLXN0cmluZ3Mgb3IKKyAgIGFueSBsaXRlcmFscyBpbnZvbHZlZC4gKi8KK3N0YXRpYyBleHByX3R5CitwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKIHsKLSAgICBQeU9iamVjdCAqdjsKKyAgICBpbnQgYnl0ZXNtb2RlID0gMDsKKyAgICBQeU9iamVjdCAqYnl0ZXNfc3RyID0gTlVMTDsKICAgICBpbnQgaTsKLSAgICBSRVEoQ0hJTEQobiwgMCksIFNUUklORyk7Ci0gICAgdiA9IHBhcnNlc3RyKGMsIENISUxEKG4sIDApLCBieXRlc21vZGUpOwotICAgIGlmICh2ICE9IE5VTEwpIHsKLSAgICAgICAgLyogU3RyaW5nIGxpdGVyYWwgY29uY2F0ZW5hdGlvbiAqLwotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTkNIKG4pOyBpKyspIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpzOwotICAgICAgICAgICAgaW50IHN1YmJtID0gMDsKLSAgICAgICAgICAgIHMgPSBwYXJzZXN0cihjLCBDSElMRChuLCBpKSwgJnN1YmJtKTsKLSAgICAgICAgICAgIGlmIChzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBvbkVycm9yOwotICAgICAgICAgICAgaWYgKCpieXRlc21vZGUgIT0gc3ViYm0pIHsKLSAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgIEZzdHJpbmdQYXJzZXIgc3RhdGU7CisgICAgRnN0cmluZ1BhcnNlcl9Jbml0KCZzdGF0ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkNIKG4pOyBpKyspIHsKKyAgICAgICAgaW50IHRoaXNfYnl0ZXNtb2RlID0gMDsKKyAgICAgICAgaW50IHRoaXNfZm1vZGUgPSAwOworICAgICAgICBQeU9iamVjdCAqczsKKworICAgICAgICBSRVEoQ0hJTEQobiwgaSksIFNUUklORyk7CisgICAgICAgIHMgPSBwYXJzZXN0cihjLCBDSElMRChuLCBpKSwgJnRoaXNfYnl0ZXNtb2RlLCAmdGhpc19mbW9kZSk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSdyZSBub3QgbWl4aW5nIGJ5dGVzIHdpdGggdW5pY29kZS4gKi8KKyAgICAgICAgaWYgKGkgIT0gMCAmJiBieXRlc21vZGUgIT0gdGhpc19ieXRlc21vZGUpIHsKKyAgICAgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiY2Fubm90IG1peCBieXRlcyBhbmQgbm9uYnl0ZXMgbGl0ZXJhbHMiKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXNtb2RlID0gdGhpc19ieXRlc21vZGU7CisKKyAgICAgICAgYXNzZXJ0KGJ5dGVzbW9kZSA/IFB5Qnl0ZXNfQ2hlY2tFeGFjdChzKSA6IFB5VW5pY29kZV9DaGVja0V4YWN0KHMpKTsKKworICAgICAgICBpZiAoYnl0ZXNtb2RlKSB7CisgICAgICAgICAgICAvKiBGb3IgYnl0ZXMsIGNvbmNhdCBhcyB3ZSBnby4gKi8KKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXJzdCB0aW1lLCBqdXN0IHJlbWVtYmVyIHRoaXMgdmFsdWUuICovCisgICAgICAgICAgICAgICAgYnl0ZXNfc3RyID0gczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlCeXRlc19Db25jYXRBbmREZWwoJmJ5dGVzX3N0ciwgcyk7CisgICAgICAgICAgICAgICAgaWYgKCFieXRlc19zdHIpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUHlCeXRlc19DaGVjayh2KSAmJiBQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlCeXRlc19Db25jYXRBbmREZWwoJnYsIHMpOwotICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gUHlVbmljb2RlX0NvbmNhdCh2LCBzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgICAgIHYgPSB0ZW1wOwotICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0aGlzX2Ztb2RlKSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGFuIGYtc3RyaW5nLiBDb25jYXRlbmF0ZSBhbmQgZGVjcmVmIGl0LiAqLworICAgICAgICAgICAgUHlfc3NpemVfdCBvZnMgPSAwOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IEZzdHJpbmdQYXJzZXJfQ29uY2F0RnN0cmluZygmc3RhdGUsIHMsICZvZnMsIDAsIGMsIG4pOworICAgICAgICAgICAgUHlfREVDUkVGKHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoaXMgaXMgYSByZWd1bGFyIHN0cmluZy4gQ29uY2F0ZW5hdGUgaXQuICovCisgICAgICAgICAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRBbmREZWwoJnN0YXRlLCBzKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gdjsKKyAgICBpZiAoYnl0ZXNtb2RlKSB7CisgICAgICAgIC8qIEp1c3QgcmV0dXJuIHRoZSBieXRlcyBvYmplY3QgYW5kIHdlJ3JlIGRvbmUuICovCisgICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGMtPmNfYXJlbmEsIGJ5dGVzX3N0cikgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEJ5dGVzKGJ5dGVzX3N0ciwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIH0KIAotICBvbkVycm9yOgotICAgIFB5X1hERUNSRUYodik7CisgICAgLyogV2UncmUgbm90IGEgYnl0ZXMgc3RyaW5nLCBieXRlc19zdHIgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBzZXQuICovCisgICAgYXNzZXJ0KGJ5dGVzX3N0ciA9PSBOVUxMKTsKKworICAgIHJldHVybiBGc3RyaW5nUGFyc2VyX0ZpbmlzaCgmc3RhdGUsIGMsIG4pOworCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGJ5dGVzX3N0cik7CisgICAgRnN0cmluZ1BhcnNlcl9EZWFsbG9jKCZzdGF0ZSk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vYmx0aW5tb2R1bGUuYyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCmluZGV4IGYzZDBjOWEuLjdkMzVjZGIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ibHRpbm1vZHVsZS5jCisrKyBiL1B5dGhvbi9ibHRpbm1vZHVsZS5jCkBAIC0zMzEsNyArMzMxLDcgQEAKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBpZiAoY21wID09IDEpIHsKKyAgICAgICAgaWYgKGNtcCA+IDApIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CiAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKICAgICAgICAgfQpAQCAtNDY5LDYgKzQ2OSw3IEBACiAgICAgUHlPYmplY3QgKml0ID0gbHotPml0OwogICAgIGxvbmcgb2s7CiAgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIGludCBjaGVja3RydWUgPSBsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZTsKIAogICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKICAgICBmb3IgKDs7KSB7CkBAIC00NzYsMTIgKzQ3NywxMSBAQAogICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgaWYgKGx6LT5mdW5jID09IFB5X05vbmUgfHwgbHotPmZ1bmMgPT0gKFB5T2JqZWN0ICopJlB5Qm9vbF9UeXBlKSB7CisgICAgICAgIGlmIChjaGVja3RydWUpIHsKICAgICAgICAgICAgIG9rID0gUHlPYmplY3RfSXNUcnVlKGl0ZW0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgUHlPYmplY3QgKmdvb2Q7Ci0gICAgICAgICAgICBnb29kID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhsei0+ZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0sIE5VTEwpOworICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsIGl0ZW0sIE5VTEwpOwogICAgICAgICAgICAgaWYgKGdvb2QgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTExNzQsMTMgKzExNzQsMTQgQEAKICAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5X3NzaXplX3QgbnVtYXJncywgaTsKIAotICAgIG51bWFyZ3MgPSBQeVR1cGxlX1NpemUobHotPml0ZXJzKTsKKyAgICBudW1hcmdzID0gUHlUdXBsZV9HRVRfU0laRShsei0+aXRlcnMpOwogICAgIGFyZ3R1cGxlID0gUHlUdXBsZV9OZXcobnVtYXJncyk7CiAgICAgaWYgKGFyZ3R1cGxlID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgZm9yIChpPTAgOyBpPG51bWFyZ3MgOyBpKyspIHsKLSAgICAgICAgdmFsID0gUHlJdGVyX05leHQoUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpKTsKKyAgICAgICAgUHlPYmplY3QgKml0ID0gUHlUdXBsZV9HRVRfSVRFTShsei0+aXRlcnMsIGkpOworICAgICAgICB2YWwgPSBQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQoaXQpOwogICAgICAgICBpZiAodmFsID09IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmd0dXBsZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTE5MzAsOSArMTkzMSw4IEBACiAgICAgICAgICAgICBQeV9DTEVBUihzdHJpbmdwbyk7CiAgICAgICAgICAgICBpZiAocG8gPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIF9yZWFkbGluZV9lcnJvcnM7Ci0gICAgICAgICAgICBwcm9tcHRzdHIgPSBQeUJ5dGVzX0FzU3RyaW5nKHBvKTsKLSAgICAgICAgICAgIGlmIChwcm9tcHRzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBnb3RvIF9yZWFkbGluZV9lcnJvcnM7CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhwbykpOworICAgICAgICAgICAgcHJvbXB0c3RyID0gUHlCeXRlc19BU19TVFJJTkcocG8pOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgcG8gPSBOVUxMOwpAQCAtMjcxMSwxMCArMjcxMSwxMCBAQAogICAgIFNFVEJVSUxUSU4oInppcCIsICAgICAgICAgICAgICAgICAgICZQeVppcF9UeXBlKTsKICAgICBkZWJ1ZyA9IFB5Qm9vbF9Gcm9tTG9uZyhQeV9PcHRpbWl6ZUZsYWcgPT0gMCk7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJfX2RlYnVnX18iLCBkZWJ1ZykgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgICAgICBQeV9ERUNSRUYoZGVidWcpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlfWERFQ1JFRihkZWJ1Zyk7CisgICAgUHlfREVDUkVGKGRlYnVnKTsKIAogICAgIHJldHVybiBtb2Q7CiAjdW5kZWYgQUREX1RPX0FMTApkaWZmIC0tZ2l0IGEvUHl0aG9uL2NldmFsLmMgYi9QeXRob24vY2V2YWwuYwppbmRleCAzZDY5MDM4Li4yYjRmN2NjIDEwMDY0NAotLS0gYS9QeXRob24vY2V2YWwuYworKysgYi9QeXRob24vY2V2YWwuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAKICNpZmRlZiBMTFRSQUNFCiBzdGF0aWMgaW50IGxsdHJhY2U7Ci1zdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgcHJ0cmFjZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOwogI2VuZGlmCiBzdGF0aWMgaW50IGNhbGxfdHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKiwgUHlGcmFtZU9iamVjdCAqLApAQCAtMTQ0LDcgKzE0NCw3IEBACiBzdGF0aWMgdm9pZCBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5T2JqZWN0ICopOwogc3RhdGljIHZvaWQgZm9ybWF0X2V4Y191bmJvdW5kKFB5Q29kZU9iamVjdCAqY28sIGludCBvcGFyZyk7CiBzdGF0aWMgUHlPYmplY3QgKiB1bmljb2RlX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgdW5zaWduZWQgY2hhciAqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqKTsKIHN0YXRpYyBQeU9iamVjdCAqIHNwZWNpYWxfbG9va3VwKFB5T2JqZWN0ICosIF9QeV9JZGVudGlmaWVyICopOwogCiAjZGVmaW5lIE5BTUVfRVJST1JfTVNHIFwKQEAgLTgwMCw3ICs4MDAsNyBAQAogICAgIGludCBsYXN0b3Bjb2RlID0gMDsKICNlbmRpZgogICAgIFB5T2JqZWN0ICoqc3RhY2tfcG9pbnRlcjsgIC8qIE5leHQgZnJlZSBzbG90IGluIHZhbHVlIHN0YWNrICovCi0gICAgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cjsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqbmV4dF9pbnN0cjsKICAgICBpbnQgb3Bjb2RlOyAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgKi8KICAgICBpbnQgb3Bhcmc7ICAgICAgICAgLyogQ3VycmVudCBvcGNvZGUgYXJndW1lbnQsIGlmIGFueSAqLwogICAgIGVudW0gd2h5X2NvZGUgd2h5OyAvKiBSZWFzb24gZm9yIGJsb2NrIHN0YWNrIHVud2luZCAqLwpAQCAtODE4LDcgKzgxOCw3IEBACiAgICAgICAgdGltZSBpdCBpcyB0ZXN0ZWQuICovCiAgICAgaW50IGluc3RyX3ViID0gLTEsIGluc3RyX2xiID0gMCwgaW5zdHJfcHJldiA9IC0xOwogCi0gICAgdW5zaWduZWQgY2hhciAqZmlyc3RfaW5zdHI7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKmZpcnN0X2luc3RyOwogICAgIFB5T2JqZWN0ICpuYW1lczsKICAgICBQeU9iamVjdCAqY29uc3RzOwogCkBAIC04ODYsMjQgKzg4NiwxMCBAQAogLyogSW1wb3J0IHRoZSBzdGF0aWMganVtcCB0YWJsZSAqLwogI2luY2x1ZGUgIm9wY29kZV90YXJnZXRzLmgiCiAKLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCB3aGVuIHNldmVyYWwgb3Bjb2RlcyBkZWZlciB0byB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbgotICAgKGUuZy4gU0VUVVBfTE9PUCwgU0VUVVBfRklOQUxMWSkgKi8KLSNkZWZpbmUgVEFSR0VUX1dJVEhfSU1QTChvcCwgaW1wbCkgXAotICAgIFRBUkdFVF8jI29wOiBcCi0gICAgICAgIG9wY29kZSA9IG9wOyBcCi0gICAgICAgIGlmIChIQVNfQVJHKG9wKSkgXAotICAgICAgICAgICAgb3BhcmcgPSBORVhUQVJHKCk7IFwKLSAgICBjYXNlIG9wOiBcCi0gICAgICAgIGdvdG8gaW1wbDsgXAotCiAjZGVmaW5lIFRBUkdFVChvcCkgXAogICAgIFRBUkdFVF8jI29wOiBcCi0gICAgICAgIG9wY29kZSA9IG9wOyBcCi0gICAgICAgIGlmIChIQVNfQVJHKG9wKSkgXAotICAgICAgICAgICAgb3BhcmcgPSBORVhUQVJHKCk7IFwKICAgICBjYXNlIG9wOgogCi0KICNkZWZpbmUgRElTUEFUQ0goKSBcCiAgICAgeyBcCiAgICAgICAgIGlmICghX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJmV2YWxfYnJlYWtlcikpIHsgICAgICBcCkBAIC05MTcsNyArOTAzLDggQEAKICAgICB7IFwKICAgICAgICAgaWYgKCFsbHRyYWNlICYmICFfUHlfVHJhY2luZ1Bvc3NpYmxlKSB7IFwKICAgICAgICAgICAgIGYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKTsgXAotICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbKm5leHRfaW5zdHIrK107IFwKKyAgICAgICAgICAgIE5FWFRPUEFSRygpOyBcCisgICAgICAgICAgICBnb3RvICpvcGNvZGVfdGFyZ2V0c1tvcGNvZGVdOyBcCiAgICAgICAgIH0gXAogICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7IFwKICAgICB9CkBAIC05MjYsNyArOTEzLDggQEAKICAgICB7IFwKICAgICAgICAgaWYgKCFfUHlfVHJhY2luZ1Bvc3NpYmxlKSB7IFwKICAgICAgICAgICAgIGYtPmZfbGFzdGkgPSBJTlNUUl9PRkZTRVQoKTsgXAotICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbKm5leHRfaW5zdHIrK107IFwKKyAgICAgICAgICAgIE5FWFRPUEFSRygpOyBcCisgICAgICAgICAgICBnb3RvICpvcGNvZGVfdGFyZ2V0c1tvcGNvZGVdOyBcCiAgICAgICAgIH0gXAogICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7IFwKICAgICB9CkBAIC05MzUsMTAgKzkyMyw3IEBACiAjZWxzZQogI2RlZmluZSBUQVJHRVQob3ApIFwKICAgICBjYXNlIG9wOgotI2RlZmluZSBUQVJHRVRfV0lUSF9JTVBMKG9wLCBpbXBsKSBcCi0gICAgLyogc2lsZW5jZSBjb21waWxlciB3YXJuaW5ncyBhYm91dCBgaW1wbGAgdW51c2VkICovIFwKLSAgICBpZiAoMCkgZ290byBpbXBsOyBcCi0gICAgY2FzZSBvcDoKKwogI2RlZmluZSBESVNQQVRDSCgpIGNvbnRpbnVlCiAjZGVmaW5lIEZBU1RfRElTUEFUQ0goKSBnb3RvIGZhc3RfbmV4dF9vcGNvZGUKICNlbmRpZgpAQCAtOTk0LDI4ICs5NzksMzggQEAKIAogLyogQ29kZSBhY2Nlc3MgbWFjcm9zICovCiAKLSNkZWZpbmUgSU5TVFJfT0ZGU0VUKCkgICgoaW50KShuZXh0X2luc3RyIC0gZmlyc3RfaW5zdHIpKQotI2RlZmluZSBORVhUT1AoKSAgICAgICAgKCpuZXh0X2luc3RyKyspCi0jZGVmaW5lIE5FWFRBUkcoKSAgICAgICAobmV4dF9pbnN0ciArPSAyLCAobmV4dF9pbnN0clstMV08PDgpICsgbmV4dF9pbnN0clstMl0pCi0jZGVmaW5lIFBFRUtBUkcoKSAgICAgICAoKG5leHRfaW5zdHJbMl08PDgpICsgbmV4dF9pbnN0clsxXSkKLSNkZWZpbmUgSlVNUFRPKHgpICAgICAgIChuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyAoeCkpCi0jZGVmaW5lIEpVTVBCWSh4KSAgICAgICAobmV4dF9pbnN0ciArPSAoeCkpCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgICAgI2RlZmluZSBPUENPREUod29yZCkgKCh3b3JkKSA+PiA4KQorICAgICNkZWZpbmUgT1BBUkcod29yZCkgKCh3b3JkKSAmIDI1NSkKKyNlbHNlCisgICAgI2RlZmluZSBPUENPREUod29yZCkgKCh3b3JkKSAmIDI1NSkKKyAgICAjZGVmaW5lIE9QQVJHKHdvcmQpICgod29yZCkgPj4gOCkKKyNlbmRpZgorLyogVGhlIGludGVnZXIgb3ZlcmZsb3cgaXMgY2hlY2tlZCBieSBhbiBhc3NlcnRpb24gYmVsb3cuICovCisjZGVmaW5lIElOU1RSX09GRlNFVCgpICAoMiooaW50KShuZXh0X2luc3RyIC0gZmlyc3RfaW5zdHIpKQorI2RlZmluZSBORVhUT1BBUkcoKSAgZG8geyBcCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdvcmQgPSAqbmV4dF9pbnN0cjsgXAorICAgICAgICBvcGNvZGUgPSBPUENPREUod29yZCk7IFwKKyAgICAgICAgb3BhcmcgPSBPUEFSRyh3b3JkKTsgXAorICAgICAgICBuZXh0X2luc3RyKys7IFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBKVU1QVE8oeCkgICAgICAgKG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArICh4KS8yKQorI2RlZmluZSBKVU1QQlkoeCkgICAgICAgKG5leHRfaW5zdHIgKz0gKHgpLzIpCiAKIC8qIE9wQ29kZSBwcmVkaWN0aW9uIG1hY3JvcwogICAgIFNvbWUgb3Bjb2RlcyB0ZW5kIHRvIGNvbWUgaW4gcGFpcnMgdGh1cyBtYWtpbmcgaXQgcG9zc2libGUgdG8KICAgICBwcmVkaWN0IHRoZSBzZWNvbmQgY29kZSB3aGVuIHRoZSBmaXJzdCBpcyBydW4uICBGb3IgZXhhbXBsZSwKLSAgICBDT01QQVJFX09QIGlzIG9mdGVuIGZvbGxvd2VkIGJ5IEpVTVBfSUZfRkFMU0Ugb3IgSlVNUF9JRl9UUlVFLiAgQW5kLAotICAgIHRob3NlIG9wY29kZXMgYXJlIG9mdGVuIGZvbGxvd2VkIGJ5IGEgUE9QX1RPUC4KKyAgICBDT01QQVJFX09QIGlzIG9mdGVuIGZvbGxvd2VkIGJ5IFBPUF9KVU1QX0lGX0ZBTFNFIG9yIFBPUF9KVU1QX0lGX1RSVUUuCiAKICAgICBWZXJpZnlpbmcgdGhlIHByZWRpY3Rpb24gY29zdHMgYSBzaW5nbGUgaGlnaC1zcGVlZCB0ZXN0IG9mIGEgcmVnaXN0ZXIKICAgICB2YXJpYWJsZSBhZ2FpbnN0IGEgY29uc3RhbnQuICBJZiB0aGUgcGFpcmluZyB3YXMgZ29vZCwgdGhlbiB0aGUKICAgICBwcm9jZXNzb3IncyBvd24gaW50ZXJuYWwgYnJhbmNoIHByZWRpY2F0aW9uIGhhcyBhIGhpZ2ggbGlrZWxpaG9vZCBvZgogICAgIHN1Y2Nlc3MsIHJlc3VsdGluZyBpbiBhIG5lYXJseSB6ZXJvLW92ZXJoZWFkIHRyYW5zaXRpb24gdG8gdGhlCiAgICAgbmV4dCBvcGNvZGUuICBBIHN1Y2Nlc3NmdWwgcHJlZGljdGlvbiBzYXZlcyBhIHRyaXAgdGhyb3VnaCB0aGUgZXZhbC1sb29wCi0gICAgaW5jbHVkaW5nIGl0cyB0d28gdW5wcmVkaWN0YWJsZSBicmFuY2hlcywgdGhlIEhBU19BUkcgdGVzdCBhbmQgdGhlCi0gICAgc3dpdGNoLWNhc2UuICBDb21iaW5lZCB3aXRoIHRoZSBwcm9jZXNzb3IncyBpbnRlcm5hbCBicmFuY2ggcHJlZGljdGlvbiwKLSAgICBhIHN1Y2Nlc3NmdWwgUFJFRElDVCBoYXMgdGhlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIHR3byBvcGNvZGVzIHJ1biBhcyBpZgotICAgIHRoZXkgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlIHdpdGggdGhlIGJvZGllcyBjb21iaW5lZC4KKyAgICBpbmNsdWRpbmcgaXRzIHVucHJlZGljdGFibGUgc3dpdGNoLWNhc2UgYnJhbmNoLiAgQ29tYmluZWQgd2l0aCB0aGUKKyAgICBwcm9jZXNzb3IncyBpbnRlcm5hbCBicmFuY2ggcHJlZGljdGlvbiwgYSBzdWNjZXNzZnVsIFBSRURJQ1QgaGFzIHRoZQorICAgIGVmZmVjdCBvZiBtYWtpbmcgdGhlIHR3byBvcGNvZGVzIHJ1biBhcyBpZiB0aGV5IHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZQorICAgIHdpdGggdGhlIGJvZGllcyBjb21iaW5lZC4KIAogICAgIElmIGNvbGxlY3Rpbmcgb3Bjb2RlIHN0YXRpc3RpY3MsIHlvdXIgY2hvaWNlcyBhcmUgdG8gZWl0aGVyIGtlZXAgdGhlCiAgICAgcHJlZGljdGlvbnMgdHVybmVkLW9uIGFuZCBpbnRlcnByZXQgdGhlIHJlc3VsdHMgYXMgaWYgc29tZSBvcGNvZGVzCkBAIC0xMDMwLDEzICsxMDI1LDE5IEBACiAKICNpZiBkZWZpbmVkKERZTkFNSUNfRVhFQ1VUSU9OX1BST0ZJTEUpIHx8IFVTRV9DT01QVVRFRF9HT1RPUwogI2RlZmluZSBQUkVESUNUKG9wKSAgICAgICAgICAgICBpZiAoMCkgZ290byBQUkVEXyMjb3AKLSNkZWZpbmUgUFJFRElDVEVEKG9wKSAgICAgICAgICAgUFJFRF8jI29wOgotI2RlZmluZSBQUkVESUNURURfV0lUSF9BUkcob3ApICBQUkVEXyMjb3A6CiAjZWxzZQotI2RlZmluZSBQUkVESUNUKG9wKSAgICAgICAgICAgICBpZiAoKm5leHRfaW5zdHIgPT0gb3ApIGdvdG8gUFJFRF8jI29wCi0jZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDogbmV4dF9pbnN0cisrCi0jZGVmaW5lIFBSRURJQ1RFRF9XSVRIX0FSRyhvcCkgIFBSRURfIyNvcDogb3BhcmcgPSBQRUVLQVJHKCk7IG5leHRfaW5zdHIgKz0gMworI2RlZmluZSBQUkVESUNUKG9wKSBcCisgICAgZG97IFwKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgd29yZCA9ICpuZXh0X2luc3RyOyBcCisgICAgICAgIG9wY29kZSA9IE9QQ09ERSh3b3JkKTsgXAorICAgICAgICBpZiAob3Bjb2RlID09IG9wKXsgXAorICAgICAgICAgICAgb3BhcmcgPSBPUEFSRyh3b3JkKTsgXAorICAgICAgICAgICAgbmV4dF9pbnN0cisrOyBcCisgICAgICAgICAgICBnb3RvIFBSRURfIyNvcDsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlKDApCiAjZW5kaWYKKyNkZWZpbmUgUFJFRElDVEVEKG9wKSAgICAgICAgICAgUFJFRF8jI29wOgogCiAKIC8qIFN0YWNrIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KQEAgLTExMDAsNyArMTEwMSw3IEBACiAgICAgfQogCiAjZGVmaW5lIFVOV0lORF9FWENFUFRfSEFORExFUihiKSBcCi0gICAgeyBcCisgICAgZG8geyBcCiAgICAgICAgIFB5T2JqZWN0ICp0eXBlLCAqdmFsdWUsICp0cmFjZWJhY2s7IFwKICAgICAgICAgYXNzZXJ0KFNUQUNLX0xFVkVMKCkgPj0gKGIpLT5iX2xldmVsICsgMyk7IFwKICAgICAgICAgd2hpbGUgKFNUQUNLX0xFVkVMKCkgPiAoYiktPmJfbGV2ZWwgKyAzKSB7IFwKQEAgLTExMTYsNyArMTExNyw3IEBACiAgICAgICAgIFB5X1hERUNSRUYodHlwZSk7IFwKICAgICAgICAgUHlfWERFQ1JFRih2YWx1ZSk7IFwKICAgICAgICAgUHlfWERFQ1JFRih0cmFjZWJhY2spOyBcCi0gICAgfQorICAgIH0gd2hpbGUoMCkKIAogLyogU3RhcnQgb2YgY29kZSAqLwogCkBAIC0xMTY1LDE2ICsxMTY2LDE2IEBACiAgICAgY29uc3RzID0gY28tPmNvX2NvbnN0czsKICAgICBmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwogICAgIGZyZWV2YXJzID0gZi0+Zl9sb2NhbHNwbHVzICsgY28tPmNvX25sb2NhbHM7Ci0gICAgZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgY2hhciopIFB5Qnl0ZXNfQVNfU1RSSU5HKGNvLT5jb19jb2RlKTsKLSAgICAvKiBBbiBleHBsYW5hdGlvbiBpcyBpbiBvcmRlciBmb3IgdGhlIG5leHQgbGluZS4KKyAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhjby0+Y29fY29kZSkpOworICAgIGFzc2VydChQeUJ5dGVzX0dFVF9TSVpFKGNvLT5jb19jb2RlKSA8PSBJTlRfTUFYKTsKKyAgICBhc3NlcnQoUHlCeXRlc19HRVRfU0laRShjby0+Y29fY29kZSkgJSAyID09IDApOworICAgIGFzc2VydChfUHlfSVNfQUxJR05FRChQeUJ5dGVzX0FTX1NUUklORyhjby0+Y29fY29kZSksIDIpKTsKKyAgICBmaXJzdF9pbnN0ciA9ICh1bnNpZ25lZCBzaG9ydCopIFB5Qnl0ZXNfQVNfU1RSSU5HKGNvLT5jb19jb2RlKTsKKyAgICAvKgorICAgICAgIGYtPmZfbGFzdGkgcmVmZXJzIHRvIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiwKKyAgICAgICB1bmxlc3MgaXQncyAtMSBpbiB3aGljaCBjYXNlIG5leHRfaW5zdHIgc2hvdWxkIGJlIGZpcnN0X2luc3RyLgogCi0gICAgICAgZi0+Zl9sYXN0aSBub3cgcmVmZXJzIHRvIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbgotICAgICAgIGV4ZWN1dGVkLiAgWW91IG1pZ2h0IHRoaW5rIHRoaXMgd2FzIG9idmlvdXMgZnJvbSB0aGUgbmFtZSwgYnV0Ci0gICAgICAgdGhpcyB3YXNuJ3QgYWx3YXlzIHRydWUgYmVmb3JlIDIuMyEgIFB5RnJhbWVfTmV3IG5vdyBzZXRzCi0gICAgICAgZi0+Zl9sYXN0aSB0byAtMSAoaS5lLiB0aGUgaW5kZXggKmJlZm9yZSogdGhlIGZpcnN0IGluc3RydWN0aW9uKQotICAgICAgIGFuZCBZSUVMRF9WQUxVRSBkb2Vzbid0IGZpZGRsZSB3aXRoIGZfbGFzdGkgYW55IG1vcmUuICBTbyB0aGlzCi0gICAgICAgZG9lcyB3b3JrLiAgUHJvbWlzZS4KLSAgICAgICBZSUVMRF9GUk9NIHNldHMgZl9sYXN0aSB0byBpdHNlbGYsIGluIG9yZGVyIHRvIHJlcGVhdGVkIHlpZWxkCisgICAgICAgWUlFTERfRlJPTSBzZXRzIGZfbGFzdGkgdG8gaXRzZWxmLCBpbiBvcmRlciB0byByZXBlYXRlZGx5IHlpZWxkCiAgICAgICAgbXVsdGlwbGUgdmFsdWVzLgogCiAgICAgICAgV2hlbiB0aGUgUFJFRElDVCgpIG1hY3JvcyBhcmUgZW5hYmxlZCwgc29tZSBvcGNvZGUgcGFpcnMgZm9sbG93IGluCkBAIC0xMTgzLDkgKzExODQsMTMgQEAKICAgICAgICB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGU7IGFjY29yZGluZ2x5LGYtPmZfbGFzdGkgd2lsbCBwb2ludCB0bwogICAgICAgIHRoZSBmaXJzdCBjb2RlIGluIHRoZSBwYWlyIChmb3IgaW5zdGFuY2UsIEdFVF9JVEVSIGZvbGxvd2VkIGJ5CiAgICAgICAgRk9SX0lURVIgaXMgZWZmZWN0aXZlbHkgYSBzaW5nbGUgb3Bjb2RlIGFuZCBmLT5mX2xhc3RpIHdpbGwgcG9pbnQKLSAgICAgICBhdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21iaW5lZCBwYWlyLikKKyAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21iaW5lZCBwYWlyLikKICAgICAqLwotICAgIG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0ciArIGYtPmZfbGFzdGkgKyAxOworICAgIG5leHRfaW5zdHIgPSBmaXJzdF9pbnN0cjsKKyAgICBpZiAoZi0+Zl9sYXN0aSA+PSAwKSB7CisgICAgICAgIGFzc2VydChmLT5mX2xhc3RpICUgMiA9PSAwKTsKKyAgICAgICAgbmV4dF9pbnN0ciArPSBmLT5mX2xhc3RpLzIgKyAxOworICAgIH0KICAgICBzdGFja19wb2ludGVyID0gZi0+Zl9zdGFja3RvcDsKICAgICBhc3NlcnQoc3RhY2tfcG9pbnRlciAhPSBOVUxMKTsKICAgICBmLT5mX3N0YWNrdG9wID0gTlVMTDsgICAgICAgLyogcmVtYWlucyBOVUxMIHVubGVzcyB5aWVsZCBzdXNwZW5kcyBmcmFtZSAqLwpAQCAtMTI0OSw3ICsxMjU0LDcgQEAKICAgICAgICAgICAgUHlfTWFrZVBlbmRpbmdDYWxscygpIGFib3ZlLiAqLwogCiAgICAgICAgIGlmIChfUHlfYXRvbWljX2xvYWRfcmVsYXhlZCgmZXZhbF9icmVha2VyKSkgewotICAgICAgICAgICAgaWYgKCpuZXh0X2luc3RyID09IFNFVFVQX0ZJTkFMTFkpIHsKKyAgICAgICAgICAgIGlmIChPUENPREUoKm5leHRfaW5zdHIpID09IFNFVFVQX0ZJTkFMTFkpIHsKICAgICAgICAgICAgICAgICAvKiBNYWtlIHRoZSBsYXN0IG9wY29kZSBiZWZvcmUKICAgICAgICAgICAgICAgICAgICBhIHRyeTogZmluYWxseTogYmxvY2sgdW5pbnRlcnJ1cHRpYmxlLiAqLwogICAgICAgICAgICAgICAgIGdvdG8gZmFzdF9uZXh0X29wY29kZTsKQEAgLTEzMjIsMTEgKzEzMjcsNyBAQAogCiAgICAgICAgIC8qIEV4dHJhY3Qgb3Bjb2RlIGFuZCBhcmd1bWVudCAqLwogCi0gICAgICAgIG9wY29kZSA9IE5FWFRPUCgpOwotICAgICAgICBvcGFyZyA9IDA7ICAgLyogYWxsb3dzIG9wYXJnIHRvIGJlIHN0b3JlZCBpbiBhIHJlZ2lzdGVyIGJlY2F1c2UKLSAgICAgICAgICAgIGl0IGRvZXNuJ3QgaGF2ZSB0byBiZSByZW1lbWJlcmVkIGFjcm9zcyBhIGZ1bGwgbG9vcCAqLwotICAgICAgICBpZiAoSEFTX0FSRyhvcGNvZGUpKQotICAgICAgICAgICAgb3BhcmcgPSBORVhUQVJHKCk7CisgICAgICAgIE5FWFRPUEFSRygpOwogICAgIGRpc3BhdGNoX29wY29kZToKICNpZmRlZiBEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFCiAjaWZkZWYgRFhQQUlSUwpAQCAtMTM3Nyw2ICsxMzc4LDcgQEAKICAgICAgICAgICAgIEZBU1RfRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFBSRURJQ1RFRChMT0FEX0NPTlNUKTsKICAgICAgICAgVEFSR0VUKExPQURfQ09OU1QpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IEdFVElURU0oY29uc3RzLCBvcGFyZyk7CiAgICAgICAgICAgICBQeV9JTkNSRUYodmFsdWUpOwpAQCAtMTM4NCw3ICsxMzg2LDcgQEAKICAgICAgICAgICAgIEZBU1RfRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhTVE9SRV9GQVNUKTsKKyAgICAgICAgUFJFRElDVEVEKFNUT1JFX0ZBU1QpOwogICAgICAgICBUQVJHRVQoU1RPUkVfRkFTVCkgewogICAgICAgICAgICAgUHlPYmplY3QgKnZhbHVlID0gUE9QKCk7CiAgICAgICAgICAgICBTRVRMT0NBTChvcGFyZywgdmFsdWUpOwpAQCAtMjAwNiw2ICsyMDA4LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU0VUX1RPUChhd2FpdGFibGUpOworICAgICAgICAgICAgUFJFRElDVChMT0FEX0NPTlNUKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMjA0OCw5ICsyMDUxLDExIEBACiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5leHRfaXRlcik7CiAKICAgICAgICAgICAgIFBVU0goYXdhaXRhYmxlKTsKKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgUFJFRElDVEVEKEdFVF9BV0FJVEFCTEUpOwogICAgICAgICBUQVJHRVQoR0VUX0FXQUlUQUJMRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKml0ZXJhYmxlID0gVE9QKCk7CiAgICAgICAgICAgICBQeU9iamVjdCAqaXRlciA9IF9QeUNvcm9fR2V0QXdhaXRhYmxlSXRlcihpdGVyYWJsZSk7CkBAIC0yMDc4LDYgKzIwODMsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTIxMTEsNyArMjExNyw3IEBACiAgICAgICAgICAgICBmLT5mX3N0YWNrdG9wID0gc3RhY2tfcG9pbnRlcjsKICAgICAgICAgICAgIHdoeSA9IFdIWV9ZSUVMRDsKICAgICAgICAgICAgIC8qIGFuZCByZXBlYXQuLi4gKi8KLSAgICAgICAgICAgIGYtPmZfbGFzdGktLTsKKyAgICAgICAgICAgIGYtPmZfbGFzdGkgLT0gMjsKICAgICAgICAgICAgIGdvdG8gZmFzdF95aWVsZDsKICAgICAgICAgfQogCkBAIC0yMTMzLDYgKzIxMzksNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFBSRURJQ1RFRChQT1BfQkxPQ0spOwogICAgICAgICBUQVJHRVQoUE9QX0JMT0NLKSB7CiAgICAgICAgICAgICBQeVRyeUJsb2NrICpiID0gUHlGcmFtZV9CbG9ja1BvcChmKTsKICAgICAgICAgICAgIFVOV0lORF9CTE9DSyhiKTsKQEAgLTIyNDksNyArMjI1Niw3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFVOUEFDS19TRVFVRU5DRSk7CisgICAgICAgIFBSRURJQ1RFRChVTlBBQ0tfU0VRVUVOQ0UpOwogICAgICAgICBUQVJHRVQoVU5QQUNLX1NFUVVFTkNFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqc2VxID0gUE9QKCksICppdGVtLCAqKml0ZW1zOwogICAgICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdChzZXEpICYmCkBAIC0yMzU4LDcgKzIzNjUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMICYmIF9QeUVycl9PQ0NVUlJFRCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKQEAgLTIzOTgsMjYgKzI0MDUsMzMgQEAKICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwogICAgICAgICAgICAgUHlPYmplY3QgKnY7CiAgICAgICAgICAgICBpZiAoUHlEaWN0X0NoZWNrRXhhY3QoZi0+Zl9nbG9iYWxzKQotICAgICAgICAgICAgICAgICYmIFB5RGljdF9DaGVja0V4YWN0KGYtPmZfYnVpbHRpbnMpKSB7CisgICAgICAgICAgICAgICAgJiYgUHlEaWN0X0NoZWNrRXhhY3QoZi0+Zl9idWlsdGlucykpCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdiA9IF9QeURpY3RfTG9hZEdsb2JhbCgoUHlEaWN0T2JqZWN0ICopZi0+Zl9nbG9iYWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGljdE9iamVjdCAqKWYtPmZfYnVpbHRpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghX1B5RXJyX09DQ1VSUkVEKCkpCisgICAgICAgICAgICAgICAgICAgIGlmICghX1B5RXJyX09DQ1VSUkVEKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIF9QeURpY3RfTG9hZEdsb2JhbCgpIHJldHVybnMgTlVMTCB3aXRob3V0IHJhaXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IGRvZXNuJ3QgZXhpc3QgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9leGNfY2hlY2tfYXJnKFB5RXhjX05hbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVfRVJST1JfTVNHLCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBTbG93LXBhdGggaWYgZ2xvYmFscyBvciBidWlsdGlucyBpcyBub3QgYSBkaWN0ICovCisKKyAgICAgICAgICAgICAgICAvKiBuYW1lc3BhY2UgMTogZ2xvYmFscyAqLwogICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfZ2xvYmFscywgbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5RXJyb3IpKQogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKIAorICAgICAgICAgICAgICAgICAgICAvKiBuYW1lc3BhY2UgMjogYnVpbHRpbnMgKi8KICAgICAgICAgICAgICAgICAgICAgdiA9IFB5T2JqZWN0X0dldEl0ZW0oZi0+Zl9idWlsdGlucywgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKQEAgLTI0NzcsNyArMjQ5MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICB2YWx1ZSA9IFB5T2JqZWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gTlVMTCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0yNTQwLDkgKzI1NTQsOCBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQlVJTERfVFVQTEVfVU5QQUNLLCBfYnVpbGRfbGlzdF91bnBhY2spCi0gICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykKLSAgICAgICAgX2J1aWxkX2xpc3RfdW5wYWNrOiB7CisgICAgICAgIFRBUkdFVChCVUlMRF9UVVBMRV9VTlBBQ0spCisgICAgICAgIFRBUkdFVChCVUlMRF9MSVNUX1VOUEFDSykgewogICAgICAgICAgICAgaW50IGNvbnZlcnRfdG9fdHVwbGUgPSBvcGNvZGUgPT0gQlVJTERfVFVQTEVfVU5QQUNLOwogICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICBQeU9iamVjdCAqc3VtID0gUHlMaXN0X05ldygwKTsKQEAgLTI2MzksOSArMjY1Miw0MSBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwsIF9idWlsZF9tYXBfdW5wYWNrKQotICAgICAgICBUQVJHRVQoQlVJTERfTUFQX1VOUEFDSykKLSAgICAgICAgX2J1aWxkX21hcF91bnBhY2s6IHsKKyAgICAgICAgVEFSR0VUKEJVSUxEX0NPTlNUX0tFWV9NQVApIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgUHlPYmplY3QgKm1hcDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICprZXlzID0gVE9QKCk7CisgICAgICAgICAgICBpZiAoIVB5VHVwbGVfQ2hlY2tFeGFjdChrZXlzKSB8fAorICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX1NJWkUoa2V5cykgIT0gKFB5X3NzaXplX3Qpb3BhcmcpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgQlVJTERfQ09OU1RfS0VZX01BUCBrZXlzIGFyZ3VtZW50Iik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcCA9IF9QeURpY3RfTmV3UHJlc2l6ZWQoKFB5X3NzaXplX3Qpb3BhcmcpOworICAgICAgICAgICAgaWYgKG1hcCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IG9wYXJnOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgaW50IGVycjsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gUHlUdXBsZV9HRVRfSVRFTShrZXlzLCBvcGFyZyAtIGkpOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFBFRUsoaSArIDEpOworICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKG1hcCwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYXApOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHlfREVDUkVGKFBPUCgpKTsKKyAgICAgICAgICAgIHdoaWxlIChvcGFyZy0tKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKFBPUCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBVU0gobWFwKTsKKyAgICAgICAgICAgIERJU1BBVENIKCk7CisgICAgICAgIH0KKworICAgICAgICBUQVJHRVQoQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwpCisgICAgICAgIFRBUkdFVChCVUlMRF9NQVBfVU5QQUNLKSB7CiAgICAgICAgICAgICBpbnQgd2l0aF9jYWxsID0gb3Bjb2RlID09IEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMOwogICAgICAgICAgICAgaW50IG51bV9tYXBzOwogICAgICAgICAgICAgaW50IGZ1bmN0aW9uX2xvY2F0aW9uOwpAQCAtMjc3NSwyMSArMjgyMCwxMyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOwogICAgICAgICAgICAgZnJvbSA9IFBPUCgpOwogICAgICAgICAgICAgbGV2ZWwgPSBUT1AoKTsKLSAgICAgICAgICAgIGlmIChQeUxvbmdfQXNMb25nKGxldmVsKSAhPSAtMSB8fCBQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soNSwKKyAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXJncyA9IFB5VHVwbGVfUGFjayg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfbG9jYWxzID09IE5VTEwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X05vbmUgOiBmLT5mX2xvY2FscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihsZXZlbCk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoZnJvbSk7CiAgICAgICAgICAgICBpZiAoYXJncyA9PSBOVUxMKSB7CkBAIC0yODQ4LDcgKzI4ODUsNyBAQAogICAgICAgICAgICAgRkFTVF9ESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX0ZBTFNFKTsKKyAgICAgICAgUFJFRElDVEVEKFBPUF9KVU1QX0lGX0ZBTFNFKTsKICAgICAgICAgVEFSR0VUKFBPUF9KVU1QX0lGX0ZBTFNFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqY29uZCA9IFBPUCgpOwogICAgICAgICAgICAgaW50IGVycjsKQEAgLTI4NzIsNyArMjkwOSw3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKFBPUF9KVU1QX0lGX1RSVUUpOworICAgICAgICBQUkVESUNURUQoUE9QX0pVTVBfSUZfVFJVRSk7CiAgICAgICAgIFRBUkdFVChQT1BfSlVNUF9JRl9UUlVFKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqY29uZCA9IFBPUCgpOwogICAgICAgICAgICAgaW50IGVycjsKQEAgLTI5NDksNyArMjk4Niw3IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEpVTVBfQUJTT0xVVEUpOworICAgICAgICBQUkVESUNURUQoSlVNUF9BQlNPTFVURSk7CiAgICAgICAgIFRBUkdFVChKVU1QX0FCU09MVVRFKSB7CiAgICAgICAgICAgICBKVU1QVE8ob3BhcmcpOwogI2lmIEZBU1RfTE9PUFMKQEAgLTI5NzUsNiArMzAxMiw3IEBACiAgICAgICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBQUkVESUNUKEZPUl9JVEVSKTsKKyAgICAgICAgICAgIFBSRURJQ1QoQ0FMTF9GVU5DVElPTik7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTMwMDMsMTAgKzMwNDEsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoaXRlciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUFJFRElDVChMT0FEX0NPTlNUKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoRk9SX0lURVIpOworICAgICAgICBQUkVESUNURUQoRk9SX0lURVIpOwogICAgICAgICBUQVJHRVQoRk9SX0lURVIpIHsKICAgICAgICAgICAgIC8qIGJlZm9yZTogW2l0ZXJdOyBhZnRlcjogW2l0ZXIsIGl0ZXIoKV0gKm9yKiBbXSAqLwogICAgICAgICAgICAgUHlPYmplY3QgKml0ZXIgPSBUT1AoKTsKQEAgLTMwMjgsNiArMzA2Nyw3IEBACiAgICAgICAgICAgICBTVEFDS0FESigtMSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlcik7CiAgICAgICAgICAgICBKVU1QQlkob3BhcmcpOworICAgICAgICAgICAgUFJFRElDVChQT1BfQkxPQ0spOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMDQ0LDEwICszMDg0LDkgQEAKICAgICAgICAgICAgIGdvdG8gZmFzdF9ibG9ja19lbmQ7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKFNFVFVQX0xPT1AsIF9zZXR1cF9maW5hbGx5KQotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKFNFVFVQX0VYQ0VQVCwgX3NldHVwX2ZpbmFsbHkpCi0gICAgICAgIFRBUkdFVChTRVRVUF9GSU5BTExZKQotICAgICAgICBfc2V0dXBfZmluYWxseTogeworICAgICAgICBUQVJHRVQoU0VUVVBfTE9PUCkKKyAgICAgICAgVEFSR0VUKFNFVFVQX0VYQ0VQVCkKKyAgICAgICAgVEFSR0VUKFNFVFVQX0ZJTkFMTFkpIHsKICAgICAgICAgICAgIC8qIE5PVEU6IElmIHlvdSBhZGQgYW55IG5ldyBibG9jay1zZXR1cCBvcGNvZGVzIHRoYXQKICAgICAgICAgICAgICAgIGFyZSBub3QgdHJ5L2V4Y2VwdC9maW5hbGx5IGhhbmRsZXJzLCB5b3UgbWF5IG5lZWQKICAgICAgICAgICAgICAgIHRvIHVwZGF0ZSB0aGUgUHlHZW5fTmVlZHNGaW5hbGl6aW5nKCkgZnVuY3Rpb24uCkBAIC0zMDc4LDYgKzMxMTcsNyBAQAogICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBQVVNIKHJlcyk7CisgICAgICAgICAgICBQUkVESUNUKEdFVF9BV0FJVEFCTEUpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMjI2LDYgKzMyNjYsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFBSRURJQ1RFRChDQUxMX0ZVTkNUSU9OKTsKICAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT04pIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3AsICpyZXM7CiAgICAgICAgICAgICBQQ0FMTChQQ0FMTF9BTEwpOwpAQCAtMzI0MiwxMCArMzI4Myw5IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChDQUxMX0ZVTkNUSU9OX1ZBUiwgX2NhbGxfZnVuY3Rpb25fdmFyX2t3KQotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKENBTExfRlVOQ1RJT05fS1csIF9jYWxsX2Z1bmN0aW9uX3Zhcl9rdykKLSAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fVkFSX0tXKQotICAgICAgICBfY2FsbF9mdW5jdGlvbl92YXJfa3c6IHsKKyAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fVkFSKQorICAgICAgICBUQVJHRVQoQ0FMTF9GVU5DVElPTl9LVykKKyAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fVkFSX0tXKSB7CiAgICAgICAgICAgICBpbnQgbmEgPSBvcGFyZyAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgbmsgPSAob3Bhcmc+PjgpICYgMHhmZjsKICAgICAgICAgICAgIGludCBmbGFncyA9IChvcGNvZGUgLSBDQUxMX0ZVTkNUSU9OKSAmIDM7CkBAIC0zMjg3LDExNyArMzMyNywzNiBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoTUFLRV9DTE9TVVJFLCBfbWFrZV9mdW5jdGlvbikKLSAgICAgICAgVEFSR0VUKE1BS0VfRlVOQ1RJT04pCi0gICAgICAgIF9tYWtlX2Z1bmN0aW9uOiB7Ci0gICAgICAgICAgICBpbnQgcG9zZGVmYXVsdHMgPSBvcGFyZyAmIDB4ZmY7Ci0gICAgICAgICAgICBpbnQga3dkZWZhdWx0cyA9IChvcGFyZz4+OCkgJiAweGZmOwotICAgICAgICAgICAgaW50IG51bV9hbm5vdGF0aW9ucyA9IChvcGFyZyA+PiAxNikgJiAweDdmZmY7CisgICAgICAgIFRBUkdFVChNQUtFX0ZVTkNUSU9OKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqcXVhbG5hbWUgPSBQT1AoKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjb2Rlb2JqID0gUE9QKCk7CisgICAgICAgICAgICBQeUZ1bmN0aW9uT2JqZWN0ICpmdW5jID0gKFB5RnVuY3Rpb25PYmplY3QgKikKKyAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX05ld1dpdGhRdWFsTmFtZShjb2Rlb2JqLCBmLT5mX2dsb2JhbHMsIHF1YWxuYW1lKTsKIAotICAgICAgICAgICAgUHlPYmplY3QgKnF1YWxuYW1lID0gUE9QKCk7IC8qIHF1YWxuYW1lICovCi0gICAgICAgICAgICBQeU9iamVjdCAqY29kZSA9IFBPUCgpOyAvKiBjb2RlIG9iamVjdCAqLwotICAgICAgICAgICAgUHlPYmplY3QgKmZ1bmMgPSBQeUZ1bmN0aW9uX05ld1dpdGhRdWFsTmFtZShjb2RlLCBmLT5mX2dsb2JhbHMsIHF1YWxuYW1lKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihjb2RlKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihjb2Rlb2JqKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihxdWFsbmFtZSk7Ci0KLSAgICAgICAgICAgIGlmIChmdW5jID09IE5VTEwpCisgICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLQotICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBNQUtFX0NMT1NVUkUpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2xvc3VyZSA9IFBPUCgpOwotICAgICAgICAgICAgICAgIGlmIChQeUZ1bmN0aW9uX1NldENsb3N1cmUoZnVuYywgY2xvc3VyZSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBoYXBwZW4gdW5sZXNzIGJ5dGVjb2RlIGlzIGNvcnJ1cHQuICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNsb3N1cmUpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoY2xvc3VyZSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChudW1fYW5ub3RhdGlvbnMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuYW1lX2l4OwotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IFBPUCgpOyAvKiBuYW1lcyBvZiBhcmdzIHdpdGggYW5ub3RhdGlvbnMgKi8KLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqYW5ucyA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgICAgICBpZiAoYW5ucyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmFtZV9peCA9IFB5VHVwbGVfU2l6ZShuYW1lcyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KG51bV9hbm5vdGF0aW9ucyA9PSBuYW1lX2l4KzEpOwotICAgICAgICAgICAgICAgIHdoaWxlIChuYW1lX2l4ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSwgKnZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXJyOwotICAgICAgICAgICAgICAgICAgICAtLW5hbWVfaXg7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKG5hbWVzLCBuYW1lX2l4KTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQT1AoKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gUHlEaWN0X1NldEl0ZW0oYW5ucywgbmFtZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRBbm5vdGF0aW9ucyhmdW5jLCBhbm5zKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXRBbm5vdGF0aW9ucyBjaGFuZ2VzLiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5ucyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubnMpOworICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwOCkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jIC0+ZnVuY19jbG9zdXJlID0gUE9QKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3BhcmcgJiAweDA0KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KFB5RGljdF9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYy0+ZnVuY19hbm5vdGF0aW9ucyA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwMikgeworICAgICAgICAgICAgICAgIGFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChUT1AoKSkpOworICAgICAgICAgICAgICAgIGZ1bmMtPmZ1bmNfa3dkZWZhdWx0cyA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwMSkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeVR1cGxlX0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jLT5mdW5jX2RlZmF1bHRzID0gUE9QKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8qIFhYWCBNYXliZSB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIG9wY29kZT8gKi8KLSAgICAgICAgICAgIGlmIChrd2RlZmF1bHRzID4gMCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpkZWZzID0gUHlEaWN0X05ldygpOwotICAgICAgICAgICAgICAgIGlmIChkZWZzID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoLS1rd2RlZmF1bHRzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYgPSBQT1AoKTsgLyogZGVmYXVsdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5ID0gUE9QKCk7IC8qIGt3IG9ubHkgYXJnIG5hbWUgKi8KLSAgICAgICAgICAgICAgICAgICAgaW50IGVyciA9IFB5RGljdF9TZXRJdGVtKGRlZnMsIGtleSwgdik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRLd0RlZmF1bHRzKGZ1bmMsIGRlZnMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcwotICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX1NldEt3RGVmYXVsdHMgY2hhbmdlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3NkZWZhdWx0cyA+IDApIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVmcyA9IFB5VHVwbGVfTmV3KHBvc2RlZmF1bHRzKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0tcG9zZGVmYXVsdHMgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShkZWZzLCBwb3NkZWZhdWx0cywgUE9QKCkpOwotICAgICAgICAgICAgICAgIGlmIChQeUZ1bmN0aW9uX1NldERlZmF1bHRzKGZ1bmMsIGRlZnMpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcwotICAgICAgICAgICAgICAgICAgICAgICBQeUZ1bmN0aW9uX1NldERlZmF1bHRzIGNoYW5nZXMuICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQVVNIKGZ1bmMpOworICAgICAgICAgICAgUFVTSCgoUHlPYmplY3QgKilmdW5jKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzQxOSw5ICszMzc4LDY4IEBACiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKKyAgICAgICAgVEFSR0VUKEZPUk1BVF9WQUxVRSkgeworICAgICAgICAgICAgLyogSGFuZGxlcyBmLXN0cmluZyB2YWx1ZSBmb3JtYXR0aW5nLiAqLworICAgICAgICAgICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpmbXRfc3BlYzsKKyAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICooKmNvbnZfZm4pKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaW50IHdoaWNoX2NvbnZlcnNpb24gPSBvcGFyZyAmIEZWQ19NQVNLOworICAgICAgICAgICAgaW50IGhhdmVfZm10X3NwZWMgPSAob3BhcmcgJiBGVlNfTUFTSykgPT0gRlZTX0hBVkVfU1BFQzsKKworICAgICAgICAgICAgZm10X3NwZWMgPSBoYXZlX2ZtdF9zcGVjID8gUE9QKCkgOiBOVUxMOworICAgICAgICAgICAgdmFsdWUgPSBQT1AoKTsKKworICAgICAgICAgICAgLyogU2VlIGlmIGFueSBjb252ZXJzaW9uIGlzIHNwZWNpZmllZC4gKi8KKyAgICAgICAgICAgIHN3aXRjaCAod2hpY2hfY29udmVyc2lvbikgeworICAgICAgICAgICAgY2FzZSBGVkNfU1RSOiAgIGNvbnZfZm4gPSBQeU9iamVjdF9TdHI7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZWQ19SRVBSOiAgY29udl9mbiA9IFB5T2JqZWN0X1JlcHI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRlZDX0FTQ0lJOiBjb252X2ZuID0gUHlPYmplY3RfQVNDSUk7IGJyZWFrOworCisgICAgICAgICAgICAvKiBNdXN0IGJlIDAgKG1lYW5pbmcgbm8gY29udmVyc2lvbiksIHNpbmNlIG9ubHkgZm91cgorICAgICAgICAgICAgICAgdmFsdWVzIGFyZSBhbGxvd2VkIGJ5IChvcGFyZyAmIEZWQ19NQVNLKS4gKi8KKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICBjb252X2ZuID0gTlVMTDsgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB0aGVyZSdzIGEgY29udmVyc2lvbiBmdW5jdGlvbiwgY2FsbCBpdCBhbmQgcmVwbGFjZQorICAgICAgICAgICAgICAgdmFsdWUgd2l0aCB0aGF0IHJlc3VsdC4gT3RoZXJ3aXNlLCBqdXN0IHVzZSB2YWx1ZSwKKyAgICAgICAgICAgICAgIHdpdGhvdXQgY29udmVyc2lvbi4gKi8KKyAgICAgICAgICAgIGlmIChjb252X2ZuICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb252X2ZuKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZtdF9zcGVjKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHZhbHVlIGlzIGEgdW5pY29kZSBvYmplY3QsIGFuZCB0aGVyZSdzIG5vIGZtdF9zcGVjLAorICAgICAgICAgICAgICAgdGhlbiB3ZSBrbm93IHRoZSByZXN1bHQgb2YgZm9ybWF0KHZhbHVlKSBpcyB2YWx1ZQorICAgICAgICAgICAgICAgaXRzZWxmLiBJbiB0aGF0IGNhc2UsIHNraXAgY2FsbGluZyBmb3JtYXQoKS4gSSBwbGFuIHRvCisgICAgICAgICAgICAgICBtb3ZlIHRoaXMgb3B0aW1pemF0aW9uIGluIHRvIFB5T2JqZWN0X0Zvcm1hdCgpCisgICAgICAgICAgICAgICBpdHNlbGYuICovCisgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrRXhhY3QodmFsdWUpICYmIGZtdF9zcGVjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvKiBEbyBub3RoaW5nLCBqdXN0IHRyYW5zZmVyIG93bmVyc2hpcCB0byByZXN1bHQuICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEFjdHVhbGx5IGNhbGwgZm9ybWF0KCkuICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUHlPYmplY3RfRm9ybWF0KHZhbHVlLCBmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBQeV9YREVDUkVGKGZtdF9zcGVjKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBVU0gocmVzdWx0KTsKKyAgICAgICAgICAgIERJU1BBVENIKCk7CisgICAgICAgIH0KKwogICAgICAgICBUQVJHRVQoRVhURU5ERURfQVJHKSB7Ci0gICAgICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKLSAgICAgICAgICAgIG9wYXJnID0gb3Bhcmc8PDE2IHwgTkVYVEFSRygpOworICAgICAgICAgICAgaW50IG9sZG9wYXJnID0gb3Bhcmc7CisgICAgICAgICAgICBORVhUT1BBUkcoKTsKKyAgICAgICAgICAgIG9wYXJnIHw9IG9sZG9wYXJnIDw8IDg7CiAgICAgICAgICAgICBnb3RvIGRpc3BhdGNoX29wY29kZTsKICAgICAgICAgfQogCkBAIC00Mjk3LDcgKzQzMTUsNyBAQAogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludAotcHJ0cmFjZShQeU9iamVjdCAqdiwgY2hhciAqc3RyKQorcHJ0cmFjZShQeU9iamVjdCAqdiwgY29uc3QgY2hhciAqc3RyKQogewogICAgIHByaW50ZigiJXMgIiwgc3RyKTsKICAgICBpZiAoUHlPYmplY3RfUHJpbnQodiwgc3Rkb3V0LCAwKSAhPSAwKQpAQCAtNDg2Myw2ICs0ODgxLDIxIEBACiB7CiAgICAgUHlPYmplY3QgKmNhbGxhcmdzLCAqdzsKIAorICAgIGlmICghbnN0YWNrKSB7CisgICAgICAgIGlmICghc3RhcmFyZykgeworICAgICAgICAgICAgLyogVGhlcmUgYXJlIG5vIHBvc2l0aW9uYWwgYXJndW1lbnRzIG9uIHRoZSBzdGFjayBhbmQgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgICAgIHNlcXVlbmNlIHRvIGJlIHVucGFja2VkLiAqLworICAgICAgICAgICAgcmV0dXJuIFB5VHVwbGVfTmV3KDApOworICAgICAgICB9CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3Qoc3RhcmFyZykpIHsKKyAgICAgICAgICAgIC8qIE5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIG9uIHRoZSBzdGFjayBhbmQgdGhlIHNlcXVlbmNlIGlzIG5vdCBhCisgICAgICAgICAgICAgICB0dXBsZSBzdWJjbGFzcyBzbyB3ZSBjYW4ganVzdCBwYXNzIHRoZSBzdGFyYXJnIHR1cGxlIGRpcmVjdGx5CisgICAgICAgICAgICAgICB0byB0aGUgZnVuY3Rpb24uICovCisgICAgICAgICAgICBQeV9JTkNSRUYoc3RhcmFyZyk7CisgICAgICAgICAgICByZXR1cm4gc3RhcmFyZzsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGNhbGxhcmdzID0gUHlUdXBsZV9OZXcobnN0YWNrICsgbnN0YXIpOwogICAgIGlmIChjYWxsYXJncyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNDk1MSw3ICs0OTg0LDcgQEAKIAogICAgIGlmIChmbGFncyAmIENBTExfRkxBR19LVykgewogICAgICAgICBrd2RpY3QgPSBFWFRfUE9QKCpwcF9zdGFjayk7Ci0gICAgICAgIGlmICghUHlEaWN0X0NoZWNrKGt3ZGljdCkpIHsKKyAgICAgICAgaWYgKCFQeURpY3RfQ2hlY2tFeGFjdChrd2RpY3QpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqZDsKICAgICAgICAgICAgIGQgPSBQeURpY3RfTmV3KCk7CiAgICAgICAgICAgICBpZiAoZCA9PSBOVUxMKQpAQCAtNTI2MSw3ICs1Mjk0LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfY29uY2F0ZW5hdGUoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3LAotICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmLCB1bnNpZ25lZCBjaGFyICpuZXh0X2luc3RyKQorICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICpmLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqbmV4dF9pbnN0cikKIHsKICAgICBQeU9iamVjdCAqcmVzOwogICAgIGlmIChQeV9SRUZDTlQodikgPT0gMikgewpAQCAtNTI3MSwxMCArNTMwNCwxMSBAQAogICAgICAgICAgKiAndmFyaWFibGUnLiAgV2UgdHJ5IHRvIGRlbGV0ZSB0aGUgdmFyaWFibGUgbm93IHRvIHJlZHVjZQogICAgICAgICAgKiB0aGUgcmVmY250IHRvIDEuCiAgICAgICAgICAqLwotICAgICAgICBzd2l0Y2ggKCpuZXh0X2luc3RyKSB7CisgICAgICAgIGludCBvcGNvZGUsIG9wYXJnOworICAgICAgICBORVhUT1BBUkcoKTsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBTVE9SRV9GQVNUOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb3BhcmcgPSBQRUVLQVJHKCk7CiAgICAgICAgICAgICBQeU9iamVjdCAqKmZhc3Rsb2NhbHMgPSBmLT5mX2xvY2Fsc3BsdXM7CiAgICAgICAgICAgICBpZiAoR0VUTE9DQUwob3BhcmcpID09IHYpCiAgICAgICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIE5VTEwpOwpAQCAtNTI4NCw3ICs1MzE4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKipmcmVldmFycyA9IChmLT5mX2xvY2Fsc3BsdXMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2NvZGUtPmNvX25sb2NhbHMpOwotICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBmcmVldmFyc1tQRUVLQVJHKCldOworICAgICAgICAgICAgUHlPYmplY3QgKmMgPSBmcmVldmFyc1tvcGFyZ107CiAgICAgICAgICAgICBpZiAoUHlDZWxsX0dFVChjKSA9PSB2KQogICAgICAgICAgICAgICAgIFB5Q2VsbF9TZXQoYywgTlVMTCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTUyOTIsNyArNTMyNiw3IEBACiAgICAgICAgIGNhc2UgU1RPUkVfTkFNRToKICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzID0gZi0+Zl9jb2RlLT5jb19uYW1lczsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgUEVFS0FSRygpKTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gR0VUSVRFTShuYW1lcywgb3BhcmcpOwogICAgICAgICAgICAgUHlPYmplY3QgKmxvY2FscyA9IGYtPmZfbG9jYWxzOwogICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGxvY2FscykgJiYKICAgICAgICAgICAgICAgICBQeURpY3RfR2V0SXRlbShsb2NhbHMsIG5hbWUpID09IHYpIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oIGIvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKaW5kZXggOTA5OTVlNS4uNmRmM2VmNSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKKysrIGIvUHl0aG9uL2NsaW5pYy9ibHRpbm1vZHVsZS5jLmgKQEAgLTk0LDggKzk0LDkgQEAKICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfFU6Zm9ybWF0IiwKLSAgICAgICAgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKQorICAgICAgICAmdmFsdWUsICZmb3JtYXRfc3BlYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2Zvcm1hdF9pbXBsKG1vZHVsZSwgdmFsdWUsIGZvcm1hdF9zcGVjKTsKIAogZXhpdDoKQEAgLTEyMCw4ICsxMjEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBpOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmNociIsICZpKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Y2hyIiwgJmkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9jaHJfaW1wbChtb2R1bGUsIGkpOwogCiBleGl0OgpAQCAtMTY3LDggKzE2OSw5IEBACiAgICAgaW50IG9wdGltaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPTyZzfGlpaTpjb21waWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmc291cmNlLCBQeVVuaWNvZGVfRlNEZWNvZGVyLCAmZmlsZW5hbWUsICZtb2RlLCAmZmxhZ3MsICZkb250X2luaGVyaXQsICZvcHRpbWl6ZSkpCisgICAgICAgICZzb3VyY2UsIFB5VW5pY29kZV9GU0RlY29kZXIsICZmaWxlbmFtZSwgJm1vZGUsICZmbGFncywgJmRvbnRfaW5oZXJpdCwgJm9wdGltaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fY29tcGlsZV9pbXBsKG1vZHVsZSwgc291cmNlLCBmaWxlbmFtZSwgbW9kZSwgZmxhZ3MsIGRvbnRfaW5oZXJpdCwgb3B0aW1pemUpOwogCiBleGl0OgpAQCAtMTk2LDggKzE5OSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkaXZtb2QiLAogICAgICAgICAyLCAyLAotICAgICAgICAmeCwgJnkpKQorICAgICAgICAmeCwgJnkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9kaXZtb2RfaW1wbChtb2R1bGUsIHgsIHkpOwogCiBleGl0OgpAQCAtMjMzLDggKzIzNyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJldmFsIiwKICAgICAgICAgMSwgMywKLSAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKQorICAgICAgICAmc291cmNlLCAmZ2xvYmFscywgJmxvY2FscykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2V2YWxfaW1wbChtb2R1bGUsIHNvdXJjZSwgZ2xvYmFscywgbG9jYWxzKTsKIAogZXhpdDoKQEAgLTI3MCw4ICsyNzUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXhlYyIsCiAgICAgICAgIDEsIDMsCi0gICAgICAgICZzb3VyY2UsICZnbG9iYWxzLCAmbG9jYWxzKSkKKyAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9leGVjX2ltcGwobW9kdWxlLCBzb3VyY2UsIGdsb2JhbHMsIGxvY2Fscyk7CiAKIGV4aXQ6CkBAIC0zMjIsOCArMzI4LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImhhc2F0dHIiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmbmFtZSkpCisgICAgICAgICZvYmosICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faGFzYXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lKTsKIAogZXhpdDoKQEAgLTM2Nyw4ICszNzQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0YXR0ciIsCiAgICAgICAgIDMsIDMsCi0gICAgICAgICZvYmosICZuYW1lLCAmdmFsdWUpKQorICAgICAgICAmb2JqLCAmbmFtZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fc2V0YXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zOTgsOCArNDA2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImRlbGF0dHIiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmbmFtZSkpCisgICAgICAgICZvYmosICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fZGVsYXR0cl9pbXBsKG1vZHVsZSwgb2JqLCBuYW1lKTsKIAogZXhpdDoKQEAgLTUwNyw4ICs1MTYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicG93IiwKICAgICAgICAgMiwgMywKLSAgICAgICAgJngsICZ5LCAmeikpCisgICAgICAgICZ4LCAmeSwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9wb3dfaW1wbChtb2R1bGUsIHgsIHksIHopOwogCiBleGl0OgpAQCAtNTQxLDggKzU1MSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpbnB1dCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZwcm9tcHQpKQorICAgICAgICAmcHJvbXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faW5wdXRfaW1wbChtb2R1bGUsIHByb21wdCk7CiAKIGV4aXQ6CkBAIC01ODUsOCArNTk2LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInN1bSIsCiAgICAgICAgIDEsIDIsCi0gICAgICAgICZpdGVyYWJsZSwgJnN0YXJ0KSkKKyAgICAgICAgJml0ZXJhYmxlLCAmc3RhcnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9zdW1faW1wbChtb2R1bGUsIGl0ZXJhYmxlLCBzdGFydCk7CiAKIGV4aXQ6CkBAIC02MTksOCArNjMxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImlzaW5zdGFuY2UiLAogICAgICAgICAyLCAyLAotICAgICAgICAmb2JqLCAmY2xhc3Nfb3JfdHVwbGUpKQorICAgICAgICAmb2JqLCAmY2xhc3Nfb3JfdHVwbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9pc2luc3RhbmNlX2ltcGwobW9kdWxlLCBvYmosIGNsYXNzX29yX3R1cGxlKTsKIAogZXhpdDoKQEAgLTY1MywxMSArNjY2LDEyIEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc3N1YmNsYXNzIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJmNscywgJmNsYXNzX29yX3R1cGxlKSkKKyAgICAgICAgJmNscywgJmNsYXNzX29yX3R1cGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faXNzdWJjbGFzc19pbXBsKG1vZHVsZSwgY2xzLCBjbGFzc19vcl90dXBsZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00YmVmMTZiNmFhNDMyODc5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05NDBmMjUxMjZjYWY4MTY2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaCBiL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaAppbmRleCAyNDc3NjY1Li45YjlmODEyIDEwMDY0NAotLS0gYS9QeXRob24vY2xpbmljL2ltcG9ydC5jLmgKKysrIGIvUHl0aG9uL2NsaW5pYy9pbXBvcnQuYy5oCkBAIC04OSw4ICs4OSw5IEBACiAgICAgUHlPYmplY3QgKnBhdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hVTpfZml4X2NvX2ZpbGVuYW1lIiwKLSAgICAgICAgJlB5Q29kZV9UeXBlLCAmY29kZSwgJnBhdGgpKQorICAgICAgICAmUHlDb2RlX1R5cGUsICZjb2RlLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX19maXhfY29fZmlsZW5hbWVfaW1wbChtb2R1bGUsIGNvZGUsIHBhdGgpOwogCiBleGl0OgpAQCAtMTQyLDggKzE0Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aW5pdF9mcm96ZW4iLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmluaXRfZnJvemVuIiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9pbml0X2Zyb3plbl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0xNjgsOCArMTcwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpnZXRfZnJvemVuX29iamVjdCIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6Z2V0X2Zyb3plbl9vYmplY3QiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2dldF9mcm96ZW5fb2JqZWN0X2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTE5NCw4ICsxOTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbl9wYWNrYWdlIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW5fcGFja2FnZSIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfZnJvemVuX3BhY2thZ2VfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMjIwLDggKzIyNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfYnVpbHRpbiIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfYnVpbHRpbiIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfYnVpbHRpbl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0yNDYsOCArMjUxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW4iLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2Zyb3plbiIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaXNfZnJvemVuX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTI3Nyw4ICsyODMsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiY3JlYXRlX2R5bmFtaWMiLAogICAgICAgICAxLCAyLAotICAgICAgICAmc3BlYywgJmZpbGUpKQorICAgICAgICAmc3BlYywgJmZpbGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9jcmVhdGVfZHluYW1pY19pbXBsKG1vZHVsZSwgc3BlYywgZmlsZSk7CiAKIGV4aXQ6CkBAIC0zMDgsOCArMzE1LDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfaW1wX2V4ZWNfZHluYW1pY19pbXBsKG1vZHVsZSwgbW9kKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzM3LDggKzM0NSw5IEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX2ltcF9leGVjX2J1aWx0aW5faW1wbChtb2R1bGUsIG1vZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1Miw0ICszNjEsNCBAQAogI2lmbmRlZiBfSU1QX0VYRUNfRFlOQU1JQ19NRVRIT0RERUYKICAgICAjZGVmaW5lIF9JTVBfRVhFQ19EWU5BTUlDX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKF9JTVBfRVhFQ19EWU5BTUlDX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zMjMyNGE1ZTQ2Y2RmYzRiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yMmE3MjI1OTI1NzU1Njc0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IGNlNTEwYWEuLjY4N2I3NTAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgImNvZGUuaCIKICNpbmNsdWRlICJzeW10YWJsZS5oIgogI2luY2x1ZGUgIm9wY29kZS5oIgorI2luY2x1ZGUgIndvcmRjb2RlX2hlbHBlcnMuaCIKIAogI2RlZmluZSBERUZBVUxUX0JMT0NLX1NJWkUgMTYKICNkZWZpbmUgREVGQVVMVF9CTE9DS1MgOApAQCAtNDMsNyArNDQsNiBAQAogc3RydWN0IGluc3RyIHsKICAgICB1bnNpZ25lZCBpX2phYnMgOiAxOwogICAgIHVuc2lnbmVkIGlfanJlbCA6IDE7Ci0gICAgdW5zaWduZWQgaV9oYXNhcmcgOiAxOwogICAgIHVuc2lnbmVkIGNoYXIgaV9vcGNvZGU7CiAgICAgaW50IGlfb3Bhcmc7CiAgICAgc3RydWN0IGJhc2ljYmxvY2tfICppX3RhcmdldDsgLyogdGFyZ2V0IGJsb2NrIChpZiBqdW1wIGluc3RydWN0aW9uKSAqLwpAQCAtMTcxLDcgKzE3MSw2IEBACiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX28oc3RydWN0IGNvbXBpbGVyICosIGludCwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX2koc3RydWN0IGNvbXBpbGVyICosIGludCwgUHlfc3NpemVfdCk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FkZG9wX2ooc3RydWN0IGNvbXBpbGVyICosIGludCwgYmFzaWNibG9jayAqLCBpbnQpOwotc3RhdGljIGJhc2ljYmxvY2sgKmNvbXBpbGVyX3VzZV9uZXdfYmxvY2soc3RydWN0IGNvbXBpbGVyICopOwogc3RhdGljIGludCBjb21waWxlcl9lcnJvcihzdHJ1Y3QgY29tcGlsZXIgKiwgY29uc3QgY2hhciAqKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfbmFtZW9wKHN0cnVjdCBjb21waWxlciAqLCBpZGVudGlmaWVyLCBleHByX2NvbnRleHRfdHkpOwogCkBAIC0xOTYsNyArMTk1LDcgQEAKIHN0YXRpYyBpbnQgY29tcGlsZXJfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfd2l0aChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSwgaW50KTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfYXN5bmNfZm9yKHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKLXN0YXRpYyBpbnQgY29tcGlsZXJfY2FsbF9oZWxwZXIoc3RydWN0IGNvbXBpbGVyICpjLCBQeV9zc2l6ZV90IG4sCitzdGF0aWMgaW50IGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywgaW50IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa2V5d29yZHMpOwogc3RhdGljIGludCBjb21waWxlcl90cnlfZXhjZXB0KHN0cnVjdCBjb21waWxlciAqLCBzdG10X3R5KTsKQEAgLTQ3Nyw5ICs0NzYsOSBAQAogewogICAgIGJhc2ljYmxvY2sgKmJsb2NrOwogICAgIGZvciAoYmxvY2sgPSB1LT51X2Jsb2NrczsgYmxvY2sgIT0gTlVMTDsgYmxvY2sgPSBibG9jay0+Yl9saXN0KSB7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhjYmNiY2JjYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhmYmZiZmJmYik7Ci0gICAgICAgIGFzc2VydCgodm9pZCAqKWJsb2NrICE9ICh2b2lkICopMHhkYmRiZGJkYik7CisgICAgICAgIGFzc2VydCgoUHlfdWludHB0cl90KWJsb2NrICE9IDB4Y2JjYmNiY2JVKTsKKyAgICAgICAgYXNzZXJ0KChQeV91aW50cHRyX3QpYmxvY2sgIT0gMHhmYmZiZmJmYlUpOworICAgICAgICBhc3NlcnQoKFB5X3VpbnRwdHJfdClibG9jayAhPSAweGRiZGJkYmRiVSk7CiAgICAgICAgIGlmIChibG9jay0+Yl9pbnN0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaWFsbG9jID4gMCk7CiAgICAgICAgICAgICBhc3NlcnQoYmxvY2stPmJfaXVzZWQgPiAwKTsKQEAgLTUyMyw2ICs1MjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgaW50IHNjb3BlX3R5cGUsIHZvaWQgKmtleSwgaW50IGxpbmVubykKIHsKICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCAqdTsKKyAgICBiYXNpY2Jsb2NrICpibG9jazsKIAogICAgIHUgPSAoc3RydWN0IGNvbXBpbGVyX3VuaXQgKilQeU9iamVjdF9NYWxsb2Moc2l6ZW9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsZXJfdW5pdCkpOwpAQCAtNjIwLDggKzYyMCwxMSBAQAogICAgIGMtPnUgPSB1OwogCiAgICAgYy0+Y19uZXN0bGV2ZWwrKzsKLSAgICBpZiAoY29tcGlsZXJfdXNlX25ld19ibG9jayhjKSA9PSBOVUxMKQorCisgICAgYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CisgICAgaWYgKGJsb2NrID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOworICAgIGMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKIAogICAgIGlmICh1LT51X3Njb3BlX3R5cGUgIT0gQ09NUElMRVJfU0NPUEVfTU9EVUxFKSB7CiAgICAgICAgIGlmICghY29tcGlsZXJfc2V0X3F1YWxuYW1lKGMpKQpAQCAtNzMxLDYgKzczNCw3IEBACiAgICAgcmV0dXJuIDE7CiB9CiAKKwogLyogQWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCiAgICBSZXR1cm5zIE5VTEwgb24gZXJyb3IuCiAqLwpAQCAtNzU1LDE2ICs3NTksNiBAQAogfQogCiBzdGF0aWMgYmFzaWNibG9jayAqCi1jb21waWxlcl91c2VfbmV3X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqYykKLXsKLSAgICBiYXNpY2Jsb2NrICpibG9jayA9IGNvbXBpbGVyX25ld19ibG9jayhjKTsKLSAgICBpZiAoYmxvY2sgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYy0+dS0+dV9jdXJibG9jayA9IGJsb2NrOwotICAgIHJldHVybiBibG9jazsKLX0KLQotc3RhdGljIGJhc2ljYmxvY2sgKgogY29tcGlsZXJfbmV4dF9ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCiB7CiAgICAgYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7CkBAIC05ODYsNiArOTgwLDggQEAKICAgICAgICAgICAgIHJldHVybiAxIC0gKG9wYXJnICYgMHhGRik7CiAgICAgICAgIGNhc2UgQlVJTERfTUFQOgogICAgICAgICAgICAgcmV0dXJuIDEgLSAyKm9wYXJnOworICAgICAgICBjYXNlIEJVSUxEX0NPTlNUX0tFWV9NQVA6CisgICAgICAgICAgICByZXR1cm4gLW9wYXJnOwogICAgICAgICBjYXNlIExPQURfQVRUUjoKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjYXNlIENPTVBBUkVfT1A6CkBAIC0xMDM0LDExICsxMDMwLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gLU5BUkdTKG9wYXJnKS0xOwogICAgICAgICBjYXNlIENBTExfRlVOQ1RJT05fVkFSX0tXOgogICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMjsKLSAgICAgICAgY2FzZSBNQUtFX0ZVTkNUSU9OOgotICAgICAgICAgICAgcmV0dXJuIC0xIC1OQVJHUyhvcGFyZykgLSAoKG9wYXJnID4+IDE2KSAmIDB4ZmZmZik7Ci0gICAgICAgIGNhc2UgTUFLRV9DTE9TVVJFOgotICAgICAgICAgICAgcmV0dXJuIC0yIC0gTkFSR1Mob3BhcmcpIC0gKChvcGFyZyA+PiAxNikgJiAweGZmZmYpOwogI3VuZGVmIE5BUkdTCisgICAgICAgIGNhc2UgTUFLRV9GVU5DVElPTjoKKyAgICAgICAgICAgIHJldHVybiAtMSAtICgob3BhcmcgJiAweDAxKSAhPSAwKSAtICgob3BhcmcgJiAweDAyKSAhPSAwKSAtCisgICAgICAgICAgICAgICAgKChvcGFyZyAmIDB4MDQpICE9IDApIC0gKChvcGFyZyAmIDB4MDgpICE9IDApOwogICAgICAgICBjYXNlIEJVSUxEX1NMSUNFOgogICAgICAgICAgICAgaWYgKG9wYXJnID09IDMpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0yOwpAQCAtMTA2Niw2ICsxMDYxLDEwIEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBHRVRfWUlFTERfRlJPTV9JVEVSOgogICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgRk9STUFUX1ZBTFVFOgorICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGZtdF9zcGVjIG9uIHRoZSBzdGFjaywgd2UgZ28gZnJvbSAyLT4xLAorICAgICAgICAgICAgICAgZWxzZSAxLT4xLiAqLworICAgICAgICAgICAgcmV0dXJuIChvcGFyZyAmIEZWU19NQVNLKSA9PSBGVlNfSEFWRV9TUEVDID8gLTEgOiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFBZX0lOVkFMSURfU1RBQ0tfRUZGRUNUOwogICAgIH0KQEAgLTEwODIsMTMgKzEwODEsMTQgQEAKICAgICBiYXNpY2Jsb2NrICpiOwogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOworICAgIGFzc2VydCghSEFTX0FSRyhvcGNvZGUpKTsKICAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwogICAgIGlmIChvZmYgPCAwKQogICAgICAgICByZXR1cm4gMDsKICAgICBiID0gYy0+dS0+dV9jdXJibG9jazsKICAgICBpID0gJmItPmJfaW5zdHJbb2ZmXTsKICAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKLSAgICBpLT5pX2hhc2FyZyA9IDA7CisgICAgaS0+aV9vcGFyZyA9IDA7CiAgICAgaWYgKG9wY29kZSA9PSBSRVRVUk5fVkFMVUUpCiAgICAgICAgIGItPmJfcmV0dXJuID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CkBAIC0xMTY1LDEwICsxMTY1LDE1IEBACiAgICAgc3RydWN0IGluc3RyICppOwogICAgIGludCBvZmY7CiAKLSAgICAvKiBJbnRlZ2VyIGFyZ3VtZW50cyBhcmUgbGltaXQgdG8gMTYtYml0LiBUaGVyZSBpcyBhbiBleHRlbnNpb24gZm9yIDMyLWJpdAotICAgICAgIGludGVnZXIgYXJndW1lbnRzLiAqLwotICAgIGFzc2VydCgoLTIxNDc0ODM2NDctMSkgPD0gb3BhcmcpOwotICAgIGFzc2VydChvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKKyAgICAvKiBvcGFyZyB2YWx1ZSBpcyB1bnNpZ25lZCwgYnV0IGEgc2lnbmVkIEMgaW50IGlzIHVzdWFsbHkgdXNlZCB0byBzdG9yZQorICAgICAgIGl0IGluIHRoZSBDIGNvZGUgKGxpa2UgUHl0aG9uL2NldmFsLmMpLgorCisgICAgICAgTGltaXQgdG8gMzItYml0IHNpZ25lZCBDIGludCAocmF0aGVyIHRoYW4gSU5UX01BWCkgZm9yIHBvcnRhYmlsaXR5LgorCisgICAgICAgVGhlIGFyZ3VtZW50IG9mIGEgY29uY3JldGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gaXMgbGltaXRlZCB0byA4LWJpdC4KKyAgICAgICBFWFRFTkRFRF9BUkcgaXMgdXNlZCBmb3IgMTYsIDI0LCBhbmQgMzItYml0IGFyZ3VtZW50cy4gKi8KKyAgICBhc3NlcnQoSEFTX0FSRyhvcGNvZGUpKTsKKyAgICBhc3NlcnQoMCA8PSBvcGFyZyAmJiBvcGFyZyA8PSAyMTQ3NDgzNjQ3KTsKIAogICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CiAgICAgaWYgKG9mZiA8IDApCkBAIC0xMTc2LDcgKzExODEsNiBAQAogICAgIGkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwogICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOwogICAgIGktPmlfb3BhcmcgPSBQeV9TQUZFX0RPV05DQVNUKG9wYXJnLCBQeV9zc2l6ZV90LCBpbnQpOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBjb21waWxlcl9zZXRfbGluZW5vKGMsIG9mZik7CiAgICAgcmV0dXJuIDE7CiB9CkBAIC0xMTg3LDYgKzExOTEsNyBAQAogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOwogCisgICAgYXNzZXJ0KEhBU19BUkcob3Bjb2RlKSk7CiAgICAgYXNzZXJ0KGIgIT0gTlVMTCk7CiAgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKICAgICBpZiAob2ZmIDwgMCkKQEAgLTExOTQsNyArMTE5OSw2IEBACiAgICAgaSA9ICZjLT51LT51X2N1cmJsb2NrLT5iX2luc3RyW29mZl07CiAgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7CiAgICAgaS0+aV90YXJnZXQgPSBiOwotICAgIGktPmlfaGFzYXJnID0gMTsKICAgICBpZiAoYWJzb2x1dGUpCiAgICAgICAgIGktPmlfamFicyA9IDE7CiAgICAgZWxzZQpAQCAtMTIwMywyMiArMTIwNywxMiBAQAogICAgIHJldHVybiAxOwogfQogCi0vKiBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBORVdfQkxPQ0sgYW5kIE5FWFRfQkxPQ0sgaXMgc3VidGxlLiAgKEknZAotICAgbGlrZSB0byBmaW5kIGJldHRlciBuYW1lcy4pICBORVdfQkxPQ0soKSBjcmVhdGVzIGEgbmV3IGJsb2NrIGFuZCBzZXRzCi0gICBpdCBhcyB0aGUgY3VycmVudCBibG9jay4gIE5FWFRfQkxPQ0soKSBhbHNvIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcAotICAgZnJvbSB0aGUgY3VycmVudCBibG9jayB0byB0aGUgbmV3IGJsb2NrLgorLyogTkVYVF9CTE9DSygpIGNyZWF0ZXMgYW4gaW1wbGljaXQganVtcCBmcm9tIHRoZSBjdXJyZW50IGJsb2NrCisgICB0byB0aGUgbmV3IGJsb2NrLgorCisgICBUaGUgcmV0dXJucyBpbnNpZGUgdGhpcyBtYWNybyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKKyAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiBMb2NhbCBvYmplY3RzIHNob3VsZCB1c2UgdGhlIGFyZW5hLgogKi8KLQotLyogVGhlIHJldHVybnMgaW5zaWRlIHRoZXNlIG1hY3JvcyBtYWtlIGl0IGltcG9zc2libGUgdG8gZGVjcmVmIG9iamVjdHMKLSAgIGNyZWF0ZWQgaW4gdGhlIGxvY2FsIGZ1bmN0aW9uLiAgTG9jYWwgb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBhcmVuYS4KLSovCi0KLQotI2RlZmluZSBORVdfQkxPQ0soQykgeyBcCi0gICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soKEMpKSA9PSBOVUxMKSBcCi0gICAgICAgIHJldHVybiAwOyBcCi19Ci0KICNkZWZpbmUgTkVYVF9CTE9DSyhDKSB7IFwKICAgICBpZiAoY29tcGlsZXJfbmV4dF9ibG9jaygoQykpID09IE5VTEwpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEyNDEsNiArMTIzNSwxNSBAQAogICAgICAgICByZXR1cm4gMDsgXAogfQogCisvKiBTYW1lIGFzIEFERE9QX08sIGJ1dCBzdGVhbHMgYSByZWZlcmVuY2UuICovCisjZGVmaW5lIEFERE9QX04oQywgT1AsIE8sIFRZUEUpIHsgXAorICAgIGlmICghY29tcGlsZXJfYWRkb3BfbygoQyksIChPUCksIChDKS0+dS0+dV8gIyMgVFlQRSwgKE8pKSkgeyBcCisgICAgICAgIFB5X0RFQ1JFRigoTykpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCisgICAgUHlfREVDUkVGKChPKSk7IFwKK30KKwogI2RlZmluZSBBRERPUF9OQU1FKEMsIE9QLCBPLCBUWVBFKSB7IFwKICAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX25hbWUoKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIFwKICAgICAgICAgcmV0dXJuIDA7IFwKQEAgLTEzMDksNyArMTMxMiw0OSBAQAogewogICAgIGlmIChzLT5raW5kICE9IEV4cHJfa2luZCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZDsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzLT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Citpc19jb25zdChleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgIGNhc2UgTnVtX2tpbmQ6CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiAxOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIFB5T2JqZWN0ICoKK2dldF9jb25zdF92YWx1ZShleHByX3R5IGUpCit7CisgICAgc3dpdGNoIChlLT5raW5kKSB7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICBjYXNlIE51bV9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5OdW0ubjsKKyAgICBjYXNlIFN0cl9raW5kOgorICAgICAgICByZXR1cm4gZS0+di5TdHIuczsKKyAgICBjYXNlIEJ5dGVzX2tpbmQ6CisgICAgICAgIHJldHVybiBlLT52LkJ5dGVzLnM7CisgICAgY2FzZSBFbGxpcHNpc19raW5kOgorICAgICAgICByZXR1cm4gUHlfRWxsaXBzaXM7CisgICAgY2FzZSBOYW1lQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuTmFtZUNvbnN0YW50LnZhbHVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCghaXNfY29uc3QoZSkpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIC8qIENvbXBpbGUgYSBzZXF1ZW5jZSBvZiBzdGF0ZW1lbnRzLCBjaGVja2luZyBmb3IgYSBkb2NzdHJpbmcuICovCkBAIC0xNDI2LDUzICsxNDcxLDUwIEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBpbGVyX21ha2VfY2xvc3VyZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgYXJncywgUHlPYmplY3QgKnF1YWxuYW1lKQorY29tcGlsZXJfbWFrZV9jbG9zdXJlKHN0cnVjdCBjb21waWxlciAqYywgUHlDb2RlT2JqZWN0ICpjbywgUHlfc3NpemVfdCBmbGFncywgUHlPYmplY3QgKnF1YWxuYW1lKQogewogICAgIFB5X3NzaXplX3QgaSwgZnJlZSA9IFB5Q29kZV9HZXROdW1GcmVlKGNvKTsKICAgICBpZiAocXVhbG5hbWUgPT0gTlVMTCkKICAgICAgICAgcXVhbG5hbWUgPSBjby0+Y29fbmFtZTsKIAotICAgIGlmIChmcmVlID09IDApIHsKLSAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwotICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIHF1YWxuYW1lLCBjb25zdHMpOwotICAgICAgICBBRERPUF9JKGMsIE1BS0VfRlVOQ1RJT04sIGFyZ3MpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGZyZWU7ICsraSkgewotICAgICAgICAvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCi0gICAgICAgICAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuCi0gICAgICAgICovCi0gICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOwotICAgICAgICBpbnQgYXJnLCByZWZ0eXBlOworICAgIGlmIChmcmVlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKKyAgICAgICAgICAgIC8qIEJ5cGFzcyBjb21fYWRkb3BfdmFybmFtZSBiZWNhdXNlIGl0IHdpbGwgZ2VuZXJhdGUKKyAgICAgICAgICAgICAgIExPQURfREVSRUYgYnV0IExPQURfQ0xPU1VSRSBpcyBuZWVkZWQuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUgPSBQeVR1cGxlX0dFVF9JVEVNKGNvLT5jb19mcmVldmFycywgaSk7CisgICAgICAgICAgICBpbnQgYXJnLCByZWZ0eXBlOwogCi0gICAgICAgIC8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKLSAgICAgICAgICAgZnJlZSB2YXJpYWJsZSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIGEgbWV0aG9kLAotICAgICAgICAgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKLSAgICAgICAgICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKLSAgICAgICAgICAgd2VsbCBhcyBieSB0aGUgbm9ybWFsIG5hbWUgbG9vb2t1cCBsb2dpYy4KLSAgICAgICAgKi8KLSAgICAgICAgcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKLSAgICAgICAgaWYgKHJlZnR5cGUgPT0gQ0VMTCkKLSAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7Ci0gICAgICAgIGVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KLSAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9mcmVldmFycywgbmFtZSk7Ci0gICAgICAgIGlmIChhcmcgPT0gLTEpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICJsb29rdXAgJXMgaW4gJXMgJWQgJWRcbiIKLSAgICAgICAgICAgICAgICAiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihuYW1lKSksCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjLT51LT51X25hbWUpLAotICAgICAgICAgICAgICAgIHJlZnR5cGUsIGFyZywKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGNvLT5jb19uYW1lKSwKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIoY28tPmNvX2ZyZWV2YXJzKSkpOwotICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogSWYgYSBjbGFzcyBjb250YWlucyBhIG1ldGhvZCB3aXRoIGEKKyAgICAgICAgICAgICAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKKyAgICAgICAgICAgICAgIHRoZSBuYW1lIHdpbGwgYmUgY29uc2lkZXJlZCBmcmVlICphbmQqIGxvY2FsIGluIHRoZQorICAgICAgICAgICAgICAgY2xhc3MuICBJdCBzaG91bGQgYmUgaGFuZGxlZCBieSB0aGUgY2xvc3VyZSwgYXMKKyAgICAgICAgICAgICAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgcmVmdHlwZSA9IGdldF9yZWZfdHlwZShjLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZWZ0eXBlID09IENFTEwpCisgICAgICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2NlbGx2YXJzLCBuYW1lKTsKKyAgICAgICAgICAgIGVsc2UgLyogKHJlZnR5cGUgPT0gRlJFRSkgKi8KKyAgICAgICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOworICAgICAgICAgICAgaWYgKGFyZyA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAibG9va3VwICVzIGluICVzICVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICJmcmVldmFycyBvZiAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihuYW1lKSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoYy0+dS0+dV9uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgcmVmdHlwZSwgYXJnLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGNvLT5jb19uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChQeU9iamVjdF9SZXByKGNvLT5jb19mcmVldmFycykpKTsKKyAgICAgICAgICAgICAgICBQeV9GYXRhbEVycm9yKCJjb21waWxlcl9tYWtlX2Nsb3N1cmUoKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7CiAgICAgICAgIH0KLSAgICAgICAgQURET1BfSShjLCBMT0FEX0NMT1NVUkUsIGFyZyk7CisgICAgICAgIGZsYWdzIHw9IDB4MDg7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIGZyZWUpOwogICAgIH0KLSAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIChQeU9iamVjdCopY28sIGNvbnN0cyk7CiAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBxdWFsbmFtZSwgY29uc3RzKTsKLSAgICBBRERPUF9JKGMsIE1BS0VfQ0xPU1VSRSwgYXJncyk7CisgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBmbGFncyk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTE0OTQsMjYgKzE1MzYsNjAgQEAKIGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKHN0cnVjdCBjb21waWxlciAqYywgYXNkbF9zZXEgKmt3b25seWFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa3dfZGVmYXVsdHMpCiB7Ci0gICAgLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVmYXVsdHMgKyAxLgotICAgICAgIFJldHVybnMgMCBvbiBlcnJvci4KLSAgICAgKi8KLSAgICBpbnQgaSwgZGVmYXVsdF9jb3VudCA9IDA7CisgICAgLyogUHVzaCBhIGRpY3Qgb2Yga2V5d29yZC1vbmx5IGRlZmF1bHQgdmFsdWVzLgorCisgICAgICAgUmV0dXJuIDAgb24gZXJyb3IsIC0xIGlmIG5vIGRpY3QgcHVzaGVkLCAxIGlmIGEgZGljdCBpcyBwdXNoZWQuCisgICAgICAgKi8KKyAgICBpbnQgaTsKKyAgICBQeU9iamVjdCAqa2V5cyA9IE5VTEw7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgYXNkbF9zZXFfTEVOKGt3b25seWFyZ3MpOyBpKyspIHsKICAgICAgICAgYXJnX3R5IGFyZyA9IGFzZGxfc2VxX0dFVChrd29ubHlhcmdzLCBpKTsKICAgICAgICAgZXhwcl90eSBkZWZhdWx0XyA9IGFzZGxfc2VxX0dFVChrd19kZWZhdWx0cywgaSk7CiAgICAgICAgIGlmIChkZWZhdWx0XykgewogICAgICAgICAgICAgUHlPYmplY3QgKm1hbmdsZWQgPSBfUHlfTWFuZ2xlKGMtPnUtPnVfcHJpdmF0ZSwgYXJnLT5hcmcpOwotICAgICAgICAgICAgaWYgKCFtYW5nbGVkKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBtYW5nbGVkLCBjb25zdHMpOwotICAgICAgICAgICAgUHlfREVDUkVGKG1hbmdsZWQpOwotICAgICAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9leHByKGMsIGRlZmF1bHRfKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKCFtYW5nbGVkKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHRfY291bnQrKzsKKyAgICAgICAgICAgIGlmIChrZXlzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBrZXlzID0gUHlMaXN0X05ldygxKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShrZXlzLCAwLCBtYW5nbGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXMgPSBQeUxpc3RfQXBwZW5kKGtleXMsIG1hbmdsZWQpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9leHByKGMsIGRlZmF1bHRfKSkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGRlZmF1bHRfY291bnQgKyAxOworICAgIGlmIChrZXlzICE9IE5VTEwpIHsKKyAgICAgICAgUHlfc3NpemVfdCBkZWZhdWx0X2NvdW50ID0gUHlMaXN0X0dFVF9TSVpFKGtleXMpOworICAgICAgICBQeU9iamVjdCAqa2V5c190dXBsZSA9IFB5TGlzdF9Bc1R1cGxlKGtleXMpOworICAgICAgICBQeV9ERUNSRUYoa2V5cyk7CisgICAgICAgIGlmIChrZXlzX3R1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5c190dXBsZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBkZWZhdWx0X2NvdW50KTsKKyAgICAgICAgYXNzZXJ0KGRlZmF1bHRfY291bnQgPiAwKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCitlcnJvcjoKKyAgICBQeV9YREVDUkVGKGtleXMpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50CkBAIC0xNTU2LDExICsxNjMyLDEwIEBACiBjb21waWxlcl92aXNpdF9hbm5vdGF0aW9ucyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSByZXR1cm5zKQogewotICAgIC8qIFB1c2ggYXJnIGFubm90YXRpb25zIGFuZCBhIGxpc3Qgb2YgdGhlIGFyZ3VtZW50IG5hbWVzLiBSZXR1cm4gdGhlICMKLSAgICAgICBvZiBpdGVtcyBwdXNoZWQgKyAxLiBUaGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBvdXQtb2Ytb3JkZXIgd3J0IHRoZQotICAgICAgIHNvdXJjZSBjb2RlLgorICAgIC8qIFB1c2ggYXJnIGFubm90YXRpb24gZGljdC4KKyAgICAgICBUaGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBvdXQtb2Ytb3JkZXIgd3J0IHRoZSBzb3VyY2UgY29kZS4KIAotICAgICAgIE1vcmUgdGhhbiAyXjE2LTEgYW5ub3RhdGlvbnMgaXMgYSBTeW50YXhFcnJvci4gUmV0dXJucyAwIG9uIGVycm9yLgorICAgICAgIFJldHVybiAwIG9uIGVycm9yLCAtMSBpZiBubyBkaWN0IHB1c2hlZCwgMSBpZiBhIGRpY3QgaXMgcHVzaGVkLgogICAgICAgICovCiAgICAgc3RhdGljIGlkZW50aWZpZXIgcmV0dXJuX3N0cjsKICAgICBQeU9iamVjdCAqbmFtZXM7CkBAIC0xNTkyLDMyICsxNjY3LDIwIEBACiAgICAgfQogCiAgICAgbGVuID0gUHlMaXN0X0dFVF9TSVpFKG5hbWVzKTsKLSAgICBpZiAobGVuID4gNjU1MzQpIHsKLSAgICAgICAgLyogbGVuIG11c3QgZml0IGluIDE2IGJpdHMsIGFuZCBsZW4gaXMgaW5jcmVtZW50ZWQgYmVsb3cgKi8KLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5bnRheEVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IGFubm90YXRpb25zIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQogICAgIGlmIChsZW4pIHsKLSAgICAgICAgLyogY29udmVydCBuYW1lcyB0byBhIHR1cGxlIGFuZCBwbGFjZSBvbiBzdGFjayAqLwotICAgICAgICBQeU9iamVjdCAqZWx0OwotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIFB5T2JqZWN0ICpzID0gUHlUdXBsZV9OZXcobGVuKTsKLSAgICAgICAgaWYgKCFzKQotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBlbHQgPSBQeUxpc3RfR0VUX0lURU0obmFtZXMsIGkpOwotICAgICAgICAgICAgUHlfSU5DUkVGKGVsdCk7Ci0gICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHMsIGksIGVsdCk7CisgICAgICAgIFB5T2JqZWN0ICprZXl0dXBsZSA9IFB5TGlzdF9Bc1R1cGxlKG5hbWVzKTsKKyAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgaWYgKGtleXR1cGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgcywgY29uc3RzKTsKLSAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICBsZW4rKzsgLyogaW5jbHVkZSB0aGUganVzdC1wdXNoZWQgdHVwbGUgKi8KKyAgICAgICAgQURET1BfTihjLCBMT0FEX0NPTlNULCBrZXl0dXBsZSwgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBsZW4pOworICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgUHlfREVDUkVGKG5hbWVzKTsKLQotICAgIC8qIFdlIGp1c3QgY2hlY2tlZCB0aGF0IGxlbiA8PSA2NTUzNSwgc2VlIGFib3ZlICovCi0gICAgcmV0dXJuIFB5X1NBRkVfRE9XTkNBU1QobGVuICsgMSwgUHlfc3NpemVfdCwgaW50KTsKKyAgICBlbHNlIHsKKyAgICAgICAgUHlfREVDUkVGKG5hbWVzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogZXJyb3I6CiAgICAgUHlfREVDUkVGKG5hbWVzKTsKQEAgLTE2MjUsNiArMTY4OCwzNiBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl92aXNpdF9kZWZhdWx0cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzKQoreworICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7CisgICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBQeV9zc2l6ZV90Citjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFyZ3VtZW50c190eSBhcmdzKQoreworICAgIFB5X3NzaXplX3QgZnVuY2ZsYWdzID0gMDsKKyAgICBpZiAoYXJncy0+ZGVmYXVsdHMgJiYgYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKSA+IDApIHsKKyAgICAgICAgaWYgKCFjb21waWxlcl92aXNpdF9kZWZhdWx0cyhjLCBhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDE7CisgICAgfQorICAgIGlmIChhcmdzLT5rd29ubHlhcmdzKSB7CisgICAgICAgIGludCByZXMgPSBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhjLCBhcmdzLT5rd29ubHlhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+a3dfZGVmYXVsdHMpOworICAgICAgICBpZiAocmVzID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChyZXMgPiAwKSB7CisgICAgICAgICAgICBmdW5jZmxhZ3MgfD0gMHgwMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnVuY2ZsYWdzOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl9mdW5jdGlvbihzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcywgaW50IGlzX2FzeW5jKQogewogICAgIFB5Q29kZU9iamVjdCAqY287CkBAIC0xNjM1LDEyICsxNzI4LDExIEBACiAgICAgYXNkbF9zZXEqIGRlY29zOwogICAgIGFzZGxfc2VxICpib2R5OwogICAgIHN0bXRfdHkgc3Q7Ci0gICAgUHlfc3NpemVfdCBpLCBuLCBhcmdsZW5ndGg7Ci0gICAgaW50IGRvY3N0cmluZywga3dfZGVmYXVsdF9jb3VudCA9IDA7Ci0gICAgaW50IG51bV9hbm5vdGF0aW9uczsKKyAgICBQeV9zc2l6ZV90IGksIG4sIGZ1bmNmbGFnczsKKyAgICBpbnQgZG9jc3RyaW5nOworICAgIGludCBhbm5vdGF0aW9uczsKICAgICBpbnQgc2NvcGVfdHlwZTsKIAotCiAgICAgaWYgKGlzX2FzeW5jKSB7CiAgICAgICAgIGFzc2VydChzLT5raW5kID09IEFzeW5jRnVuY3Rpb25EZWZfa2luZCk7CiAKQEAgLTE2NjUsMzAgKzE3NTcsMzIgQEAKIAogICAgIGlmICghY29tcGlsZXJfZGVjb3JhdG9ycyhjLCBkZWNvcykpCiAgICAgICAgIHJldHVybiAwOwotICAgIGlmIChhcmdzLT5kZWZhdWx0cykKLSAgICAgICAgVklTSVRfU0VRKGMsIGV4cHIsIGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBpZiAoYXJncy0+a3dvbmx5YXJncykgewotICAgICAgICBpbnQgcmVzID0gY29tcGlsZXJfdmlzaXRfa3dvbmx5ZGVmYXVsdHMoYywgYXJncy0+a3dvbmx5YXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPmt3X2RlZmF1bHRzKTsKLSAgICAgICAgaWYgKHJlcyA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGt3X2RlZmF1bHRfY291bnQgPSByZXMgLSAxOwotICAgIH0KLSAgICBudW1fYW5ub3RhdGlvbnMgPSBjb21waWxlcl92aXNpdF9hbm5vdGF0aW9ucyhjLCBhcmdzLCByZXR1cm5zKTsKLSAgICBpZiAobnVtX2Fubm90YXRpb25zID09IDApCi0gICAgICAgIHJldHVybiAwOwotICAgIG51bV9hbm5vdGF0aW9ucy0tOwotICAgIGFzc2VydCgobnVtX2Fubm90YXRpb25zICYgMHhGRkZGKSA9PSBudW1fYW5ub3RhdGlvbnMpOwogCi0gICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVfdHlwZSwgKHZvaWQgKilzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZW5vKSkKKyAgICBmdW5jZmxhZ3MgPSBjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICBpZiAoZnVuY2ZsYWdzID09IC0xKSB7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFubm90YXRpb25zID0gY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoYywgYXJncywgcmV0dXJucyk7CisgICAgaWYgKGFubm90YXRpb25zID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKGFubm90YXRpb25zID4gMCkgeworICAgICAgICBmdW5jZmxhZ3MgfD0gMHgwNDsKKyAgICB9CisKKyAgICBpZiAoIWNvbXBpbGVyX2VudGVyX3Njb3BlKGMsIG5hbWUsIHNjb3BlX3R5cGUsICh2b2lkICopcywgcy0+bGluZW5vKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICBzdCA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChib2R5LCAwKTsKICAgICBkb2NzdHJpbmcgPSBjb21waWxlcl9pc2RvY3N0cmluZyhzdCk7Ci0gICAgaWYgKGRvY3N0cmluZyAmJiBjLT5jX29wdGltaXplIDwgMikKLSAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIGlmIChkb2NzdHJpbmcgJiYgYy0+Y19vcHRpbWl6ZSA8IDIpIHsKKyAgICAgICAgaWYgKHN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZCkKKyAgICAgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5Db25zdGFudC52YWx1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmlyc3RfY29uc3QgPSBzdC0+di5FeHByLnZhbHVlLT52LlN0ci5zOworICAgIH0KICAgICBpZiAoY29tcGlsZXJfYWRkX28oYywgYy0+dS0+dV9jb25zdHMsIGZpcnN0X2NvbnN0KSA8IDApICAgICAgewogICAgICAgICBjb21waWxlcl9leGl0X3Njb3BlKGMpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTE3MTIsMTIgKzE4MDYsOSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBhcmdsZW5ndGggPSBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpOwotICAgIGFyZ2xlbmd0aCB8PSBrd19kZWZhdWx0X2NvdW50IDw8IDg7Ci0gICAgYXJnbGVuZ3RoIHw9IG51bV9hbm5vdGF0aW9ucyA8PCAxNjsKICAgICBpZiAoaXNfYXN5bmMpCiAgICAgICAgIGNvLT5jb19mbGFncyB8PSBDT19DT1JPVVRJTkU7Ci0gICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhcmdsZW5ndGgsIHF1YWxuYW1lKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGZ1bmNmbGFncywgcXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihxdWFsbmFtZSk7CiAgICAgUHlfREVDUkVGKGNvKTsKIApAQCAtMTg3Nyw4ICsxOTY4LDcgQEAKICAgICBQeUNvZGVPYmplY3QgKmNvOwogICAgIFB5T2JqZWN0ICpxdWFsbmFtZTsKICAgICBzdGF0aWMgaWRlbnRpZmllciBuYW1lOwotICAgIGludCBrd19kZWZhdWx0X2NvdW50ID0gMDsKLSAgICBQeV9zc2l6ZV90IGFyZ2xlbmd0aDsKKyAgICBQeV9zc2l6ZV90IGZ1bmNmbGFnczsKICAgICBhcmd1bWVudHNfdHkgYXJncyA9IGUtPnYuTGFtYmRhLmFyZ3M7CiAgICAgYXNzZXJ0KGUtPmtpbmQgPT0gTGFtYmRhX2tpbmQpOwogCkBAIC0xODg4LDE0ICsxOTc4LDExIEBACiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZiAoYXJncy0+ZGVmYXVsdHMpCi0gICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0gICAgaWYgKGFyZ3MtPmt3b25seWFyZ3MpIHsKLSAgICAgICAgaW50IHJlcyA9IGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKGMsIGFyZ3MtPmt3b25seWFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5rd19kZWZhdWx0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gMCkgcmV0dXJuIDA7Ci0gICAgICAgIGt3X2RlZmF1bHRfY291bnQgPSByZXMgLSAxOworICAgIGZ1bmNmbGFncyA9IGNvbXBpbGVyX2RlZmF1bHRfYXJndW1lbnRzKGMsIGFyZ3MpOworICAgIGlmIChmdW5jZmxhZ3MgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCiAgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCBDT01QSUxFUl9TQ09QRV9MQU1CREEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWUsIGUtPmxpbmVubykpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTkyMSw5ICsyMDA4LDcgQEAKICAgICBpZiAoY28gPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBhcmdsZW5ndGggPSBhc2RsX3NlcV9MRU4oYXJncy0+ZGVmYXVsdHMpOwotICAgIGFyZ2xlbmd0aCB8PSBrd19kZWZhdWx0X2NvdW50IDw8IDg7Ci0gICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBhcmdsZW5ndGgsIHF1YWxuYW1lKTsKKyAgICBjb21waWxlcl9tYWtlX2Nsb3N1cmUoYywgY28sIGZ1bmNmbGFncywgcXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihxdWFsbmFtZSk7CiAgICAgUHlfREVDUkVGKGNvKTsKIApAQCAtMjU5OSw2ICsyNjg0LDI1IEBACiB9CiAKIHN0YXRpYyBpbnQKK2NvbXBpbGVyX3Zpc2l0X3N0bXRfZXhwcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgdmFsdWUpCit7CisgICAgaWYgKGMtPmNfaW50ZXJhY3RpdmUgJiYgYy0+Y19uZXN0bGV2ZWwgPD0gMSkgeworICAgICAgICBWSVNJVChjLCBleHByLCB2YWx1ZSk7CisgICAgICAgIEFERE9QKGMsIFBSSU5UX0VYUFIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoaXNfY29uc3QodmFsdWUpKSB7CisgICAgICAgIC8qIGlnbm9yZSBjb25zdGFudCBzdGF0ZW1lbnQgKi8KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgVklTSVQoYywgZXhwciwgdmFsdWUpOworICAgIEFERE9QKGMsIFBPUF9UT1ApOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl92aXNpdF9zdG10KHN0cnVjdCBjb21waWxlciAqYywgc3RtdF90eSBzKQogewogICAgIFB5X3NzaXplX3QgaSwgbjsKQEAgLTI2NjgsMTYgKzI3NzIsNyBAQAogICAgIGNhc2UgTm9ubG9jYWxfa2luZDoKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFeHByX2tpbmQ6Ci0gICAgICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIHMtPnYuRXhwci52YWx1ZSk7Ci0gICAgICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLT52LkV4cHIudmFsdWUtPmtpbmQgIT0gU3RyX2tpbmQgJiYKLSAgICAgICAgICAgICAgICAgcy0+di5FeHByLnZhbHVlLT5raW5kICE9IE51bV9raW5kKSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotICAgICAgICAgICAgQURET1AoYywgUE9QX1RPUCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiBjb21waWxlcl92aXNpdF9zdG10X2V4cHIoYywgcy0+di5FeHByLnZhbHVlKTsKICAgICBjYXNlIFBhc3Nfa2luZDoKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCcmVha19raW5kOgpAQCAtMzA3OSw5ICszMTc0LDUzIEBACiB9CiAKIHN0YXRpYyBpbnQKK2FyZV9hbGxfaXRlbXNfY29uc3QoYXNkbF9zZXEgKnNlcSwgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpOworICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgZXhwcl90eSBrZXkgPSAoZXhwcl90eSlhc2RsX3NlcV9HRVQoc2VxLCBpKTsKKyAgICAgICAgaWYgKGtleSA9PSBOVUxMIHx8ICFpc19jb25zdChrZXkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citjb21waWxlcl9zdWJkaWN0KHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlLCBQeV9zc2l6ZV90IGJlZ2luLCBQeV9zc2l6ZV90IGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IGksIG4gPSBlbmQgLSBiZWdpbjsKKyAgICBQeU9iamVjdCAqa2V5cywgKmtleTsKKyAgICBpZiAobiA+IDEgJiYgYXJlX2FsbF9pdGVtc19jb25zdChlLT52LkRpY3Qua2V5cywgYmVnaW4sIGVuZCkpIHsKKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBrZXlzID0gUHlUdXBsZV9OZXcobik7CisgICAgICAgIGlmIChrZXlzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGtleSA9IGdldF9jb25zdF92YWx1ZSgoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LmtleXMsIGkpKTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShrZXlzLCBpIC0gYmVnaW4sIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfTihjLCBMT0FEX0NPTlNULCBrZXlzLCBjb25zdHMpOworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX0NPTlNUX0tFWV9NQVAsIG4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LnZhbHVlcywgaSkpOworICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKIGNvbXBpbGVyX2RpY3Qoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCiB7Ci0gICAgUHlfc3NpemVfdCBpLCBuLCBjb250YWluZXJzLCBlbGVtZW50czsKKyAgICBQeV9zc2l6ZV90IGksIG4sIGVsZW1lbnRzOworICAgIGludCBjb250YWluZXJzOwogICAgIGludCBpc191bnBhY2tpbmcgPSAwOwogICAgIG4gPSBhc2RsX3NlcV9MRU4oZS0+di5EaWN0LnZhbHVlcyk7CiAgICAgY29udGFpbmVycyA9IDA7CkBAIC0zMDg5LDcgKzMyMjgsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICAgaXNfdW5wYWNraW5nID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSA9PSBOVUxMOwogICAgICAgICBpZiAoZWxlbWVudHMgPT0gMHhGRkZGIHx8IChlbGVtZW50cyAmJiBpc191bnBhY2tpbmcpKSB7Ci0gICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgZWxlbWVudHMpOworICAgICAgICAgICAgaWYgKCFjb21waWxlcl9zdWJkaWN0KGMsIGUsIGkgLSBlbGVtZW50cywgaSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBjb250YWluZXJzKys7CiAgICAgICAgICAgICBlbGVtZW50cyA9IDA7CiAgICAgICAgIH0KQEAgLTMwOTgsMTMgKzMyMzgsMTIgQEAKICAgICAgICAgICAgIGNvbnRhaW5lcnMrKzsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOwotICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKICAgICAgICAgICAgIGVsZW1lbnRzKys7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGVsZW1lbnRzIHx8IGNvbnRhaW5lcnMgPT0gMCkgewotICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgZWxlbWVudHMpOworICAgICAgICBpZiAoIWNvbXBpbGVyX3N1YmRpY3QoYywgZSwgbiAtIGVsZW1lbnRzLCBuKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBjb250YWluZXJzKys7CiAgICAgfQogICAgIC8qIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGljdCwgdGhleSBuZWVkIHRvIGJlIG1lcmdlZCBpbnRvIGEgbmV3CkBAIC0zMTczLDE1ICszMzEyLDEyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLT52LkNhbGwua2V5d29yZHMpOwogfQogCitzdGF0aWMgaW50Citjb21waWxlcl9qb2luZWRfc3RyKHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQoreworICAgIC8qIENvbmNhdGVuYXRlIHBhcnRzIG9mIGEgc3RyaW5nIHVzaW5nICcnLmpvaW4ocGFydHMpLiBUaGVyZSBhcmUKKyAgICAgICBwcm9iYWJseSBiZXR0ZXIgd2F5cyBvZiBkb2luZyB0aGlzLgorCisgICAgICAgVGhpcyBpcyB1c2VkIGZvciBjb25zdHJ1Y3RzIGxpa2UgIid4PScgZid7NDJ9JyIsIHdoaWNoIGhhdmUgdG8KKyAgICAgICBiZSBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lLiAqLworCisgICAgc3RhdGljIFB5T2JqZWN0ICplbXB0eV9zdHJpbmc7CisgICAgc3RhdGljIFB5T2JqZWN0ICpqb2luX3N0cmluZzsKKworICAgIGlmICghZW1wdHlfc3RyaW5nKSB7CisgICAgICAgIGVtcHR5X3N0cmluZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCIiKTsKKyAgICAgICAgaWYgKCFlbXB0eV9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFqb2luX3N0cmluZykgeworICAgICAgICBqb2luX3N0cmluZyA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKCJqb2luIik7CisgICAgICAgIGlmICgham9pbl9zdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGVtcHR5X3N0cmluZywgY29uc3RzKTsKKyAgICBBRERPUF9OQU1FKGMsIExPQURfQVRUUiwgam9pbl9zdHJpbmcsIG5hbWVzKTsKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICBBRERPUF9JKGMsIEJVSUxEX0xJU1QsIGFzZGxfc2VxX0xFTihlLT52LkpvaW5lZFN0ci52YWx1ZXMpKTsKKyAgICBBRERPUF9JKGMsIENBTExfRlVOQ1RJT04sIDEpOworICAgIHJldHVybiAxOworfQorCisvKiBVc2VkIHRvIGltcGxlbWVudCBmLXN0cmluZ3MuIEZvcm1hdCBhIHNpbmdsZSB2YWx1ZS4gKi8KK3N0YXRpYyBpbnQKK2NvbXBpbGVyX2Zvcm1hdHRlZF92YWx1ZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICAvKiBPdXIgb3BhcmcgZW5jb2RlcyAyIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjogdGhlIGNvbnZlcnNpb24KKyAgICAgICBjaGFyYWN0ZXIsIGFuZCB3aGV0aGVyIG9yIG5vdCBhIGZvcm1hdF9zcGVjIHdhcyBwcm92aWRlZC4KKworICAgICAgIENvbnZlcnQgdGhlIGNvbnZlcnNpb24gY2hhciB0byAyIGJpdHM6CisgICAgICAgTm9uZTogMDAwICAweDAgIEZWQ19OT05FCisgICAgICAgIXMgIDogMDAxICAweDEgIEZWQ19TVFIKKyAgICAgICAhciAgOiAwMTAgIDB4MiAgRlZDX1JFUFIKKyAgICAgICAhYSAgOiAwMTEgIDB4MyAgRlZDX0FTQ0lJCisKKyAgICAgICBuZXh0IGJpdCBpcyB3aGV0aGVyIG9yIG5vdCB3ZSBoYXZlIGEgZm9ybWF0IHNwZWM6CisgICAgICAgeWVzIDogMTAwICAweDQKKyAgICAgICBubyAgOiAwMDAgIDB4MAorICAgICovCisKKyAgICBpbnQgb3Bhcmc7CisKKyAgICAvKiBFdmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBiZSBmb3JtYXR0ZWQuICovCisgICAgVklTSVQoYywgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisKKyAgICBzd2l0Y2ggKGUtPnYuRm9ybWF0dGVkVmFsdWUuY29udmVyc2lvbikgeworICAgIGNhc2UgJ3MnOiBvcGFyZyA9IEZWQ19TVFI7ICAgYnJlYWs7CisgICAgY2FzZSAncic6IG9wYXJnID0gRlZDX1JFUFI7ICBicmVhazsKKyAgICBjYXNlICdhJzogb3BhcmcgPSBGVkNfQVNDSUk7IGJyZWFrOworICAgIGNhc2UgLTE6ICBvcGFyZyA9IEZWQ19OT05FOyAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBjb252ZXJzaW9uIGNoYXJhY3RlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpIHsKKyAgICAgICAgLyogRXZhbHVhdGUgdGhlIGZvcm1hdCBzcGVjLCBhbmQgdXBkYXRlIG91ciBvcGNvZGUgYXJnLiAqLworICAgICAgICBWSVNJVChjLCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKTsKKyAgICAgICAgb3BhcmcgfD0gRlZTX0hBVkVfU1BFQzsKKyAgICB9CisKKyAgICAvKiBBbmQgcHVzaCBvdXIgb3Bjb2RlIGFuZCBvcGFyZyAqLworICAgIEFERE9QX0koYywgRk9STUFUX1ZBTFVFLCBvcGFyZyk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBpbGVyX3N1Ymt3YXJncyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICprZXl3b3JkcywgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpLCBuID0gZW5kIC0gYmVnaW47CisgICAga2V5d29yZF90eSBrdzsKKyAgICBQeU9iamVjdCAqa2V5cywgKmtleTsKKyAgICBhc3NlcnQobiA+IDApOworICAgIGlmIChuID4gMSkgeworICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrdyA9IGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIGtleXMgPSBQeVR1cGxlX05ldyhuKTsKKyAgICAgICAgaWYgKGtleXMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAga2V5ID0gKChrZXl3b3JkX3R5KSBhc2RsX3NlcV9HRVQoa2V5d29yZHMsIGkpKS0+YXJnOworICAgICAgICAgICAgUHlfSU5DUkVGKGtleSk7CisgICAgICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGtleXMsIGkgLSBiZWdpbiwga2V5KTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9OKGMsIExPQURfQ09OU1QsIGtleXMsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBhIGZvciBsb29wIG9ubHkgZXhlY3V0ZXMgb25jZSAqLworICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrdyA9IGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaSk7CisgICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGt3LT5hcmcsIGNvbnN0cyk7CisgICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKIC8qIHNoYXJlZCBjb2RlIGJldHdlZW4gY29tcGlsZXJfY2FsbCBhbmQgY29tcGlsZXJfY2xhc3MgKi8KIHN0YXRpYyBpbnQKIGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywKLSAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbiwgLyogQXJncyBhbHJlYWR5IHB1c2hlZCAqLworICAgICAgICAgICAgICAgICAgICAgaW50IG4sIC8qIEFyZ3MgYWxyZWFkeSBwdXNoZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICphcmdzLAogICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmtleXdvcmRzKQogewogICAgIGludCBjb2RlID0gMDsKLSAgICBQeV9zc2l6ZV90IG5lbHRzLCBpLCBuc2Vlbiwgbmt3OworICAgIFB5X3NzaXplX3QgbmVsdHMsIGksIG5zZWVuOworICAgIGludCBua3c7CiAKICAgICAvKiB0aGUgbnVtYmVyIG9mIHR1cGxlcyBhbmQgZGljdGlvbmFyaWVzIG9uIHRoZSBzdGFjayAqLwogICAgIFB5X3NzaXplX3QgbnN1YmFyZ3MgPSAwLCBuc3Via3dhcmdzID0gMDsKQEAgLTMyMzgsMjkgKzM0ODksMzggQEAKICAgICAgICAgaWYgKGt3LT5hcmcgPT0gTlVMTCkgewogICAgICAgICAgICAgLyogQSBrZXl3b3JkIGFyZ3VtZW50IHVucGFja2luZy4gKi8KICAgICAgICAgICAgIGlmIChuc2VlbikgewotICAgICAgICAgICAgICAgIEFERE9QX0koYywgQlVJTERfTUFQLCBuc2Vlbik7CisgICAgICAgICAgICAgICAgaWYgKG5zdWJrd2FyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21waWxlcl9zdWJrd2FyZ3MoYywga2V5d29yZHMsIGkgLSBuc2VlbiwgaSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgbnN1Ymt3YXJncysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBqOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnNlZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgVklTSVQoYywga2V5d29yZCwgYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBqKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmt3ID0gbnNlZW47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5zZWVuID0gMDsKLSAgICAgICAgICAgICAgICBuc3Via3dhcmdzKys7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOwogICAgICAgICAgICAgbnN1Ymt3YXJncysrOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKG5zdWJrd2FyZ3MpIHsKLSAgICAgICAgICAgIC8qIEEga2V5d29yZCBhcmd1bWVudCBhbmQgd2UgYWxyZWFkeSBoYXZlIGEgZGljdC4gKi8KLSAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwga3ctPmFyZywgY29uc3RzKTsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIGt3LT52YWx1ZSk7Ci0gICAgICAgICAgICBuc2VlbisrOwotICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyoga2V5d29yZCBhcmd1bWVudCAqLwotICAgICAgICAgICAgVklTSVQoYywga2V5d29yZCwga3cpCi0gICAgICAgICAgICBua3crKzsKKyAgICAgICAgICAgIG5zZWVuKys7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG5zZWVuKSB7Ci0gICAgICAgIC8qIFBhY2sgdXAgYW55IHRyYWlsaW5nIGtleXdvcmQgYXJndW1lbnRzLiAqLwotICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgbnNlZW4pOwotICAgICAgICBuc3Via3dhcmdzKys7CisgICAgICAgIGlmIChuc3Via3dhcmdzKSB7CisgICAgICAgICAgICAvKiBQYWNrIHVwIGFueSB0cmFpbGluZyBrZXl3b3JkIGFyZ3VtZW50cy4gKi8KKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfc3Via3dhcmdzKGMsIGtleXdvcmRzLCBuZWx0cyAtIG5zZWVuLCBuZWx0cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBuc3Via3dhcmdzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWSVNJVF9TRVEoYywga2V5d29yZCwga2V5d29yZHMpOworICAgICAgICAgICAgbmt3ID0gbnNlZW47CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKG5zdWJrd2FyZ3MpIHsKICAgICAgICAgY29kZSB8PSAyOwpAQCAtMzU0OSw2ICszODA5LDggQEAKICAgICBzd2l0Y2ggKGUtPmtpbmQpIHsKICAgICBjYXNlIEVsbGlwc2lzX2tpbmQ6CiAgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52LkNvbnN0YW50LnZhbHVlKTsKICAgICBjYXNlIE51bV9raW5kOgogICAgICAgICByZXR1cm4gUHlPYmplY3RfSXNUcnVlKGUtPnYuTnVtLm4pOwogICAgIGNhc2UgU3RyX2tpbmQ6CkBAIC0zNTkyLDkgKzM4NTQsOSBAQAogICAgICAgIEJMT0NLCiAgICBmaW5hbGx5OgogICAgICAgIGlmIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkOgotICAgICAgIGV4YyA9IGNvcHkgb2YgKGV4Y2VwdGlvbiwgaW5zdGFuY2UsIHRyYWNlYmFjaykKKyAgICAgICAgICAgZXhjID0gY29weSBvZiAoZXhjZXB0aW9uLCBpbnN0YW5jZSwgdHJhY2ViYWNrKQogICAgICAgIGVsc2U6Ci0gICAgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgICAgIGV4YyA9IChOb25lLCBOb25lLCBOb25lKQogICAgICAgIGlmIG5vdCAoYXdhaXQgZXhpdCgqZXhjKSk6CiAgICAgICAgICAgIHJhaXNlCiAgKi8KQEAgLTM4MzYsMTIgKzQwOTgsMTkgQEAKICAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2NvbXBhcmUoYywgZSk7CiAgICAgY2FzZSBDYWxsX2tpbmQ6CiAgICAgICAgIHJldHVybiBjb21waWxlcl9jYWxsKGMsIGUpOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LkNvbnN0YW50LnZhbHVlLCBjb25zdHMpOworICAgICAgICBicmVhazsKICAgICBjYXNlIE51bV9raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuTnVtLm4sIGNvbnN0cyk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU3RyX2tpbmQ6CiAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5TdHIucywgY29uc3RzKTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2pvaW5lZF9zdHIoYywgZSk7CisgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgorICAgICAgICByZXR1cm4gY29tcGlsZXJfZm9ybWF0dGVkX3ZhbHVlKGMsIGUpOwogICAgIGNhc2UgQnl0ZXNfa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52LkJ5dGVzLnMsIGNvbnN0cyk7CiAgICAgICAgIGJyZWFrOwpAQCAtNDI5NSwxOCArNDU2NCw2IEBACiAgICAgICAgIFB5T2JqZWN0X0ZyZWUoYS0+YV9wb3N0b3JkZXIpOwogfQogCi0vKiBSZXR1cm4gdGhlIHNpemUgb2YgYSBiYXNpYyBibG9jayBpbiBieXRlcy4gKi8KLQotc3RhdGljIGludAotaW5zdHJzaXplKHN0cnVjdCBpbnN0ciAqaW5zdHIpCi17Ci0gICAgaWYgKCFpbnN0ci0+aV9oYXNhcmcpCi0gICAgICAgIHJldHVybiAxOyAgICAgICAgICAgICAgIC8qIDEgYnl0ZSBmb3IgdGhlIG9wY29kZSovCi0gICAgaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQotICAgICAgICByZXR1cm4gNjsgICAgICAgICAgICAgICAvKiAxIChvcGNvZGUpICsgMSAoRVhURU5ERURfQVJHIG9wY29kZSkgKyAyIChvcGFyZykgKyAyKG9wYXJnIGV4dGVuZGVkKSAqLwotICAgIHJldHVybiAzOyAgICAgICAgICAgICAgICAgICAvKiAxIChvcGNvZGUpICsgMiAob3BhcmcpICovCi19Ci0KIHN0YXRpYyBpbnQKIGJsb2Nrc2l6ZShiYXNpY2Jsb2NrICpiKQogewpAQCAtNDMxNCw3ICs0NTcxLDcgQEAKICAgICBpbnQgc2l6ZSA9IDA7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKQotICAgICAgICBzaXplICs9IGluc3Ryc2l6ZSgmYi0+Yl9pbnN0cltpXSk7CisgICAgICAgIHNpemUgKz0gaW5zdHJzaXplKGItPmJfaW5zdHJbaV0uaV9vcGFyZyk7CiAgICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTQzMzMsNyArNDU5MCw2IEBACiAgICAgZF9saW5lbm8gPSBpLT5pX2xpbmVubyAtIGEtPmFfbGluZW5vOwogCiAgICAgYXNzZXJ0KGRfYnl0ZWNvZGUgPj0gMCk7Ci0gICAgYXNzZXJ0KGRfbGluZW5vID49IDApOwogCiAgICAgaWYoZF9ieXRlY29kZSA9PSAwICYmIGRfbGluZW5vID09IDApCiAgICAgICAgIHJldHVybiAxOwpAQCAtNDM2Myw5ICs0NjE5LDIxIEBACiAgICAgICAgIGRfYnl0ZWNvZGUgLT0gbmNvZGVzICogMjU1OwogICAgICAgICBhLT5hX2xub3RhYl9vZmYgKz0gbmNvZGVzICogMjsKICAgICB9Ci0gICAgYXNzZXJ0KGRfYnl0ZWNvZGUgPD0gMjU1KTsKLSAgICBpZiAoZF9saW5lbm8gPiAyNTUpIHsKLSAgICAgICAgaW50IGosIG5ieXRlcywgbmNvZGVzID0gZF9saW5lbm8gLyAyNTU7CisgICAgYXNzZXJ0KDAgPD0gZF9ieXRlY29kZSAmJiBkX2J5dGVjb2RlIDw9IDI1NSk7CisKKyAgICBpZiAoZF9saW5lbm8gPCAtMTI4IHx8IDEyNyA8IGRfbGluZW5vKSB7CisgICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcywgazsKKyAgICAgICAgaWYgKGRfbGluZW5vIDwgMCkgeworICAgICAgICAgICAgayA9IC0xMjg7CisgICAgICAgICAgICAvKiB1c2UgZGl2aXNpb24gb24gcG9zaXRpdmUgbnVtYmVycyAqLworICAgICAgICAgICAgbmNvZGVzID0gKC1kX2xpbmVubykgLyAxMjg7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBrID0gMTI3OworICAgICAgICAgICAgbmNvZGVzID0gZF9saW5lbm8gLyAxMjc7CisgICAgICAgIH0KKyAgICAgICAgZF9saW5lbm8gLT0gbmNvZGVzICogazsKKyAgICAgICAgYXNzZXJ0KG5jb2RlcyA+PSAxKTsKICAgICAgICAgbmJ5dGVzID0gYS0+YV9sbm90YWJfb2ZmICsgMiAqIG5jb2RlczsKICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShhLT5hX2xub3RhYik7CiAgICAgICAgIGlmIChuYnl0ZXMgPj0gbGVuKSB7CkBAIC00MzgzLDE1ICs0NjUxLDE1IEBACiAgICAgICAgIGxub3RhYiA9ICh1bnNpZ25lZCBjaGFyICopCiAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcoYS0+YV9sbm90YWIpICsgYS0+YV9sbm90YWJfb2ZmOwogICAgICAgICAqbG5vdGFiKysgPSBkX2J5dGVjb2RlOwotICAgICAgICAqbG5vdGFiKysgPSAyNTU7CisgICAgICAgICpsbm90YWIrKyA9IGs7CiAgICAgICAgIGRfYnl0ZWNvZGUgPSAwOwogICAgICAgICBmb3IgKGogPSAxOyBqIDwgbmNvZGVzOyBqKyspIHsKICAgICAgICAgICAgICpsbm90YWIrKyA9IDA7Ci0gICAgICAgICAgICAqbG5vdGFiKysgPSAyNTU7CisgICAgICAgICAgICAqbG5vdGFiKysgPSBrOwogICAgICAgICB9Ci0gICAgICAgIGRfbGluZW5vIC09IG5jb2RlcyAqIDI1NTsKICAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CiAgICAgfQorICAgIGFzc2VydCgtMTI4IDw9IGRfbGluZW5vICYmIGRfbGluZW5vIDw9IDEyNyk7CiAKICAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKGEtPmFfbG5vdGFiKTsKICAgICBpZiAoYS0+YV9sbm90YWJfb2ZmICsgMiA+PSBsZW4pIHsKQEAgLTQ0MjMsMTUgKzQ2OTEsMTIgQEAKIHN0YXRpYyBpbnQKIGFzc2VtYmxlX2VtaXQoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGluc3RyICppKQogewotICAgIGludCBzaXplLCBhcmcgPSAwLCBleHQgPSAwOworICAgIGludCBzaXplLCBhcmcgPSAwOwogICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19HRVRfU0laRShhLT5hX2J5dGVjb2RlKTsKICAgICBjaGFyICpjb2RlOwogCi0gICAgc2l6ZSA9IGluc3Ryc2l6ZShpKTsKLSAgICBpZiAoaS0+aV9oYXNhcmcpIHsKLSAgICAgICAgYXJnID0gaS0+aV9vcGFyZzsKLSAgICAgICAgZXh0ID0gYXJnID4+IDE2OwotICAgIH0KKyAgICBhcmcgPSBpLT5pX29wYXJnOworICAgIHNpemUgPSBpbnN0cnNpemUoYXJnKTsKICAgICBpZiAoaS0+aV9saW5lbm8gJiYgIWFzc2VtYmxlX2xub3RhYihhLCBpKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgaWYgKGEtPmFfb2Zmc2V0ICsgc2l6ZSA+PSBsZW4pIHsKQEAgLTQ0NDIsMTkgKzQ3MDcsNyBAQAogICAgIH0KICAgICBjb2RlID0gUHlCeXRlc19BU19TVFJJTkcoYS0+YV9ieXRlY29kZSkgKyBhLT5hX29mZnNldDsKICAgICBhLT5hX29mZnNldCArPSBzaXplOwotICAgIGlmIChzaXplID09IDYpIHsKLSAgICAgICAgYXNzZXJ0KGktPmlfaGFzYXJnKTsKLSAgICAgICAgKmNvZGUrKyA9IChjaGFyKUVYVEVOREVEX0FSRzsKLSAgICAgICAgKmNvZGUrKyA9IGV4dCAmIDB4ZmY7Ci0gICAgICAgICpjb2RlKysgPSBleHQgPj4gODsKLSAgICAgICAgYXJnICY9IDB4ZmZmZjsKLSAgICB9Ci0gICAgKmNvZGUrKyA9IGktPmlfb3Bjb2RlOwotICAgIGlmIChpLT5pX2hhc2FyZykgewotICAgICAgICBhc3NlcnQoc2l6ZSA9PSAzIHx8IHNpemUgPT0gNik7Ci0gICAgICAgICpjb2RlKysgPSBhcmcgJiAweGZmOwotICAgICAgICAqY29kZSsrID0gYXJnID4+IDg7Ci0gICAgfQorICAgIHdyaXRlX29wX2FyZygodW5zaWduZWQgY2hhciopY29kZSwgaS0+aV9vcGNvZGUsIGFyZywgc2l6ZSk7CiAgICAgcmV0dXJuIDE7CiB9CiAKQEAgLTQ0NjIsNyArNDcxNSw3IEBACiBhc3NlbWJsZV9qdW1wX29mZnNldHMoc3RydWN0IGFzc2VtYmxlciAqYSwgc3RydWN0IGNvbXBpbGVyICpjKQogewogICAgIGJhc2ljYmxvY2sgKmI7Ci0gICAgaW50IGJzaXplLCB0b3RzaXplLCBleHRlbmRlZF9hcmdfY291bnQgPSAwLCBsYXN0X2V4dGVuZGVkX2FyZ19jb3VudDsKKyAgICBpbnQgYnNpemUsIHRvdHNpemUsIGV4dGVuZGVkX2FyZ19yZWNvbXBpbGU7CiAgICAgaW50IGk7CiAKICAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIGVhY2ggYmxvY2sgYW5kIGZpeHVwIGp1bXAgYXJncy4KQEAgLTQ0NzUsMjcgKzQ3MjgsMjYgQEAKICAgICAgICAgICAgIGItPmJfb2Zmc2V0ID0gdG90c2l6ZTsKICAgICAgICAgICAgIHRvdHNpemUgKz0gYnNpemU7CiAgICAgICAgIH0KLSAgICAgICAgbGFzdF9leHRlbmRlZF9hcmdfY291bnQgPSBleHRlbmRlZF9hcmdfY291bnQ7Ci0gICAgICAgIGV4dGVuZGVkX2FyZ19jb3VudCA9IDA7CisgICAgICAgIGV4dGVuZGVkX2FyZ19yZWNvbXBpbGUgPSAwOwogICAgICAgICBmb3IgKGIgPSBjLT51LT51X2Jsb2NrczsgYiAhPSBOVUxMOyBiID0gYi0+Yl9saXN0KSB7CiAgICAgICAgICAgICBic2l6ZSA9IGItPmJfb2Zmc2V0OwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykgewogICAgICAgICAgICAgICAgIHN0cnVjdCBpbnN0ciAqaW5zdHIgPSAmYi0+Yl9pbnN0cltpXTsKKyAgICAgICAgICAgICAgICBpbnQgaXNpemUgPSBpbnN0cnNpemUoaW5zdHItPmlfb3BhcmcpOwogICAgICAgICAgICAgICAgIC8qIFJlbGF0aXZlIGp1bXBzIGFyZSBjb21wdXRlZCByZWxhdGl2ZSB0bwogICAgICAgICAgICAgICAgICAgIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIGFmdGVyIGZldGNoaW5nCiAgICAgICAgICAgICAgICAgICAgdGhlIGp1bXAgaW5zdHJ1Y3Rpb24uCiAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBic2l6ZSArPSBpbnN0cnNpemUoaW5zdHIpOwotICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9qYWJzKQorICAgICAgICAgICAgICAgIGJzaXplICs9IGlzaXplOworICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9qYWJzIHx8IGluc3RyLT5pX2pyZWwpIHsKICAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgPSBpbnN0ci0+aV90YXJnZXQtPmJfb2Zmc2V0OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluc3RyLT5pX2pyZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldCAtIGJzaXplOwotICAgICAgICAgICAgICAgICAgICBpbnN0ci0+aV9vcGFyZyA9IGRlbHRhOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfanJlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgLT0gYnNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3Ryc2l6ZShpbnN0ci0+aV9vcGFyZykgIT0gaXNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZ19yZWNvbXBpbGUgPSAxOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RyLT5pX29wYXJnID4gMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmdfY291bnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00NTA1LDcgKzQ3NTcsNyBAQAogCiAgICAgICAgIFRoZSBpc3N1ZSBpcyB0aGF0IGluIHRoZSBmaXJzdCBsb29wIGJsb2Nrc2l6ZSgpIGlzIGNhbGxlZAogICAgICAgICB3aGljaCBjYWxscyBpbnN0cnNpemUoKSB3aGljaCByZXF1aXJlcyBpX29wYXJnIGJlIHNldAotICAgICAgICBhcHByb3ByaWF0ZWx5LiAgICAgICAgICBUaGVyZSBpcyBhIGJvb3RzdHJhcCBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgYXBwcm9wcmlhdGVseS4gVGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbSBiZWNhdXNlCiAgICAgICAgIGlfb3BhcmcgaXMgY2FsY3VsYXRlZCBpbiB0aGUgc2Vjb25kIGxvb3AgYWJvdmUuCiAKICAgICAgICAgU28gd2UgbG9vcCB1bnRpbCB3ZSBzdG9wIHNlZWluZyBuZXcgRVhURU5ERURfQVJHcy4KQEAgLTQ1MTMsNyArNDc2NSw3IEBACiAgICAgICAgIG9uZXMgaW4ganVtcCBpbnN0cnVjdGlvbnMuICBTbyB0aGlzIHNob3VsZCBjb252ZXJnZQogICAgICAgICBmYWlybHkgcXVpY2tseS4KICAgICAqLwotICAgIH0gd2hpbGUgKGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ICE9IGV4dGVuZGVkX2FyZ19jb3VudCk7CisgICAgfSB3aGlsZSAoZXh0ZW5kZWRfYXJnX3JlY29tcGlsZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NjU5LDkgKzQ5MTEsOSBAQAogICAgIGNoYXIgYXJnWzEyOF07CiAKICAgICAqYXJnID0gJ1wwJzsKLSAgICBpZiAoaS0+aV9oYXNhcmcpCisgICAgaWYgKEhBU19BUkcoaS0+aV9vcGNvZGUpKSB7CiAgICAgICAgIHNwcmludGYoYXJnLCAiYXJnOiAlZCAiLCBpLT5pX29wYXJnKTsKLQorICAgIH0KICAgICBmcHJpbnRmKHN0ZGVyciwgImxpbmU6ICVkLCBvcGNvZGU6ICVkICVzJXMlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgaS0+aV9saW5lbm8sIGktPmlfb3Bjb2RlLCBhcmcsIGphYnMsIGpyZWwpOwogfQpAQCAtNDc0OSw0ICs1MDAxLDMgQEAKIHsKICAgICByZXR1cm4gUHlBU1RfQ29tcGlsZUV4KG1vZCwgZmlsZW5hbWUsIGZsYWdzLCAtMSwgYXJlbmEpOwogfQotCmRpZmYgLS1naXQgYS9QeXRob24vZHRvYS5jIGIvUHl0aG9uL2R0b2EuYwppbmRleCAzZGE1NDZlLi5lMDY2NWI2IDEwMDY0NAotLS0gYS9QeXRob24vZHRvYS5jCisrKyBiL1B5dGhvbi9kdG9hLmMKQEAgLTc0Nyw3ICs3NDcsNyBAQAogewogICAgIEJpZ2ludCAqYjEsICpwNSwgKnA1MTsKICAgICBpbnQgaTsKLSAgICBzdGF0aWMgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CiAKICAgICBpZiAoKGkgPSBrICYgMykpIHsKICAgICAgICAgYiA9IG11bHRhZGQoYiwgcDA1W2ktMV0sIDApOwpAQCAtODAzLDcgKzgwMyw3IEBACiB7CiAgICAgQmlnaW50ICpiMSwgKnA1LCAqcDUxOwogICAgIGludCBpOwotICAgIHN0YXRpYyBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CisgICAgc3RhdGljIGNvbnN0IGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKIAogICAgIGlmICgoaSA9IGsgJiAzKSkgewogICAgICAgICBiID0gbXVsdGFkZChiLCBwMDVbaS0xXSwgMCk7CkBAIC0yMzE1LDcgKzIzMTUsNyBAQAogfQogCiBzdGF0aWMgY2hhciAqCi1ucnZfYWxsb2MoY2hhciAqcywgY2hhciAqKnJ2ZSwgaW50IG4pCitucnZfYWxsb2MoY29uc3QgY2hhciAqcywgY2hhciAqKnJ2ZSwgaW50IG4pCiB7CiAgICAgY2hhciAqcnYsICp0OwogCmRpZmYgLS1naXQgYS9QeXRob24vZHlubG9hZF93aW4uYyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCmluZGV4IGYyYzc5NmUuLjA1MDUwY2YgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9keW5sb2FkX3dpbi5jCisrKyBiL1B5dGhvbi9keW5sb2FkX3dpbi5jCkBAIC0yNCwxMiArMjQsMTAgQEAKICNkZWZpbmUgUFlEX0RFQlVHX1NVRkZJWCAiIgogI2VuZGlmCiAKLSNkZWZpbmUgU1RSSU5HSVpFMih4KSAjeAotI2RlZmluZSBTVFJJTkdJWkUoeCkgU1RSSU5HSVpFMih4KQogI2lmZGVmIFBZRF9QTEFURk9STV9UQUcKLSNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBTVFJJTkdJWkUoUFlfTUFKT1JfVkVSU0lPTikgU1RSSU5HSVpFKFBZX01JTk9SX1ZFUlNJT04pICItIiBQWURfUExBVEZPUk1fVEFHICIucHlkIgorI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFB5X1NUUklOR0lGWShQWV9NQUpPUl9WRVJTSU9OKSBQeV9TVFJJTkdJRlkoUFlfTUlOT1JfVkVSU0lPTikgIi0iIFBZRF9QTEFURk9STV9UQUcgIi5weWQiCiAjZWxzZQotI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFNUUklOR0laRShQWV9NQUpPUl9WRVJTSU9OKSBTVFJJTkdJWkUoUFlfTUlOT1JfVkVSU0lPTikgIi5weWQiCisjZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKSAiLnB5ZCIKICNlbmRpZgogCiAjZGVmaW5lIFBZRF9VTlRBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLnB5ZCIKQEAgLTQzLDcgKzQxLDcgQEAKIC8qIENhc2UgaW5zZW5zaXRpdmUgc3RyaW5nIGNvbXBhcmUsIHRvIGF2b2lkIGFueSBkZXBlbmRlbmNpZXMgb24gcGFydGljdWxhcgogICAgQyBSVEwgaW1wbGVtZW50YXRpb25zICovCiAKLXN0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY2hhciAqc3RyaW5nMSwgY2hhciAqc3RyaW5nMikKK3N0YXRpYyBpbnQgc3RyY2FzZWNtcCAoY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMikKIHsKICAgICBpbnQgZmlyc3QsIHNlY29uZDsKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2ZpbGV1dGlscy5jIGIvUHl0aG9uL2ZpbGV1dGlscy5jCmluZGV4IDIzZWVkNzEuLjA2NTMxZDkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9maWxldXRpbHMuYworKysgYi9QeXRob24vZmlsZXV0aWxzLmMKQEAgLTY4Myw2ICs2ODMsMTAgQEAKIHsKICAgICBpbnQgcmVzOwogCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIHJlcyA9IF9QeV9mc3RhdF9ub3JhaXNlKGZkLCBzdGF0dXMpOwogICAgIFB5X0VORF9BTExPV19USFJFQURTCkBAIC03OTQsNyArNzk4LDcgQEAKICAgICBpbnQgcmVxdWVzdDsKICAgICBpbnQgZXJyOwogI2VuZGlmCi0gICAgaW50IGZsYWdzOworICAgIGludCBmbGFncywgbmV3X2ZsYWdzOwogICAgIGludCByZXM7CiAjZW5kaWYKIApAQCAtODg1LDEwICs4ODksMTggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChpbmhlcml0YWJsZSkKLSAgICAgICAgZmxhZ3MgJj0gfkZEX0NMT0VYRUM7Ci0gICAgZWxzZQotICAgICAgICBmbGFncyB8PSBGRF9DTE9FWEVDOworICAgIGlmIChpbmhlcml0YWJsZSkgeworICAgICAgICBuZXdfZmxhZ3MgPSBmbGFncyAmIH5GRF9DTE9FWEVDOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbmV3X2ZsYWdzID0gZmxhZ3MgfCBGRF9DTE9FWEVDOworICAgIH0KKworICAgIGlmIChuZXdfZmxhZ3MgPT0gZmxhZ3MpIHsKKyAgICAgICAgLyogRkRfQ0xPRVhFQyBmbGFnIGFscmVhZHkgc2V0L2NsZWFyZWQ6IG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgcmVzID0gZmNudGwoZmQsIEZfU0VURkQsIGZsYWdzKTsKICAgICBpZiAocmVzIDwgMCkgewogICAgICAgICBpZiAocmFpc2UpCkBAIC0xMTY5LDYgKzExODEsMTAgQEAKICAgICBpbnQgZXJyOwogICAgIGludCBhc3luY19lcnIgPSAwOwogCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgLyogX1B5X3JlYWQoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24gc2V0LCBvdGhlcndpc2UgdGhlCiAgICAgICogY2FsbGVyIG1heSB0aGluayB0aGF0IHJlYWQoKSB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIHRoZSBzaWduYWwKICAgICAgKiBoYW5kbGVyIHJhaXNlZCBhbiBleGNlcHRpb24uICovCkBAIC0xMzI0LDYgKzEzNDAsMTAgQEAKIFB5X3NzaXplX3QKIF9QeV93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQogeworI2lmZGVmIFdJVEhfVEhSRUFECisgICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7CisjZW5kaWYKKwogICAgIC8qIF9QeV93cml0ZSgpIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQsIG90aGVyd2lzZSB0aGUKICAgICAgKiBjYWxsZXIgbWF5IHRoaW5rIHRoYXQgd3JpdGUoKSB3YXMgaW50ZXJydXB0ZWQgYnkgYSBzaWduYWwgYW5kIHRoZSBzaWduYWwKICAgICAgKiBoYW5kbGVyIHJhaXNlZCBhbiBleGNlcHRpb24uICovCkBAIC0xNDczLDYgKzE0OTMsMTAgQEAKICAgICBEV09SRCBmdHlwZTsKICNlbmRpZgogCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKKyNlbmRpZgorCiAgICAgaWYgKCFfUHlWZXJpZnlfZmQoZmQpKSB7CiAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKICAgICAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMgYi9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYwppbmRleCA4ZTljNTAyLi5kNTczMjg4IDEwMDY0NAotLS0gYS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYworKysgYi9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYwpAQCAtNjU2LDcgKzY1Niw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKK3N0YXRpYyBjb25zdCBjaGFyIG5vX2dyb3VwaW5nWzFdID0ge0NIQVJfTUFYfTsKIAogLyogRmluZCB0aGUgZGVjaW1hbCBwb2ludCBjaGFyYWN0ZXIocz8pLCB0aG91c2FuZHNfc2VwYXJhdG9yKHM/KSwgYW5kCiAgICBncm91cGluZyBkZXNjcmlwdGlvbiwgZWl0aGVyIGZvciB0aGUgY3VycmVudCBsb2NhbGUgaWYgdHlwZSBpcwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2Zyb3plbi5jIGIvUHl0aG9uL2Zyb3plbi5jCmluZGV4IDY3NmYzOTUuLjdlMDRmM2MgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW4uYworKysgYi9QeXRob24vZnJvemVuLmMKQEAgLTE0LDE3ICsxNCwxNSBAQAogICAgdGhlIGFwcHJvcHJpYXRlIGJ5dGVzIGZyb20gTV9fX21haW5fXy5jLiAqLwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBNX19faGVsbG9fX1tdID0gewotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwLDAsMCwwLDEwMCwyLDAsOTAsMSwwLAotICAgIDEwMSwyLDAsMTAwLDAsMCwxMzEsMSwwLDEsMTAwLDEsMCw4Myw0MCwzLAotICAgIDAsMCwwLDExNywxMiwwLDAsMCw3MiwxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LDExMSwKLSAgICAxMTQsMTA4LDEwMCwzMyw3OCw4NCw0MCwzLDAsMCwwLDExNyw0LDAsMCwwLAotICAgIDg0LDExNCwxMTcsMTAxLDExNywxMSwwLDAsMCwxMDUsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwKLSAgICAxMDUsMTIyLDEwMSwxMDAsMTE3LDUsMCwwLDAsMTEyLDExNCwxMDUsMTEwLDExNiw0MCwwLAotICAgIDAsMCwwLDQwLDAsMCwwLDAsNDAsMCwwLDAsMCwxMTcsNywwLAotICAgIDAsMCwxMDIsMTA4LDk3LDEwMyw0NiwxMTIsMTIxLDExNyw4LDAsMCwwLDYwLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDYyLDEsMCwwLDAsMTE1LDIsMCwwLDAsNiwKLSAgICAxLAorICAgIDIyNywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMCw5MCwwLDEwMSwxLAorICAgIDEwMCwxLDEzMSwxLDEsMCwxMDAsMiw4MywwLDQxLDMsODQsMTIyLDEyLDcyLAorICAgIDEwMSwxMDgsMTA4LDExMSwzMiwxMTksMTExLDExNCwxMDgsMTAwLDMzLDc4LDQxLDIsMjE4LDExLAorICAgIDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCwyMTgsNSwxMTIsMTE0LDEwNSwKKyAgICAxMTAsMTE2LDE2OSwwLDExNCwzLDAsMCwwLDExNCwzLDAsMCwwLDI1MCwyMiwKKyAgICA0Niw0Nyw4NCwxMTEsMTExLDEwOCwxMTUsNDcsMTAyLDExNCwxMDEsMTAxLDEyMiwxMDEsNDcsMTAyLAorICAgIDEwOCw5NywxMDMsNDYsMTEyLDEyMSwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2MiwKKyAgICAxLDAsMCwwLDExNSwyLDAsMCwwLDQsMSwKIH07CiAKICNkZWZpbmUgU0laRSAoaW50KXNpemVvZihNX19faGVsbG9fXykKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW5tYWluLmMgYi9QeXRob24vZnJvemVubWFpbi5jCmluZGV4IGRlOGJkMzUuLjc2OWIzM2QgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9mcm96ZW5tYWluLmMKKysrIGIvUHl0aG9uL2Zyb3plbm1haW4uYwpAQCAtOTksNyArOTksOSBAQAogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBQeVdpbkZyZWV6ZV9FeGVUZXJtKCk7CiAjZW5kaWYKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHN0cyA9IDEyMDsKKyAgICB9CiAKIGVycm9yOgogICAgIFB5TWVtX1Jhd0ZyZWUoYXJndl9jb3B5KTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCAxNjNmODdmLi43NWYyMTA3IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC03OSw3ICs3OSwxMCBAQAogCiAgICAgaSA9IDA7CiAgICAgZmlyc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQobW9kLT52Lk1vZHVsZS5ib2R5LCBpKTsKLSAgICBpZiAoZmlyc3QtPmtpbmQgPT0gRXhwcl9raW5kICYmIGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQpCisgICAgaWYgKGZpcnN0LT5raW5kID09IEV4cHJfa2luZAorICAgICAgICAmJiAoZmlyc3QtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZAorICAgICAgICAgICAgfHwgKGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gQ29uc3RhbnRfa2luZAorICAgICAgICAgICAgICAgICYmIFB5VW5pY29kZV9DaGVja0V4YWN0KGZpcnN0LT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWUpKSkpCiAgICAgICAgIGkrKzsKIAogCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCA4YWFiMDY3Li40NDE4ZWJiIDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTIwLDEyICsyMCwxMiBAQAogCiAjaWZkZWYgSEFWRV9ERUNMU1BFQ19ETEwKIC8qIEV4cG9ydCBmdW5jdGlvbnMgKi8KLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY2hhciAqLCAuLi4pOwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCAuLi4pOwotUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKIFB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIHZhX2xpc3QpOwogI2VuZGlmCkBAIC01NiwxOCArNTYsMTggQEAKIC8qIEZvcndhcmQgKi8KIHN0YXRpYyBpbnQgdmdldGFyZ3MxKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCAqLCBpbnQpOwogc3RhdGljIHZvaWQgc2V0ZXJyb3IoUHlfc3NpemVfdCwgY29uc3QgY2hhciAqLCBpbnQgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOwotc3RhdGljIGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGNoYXIgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNoYXIgKiopOwotc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNoYXIqKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydGl0ZW0oUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsIGludCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnR0dXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICosIGNoYXIgKiwgc2l6ZV90LCBpbnQsIGZyZWVsaXN0X3QgKik7CitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydHNpbXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgc2l6ZV90LCBmcmVlbGlzdF90ICopOworc3RhdGljIFB5X3NzaXplX3QgY29udmVydGJ1ZmZlcihQeU9iamVjdCAqLCB2b2lkICoqcCwgY29uc3QgY2hhciAqKik7CitzdGF0aWMgaW50IGdldGJ1ZmZlcihQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgY29uc3QgY2hhcioqKTsKIAogc3RhdGljIGludCB2Z2V0YXJnc2tleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7Ci1zdGF0aWMgY2hhciAqc2tpcGl0ZW0oY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKnNraXBpdGVtKGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKIAogaW50CiBQeUFyZ19QYXJzZShQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCkBAIC04Miw3ICs4Miw3IEBACiB9CiAKIGludAotX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CiAgICAgaW50IHJldHZhbDsKICAgICB2YV9saXN0IHZhOwpAQCAtMTA3LDcgKzEwNyw3IEBACiB9CiAKIGludAotX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNoYXIgKmZvcm1hdCwgLi4uKQorX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEzMCw3ICsxMzAsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmEpCitfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQogewogICAgIHZhX2xpc3QgbHZhOwogCkBAIC0yMDgsNyArMjA4LDcgQEAKICAgICBpbnQgZW5kZm10ID0gMDsKICAgICBjb25zdCBjaGFyICpmb3JtYXRzYXZlID0gZm9ybWF0OwogICAgIFB5X3NzaXplX3QgaSwgbGVuOwotICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICptc2c7CiAgICAgaW50IGNvbXBhdCA9IGZsYWdzICYgRkxBR19DT01QQVQ7CiAgICAgZnJlZWxpc3RlbnRyeV90IHN0YXRpY19lbnRyaWVzW1NUQVRJQ19GUkVFTElTVF9FTlRSSUVTXTsKICAgICBmcmVlbGlzdF90IGZyZWVsaXN0OwpAQCAtMzk0LDcgKzM5NCwxMiBAQAogICAgICAgICBQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLCAiICUuMjU2cyIsIG1zZyk7CiAgICAgICAgIG1lc3NhZ2UgPSBidWY7CiAgICAgfQotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1lc3NhZ2UpOworICAgIGlmIChtc2dbMF0gPT0gJygnKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgbWVzc2FnZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICB9CiB9CiAKIApAQCAtNDE2LDcgKzQyMSw3IEBACiAgICAgICBhbmQgbXNnYnVmIGlzIHJldHVybmVkLgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHR1cGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBpbnQgdG9wbGV2ZWwsCiAgICAgICAgICAgICAgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCkBAIC00NzQsNyArNDc5LDcgQEAKIAogICAgIGZvcm1hdCA9ICpwX2Zvcm1hdDsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICBQeU9iamVjdCAqaXRlbTsKICAgICAgICAgaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmcsIGkpOwogICAgICAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CkBAIC01MDEsMTEgKzUwNiwxMSBAQAogCiAvKiBDb252ZXJ0IGEgc2luZ2xlIGl0ZW0uICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnRpdGVtKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgaW50ICpsZXZlbHMsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUsIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQogewotICAgIGNoYXIgKm1zZzsKKyAgICBjb25zdCBjaGFyICptc2c7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OwogCiAgICAgaWYgKCpmb3JtYXQgPT0gJygnIC8qICcpJyAqLykgewpAQCAtNTMwLDcgKzUzNSw3IEBACiAKIC8qIEZvcm1hdCBhbiBlcnJvciBtZXNzYWdlIGdlbmVyYXRlZCBieSBjb252ZXJ0c2ltcGxlKCkuICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnRlcnIoY29uc3QgY2hhciAqZXhwZWN0ZWQsIFB5T2JqZWN0ICphcmcsIGNoYXIgKm1zZ2J1Ziwgc2l6ZV90IGJ1ZnNpemUpCiB7CiAgICAgYXNzZXJ0KGV4cGVjdGVkICE9IE5VTEwpOwpAQCAtNTcyLDcgKzU3Nyw3IEBACiAgICBXaGVuIHlvdSBhZGQgbmV3IGZvcm1hdCBjb2RlcywgcGxlYXNlIGRvbid0IGZvcmdldCBwb29yIHNraXBpdGVtKCkgYmVsb3cuCiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICphcmcsIGNvbnN0IGNoYXIgKipwX2Zvcm1hdCwgdmFfbGlzdCAqcF92YSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKQEAgLTg1Nyw3ICs4NjIsNyBAQAogCiAgICAgY2FzZSAneSc6IHsvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KICAgICAgICAgdm9pZCAqKnAgPSAodm9pZCAqKil2YV9hcmcoKnBfdmEsIGNoYXIgKiopOwotICAgICAgICBjaGFyICpidWY7CisgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZjsKICAgICAgICAgUHlfc3NpemVfdCBjb3VudDsKICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyonKSB7CiAgICAgICAgICAgICBpZiAoZ2V0YnVmZmVyKGFyZywgKFB5X2J1ZmZlciopcCwgJmJ1ZikgPCAwKQpAQCAtOTA0LDcgKzkwOSw3IEBACiAgICAgICAgICAgICAgICAgUHlCdWZmZXJfRmlsbEluZm8ocCwgYXJnLCBzYXJnLCBsZW4sIDEsIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7IC8qIGFueSBieXRlcy1saWtlIG9iamVjdCAqLwotICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIHAsICZidWYpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAgICAgICAgICAgICB9CkBAIC05MzQsNyArOTM5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiByZWFkLW9ubHkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KICAgICAgICAgICAgICAgICAvKiBYWFggUmVhbGx5PyAqLwotICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBjb3VudCA9IGNvbnZlcnRidWZmZXIoYXJnLCBwLCAmYnVmKTsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycihidWYsIGFyZywgbXNnYnVmLCBidWZzaXplKTsKQEAgLTEwNTEsMzUgKzEwNTYsMjUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigiKEFzQ2hhckJ1ZmZlciBmYWlsZWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqdTsKLQotICAgICAgICAgICAgLyogQ29udmVydCBvYmplY3QgdG8gVW5pY29kZSAqLwotICAgICAgICAgICAgdSA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGFyZyk7Ci0gICAgICAgICAgICBpZiAodSA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAotICAgICAgICAgICAgICAgICAgICAic3RyaW5nIG9yIHVuaWNvZGUgb3IgdGV4dCBidWZmZXIiLAotICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0KKyAgICAgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKICAgICAgICAgICAgIC8qIEVuY29kZSBvYmplY3Q7IHVzZSBkZWZhdWx0IGVycm9yIGhhbmRsaW5nICovCi0gICAgICAgICAgICBzID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1LAorICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih1KTsKICAgICAgICAgICAgIGlmIChzID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihlbmNvZGluZyBmYWlsZWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2socykpIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCi0gICAgICAgICAgICAgICAgICAgICIoZW5jb2RlciBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzKSIsCi0gICAgICAgICAgICAgICAgICAgIGFyZywgbXNnYnVmLCBidWZzaXplKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKHMpKTsKICAgICAgICAgICAgIHNpemUgPSBQeUJ5dGVzX0dFVF9TSVpFKHMpOwogICAgICAgICAgICAgcHRyID0gUHlCeXRlc19BU19TVFJJTkcocyk7CiAgICAgICAgICAgICBpZiAocHRyID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcHRyID0gIiI7CiAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKKyAgICAgICAgICAgICAgICByZWNvZGVfc3RyaW5ncyA/ICJzdHIiIDogInN0ciwgYnl0ZXMgb3IgYnl0ZWFycmF5IiwKKyAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CisgICAgICAgIH0KIAogICAgICAgICAvKiBXcml0ZSBvdXRwdXQ7IG91dHB1dCBpcyBndWFyYW50ZWVkIHRvIGJlIDAtdGVybWluYXRlZCAqLwogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnIycpIHsKQEAgLTExMjksNyArMTEyNCw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChzaXplICsgMSA+IEJVRkZFUl9MRU4pIHsKICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVkIHN0cmluZyB0b28gbG9uZyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKCV6ZCwgbWF4aW11bSBsZW5ndGggJXpkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfc3NpemVfdClzaXplLCAoUHlfc3NpemVfdCkoQlVGRkVSX0xFTi0xKSk7CkBAIC0xMjgzLDcgKzEyNzgsNyBAQAogfQogCiBzdGF0aWMgUHlfc3NpemVfdAotY29udmVydGJ1ZmZlcihQeU9iamVjdCAqYXJnLCB2b2lkICoqcCwgY2hhciAqKmVycm1zZykKK2NvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNvbnN0IGNoYXIgKiplcnJtc2cpCiB7CiAgICAgUHlCdWZmZXJQcm9jcyAqcGIgPSBQeV9UWVBFKGFyZyktPnRwX2FzX2J1ZmZlcjsKICAgICBQeV9zc2l6ZV90IGNvdW50OwpAQCAtMTMwNSw3ICsxMzAwLDcgQEAKIH0KIAogc3RhdGljIGludAotZ2V0YnVmZmVyKFB5T2JqZWN0ICphcmcsIFB5X2J1ZmZlciAqdmlldywgY2hhciAqKmVycm1zZykKK2dldGJ1ZmZlcihQeU9iamVjdCAqYXJnLCBQeV9idWZmZXIgKnZpZXcsIGNvbnN0IGNoYXIgKiplcnJtc2cpCiB7CiAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsIHZpZXcsIFB5QlVGX1NJTVBMRSkgIT0gMCkgewogICAgICAgICAqZXJybXNnID0gImJ5dGVzLWxpa2Ugb2JqZWN0IjsKQEAgLTE0NDgsNyArMTQ0Myw4IEBACiAgICAgY29uc3QgY2hhciAqZm5hbWUsICptc2csICpjdXN0b21fbXNnLCAqa2V5d29yZDsKICAgICBpbnQgbWluID0gSU5UX01BWDsKICAgICBpbnQgbWF4ID0gSU5UX01BWDsKLSAgICBpbnQgaSwgbGVuOworICAgIGludCBpLCBwb3MsIGxlbjsKKyAgICBpbnQgc2tpcCA9IDA7CiAgICAgUHlfc3NpemVfdCBuYXJncywgbmtleXdvcmRzOwogICAgIFB5T2JqZWN0ICpjdXJyZW50X2FyZzsKICAgICBmcmVlbGlzdGVudHJ5X3Qgc3RhdGljX2VudHJpZXNbU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVNdOwpAQCAtMTQ3Niw5ICsxNDcyLDE3IEBACiAgICAgICAgICAgICBjdXN0b21fbXNnKys7CiAgICAgfQogCisgICAgLyogc2NhbiBrd2xpc3QgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgKi8KKyAgICBmb3IgKHBvcyA9IDA7IGt3bGlzdFtwb3NdICYmICEqa3dsaXN0W3Bvc107IHBvcysrKSB7CisgICAgfQogICAgIC8qIHNjYW4ga3dsaXN0IGFuZCBnZXQgZ3JlYXRlc3QgcG9zc2libGUgbmJyIG9mIGFyZ3MgKi8KLSAgICBmb3IgKGxlbj0wOyBrd2xpc3RbbGVuXTsgbGVuKyspCi0gICAgICAgIGNvbnRpbnVlOworICAgIGZvciAobGVuID0gcG9zOyBrd2xpc3RbbGVuXTsgbGVuKyspIHsKKyAgICAgICAgaWYgKCEqa3dsaXN0W2xlbl0pIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkga2V5d29yZCBwYXJhbWV0ZXIgbmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAobGVuID4gU1RBVElDX0ZSRUVMSVNUX0VOVFJJRVMpIHsKICAgICAgICAgZnJlZWxpc3QuZW50cmllcyA9IFB5TWVtX05FVyhmcmVlbGlzdGVudHJ5X3QsIGxlbik7CkBAIC0xNTA3LDcgKzE1MTEsNyBAQAogICAgICAgICBrZXl3b3JkID0ga3dsaXN0W2ldOwogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnfCcpIHsKICAgICAgICAgICAgIGlmIChtaW4gIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICh8IHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MTYsMTQgKzE1MjAsMTQgQEAKICAgICAgICAgICAgIGZvcm1hdCsrOwogCiAgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAoJCBiZWZvcmUgfCkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKmZvcm1hdCA9PSAnJCcpIHsKICAgICAgICAgICAgIGlmIChtYXggIT0gSU5UX01BWCkgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JtYXQgc3RyaW5nICgkIHNwZWNpZmllZCB0d2ljZSkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KQEAgLTE1MzEsNiArMTUzNSwxNCBAQAogICAgICAgICAgICAgbWF4ID0gaTsKICAgICAgICAgICAgIGZvcm1hdCsrOwogCisgICAgICAgICAgICBpZiAobWF4IDwgcG9zKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1wdHkgcGFyYW1ldGVyIG5hbWUgYWZ0ZXIgJCIpOworICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNraXApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYXggPCBuYXJncykgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyAlcyAlZCBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKQEAgLTE1NDEsNjYgKzE1NTMsODYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9yZSBrZXl3b3JkIGxpc3QgZW50cmllcyAoJWQpIHRoYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgc3BlY2lmaWVycyAoJWQpIiwgbGVuLCBpKTsKICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwogICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRfYXJnID0gTlVMTDsKLSAgICAgICAgaWYgKG5rZXl3b3JkcykgewotICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrZXl3b3Jkcywga2V5d29yZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7Ci0gICAgICAgICAgICAtLW5rZXl3b3JkczsKLSAgICAgICAgICAgIGlmIChpIDwgbmFyZ3MpIHsKLSAgICAgICAgICAgICAgICAvKiBhcmcgcHJlc2VudCBpbiB0dXBsZSBhbmQgaW4gZGljdCAqLwotICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBnaXZlbiBieSBuYW1lICgnJXMnKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgIGlmICghc2tpcCkgeworICAgICAgICAgICAgY3VycmVudF9hcmcgPSBOVUxMOworICAgICAgICAgICAgaWYgKG5rZXl3b3JkcyAmJiBpID49IHBvcykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa2V5d29yZHMsIGtleXdvcmQpOworICAgICAgICAgICAgICAgIGlmICghY3VycmVudF9hcmcgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKKyAgICAgICAgICAgICAgICAtLW5rZXl3b3JkczsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IG5hcmdzKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGFyZyBwcmVzZW50IGluIHR1cGxlIGFuZCBpbiBkaWN0ICovCisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgZ2l2ZW4gYnkgbmFtZSAoJyVzJykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBwb3NpdGlvbiAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGkgPCBuYXJncykKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2FyZykgeworICAgICAgICAgICAgICAgIG1zZyA9IGNvbnZlcnRpdGVtKGN1cnJlbnRfYXJnLCAmZm9ybWF0LCBwX3ZhLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxzLCBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIGlmIChtc2cpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0ZXJyb3IoaSsxLCBtc2csIGxldmVscywgZm5hbWUsIGN1c3RvbV9tc2cpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpIDwgbWluKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBwb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IChtaW4gPT0gSU5UX01BWCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAobWF4ID09IElOVF9NQVgpOworICAgICAgICAgICAgICAgICAgICBza2lwID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJSZXF1aXJlZCBhcmd1bWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIChwb3MgJWQpIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsIGkrMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncworICAgICAgICAgICAgICogZnVsZmlsbGVkIGFuZCBubyBrZXl3b3JkIGFyZ3MgbGVmdCwgd2l0aCBubyBmdXJ0aGVyCisgICAgICAgICAgICAgKiB2YWxpZGF0aW9uLiBYWFggTWF5YmUgc2tpcCB0aGlzIGluIGRlYnVnIGJ1aWxkID8KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFua2V5d29yZHMgJiYgIXNraXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMSwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChua2V5d29yZHMgJiYgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwotICAgICAgICBlbHNlIGlmIChpIDwgbmFyZ3MpCi0gICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7Ci0gICAgICAgICAgICBtc2cgPSBjb252ZXJ0aXRlbShjdXJyZW50X2FyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgbGV2ZWxzLCBtc2didWYsIHNpemVvZihtc2didWYpLCAmZnJlZWxpc3QpOwotICAgICAgICAgICAgaWYgKG1zZykgewotICAgICAgICAgICAgICAgIHNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBjdXN0b21fbXNnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGkgPCBtaW4pIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJSZXF1aXJlZCBhcmd1bWVudCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgKHBvcyAlZCkgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOwotICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogY3VycmVudCBjb2RlIHJlcG9ydHMgc3VjY2VzcyB3aGVuIGFsbCByZXF1aXJlZCBhcmdzCi0gICAgICAgICAqIGZ1bGZpbGxlZCBhbmQgbm8ga2V5d29yZCBhcmdzIGxlZnQsIHdpdGggbm8gZnVydGhlcgotICAgICAgICAgKiB2YWxpZGF0aW9uLiBYWFggTWF5YmUgc2tpcCB0aGlzIGluIGRlYnVnIGJ1aWxkID8KLSAgICAgICAgICovCi0gICAgICAgIGlmICghbmtleXdvcmRzKQotICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsICZmcmVlbGlzdCk7CiAKICAgICAgICAgLyogV2UgYXJlIGludG8gb3B0aW9uYWwgYXJncywgc2tpcCB0aHJ1IHRvIGFueSByZW1haW5pbmcKICAgICAgICAgICoga2V5d29yZCBhcmdzICovCiAgICAgICAgIG1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKICAgICAgICAgaWYgKG1zZykgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwgIiVzOiAnJXMnIiwgbXNnLAorICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAiJXM6ICclcyciLCBtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHNraXApIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyAlcyAlZCBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgICAgICAgICAgICAgICIgKCVkIGdpdmVuKSIsCisgICAgICAgICAgICAgICAgICAgICAoUHlfTUlOKHBvcywgbWluKSA8IGkpID8gImF0IGxlYXN0IiA6ICJleGFjdGx5IiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X01JTihwb3MsIG1pbiksIG5hcmdzKTsKKyAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgfQorCiAgICAgaWYgKCFJU19FTkRfT0ZfRk9STUFUKCpmb3JtYXQpICYmICgqZm9ybWF0ICE9ICd8JykgJiYgKCpmb3JtYXQgIT0gJyQnKSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAibW9yZSBhcmd1bWVudCBzcGVjaWZpZXJzIHRoYW4ga2V5d29yZCBsaXN0IGVudHJpZXMgIgogICAgICAgICAgICAgIihyZW1haW5pbmcgZm9ybWF0OiclcycpIiwgZm9ybWF0KTsKICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CkBAIC0xNjE4LDcgKzE2NTAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhrZXksIGt3bGlzdFtpXSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKmt3bGlzdFtpXSAmJiAhUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoa2V5LCBrd2xpc3RbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTYzNyw3ICsxNjY5LDcgQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBza2lwaXRlbShjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncykKIHsKICAgICBjb25zdCBjaGFyICpmb3JtYXQgPSAqcF9mb3JtYXQ7CkBAIC0xNzMwLDcgKzE3NjIsNyBAQAogCiAgICAgY2FzZSAnKCc6ICAgICAgICAgICAvKiBieXBhc3MgdHVwbGUsIG5vdCBoYW5kbGVkIGF0IGFsbCBwcmV2aW91c2x5ICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKm1zZzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICBpZiAoKmZvcm1hdD09JyknKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE3NjYsMTYgKzE3OTgsOSBAQAogICAgIFB5T2JqZWN0ICoqbzsKICAgICB2YV9saXN0IHZhcmdzOwogCi0jaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUwotICAgIHZhX3N0YXJ0KHZhcmdzLCBtYXgpOwotI2Vsc2UKLSAgICB2YV9zdGFydCh2YXJncyk7Ci0jZW5kaWYKLQogICAgIGFzc2VydChtaW4gPj0gMCk7CiAgICAgYXNzZXJ0KG1pbiA8PSBtYXgpOwogICAgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgewotICAgICAgICB2YV9lbmQodmFyZ3MpOwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAiUHlBcmdfVW5wYWNrVHVwbGUoKSBhcmd1bWVudCBsaXN0IGlzIG5vdCBhIHR1cGxlIik7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTc5Myw5ICsxODE4LDEwIEBACiAgICAgICAgICAgICAgICAgInVucGFja2VkIHR1cGxlIHNob3VsZCBoYXZlICVzJXpkIGVsZW1lbnRzLCIKICAgICAgICAgICAgICAgICAiIGJ1dCBoYXMgJXpkIiwKICAgICAgICAgICAgICAgICAobWluID09IG1heCA/ICIiIDogImF0IGxlYXN0ICIpLCBtaW4sIGwpOwotICAgICAgICB2YV9lbmQodmFyZ3MpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaWYgKGwgPT0gMCkKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgaWYgKGwgPiBtYXgpIHsKICAgICAgICAgaWYgKG5hbWUgIT0gTlVMTCkKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdCgKQEAgLTE4MDgsOSArMTgzNCwxNCBAQAogICAgICAgICAgICAgICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCiAgICAgICAgICAgICAgICAgIiBidXQgaGFzICV6ZCIsCiAgICAgICAgICAgICAgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBtb3N0ICIpLCBtYXgsIGwpOwotICAgICAgICB2YV9lbmQodmFyZ3MpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisKKyNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCisgICAgdmFfc3RhcnQodmFyZ3MsIG1heCk7CisjZWxzZQorICAgIHZhX3N0YXJ0KHZhcmdzKTsKKyNlbmRpZgogICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHsKICAgICAgICAgbyA9IHZhX2FyZyh2YXJncywgUHlPYmplY3QgKiopOwogICAgICAgICAqbyA9IFB5VHVwbGVfR0VUX0lURU0oYXJncywgaSk7CmRpZmYgLS1naXQgYS9QeXRob24vZ3JhbWluaXQuYyBiL1B5dGhvbi9ncmFtaW5pdC5jCmluZGV4IDgyMTJiMmEuLjM1NGRjMTIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9ncmFtaW5pdC5jCisrKyBiL1B5dGhvbi9ncmFtaW5pdC5jCkBAIC0yMDQsMTEgKzIwNCwxMyBAQAogICAgIHszMiwgN30sCiAgICAgezAsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzdbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfOV83WzNdID0gewogICAgIHszMCwgMTJ9LAogICAgIHszNCwgM30sCisgICAgezAsIDd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzhbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfOV84WzJdID0geworICAgIHszMiwgMTN9LAogICAgIHswLCA4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV85WzJdID0gewpAQCAtMjIxLDM1ICsyMjMsMzkgQEAKICAgICB7MCwgMTB9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzExWzNdID0gewotICAgIHszMCwgMTN9LAotICAgIHszMiwgMTR9LAorICAgIHszMCwgMTR9LAorICAgIHszMiwgMTV9LAogICAgIHswLCAxMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTJbM10gPSB7CiAgICAgezMyLCA3fSwKLSAgICB7MzEsIDE1fSwKKyAgICB7MzEsIDE2fSwKICAgICB7MCwgMTJ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzEzWzJdID0gewotICAgIHszMiwgMTR9LAorc3RhdGljIGFyYyBhcmNzXzlfMTNbMV0gPSB7CiAgICAgezAsIDEzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xNFsyXSA9IHsKLSAgICB7MzAsIDE2fSwKLSAgICB7MzQsIDN9LAorICAgIHszMiwgMTV9LAorICAgIHswLCAxNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTVbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfOV8xNVszXSA9IHsKKyAgICB7MzAsIDE3fSwKKyAgICB7MzQsIDN9LAorICAgIHswLCAxNX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzlfMTZbMV0gPSB7CiAgICAgezI2LCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xNlszXSA9IHsKLSAgICB7MzIsIDE0fSwKLSAgICB7MzEsIDE3fSwKLSAgICB7MCwgMTZ9LAorc3RhdGljIGFyYyBhcmNzXzlfMTdbM10gPSB7CisgICAgezMyLCAxNX0sCisgICAgezMxLCAxOH0sCisgICAgezAsIDE3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xN1sxXSA9IHsKLSAgICB7MjYsIDEzfSwKK3N0YXRpYyBhcmMgYXJjc185XzE4WzFdID0geworICAgIHsyNiwgMTR9LAogfTsKLXN0YXRpYyBzdGF0ZSBzdGF0ZXNfOVsxOF0gPSB7CitzdGF0aWMgc3RhdGUgc3RhdGVzXzlbMTldID0gewogICAgIHszLCBhcmNzXzlfMH0sCiAgICAgezMsIGFyY3NfOV8xfSwKICAgICB7MywgYXJjc185XzJ9LApAQCAtMjU3LDE3ICsyNjMsMTggQEAKICAgICB7MSwgYXJjc185XzR9LAogICAgIHs0LCBhcmNzXzlfNX0sCiAgICAgezIsIGFyY3NfOV82fSwKLSAgICB7MiwgYXJjc185Xzd9LAotICAgIHsxLCBhcmNzXzlfOH0sCisgICAgezMsIGFyY3NfOV83fSwKKyAgICB7MiwgYXJjc185Xzh9LAogICAgIHsyLCBhcmNzXzlfOX0sCiAgICAgezMsIGFyY3NfOV8xMH0sCiAgICAgezMsIGFyY3NfOV8xMX0sCiAgICAgezMsIGFyY3NfOV8xMn0sCi0gICAgezIsIGFyY3NfOV8xM30sCisgICAgezEsIGFyY3NfOV8xM30sCiAgICAgezIsIGFyY3NfOV8xNH0sCi0gICAgezEsIGFyY3NfOV8xNX0sCi0gICAgezMsIGFyY3NfOV8xNn0sCi0gICAgezEsIGFyY3NfOV8xN30sCisgICAgezMsIGFyY3NfOV8xNX0sCisgICAgezEsIGFyY3NfOV8xNn0sCisgICAgezMsIGFyY3NfOV8xN30sCisgICAgezEsIGFyY3NfOV8xOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzEwXzBbMV0gPSB7CiAgICAgezIzLCAxfSwKQEAgLTMxOSwxMSArMzI2LDEzIEBACiAgICAgezMyLCA3fSwKICAgICB7MCwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzdbMl0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfN1szXSA9IHsKICAgICB7MzYsIDEyfSwKICAgICB7MzQsIDN9LAorICAgIHswLCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfOFsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV84WzJdID0geworICAgIHszMiwgMTN9LAogICAgIHswLCA4fSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfOVsyXSA9IHsKQEAgLTMzNiwzNSArMzQ1LDM5IEBACiAgICAgezAsIDEwfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfMTFbM10gPSB7Ci0gICAgezM2LCAxM30sCi0gICAgezMyLCAxNH0sCisgICAgezM2LCAxNH0sCisgICAgezMyLCAxNX0sCiAgICAgezAsIDExfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfMTJbM10gPSB7CiAgICAgezMyLCA3fSwKLSAgICB7MzEsIDE1fSwKKyAgICB7MzEsIDE2fSwKICAgICB7MCwgMTJ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xM1syXSA9IHsKLSAgICB7MzIsIDE0fSwKK3N0YXRpYyBhcmMgYXJjc18xMV8xM1sxXSA9IHsKICAgICB7MCwgMTN9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMV8xNFsyXSA9IHsKLSAgICB7MzYsIDE2fSwKLSAgICB7MzQsIDN9LAorICAgIHszMiwgMTV9LAorICAgIHswLCAxNH0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE1WzFdID0geworc3RhdGljIGFyYyBhcmNzXzExXzE1WzNdID0geworICAgIHszNiwgMTd9LAorICAgIHszNCwgM30sCisgICAgezAsIDE1fSwKK307CitzdGF0aWMgYXJjIGFyY3NfMTFfMTZbMV0gPSB7CiAgICAgezI2LCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTZbM10gPSB7Ci0gICAgezMyLCAxNH0sCi0gICAgezMxLCAxN30sCi0gICAgezAsIDE2fSwKK3N0YXRpYyBhcmMgYXJjc18xMV8xN1szXSA9IHsKKyAgICB7MzIsIDE1fSwKKyAgICB7MzEsIDE4fSwKKyAgICB7MCwgMTd9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xN1sxXSA9IHsKLSAgICB7MjYsIDEzfSwKK3N0YXRpYyBhcmMgYXJjc18xMV8xOFsxXSA9IHsKKyAgICB7MjYsIDE0fSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzExWzE4XSA9IHsKK3N0YXRpYyBzdGF0ZSBzdGF0ZXNfMTFbMTldID0gewogICAgIHszLCBhcmNzXzExXzB9LAogICAgIHszLCBhcmNzXzExXzF9LAogICAgIHszLCBhcmNzXzExXzJ9LApAQCAtMzcyLDE3ICszODUsMTggQEAKICAgICB7MSwgYXJjc18xMV80fSwKICAgICB7NCwgYXJjc18xMV81fSwKICAgICB7MiwgYXJjc18xMV82fSwKLSAgICB7MiwgYXJjc18xMV83fSwKLSAgICB7MSwgYXJjc18xMV84fSwKKyAgICB7MywgYXJjc18xMV83fSwKKyAgICB7MiwgYXJjc18xMV84fSwKICAgICB7MiwgYXJjc18xMV85fSwKICAgICB7MywgYXJjc18xMV8xMH0sCiAgICAgezMsIGFyY3NfMTFfMTF9LAogICAgIHszLCBhcmNzXzExXzEyfSwKLSAgICB7MiwgYXJjc18xMV8xM30sCisgICAgezEsIGFyY3NfMTFfMTN9LAogICAgIHsyLCBhcmNzXzExXzE0fSwKLSAgICB7MSwgYXJjc18xMV8xNX0sCi0gICAgezMsIGFyY3NfMTFfMTZ9LAotICAgIHsxLCBhcmNzXzExXzE3fSwKKyAgICB7MywgYXJjc18xMV8xNX0sCisgICAgezEsIGFyY3NfMTFfMTZ9LAorICAgIHszLCBhcmNzXzExXzE3fSwKKyAgICB7MSwgYXJjc18xMV8xOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzEyXzBbMV0gPSB7CiAgICAgezIzLCAxfSwKQEAgLTE4NzksMTEgKzE4OTMsMTEgQEAKICAgICAgIlwwMDBcMDAwXDEwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY0LCAicGFyYW1ldGVycyIsIDAsIDQsIHN0YXRlc184LAogICAgICAiXDAwMFwwNDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNjUsICJ0eXBlZGFyZ3NsaXN0IiwgMCwgMTgsIHN0YXRlc185LAorICAgIHsyNjUsICJ0eXBlZGFyZ3NsaXN0IiwgMCwgMTksIHN0YXRlc185LAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjYsICJ0ZnBkZWYiLCAwLCA0LCBzdGF0ZXNfMTAsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCi0gICAgezI2NywgInZhcmFyZ3NsaXN0IiwgMCwgMTgsIHN0YXRlc18xMSwKKyAgICB7MjY3LCAidmFyYXJnc2xpc3QiLCAwLCAxOSwgc3RhdGVzXzExLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDZcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAogICAgIHsyNjgsICJ2ZnBkZWYiLCAwLCAyLCBzdGF0ZXNfMTIsCiAgICAgICJcMDAwXDAwMFwyMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0LmMgYi9QeXRob24vaW1wb3J0LmMKaW5kZXggMGI4NDNkYS4uZDRjMzU4ZiAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydC5jCisrKyBiL1B5dGhvbi9pbXBvcnQuYwpAQCAtMzgsMTQgKzM4LDYgQEAKIAogI2luY2x1ZGUgImNsaW5pYy9pbXBvcnQuYy5oIgogCi0vKltweXRob24gaW5wdXRdCi1jbGFzcyBmc191bmljb2RlX2NvbnZlcnRlcihDQ29udmVydGVyKToKLSAgICB0eXBlID0gJ1B5T2JqZWN0IConCi0gICAgY29udmVydGVyID0gJ1B5VW5pY29kZV9GU0RlY29kZXInCi0KLVtweXRob24gc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KLS8qW3B5dGhvbiBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kYTM5YTNlZTVlNmI0YjBkIGlucHV0PTlkNjc4NjIzMDE2NjAwNmVdKi8KLQogLyogSW5pdGlhbGl6ZSB0aGluZ3MgKi8KIAogdm9pZApAQCAtMzIwLDcgKzMxMiw3IEBACiAKIAogLyogTGlzdCBvZiBuYW1lcyB0byBjbGVhciBpbiBzeXMgKi8KLXN0YXRpYyBjaGFyKiBzeXNfZGVsZXRlc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZGVsZXRlc1tdID0gewogICAgICJwYXRoIiwgImFyZ3YiLCAicHMxIiwgInBzMiIsCiAgICAgImxhc3RfdHlwZSIsICJsYXN0X3ZhbHVlIiwgImxhc3RfdHJhY2ViYWNrIiwKICAgICAicGF0aF9ob29rcyIsICJwYXRoX2ltcG9ydGVyX2NhY2hlIiwgIm1ldGFfcGF0aCIsCkBAIC0zMzAsNyArMzIyLDcgQEAKICAgICBOVUxMCiB9OwogCi1zdGF0aWMgY2hhciogc3lzX2ZpbGVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN5c19maWxlc1tdID0gewogICAgICJzdGRpbiIsICJfX3N0ZGluX18iLAogICAgICJzdGRvdXQiLCAiX19zdGRvdXRfXyIsCiAgICAgInN0ZGVyciIsICJfX3N0ZGVycl9fIiwKQEAgLTM0Nyw3ICszMzksNyBAQAogICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwID0gUHlUaHJlYWRTdGF0ZV9HRVQoKS0+aW50ZXJwOwogICAgIFB5T2JqZWN0ICptb2R1bGVzID0gaW50ZXJwLT5tb2R1bGVzOwogICAgIFB5T2JqZWN0ICp3ZWFrbGlzdCA9IE5VTEw7Ci0gICAgY2hhciAqKnA7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpwOwogCiAgICAgaWYgKG1vZHVsZXMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuOyAvKiBBbHJlYWR5IGRvbmUgKi8KQEAgLTg4MywxMCArODc1LDggQEAKICAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmUoY28tPmNvX2ZpbGVuYW1lLCBvbGRuYW1lKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgdG1wID0gY28tPmNvX2ZpbGVuYW1lOwotICAgIGNvLT5jb19maWxlbmFtZSA9IG5ld25hbWU7Ci0gICAgUHlfSU5DUkVGKGNvLT5jb19maWxlbmFtZSk7Ci0gICAgUHlfREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKG5ld25hbWUpOworICAgIFB5X1hTRVRSRUYoY28tPmNvX2ZpbGVuYW1lLCBuZXduYW1lKTsKIAogICAgIGNvbnN0YW50cyA9IGNvLT5jb19jb25zdHM7CiAgICAgbiA9IFB5VHVwbGVfR0VUX1NJWkUoY29uc3RhbnRzKTsKQEAgLTEzMzEsMTAgKzEzMjEsOCBAQAogICAgICAgICAgICAgKGFsd2F5c190cmltIHx8CiAgICAgICAgICAgICAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoY29kZS0+Y29fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnJhbWVzKSA9PSAwKSkgewotICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9ICpvdXRlcl9saW5rOwotICAgICAgICAgICAgKm91dGVyX2xpbmsgPSBuZXh0OwogICAgICAgICAgICAgUHlfWElOQ1JFRihuZXh0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgUHlfWFNFVFJFRigqb3V0ZXJfbGluaywgbmV4dCk7CiAgICAgICAgICAgICBwcmV2X2xpbmsgPSBvdXRlcl9saW5rOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewpAQCAtMTM2MSwxMiArMTM0OSwxMiBAQAogICAgIF9QeV9JREVOVElGSUVSKF9maW5kX2FuZF9sb2FkKTsKICAgICBfUHlfSURFTlRJRklFUihfaGFuZGxlX2Zyb21saXN0KTsKICAgICBfUHlfSURFTlRJRklFUihfbG9ja191bmxvY2tfbW9kdWxlKTsKLSAgICBfUHlfc3RhdGljX3N0cmluZyhzaW5nbGVfZG90LCAiLiIpOwogICAgIFB5T2JqZWN0ICphYnNfbmFtZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmJ1aWx0aW5zX2ltcG9ydCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmZpbmFsX21vZCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1vZCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhY2thZ2UgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzcGVjID0gTlVMTDsKICAgICBQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKQEAgLTE0MjMsNDIgKzE0MTEsOTMgQEAKICAgICB9CiAgICAgZWxzZSBpZiAobGV2ZWwgPiAwKSB7CiAgICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhY2thZ2VfXyk7CisgICAgICAgIHNwZWMgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3NwZWNfXyk7CisKICAgICAgICAgaWYgKHBhY2thZ2UgIT0gTlVMTCAmJiBwYWNrYWdlICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRihwYWNrYWdlKTsKICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBhY2thZ2UgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcGVjICE9IE5VTEwgJiYgc3BlYyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgaW50IGVxdWFsOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJlbnQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNwZWMsICJwYXJlbnQiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlcXVhbCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChwYWNrYWdlLCBwYXJlbnQsIFB5X0VRKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXF1YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVxdWFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQiLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3BlYyAhPSBOVUxMICYmIHNwZWMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgcGFja2FnZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc3BlYywgInBhcmVudCIpOworICAgICAgICAgICAgaWYgKHBhY2thZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NwZWNfXy5wYXJlbnQgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0ltcG9ydFdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmVzb2x2ZSBwYWNrYWdlIGZyb20gX19zcGVjX18gb3IgX19wYWNrYWdlX18sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgb24gX19uYW1lX18gYW5kIF9fcGF0aF9fIiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcGFja2FnZSA9IF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fbmFtZV9fKTsKICAgICAgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICInX19uYW1lX18nIG5vdCBpbiBnbG9iYWxzIik7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyIpOwotICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX25hbWVfXyBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fcGF0aF9fKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnBhcnRpdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKLSAgICAgICAgICAgICAgICBpZiAoYm9ycm93ZWRfZG90ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGRvdDsKKworICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocGFja2FnZSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcnRpdGlvbiA9IFB5VW5pY29kZV9SUGFydGl0aW9uKHBhY2thZ2UsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb24gPT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKHBhY2thZ2UsICcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlVbmljb2RlX0dFVF9MRU5HVEgocGFja2FnZSksIC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoZG90ID09IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBQeVR1cGxlX0dFVF9JVEVNKHBhcnRpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJ0aXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGRvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHBhY2thZ2UsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9TRVRSRUYocGFja2FnZSwgc3Vic3RyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCBwYWNrYWdlKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhwYWNrYWdlLCAiIikgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCB3aXRoIG5vIGtub3duIHBhcmVudCBwYWNrYWdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RGljdF9HZXRJdGVtKGludGVycC0+bW9kdWxlcywgcGFja2FnZSkgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAlUiBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAiCiAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQiLCBwYWNrYWdlKTsKQEAgLTE0OTcsMTcgKzE1MzYsOCBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgobmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqYm9ycm93ZWRfZG90LCAqc2VxID0gTlVMTDsKLQotICAgICAgICAgICAgYm9ycm93ZWRfZG90ID0gX1B5VW5pY29kZV9Gcm9tSWQoJnNpbmdsZV9kb3QpOwotICAgICAgICAgICAgc2VxID0gUHlUdXBsZV9QYWNrKDIsIGJhc2UsIG5hbWUpOworICAgICAgICAgICAgYWJzX25hbWUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVUuJVUiLCBiYXNlLCBuYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlKTsKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCB8fCBzZXEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFic19uYW1lID0gUHlVbmljb2RlX0pvaW4oYm9ycm93ZWRfZG90LCBzZXEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CiAgICAgICAgICAgICBpZiAoYWJzX25hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CkBAIC0xNjA1LDQzICsxNjM1LDM2IEBACiAgICAgaWYgKGhhc19mcm9tIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBpZiAoIWhhc19mcm9tKSB7Ci0gICAgICAgIGlmIChsZXZlbCA9PSAwIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID4gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKmZyb250ID0gTlVMTDsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJ0aXRpb24gPSBOVUxMOwotICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKTsKKyAgICAgICAgaWYgKGxldmVsID09IDAgfHwgbGVuID4gMCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBkb3Q7CiAKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKG5hbWUsICcuJywgMCwgbGVuLCAxKTsKKyAgICAgICAgICAgIGlmIChkb3QgPT0gLTIpIHsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwYXJ0aXRpb24gPSBQeVVuaWNvZGVfUGFydGl0aW9uKG5hbWUsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICBpZiAocGFydGl0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoUHlUdXBsZV9HRVRfSVRFTShwYXJ0aXRpb24sIDEpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZG90ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgLyogTm8gZG90IGluIG1vZHVsZSBuYW1lLCBzaW1wbGUgZXhpdCAqLwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJ0aXRpb24pOwogICAgICAgICAgICAgICAgIGZpbmFsX21vZCA9IG1vZDsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobW9kKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmcm9udCA9IFB5VHVwbGVfR0VUX0lURU0ocGFydGl0aW9uLCAwKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihmcm9udCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocGFydGl0aW9uKTsKLQogICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnJvbnQgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKG5hbWUsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgaWYgKGZyb250ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmaW5hbF9tb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGJ1aWx0aW5zX2ltcG9ydCwgZnJvbnQsIE5VTEwpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcm9udCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGN1dF9vZmYgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoZnJvbnQpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY3V0X29mZiA9IGxlbiAtIGRvdDsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGFic19uYW1lX2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGFic19uYW1lKTsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdG9fcmV0dXJuID0gUHlVbmljb2RlX1N1YnN0cmluZyhhYnNfbmFtZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX25hbWVfbGVuIC0gY3V0X29mZik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGZyb250KTsKICAgICAgICAgICAgICAgICBpZiAodG9fcmV0dXJuID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0ZGwuYyBiL1B5dGhvbi9pbXBvcnRkbC5jCmluZGV4IDFhYTU4NWQuLmFjMDMyODkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRkbC5jCisrKyBiL1B5dGhvbi9pbXBvcnRkbC5jCkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgY2hhciAqYXNjaWlfb25seV9wcmVmaXggPSAiUHlJbml0IjsKLXN0YXRpYyBjb25zdCBjaGFyICpub25hc2NpaV9wcmVmaXggPSAiUHlJbml0VSI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzY2lpX29ubHlfcHJlZml4ID0gIlB5SW5pdCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5vbmFzY2lpX3ByZWZpeCA9ICJQeUluaXRVIjsKIAogLyogR2V0IHRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgbW9kdWxlJ3MgZXhwb3J0IHN5bWJvbCBuYW1lLgogICogUmV0dXJucyBhIGJ5dGVzIGluc3RhbmNlLiBGb3Igbm9uLUFTQ0lJLW5hbWVkIG1vZHVsZXMsIHRoZSBuYW1lIGlzCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0bGliLmggYi9QeXRob24vaW1wb3J0bGliLmgKaW5kZXggN2Y2Yjc1My4uZTMzNjRiMyAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGxpYi5oCisrKyBiL1B5dGhvbi9pbXBvcnRsaWIuaApAQCAtMSwxNzEgKzEsMTU0IEBACiAvKiBBdXRvLWdlbmVyYXRlZCBieSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIF9QeV9NX19pbXBvcnRsaWJbXSA9IHsKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2LDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwxNjksMiwwLDAsMTAwLDAsMCw5MCwwLDAsCi0gICAgMTAwLDEsMCw5NywxLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgMiwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDMsMCw3MSwxMDAsCi0gICAgNiwwLDEwMCw3LDAsMTMyLDAsMCwxMDAsNywwLDEzMSwyLDAsOTAsNCwKLSAgICAwLDEwNSwwLDAsOTAsNSwwLDEwNSwwLDAsOTAsNiwwLDcxLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDEwMCw5LDAsMTAxLDcsMCwxMzEsMywwLAotICAgIDkwLDgsMCw3MSwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLDEwMCwxMSwwLAotICAgIDEzMSwyLDAsOTAsOSwwLDcxLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsCi0gICAgMTAwLDEzLDAsMTMxLDIsMCw5MCwxMCwwLDcxLDEwMCwxNCwwLDEwMCwxNSwwLAotICAgIDEzMiwwLDAsMTAwLDE1LDAsMTMxLDIsMCw5MCwxMSwwLDEwMCwxNiwwLDEwMCwKLSAgICAxNywwLDEzMiwwLDAsOTAsMTIsMCwxMDAsMTgsMCwxMDAsMTksMCwxMzIsMCwKLSAgICAwLDkwLDEzLDAsMTAwLDIwLDAsMTAwLDIxLDAsMTMyLDAsMCw5MCwxNCwwLAotICAgIDEwMCwyMiwwLDEwMCwyMywwLDEwMCwyNCwwLDEwMCwyNSwwLDEzMiwwLDEsOTAsCi0gICAgMTUsMCwxMDAsMjYsMCwxMDAsMjcsMCwxMzIsMCwwLDkwLDE2LDAsMTAwLDI4LAotICAgIDAsMTAwLDI5LDAsMTMyLDAsMCw5MCwxNywwLDEwMCwzMCwwLDEwMCwzMSwwLAotICAgIDEzMiwwLDAsOTAsMTgsMCwxMDAsMzIsMCwxMDAsMzMsMCwxMzIsMCwwLDkwLAotICAgIDE5LDAsNzEsMTAwLDM0LDAsMTAwLDM1LDAsMTMyLDAsMCwxMDAsMzUsMCwxMzEsCi0gICAgMiwwLDkwLDIwLDAsNzEsMTAwLDM2LDAsMTAwLDM3LDAsMTMyLDAsMCwxMDAsCi0gICAgMzcsMCwxMzEsMiwwLDkwLDIxLDAsMTAwLDM4LDAsMTAwLDEsMCwxMDAsMzksCi0gICAgMCwxMDAsMSwwLDEwMCw0MCwwLDEwMCw0MSwwLDEzMiwwLDIsOTAsMjIsMCwKLSAgICAxMDEsMjMsMCwxMzEsMCwwLDkwLDI0LDAsMTAwLDEsMCwxMDAsMSwwLDEwMCwKLSAgICA0MiwwLDEwMCw0MywwLDEzMiwyLDAsOTAsMjUsMCwxMDAsNDQsMCwxMDAsNDUsCi0gICAgMCwxMDAsNDYsMCwxMDAsNDcsMCwxMzIsMCwxLDkwLDI2LDAsMTAwLDQ4LDAsCi0gICAgMTAwLDQ5LDAsMTMyLDAsMCw5MCwyNywwLDEwMCw1MCwwLDEwMCw1MSwwLDEzMiwKLSAgICAwLDAsOTAsMjgsMCwxMDAsNTIsMCwxMDAsNTMsMCwxMzIsMCwwLDkwLDI5LAotICAgIDAsMTAwLDU0LDAsMTAwLDU1LDAsMTMyLDAsMCw5MCwzMCwwLDEwMCw1NiwwLAotICAgIDEwMCw1NywwLDEzMiwwLDAsOTAsMzEsMCwxMDAsNTgsMCwxMDAsNTksMCwxMzIsCi0gICAgMCwwLDkwLDMyLDAsNzEsMTAwLDYwLDAsMTAwLDYxLDAsMTMyLDAsMCwxMDAsCi0gICAgNjEsMCwxMzEsMiwwLDkwLDMzLDAsNzEsMTAwLDYyLDAsMTAwLDYzLDAsMTMyLAotICAgIDAsMCwxMDAsNjMsMCwxMzEsMiwwLDkwLDM0LDAsNzEsMTAwLDY0LDAsMTAwLAotICAgIDY1LDAsMTMyLDAsMCwxMDAsNjUsMCwxMzEsMiwwLDkwLDM1LDAsMTAwLDY2LAotICAgIDAsMTAwLDY3LDAsMTMyLDAsMCw5MCwzNiwwLDEwMCw2OCwwLDEwMCw2OSwwLAotICAgIDEzMiwwLDAsOTAsMzcsMCwxMDAsMSwwLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwKLSAgICAxLDAsOTAsMzgsMCwxMDAsNzIsMCwxMDAsNzMsMCwxMzIsMCwwLDkwLDM5LAotICAgIDAsMTAwLDc0LDAsOTAsNDAsMCwxMDEsNDAsMCwxMDAsNzUsMCwyMyw5MCw0MSwKLSAgICAwLDEwMCw3NiwwLDEwMCw3NywwLDEzMiwwLDAsOTAsNDIsMCwxMDAsNzgsMCwKLSAgICAxMDAsNzksMCwxMzIsMCwwLDkwLDQzLDAsMTAwLDEsMCwxMDAsODAsMCwxMDAsCi0gICAgODEsMCwxMDAsODIsMCwxMzIsMiwwLDkwLDQ0LDAsMTAwLDgzLDAsMTAwLDg0LAotICAgIDAsMTMyLDAsMCw5MCw0NSwwLDEwMCw4NSwwLDEwMCw4NiwwLDEzMiwwLDAsCi0gICAgOTAsNDYsMCwxMDAsMSwwLDEwMCwxLDAsMTAyLDAsMCwxMDAsODAsMCwxMDAsCi0gICAgODcsMCwxMDAsODgsMCwxMzIsNCwwLDkwLDQ3LDAsMTAwLDg5LDAsMTAwLDkwLAotICAgIDAsMTMyLDAsMCw5MCw0OCwwLDEwMCw5MSwwLDEwMCw5MiwwLDEzMiwwLDAsCi0gICAgOTAsNDksMCwxMDAsOTMsMCwxMDAsOTQsMCwxMzIsMCwwLDkwLDUwLDAsMTAwLAotICAgIDEsMCw4Myw0MSw5NSw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsCi0gICAgMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwKLSAgICAxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LAotICAgIDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLAotICAgIDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsCi0gICAgMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwKLSAgICAxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LAotICAgIDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsCi0gICAgMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsCi0gICAgMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsCi0gICAgMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsOTIsMCwwLDAsMTIwLDY2LDAsMTAwLDEsMCwxMDAsMiwKLSAgICAwLDEwMCwzLDAsMTAwLDQsMCwxMDMsNCwwLDY4LDkzLDQ2LDAsMTI1LDIsCi0gICAgMCwxMTYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNCwxOSwwLAotICAgIDExNiwxLDAsMTI0LDAsMCwxMjQsMiwwLDExNiwyLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTMxLDMsMCwxLDExMywxOSwwLDg3LDEyNCwwLDAsCi0gICAgMTA2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDMsMCwxMzEsMSwwLDEsCi0gICAgMTAwLDUsMCw4Myw0MSw2LDEyMiw0Nyw4MywxMDUsMTA5LDExMiwxMDgsMTAxLDMyLDExNSwKLSAgICAxMTcsOTgsMTE1LDExNiwxMDUsMTE2LDExNywxMTYsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEwMiwxMTcsCi0gICAgMTEwLDk5LDExNiwxMTEsMTExLDEwOCwxMTUsNDYsMTE3LDExMiwxMDAsOTcsMTE2LDEwMSw5NSwxMTksCi0gICAgMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0NiwyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLDk1LAotICAgIDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LDEwMCwKLSAgICAxMTEsOTksOTUsOTUsNzgsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LAotICAgIDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwKLSAgICAxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsCi0gICAgMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsCi0gICAgMjE4LDcsMTE0LDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxNjksMCwxMTQsMTAsMCwwLDAsCi0gICAgMjUwLDI5LDYwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDEwOCwxMDUsOTgsNDYsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDYyLDIxOCwKLSAgICA1LDk1LDExOSwxMTQsOTcsMTEyLDI3LDAsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMiwyNSwxLDE1LDEsMjksMSwxMTQsMTIsMCwwLDAsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCwxMTYsMTIxLDExMiwKLSAgICAxMDEsMjE4LDMsMTE1LDEyMSwxMTUsNDEsMSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEwLDEwMSwxMTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzUsMCwwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwxLDExNCwxNiwwLDAsMCw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA1OCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LAotICAgIDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDgzLDQxLDksCi0gICAgMjE4LDEzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCwxMjIsCi0gICAgNjMsNzcsOTcsMTEwLDk3LDEwMywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTEsMTE1LAotICAgIDExNSwxMDUsOTgsMTA4LDEwMSwzMiw5OSwxMDgsMTAxLDk3LDExMCw0NSwxMTcsMTEyLDMyLDExMSwKLSAgICAxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDQ2LAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDEsMjE4LDUsOTUsMTEwLAotICAgIDk3LDEwOSwxMDEsNDEsMiwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKLSAgICA4LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MywwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsCi0gICAgMTExLDk3LDEwMCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMjUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDExNiwxLDAsMTA2LAotICAgIDIsMCwxMDcsNiwwLDEyNCwwLDAsOTUsMywwLDEwMCwwLDAsODMsNDEsCi0gICAgMSw3OCw0MSw0LDExNCwxOCwwLDAsMCwxMTQsMTQsMCwwLDAsMjE4LDcsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwxMCw5NSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LAotICAgIDExMSw5NywxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksOTUsOTUsMTAxLDExMCwxMTYsCi0gICAgMTAxLDExNCw5NSw5NSw0NiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLAotICAgIDIzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDExLDAsMCwwLDcxLDAsMCwwLDExNSw3NywwLAotICAgIDAsMCwxMTYsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwxLAotICAgIDAsNjgsMTMxLDEsMCwxMzEsMSwwLDExNCw3MywwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMiwxMTQsNzMsMCwxMjEsMTcsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDAsCi0gICAgMCwxMDYsNCwwLDYxLDg3LDExMCwxOCwwLDQsMTE2LDUsMCwxMDcsMTAsMCwKLSAgICAxMTQsNzIsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsCi0gICAgMyw3OCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDExNSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LDAsMCw5MywKLSAgICAxNywwLDEyNSwxLDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw5LDAsODYsMSwKLSAgICAxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsMTAsMCwwLDAsNDEsCi0gICAgMiwyMTgsMiw0Niw0OCwyMTgsMyw5NywxMTQsMTAzLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwKLSAgICAxMjAsMTEyLDExNCw2Miw1MCwwLDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDQxLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAotICAgIDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2Miw0MSw2LDIxOCwzLDk3LDExMCwKLSAgICAxMjEsMTE0LDIyLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDE4LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw4LDk1LDk1LDEwMSwKLSAgICAxMjAsMTA1LDExNiw5NSw5NSw0OSwwLDAsMCwxMTUsMTAsMCwwLDAsMCwxLAotICAgIDM1LDEsMywxLDE3LDEsMTMsMSwxMjIsMjIsOTUsNzcsOTcsMTEwLDk3LDEwMywKLSAgICAxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSwKLSAgICA3OCw0MSw3LDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsCi0gICAgMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsMjMsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTcsMCwwLDAsMzksCi0gICAgMCwwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsMywxMiwzLAotICAgIDExNCwxNywwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDEsCi0gICAgMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMjE4LDE0LDk1LDY4LDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDc4LDQxLDMsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwzMSwwLDAsMCw2NCwwLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwxMiwxLDExNCwzMSwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSw4MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLAotICAgIDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsCi0gICAgMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLAotICAgIDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDEwMCwKLSAgICA5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsCi0gICAgMCw5MCw4LDAsMTAwLDEyLDAsODMsNDEsMTMsMjE4LDExLDk1LDc3LDExMSwxMDAsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsMjE2LDEsMCwwLDEwMCwwLDkwLDAsMTAwLDEsCisgICAgOTcsMSwxMDAsMiwxMDAsMywxMzIsMCw5MCwyLDEwMCw0LDEwMCw1LDEzMiwwLAorICAgIDkwLDMsNzEsMCwxMDAsNiwxMDAsNywxMzIsMCwxMDAsNywxMzEsMiw5MCw0LAorICAgIDEwNSwwLDkwLDUsMTA1LDAsOTAsNiw3MSwwLDEwMCw4LDEwMCw5LDEzMiwwLAorICAgIDEwMCw5LDEwMSw3LDEzMSwzLDkwLDgsNzEsMCwxMDAsMTAsMTAwLDExLDEzMiwwLAorICAgIDEwMCwxMSwxMzEsMiw5MCw5LDcxLDAsMTAwLDEyLDEwMCwxMywxMzIsMCwxMDAsMTMsCisgICAgMTMxLDIsOTAsMTAsNzEsMCwxMDAsMTQsMTAwLDE1LDEzMiwwLDEwMCwxNSwxMzEsMiwKKyAgICA5MCwxMSwxMDAsMTYsMTAwLDE3LDEzMiwwLDkwLDEyLDEwMCwxOCwxMDAsMTksMTMyLDAsCisgICAgOTAsMTMsMTAwLDIwLDEwMCwyMSwxMzIsMCw5MCwxNCwxMDAsMjIsMTAwLDIzLDE1NiwxLAorICAgIDEwMCwyNCwxMDAsMjUsMTMyLDIsOTAsMTUsMTAwLDI2LDEwMCwyNywxMzIsMCw5MCwxNiwKKyAgICAxMDAsMjgsMTAwLDI5LDEzMiwwLDkwLDE3LDEwMCwzMCwxMDAsMzEsMTMyLDAsOTAsMTgsCisgICAgMTAwLDMyLDEwMCwzMywxMzIsMCw5MCwxOSw3MSwwLDEwMCwzNCwxMDAsMzUsMTMyLDAsCisgICAgMTAwLDM1LDEzMSwyLDkwLDIwLDcxLDAsMTAwLDM2LDEwMCwzNywxMzIsMCwxMDAsMzcsCisgICAgMTMxLDIsOTAsMjEsMTAwLDEsMTAwLDEsMTAwLDM4LDE1NiwyLDEwMCwzOSwxMDAsNDAsCisgICAgMTMyLDIsOTAsMjIsMTAxLDIzLDEzMSwwLDkwLDI0LDEwMCw5NCwxMDAsNDEsMTAwLDQyLAorICAgIDEzMiwxLDkwLDI1LDEwMCw0MywxMDAsNDQsMTU2LDEsMTAwLDQ1LDEwMCw0NiwxMzIsMiwKKyAgICA5MCwyNiwxMDAsNDcsMTAwLDQ4LDEzMiwwLDkwLDI3LDEwMCw0OSwxMDAsNTAsMTMyLDAsCisgICAgOTAsMjgsMTAwLDUxLDEwMCw1MiwxMzIsMCw5MCwyOSwxMDAsNTMsMTAwLDU0LDEzMiwwLAorICAgIDkwLDMwLDEwMCw1NSwxMDAsNTYsMTMyLDAsOTAsMzEsMTAwLDU3LDEwMCw1OCwxMzIsMCwKKyAgICA5MCwzMiw3MSwwLDEwMCw1OSwxMDAsNjAsMTMyLDAsMTAwLDYwLDEzMSwyLDkwLDMzLAorICAgIDcxLDAsMTAwLDYxLDEwMCw2MiwxMzIsMCwxMDAsNjIsMTMxLDIsOTAsMzQsNzEsMCwKKyAgICAxMDAsNjMsMTAwLDY0LDEzMiwwLDEwMCw2NCwxMzEsMiw5MCwzNSwxMDAsNjUsMTAwLDY2LAorICAgIDEzMiwwLDkwLDM2LDEwMCw2NywxMDAsNjgsMTMyLDAsOTAsMzcsMTAwLDk1LDEwMCw2OSwKKyAgICAxMDAsNzAsMTMyLDEsOTAsMzgsMTAwLDcxLDEwMCw3MiwxMzIsMCw5MCwzOSwxMDAsNzMsCisgICAgOTAsNDAsMTAxLDQwLDEwMCw3NCwyMywwLDkwLDQxLDEwMCw3NSwxMDAsNzYsMTMyLDAsCisgICAgOTAsNDIsMTAwLDc3LDEwMCw3OCwxMzIsMCw5MCw0MywxMDAsOTYsMTAwLDgwLDEwMCw4MSwKKyAgICAxMzIsMSw5MCw0NCwxMDAsODIsMTAwLDgzLDEzMiwwLDkwLDQ1LDEwMCw4NCwxMDAsODUsCisgICAgMTMyLDAsOTAsNDYsMTAwLDEsMTAwLDEsMTAyLDAsMTAwLDc5LDEwMiw0LDEwMCw4NiwKKyAgICAxMDAsODcsMTMyLDEsOTAsNDcsMTAwLDg4LDEwMCw4OSwxMzIsMCw5MCw0OCwxMDAsOTAsCisgICAgMTAwLDkxLDEzMiwwLDkwLDQ5LDEwMCw5MiwxMDAsOTMsMTMyLDAsOTAsNTAsMTAwLDEsCisgICAgODMsMCw0MSw5Nyw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsMTEwLAorICAgIDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsCisgICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LDk3LAorICAgIDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLAorICAgIDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsMTEwLAorICAgIDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwxMDAsCisgICAgMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsCisgICAgMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LDExNSwKKyAgICAxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwzMiwKKyAgICAxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LAorICAgIDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsMTE5LAorICAgIDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCisgICAgMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwxMDUsCisgICAgMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNjAsMCwwLDAsMTIwLDQwLDEwMCw2LDY4LDAsOTMsMzIsMTI1LAorICAgIDIsMTE2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTE0LDYsMTE2LDEsMTI0LDAsMTI0LAorICAgIDIsMTE2LDIsMTI0LDEsMTI0LDIsMTMxLDIsMTMxLDMsMSwwLDExMyw2LDg3LAorICAgIDAsMTI0LDAsMTA2LDMsMTA2LDQsMTI0LDEsMTA2LDMsMTMxLDEsMSwwLDEwMCwKKyAgICA1LDgzLDAsNDEsNywxMjIsNDcsODMsMTA1LDEwOSwxMTIsMTA4LDEwMSwzMiwxMTUsMTE3LAorICAgIDk4LDExNSwxMTYsMTA1LDExNiwxMTcsMTE2LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDIsMTE3LDExMCwKKyAgICA5OSwxMTYsMTExLDExMSwxMDgsMTE1LDQ2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsOTUsMTE5LDExNCwKKyAgICA5NywxMTIsMTEyLDEwMSwxMTQsNDYsMjE4LDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDk1LDk1LDIxOCw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwxMiw5NSw5NSwKKyAgICAxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwxMDAsMTExLAorICAgIDk5LDk1LDk1LDc4LDQxLDQsMTIyLDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDk1LDk1LDEyMiw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiwxMiw5NSw5NSwKKyAgICAxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwxMjIsNyw5NSw5NSwxMDAsMTExLAorICAgIDk5LDk1LDk1LDQxLDUsMjE4LDcsMTA0LDk3LDExNSw5NywxMTYsMTE2LDExNCwyMTgsNywKKyAgICAxMTUsMTAxLDExNiw5NywxMTYsMTE2LDExNCwyMTgsNywxMDMsMTAxLDExNiw5NywxMTYsMTE2LDExNCwKKyAgICAyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LDExNiw5NSw5NSwyMTgsNiwxMTcsMTEyLDEwMCw5NywKKyAgICAxMTYsMTAxLDQxLDMsOTAsMywxMTAsMTAxLDExOSw5MCwzLDExMSwxMDgsMTAwLDIxOCw3LAorICAgIDExNCwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTY5LDAsMTE0LDEwLDAsMCwwLDI1MCwyOSwKKyAgICA2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw2MiwyMTgsNSw5NSwKKyAgICAxMTksMTE0LDk3LDExMiwyNywwLDAsMCwxMTUsOCwwLDAsMCwwLDIsMTAsCisgICAgMSwxMCwxLDIyLDEsMTE0LDEyLDAsMCwwLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDEyLDAsMCwwLDExNiwwLDExNiwxLDEzMSwxLDEyNCwwLDEzMSwxLDgzLDAsCisgICAgNDEsMSw3OCw0MSwyLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsMywxMTUsMTIxLDExNSwKKyAgICA0MSwxLDIxOCw0LDExMCw5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxMSw5NSwxMTAsMTAxLDExOSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzNSwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTE0LAorICAgIDE2LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDQwLDAsMCwwLDEwMSwwLAorICAgIDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLAorICAgIDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiwxMDAsNywxMzIsMCwKKyAgICA5MCw2LDEwMCw4LDgzLDAsNDEsOSwyMTgsMTMsOTUsNzcsOTcsMTEwLDk3LDEwMywKKyAgICAxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDEyMiw2Myw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTUsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDk5LDEwOCwKKyAgICAxMDEsOTcsMTEwLDQ1LDExNywxMTIsMzIsMTExLDEwMiwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTA4LDExMSw5NywxMDAsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsNDYsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwKKyAgICAwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMDAsMCw4MywwLDQxLDEsNzgsNDEsCisgICAgMSwyMTgsNSw5NSwxMTAsOTcsMTA5LDEwMSw0MSwyLDIxOCw0LDExNSwxMDEsMTA4LDEwMiwKKyAgICAxMTQsMTUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDgsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQzLDAsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjIsOTUsNzcsOTcsMTEwLDk3LAorICAgIDEwMywxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSwKKyAgICA5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMjQsMCwxMDYsMCwxMTYsCisgICAgMSwxMDYsMiwxMDcsNiwxMjQsMCw5NSwzLDEwMCwwLDgzLDAsNDEsMSw3OCwKKyAgICA0MSw0LDExNCwxOCwwLDAsMCwxMTQsMTQsMCwwLDAsMjE4LDcsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwxMCw5NSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LDExMSw5NywKKyAgICAxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksOTUsOTUsMTAxLDExMCwxMTYsMTAxLDExNCwKKyAgICA5NSw5NSw0NiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIzLDk1LAorICAgIDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSw5NSwxMDEsCisgICAgMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDExLDAsMCwwLDcxLDAsMCwwLDExNSw2NiwwLDAsMCwKKyAgICAxMTYsMCwxMDAsMSwxMDAsMiwxMzIsMCwxMjQsMSw2OCwwLDEzMSwxLDEzMSwxLAorICAgIDExNCw2MiwxMjQsMCwxMDYsMSwxMiwwLDExNCw2MiwxMjEsMTQsMTE2LDIsMTA2LDMsCisgICAgMTI0LDAsMTA2LDQsNjEsMCw4NywwLDExMCwyMCw0LDAsMTE2LDUsMTA3LDEwLAorICAgIDExNCw2MCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTAwLDAsCisgICAgODMsMCw0MSwzLDc4LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDMsMCwwLDAsMTE1LDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsCisgICAgMCw5MywxNCwxMjUsMSwxMjQsMSwxMDAsMCwxMDcsOSw4NiwwLDEsMCwxMTMsCisgICAgMiwxMDAsMCw4MywwLDQxLDEsNzgsMTE0LDEwLDAsMCwwLDQxLDIsMjE4LAorICAgIDIsNDYsNDgsMjE4LDMsOTcsMTE0LDEwMywxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyNTAsOSw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwKKyAgICAxMTQsNjIsNTAsMCwwLDAsMTE1LDIsMCwwLDAsNCwwLDEyMiw0MSw5NSwKKyAgICA3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LDExMSw5NywxMDAsNDYsOTUsOTUsMTAxLAorICAgIDEyMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwKKyAgICAxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNDEsNiwyMTgsMyw5NywxMTAsMTIxLDExNCwKKyAgICAyMiwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCwxOCwKKyAgICAwLDAsMCwyMTgsOCw3NSwxMDEsMTIxLDY5LDExNCwxMTQsMTExLDExNCw0MSwyLDExNCwKKyAgICAxOSwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMDEsMTIwLDEwNSwKKyAgICAxMTYsOTUsOTUsNDksMCwwLDAsMTE1LDEwLDAsMCwwLDAsMSwyNiwxLAorICAgIDIsMSwxNCwxLDE0LDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLAorICAgIDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsCisgICAgNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKKyAgICAxMTQsMywwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsMCwwLDExNCwKKyAgICAzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE3LDAsMCwwLDM5LDAsMCwKKyAgICAwLDExNSw4LDAsMCwwLDgsMiw0LDIsOCwzLDgsMywxMTQsMTcsCisgICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMSwwLDAsMCw2NCwwLDAsMCwxMTUsMTIsMCwwLDAsMTAxLDAsOTAsCisgICAgMSwxMDAsMCw5MCwyLDEwMCwxLDgzLDAsNDEsMiwyMTgsMTQsOTUsNjgsMTAxLAorICAgIDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LDExMSwxMTQsNzgsNDEsMywxMTQsMSwKKyAgICAwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAorICAgIDAsMTE0LDMxLDAsMCwwLDY0LDAsMCwwLDExNSwyLDAsMCwwLDgsCisgICAgMSwxMTQsMzEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNTYsMCwwLDAsCisgICAgMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsCisgICAgMTMyLDAsOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LAorICAgIDEzMiwwLDkwLDYsMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsMTAwLDExLAorICAgIDEzMiwwLDkwLDgsMTAwLDEyLDgzLDAsNDEsMTMsMjE4LDExLDk1LDc3LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsMTY5LDY1LDMyLDExNCwxMDEsOTksMTE3LDExNCwKICAgICAxMTUsMTA1LDExOCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCiAgICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsCkBAIC0xNzgsMTYyICsxNjEsMTUxIEBACiAgICAgMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTYsOTcsMTA3LDEwMSwzMiwxMDgsMTExLDk5LAogICAgIDEwNywxMTUsMzIsNjYsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDY1LDQxLDQ2LDEwLDMyLDMyLAogICAgIDMyLDMyLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDcwLDAsMCwwLDExNiwwLDAsMTA2LAotICAgIDEsMCwxMzEsMCwwLDEyNCwwLDAsOTUsMiwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSw0LDAsMTAwLDAsMCwxMjQsMCwwLDk1LDUsMCwxMDAsMSwwLDEyNCwKLSAgICAwLDAsOTUsNiwwLDEwMCwxLDAsMTI0LDAsMCw5NSw3LDAsMTAwLDAsCi0gICAgMCw4Myw0MSwyLDc4LDIzMywwLDAsMCwwLDQxLDgsMjE4LDcsOTUsMTE2LAotICAgIDEwNCwxMTQsMTAxLDk3LDEwMCw5MCwxMyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTAxLDk1LAotICAgIDEwOCwxMTEsOTksMTA3LDIxOCw0LDEwOCwxMTEsOTksMTA3LDIxOCw2LDExOSw5NywxMDcsMTAxLAotICAgIDExNywxMTIsMTE0LDE1LDAsMCwwLDIxOCw1LDExMSwxMTksMTEwLDEwMSwxMTQsMjE4LDUsCi0gICAgOTksMTExLDExNywxMTAsMTE2LDIxOCw3LDExOSw5NywxMDUsMTE2LDEwMSwxMTQsMTE1LDQxLDIsCi0gICAgMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsNzQsMCwKLSAgICAwLDAsMTE1LDEyLDAsMCwwLDAsMSwxNSwxLDE1LDEsOSwxLDksCi0gICAgMSw5LDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKLSAgICA0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDQsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsODgsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDEsMCwxMjQsCi0gICAgMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjAsNjAsMCwxMTYsMywwLDEwNiw0LAotICAgIDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsMCwwLAotICAgIDEwNyw4LDAsMTE0LDU1LDAsMTAwLDEsMCw4MywxMjQsMywwLDEwNiwyLDAsCi0gICAgMTI1LDIsMCwxMjQsMiwwLDEyNCwxLDAsMTA3LDIsMCwxMTQsMjQsMCwxMDAsCi0gICAgMiwwLDgzLDExMywyNCwwLDg3LDEwMCwwLDAsODMsNDEsMyw3OCw3MCw4NCwKLSAgICA0MSw1LDExNCwzNCwwLDAsMCwyMTgsOSwxMDMsMTAxLDExNiw5NSwxMDUsMTAwLDEwMSwKLSAgICAxMTAsMTE2LDExNCwzNywwLDAsMCwyMTgsMTIsOTUsOTgsMTA4LDExMSw5OSwxMDcsMTA1LAotICAgIDExMCwxMDMsOTUsMTExLDExMCwyMTgsMywxMDMsMTAxLDExNiw0MSw0LDExNCwxOSwwLDAsCi0gICAgMCw5MCwyLDEwOSwxMDEsMjE4LDMsMTE2LDEwNSwxMDAsMTE0LDM1LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMiwKLSAgICAxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDgyLDAsMCwwLAotICAgIDExNSwxOCwwLDAsMCwwLDIsMTIsMSw5LDEsMywxLDE1LDEsMTIsCi0gICAgMSw0LDEsOSwxLDEyLDEsMTIyLDI0LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzYsMTExLDk5LDEwNyw0NiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksCi0gICAgMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDE2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwyMTAsMCwwLDAsMTE2LDAsMCwxMDYsMSwKLSAgICAwLDEzMSwwLDAsMTI1LDEsMCwxMjQsMCwwLDExNiwyLDAsMTI0LDEsMCwKLSAgICA2MCwxMjIsMTczLDAsMTIwLDE2NiwwLDEyNCwwLDAsMTA2LDMsMCwxNDMsMTI0LDAsCi0gICAgMSwxMjQsMCwwLDEwNiw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNSw2OCwwLAotICAgIDEyNCwwLDAsMTA2LDUsMCwxMjQsMSwwLDEwNywyLDAsMTE0LDk2LDAsMTI0LAotICAgIDEsMCwxMjQsMCwwLDk1LDUsMCwxMjQsMCwwLDQsMTA2LDQsMCwxMDAsCi0gICAgMiwwLDU1LDIsOTUsNCwwLDEwMCwzLDAsODMsMTI0LDAsMCwxMDYsNiwKLSAgICAwLDEzMSwwLDAsMTE0LDEyNCwwLDExNiw3LDAsMTAwLDQsMCwxMjQsMCwwLAotICAgIDIyLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwKLSAgICAxMDAsNSwwLDEzMSwxLDAsMTE0LDE1NywwLDEyNCwwLDAsNCwxMDYsMTAsMCwKLSAgICAxMDAsMiwwLDU1LDIsOTUsMTAsMCw4NywxMDAsNiwwLDgxLDgyLDg4LDEyNCwKLSAgICAwLDAsMTA2LDgsMCwxMDYsOSwwLDEzMSwwLDAsMSwxMjQsMCwwLDEwNiwKLSAgICA4LDAsMTA2LDExLDAsMTMxLDAsMCwxLDExMywyOCwwLDg3LDg3LDEwMCw2LAotICAgIDAsMTE2LDIsMCwxMjQsMSwwLDYxLDg4LDEwMCw2LDAsODMsNDEsNywxMjIsCi0gICAgMTg1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDY1LDk5LDExMywxMTcsMTA1LDExNCwKLSAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5OSwKLSAgICAxMDcsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSwKLSAgICA5NywxMDgsMzIsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiwxMDAsCi0gICAgMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsOTcsMzIsOTUsNjgsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiw5NywxMDgsMTE5LDk3LAotICAgIDEyMSwxMTUsMzIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICA4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsCi0gICAgNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDMzLDAsMCwwLDIzMywKLSAgICAxLDAsMCwwLDg0LDEyMiwyMywxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywzMiwKLSAgICAxMDAsMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDM3LDExNCw3MCw3OCwKLSAgICA0MSwxMiwxMTQsMzQsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw0MSwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCwzNywwLDAsMCwKLSAgICAxMTQsNDQsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwzNiwwLDAsMCwyMTgsCi0gICAgNyw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNCwzOSwwLDAsMCwyMTgsNywxMTQsCi0gICAgMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDQ2LDAsMCwwLDk0LDAsMCwwLDExNSwzMiwwLDAsMCwwLAotICAgIDYsMTIsMSwxMCwxLDMsMSwzLDEsMTAsMSwzMCwxLDksMSwxNSwKLSAgICAxLDQsMSwxMiwxLDE2LDEsMTgsMSwyMiwyLDEzLDEsMjEsMiwxMjIsCi0gICAgMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDE1NywwLDAsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDEyNCwwLDAsMTA2LDIsMCwKLSAgICAxNDMsMTI5LDAsMSwxMjQsMCwwLDEwNiwzLDAsMTI0LDEsMCwxMDcsMywwLAotICAgIDExNCw0OSwwLDExNiw0LDAsMTAwLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LAotICAgIDAsMCwxMDYsNSwwLDEwMCwyLDAsMTA3LDQsMCwxMTUsNzAsMCwxMTYsNiwKLSAgICAwLDEzMCwxLDAsMTI0LDAsMCw0LDEwNiw1LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDUsMCwxMjQsMCwwLDEwNiw1LDAsMTAwLDIsMCwxMDcsMiwwLDExNCwKLSAgICAxNDYsMCwxMDAsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwwLDAsMTA2LDcsCi0gICAgMCwxMTQsMTQ2LDAsMTI0LDAsMCw0LDEwNiw3LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDcsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwxMzEsMCwwLDEsCi0gICAgODcsMTAwLDAsMCw4MSw4Miw4OCwxMDAsMCwwLDgzLDQxLDQsNzgsMTIyLDMxLAotICAgIDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTcsCi0gICAgMTEwLDQ1LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAzMywwLDAsMCwxMTQsNDUsMCwwLDAsNDEsMTAsMTE0LDM0LDAsMCwwLAotICAgIDExNCw0MCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCwKLSAgICAxMiw4MiwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDM4LDAsCi0gICAgMCwwLDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwxMTQsMzksMCwwLDAsMTE0LDM2LDAsMCwwLDExNCw0NywwLDAsCi0gICAgMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ3LDAsMCwKLSAgICAwLDExOSwwLDAsMCwxMTUsMjIsMCwwLDAsMCwxLDEyLDEsMTAsMSwKLSAgICAxNSwxLDEyLDEsMjEsMSwxNSwxLDE1LDEsOSwxLDksMSwxNSwxLAotICAgIDEyMiwxOSw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsMTE0LDEwMSwKLSAgICAxMDgsMTAxLDk3LDExNSwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMjUsMCwwLDAsMTAwLAotICAgIDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMTYsMiwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCwxMzEsMiwwLDgzLDQxLDIsNzgsMTIyLDIzLDk1LDc3LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywKLSAgICAxMTYsMzIsMTIzLDEyNSw0MSwzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE0LDE1LAotICAgIDAsMCwwLDIxOCwyLDEwNSwxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsOTUsCi0gICAgOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDEzMiwwLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwKLSAgICA5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNzgsNDEsOSwxMTQsMSwwLDAsMCwKLSAgICAxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwxMTQsCi0gICAgMjAsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsNDcsCi0gICAgMCwwLDAsMTE0LDUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzIsMCwwLAotICAgIDAsNjgsMCwwLDAsMTE1LDEyLDAsMCwwLDEyLDQsNiwyLDEyLDgsCi0gICAgMTIsMTIsMTIsMjUsMTIsMTMsMTE0LDMyLDAsMCwwLDk5LDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsCi0gICAgMTE1LDcwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwKLSAgICAwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLAotICAgIDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsMTAwLAotICAgIDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsMTAwLDksCi0gICAgMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCw4Myw0MSwxMSwyMTgsMTYsOTUsCi0gICAgNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsCi0gICAgODYsNjUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsMzIsOTUsNzcsMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw3NiwxMTEsOTksMTA3LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTAwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMTExLDExNywxMTYsMTAsMzIsMzIsMzIsMzIsMTA5LAotICAgIDExNywxMDgsMTE2LDEwNSw0NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwKLSAgICAxMTcsMTEyLDExMiwxMTEsMTE0LDExNiw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsCi0gICAgMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwwLDEwMCwxLDAsMTI0LDAsMCwKLSAgICA5NSwxLDAsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwzMywwLDAsMCw0MSwKLSAgICAyLDExNCwxNSwwLDAsMCwxMTQsMzgsMCwwLDAsNDEsMiwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNDAsMCwwLDAsMTE1LAotICAgIDQsMCwwLDAsMCwxLDksMSwxMjIsMjUsOTUsNjgsMTE3LDEwOSwxMDksMTIxLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMTYsMCwxMDYsMSwKKyAgICAxMzEsMCwxMjQsMCw5NSwyLDExNiwwLDEwNiwxLDEzMSwwLDEyNCwwLDk1LDMsCisgICAgMTI0LDEsMTI0LDAsOTUsNCwxMDAsMCwxMjQsMCw5NSw1LDEwMCwxLDEyNCwwLAorICAgIDk1LDYsMTAwLDEsMTI0LDAsOTUsNywxMDAsMCw4MywwLDQxLDIsNzgsMjMzLAorICAgIDAsMCwwLDAsNDEsOCwyMTgsNyw5NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDkwLAorICAgIDEzLDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMjE4LDQsCisgICAgMTA4LDExMSw5OSwxMDcsMjE4LDYsMTE5LDk3LDEwNywxMDEsMTE3LDExMiwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDUsMTExLDExOSwxMTAsMTAxLDExNCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMjE4LAorICAgIDcsMTE5LDk3LDEwNSwxMTYsMTAxLDExNCwxMTUsNDEsMiwxMTQsMTksMCwwLDAsMTE0LAorICAgIDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDExNCwyMCwwLDAsMCw3NCwwLDAsMCwxMTUsMTIsMCwwLAorICAgIDAsMCwxLDEwLDEsMTAsMSw2LDEsNiwxLDYsMSwxMjIsMjAsOTUsCiAgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAotICAgIDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKLSAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLDAsMCwxMjQsMCwwLAotICAgIDQsMTA2LDAsMCwxMDAsMSwwLDU1LDIsOTUsMCwwLDEwMCwyLDAsODMsCi0gICAgNDEsMyw3OCwxMTQsNDUsMCwwLDAsODQsNDEsMSwxMTQsMzgsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMTE0LDQ2LDAsMCwwLDE0NCwwLDAsMCwxMTUsCi0gICAgNCwwLDAsMCwwLDEsMTUsMSwxMjIsMjQsOTUsNjgsMTE3LDEwOSwxMDksMTIxLAotICAgIDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsMTE3LDEwNSwKLSAgICAxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQ2LDAsMCwwLDEyNCwwLDAsMTA2LAotICAgIDAsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDI3LDAsMTE2LDEsMCwxMDAsMiwKLSAgICAwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDQsMTA2LDAsMCwxMDAsMywKLSAgICAwLDU2LDIsOTUsMCwwLDEwMCwwLDAsODMsNDEsNCw3OCwxMTQsMzMsMCwKLSAgICAwLDAsMTIyLDMxLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsCi0gICAgMTE1LDEwMSwzMiwxMTcsMTEwLDQ1LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwKLSAgICAxMTEsOTksMTA3LDExNCw0NSwwLDAsMCw0MSwyLDExNCwzOCwwLDAsMCwxMTQsCi0gICAgNDgsMCwwLDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ3LDAsMCwwLDE0OCwKLSAgICAwLDAsMCwxMTUsNiwwLDAsMCwwLDEsMTUsMSwxMiwxLDEyMiwyNCwKLSAgICA5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAotICAgIDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDI1LDAsCi0gICAgMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTE2LDIsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsMCw4Myw0MSwyLDc4LDEyMiwyOCwKKyAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCisgICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNjQsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTMxLDAsMTI1LDEsMTI0LDAsMTA2LDIsMTI1LDIsMTIwLDQ0LDExNiwzLDEwNiwKKyAgICA0LDEyNCwyLDEzMSwxLDEyNSwzLDEyNCwzLDEwMCwwLDEwNyw4LDExNCwzOCwxMDAsCisgICAgMSw4MywwLDEyNCwzLDEwNiwyLDEyNSwyLDEyNCwyLDEyNCwxLDEwNywyLDExNCwKKyAgICAxNiwxMDAsMiw4MywwLDExMywxNiw4NywwLDEwMCwwLDgzLDAsNDEsMyw3OCwKKyAgICA3MCw4NCw0MSw1LDExNCwzNCwwLDAsMCwyMTgsOSwxMDMsMTAxLDExNiw5NSwxMDUsCisgICAgMTAwLDEwMSwxMTAsMTE2LDExNCwzNywwLDAsMCwyMTgsMTIsOTUsOTgsMTA4LDExMSw5OSwKKyAgICAxMDcsMTA1LDExMCwxMDMsOTUsMTExLDExMCwyMTgsMywxMDMsMTAxLDExNiw0MSw0LDExNCwxOSwKKyAgICAwLDAsMCw5MCwyLDEwOSwxMDEsMjE4LDMsMTE2LDEwNSwxMDAsMTE0LDM1LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDIxOCwxMiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDgyLDAsCisgICAgMCwwLDExNSwxOCwwLDAsMCwwLDIsOCwxLDYsMSwyLDEsMTAsCisgICAgMSw4LDEsNCwxLDYsMSw4LDEsMTIyLDI0LDk1LDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwKKyAgICAxMTEsOTksMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDE2LDAsMCwwLDY3LDAsMCwwLDExNSwxNjgsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTMxLDAsMTI1LDEsMTI0LDAsMTE2LDIsMTI0LDEsNjAsMCwxMjIsMTM4LDEyMCwKKyAgICAxMzIsMTI0LDAsMTA2LDMsMTQzLDk2LDEsMCwxMjQsMCwxMDYsNCwxMDAsMSwxMDcsCisgICAgMiwxMTUsNDgsMTI0LDAsMTA2LDUsMTI0LDEsMTA3LDIsMTE0LDcyLDEyNCwxLDEyNCwKKyAgICAwLDk1LDUsMTI0LDAsNCwwLDEwNiw0LDEwMCwyLDU1LDAsMiwwLDk1LAorICAgIDQsMTAwLDMsODMsMCwxMjQsMCwxMDYsNiwxMzEsMCwxMTQsOTIsMTE2LDcsMTAwLAorICAgIDQsMTI0LDAsMjIsMCwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsOCwxMDYsOSwxMDAsCisgICAgNSwxMzEsMSwxMTQsMTE4LDEyNCwwLDQsMCwxMDYsMTAsMTAwLDIsNTUsMCwyLAorICAgIDAsOTUsMTAsODcsMCwxMDAsNiw4MSwwLDgyLDAsODgsMCwxMjQsMCwxMDYsCisgICAgOCwxMDYsOSwxMzEsMCwxLDAsMTI0LDAsMTA2LDgsMTA2LDExLDEzMSwwLDEsCisgICAgMCwxMTMsMjAsODcsMCw4NywwLDEwMCw2LDExNiwyLDEyNCwxLDYxLDAsODgsCisgICAgMCwxMDAsNiw4MywwLDQxLDcsMTIyLDE4NSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDQ2LDMyLDMyLDczLDEwMiwzMiw5NywKKyAgICAzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDMyLDEwMCwxMDEsOTcsMTAwLDEwOCwKKyAgICAxMTEsOTksMTA3LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiwxMDEsMTAwLDQ0LAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk3LDMyLDk1LDY4LDEwMSw5NywxMDAsCisgICAgMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwKKyAgICAxMTUsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OSwxMTYsMTA0LAorICAgIDEwMSwxMTQsMTE5LDEwNSwxMTUsMTAxLDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTksMTA3LAorICAgIDMyLDEwNSwxMTUsMzIsOTcsMTA4LDExOSw5NywxMjEsMTE1LDMyLDk3LDk5LDExMywxMTcsMTA1LAorICAgIDExNCwxMDEsMTAwLDMyLDk3LDExMCwxMDAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDExNSwzMiwKKyAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDExNCwzMywwLDAsMCwyMzMsMSwwLDAsMCw4NCwxMjIsMjMsMTAwLAorICAgIDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiwxMDEsMTAwLAorICAgIDMyLDk4LDEyMSwzMiwzNywxMTQsNzAsNzgsNDEsMTIsMTE0LDM0LDAsMCwwLDExNCwKKyAgICA0MCwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwzOCwKKyAgICAwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCwzMSwwLAorICAgIDAsMCwxMTQsMzYsMCwwLDAsMjE4LDcsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwKKyAgICAxMTQsMzksMCwwLDAsMjE4LDcsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsNDEsMiwKKyAgICAxMTQsMTksMCwwLDAsMTE0LDQzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0NiwwLDAsMCw5NCwwLAorICAgIDAsMCwxMTUsMzIsMCwwLDAsMCw2LDgsMSw4LDEsMiwxLDIsCisgICAgMSw4LDEsMjAsMSw2LDEsMTQsMSw0LDEsOCwxLDEyLDEsMTIsCisgICAgMSwyNCwyLDEwLDEsMTgsMiwxMjIsMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMTAsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDEyMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxMjUsMSwxMjQsMCwKKyAgICAxMDYsMiwxNDMsOTgsMSwwLDEyNCwwLDEwNiwzLDEyNCwxLDEwNywzLDExNCwzNCwKKyAgICAxMTYsNCwxMDAsMSwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsNSwxMDAsMiwxMDcsNCwKKyAgICAxMTUsNDgsMTE2LDYsMTMwLDEsMTI0LDAsNCwwLDEwNiw1LDEwMCwzLDU2LDAsCisgICAgMiwwLDk1LDUsMTI0LDAsMTA2LDUsMTAwLDIsMTA3LDIsMTE0LDEwOCwxMDAsMCwKKyAgICAxMjQsMCw5NSwzLDEyNCwwLDEwNiw3LDExNCwxMDgsMTI0LDAsNCwwLDEwNiw3LAorICAgIDEwMCwzLDU2LDAsMiwwLDk1LDcsMTI0LDAsMTA2LDgsMTA2LDksMTMxLDAsCisgICAgMSwwLDg3LDAsMTAwLDAsODEsMCw4MiwwLDg4LDAsMTAwLDAsODMsMCwKKyAgICA0MSw0LDc4LDEyMiwzMSw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLAorICAgIDk3LDExNSwxMDEsMzIsMTE3LDExMCw0NSw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwKKyAgICAxMDgsMTExLDk5LDEwNywxMTQsMzMsMCwwLDAsMTE0LDQ1LDAsMCwwLDQxLDEwLAorICAgIDExNCwzNCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKKyAgICAzNywwLDAsMCwyMTgsMTIsODIsMTE3LDExMCwxMTYsMTA1LDEwOSwxMDEsNjksMTE0LDExNCwKKyAgICAxMTEsMTE0LDExNCwzOCwwLDAsMCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwxMDUsCisgICAgMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDM5LDAsMCwwLDExNCwzNiwwLDAsCisgICAgMCwxMTQsNDcsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LDQzLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCw0NywwLDAsMCwxMTksMCwwLDAsMTE1LDIyLDAsMCwwLDAsCisgICAgMSw4LDEsOCwxLDEwLDEsOCwxLDE0LDEsMTQsMSwxMCwxLDYsCisgICAgMSw2LDEsMTQsMSwxMjIsMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsCisgICAgOTksMTA3LDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDE4LDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDExNiwyLDEyNCwwLAorICAgIDEzMSwxLDEzMSwyLDgzLDAsNDEsMiw3OCwxMjIsMjMsOTUsNzcsMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQwLDEyMywzMywxMTQsMTI1LDQxLDMyLDk3LDExNiwzMiwKKyAgICAxMjMsMTI1LDQxLDMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDIsMTA1LDEwMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsCisgICAgMTAxLDExMiwxMTQsOTUsOTUsMTMyLDAsMCwwLDExNSwyLDAsMCwwLDAsMSwKKyAgICAxMjIsMjAsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LAorICAgIDExNCwxMDEsMTEyLDExNCw5NSw5NSw3OCw0MSw5LDExNCwxLDAsMCwwLDExNCwwLAorICAgIDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLAorICAgIDAsMCwxMTQsNDQsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw0NywwLDAsCisgICAgMCwxMTQsNTIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzMiwwLDAsMCw2OCwKKyAgICAwLDAsMCwxMTUsMTIsMCwwLDAsOCw0LDQsMiw4LDgsOCwxMiwKKyAgICA4LDI1LDgsMTMsMTE0LDMyLDAsMCwwLDk5LDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDQ4LAorICAgIDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwKKyAgICAyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsCisgICAgNiwxMDAsNywxMzIsMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDcsMTAwLAorICAgIDEwLDgzLDAsNDEsMTEsMjE4LDE2LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsMTIyLDg2LDY1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsCisgICAgMTAxLDMyLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywzMiwxMDEsMTEzLAorICAgIDExNywxMDUsMTE4LDk3LDEwOCwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiw4MCwxMjEsMTE2LAorICAgIDEwNCwxMTEsMTEwLDMyLDk4LDExNywxMDUsMTA4LDEwMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LDExMSwKKyAgICAxMTcsMTE2LDEwLDMyLDMyLDMyLDMyLDEwOSwxMTcsMTA4LDExNiwxMDUsNDUsMTE2LDEwNCwxMTQsCisgICAgMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMDAsCisgICAgMSwxMjQsMCw5NSwxLDEwMCwwLDgzLDAsNDEsMiw3OCwxMTQsMzMsMCwwLAorICAgIDAsNDEsMiwxMTQsMTUsMCwwLDAsMTE0LDM4LDAsMCwwLDQxLDIsMTE0LAorICAgIDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTQwLDAsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsMSw2LDEsMTIyLDI1LDk1LDY4LDExNywxMDksCisgICAgMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTA1LAorICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEyNCwKKyAgICAwLDQsMCwxMDYsMCwxMDAsMSw1NSwwLDIsMCw5NSwwLDEwMCwyLDgzLAorICAgIDAsNDEsMyw3OCwxMTQsNDUsMCwwLDAsODQsNDEsMSwxMTQsMzgsMCwwLAorICAgIDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ2LDAsMCwwLDE0NCwwLDAsMCwKKyAgICAxMTUsNCwwLDAsMCwwLDEsMTQsMSwxMjIsMjQsOTUsNjgsMTE3LDEwOSwxMDksCisgICAgMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsMTE3LAorICAgIDEwNSwxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDEwMCwxLDEwNywyLDExNCwxOCwxMTYsMSwxMDAsMiwxMzEsMSwxMzAsMSwxMjQsCisgICAgMCw0LDAsMTA2LDAsMTAwLDMsNTYsMCwyLDAsOTUsMCwxMDAsMCw4MywKKyAgICAwLDQxLDQsNzgsMTE0LDMzLDAsMCwwLDEyMiwzMSw5OSw5NywxMTAsMTEwLDExMSwKKyAgICAxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE3LDExMCw0NSw5Nyw5OSwxMTMsCisgICAgMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwxMDgsMTExLDk5LDEwNywxMTQsNDUsMCwwLDAsNDEsCisgICAgMiwxMTQsMzgsMCwwLDAsMTE0LDQ4LDAsMCwwLDQxLDEsMTE0LDE5LDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCw0NywwLDAsMCwxNDgsMCwwLDAsMTE1LDYsMCwwLDAsMCwKKyAgICAxLDEwLDEsOCwxLDEyMiwyNCw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LAorICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDQsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwKKyAgICAxLDExNiwyLDEyNCwwLDEzMSwxLDEzMSwyLDgzLDAsNDEsMiw3OCwxMjIsMjgsCiAgICAgOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKICAgICA0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywxMTYsMzIsMTIzLDEyNSw0MSwzLDExNCw1MCwKICAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDUxLDAsMCwwLDQxLDEsMTE0LApAQCAtMzQ1LDI2MiArMzE3LDI0OSBAQAogICAgIDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LAogICAgIDQ3LDAsMCwwLDExNCw1MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAogICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUzLDAsCi0gICAgMCwwLDEzNiwwLDAsMCwxMTUsMTAsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNCwxMiw0LDEyLDUsMTE0LDUzLDAsMCwwLDk5LDAsMCwwLDAsMCwKKyAgICAwLDAsMTM2LDAsMCwwLDExNSwxMCwwLDAsMCw4LDIsNCwyLDgsCisgICAgNCw4LDQsOCw1LDExNCw1MywwLDAsMCw5OSwwLDAsMCwwLDAsCiAgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA1MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCw5MCwzLDAsMTAwLDMsMCwxMDAsCi0gICAgNCwwLDEzMiwwLDAsOTAsNCwwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMCwKLSAgICAwLDkwLDUsMCwxMDAsNywwLDgzLDQxLDgsMjE4LDE4LDk1LDc3LDExMSwxMDAsCisgICAgMzYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDEwMCwyLAorICAgIDEzMiwwLDkwLDMsMTAwLDMsMTAwLDQsMTMyLDAsOTAsNCwxMDAsNSwxMDAsNiwKKyAgICAxMzIsMCw5MCw1LDEwMCw3LDgzLDAsNDEsOCwyMTgsMTgsOTUsNzcsMTExLDEwMCwKICAgICAxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw5OSwyLAogICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwKLSAgICAwLDEwMCwwLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDAsMCw4Myw0MSwxLAotICAgIDc4LDQxLDIsMTE0LDE4LDAsMCwwLDIxOCw1LDk1LDEwOCwxMTEsOTksMTA3LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTU5LAotICAgIDAsMCwwLDExNSw0LDAsMCwwLDAsMSw5LDEsMTIyLDI3LDk1LDc3LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsCi0gICAgNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSw1MywKLSAgICAwLDAsMCwxMjIsMjIsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDEyNCwwLDAsOTUsMiwwLDg3LDEwMCwwLDAsMTE2LDMsMCwxMDYsCi0gICAgNCwwLDEzMSwwLDAsMSw4OCwxMjQsMCwwLDEwNiwyLDAsMTA2LDUsMCwKLSAgICAxMzEsMCwwLDEsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDE2LDk1LAotICAgIDEwMywxMDEsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAxOCwwLDAsMCwxMTQsNTUsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwxMTIsMjE4LAotICAgIDEyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCw0NiwwLAotICAgIDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjMsMCwwLDAsMTYzLDAsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMSwzLDEsMjIsMiwxMSwxLDEyMiwyOCwKLSAgICA5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNzcsOTcsMTEwLDk3LDEwMywKLSAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCw3OSwwLDAsCi0gICAgMCwxMTUsMTcsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTMxLAotICAgIDAsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsNDcsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsMTE0LDI5LDAsCi0gICAgMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsMCwwLDAsMTcwLDAsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzcsMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw0Niw5NSw5NSwKLSAgICAxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwxMTQsMCwKLSAgICAwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsCi0gICAgMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDU0LDAsMCwwLAotICAgIDE1NywwLDAsMCwxMTUsNiwwLDAsMCwxMiwyLDEyLDQsMTIsNywxMTQsCi0gICAgNTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsMTM5LDAsMCwwLDEwMCwxLAotICAgIDAsMTI1LDEsMCwxMjEsMTcsMCwxMTYsMCwwLDEzNiwwLDAsMjUsMTMxLDAsCi0gICAgMCwxMjUsMSwwLDg3LDExMCwxOCwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsCi0gICAgNDMsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCwxMzUsMCwxMTYsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgODMsMCwxMTYsMywwLDEzNiwwLDAsMTMxLDEsMCwxMjUsMSwwLDExMCwxMiwKLSAgICAwLDExNiw0LDAsMTM2LDAsMCwxMzEsMSwwLDEyNSwxLDAsMTM1LDAsMCwKLSAgICAxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMCwwLDEyNSwyLDAsMTE2LAotICAgIDUsMCwxMDYsNiwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNiwwLAotICAgIDAsMTM2LDAsMCw2MCwxMjQsMSwwLDgzLDQxLDQsMTIyLDEwOSw3MSwxMDEsMTE2LAotICAgIDMyLDExMSwxMTQsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LAotICAgIDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LAotICAgIDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKLSAgICAxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksCi0gICAgMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMTksMCwwLDAsCi0gICAgMTE1LDExLDAsMCwwLDExNiwwLDAsMTM2LDAsMCw2MSwxMDAsMCwwLDgzLAotICAgIDQxLDEsNzgsNDEsMSwyMTgsMTMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LAotICAgIDExMSw5OSwxMDcsMTE1LDQxLDEsMjE4LDEsOTUsNDEsMSwxMTQsMTUsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMiw5OSw5OCwxOTAsMCwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw5NSwxMDMsMTAxLDExNiw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNyw0Niw2MCwxMDgsMTExLDk5LAotICAgIDk3LDEwOCwxMTUsNjIsNDYsOTksOTgsNDEsNywxMTQsNTksMCwwLDAsMTE0LDI4LAotICAgIDAsMCwwLDExNCwzNCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDMyLDAsCi0gICAgMCwwLDIxOCw4LDk1LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDkwLDMsMTE0LDEwMSwKLSAgICAxMDIsNDEsMywxMTQsMTUsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw2MSwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsMTUsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCw1NiwwLDAsMCwxNzYsMCwwLDAsMTE1LDI0LDAsMCwKLSAgICAwLDAsNCw2LDEsMywxLDE3LDEsMTMsMSw1LDEsMTIsMSwxMiwKLSAgICAxLDE1LDIsMTIsMSwxOCwyLDIyLDEsMTE0LDU2LDAsMCwwLDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSw3MSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMjUsMSwwLDExNiwxLDAsMTA2LDIsMCwxMzEsMCwwLDEsMTIxLDE0LAotICAgIDAsMTI0LDEsMCwxMDYsMywwLDEzMSwwLDAsMSw4NywxMTAsMTgsMCw0LAotICAgIDExNiw0LDAsMTA3LDEwLDAsMTE0LDU2LDAsMSwxLDEsODksMTEwLDExLDAsCi0gICAgODgsMTI0LDEsMCwxMDYsNSwwLDEzMSwwLDAsMSwxMDAsMSwwLDgzLDQxLAotICAgIDIsOTcsMjEsMSwwLDAsODIsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsNDQsMzIsOTcsMTEwLDEwMCwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsCi0gICAgMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsCi0gICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDEwMSwxMTAsMTE1LDExNywxMTQsMTAxLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsOTksMTExLDEwOSwxMTIsMTA4LDEwMSwxMTYsMTAxLDEwOCwxMjEsMzIsMTA1LAotICAgIDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMTAwLDQ0LDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTAxLDExOCwxMDEsMTEwLDExNiwzMiwxMDUsMTE2LDMyLAotICAgIDEwNSwxMTUsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKLSAgICAxMDAsMzIsOTgsMTIxLDMyLDk3LDExMCwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwxMDQsMTE0LAotICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwKLSAgICAzMiwxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwKLSAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDQxLDYsMTE0LDU2LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDQ2LDAsCi0gICAgMCwwLDExNCwzMSwwLDAsMCwxMTQsNDcsMCwwLDAsNDEsMiwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxOSw5NSwxMDgsMTExLDk5LDEwNyw5NSwxMTcsCi0gICAgMTEwLDEwOCwxMTEsOTksMTA3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE5NSwwLDAsMCwKLSAgICAxMTUsMTQsMCwwLDAsMCw3LDEyLDEsMTAsMSwzLDEsMTQsMSwxMywKLSAgICAzLDUsMiwxMTQsNjMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsMywwLDAsMCw3OSwwLDAsMCwxMTUsMTMsMCwKLSAgICAwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTQyLDAsMCw4Myw0MSwKLSAgICAxLDk3LDQ2LDEsMCwwLDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDk1LDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDk5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5NywKLSAgICAxMDgsMTE5LDk3LDEyMSwxMTUsMzIsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMzIsMTE1LDEwMSwxMTMsCi0gICAgMTE3LDEwMSwxMTAsOTksMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMTYsCi0gICAgMTA0LDk3LDExNiwzMiwxMDEsMTEwLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsOTksCi0gICAgOTcsMTA4LDEwOCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwKLSAgICAxMTYsMTA1LDExMSwxMTAsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDUsMTE2LAotICAgIDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDMyLDExMSwxMDIsMzIsOTcsMzIsMTEwLDExMSwKLSAgICAxMTQsMTA5LDk3LDEwOCwzMiw5OSw5NywxMDgsMTA4LDMyLDEwNSwxMTAsMzIsMTEyLDEwOCw5NywKLSAgICA5OSwxMDEsMTE1LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAotICAgIDk4LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwxMTYsCi0gICAgMTE0LDExMSwxMDAsMTE3LDk5LDEwMSwxMTUsMzIsMTE3LDExMCwxMTksOTcsMTEwLDExNiwxMDEsMTAwLAotICAgIDMyLDExMCwxMTEsMTA1LDExNSwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExNiwxMTQsOTcsOTksMTAxLDk4LDk3LDk5LDEwNywzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLAotICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsMTE2LDEwNSwxMTAsMTAzLDEwLDMyLAotICAgIDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQxLDEwLAotICAgIDMyLDMyLDMyLDMyLDExNCwxMCwwLDAsMCw0MSwzLDIxOCwxLDEwMiwxMTQsMjksCi0gICAgMCwwLDAsOTAsNCwxMDcsMTE5LDEwMCwxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsCi0gICAgMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLAotICAgIDExOCwxMDEsMTAwLDIxNCwwLDAsMCwxMTUsMiwwLDAsMCwwLDgsMTE0LDY1LAotICAgIDAsMCwwLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwxMjEsMTE0LDQ1LAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLAotICAgIDQsMCwwLDAsNzEsMCwwLDAsMTE1LDc1LDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMDYsMiwwLDEyNCwxLDAsMTA3LDUsMCwxMTQsNzEsMCwxMjQsCi0gICAgMCwwLDEwNiwzLDAsMTAwLDYsMCwxMzEsMSwwLDExNSw0MywwLDEwMCwzLAotICAgIDAsMTI0LDAsMCwyMywxMjUsMCwwLDExNiw0LDAsMTI0LDAsMCwxMDYsNSwKLSAgICAwLDEyNCwyLDAsMTQwLDAsMCwxMDAsNCwwLDExNiwwLDAsMTA2LDYsMCwKLSAgICAxMzEsMSwxLDEsMTAwLDUsMCw4Myw0MSw3LDEyMiw2MSw4MCwxMTQsMTA1LDExMCwKLSAgICAxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMzIsMTE2LDExMSwKLSAgICAzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwzMiwxMDUsMTAyLDMyLDQ1LDExOCw0Nyw4MCw4OSwKLSAgICA4NCw3Miw3OSw3OCw4Niw2OSw4Miw2Niw3OSw4Myw2OSwzMiwxMDUsMTE1LDMyLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwxMTAsNDYsMjUwLDEsMzUsMjUwLDcsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsMzUsMzIsOTAsNCwxMDIsMTA1LDEwOCwxMDEsNzgsCi0gICAgNDEsMiwxMTQsNjcsMCwwLDAsMTE0LDY4LDAsMCwwLDQxLDcsMTE0LDE0LAotICAgIDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwyMTgsNywxMTgsMTAxLDExNCw5OCwKLSAgICAxMTEsMTE1LDEwMSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LAotICAgIDUsMTEyLDExNCwxMDUsMTEwLDExNiwxMTQsNTAsMCwwLDAsMjE4LDYsMTE1LDExNiwxMDAsCi0gICAgMTAxLDExNCwxMTQsNDEsMywyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsNjYsCi0gICAgMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LAotICAgIDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwyMjUsMCwwLDAsMTE1LDgsMCwKLSAgICAwLDAsMCwyLDE4LDEsMTUsMSwxMCwxLDExNCw3NSwwLDAsMCw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLAotICAgIDMsMCwwLDAsMTE1LDM1LDAsMCwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsCi0gICAgMSwwLDEwMCwyLDAsMTM0LDAsMCwxMjUsMSwwLDExNiwwLDAsMTI0LDEsCi0gICAgMCwxMzYsMCwwLDEzMSwyLDAsMSwxMjQsMSwwLDgzLDQxLDMsMTIyLDQ5LAotICAgIDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsCi0gICAgMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsCi0gICAgNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLAotICAgIDAsMCwxOSwwLDAsMCwxMTUsNTUsMCwwLDAsMTI0LDEsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTA3LDcsMCwxMTQsNDIsMCwxMTYsMiwwLDEwMCwxLDAsCi0gICAgMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwKLSAgICAwLDgzLDQxLDMsNzgsMTIyLDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLAotICAgIDExMSwxMTYsMzIsOTcsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDE0LDAsMCwwLAotICAgIDIxOCwyMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LAotICAgIDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwyMTgsCi0gICAgOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsNDEsMSwyMTgsMywxMDIsMTIwLDExMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMTQsMTAxLDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDIzNSwwLDAsMCwxMTUsOCwwLDAsMCwwLDEsCi0gICAgMTUsMSwxOCwxLDksMSwxMjIsNTIsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAotICAgIDExNSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwKLSAgICAxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LAotICAgIDEwOCwxMTYsMTA1LDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0MSwxLDExNCwxMiwKLSAgICAwLDAsMCw0MSwyLDExNCw3OSwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMSwwLDAsMCwKLSAgICAyMTgsMTcsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCwyMzMsMCwwLDAsMTE1LDYsMCwwLDAsMCwyLDE4LDUsCi0gICAgMTMsMSwxMTQsODEsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDExNSwzNSwwLDAsCi0gICAgMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsCi0gICAgMTI1LDEsMCwxMTYsMCwwLDEyNCwxLDAsMTM2LDAsMCwxMzEsMiwwLDEsCi0gICAgMTI0LDEsMCw4Myw0MSwzLDEyMiw0Nyw2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLAotICAgIDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLAotICAgIDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDQsMCwwLDAsMTksMCwwLDAsMTE1LDU1LDAsMCwKLSAgICAwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTE1LDQyLDAsCi0gICAgMTE2LDIsMCwxMDAsMSwwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LAotICAgIDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSw0LDExNCwKLSAgICA1NywwLDAsMCwyMTgsOSwxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDExNCwKLSAgICA3NywwLDAsMCwxMTQsNTAsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsCi0gICAgMTE0LDc4LDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDI0LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKLSAgICAxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsCi0gICAgMjQ2LDAsMCwwLDExNSw4LDAsMCwwLDAsMSwxNSwxLDE4LDEsOSwKLSAgICAxLDEyMiw1MCw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLAotICAgIDEyMiwxMDEsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLAotICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDQxLDEsMTE0LDEyLDAsMCwwLDQxLDIsMTE0LDc5LAotICAgIDAsMCwwLDExNCw4MywwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsCi0gICAgNzksMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTQsMTAxLDExMywxMTcsCi0gICAgMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDI0NCwwLDAsMCwxMTUsCi0gICAgNiwwLDAsMCwwLDIsMTgsNSwxMywxLDExNCw4NCwwLDAsMCw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw4MSwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTI0LAotICAgIDAsMCwxMzEsMiwwLDEyNSwyLDAsMTI0LDEsMCwxMTYsMSwwLDEwNiwyLAotICAgIDAsMTA3LDYsMCwxMTQsNjcsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwKLSAgICAyNSwxMjUsMywwLDExNiwzLDAsMTI0LDIsMCwxMjQsMywwLDEzMSwyLDAsCi0gICAgMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwyNSw4MywxMTYsNCwwLDEyNCwKLSAgICAyLDAsMTMxLDEsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDEyOCw3NiwxMTEsCi0gICAgOTcsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNSwxMjEsMTE1LAotICAgIDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDEwNSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICAxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICA1LDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDIxOCw1LDk1LAotICAgIDEwMSwxMjAsMTAxLDk5LDIxOCw1LDk1LDEwOCwxMTEsOTcsMTAwLDQxLDQsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw3OCwwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsNiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDAsMSwwLDAsMTE1LDEyLDAsMCwwLAotICAgIDAsNiwxNSwxLDE1LDEsMTMsMSwxMywxLDExLDIsMTE0LDkwLDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDM1LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw2LDEsMCwwLDExNiwwLDAsMTI0LDAsCi0gICAgMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMjUsMSwwLDExNiwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMiwwLDEzMSwyLDAsMTE0LDcxLDAsMTIxLDE3LDAsMTI0LAotICAgIDEsMCwxMDYsMiwwLDEyNCwwLDAsMTMxLDEsMCw4Myw4NywxMTAsMTgsMCwKLSAgICA0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDcwLDAsMSwxLDEsODksMTEwLDEsCi0gICAgMCw4OCwxMjEsMTMsMCwxMjQsMCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsCi0gICAgMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDEwNCwwLDEsMSwxLDg5LAotICAgIDExMCwyMywwLDg4LDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMjcsMCwKLSAgICAxMTYsNiwwLDEyNCwyLDAsMTMxLDEsMCw4MywxMjEsMTMsMCwxMjQsMCwwLAotICAgIDEwNiw3LDAsMTI1LDMsMCw4NywxMTAsMjQsMCw0LDExNiw1LDAsMTA3LDEwLAotICAgIDAsMTE0LDE2NiwwLDEsMSwxLDEwMCwzLDAsMTI1LDMsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTA2LDgsMCwxMjUsNCwwLDg3LDExMCwKLSAgICA1OSwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMjQxLDAsMSwxLDEsMTI0LAotICAgIDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDIyMSwwLDEwMCw0LDAsMTA2LDksCi0gICAgMCwxMjQsMywwLDEzMSwxLDAsODMsMTAwLDUsMCwxMDYsOSwwLDEyNCwzLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDgzLDg5LDExMCwxNywwLDg4LDEwMCw2LDAsCi0gICAgMTA2LDksMCwxMjQsMywwLDEyNCw0LDAsMTMxLDIsMCw4MywxMDAsMCwwLAotICAgIDgzLDQxLDcsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTUsCisgICAgMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTAwLDAsCisgICAgMTI0LDAsOTUsMSwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsMTgsMCwKKyAgICAwLDAsMjE4LDUsOTUsMTA4LDExMSw5OSwxMDcsNDEsMiwxMTQsMTksMCwwLDAsCisgICAgMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNTksMCwwLDAsMTE1LDQsMCwKKyAgICAwLDAsMCwxLDYsMSwxMjIsMjcsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwKKyAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisgICAgMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDEyMiwxNiwxMTYsCisgICAgMCwxMjQsMCwxMDYsMSwxMzEsMSwxMjQsMCw5NSwyLDg3LDAsMTAwLDAsMTE2LAorICAgIDMsMTA2LDQsMTMxLDAsMSwwLDg4LDAsMTI0LDAsMTA2LDIsMTA2LDUsMTMxLAorICAgIDAsMSwwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSw2LDIxOCwxNiw5NSwxMDMsCisgICAgMTAxLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsMTgsCisgICAgMCwwLDAsMTE0LDU1LDAsMCwwLDIxOCw0LDk1LDEwNSwxMDksMTEyLDIxOCwxMiwKKyAgICAxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsNDYsMCwwLAorICAgIDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIzLDAsMCwwLDE2MywwLDAsMCwKKyAgICAxMTUsOCwwLDAsMCwwLDEsMiwxLDE2LDIsMTAsMSwxMjIsMjgsOTUsCisgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLAorICAgIDExNCw0Niw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNzksMCwwLDAsCisgICAgMTE1LDE0LDAsMCwwLDEyNCwwLDEwNiwwLDEwNiwxLDEzMSwwLDEsMCwxMDAsCisgICAgMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsNTUsMCwwLDAsMTE0LDQ3LDAsCisgICAgMCwwLDQxLDMsMTE0LDE5LDAsMCwwLDExNCwyOSwwLDAsMCw5MCw2LAorICAgIDEwNywxMTksOTcsMTE0LDEwMywxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDMwLDAsMCwwLDE3MCwwLDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDEsMTIyLDI3LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLAorICAgIDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LAorICAgIDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LAorICAgIDIsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCwyMywwLDAsMCwxMTQsMzAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCw1NCwwLDAsMCwxNTcsMCwwLDAsCisgICAgMTE1LDYsMCwwLDAsOCwyLDgsNCw4LDcsMTE0LDU0LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwKKyAgICAwLDMsMCwwLDAsMTE1LDEwNiwwLDAsMCwxMDAsMSwxMjUsMSwxMjEsMTQsCisgICAgMTE2LDAsMTM2LDAsMjUsMCwxMzEsMCwxMjUsMSw4NywwLDExMCwyMCw0LDAsCisgICAgMTE2LDEsMTA3LDEwLDExNCwzOCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLAorICAgIDg4LDAsMTI0LDEsMTAwLDEsMTA3LDgsMTE0LDEwMiwxMTYsMiwxMDAsMSwxMDcsOCwKKyAgICAxMTQsNjYsMTE2LDMsMTM2LDAsMTMxLDEsMTI1LDEsMTEwLDgsMTE2LDQsMTM2LDAsCisgICAgMTMxLDEsMTI1LDEsMTM1LDAsMTAyLDEsMTAwLDIsMTAwLDMsMTMyLDgsMTI1LDIsCisgICAgMTE2LDUsMTA2LDYsMTI0LDEsMTI0LDIsMTMxLDIsMTE2LDAsMTM2LDAsNjAsMCwKKyAgICAxMjQsMSw4MywwLDQxLDQsMTIyLDEwOSw3MSwxMDEsMTE2LDMyLDExMSwxMTQsMzIsOTksCisgICAgMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwKKyAgICAxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsCisgICAgOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTE2LAorICAgIDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDIsMCwwLDAsMTksMCwwLDAsMTE1LDEwLDAsMCwwLAorICAgIDExNiwwLDEzNiwwLDYxLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDEsMjE4LAorICAgIDEzLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNSw0MSwxLAorICAgIDIxOCwxLDk1LDQxLDEsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDIsOTksOTgsMTkwLDAsMCwwLDExNSwyLDAsMCwKKyAgICAwLDAsMSwxMjIsMjgsOTUsMTAzLDEwMSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTUsMTA4LDExMSw5OSwxMDcsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk5LAorICAgIDk4LDQxLDcsMTE0LDU5LDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsMzQsMCwKKyAgICAwLDAsMTE0LDUzLDAsMCwwLDExNCwzMiwwLDAsMCwyMTgsOCw5NSwxMTksCisgICAgMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCwzLDExNCwxMDEsMTAyLDQxLDMsMTE0LDE1LDAsCisgICAgMCwwLDExNCwzNSwwLDAsMCwxMTQsNjEsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDQxLDEsMTE0LDE1LDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNTYsMCwKKyAgICAwLDAsMTc2LDAsMCwwLDExNSwyNCwwLDAsMCwwLDQsNCwxLDIsCisgICAgMSwxNCwxLDE0LDEsNiwxLDgsMSw4LDEsMTAsMiw4LDEsMTIsCisgICAgMiwxNiwxLDExNCw1NiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNjIsMCwKKyAgICAwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTI1LDEsMTE2LDEsMTA2LDIsMTMxLDAsCisgICAgMSwwLDEyMSwxMiwxMjQsMSwxMDYsMywxMzEsMCwxLDAsODcsMCwxMTAsMjAsCisgICAgNCwwLDExNiw0LDEwNywxMCwxMTQsNDgsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsMTAsODgsMCwxMjQsMSwxMDYsNSwxMzEsMCwxLDAsMTAwLDEsODMsMCwKKyAgICA0MSwyLDk3LDIxLDEsMCwwLDgyLDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDQ0LDMyLDk3LDExMCwxMDAsMzIsOTcsOTksMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMzIsMzIsCisgICAgMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LAorICAgIDExMSwzMiwxMDEsMTEwLDExNSwxMTcsMTE0LDEwMSwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk5LDExMSwxMDksMTEyLDEwOCwxMDEsMTE2LDEwMSwxMDgsMTIxLDMyLAorICAgIDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCw0NCwzMiwxMDUsMTEwLDMyLAorICAgIDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwMSwxMTgsMTAxLDExMCwxMTYsMzIsMTA1LDExNiwKKyAgICAzMiwxMDUsMTE1LDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTAwLDMyLDk4LDEyMSwzMiw5NywxMTAsMTExLDExNiwxMDQsMTAxLDExNCwzMiwxMTYsMTA0LAorICAgIDExNCwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDgzLDEwNCwxMTEsMTE3LDEwOCwKKyAgICAxMDAsMzIsMTExLDExMCwxMDgsMTIxLDMyLDk4LDEwMSwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsCisgICAgMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDMyLDExNiw5NywxMDcsMTAxLDExMCw0Niw3OCw0MSw2LDExNCwKKyAgICA1NiwwLDAsMCwxMTQsNTcsMCwwLDAsMTE0LDU4LDAsMCwwLDExNCw0NiwKKyAgICAwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDQ3LDAsMCwwLDQxLDIsMTE0LAorICAgIDE1LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTksOTUsMTA4LDExMSw5OSwxMDcsOTUsCisgICAgMTE3LDExMCwxMDgsMTExLDk5LDEwNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxOTUsMCwwLAorICAgIDAsMTE1LDE0LDAsMCwwLDAsNyw4LDEsOCwxLDIsMSwxMiwxLAorICAgIDE0LDMsNiwyLDExNCw2MywwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCwzLDAsMCwwLDc5LDAsMCwwLDExNSwxMCwKKyAgICAwLDAsMCwxMjQsMCwxMjQsMSwxMjQsMiwxNDIsMCw4MywwLDQxLDEsOTcsCisgICAgNDYsMSwwLDAsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTA4LDEwNSw5OCw5NSwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsNDYsOTksMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk3LDEwOCwxMTksCisgICAgOTcsMTIxLDExNSwzMiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwzMiwxMTUsMTAxLDExMywxMTcsMTAxLAorICAgIDExMCw5OSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTA4LDEwNSw5OCwzMiwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDExNiwxMDQsOTcsCisgICAgMTE2LDMyLDEwMSwxMTAsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywzMiw5OSw5NywxMDgsCisgICAgMTA4LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsCisgICAgMTExLDExMCwxMCwxMCwzMiwzMiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwNSwxMTYsMzIsMTA1LAorICAgIDExMCwxMTUsMTE2LDEwMSw5NywxMDAsMzIsMTExLDEwMiwzMiw5NywzMiwxMTAsMTExLDExNCwxMDksCisgICAgOTcsMTA4LDMyLDk5LDk3LDEwOCwxMDgsMzIsMTA1LDExMCwzMiwxMTIsMTA4LDk3LDk5LDEwMSwKKyAgICAxMTUsMzIsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLDEwNSwxMTAsCisgICAgMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMTAsCisgICAgMzIsMzIsMzIsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLDExNiwxMTQsMTExLAorICAgIDEwMCwxMTcsOTksMTAxLDExNSwzMiwxMTcsMTEwLDExOSw5NywxMTAsMTE2LDEwMSwxMDAsMzIsMTEwLAorICAgIDExMSwxMDUsMTE1LDEwMSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE2LDExNCwKKyAgICA5Nyw5OSwxMDEsOTgsOTcsOTksMTA3LDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsMTE5LDEwNCwKKyAgICAxMDEsMTEwLDMyLDEwMSwxMjAsMTAxLDk5LDExNywxMTYsMTA1LDExMCwxMDMsMTAsMzIsMzIsMzIsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDEsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE0LDEwLDAsMCwwLDQxLDMsMjE4LDEsMTAyLDExNCwyOSwwLDAsCisgICAgMCw5MCw0LDEwNywxMTksMTAwLDExNSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMjUsOTUsOTksOTcsMTA4LDEwOCw5NSwxMTksMTA1LAorICAgIDExNiwxMDQsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSw5NSwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwKKyAgICAxMDAsMjE0LDAsMCwwLDExNSwyLDAsMCwwLDAsOCwxMTQsNjUsMCwwLAorICAgIDAsMTE0LDQ1LDAsMCwwLDQxLDEsMjE4LDksMTE4LDEwMSwxMTQsOTgsMTExLDExNSwKKyAgICAxMDUsMTE2LDEyMSw5OSwxLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwKKyAgICA0LDAsMCwwLDcxLDAsMCwwLDExNSw1NiwwLDAsMCwxMTYsMCwxMDYsCisgICAgMSwxMDYsMiwxMjQsMSwxMDcsNSwxMTQsNTIsMTI0LDAsMTA2LDMsMTAwLDYsMTMxLAorICAgIDEsMTE1LDMwLDEwMCwzLDEyNCwwLDIzLDAsMTI1LDAsMTE2LDQsMTI0LDAsMTA2LAorICAgIDUsMTI0LDIsMTQwLDAsMTAwLDQsMTE2LDAsMTA2LDYsMTQ0LDEsMTMxLDEsMSwKKyAgICAwLDEwMCw1LDgzLDAsNDEsNywxMjIsNjEsODAsMTE0LDEwNSwxMTAsMTE2LDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDMyLDExNiwxMTEsMzIsMTE1LDExNiwKKyAgICAxMDAsMTAxLDExNCwxMTQsMzIsMTA1LDEwMiwzMiw0NSwxMTgsNDcsODAsODksODQsNzIsNzksCisgICAgNzgsODYsNjksODIsNjYsNzksODMsNjksMzIsMTA1LDExNSwzMiwxMTYsMTE3LDExNCwxMTAsCisgICAgMTAxLDEwMCwzMiwxMTEsMTEwLDQ2LDI1MCwxLDM1LDI1MCw3LDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDEyMiwyLDM1LDMyLDkwLDQsMTAyLDEwNSwxMDgsMTAxLDc4LDQxLDIsMTE0LAorICAgIDY3LDAsMCwwLDExNCw2OCwwLDAsMCw0MSw3LDExNCwxNCwwLDAsMCwKKyAgICAyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsMjE4LDcsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsCisgICAgMjE4LDEwLDExNSwxMTYsOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCw1LDExMiwxMTQsCisgICAgMTA1LDExMCwxMTYsMTE0LDUwLDAsMCwwLDIxOCw2LDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LAorICAgIDQxLDMsMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE0LDY2LDAsMCwwLAorICAgIDExNCwyOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsOTUsMTA5LAorICAgIDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjI1LDAsMCwwLDExNSw4LDAsMCwwLDAsCisgICAgMiwxMiwxLDEwLDEsOCwxLDExNCw3NSwwLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLDEzMiw4LAorICAgIDEyNSwxLDExNiwwLDEyNCwxLDEzNiwwLDEzMSwyLDEsMCwxMjQsMSw4MywwLAorICAgIDQxLDMsMTIyLDQ5LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsCisgICAgMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LDEwNSwxMDgsCisgICAgMTE2LDQ1LDEwNSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDAsMCwwLDAsMTI0LAorICAgIDEsMTE2LDAsMTA2LDEsMTA3LDcsMTE0LDMwLDExNiwyLDEwMCwxLDEwNiwzLDEyNCwKKyAgICAxLDEzMSwxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEzMCwxLDEzNiwwLDEyNCwKKyAgICAwLDEyNCwxLDEzMSwyLDgzLDAsNDEsMyw3OCwxMjIsMjksMTIzLDMzLDExNCwxMjUsCisgICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsNCwKKyAgICAxMTQsMTQsMCwwLDAsMjE4LDIwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDExNSwyMTgsMTEsNzMsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDIsMTE0LAorICAgIDE5LDAsMCwwLDIxOCw4LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSw0MSwxLAorICAgIDIxOCwzLDEwMiwxMjAsMTEwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAorICAgIDI1LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LAorICAgIDEwNSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsMjM1LDAsMCwwLDExNSw4LAorICAgIDAsMCwwLDAsMSwxMCwxLDEyLDEsOCwxLDEyMiw1Miw5NSwxMTQsMTAxLAorICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQ2LDYwLAorICAgIDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsCisgICAgMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsCisgICAgMTE0LDQxLDEsMTE0LDEyLDAsMCwwLDQxLDIsMTE0LDc5LDAsMCwwLDExNCwKKyAgICA4MCwwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsNzksMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCwxNyw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LAorICAgIDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDIzMywwLDAsMCwxMTUsNiwwLDAsCisgICAgMCwwLDIsMTIsNSwxMCwxLDExNCw4MSwwLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLDEzMiw4LAorICAgIDEyNSwxLDExNiwwLDEyNCwxLDEzNiwwLDEzMSwyLDEsMCwxMjQsMSw4MywwLAorICAgIDQxLDMsMTIyLDQ3LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsCisgICAgMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsMTAyLDExNCwxMTEsMTIyLAorICAgIDEwMSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDAsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTI0LDEsMTMxLDEsMTE1LDMwLDExNiwyLDEwMCwxLDEwNiwzLDEyNCwxLDEzMSwKKyAgICAxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEzMCwxLDEzNiwwLDEyNCwwLDEyNCwKKyAgICAxLDEzMSwyLDgzLDAsNDEsMyw3OCwxMjIsMjcsMTIzLDMzLDExNCwxMjUsMzIsMTA1LAorICAgIDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsNCwxMTQsNTcsMCwwLAorICAgIDAsMjE4LDksMTA1LDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwxMTQsNzcsMCwwLAorICAgIDAsMTE0LDUwLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDExNCw3OCwwLAorICAgIDAsMCw0MSwxLDExNCw3OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDIxOCwyNCw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwKKyAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDI0NiwwLDAsCisgICAgMCwxMTUsOCwwLDAsMCwwLDEsMTAsMSwxMiwxLDgsMSwxMjIsNTAsCisgICAgOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICA0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwKKyAgICAxMTQsMTAxLDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsCisgICAgMTAxLDExNCw0MSwxLDExNCwxMiwwLDAsMCw0MSwyLDExNCw3OSwwLDAsMCwKKyAgICAxMTQsODMsMCwwLDAsMTE0LDEwLDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAorICAgIDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwyNDQsMCwwLDAsMTE1LDYsMCwwLAorICAgIDAsMCwyLDEyLDUsMTAsMSwxMTQsODQsMCwwLDAsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNjQsMCwwLDAsMTE2LDAsMTI0LDEsMTI0LDAsMTMxLDIsMTI1LDIsCisgICAgMTI0LDEsMTE2LDEsMTA2LDIsMTA3LDYsMTE0LDUyLDExNiwxLDEwNiwyLDEyNCwxLAorICAgIDI1LDAsMTI1LDMsMTE2LDMsMTI0LDIsMTI0LDMsMTMxLDIsMSwwLDExNiwxLAorICAgIDEwNiwyLDEyNCwxLDI1LDAsODMsMCwxMTAsOCwxMTYsNCwxMjQsMiwxMzEsMSwKKyAgICA4MywwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTI4LDc2LDExMSw5NywxMDAsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCisgICAgMTA1LDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAorICAgIDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTAsMTE1LDExNiwKKyAgICAxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDQxLDUsMjE4LDE2LDExNSwKKyAgICAxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwKKyAgICAxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMjE4LDUsOTUsMTAxLDEyMCwxMDEsOTksCisgICAgMjE4LDUsOTUsMTA4LDExMSw5NywxMDAsNDEsNCwxMTQsMTksMCwwLDAsMTE0LDc4LAorICAgIDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsCisgICAgMTA0LDEwNSwxMDksMCwxLDAsMCwxMTUsMTIsMCwwLDAsMCw2LDEwLDEsCisgICAgMTAsMSwxMCwxLDEwLDEsMTIsMiwxMTQsOTAsMCwwLDAsOTksMSwwLAorICAgIDAsMCwwLDAsMCwwLDUsMCwwLDAsMzUsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDIxOCwwLDAsMCwxMTYsMCwxMjQsMCwxMDAsMSwxMDAsMCwxMzEsCisgICAgMywxMjUsMSwxMTYsMSwxMjQsMSwxMDAsMiwxMzEsMiwxMTQsNTQsMTIxLDEwLDEyNCwKKyAgICAxLDEwNiwyLDEyNCwwLDEzMSwxLDgzLDAsNCwwLDExNiwzLDEwNywxMCwxMTQsCisgICAgNTIsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyMSwxMCwxMjQsCisgICAgMCwxMDYsNCwxMjUsMiw4NywwLDExMCwyMCw0LDAsMTE2LDUsMTA3LDEwLDExNCwKKyAgICA4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwxOCw4OCwwLDEyNCwyLDEwMCwKKyAgICAwLDEwNyw5LDExNCwxMDIsMTE2LDYsMTI0LDIsMTMxLDEsODMsMCwxMjEsMTAsMTI0LAorICAgIDAsMTA2LDcsMTI1LDMsODcsMCwxMTAsMjQsNCwwLDExNiw1LDEwNywxMCwxMTQsCisgICAgMTM2LDEsMCwxLDAsMSwwLDEwMCwzLDEyNSwzLDg5LDAsMTEwLDIsODgsCisgICAgMCwxMjEsMTAsMTI0LDAsMTA2LDgsMTI1LDQsODcsMCwxMTAsNTIsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsMjAwLDEsMCwxLDAsMSwwLDEyNCwxLDEwMCwwLDEwNywKKyAgICA4LDExNCwxODQsMTAwLDQsMTA2LDksMTI0LDMsMTMxLDEsODMsMCwxMTAsMTIsMTAwLAorICAgIDUsMTA2LDksMTI0LDMsMTI0LDEsMTMxLDIsODMsMCw4OSwwLDExMCwxNCw4OCwKKyAgICAwLDEwMCw2LDEwNiw5LDEyNCwzLDEyNCw0LDEzMSwyLDgzLDAsMTAwLDAsODMsCisgICAgMCw0MSw3LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk1LAogICAgIDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjUwLDEsNjMsCiAgICAgMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwKICAgICAyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsCkBAIC02MTYsMTM3NCArNTc1LDEzMTAgQEAKICAgICA4OCwwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LDgsMTAyLDEwNSwxMDgsMTAxLDExMCwKICAgICA5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCiAgICAgMCwwLDIxOCwxMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsCi0gICAgMTYsMSwwLDAsMTE1LDQ2LDAsMCwwLDAsMiwxOCwxLDE1LDQsMywKLSAgICAxLDE3LDEsMTMsMSw1LDEsMywxLDEzLDEsMTMsMSw1LDIsMTIsCi0gICAgMSwxMCw0LDMsMSwxMywxLDEzLDEsMTEsMSwzLDEsMTMsMSwxMywKLSAgICAxLDEyLDEsMTMsMiwyMSwyLDExNCwxMDEsMCwwLDAsOTksMCwwLDAsCisgICAgMTYsMSwwLDAsMTE1LDQ2LDAsMCwwLDAsMiwxMiwxLDEwLDQsMiwKKyAgICAxLDEwLDEsMTQsMSw2LDEsMiwxLDEwLDEsMTQsMSw2LDIsOCwKKyAgICAxLDgsNCwyLDEsMTAsMSwxNCwxLDEwLDEsMiwxLDEwLDEsMTQsCisgICAgMSw4LDEsMTIsMiwxOCwyLDExNCwxMDEsMCwwLDAsOTksMCwwLDAsCiAgICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsNTIsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsOTAsMywwLDEwMCwzLAotICAgIDAsMTAwLDQsMCwxMzIsMCwwLDkwLDQsMCwxMDAsNSwwLDEwMCw2LDAsCi0gICAgMTMyLDAsMCw5MCw1LDAsMTAwLDcsMCw4Myw0MSw4LDIxOCwxNyw5NSwxMDUsCisgICAgMCwxMTUsMzYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLAorICAgIDEwMCwyLDEzMiwwLDkwLDMsMTAwLDMsMTAwLDQsMTMyLDAsOTAsNCwxMDAsNSwKKyAgICAxMDAsNiwxMzIsMCw5MCw1LDEwMCw3LDgzLDAsNDEsOCwyMTgsMTcsOTUsMTA1LAogICAgIDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDk5LAogICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDI1LDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwKLSAgICAwLDAsMTI0LDEsMCwxMDYsMSwwLDEyNCwwLDAsOTUsMiwwLDEwMCwwLAotICAgIDAsODMsNDEsMSw3OCw0MSwzLDIxOCw3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNCw5NSwwLDAsMCwyMTgsNSw5NSwxMTUsMTEyLDEwMSw5OSw0MSwyLDExNCwxOSwKLSAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIwLDAsMCwwLDU0LDEsMCwwLAotICAgIDExNSw0LDAsMCwwLDAsMSw5LDEsMTIyLDI2LDk1LDEwNSwxMTAsMTE1LDExNiwKLSAgICA5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwxMDUsCi0gICAgMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMzgsMCwwLDAsMTAwLAotICAgIDEsMCwxMjQsMCwwLDEwNiwwLDAsOTUsMSwwLDEyNCwwLDAsMTA2LDIsCi0gICAgMCwxMTYsMywwLDEwNiw0LDAsMTI0LDAsMCwxMDYsMCwwLDEwNiw1LDAsCi0gICAgNjAsMTAwLDAsMCw4Myw0MSwyLDc4LDg0LDQxLDYsMTE0LDEwNCwwLDAsMCwKLSAgICAyMTgsMTMsOTUsMTA1LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDUsMTEwLDEwMywxMTQsCi0gICAgMTAzLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDE1LAotICAgIDAsMCwwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMywwLDAsMCw1OCwxLAotICAgIDAsMCwxMTUsNCwwLDAsMCwwLDQsMTIsMSwxMjIsMjcsOTUsMTA1LDExMCwKLSAgICAxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LAotICAgIDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsMTcsMCwwLDAsNzEsMCwwLDAsMTE1LDEyMSwwLAotICAgIDAsMCwxMjIsMTAxLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsMTE2LDEsCi0gICAgMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjQsMSwwLDY4LDEzMSwxLAotICAgIDAsMTMxLDEsMCwxMTQsNzgsMCwxMjEsMTcsMCwxMTYsMiwwLDEwNiwzLDAsCi0gICAgMTI0LDIsMCwxMDYsNCwwLDYxLDg3LDExMywxMDAsMCw0LDExNiw1LDAsMTA3LAotICAgIDEwLDAsMTE0LDc0LDAsMSwxLDEsODksMTEzLDEwMCwwLDg4LDExMCwyMiwwLAotICAgIDExNiw2LDAsMTAwLDMsMCwxMjQsMiwwLDEwNiw0LDAsMTI0LDIsMCwxMDYsCi0gICAgNywwLDEzMSwzLDAsMSw4NywxMDAsMCwwLDEwMCw0LDAsMTI0LDAsMCwKLSAgICAxMDYsMCwwLDk1LDgsMCw4OCwxMDAsMCwwLDgzLDQxLDUsNzgsOTksMSwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCwxMTUsCi0gICAgMCwwLDAsMTE1LDI3LDAsMCwwLDEyNCwwLDAsOTMsMTcsMCwxMjUsMSwKLSAgICAwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOSwwLDg2LDEsMTEzLDMsMCwxMDAsCi0gICAgMCwwLDgzLDQxLDEsNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDI0LDAsCi0gICAgMCwwLDExNCwyNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMjYsMCwwLDAsNjgsMSwwLDAsMTE1LAotICAgIDIsMCwwLDAsNiwwLDEyMiw0NSw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwKLSAgICAxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LAotICAgIDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwKLSAgICAxMDEsMTIwLDExMiwxMTQsNjIsMTIyLDE4LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEyMywzMywKLSAgICAxMTQsMTI1LDMyLDM1LDMyLDEyMywzMywxMTQsMTI1LDcwLDQxLDksMTE0LDEwNCwwLDAsCi0gICAgMCwxMTQsMjcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwKLSAgICAxMTQsMTUsMCwwLDAsMTE0LDI4LDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsCi0gICAgOTksMCwwLDAsMTE0LDEwNSwwLDAsMCw0MSwzLDExNCwxOSwwLDAsMCwKLSAgICAxMTQsMjksMCwwLDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzMCwwLDAsMCw2NSwxLAotICAgIDAsMCwxMTUsMTgsMCwwLDAsMCwxLDMsMSw5LDEsMjUsMSwzLAotICAgIDEsMTcsMSwxMywxLDgsMiwyNiwyLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsCisgICAgNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTI0LAorICAgIDEsMTA2LDEsMTI0LDAsOTUsMiwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMywKKyAgICAyMTgsNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsOTUsMCwwLDAsMjE4LDUsCisgICAgOTUsMTE1LDExMiwxMDEsOTksNDEsMiwxMTQsMTksMCwwLDAsMTE0LDg5LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDExNCwyMCwwLDAsMCw1NCwxLDAsMCwxMTUsNCwwLDAsMCwwLDEsCisgICAgNiwxLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSwKKyAgICA5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDI4LDAsMCwwLDEwMCwxLDEyNCwwLDEwNiwwLDk1LDEsCisgICAgMTI0LDAsMTA2LDIsMTE2LDMsMTA2LDQsMTI0LDAsMTA2LDAsMTA2LDUsNjAsMCwKKyAgICAxMDAsMCw4MywwLDQxLDIsNzgsODQsNDEsNiwxMTQsMTA0LDAsMCwwLDIxOCwKKyAgICAxMyw5NSwxMDUsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwNSwxMTAsMTAzLDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsMTUsMCwKKyAgICAwLDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIzLDAsMCwwLDU4LDEsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsNCw4LDEsMTIyLDI3LDk1LDEwNSwxMTAsMTE1LAorICAgIDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwKKyAgICAxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDE3LDAsMCwwLDcxLDAsMCwwLDExNSw5OCwwLDAsCisgICAgMCwxMjIsODIsMTI0LDAsMTA2LDAsMTI1LDIsMTE2LDEsMTAwLDEsMTAwLDIsMTMyLAorICAgIDAsMTI0LDEsNjgsMCwxMzEsMSwxMzEsMSwxMTQsNjQsMTIxLDE0LDExNiwyLDEwNiwKKyAgICAzLDEyNCwyLDEwNiw0LDYxLDAsODcsMCwxMTMsODAsNCwwLDExNiw1LDEwNywKKyAgICAxMCwxMTQsNjAsMSwwLDEsMCwxLDAsODksMCwxMTMsODAsODgsMCwxMTAsCisgICAgMTYsMTE2LDYsMTAwLDMsMTI0LDIsMTA2LDQsMTI0LDIsMTA2LDcsMTMxLDMsMSwKKyAgICAwLDg3LDAsMTAwLDAsMTAwLDQsMTI0LDAsMTA2LDAsOTUsOCw4OCwwLDEwMCwKKyAgICAwLDgzLDAsNDEsNSw3OCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwzLDAsMCwwLDExNSwwLDAsMCwxMTUsMjIsMCwwLDAsCisgICAgMTI0LDAsOTMsMTQsMTI1LDEsMTI0LDEsMTAwLDAsMTA3LDksODYsMCwxLDAsCisgICAgMTEzLDIsMTAwLDAsODMsMCw0MSwxLDc4LDExNCwxMCwwLDAsMCw0MSwyLAorICAgIDExNCwyNCwwLDAsMCwxMTQsMjUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDI2LDAsMCwwLDY4LDEsCisgICAgMCwwLDExNSwyLDAsMCwwLDQsMCwxMjIsNDUsOTUsMTA1LDExMCwxMTUsMTE2LAogICAgIDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwMSwKLSAgICAxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLDAsMCwwLDExNCwwLDAsCi0gICAgMCwwLDExNCwyLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsMjMsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDUyLAotICAgIDEsMCwwLDExNSw2LDAsMCwwLDEyLDIsMTIsNCwxMiw3LDExNCwxMDIsCi0gICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgOCwwLDAsMCw2NCwwLDAsMCwxMTUsMTcyLDAsMCwwLDEwMSwwLDAsCi0gICAgOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwKLSAgICAyLDAsMTAwLDMsMCwxMDAsNCwwLDEwMCwzLDAsMTAwLDUsMCwxMDAsMywKLSAgICAwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwzLDkwLDQsMCwxMDAsOCwwLAotICAgIDEwMCw5LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLAotICAgIDAsMCw5MCw2LDAsMTAxLDcsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwKLSAgICAwLDEzMSwxLDAsOTAsOCwwLDEwMSw4LDAsMTA2LDksMCwxMDAsMTQsMCwKLSAgICAxMDAsMTMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSw3LDAsMTAwLAotICAgIDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDcsCi0gICAgMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTEsMCwKLSAgICAxMDEsMTEsMCwxMDYsOSwwLDEwMCwxOSwwLDEwMCwxOCwwLDEzMiwwLDAsMTMxLAotICAgIDEsMCw5MCwxMSwwLDEwMCwzLDAsODMsNDEsMjAsMjE4LDEwLDc3LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw5NywyMDgsNSwwLDAsODQsMTA0LDEwMSwzMiwKLSAgICAxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExMSwKLSAgICAxMTQsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTE3LDExNSwxMDEsMTAwLAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDEwOCwxMTEsOTcsMTAwLDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDY1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTUsMTEyLAotICAgIDEwMSw5OSwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgMzIsMTAyLDExMSwxMTQsMzIsMTA1LDExMCwxMDIsMTExLDExNCwxMDksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDMyLDk3LDk4LDExMSwxMTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDQ2LDMyLDMyLDcwLDExMSwxMTQsMTAsMzIsMzIsMzIsMzIsMTAwLDk3LDExNiw5NywKLSAgICAzMiw5NywxMTUsMTE1LDExMSw5OSwxMDUsOTcsMTE2LDEwMSwxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDEwNSwxMTAsOTksCi0gICAgMTA4LDExNywxMDAsMTA1LDExMCwxMDMsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NCwzMiwxMTcsCi0gICAgMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzOSwxMTUsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwKLSAgICAxMTAsOTcsMTA5LDEwMSw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDk3LDk4LDExNSwKLSAgICAxMTEsMTA4LDExNywxMTYsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsOTYsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTksMTA0LDEwMSwKLSAgICAxMTAsMzIsMTA4LDExMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsOTYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NiwzMiwKLSAgICAxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsMTA1LDExMCw0NiwKLSAgICAzMiwzMiw4NCwxMDQsMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwKLSAgICAxMDAsMTAxLDExNCwxMDUsMTE4LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDExMCw5NywxMDksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LDEwNSwxMTUsOTUsCi0gICAgMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk2LDMyLDEwMCwxMDEsMTE2LDEwMSwxMTQsMTA5LDEwNSwKLSAgICAxMTAsMTAxLDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEwNSwxMTUsMzIsOTksMTExLDExMCwxMTUsMTA1LDEwMCwxMDEsMTE0LDEwMSwxMDAsMzIsCi0gICAgOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMSwxMTQsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTEwLDExMSwxMTYsNDYsMzIsMzIsNzksMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiwxMTQsMTAxLDEwMiwxMDgsMTAxLDk5LAotICAgIDExNiwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiw5Niw5NSw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSw5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsOTYsMzIsMTA1LAotICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwzMiwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsOTgsMTIxLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExNCwxMTEsMTA5LDMyLAotICAgIDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwOCwxMTEsOTcsCi0gICAgMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDEwNSwxMDIsCi0gICAgMzIsMTE2LDEwNCw5NywxMTYsMzIsMTA1LDExMCwxMDIsMTExLDExNCwxMDksOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDMyLDEwNSwxMTUsMzIsOTcsMTE4LDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NiwzMiwKLSAgICAzMiw4NywxMDQsMTAxLDExMCwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTA1LAotICAgIDExNSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDExNiw0NCwzMiwxMTEsMTE0LDEwNSwxMDMsMTA1LAotICAgIDExMCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTA5LDk3LDExNiw5OSwxMDQsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsOTYsMTA0LDk3LDExNSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKLSAgICA5NiwzMiwxMDUsMTEwLDEwMCwxMDUsOTksOTcsMTE2LDEwMSwxMTUsMzIsMTE2LDEwNCw5NywxMTYsCi0gICAgMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDM0LDExMSwxMTQsMTA1LDEwMywxMDUsCi0gICAgMTEwLDM0LDMyLDExNCwxMDEsMTAyLDEwOCwxMDEsOTksMTE2LDExNSwzMiw5NywzMiwxMDgsMTExLAotICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCw0NiwxMCwzMiwzMiwzMiwzMiw4NywxMDQsMTAxLDExMCwKLSAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiw4NCwxMTQsMTE3LDEwMSw0NCwzMiw5NiwKLSAgICA5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LAotICAgIDExNywxMTYsMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTA1LDExNSwzMiwxMTUsMTAxLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwKLSAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgOTcsOTksMTA0LDEwMSwxMDAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ0LDMyLDEwNSwxMDIsMzIsOTcsMTEwLDEyMSw0NiwzMiwzMiw3MywxMTYsCi0gICAgMTAsMzIsMzIsMzIsMzIsOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMTE1LAotICAgIDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsOTYsOTUsOTUsOTksOTcsOTksMTA0LDEwMSwKLSAgICAxMDAsOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDk2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTIwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLAorICAgIDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMjIsMTgsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMzIsMTIzLDMzLDExNCwxMjUsMzIsMzUsMzIsMTIzLDMzLDExNCwxMjUsNzAsNDEsOSwxMTQsCisgICAgMTA0LDAsMCwwLDExNCwyNywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLAorICAgIDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMjgsMCwwLDAsMTE0LDc1LDAsCisgICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA1LDAsMCwwLDQxLDMsMTE0LDE5LAorICAgIDAsMCwwLDExNCwyOSwwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDMwLDAsMCwKKyAgICAwLDY1LDEsMCwwLDExNSwxOCwwLDAsMCwwLDEsMiwxLDYsMSwKKyAgICAxOCwxLDIsMSwxNCwxLDE0LDEsOCwyLDIwLDIsMTIyLDI2LDk1LDEwNSwKKyAgICAxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0NiwKKyAgICA5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwKKyAgICAxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LAorICAgIDIzLDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEwMiwwLAorICAgIDAsMCw1MiwxLDAsMCwxMTUsNiwwLDAsMCw4LDIsOCw0LDgsCisgICAgNywxMTQsMTAyLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDQsMCwwLDAsNjQsMCwwLDAsMTE1LDExNCwwLDAsMCwKKyAgICAxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMiwKKyAgICAxMDAsMiwxMDAsMywxNTYsMywxMDAsNCwxMDAsNSwxMzIsMiw5MCw0LDEwMCw2LAorICAgIDEwMCw3LDEzMiwwLDkwLDUsMTAwLDgsMTAwLDksMTMyLDAsOTAsNiwxMDEsNywKKyAgICAxMDAsMTAsMTAwLDExLDEzMiwwLDEzMSwxLDkwLDgsMTAxLDgsMTA2LDksMTAwLDEyLAorICAgIDEwMCwxMSwxMzIsMCwxMzEsMSw5MCw4LDEwMSw3LDEwMCwxMywxMDAsMTQsMTMyLDAsCisgICAgMTMxLDEsOTAsMTAsMTAxLDcsMTAwLDE1LDEwMCwxNiwxMzIsMCwxMzEsMSw5MCwxMSwKKyAgICAxMDEsMTEsMTA2LDksMTAwLDE3LDEwMCwxNiwxMzIsMCwxMzEsMSw5MCwxMSwxMDAsMiwKKyAgICA4MywwLDQxLDE4LDIxOCwxMCw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksCisgICAgOTcsMjA4LDUsMCwwLDg0LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsCisgICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDQ0LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMDIsMTExLDExNCwzMiwxMDgsMTExLAorICAgIDk3LDEwMCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTE1LDExMiwxMDEsOTksMzIsMTA1LDExNSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMTAsCisgICAgMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLDExMCwzMiw5Nyw5OCwxMTEsMTE3LDExNiwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw3MCwxMTEsMTE0LAorICAgIDEwLDMyLDMyLDMyLDMyLDEwMCw5NywxMTYsOTcsMzIsOTcsMTE1LDExNSwxMTEsOTksMTA1LAorICAgIDk3LDExNiwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLDEwNSwxMTAsMTAzLDMyLAorICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDQsMzIsMTE3LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTE1LDExMiwxMDEsOTksMzksMTE1LDEwLDMyLDMyLDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTEwLDk3LDEwOSwxMDEsOTYsMzIsMTA1LAorICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiw5Nyw5OCwxMTUsMTExLDEwOCwxMTcsMTE2LDEwMSwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDQ2LDMyLDMyLDk2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTYsMzIsMTA1LDExNSwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLDExNiwKKyAgICAxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDEwOCwxMTEsOTcsMTAwLDEwNSwKKyAgICAxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDMyLDMyLAorICAgIDk2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwNSwxMTAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTQsMTA1LDExOCwxMDEsMTAwLAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiw5NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwKKyAgICA5NiwzMiwxMDAsMTAxLDExNiwxMDEsMTE0LDEwOSwxMDUsMTEwLDEwMSwxMTUsMzIsMTA1LDEwMiwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk5LDExMSwKKyAgICAxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwzMiwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDExMCwxMTEsMTE2LDQ2LDMyLDMyLAorICAgIDc5LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLAorICAgIDEwNSwxMTUsMzIsMTE0LDEwMSwxMDIsMTA4LDEwMSw5OSwxMTYsMTAxLDEwMCwzMiw5OCwxMjEsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsOTYsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsOTYsMzIsOTcsCisgICAgMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LAorICAgIDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAorICAgIDExMiwxMDEsOTksMTA1LDEwMiwxMDUsOTksMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMzIsMTE3LDExNSwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LAorICAgIDExMSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLDk3LDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTAyLDMyLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwKKyAgICAxMTAsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsMTE1LDMyLDk3LDExOCwKKyAgICA5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsNDYsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTAyLAorICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMTE1LAorICAgIDEwMSwxMTYsNDQsMzIsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLAorICAgIDEwOSw5NywxMTYsOTksMTA0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LDEwNCw5NywxMTUsCisgICAgOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsOTYsMzIsMTA1LDExMCwxMDAsMTA1LDk5LAorICAgIDk3LDExNiwxMDEsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LAorICAgIDM5LDExNSwzMiwzNCwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCwzNCwzMiwxMTQsMTAxLDEwMiwxMDgsCisgICAgMTAxLDk5LDExNiwxMTUsMzIsOTcsMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsCisgICAgMTAsMzIsMzIsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwKKyAgICAxMTUsMzIsODQsMTE0LDExNywxMDEsNDQsMzIsOTYsOTUsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LAorICAgIDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwzMiwxMTEsMTAyLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsMTE1LDEwMSwKKyAgICAxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsOTksOTcsOTksMTA0LDEwMSwxMDAsOTYsCisgICAgMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLDk4LAorICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMDUsMTAyLAorICAgIDMyLDk3LDExMCwxMjEsNDYsMzIsMzIsNzMsMTE2LDEwLDMyLDMyLDMyLDMyLDk5LDExMSwKKyAgICAxMTQsMTE0LDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDExNSwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDk2LDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk1LDk1LDk2LDMyLDk3LDExNiwKKyAgICAxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMTUsCisgICAgMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwKKyAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTUsMTAxLDExMywxMTcsMTAxLDExMCw5OSwxMDEsMzIsMTExLDEwMiwzMiwxMTIsOTcsCisgICAgMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTA1LDEwMSwxMTUsMzIsMTE2LDExMSwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE1LDQ2LDMyLDMyLDczLDEwMiwzMiwxMTUsMTAxLDExNiw0NCwzMiwxMDUsMTE1LDk1LAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiw5OCwKKyAgICAxMDEsMTAsMzIsMzIsMzIsMzIsODQsMTE0LDExNywxMDEsNDUsNDUsOTcsMTEwLDEwMCwzMiwKKyAgICA3MCw5NywxMDgsMTE1LDEwMSwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw4MCw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTUsMzIsOTcsCisgICAgMTE0LDEwMSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTUsMzIsMTE2LDEwNCw5NywxMTYsMzIsNDAsMTA5LDk3LDEyMSw0MSwzMiwxMDQsOTcsMTE4LAorICAgIDEwMSwzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NiwzMiwzMiw3MywKKyAgICAxMDIsMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMTAsMzIsMzIsMzIsMzIsMTA0LDk3LDExNSwKKyAgICAzMiw5NywzMiwxMTAsMTExLDExMCw0NSw3OCwxMTEsMTEwLDEwMSwzMiwxMTgsOTcsMTA4LDExNywKKyAgICAxMDEsMzIsMTA1LDExMCwzMiw5NiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAogICAgIDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsCi0gICAgOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTAxLDExMywxMTcsMTAxLDExMCw5OSwKLSAgICAxMDEsMzIsMTExLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTA1LDEwMSwKLSAgICAxMTUsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsCi0gICAgMTE5LDEwNCwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExNSwKLSAgICAxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDMyLDMyLDczLDEwMiwzMiwxMTUsCi0gICAgMTAxLDExNiw0NCwzMiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTUsCi0gICAgMTA0LDExMSwxMTcsMTA4LDEwMCwzMiw5OCwxMDEsMTAsMzIsMzIsMzIsMzIsODQsMTE0LDExNywKLSAgICAxMDEsNDUsNDUsOTcsMTEwLDEwMCwzMiw3MCw5NywxMDgsMTE1LDEwMSwzMiwxMTEsMTE2LDEwNCwKLSAgICAxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4MCw5Nyw5OSwKLSAgICAxMDcsOTcsMTAzLDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTE2LDEwNCw5NywxMTYsMzIsNDAsMTA5LAotICAgIDk3LDEyMSw0MSwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDExNSw0NiwzMiwzMiw3MywxMDIsMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMTAsCi0gICAgMzIsMzIsMzIsMzIsMTA0LDk3LDExNSwzMiw5NywzMiwxMTAsMTExLDExMCw0NSw3OCwxMTEsCi0gICAgMTEwLDEwMSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LDExMCwzMiw5NiwxMTUsMTE3LDk4LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLAotICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsOTYsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMTAsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsCi0gICAgMTE5LDEwNSwxMDgsMTA4LDMyLDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwKLSAgICAxMDksMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsOTcsMTE1LDMyLDExMiw5NywKLSAgICA5OSwxMDcsOTcsMTAzLDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksMTEwLDEwOCwKLSAgICAxMjEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE1LDMyLDQwLDExNSwxMDEsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsOTcsOTgsOTksNDYsNzcsMTAxLDExNiwKLSAgICA5Nyw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LAotICAgIDk5LDQ2LDgwLDk3LDExNiwxMDQsNjksMTEwLDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMjEsCi0gICAgMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDMyLDEwNSwxMTAsMTE1LDExNiwKLSAgICA5NywxMTAsOTksMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwyMTgsNiwxMTEsMTE0LAotICAgIDEwNSwxMDMsMTA1LDExMCw3OCwyMTgsMTIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwxMTUsMTE2LAotICAgIDk3LDExNiwxMDEsMjE4LDEwLDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LAotICAgIDMsMCwwLDAsMywwLDAsMCw2LDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDc5LDAsMCwwLDEyNCwxLDAsMTI0LDAsMCw5NSwKLSAgICAwLDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMjQsMywwLDEyNCwwLAotICAgIDAsOTUsMiwwLDEyNCw0LDAsMTI0LDAsMCw5NSwzLDAsMTI0LDUsMCwKLSAgICAxMTQsNDgsMCwxMDMsMCwwLDExMCwzLDAsMTAwLDAsMCwxMjQsMCwwLDk1LAotICAgIDQsMCwxMDAsMSwwLDEyNCwwLDAsOTUsNSwwLDEwMCwwLDAsMTI0LDAsCi0gICAgMCw5NSw2LDAsMTAwLDAsMCw4Myw0MSwyLDc4LDcwLDQxLDcsMTE0LDE1LAotICAgIDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwKLSAgICAwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSwKLSAgICA5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwyMTgsMTMsCi0gICAgOTUsMTE1LDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDk3LDExNiwxMTYsMTE0LDIxOCw3LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTAwLDQxLDYsMTE0LDE5LDAsMCwwLDExNCwxNSwwLAotICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA4LDAsMCwKLSAgICAwLDExNCwxMDksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTEsMCwwLDAsMTE0LDIwLDAsMCwwLDExNiwxLDAsMCwxMTUsMTQsCi0gICAgMCwwLDAsMCwyLDksMSw5LDEsOSwxLDksMSwyMSwzLDksCi0gICAgMSwxMjIsMTksNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk1LDk1LAotICAgIDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxNDcsMCwwLDAsCi0gICAgMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDEwMCwKLSAgICAyLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwyLDAsMTMxLDEsMCwxMDMsMiwKLSAgICAwLDEyNSwxLDAsMTI0LDAsMCwxMDYsMywwLDEwMCwwLDAsMTA3LDksMCwKLSAgICAxMTQsNzYsMCwxMjQsMSwwLDEwNiw0LDAsMTAwLDMsMCwxMDYsMCwwLDEyNCwKLSAgICAwLDAsMTA2LDMsMCwxMzEsMSwwLDEzMSwxLDAsMSwxMjQsMCwwLDEwNiwKLSAgICA1LDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMTYsMCwxMjQsMSwwLDEwNiw0LAotICAgIDAsMTAwLDQsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDUsMCwxMzEsMSwwLAotICAgIDEzMSwxLDAsMSwxMDAsNSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsNiwwLAotICAgIDEwNiw3LDAsMTAwLDYsMCwxMDYsOCwwLDEyNCwxLDAsMTMxLDEsMCwxMzEsCi0gICAgMiwwLDgzLDQxLDcsNzgsMTIyLDksMTEwLDk3LDEwOSwxMDEsNjEsMTIzLDMzLDExNCwKLSAgICAxMjUsMTIyLDExLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNjEsMTIzLDMzLDExNCwxMjUsMTIyLDExLAotICAgIDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDYxLDEyMywzMywxMTQsMTI1LDEyMiwyOSwxMTUsMTE3LDk4LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLAotICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsNjEsMTIzLDEyNSwxMjIsNiwxMjMsMTI1LDQwLDEyMywKLSAgICAxMjUsNDEsMTIyLDIsNDQsMzIsNDEsOSwxMTQsNTAsMCwwLDAsMTE0LDE1LDAsCi0gICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDIxOCw2LDk3LDExMiwKLSAgICAxMTIsMTAxLDExMCwxMDAsMTE0LDExMCwwLDAsMCwyMTgsOSw5NSw5NSw5OSwxMDgsOTcsCi0gICAgMTE1LDExNSw5NSw5NSwxMTQsMSwwLDAsMCwyMTgsNCwxMDYsMTExLDEwNSwxMTAsNDEsCi0gICAgMiwxMTQsMTksMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw1MiwwLDAsMCwxMjgsCi0gICAgMSwwLDAsMTE1LDE2LDAsMCwwLDAsMSwxNSwxLDIxLDEsMTUsMSwKLSAgICAyNSwxLDE1LDEsMTIsMSwxMywxLDEyMiwxOSw3NywxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDgzLDExMiwxMDEsOTksNDYsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDk5LDIsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNDUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNSwyLDAsCi0gICAgMTIxLDEwNywwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LAotICAgIDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsMiwwLDEyNCwxLDAsMTA2LDIsCi0gICAgMCwxMDcsMiwwLDExMSwxMTQsMCwxMjQsMCwwLDEwNiwzLDAsMTI0LDEsMCwKLSAgICAxMDYsMywwLDEwNywyLDAsMTExLDExNCwwLDEyNCwyLDAsMTI0LDEsMCwxMDYsCi0gICAgMCwwLDEwNywyLDAsMTExLDExNCwwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwKLSAgICAwLDEwNiw0LDAsMTA3LDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsNSwwLAotICAgIDEyNCwxLDAsMTA2LDUsMCwxMDcsMiwwLDgzLDg3LDExMCwyMiwwLDQsMTE2LAotICAgIDYsMCwxMDcsMTAsMCwxMTQsMTQwLDAsMSwxLDEsMTAwLDEsMCw4Myw4OSwKLSAgICAxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsMiw3OCw3MCw0MSw3LDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDE1LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsCi0gICAgMCwwLDIxOCw2LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDIxOCwxMiwxMDQsOTcsMTE1LDk1LAotICAgIDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCw5NiwwLDAsMCw0MSwzLDExNCwKLSAgICAxOSwwLDAsMCw5MCw1LDExMSwxMTYsMTA0LDEwMSwxMTQsOTAsNCwxMTUsMTA5LDExNSwKLSAgICAxMDgsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCi0gICAgMjE4LDYsOTUsOTUsMTAxLDExMyw5NSw5NSwxMzgsMSwwLDAsMTE1LDIwLDAsMCwKLSAgICAwLDAsMSw5LDEsMywxLDE4LDEsMTgsMSwxOCwxLDE1LDEsMTgsCi0gICAgMSwyMCwxLDEzLDEsMTIyLDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSwKLSAgICA5OSw0Niw5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDg1LDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDc4LAotICAgIDAsMTI0LDAsMCwxMDYsMSwwLDEwMCwwLDAsMTA3LDksMCwxMTQsNzgsMCwKLSAgICAxMjQsMCwwLDEwNiwyLDAsMTE0LDc4LDAsMTE2LDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDU3LDAsMTE2LDQsMCwxMzAsMSwwLDExNiwzLDAsMTA2LDUsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDAsMCwKLSAgICAxMjQsMCwwLDEwNiwwLDAsODMsNDEsMSw3OCw0MSw2LDExNCwxMTIsMCwwLAotICAgIDAsMTE0LDEwNywwLDAsMCwxMTQsMTExLDAsMCwwLDIxOCwxOSw5NSw5OCwxMTEsCi0gICAgMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LAotICAgIDIxOCwxOSw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCwKLSAgICA2OSwxMTQsMTE0LDExMSwxMTQsOTAsMTEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSwxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExNiwwLDAsMCwxNTAsMSwwLAotICAgIDAsMTE1LDEyLDAsMCwwLDAsMiwxNSwxLDI0LDEsMTIsMSw2LDEsCi0gICAgMjEsMSwxMjIsMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsMTAwLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCi0gICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEyNCwKLSAgICAxLDAsMTI0LDAsMCw5NSwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLAotICAgIDEsMTE0LDExMiwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsMTE2LDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwxMTYsMCwwLDAsMTU5LDEsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw0NiwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTAwLDEsMCwxMDcsOCwwLDExNCwzNSwwLDEyNCwwLDAsMTA2LDEsMCwKLSAgICAxMDYsMiwwLDEwMCwyLDAsMTMxLDEsMCwxMDAsMywwLDI1LDgzLDEyNCwwLAotICAgIDAsMTA2LDEsMCw4MywxMDAsMSwwLDgzLDQxLDQsMTIyLDMyLDg0LDEwNCwxMDEsCi0gICAgMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0Niw3OCwyMTgsMSwKLSAgICA0NiwxMTQsMzMsMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwwLDExNCwxNSwwLAotICAgIDAsMCwyMTgsMTAsMTE0LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsNDEsMSwKLSAgICAxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwxNjMsMSwwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCwzLDE1LDEsMjAsMiwxMjIsMTcsNzcsMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTksMSwKLSAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsODMsNDEsCi0gICAgMSw3OCw0MSwxLDExNCwxMTEsMCwwLDAsNDEsMSwxMTQsMTksMCwwLDAsCisgICAgOTYsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk5LDExMSwKKyAgICAxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA4LAorICAgIDExMSw5NywxMDAsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAorICAgIDExMiwxMDEsOTksMzIsOTcsMTE1LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTUsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsNzksMTEwLDEwOCwxMjEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsMTE1LDMyLDQwLDExNSwxMDEsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsCisgICAgOTgsNDYsOTcsOTgsOTksNDYsNzcsMTAxLDExNiw5Nyw4MCw5NywxMTYsMTA0LDcwLDEwNSwKKyAgICAxMTAsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LDk5LDQ2LDgwLDk3LDExNiwxMDQsNjksCisgICAgMTEwLDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsMzIsMTE1LDEwNCwxMTEsMTE3LAorICAgIDEwOCwxMDAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMjEsMzIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA4MywxMTIsMTAxLDk5LDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDExNSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiw3OCw0MSwzLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLAorICAgIDIxOCwxMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDExNSwxMTYsOTcsMTE2LDEwMSwyMTgsMTAsCisgICAgMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMywwLDAsMCwzLAorICAgIDAsMCwwLDYsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgNTQsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMjQsMiwxMjQsMCw5NSwxLAorICAgIDEyNCwzLDEyNCwwLDk1LDIsMTI0LDQsMTI0LDAsOTUsMywxMjQsNSwxMTQsMzIsCisgICAgMTAzLDAsMTEwLDIsMTAwLDAsMTI0LDAsOTUsNCwxMDAsMSwxMjQsMCw5NSw1LAorICAgIDEwMCwwLDEyNCwwLDk1LDYsMTAwLDAsODMsMCw0MSwyLDc4LDcwLDQxLDcsCisgICAgMTE0LDE1LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwKKyAgICAxMDgsMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwKKyAgICAyMTgsMTMsOTUsMTE1LDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDk3LDExNiwxMTYsMTE0LDIxOCwKKyAgICA3LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDQxLDYsMTE0LDE5LDAsMCwwLDExNCwKKyAgICAxNSwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA4LAorICAgIDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIwLDAsMCwwLDExNiwxLDAsMCwKKyAgICAxMTUsMTQsMCwwLDAsMCwyLDYsMSw2LDEsNiwxLDYsMSwxNCwKKyAgICAzLDYsMSwxMjIsMTksNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LAorICAgIDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxMDIsMCwKKyAgICAwLDAsMTAwLDEsMTA2LDAsMTI0LDAsMTA2LDEsMTMxLDEsMTAwLDIsMTA2LDAsCisgICAgMTI0LDAsMTA2LDIsMTMxLDEsMTAzLDIsMTI1LDEsMTI0LDAsMTA2LDMsMTAwLDAsCisgICAgMTA3LDksMTE0LDUyLDEyNCwxLDEwNiw0LDEwMCwzLDEwNiwwLDEyNCwwLDEwNiwzLAorICAgIDEzMSwxLDEzMSwxLDEsMCwxMjQsMCwxMDYsNSwxMDAsMCwxMDcsOSwxMTQsODAsCisgICAgMTI0LDEsMTA2LDQsMTAwLDQsMTA2LDAsMTI0LDAsMTA2LDUsMTMxLDEsMTMxLDEsCisgICAgMSwwLDEwMCw1LDEwNiwwLDEyNCwwLDEwNiw2LDEwNiw3LDEwMCw2LDEwNiw4LAorICAgIDEyNCwxLDEzMSwxLDEzMSwyLDgzLDAsNDEsNyw3OCwxMjIsOSwxMTAsOTcsMTA5LAorICAgIDEwMSw2MSwxMjMsMzMsMTE0LDEyNSwxMjIsMTEsMTA4LDExMSw5NywxMDAsMTAxLDExNCw2MSwxMjMsCisgICAgMzMsMTE0LDEyNSwxMjIsMTEsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsNjEsMTIzLDMzLDExNCwxMjUsCisgICAgMTIyLDI5LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsCisgICAgOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw2MSwxMjMsMTI1LDEyMiwKKyAgICA2LDEyMywxMjUsNDAsMTIzLDEyNSw0MSwxMjIsMiw0NCwzMiw0MSw5LDExNCw1MCwwLAorICAgIDAsMCwxMTQsMTUsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLAorICAgIDAsMjE4LDYsOTcsMTEyLDExMiwxMDEsMTEwLDEwMCwxMTQsMTEwLDAsMCwwLDIxOCw5LAorICAgIDk1LDk1LDk5LDEwOCw5NywxMTUsMTE1LDk1LDk1LDExNCwxLDAsMCwwLDIxOCw0LAorICAgIDEwNiwxMTEsMTA1LDExMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsMjksMCwwLDAsCiAgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAotICAgIDExNywwLDAsMCwxNzEsMSwwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwKLSAgICAyMyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsMTA0LDk3LDExNSw5NSwKLSAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDEsCi0gICAgMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCw5OCwxMTEsMTExLDEwOCwKLSAgICAxMTQsMTExLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDIxOCw1LDExOCw5NywKLSAgICAxMDgsMTE3LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAotICAgIDAsMCwxMTQsMTE3LDAsMCwwLDE3NSwxLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDIsNDEsMTIsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCw1MiwwLAotICAgIDAsMCwxMTQsMTE4LDAsMCwwLDIxOCw4LDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDExNiwKLSAgICAxMjEsMTE0LDExNiwwLDAsMCwyMTgsNiwxMTUsMTAxLDExNiwxMTYsMTAxLDExNCwxMTQsMTIzLAotICAgIDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDYsMCwwLAotICAgIDAsNzksMSwwLDAsMTE1LDIwLDAsMCwwLDEyLDM1LDYsMiwxNSwxLAotICAgIDE1LDExLDEyLDEwLDEyLDEyLDE4LDksMjEsNCwxOCw4LDE4LDQsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsOTksMiwwLAorICAgIDUyLDAsMCwwLDEyOCwxLDAsMCwxMTUsMTYsMCwwLDAsMCwxLDEwLAorICAgIDEsMTQsMSwxMCwxLDE4LDEsMTAsMSw4LDEsMTAsMSwxMjIsMTksNzcsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCwKKyAgICA5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTAyLDAsMCwwLDEyNCwwLDEwNiwwLAorICAgIDEyNSwyLDEyMSw3MCwxMjQsMCwxMDYsMSwxMjQsMSwxMDYsMSwxMDcsMiwxMTEsNzYsCisgICAgMTI0LDAsMTA2LDIsMTI0LDEsMTA2LDIsMTA3LDIsMTExLDc2LDEyNCwwLDEwNiwzLAorICAgIDEyNCwxLDEwNiwzLDEwNywyLDExMSw3NiwxMjQsMiwxMjQsMSwxMDYsMCwxMDcsMiwKKyAgICAxMTEsNzYsMTI0LDAsMTA2LDQsMTI0LDEsMTA2LDQsMTA3LDIsMTExLDc2LDEyNCwwLAorICAgIDEwNiw1LDEyNCwxLDEwNiw1LDEwNywyLDgzLDAsNCwwLDExNiw2LDEwNywxMCwKKyAgICAxMTQsOTYsMSwwLDEsMCwxLDAsMTAwLDEsODMsMCw4OCwwLDEwMCwwLAorICAgIDgzLDAsNDEsMiw3OCw3MCw0MSw3LDExNCwxMTAsMCwwLDAsMTE0LDE1LDAsCisgICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDIxOCw2LDk5LDk3LAorICAgIDk5LDEwNCwxMDEsMTAwLDIxOCwxMiwxMDQsOTcsMTE1LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDExNCw5NiwwLDAsMCw0MSwzLDExNCwxOSwwLDAsMCw5MCw1LAorICAgIDExMSwxMTYsMTA0LDEwMSwxMTQsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDYsOTUsOTUsMTAxLDExMywKKyAgICA5NSw5NSwxMzgsMSwwLDAsMTE1LDIwLDAsMCwwLDAsMSw2LDEsMiwKKyAgICAxLDEyLDEsMTIsMSwxMiwxLDEwLDEsMTIsMSwxMiwxLDE0LDEsMTIyLAorICAgIDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0Niw5NSw5NSwxMDEsMTEzLAorICAgIDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDIsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDU4LDAsMCwwLDEyNCwwLDEwNiwwLAorICAgIDEwMCwwLDEwNyw4LDExNCw1MiwxMjQsMCwxMDYsMSwxMDAsMCwxMDcsOSwxMTQsNTIsCisgICAgMTI0LDAsMTA2LDIsMTE0LDUyLDExNiwzLDEwMCwwLDEwNyw4LDExNCwzOCwxMTYsNCwKKyAgICAxMzAsMSwxMTYsMywxMDYsNSwxMjQsMCwxMDYsMSwxMzEsMSwxMjQsMCw5NSwwLAorICAgIDEyNCwwLDEwNiwwLDgzLDAsNDEsMSw3OCw0MSw2LDExNCwxMTIsMCwwLDAsCisgICAgMTE0LDEwNywwLDAsMCwxMTQsMTExLDAsMCwwLDIxOCwxOSw5NSw5OCwxMTEsMTExLAorICAgIDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsMTA4LDIxOCwKKyAgICAxOSw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsOTAsMTEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwKKyAgICAxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExNiwwLDAsMCwxNTAsMSwwLDAsCisgICAgMTE1LDEyLDAsMCwwLDAsMiwxMCwxLDE2LDEsOCwxLDQsMSwxNCwKKyAgICAxLDEyMiwxNyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTksOTcsCisgICAgOTksMTA0LDEwMSwxMDAsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTI0LDEsCisgICAgMTI0LDAsOTUsMCwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMSwxMTQsMTEyLDAsCisgICAgMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDExNiwwLAorICAgIDAsMCwxNTksMSwwLDAsMTE1LDIsMCwwLDAsMCwyLDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDM4LDAsMCwwLDEyNCwwLDEwNiwwLDEwMCwxLDEwNyw4LDExNCwKKyAgICAyOCwxMjQsMCwxMDYsMSwxMDYsMiwxMDAsMiwxMzEsMSwxMDAsMywyNSwwLDgzLAorICAgIDAsMTEwLDYsMTI0LDAsMTA2LDEsODMsMCwxMDAsMSw4MywwLDQxLDQsMTIyLAorICAgIDMyLDg0LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKKyAgICA0Niw3OCwyMTgsMSw0NiwxMTQsMzMsMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwKKyAgICAwLDExNCwxNSwwLDAsMCwyMTgsMTAsMTE0LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LAorICAgIDExMSwxMTAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKKyAgICAxNjMsMSwwLDAsMTE1LDYsMCwwLDAsMCwzLDEwLDEsMTgsMiwxMjIsCisgICAgMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDExMiw5NywxMTQsMTAxLAorICAgIDExMCwxMTYsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsNiwwLDAsMCwxMjQsMCwxMDYsMCwKKyAgICA4MywwLDQxLDEsNzgsNDEsMSwxMTQsMTExLDAsMCwwLDQxLDEsMTE0LDE5LAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDExNCwxMTcsMCwwLDAsMTcxLDEsMCwwLDExNSwyLDAsMCwwLAorICAgIDAsMiwxMjIsMjMsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDEwNCwKKyAgICA5NywxMTUsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsOTksMiwwLDAsMCwKKyAgICAwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMTQsMCwwLDAsMTE2LDAsMTI0LDEsMTMxLDEsMTI0LDAsOTUsMSwxMDAsCisgICAgMCw4MywwLDQxLDEsNzgsNDEsMiwyMTgsNCw5OCwxMTEsMTExLDEwOCwxMTQsMTExLAorICAgIDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDIxOCw1LDExOCw5NywxMDgsMTE3LAorICAgIDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKKyAgICAxMTQsMTE3LDAsMCwwLDE3NSwxLDAsMCwxMTUsMiwwLDAsMCwwLDIsCisgICAgNDEsMTIsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLAorICAgIDAsMTE0LDMsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCw1MiwwLDAsMCwKKyAgICAxMTQsMTE4LDAsMCwwLDIxOCw4LDExMiwxMTQsMTExLDExMiwxMDEsMTE0LDExNiwxMjEsMTE0LAorICAgIDExNiwwLDAsMCwyMTgsNiwxMTUsMTAxLDExNiwxMTYsMTAxLDExNCwxMTQsMTIzLDAsMCwKKyAgICAwLDExNCwxMTcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDYsMCwwLDAsNzksCisgICAgMSwwLDAsMTE1LDIwLDAsMCwwLDgsMzUsNCwyLDQsMSwxNCwxMSwKKyAgICA4LDEwLDgsMTIsMTIsOSwxNCw0LDEyLDgsMTIsNCwxMTQsMTA2LDAsMCwKKyAgICAwLDQxLDIsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDk5LDIsMCwKICAgICAwLDAsMiwwLDAsMCw2LDAsMCwwLDE1LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwyMTcsMCwwLDAsMTE2LDAsMCwxMjQsMSwwLDEwMCwxLDAsCi0gICAgMTMxLDIsMCwxMTQsMTEwLDAsMTE2LDEsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LAotICAgIDMzLDAsMTE2LDIsMCwxMzAsMSwwLDExNiwxLDAsMTA2LDMsMCwxMjUsNCwKLSAgICAwLDEyNCwzLDAsMTAwLDIsMCwxMDcsOCwwLDExNCw3MCwwLDEyNCw0LDAsCi0gICAgMTI0LDAsMCwxMDAsMywwLDEyNCwxLDAsMTMxLDEsMSw4MywxMjQsMywwLAotICAgIDExNCw4MiwwLDEwMywwLDAsMTEwLDMsMCwxMDAsMiwwLDEyNSw1LDAsMTI0LAotICAgIDQsMCwxMjQsMCwwLDEwMCwzLDAsMTI0LDEsMCwxMDAsNCwwLDEyNCw1LAotICAgIDAsMTMxLDEsMiw4MywxMjQsMywwLDEwMCwyLDAsMTA3LDgsMCwxMTQsMTkyLAotICAgIDAsMTE2LDAsMCwxMjQsMSwwLDEwMCw1LDAsMTMxLDIsMCwxMTQsMTg2LDAsCi0gICAgMTIxLDE5LDAsMTI0LDEsMCwxMDYsNCwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsCi0gICAgMywwLDg3LDExMywxOTIsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDE4MiwwLAotICAgIDEsMSwxLDEwMCwyLDAsMTI1LDMsMCw4OSwxMTMsMTkyLDAsODgsMTEwLDYsCi0gICAgMCwxMDAsNiwwLDEyNSwzLDAsMTE2LDYsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDcsMCwxMjQsMiwwLDEwMCw1LDAsMTI0LDMsMCwxMzEsMiwyLDgzLAotICAgIDQxLDgsMTIyLDUzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLAotICAgIDExMCwzMiwxMTgsOTcsMTE0LDEwNSwxMTEsMTE3LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNSw0Niw5MCwxMiwxMDMsMTAxLDExNiw5NSwxMDIsCi0gICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsNzgsMTE0LDk5LDAsMCwwLDExNCwxMTAsMCwKLSAgICAwLDAsMTE0LDEwOSwwLDAsMCw3MCwxMTQsMTA3LDAsMCwwLDQxLDcsMTE0LAotICAgIDQsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTIwLDAsMCwwLDIxOCwyMywKLSAgICAxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDEwOCwKLSAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCwxMDksMCwwLDAsMTE0LDc3LDAsMCwKLSAgICAwLDExNCwxMDYsMCwwLDAsNDEsNiwxMTQsMTUsMCwwLDAsMTE0LDk5LDAsCi0gICAgMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTI4LDAsMCwKLSAgICAwLDkwLDYsMTE1LDEwMSw5NywxMTQsOTksMTA0LDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCw4NSwwLDAsMCwxODAsMSwwLAotICAgIDAsMTE1LDM0LDAsMCwwLDAsMiwxNSwxLDEyLDEsNiwxLDksMiwKLSAgICAxMiwxLDE2LDEsMTgsMSwxNSwxLDcsMiwxMiwxLDE1LDEsMywxLAotICAgIDE5LDEsMTMsMSwxNCwzLDYsMiwxMTQsODUsMCwwLDAsOTksMywwLAotICAgIDAsMCwwLDAsMCwwLDgsMCwwLDAsNTMsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDExOCwxLDAsMCwxMjEsMTMsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTI1LDMsMCw4NywxMTAsMTgsMCw0LDExNiwxLDAsMTA3LDEwLDAsMTE0LDMzLAotICAgIDAsMSwxLDEsODksMTEwLDE3LDAsODgsMTI0LDMsMCwxMDAsMCwwLDEwNywKLSAgICA5LDAsMTE0LDUwLDAsMTI0LDMsMCw4MywxMjQsMCwwLDEwNiwyLDAsMTI1LAotICAgIDQsMCwxMjQsMSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTA1LDAsMTIxLDEzLAotICAgIDAsMTI0LDAsMCwxMDYsMywwLDEyNSwxLDAsODcsMTEwLDE4LDAsNCwxMTYsCi0gICAgMSwwLDEwNywxMCwwLDExNCwxMDQsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LAotICAgIDEyMSwxMywwLDEyNCwwLDAsMTA2LDQsMCwxMjUsNSwwLDg3LDExMCwyNCwwLAotICAgIDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsMTQ0LDAsMSwxLDEsMTAwLDAsMCwKLSAgICAxMjUsNSwwLDg5LDExMCwxLDAsODgsMTI0LDIsMCwxMDAsMCwwLDEwNyw4LAotICAgIDAsMTE0LDIxOCwwLDEyNCw1LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwyMTIsMCwKLSAgICAxMjEsMTMsMCwxMjQsMSwwLDEwNiw1LDAsMTI1LDIsMCw4NywxMTMsMjE4LDAsCi0gICAgNCwxMTYsMSwwLDEwNywxMCwwLDExNCwyMDgsMCwxLDEsMSwxMDAsMCwwLAotICAgIDEyNSwyLDAsODksMTEzLDIxOCwwLDg4LDExMCw2LDAsMTI0LDUsMCwxMjUsMiwKLSAgICAwLDEyMSwxMywwLDEyNCwwLDAsMTA2LDYsMCwxMjUsNiwwLDg3LDExMCwyNCwKLSAgICAwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsMSwxLDEsMSwxLDEwMCwwLAotICAgIDAsMTI1LDYsMCw4OSwxMTAsMSwwLDg4LDEyMSwxOSwwLDExNiw3LDAsMTI0LAotICAgIDAsMCwxMDYsOCwwLDEzMSwxLDAsMTI1LDcsMCw4NywxMTAsMjQsMCw0LAotICAgIDExNiwxLDAsMTA3LDEwLDAsMTE0LDQ3LDEsMSwxLDEsMTAwLDAsMCwxMjUsCi0gICAgNywwLDg5LDExMCwxLDAsODgsMTE2LDksMCwxMjQsNCwwLDEyNCwxLDAsCi0gICAgMTAwLDEsMCwxMjQsMiwwLDEzMSwyLDEsMTI1LDMsMCwxMjQsNSwwLDEwMCwKLSAgICAwLDAsMTA3LDgsMCwxMTQsODcsMSwxMDAsMiwwLDExMCwzLDAsMTAwLDMsCi0gICAgMCwxMjQsMywwLDk1LDEwLDAsMTI0LDYsMCwxMjQsMywwLDk1LDExLDAsCi0gICAgMTI0LDcsMCwxMjQsMywwLDk1LDEyLDAsMTI0LDMsMCw4Myw0MSw0LDc4LAotICAgIDExNCwxMDcsMCwwLDAsNzAsODQsNDEsMTMsMTE0LDk1LDAsMCwwLDExNCw5NiwKLSAgICAwLDAsMCwxMTQsMSwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDk4LDAsCi0gICAgMCwwLDkwLDcsOTUsNzksODIsNzMsNzEsNzMsNzgsMjE4LDEwLDk1LDk1LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsMTAwLDk1LDk1LDIxOCw0LDEwOCwxMDUsMTE1LDExNiwyMTgsOCw5NSwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSw5NSwxMTQsMTA2LDAsMCwwLDExNCwxMTEsMCwwLAotICAgIDAsMTE0LDExNiwwLDAsMCwxMTQsMTEwLDAsMCwwLDQxLDgsMTE0LDg5LDAsCi0gICAgMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCw4OCwwLDAsCi0gICAgMCwxMTQsMTUsMCwwLDAsOTAsOCwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwKLSAgICAxMTQsMTE2LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LDk1LDExNSwxMTIsMTAxLDk5LAotICAgIDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMDksMSwwLDAsCi0gICAgMTE1LDcyLDAsMCwwLDAsMiwzLDEsMTMsMSwxMywxLDUsMiwxMiwKLSAgICAxLDQsMiw5LDEsMTIsMSwzLDEsMTMsMSwxMywyLDUsMSwzLAotICAgIDEsMTMsMSwxMywxLDExLDEsMTIsMSwxMiwxLDMsMSwxMywxLDEzLAotICAgIDEsMTQsMiw2LDEsMywxLDEzLDEsMTMsMSwxMSwxLDMsMSwxOSwKLSAgICAxLDEzLDEsMTEsMiwyMSwxLDI3LDEsOSwxLDksMSwxMTQsMTMyLDAsCi0gICAgMCwwLDIxOCw4LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsNzAsOTksMiwwLAotICAgIDAsMCwxLDAsMCwwLDUsMCwwLDAsNTksMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDU0LDIsMCwwLDEyNCwyLDAsMTE1LDMwLDAsMTE2LDAsMCwKLSAgICAxMjQsMSwwLDEwMCwxLDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LAotICAgIDgsMCwxMTQsNjcsMCwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsCi0gICAgMCw5NSwyLDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCwKLSAgICA2NiwwLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDIsMCwxMTUsOTcsMCwKLSAgICAxMTYsMCwwLDEyNCwxLDAsMTAwLDIsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLAotICAgIDAsMCwxMDcsOCwwLDExNCwyMjEsMCwxMjQsMCwwLDEwNiw0LDAsMTI1LDMsCi0gICAgMCwxMjQsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTg3LDAsMTI0LDAsMCwKLSAgICAxMDYsNSwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTg3LDAsMTE2LDYsMCwxMDAsCi0gICAgMCwwLDEwNyw4LDAsMTE0LDE1MSwwLDExNiw3LDAsMTMwLDEsMCwxMTYsNiwKLSAgICAwLDEwNiw4LDAsMTI1LDQsMCwxMjQsNCwwLDEwNiw5LDAsMTI0LDQsMCwKLSAgICAxMzEsMSwwLDEyNSwzLDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwzLDAsOTUsCi0gICAgMTAsMCwxMjEsMTMsMCwxMjQsMywwLDEyNCwxLDAsOTUsMTEsMCw4NywxMTAsCi0gICAgMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDIyMCwwLDEsMSwxLDg5LAotICAgIDExMCwxLDAsODgsMTI0LDIsMCwxMTUsMjUxLDAsMTE2LDAsMCwxMjQsMSwwLAotICAgIDEwMCwzLDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsCi0gICAgMzIsMSwxMjEsMTYsMCwxMjQsMCwwLDEwNiwxMiwwLDEyNCwxLDAsOTUsMTMsCi0gICAgMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDMxLDEsMSwKLSAgICAxLDEsODksMTEwLDEsMCw4OCwxMjEsMTMsMCwxMjQsMCwwLDEyNCwxLDAsCi0gICAgOTUsMTQsMCw4NywxMTAsMTgsMCw0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDY1LAotICAgIDEsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMiwwLDExNSw5NiwxLDExNiwKLSAgICAwLDAsMTI0LDEsMCwxMDAsNCwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwKLSAgICAwLDEwNyw4LDAsMTE0LDE0OCwxLDEyNCwwLDAsMTA2LDUsMCwxMDAsMCwwLAotICAgIDEwNyw5LDAsMTE0LDE0OCwxLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDUsMCwxMjQsCi0gICAgMSwwLDk1LDE1LDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLAotICAgIDExNCwxNDcsMSwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwwLDAsMTA2LDE2LAotICAgIDAsMTE0LDUwLDIsMTI0LDIsMCwxMTUsMTg3LDEsMTE2LDAsMCwxMjQsMSwwLAotICAgIDEwMCw1LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsCi0gICAgMjI0LDEsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMTcsMCwxMjQsMSwwLDk1LDE4LAotICAgIDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCwyMjMsMSwxLAotICAgIDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsMTE1LDI1NCwxLDExNiwwLDAsCi0gICAgMTI0LDEsMCwxMDAsNiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDUwLDIsMTI0LDAsMCwxMDYsMTksMCwxMDAsMCwwLDEwNyw5LAotICAgIDAsMTE0LDUwLDIsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMTksMCwxMjQsMSwwLAotICAgIDk1LDIwLDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCw0OSwKLSAgICAyLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDEsMCw4Myw0MSw3LDc4LAotICAgIDExNCwxLDAsMCwwLDExNCw5MSwwLDAsMCwyMTgsMTEsOTUsOTUsMTEyLDk3LAotICAgIDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDExNCwxMzEsMCwwLDAsMTE0LDk4LDAsMCwKLSAgICAwLDExNCwxMjksMCwwLDAsNDEsMjEsMTE0LDYsMCwwLDAsMTE0LDE1LDAsCi0gICAgMCwwLDExNCwxLDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsOTksMCwwLAotICAgIDAsMTE0LDExMCwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxMjAsMCwwLDAsCi0gICAgMjE4LDE2LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDIxOCw3LDk1LDk1LDExMCwxMDEsMTE5LDk1LDk1LDkwLDUsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsMTE0LDkxLDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDEzNCwwLDAsCi0gICAgMCwxMTQsOTUsMCwwLDAsMTE0LDEzMSwwLDAsMCwxMTQsMTE3LDAsMCwwLAotICAgIDExNCwxMDcsMCwwLDAsMTE0LDk4LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LAotICAgIDEyOSwwLDAsMCw0MSw1LDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgMTE0LDEzMywwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEzNSwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTgsCi0gICAgOTUsMTA1LDExMCwxMDUsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDk3LDExNiwxMTYsCi0gICAgMTE0LDExNSwyNTQsMSwwLDAsMTE1LDkyLDAsMCwwLDAsNCwzMCwxLDMsCi0gICAgMSwxNiwxLDEzLDEsNSwyLDMwLDEsOSwxLDEyLDIsMTUsMSwxMiwKLSAgICAxLDYsMSw5LDIsMTUsMSwxMiwxLDMsMSwxMywxLDEzLDEsNSwKLSAgICAyLDMwLDEsMywxLDE2LDEsMTMsMSw1LDIsMywxLDEzLDEsMTMsCi0gICAgMSw1LDIsMzAsMSwxNSwxLDMsMSwxNiwxLDEzLDEsNSwyLDksCi0gICAgMSwzMCwxLDMsMSwxNiwxLDEzLDEsNSwyLDMwLDEsMTUsMSwzLAotICAgIDEsMTYsMSwxMywxLDUsMSwxMTQsMTM3LDAsMCwwLDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwyLDAsMCwwLDUsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDEyOSwwLDAsMCwxMDAsMSwwLDEyNSwxLDAsMTE2LDAsMCwxMjQsCi0gICAgMCwwLDEwNiwxLDAsMTAwLDIsMCwxMzEsMiwwLDExNCw0NSwwLDEyNCwwLAotICAgIDAsMTA2LDEsMCwxMDYsMiwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsMSwwLAotICAgIDExMCw0MCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEwMCwzLDAsMTMxLAotICAgIDIsMCwxMTQsODUsMCwxMTYsMywwLDEwNiw0LDAsMTAwLDQsMCwxMTYsNSwKLSAgICAwLDEwMCw1LDAsMTAwLDYsMCwxMzEsMiwxLDEsMTI0LDEsMCwxMDAsMSwKLSAgICAwLDEwNyw4LDAsMTE0LDExMiwwLDExNiw2LDAsMTI0LDAsMCwxMDYsNywwLAotICAgIDEzMSwxLDAsMTI1LDEsMCwxMTYsOCwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsCi0gICAgMiwwLDEsMTI0LDEsMCw4Myw0MSw3LDEyMiw0Myw2NywxMTQsMTAxLDk3LDExNiwKLSAgICAxMDEsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsCi0gICAgMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE0LDExMSwxMTgsMTA1LDEwMCwxMDEsMTAwLAotICAgIDMyLDExNSwxMTIsMTAxLDk5LDQ2LDc4LDIxOCwxMyw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDEyMiw4NywxMTUsMTE2LDk3LDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTA1LDExMCwKLSAgICAzMiw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDUxLDQ2LDU0LDQ0LDMyLDEwOCwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsMTE1LDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTAxLDEyMCwKLSAgICAxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA5LDExNywxMTUsMTE2LAotICAgIDMyLDk3LDEwOCwxMTUsMTExLDMyLDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDMyLDk5LDExNCwxMDEsCi0gICAgOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSw5MCwxMCwxMTUsMTE2LAotICAgIDk3LDk5LDEwNywxMDgsMTAxLDExOCwxMDEsMTA4LDIzMywyLDAsMCwwLDQxLDksMTE0LAotICAgIDQsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMzgsMCwwLDAsMjE4LDksCi0gICAgOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwKLSAgICAxOCw2OCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDg3LDk3LDExNCwxMTAsCi0gICAgMTA1LDExMCwxMDMsMTE0LDE2LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTM3LDAsCi0gICAgMCwwLDQxLDIsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTYsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNSwxMTIsMTAxLDk5LDU4LAotICAgIDIsMCwwLDExNSwyMCwwLDAsMCwwLDMsNiwxLDE4LDMsMjEsMSwKLSAgICAxOCwxLDksMiwxMywxLDEyLDEsMTUsMSwxMywxLDExNCwxNDQsMCwwLAotICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMTQ5LDAsMCwwLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDIxLDAsMTAwLDIsMCwxMTAsNiwwLAotICAgIDEyNCwwLDAsMTA2LDAsMCwxMjUsMSwwLDEyNCwwLDAsMTA2LDEsMCwxMDAsCi0gICAgMSwwLDEwNyw4LDAsMTE0LDk1LDAsMTI0LDAsMCwxMDYsMiwwLDEwMCwxLAotICAgIDAsMTA3LDgsMCwxMTQsNzMsMCwxMDAsMywwLDEwNiwzLDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDgzLDEwMCw0LDAsMTA2LDMsMCwxMjQsMSwwLDEyNCwwLDAsCi0gICAgMTA2LDIsMCwxMzEsMiwwLDgzLDExMCw1MCwwLDEyNCwwLDAsMTA2LDQsMCwKLSAgICAxMTQsMTIzLDAsMTAwLDUsMCwxMDYsMywwLDEyNCwxLDAsMTI0LDAsMCwxMDYsCi0gICAgMSwwLDEzMSwyLDAsODMsMTAwLDYsMCwxMDYsMywwLDEyNCwwLDAsMTA2LAotICAgIDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDIsMCw4MywxMDAsMSwwLDgzLAotICAgIDQxLDcsMTIyLDM4LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LAotICAgIDEwMSwxMTIsMTE0LDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsNzgsMTE0LDkzLDAsMCwwLAotICAgIDEyMiwxMyw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw2MiwxMjIsCi0gICAgMjAsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTIzLAotICAgIDMzLDExNCwxMjUsNDEsNjIsMTIyLDIzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywKLSAgICAzMywxMTQsMTI1LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw2MiwxMjIsMTgsCi0gICAgNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTIzLDEyNSwKLSAgICA0MSw2Miw0MSw1LDExNCwxNSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCw5OSwKLSAgICAwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDExNywwLDAsMCw0MSwyLDExNCwKLSAgICA4OCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDk3LDAsMCwwLDc2LDIsMCwKLSAgICAwLDExNSwxNiwwLDAsMCwwLDMsMzAsMSwxNSwxLDE1LDEsMTMsMiwKLSAgICAyMiwyLDksMSwxOSwyLDExNCw5NywwLDAsMCw5OSwyLDAsMCwwLAotICAgIDAsMCwwLDAsNCwwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMjUzLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMiwwLDExNiwxLAotICAgIDAsMTA2LDIsMCwxMzEsMCwwLDEsMTE2LDMsMCwxMjQsMiwwLDEzMSwxLAotICAgIDAsMTQzLDIwOCwwLDEsMTE2LDQsMCwxMDYsNSwwLDEwNiw2LDAsMTI0LDIsCi0gICAgMCwxMzEsMSwwLDEyNCwxLDAsMTA3LDksMCwxMTQsODksMCwxMDAsMSwwLAotICAgIDEwNiw3LDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTE2LDgsMCwxMjQsCi0gICAgMywwLDEwMCwyLDAsMTI0LDIsMCwxMzEsMSwxLDEzMCwxLDAsMTI0LDAsCi0gICAgMCwxMDYsOSwwLDEwMCwzLDAsMTA3LDgsMCwxMTQsMTYzLDAsMTI0LDAsMCwKLSAgICAxMDYsMTAsMCwxMDAsMywwLDEwNyw4LDAsMTE0LDE0MCwwLDExNiw4LDAsMTAwLAotICAgIDQsMCwxMDAsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMSwxLDEzMCwxLAotICAgIDAsMTE2LDExLDAsMTI0LDAsMCwxMjQsMSwwLDEwMCw1LDAsMTAwLDYsMCwKLSAgICAxMzEsMiwxLDEsMTI0LDEsMCw4MywxMTYsMTEsMCwxMjQsMCwwLDEyNCwxLAotICAgIDAsMTAwLDUsMCwxMDAsNiwwLDEzMSwyLDEsMSwxMTYsMTIsMCwxMjQsMCwKLSAgICAwLDEwNiw5LDAsMTAwLDcsMCwxMzEsMiwwLDExNSwyMTksMCwxMjQsMCwwLAotICAgIDEwNiw5LDAsMTA2LDEzLDAsMTI0LDIsMCwxMzEsMSwwLDEsMTEwLDE2LDAsCi0gICAgMTI0LDAsMCwxMDYsOSwwLDEwNiwxNCwwLDEyNCwxLDAsMTMxLDEsMCwxLAotICAgIDg3LDEwMCwzLDAsODEsODIsODgsMTE2LDQsMCwxMDYsNSwwLDEyNCwyLDAsCi0gICAgMjUsODMsNDEsOCwxMjIsNTEsNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiwxMDUsMTEwLDMyLDk3LDExMCwzMiwxMDEsMTIwLDEwNSwKLSAgICAxMTUsMTE2LDEwNSwxMTAsMTAzLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTAsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0NiwxMjIsMzAsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTEwLDExMSwxMTYsMzIsMTA1LDExMCwzMiwxMTUsMTIxLAotICAgIDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMTE0LDE1LDAsMCwwLDc4LDEyMiwKLSAgICAxNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsCi0gICAgMTMzLDAsMCwwLDg0LDExNCwxMzksMCwwLDAsNDEsMTUsMTE0LDE1LDAsMCwKLSAgICAwLDExNCw1NywwLDAsMCwyMTgsMTIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSw5NSwKLSAgICAxMDgsMTExLDk5LDEwNywxMTQsNTQsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwKLSAgICAwLDAsMCwxMTQsNDIsMCwwLDAsMTE0LDUwLDAsMCwwLDExNCw3NywwLAotICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTM3LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwxMTQsMTM5LDAsMCwwLDQxLDQsMTE0LDg4LDAsMCwwLDExNCwKLSAgICA4OSwwLDAsMCwxMTQsMTUsMCwwLDAsMjE4LDMsMTA5LDExNSwxMDMsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg2LDAsCi0gICAgMCwwLDkzLDIsMCwwLDExNSwzMiwwLDAsMCwwLDIsOSwxLDEwLAotICAgIDEsMTMsMSwyNCwxLDE1LDEsMTgsMSwxNSwxLDE1LDEsMjEsMiwxOSwKLSAgICAxLDQsMSwxOSwxLDE4LDQsMTksMiwyMywxLDExNCw4NiwwLDAsMCwKLSAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyNywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsMywxLDAsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTA2LDEsMCwxMjQsMCwwLDEwNiwyLDAsMTMxLDEsMCwxLDExNiwzLDAsCi0gICAgMTA2LDQsMCwxMjQsMCwwLDEwNiwyLDAsMjUsMTI1LDEsMCwxMTYsNSwwLAotICAgIDEyNCwxLDAsMTAwLDEsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOCwwLDExNCw5NiwwLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwKLSAgICAwLDk1LDYsMCw4NywxMTAsMTgsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LAotICAgIDk1LDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMTYsNSwwLDEyNCwxLDAsCi0gICAgMTAwLDIsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAxOTcsMCwxMjEsNTYsMCwxMjQsMSwwLDEwNiw4LDAsMTI0LDEsMCw5NSw5LAotICAgIDAsMTE2LDEwLDAsMTI0LDEsMCwxMDAsMywwLDEzMSwyLDAsMTE1LDE3NSwwLAotICAgIDEyNCwwLDAsMTA2LDIsMCwxMDYsMTEsMCwxMDAsNCwwLDEzMSwxLDAsMTAwLAotICAgIDUsMCwyNSwxMjQsMSwwLDk1LDksMCw4NywxMTAsMTgsMCw0LDExNiw3LAotICAgIDAsMTA3LDEwLDAsMTE0LDE5NiwwLDEsMSwxLDg5LDExMCwxLDAsODgsMTE2LAotICAgIDUsMCwxMjQsMSwwLDEwMCw2LDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMjU1LDAsMTIxLDEzLDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDk1LDEyLDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCwyNTQsCi0gICAgMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwxLDAsODMsNDEsNyw3OCwKLSAgICAxMTQsOTEsMCwwLDAsMTE0LDEzNCwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwKLSAgICAxMjEsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCw5NSwwLDAsMCw0MSwxMywKLSAgICAxMTQsOTksMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LAotICAgIDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsOTEsCi0gICAgMCwwLDAsMTE0LDk2LDAsMCwwLDExNCwxLDAsMCwwLDExNCwxMzQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsOTUsMCwwLAotICAgIDAsNDEsMiwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMDgsCi0gICAgMTExLDk3LDEwMCw5NSw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsOTUsOTksMTExLDEwOSwKLSAgICAxMTIsOTcsMTE2LDEwNSw5OCwxMDgsMTAxLDExOCwyLDAsMCwxMTUsNDAsMCwwLDAsCi0gICAgMCw0LDE5LDIsMTYsMSwyNCwxLDMsMSwxNiwxLDEzLDEsNSwxLAotICAgIDI0LDEsMyw0LDEyLDEsMTUsMSwyOSwxLDEzLDEsNSwxLDI0LDEsCi0gICAgMywxLDEzLDEsMTMsMSw1LDEsMTE0LDE0OCwwLDAsMCw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTU5LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMCwwLAotICAgIDEwNyw5LDAsMTE0LDQzLDAsMTE2LDEsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLAotICAgIDEsMCwxMzEsMiwwLDExNSw0MywwLDExNiwyLDAsMTI0LDAsMCwxMzEsMSwKLSAgICAwLDgzLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsMTE2LDQsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTQzLDc1LDAsMSwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTAwLDAsMCwxMDcsOCwwLDExNCwxMjIsMCwxMjQsMCwwLDEwNiw1LDAsCi0gICAgMTAwLDAsMCwxMDcsOCwwLDExNCwxMzgsMCwxMTYsNiwwLDEwMCwyLDAsMTAwLAotICAgIDMsMCwxMjQsMCwwLDEwNiw3LDAsMTMxLDEsMSwxMzAsMSwwLDExMCwxNiwKLSAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMDYsOCwwLDEyNCwxLDAsMTMxLDEsMCwKLSAgICAxLDg3LDEwMCwwLDAsODEsODIsODgsMTE2LDksMCwxMDYsMTAsMCwxMjQsMCwKLSAgICAwLDEwNiw3LDAsMjUsODMsNDEsNCw3OCwxMTQsMTM5LDAsMCwwLDEyMiwxNCwKLSAgICAxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMTUsCi0gICAgMCwwLDAsNDEsMTEsMTE0LDk5LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICAxNDgsMCwwLDAsMTE0LDE0NCwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTM5LDAsCi0gICAgMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsNDEsMiwxMTQsODgsCisgICAgMCwwLDExNSwxNjQsMCwwLDAsMTE2LDAsMTI0LDEsMTAwLDEsMTMxLDIsMTE0LAorICAgIDgwLDExNiwxLDEwMCwyLDEwNyw4LDExNCwyMiwxMTYsMiwxMzAsMSwxMTYsMSwxMDYsCisgICAgMywxMjUsNCwxMjQsMywxMDAsMiwxMDcsOCwxMTQsNTAsMTI0LDQsMTI0LDAsMTAwLAorICAgIDMsMTI0LDEsMTQ0LDEsMTMxLDEsODMsMCwxMjQsMywxMTQsNTgsMTAzLDAsMTEwLAorICAgIDIsMTAwLDIsMTI1LDUsMTI0LDQsMTI0LDAsMTAwLDMsMTI0LDEsMTAwLDQsMTI0LAorICAgIDUsMTQ0LDIsMTMxLDEsODMsMCwxMjQsMywxMDAsMiwxMDcsOCwxMTQsMTQ0LDExNiwKKyAgICAwLDEyNCwxLDEwMCw1LDEzMSwyLDExNCwxNDAsMTIxLDE0LDEyNCwxLDEwNiw0LDEyNCwKKyAgICAwLDEzMSwxLDEyNSwzLDg3LDAsMTEzLDE0NCw0LDAsMTE2LDUsMTA3LDEwLDExNCwKKyAgICAxMzYsMSwwLDEsMCwxLDAsMTAwLDIsMTI1LDMsODksMCwxMTMsMTQ0LDg4LAorICAgIDAsMTEwLDQsMTAwLDYsMTI1LDMsMTE2LDYsMTI0LDAsMTI0LDEsMTAwLDcsMTI0LAorICAgIDIsMTAwLDUsMTI0LDMsMTQ0LDIsMTMxLDIsODMsMCw0MSw4LDEyMiw1Myw4MiwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE4LDk3LDExNCwKKyAgICAxMDUsMTExLDExNywxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDksMTAxLDExNiwxMDQsCisgICAgMTExLDEwMCwxMTUsNDYsOTAsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywKKyAgICAxMDksMTAxLDc4LDExNCw5OSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMDksMCwKKyAgICAwLDAsNzAsMTE0LDEwNywwLDAsMCw0MSw3LDExNCw0LDAsMCwwLDExNCwKKyAgICAxMTksMCwwLDAsMTE0LDEyMCwwLDAsMCwyMTgsMjMsMTE1LDExMiwxMDEsOTksOTUsCisgICAgMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsCisgICAgMTExLDExMCwxMTQsMTA5LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTA2LDAsMCwKKyAgICAwLDQxLDYsMTE0LDE1LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsCisgICAgMCwwLDExNCwxMDksMCwwLDAsMTE0LDEyOCwwLDAsMCw5MCw2LDExNSwxMDEsCisgICAgOTcsMTE0LDk5LDEwNCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwxMTQsODUsMCwwLDAsMTgwLDEsMCwwLDExNSwzNCwwLDAsCisgICAgMCwwLDIsMTAsMSw4LDEsNCwxLDYsMiw4LDEsMTQsMSwxMiwKKyAgICAxLDEwLDEsOCwyLDgsMSwxMCwxLDIsMSwxNCwxLDE0LDEsMTIsCisgICAgMyw0LDIsMTE0LDg1LDAsMCwwLDk5LDMsMCwwLDAsMCwwLDAsCisgICAgMCw4LDAsMCwwLDUzLDAsMCwwLDY3LDAsMCwwLDExNSw1OCwxLAorICAgIDAsMCwxMjEsMTAsMTI0LDAsMTA2LDAsMTI1LDMsODcsMCwxMTAsMjAsNCwwLAorICAgIDExNiwxLDEwNywxMCwxMTQsMzAsMSwwLDEsMCwxLDAsODksMCwxMTAsMTQsCisgICAgODgsMCwxMjQsMywxMDAsMCwxMDcsOSwxMTQsNDQsMTI0LDMsODMsMCwxMjQsMCwKKyAgICAxMDYsMiwxMjUsNCwxMjQsMSwxMDAsMCwxMDcsOCwxMTQsOTAsMTIxLDEwLDEyNCwwLAorICAgIDEwNiwzLDEyNSwxLDg3LDAsMTEwLDIwLDQsMCwxMTYsMSwxMDcsMTAsMTE0LDg4LAorICAgIDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjEsMTAsMTI0LDAsCisgICAgMTA2LDQsMTI1LDUsODcsMCwxMTAsMjQsNCwwLDExNiwxLDEwNywxMCwxMTQsMTI0LAorICAgIDEsMCwxLDAsMSwwLDEwMCwwLDEyNSw1LDg5LDAsMTEwLDIsODgsMCwKKyAgICAxMjQsMiwxMDAsMCwxMDcsOCwxMTQsMTg0LDEyNCw1LDEwMCwwLDEwNyw4LDExNCwxODAsCisgICAgMTIxLDEwLDEyNCwxLDEwNiw1LDEyNSwyLDg3LDAsMTEzLDE4NCw0LDAsMTE2LDEsCisgICAgMTA3LDEwLDExNCwxNzYsMSwwLDEsMCwxLDAsMTAwLDAsMTI1LDIsODksMCwKKyAgICAxMTMsMTg0LDg4LDAsMTEwLDQsMTI0LDUsMTI1LDIsMTIxLDEwLDEyNCwwLDEwNiw2LAorICAgIDEyNSw2LDg3LDAsMTEwLDI0LDQsMCwxMTYsMSwxMDcsMTAsMTE0LDIxOCwxLDAsCisgICAgMSwwLDEsMCwxMDAsMCwxMjUsNiw4OSwwLDExMCwyLDg4LDAsMTIxLDE0LAorICAgIDExNiw3LDEyNCwwLDEwNiw4LDEzMSwxLDEyNSw3LDg3LDAsMTEwLDI2LDQsMCwKKyAgICAxMTYsMSwxMDcsMTAsMTQ0LDEsMTE0LDQsMSwwLDEsMCwxLDAsMTAwLDAsCisgICAgMTI1LDcsODksMCwxMTAsMiw4OCwwLDExNiw5LDEyNCw0LDEyNCwxLDEwMCwxLAorICAgIDEyNCwyLDE0NCwxLDEzMSwyLDEyNSwzLDEyNCw1LDEwMCwwLDEwNyw4LDE0NCwxLAorICAgIDExNCwzNiwxMDAsMiwxMTAsMiwxMDAsMywxMjQsMyw5NSwxMCwxMjQsNiwxMjQsMywKKyAgICA5NSwxMSwxMjQsNywxMjQsMyw5NSwxMiwxMjQsMyw4MywwLDQxLDQsNzgsMTE0LAorICAgIDEwNywwLDAsMCw3MCw4NCw0MSwxMywxMTQsOTUsMCwwLDAsMTE0LDk2LDAsCisgICAgMCwwLDExNCwxLDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTgsMCwwLAorICAgIDAsOTAsNyw5NSw3OSw4Miw3Myw3MSw3Myw3OCwyMTgsMTAsOTUsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSwxMDAsOTUsOTUsMjE4LDQsMTA4LDEwNSwxMTUsMTE2LDIxOCw4LDk1LDk1LAorICAgIDExMiw5NywxMTYsMTA0LDk1LDk1LDExNCwxMDYsMCwwLDAsMTE0LDExMSwwLDAsMCwKKyAgICAxMTQsMTE2LDAsMCwwLDExNCwxMTAsMCwwLDAsNDEsOCwxMTQsODksMCwwLAorICAgIDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDg4LDAsMCwwLAorICAgIDExNCwxNSwwLDAsMCw5MCw4LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCwKKyAgICAxMTYsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTcsOTUsMTE1LDExMiwxMDEsOTksOTUsCisgICAgMTAyLDExNCwxMTEsMTA5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIwOSwxLDAsMCwxMTUsCisgICAgNzIsMCwwLDAsMCwyLDIsMSwxMCwxLDE0LDEsNiwyLDgsMSwKKyAgICA0LDIsNiwxLDgsMSwyLDEsMTAsMSwxNCwyLDYsMSwyLDEsCisgICAgMTAsMSwxNCwxLDEwLDEsOCwxLDgsMSwyLDEsMTAsMSwxNCwxLAorICAgIDEyLDIsNCwxLDIsMSwxMCwxLDE0LDEsMTAsMSwyLDEsMTQsMSwKKyAgICAxNiwxLDEwLDIsMTYsMSwyMCwxLDYsMSw2LDEsMTE0LDEzMiwwLDAsCisgICAgMCw3MCw0MSwxLDIxOCw4LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsOTksMiwKKyAgICAwLDAsMCwxLDAsMCwwLDUsMCwwLDAsNTksMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDIxMiwxLDAsMCwxMjQsMiwxMTUsMjAsMTE2LDAsMTI0LDEsCisgICAgMTAwLDEsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTE0LDU0LDEyMSwxMiwxMjQsMCwKKyAgICAxMDYsMSwxMjQsMSw5NSwyLDg3LDAsMTEwLDIwLDQsMCwxMTYsMywxMDcsMTAsCisgICAgMTE0LDUyLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMiwKKyAgICAxMTUsNzQsMTE2LDAsMTI0LDEsMTAwLDIsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsCisgICAgMTE0LDE2NiwxMjQsMCwxMDYsNCwxMjUsMywxMjQsMywxMDAsMCwxMDcsOCwxMTQsMTM0LAorICAgIDEyNCwwLDEwNiw1LDEwMCwwLDEwNyw5LDExNCwxMzQsMTE2LDYsMTAwLDAsMTA3LDgsCisgICAgMTE0LDExMCwxMTYsNywxMzAsMSwxMTYsNiwxMDYsOCwxMjUsNCwxMjQsNCwxMDYsOSwKKyAgICAxMjQsNCwxMzEsMSwxMjUsMywxMjQsMCwxMDYsNSwxMjQsMyw5NSwxMCwxMjEsMTAsCisgICAgMTI0LDMsMTI0LDEsOTUsMTEsODcsMCwxMTAsMjAsNCwwLDExNiwzLDEwNywxMCwKKyAgICAxMTQsMTY0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMiwKKyAgICAxMTUsMTg2LDExNiwwLDEyNCwxLDEwMCwzLDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LAorICAgIDExNCwyMjAsMTIxLDEyLDEyNCwwLDEwNiwxMiwxMjQsMSw5NSwxMyw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDMsMTA3LDEwLDExNCwyMTgsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsMiw4OCwwLDEyMSwxMCwxMjQsMCwxMjQsMSw5NSwxNCw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDMsMTA3LDEwLDExNCwyNTAsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsMiw4OCwwLDEyNCwyLDE0NCwxLDExNSwyMCwxMTYsMCwxMjQsMSwxMDAsNCwKKyAgICAxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxNDQsMSwxMTQsNjgsMTI0LDAsMTA2LDUsCisgICAgMTAwLDAsMTA3LDksMTQ0LDEsMTE0LDY4LDEyMSwxMiwxMjQsMCwxMDYsNSwxMjQsMSwKKyAgICA5NSwxNSw4NywwLDExMCwyMiw0LDAsMTE2LDMsMTA3LDEwLDE0NCwxLDExNCw2NiwKKyAgICAxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDAsMTA2LDE2LAorICAgIDE0NCwxLDExNCwyMDgsMTI0LDIsMTQ0LDEsMTE1LDEwMCwxMTYsMCwxMjQsMSwxMDAsNSwKKyAgICAxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxNDQsMSwxMTQsMTM2LDEyMSwxMiwxMjQsMCwKKyAgICAxMDYsMTcsMTI0LDEsOTUsMTgsODcsMCwxMTAsMjIsNCwwLDExNiwzLDEwNywxMCwKKyAgICAxNDQsMSwxMTQsMTM0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwKKyAgICAxMjQsMiwxNDQsMSwxMTUsMTYwLDExNiwwLDEyNCwxLDEwMCw2LDEwMCwwLDEzMSwzLAorICAgIDEwMCwwLDEwNyw4LDE0NCwxLDExNCwyMDgsMTI0LDAsMTA2LDE5LDEwMCwwLDEwNyw5LAorICAgIDE0NCwxLDExNCwyMDgsMTIxLDEyLDEyNCwwLDEwNiwxOSwxMjQsMSw5NSwyMCw4NywwLAorICAgIDExMCwyMiw0LDAsMTE2LDMsMTA3LDEwLDE0NCwxLDExNCwyMDYsMSwwLDEsMCwKKyAgICAxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwxLDgzLDAsNDEsNyw3OCwxMTQsCisgICAgMSwwLDAsMCwxMTQsOTEsMCwwLDAsMjE4LDExLDk1LDk1LDExMiw5Nyw5OSwKKyAgICAxMDcsOTcsMTAzLDEwMSw5NSw5NSwxMTQsMTMxLDAsMCwwLDExNCw5OCwwLDAsMCwKKyAgICAxMTQsMTI5LDAsMCwwLDQxLDIxLDExNCw2LDAsMCwwLDExNCwxNSwwLDAsCisgICAgMCwxMTQsMSwwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDk5LDAsMCwwLAorICAgIDExNCwxMTAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTIwLDAsMCwwLDIxOCwKKyAgICAxNiw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwyMTgsNyw5NSw5NSwxMTAsMTAxLDExOSw5NSw5NSw5MCw1LDk1LDExMiw5NywxMTYsCisgICAgMTA0LDExNCw5MSwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxMzQsMCwwLDAsCisgICAgMTE0LDk1LDAsMCwwLDExNCwxMzEsMCwwLDAsMTE0LDExNywwLDAsMCwxMTQsCisgICAgMTA3LDAsMCwwLDExNCw5OCwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxMjksCisgICAgMCwwLDAsNDEsNSwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwKKyAgICAxMzMsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE4LDk1LAorICAgIDEwNSwxMTAsMTA1LDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSw5NywxMTYsMTE2LDExNCwKKyAgICAxMTUsMjU0LDEsMCwwLDExNSw5MiwwLDAsMCwwLDQsMjAsMSwyLDEsCisgICAgMTIsMSwxNCwxLDYsMiwyMCwxLDYsMSw4LDIsMTAsMSw4LDEsCisgICAgNCwxLDYsMiwxMCwxLDgsMSwyLDEsMTAsMSwxNCwxLDYsMiwKKyAgICAyMCwxLDIsMSwxMiwxLDE0LDEsNiwyLDIsMSwxMCwxLDE0LDEsCisgICAgNiwyLDI0LDEsMTIsMSwyLDEsMTIsMSwxNiwxLDYsMiw4LDEsCisgICAgMjQsMSwyLDEsMTIsMSwxNiwxLDYsMiwyNCwxLDEyLDEsMiwxLAorICAgIDEyLDEsMTYsMSw2LDEsMTE0LDEzNywwLDAsMCw5OSwxLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw5MiwwLDAsMCwxMDAsMSwxMjUsMSwxMTYsMCwxMjQsMCwxMDYsMSwxMDAsCisgICAgMiwxMzEsMiwxMTQsMzAsMTI0LDAsMTA2LDEsMTA2LDIsMTI0LDAsMTMxLDEsMTI1LAorICAgIDEsMTEwLDMwLDExNiwwLDEyNCwwLDEwNiwxLDEwMCwzLDEzMSwyLDExNCw2MCwxMTYsCisgICAgMywxMDYsNCwxMDAsNCwxMTYsNSwxMDAsNSwxMDAsNiwxNDQsMSwxMzEsMiwxLAorICAgIDAsMTI0LDEsMTAwLDEsMTA3LDgsMTE0LDc4LDExNiw2LDEyNCwwLDEwNiw3LDEzMSwKKyAgICAxLDEyNSwxLDExNiw4LDEyNCwwLDEyNCwxLDEzMSwyLDEsMCwxMjQsMSw4MywKKyAgICAwLDQxLDcsMTIyLDQzLDY3LDExNCwxMDEsOTcsMTE2LDEwMSwzMiw5NywzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDExMiwxMTQsMTExLDExOCwxMDUsMTAwLDEwMSwxMDAsMzIsMTE1LDExMiwxMDEsOTksNDYsCisgICAgNzgsMjE4LDEzLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAyMTgsMTEsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDg3LDExNSwKKyAgICAxMTYsOTcsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMDUsMTEwLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwKKyAgICAxMTAsMzIsNTEsNDYsNTQsNDQsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMzIsMTAwLAorICAgIDEwMSwxMDIsMTA1LDExMCwxMDUsMTEwLDEwMywzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTcsMTA4LDExNSwxMTEsMzIsCisgICAgMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDQwLDQxLDIxOCwxMCwxMTUsMTE2LDk3LDk5LDEwNywxMDgsMTAxLDExOCwKKyAgICAxMDEsMTA4LDIzMywyLDAsMCwwLDQxLDksMTE0LDQsMCwwLDAsMTE0LDk5LAorICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMjE4LDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LAorICAgIDExMCwxMDMsMTE1LDIxOCw0LDExOSw5NywxMTQsMTEwLDIxOCwxOCw2OCwxMDEsMTEyLDExNCwxMDEsCisgICAgOTksOTcsMTE2LDEwNSwxMTEsMTEwLDg3LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE0LDE2LDAsCisgICAgMCwwLDExNCwxNSwwLDAsMCwxMTQsMTM3LDAsMCwwLDQxLDIsMTE0LDg4LAogICAgIDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTQsOTUsMTA4LDExMSw5NywxMDAsOTUsMTE3LAotICAgIDExMCwxMDgsMTExLDk5LDEwNywxMDEsMTAwLDE0NywyLDAsMCwxMTUsMjAsMCwwLDAsCi0gICAgMCwyLDE1LDIsMTgsMSwxMCwyLDEyLDEsMTMsMSwxNSwxLDE1LDEsCi0gICAgMjQsMywyMyw1LDExNCwxNDksMCwwLDAsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDEsMCwwLDAsOSwwLDAsMCw2NywwLDAsMCwxMTUsNDcsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMSwxMTYsMiwwLAotICAgIDEyNCwwLDAsMTA2LDMsMCwxMzEsMSwwLDE0MywxNSwwLDEsMTE2LDQsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsODMsODcsMTAwLDEsMCw4MSw4Miw4OCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDE5MSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDMyLDExMCwKLSAgICAxMDEsMTE5LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICA0NCwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTUsMTEyLDEwMSw5OSwzOSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMTAwLDEwMCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA1LAotICAgIDExNiwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICA3MywxMDIsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywKLSAgICAxMDgsMTE0LDEwMSw5NywxMDAsMTIxLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsOTcsMTE2LDMyLDEwMSwxMjAsMTA1LDExNSwKLSAgICAxMTYsMTA1LDExMCwxMDMsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAzLDEwMSwxMTYsMTE1LAotICAgIDEwLDMyLDMyLDMyLDMyLDk5LDEwOCwxMTEsOTgsOTgsMTAxLDExNCwxMDEsMTAwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDc4LDQxLDUsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwKLSAgICAwLDAsMTE0LDU0LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTQ5LDAsMCwKLSAgICAwLDQxLDEsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCw4NywwLDAsMCwxNzAsMiwwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCw5LDEwLDEsMTYsMSwxMTQsODcsMCwwLDAsCi0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNSwwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMjA1LDAsMCwwLDEwMSwwLDAsOTAsMSwwLAotICAgIDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMSw0LDAsMTAwLAotICAgIDIsMCwxMDAsMywwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAxLDYsCi0gICAgMCwxMDAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwyLDAsCi0gICAgMTMxLDEsMCw5MCw3LDAsMTAxLDYsMCwxMDAsNCwwLDEwMCw3LDAsMTAwLAotICAgIDgsMCwxMzIsMSwwLDEzMSwxLDAsOTAsOCwwLDEwMSw2LDAsMTAwLDksCi0gICAgMCwxMDAsMTAsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOSwwLDEwMSw2LDAsCi0gICAgMTAwLDExLDAsMTAwLDEyLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLAotICAgIDYsMCwxMDEsMTEsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsMCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCw5MCwxMiwwLDEwMSw2LDAsMTAxLDExLDAsMTAwLDE1LDAsCi0gICAgMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDEzMSwxLDAsOTAsMTMsMCwxMDEsCi0gICAgNiwwLDEwMSwxMSwwLDEwMCwxNywwLDEwMCwxOCwwLDEzMiwwLDAsMTMxLDEsCi0gICAgMCwxMzEsMSwwLDkwLDE0LDAsMTAxLDYsMCwxMDEsMTUsMCwxMzEsMSwwLAotICAgIDkwLDE2LDAsMTAwLDQsMCw4Myw0MSwxOSwyMTgsMTUsNjYsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDQsNzcsMTAxLDExNiw5NywKLSAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsMTExLDExNCwKLSAgICAzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsCi0gICAgMTExLDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwKLSAgICAxMDgsOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksCi0gICAgMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiw5NywxMTgsMTExLDEwNSwxMDAsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsCi0gICAgMTA1LDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgOTksMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LAotICAgIDEsMCwxMzEsMSwwLDgzLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsCi0gICAgMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsCi0gICAgMTExLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsCi0gICAgMTA4LDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjQsNjAsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsOTgsMTE3LDEwNSwKLSAgICAxMDgsMTE2LDQ1LDEwNSwxMTAsNDEsNjIsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDEsCi0gICAgMCwwLDAsNDEsMSwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDkyLDAsMCwwLDE5NSwyLAotICAgIDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsNzgsOTksNCwwLDAsMCwwLDAsMCwwLAotICAgIDQsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsNTgsMCwwLAotICAgIDAsMTI0LDIsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDE2LDAsMTAwLDAsMCwKLSAgICA4MywxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDExNCw1MCwwLAotICAgIDExNiwyLDAsMTI0LDEsMCwxMjQsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzEsCi0gICAgMiwxLDgzLDEwMCwwLDAsODMsMTAwLDAsMCw4Myw0MSwzLDc4LDExNCwxMDcsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTAyLDExNCwxMTEsMTA5LDk1LDExNSwxMTIsMTAxLDk5LDU4LDIsMCwwLDExNSwyMCwwLAorICAgIDAsMCwwLDMsNCwxLDEyLDMsMTQsMSwxMiwxLDYsMiwxMiwxLAorICAgIDgsMSwxMCwxLDEwLDEsMTE0LDE0NSwwLDAsMCw5OSwxLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxMTAsMCwwLDAsMTI0LDAsMTA2LDAsMTAwLDEsMTA3LDgsMTE0LDE0LDEwMCwKKyAgICAyLDExMCw0LDEyNCwwLDEwNiwwLDEyNSwxLDEyNCwwLDEwNiwxLDEwMCwxLDEwNywKKyAgICA4LDExNCw2OCwxMjQsMCwxMDYsMiwxMDAsMSwxMDcsOCwxMTQsNTIsMTAwLDMsMTA2LAorICAgIDMsMTI0LDEsMTMxLDEsODMsMCwxMTMsMTA2LDEwMCw0LDEwNiwzLDEyNCwxLDEyNCwKKyAgICAwLDEwNiwyLDEzMSwyLDgzLDAsMTEwLDM4LDEyNCwwLDEwNiw0LDExNCw5MCwxMDAsCisgICAgNSwxMDYsMywxMjQsMSwxMjQsMCwxMDYsMSwxMzEsMiw4MywwLDExMCwxNiwxMDAsCisgICAgNiwxMDYsMywxMjQsMCwxMDYsMCwxMjQsMCwxMDYsMSwxMzEsMiw4MywwLDEwMCwKKyAgICAxLDgzLDAsNDEsNywxMjIsMzgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMTQsOTMsCisgICAgMCwwLDAsMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsCisgICAgMTI1LDYyLDEyMiwyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwKKyAgICAzMiw0MCwxMjMsMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LAorICAgIDYyLDEyMiwxOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwKKyAgICA0MCwxMjMsMTI1LDQxLDYyLDQxLDUsMTE0LDE1LDAsMCwwLDExNCwxMDcsMCwwLAorICAgIDAsMTE0LDk5LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTE3LDAsMCwwLAorICAgIDQxLDIsMTE0LDg4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTcsMCwwLDAsCisgICAgNzYsMiwwLDAsMTE1LDE2LDAsMCwwLDAsMywyMCwxLDEwLDEsMTAsCisgICAgMSwxMiwyLDE2LDIsNiwxLDE2LDIsMTE0LDk3LDAsMCwwLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDEyLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwxOTQsMCwwLDAsMTI0LDAsMTA2LDAsMTI1LDIsMTE2LDEsCisgICAgMTA2LDIsMTMxLDAsMSwwLDExNiwzLDEyNCwyLDEzMSwxLDE0MywxNTYsMSwwLAorICAgIDExNiw0LDEwNiw1LDEwNiw2LDEyNCwyLDEzMSwxLDEyNCwxLDEwNyw5LDExNCw2NCwKKyAgICAxMDAsMSwxMDYsNywxMjQsMiwxMzEsMSwxMjUsMywxMTYsOCwxMjQsMywxMDAsMiwKKyAgICAxMjQsMiwxNDQsMSwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsOSwxMDAsMywxMDcsOCwKKyAgICAxMTQsMTIwLDEyNCwwLDEwNiwxMCwxMDAsMywxMDcsOCwxMTQsMTAwLDExNiw4LDEwMCw0LAorICAgIDEwMCwyLDEyNCwwLDEwNiwwLDE0NCwxLDEzMSwxLDEzMCwxLDExNiwxMSwxMjQsMCwKKyAgICAxMjQsMSwxMDAsNSwxMDAsNiwxNDQsMSwxMzEsMiwxLDAsMTI0LDEsODMsMCwKKyAgICAxMTYsMTEsMTI0LDAsMTI0LDEsMTAwLDUsMTAwLDYsMTQ0LDEsMTMxLDIsMSwwLAorICAgIDExNiwxMiwxMjQsMCwxMDYsOSwxMDAsNywxMzEsMiwxMTUsMTYyLDEyNCwwLDEwNiw5LAorICAgIDEwNiwxMywxMjQsMiwxMzEsMSwxLDAsMTEwLDEyLDEyNCwwLDEwNiw5LDEwNiwxNCwKKyAgICAxMjQsMSwxMzEsMSwxLDAsODcsMCwxMDAsMyw4MSwwLDgyLDAsODgsMCwKKyAgICAxMTYsNCwxMDYsNSwxMjQsMiwyNSwwLDgzLDAsNDEsOCwxMjIsNTEsNjksMTIwLAorICAgIDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiwxMDUsCisgICAgMTEwLDMyLDk3LDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDEwNSwxMTAsMTAzLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA0NiwxMjIsMzAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTEwLAorICAgIDExMSwxMTYsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTUsMTE0LDE1LDAsMCwwLDc4LDEyMiwxNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsCisgICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMTMzLDAsMCwwLDg0LDExNCwxMzksMCwKKyAgICAwLDAsNDEsMTUsMTE0LDE1LDAsMCwwLDExNCw1NywwLDAsMCwyMTgsMTIsCisgICAgOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsNTQsMCwwLAorICAgIDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsNDIsMCwwLDAsCisgICAgMTE0LDUwLDAsMCwwLDExNCw3NywwLDAsMCwxMTQsOTksMCwwLDAsMTE0LAorICAgIDExMCwwLDAsMCwxMTQsMTM3LDAsMCwwLDExNCw0LDAsMCwwLDIxOCwxMSwKKyAgICAxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTM5LDAsMCwwLAorICAgIDQxLDQsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDMsMTA5LDExNSwxMDMsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDg2LDAsMCwwLDkzLDIsMCwwLDExNSwzMiwKKyAgICAwLDAsMCwwLDIsNiwxLDgsMSwxMCwxLDE2LDEsMTAsMSwxNCwKKyAgICAxLDEwLDEsMTAsMSwxNiwyLDE2LDEsNCwxLDE2LDEsMTIsNCwxNCwKKyAgICAyLDIyLDEsMTE0LDg2LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDI3LDAsMCwwLDY3LDAsMCwwLDExNSwyMDYsMCwKKyAgICAwLDAsMTI0LDAsMTA2LDAsMTA2LDEsMTI0LDAsMTA2LDIsMTMxLDEsMSwwLAorICAgIDExNiwzLDEwNiw0LDEyNCwwLDEwNiwyLDI1LDAsMTI1LDEsMTE2LDUsMTI0LDEsCisgICAgMTAwLDEsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTE0LDc2LDEyMSwxMiwxMjQsMCwKKyAgICAxMDYsMCwxMjQsMSw5NSw2LDg3LDAsMTEwLDIwLDQsMCwxMTYsNywxMDcsMTAsCisgICAgMTE0LDc0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMTYsNSwKKyAgICAxMjQsMSwxMDAsMiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsMTU0LDEyMSw0MCwKKyAgICAxMjQsMSwxMDYsOCwxMjQsMSw5NSw5LDExNiwxMCwxMjQsMSwxMDAsMywxMzEsMiwKKyAgICAxMTUsMTMwLDEyNCwwLDEwNiwyLDEwNiwxMSwxMDAsNCwxMzEsMSwxMDAsNSwyNSwwLAorICAgIDEyNCwxLDk1LDksODcsMCwxMTAsMjAsNCwwLDExNiw3LDEwNywxMCwxMTQsMTUyLAorICAgIDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMTYsNSwxMjQsMSwKKyAgICAxMDAsNiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsMjAyLDEyMSwxMCwxMjQsMCwKKyAgICAxMjQsMSw5NSwxMiw4NywwLDExMCwyMCw0LDAsMTE2LDcsMTA3LDEwLDExNCwyMDAsCisgICAgMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwxLDgzLDAsCisgICAgNDEsNyw3OCwxMTQsOTEsMCwwLDAsMTE0LDEzNCwwLDAsMCwxMTQsMTMxLDAsCisgICAgMCwwLDExNCwxMjEsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCw5NSwwLDAsCisgICAgMCw0MSwxMywxMTQsOTksMCwwLDAsMTE0LDE0NywwLDAsMCwxMTQsMTUsMCwKKyAgICAwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsNiwwLDAsCisgICAgMCwxMTQsOTEsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCwxLDAsMCwwLAorICAgIDExNCwxMzQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsCisgICAgOTUsMCwwLDAsNDEsMiwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKKyAgICAyNSw5NSwxMDgsMTExLDk3LDEwMCw5NSw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsOTUsCisgICAgOTksMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDgsMTAxLDExOCwyLDAsMCwxMTUsNDAsCisgICAgMCwwLDAsMCw0LDE0LDIsMTIsMSwxNiwxLDIsMSwxMiwxLDE0LAorICAgIDEsNiwxLDE2LDEsMiw0LDgsMSwxMCwxLDIyLDEsMTQsMSw2LAorICAgIDEsMTYsMSwyLDEsMTAsMSwxNCwxLDYsMSwxMTQsMTQ5LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxMjAsMCwwLDAsMTI0LDAsMTA2LDAsMTAwLDAsCisgICAgMTA3LDksMTE0LDMwLDExNiwxLDEyNCwwLDEwNiwwLDEwMCwxLDEzMSwyLDExNSwzMCwKKyAgICAxMTYsMiwxMjQsMCwxMzEsMSw4MywwLDExNiwzLDEyNCwwLDEzMSwxLDEyNSwxLAorICAgIDExNiw0LDEyNCwxLDEzMSwxLDE0Myw1NiwxLDAsMTI0LDAsMTA2LDAsMTAwLDAsCisgICAgMTA3LDgsMTE0LDg2LDEyNCwwLDEwNiw1LDEwMCwwLDEwNyw4LDExNCw5OCwxMTYsNiwKKyAgICAxMDAsMiwxMDAsMywxMjQsMCwxMDYsNywxNDQsMSwxMzEsMSwxMzAsMSwxMTAsMTIsCisgICAgMTI0LDAsMTA2LDAsMTA2LDgsMTI0LDEsMTMxLDEsMSwwLDg3LDAsMTAwLDAsCisgICAgODEsMCw4MiwwLDg4LDAsMTE2LDksMTA2LDEwLDEyNCwwLDEwNiw3LDI1LDAsCisgICAgODMsMCw0MSw0LDc4LDExNCwxMzksMCwwLDAsMTIyLDE0LDEwOSwxMDUsMTE1LDExNSwKKyAgICAxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwxNSwwLDAsMCw0MSwKKyAgICAxMSwxMTQsOTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDE0OSwwLDAsMCwKKyAgICAxMTQsMTQ1LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsCisgICAgNzcsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0LAorICAgIDAsMCwwLDExNCwyMSwwLDAsMCw0MSwyLDExNCw4OCwwLDAsMCwxMTQsCisgICAgODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywxMTAsMTA4LDExMSw5OSwKKyAgICAxMDcsMTAxLDEwMCwxNDcsMiwwLDAsMTE1LDIwLDAsMCwwLDAsMiwxMCwyLAorICAgIDEyLDEsOCwyLDgsMSwxMCwxLDEwLDEsMTAsMSwxOCwzLDIyLDUsCisgICAgMTE0LDE1MCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLAorICAgIDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwxMTYsCisgICAgMCwxMDYsMSwxMzEsMCwxLDAsMTE2LDIsMTI0LDAsMTA2LDMsMTMxLDEsMTQzLAorICAgIDEwLDEsMCwxMTYsNCwxMjQsMCwxMzEsMSw4MywwLDgxLDAsODIsMCw4OCwKKyAgICAwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTkxLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCisgICAgOTcsMzIsMTEwLDEwMSwxMTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTExLDk4LDEwNiwKKyAgICAxMDEsOTksMTE2LDQ0LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDAsMTAwLDEwMSwxMDAsMzIsMTE2LAorICAgIDExMSwzMiwxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDczLDEwMiwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCisgICAgMTE1LDMyLDk3LDEwOCwxMTQsMTAxLDk3LDEwMCwxMjEsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSwKKyAgICA0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTAxLAorICAgIDEyMCwxMDUsMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDMsCisgICAgMTAxLDExNiwxMTUsMTAsMzIsMzIsMzIsMzIsOTksMTA4LDExMSw5OCw5OCwxMDEsMTE0LDEwMSwKKyAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsNDEsNSwxMTQsNTcsMCwwLDAsCisgICAgMTE0LDE0NiwwLDAsMCwxMTQsNTQsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwKKyAgICAxNTAsMCwwLDAsNDEsMSwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg3LDAsMCwwLDE3MCwKKyAgICAyLDAsMCwxMTUsNiwwLDAsMCwwLDksOCwxLDEyLDEsMTE0LDg3LAorICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDQsMCwwLDAsNjQsMCwwLDAsMTE1LDEzNiwwLDAsMCwxMDEsMCw5MCwKKyAgICAxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDEsNCwxMDAsMiwxMDAsMywxMzIsCisgICAgMCwxMzEsMSw5MCw1LDEwMSw2LDEwMCwxOSwxMDAsNSwxMDAsNiwxMzIsMSwxMzEsCisgICAgMSw5MCw3LDEwMSw2LDEwMCwyMCwxMDAsNywxMDAsOCwxMzIsMSwxMzEsMSw5MCwKKyAgICA4LDEwMSw2LDEwMCw5LDEwMCwxMCwxMzIsMCwxMzEsMSw5MCw5LDEwMSw2LDEwMCwKKyAgICAxMSwxMDAsMTIsMTMyLDAsMTMxLDEsOTAsMTAsMTAxLDYsMTAxLDExLDEwMCwxMywxMDAsCisgICAgMTQsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTIsMTAxLDYsMTAxLDExLDEwMCwxNSwxMDAsCisgICAgMTYsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTMsMTAxLDYsMTAxLDExLDEwMCwxNywxMDAsCisgICAgMTgsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTQsMTAxLDYsMTAxLDE1LDEzMSwxLDkwLAorICAgIDE2LDEwMCw0LDgzLDAsNDEsMjEsMjE4LDE1LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLAorICAgIDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsOTcsMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsOTgsCisgICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsCisgICAgMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksMTA4LDk3LAorICAgIDExNSwxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMTAsCisgICAgMTE1LDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwOCwKKyAgICA5NywxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDEyLDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsCisgICAgNDEsMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLAorICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsCisgICAgMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LAorICAgIDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyNCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCw0MSwKKyAgICA2Miw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMSwwLDAsMCw0MSwxLDExNCwKKyAgICA4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwxMTQsOTIsMCwwLDAsMTk1LDIsMCwwLDExNSwyLDAsMCwKKyAgICAwLDAsNywxMjIsMjcsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwKKyAgICA3OCw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMjQsMiwxMDAsMCwxMDcsCisgICAgOSwxMTQsMTIsMTAwLDAsODMsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMzEsMSwxMTQsCisgICAgNDAsMTE2LDIsMTI0LDEsMTI0LDAsMTAwLDEsMTAwLDIsMTQ0LDEsMTMxLDIsODMsCisgICAgMCwxMTAsNCwxMDAsMCw4MywwLDEwMCwwLDgzLDAsNDEsMyw3OCwxMTQsMTA3LAogICAgIDAsMCwwLDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDQxLDMsMTE0LAogICAgIDU3LDAsMCwwLDkwLDEwLDEwNSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCiAgICAgMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDMsOTksMTA4LDExNSwxMTQsNzgsMCwwLAogICAgIDAsMjE4LDQsMTEyLDk3LDExNiwxMDQsMjE4LDYsMTE2LDk3LDExNCwxMDMsMTAxLDExNiwxMTQsCiAgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOSwKICAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMjA0LDIsMCwwLDExNSwxMCwwLAotICAgIDAsMCwwLDIsMTIsMSw0LDEsMTUsMSwxOSwyLDEyMiwyNSw2NiwxMTcsCisgICAgMCwwLDAsMiw4LDEsNCwxLDEwLDEsMTgsMiwxMjIsMjUsNjYsMTE3LAogICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsCiAgICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsCi0gICAgNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0MSwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsCi0gICAgMTI1LDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMzcsMCwxMjQsCi0gICAgMywwLDEwNiwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNzUsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwKLSAgICAxMDEsMTE0LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsCi0gICAgMTA4LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAotICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxNTQsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsCi0gICAgMCwxMTQsNzgsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsODgsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTMsMiwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCw5LDE4LDEsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNjcsMCwwLDAsCi0gICAgMTI0LDEsMCwxMDYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMDcsNywwLDExNCwKLSAgICA1MSwwLDExNiwzLDAsMTAwLDEsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDAsCi0gICAgMCwxMzEsMSwwLDEwMCwyLDAsMTI0LDEsMCwxMDYsMCwwLDEzMSwxLDEsCi0gICAgMTMwLDEsMCwxMTYsNSwwLDExNiw2LDAsMTA2LDcsMCwxMjQsMSwwLDEzMSwKLSAgICAyLDAsODMsNDEsMywxMjIsMjQsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLAotICAgIDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyMiwKLSAgICAyOSwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwKLSAgICAwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LAotICAgIDc2LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDY1LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCw5MCwxNCw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCi0gICAgOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LAotICAgIDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMjI1LDIsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMywxOCwxLDIxLDEsMTIsMSwxMjIsMjksNjYsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLAotICAgIDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDIyLDY5LDEyMCwxMDEsOTksMzIsOTcsCisgICAgNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzMCwwLDAsCisgICAgMCwxMjQsMCwxMDYsMCwxMjQsMSwxMjQsMiwxMzEsMiwxMjUsMywxMjQsMywxMDAsCisgICAgMSwxMDcsOSwxMTQsMjYsMTI0LDMsMTA2LDEsODMsMCwxMDAsMSw4MywwLDQxLAorICAgIDIsMTIyLDE3NSw3MCwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMTcsMTA1LDEwOCwKKyAgICAxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsCisgICAgMTA1LDExNSwzMiwxMDEsMTE4LDEwMSwxMTQsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLAorICAgIDEwMCwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSw5NywxMTQsOTksCisgICAgMTA0LDMyLDEwNSwxMTUsMzIsOTksMTExLDExMCwxMTUsMTA1LDEwMCwxMDEsMTE0LDEwMSwxMDAsMzIsCisgICAgOTcsMzIsMTAyLDk3LDEwNSwxMDgsMTE3LDExNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsCisgICAgMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLAorICAgIDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLAorICAgIDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDc4LDQxLDIsMTE0LDE1NSwwLDAsMCwxMTQsOTksMCwwLDAsNDEsCisgICAgNCwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTUzLDAsMCwwLAorICAgIDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDIxMywyLDAsMCwxMTUsNCwwLDAsMCwwLDksMTIsMSwxMjIsMjcsCisgICAgNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LAorICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw0OCwwLDAsMCwxMjQsMSwxMDYsMCwxMTYsMSwxMDYsMiwxMDcsNywxMTQsCisgICAgMzYsMTE2LDMsMTAwLDEsMTA2LDQsMTI0LDEsMTA2LDAsMTMxLDEsMTAwLDIsMTI0LAorICAgIDEsMTA2LDAsMTQ0LDEsMTMxLDEsMTMwLDEsMTE2LDUsMTE2LDYsMTA2LDcsMTI0LAorICAgIDEsMTMxLDIsODMsMCw0MSwzLDEyMiwyNCw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsCisgICAgOTcsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTIyLDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsCiAgICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzgsNDEsMywxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDEyLDEwMSwKLSAgICAxMjAsMTAxLDk5LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQxLDIsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDIzMywyLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDMsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsCi0gICAgODMsNDEsMiwxMjIsNTcsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICAzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsCi0gICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwyMzgsMiwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNCw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDU2LAotICAgIDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKLSAgICAxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMjQ0LDIsMCwwLDExNSwyLDAsMCwwLDAsNCwKLSAgICAxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsCisgICAgMTE0LDE1LDAsMCwwLDQxLDgsMTE0LDE1LDAsMCwwLDExNCwxNCwwLDAsCisgICAgMCwxMTQsNzYsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw1MCwwLDAsMCwKKyAgICAxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDE0LDk5LDExNCwxMDEsOTcsCisgICAgMTE2LDEwMSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0MSwyLDExNCwxOSwwLDAsCisgICAgMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDEzOCwwLDAsMCwyMjUsMiwwLDAsMTE1LDgsCisgICAgMCwwLDAsMCwzLDEyLDEsMTQsMSwxMCwxLDEyMiwyOSw2NiwxMTcsMTA1LAorICAgIDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsOTksMTE0LDEwMSwKKyAgICA5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDE2LDAsMCwwLDExNiwwLDExNiwxLDEwNiwyLDEyNCwxLDEzMSwyLDEsMCwKKyAgICAxMDAsMSw4MywwLDQxLDIsMTIyLDIyLDY5LDEyMCwxMDEsOTksMzIsOTcsMzIsOTgsCisgICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNzgsNDEsCisgICAgMywxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDEyLDEwMSwxMjAsMTAxLAorICAgIDk5LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQxLDIsMTE0LDE5LDAsMCwwLAorICAgIDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDIzMywyLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDMsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsCisgICAgMiwxMjIsNTcsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywKKyAgICAxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsMzIsOTksCisgICAgMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsMTAsMCwKKyAgICAwLDAsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCwxMDMsCisgICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwyMzgsMiwwLDAsMTE1LDIsMCwwLDAsCisgICAgMCw0LDEyMiwyNCw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsCiAgICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUyLDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsOTcsMTE1LDMyLDk4LDExNywKLSAgICAxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywKLSAgICAxMTQsMTAxLDMyLDExMCwxMDEsMTE4LDEwMSwxMTQsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAotICAgIDExNSw0Niw3MCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKLSAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDI1MCwyLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDQsMTIyLDI2LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKLSAgICAxNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwyMTgsMTIsMTE1LDExNiw5NywxMTYsMTA1LDk5LDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDExNCw5MiwwLDAsMCwyMTgsMTEsOTksMTA4LDk3LDExNSwxMTUsMTA5LAotICAgIDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDE1NCwwLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwKLSAgICAxMzgsMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDE1NiwKLSAgICAwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDkwLDAsCi0gICAgMCwwLDExNCwxNDYsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTAsMCwwLDAsCi0gICAgMTg2LDIsMCwwLDExNSwzMCwwLDAsMCwxMiw3LDYsMiwxOCw5LDMsCi0gICAgMSwyMSw4LDMsMSwxOCwxMSwxOCw4LDE4LDUsMywxLDIxLDUsMywKLSAgICAxLDIxLDUsMywxLDIxLDUsMTE0LDE1MCwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSwyMTEsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAxLDQsMCwxMDAsMiwwLDEwMCwzLAotICAgIDAsMTMyLDAsMCwxMzEsMSwwLDkwLDUsMCwxMDEsNiwwLDEwMCw0LDAsCi0gICAgMTAwLDQsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDIsMCwxMzEsMSwwLDkwLAotICAgIDcsMCwxMDEsNiwwLDEwMCw0LDAsMTAwLDcsMCwxMDAsOCwwLDEzMiwxLAotICAgIDAsMTMxLDEsMCw5MCw4LDAsMTAxLDYsMCwxMDAsOSwwLDEwMCwxMCwwLAotICAgIDEzMiwwLDAsMTMxLDEsMCw5MCw5LDAsMTAxLDQsMCwxMDAsMTEsMCwxMDAsCi0gICAgMTIsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNiwwLDEwMCwxMywKLSAgICAwLDEwMCwxNCwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMSwwLDEwMSw2LDAsCi0gICAgMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsOTAsMTMsMCwxMDEsNiwwLDEwMSwxMiwwLDEwMCwxNywwLDEwMCwxOCwKLSAgICAwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDE0LDAsMTAxLDYsMCwKLSAgICAxMDEsMTIsMCwxMDAsMTksMCwxMDAsMjAsMCwxMzIsMCwwLDEzMSwxLDAsMTMxLAotICAgIDEsMCw5MCwxNSwwLDEwMCw0LDAsODMsNDEsMjEsMjE4LDE0LDcwLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDIsNzcsMTAxLDExNiwKLSAgICA5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMDgsCi0gICAgOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksMTAxLAotICAgIDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDExMSwzMiw5NywxMTgsMTExLDEwNSwxMDAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDk3LDExMCwxMTYsMTA1LDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksCi0gICAgMTA4LDk3LDExNSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMSwwLDgzLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLAotICAgIDExNCwxMDEsMTEyLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCi0gICAgMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LAotICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LAotICAgIDEwMiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjIsNjAsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTAyLDExNCwxMTEsMTIyLAotICAgIDEwMSwxMTAsNDEsNjIsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDEsMCwwLDAsCi0gICAgNDEsMSwyMTgsMSwxMDksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTEsMCwwLDAsMTE0LDkyLDAsMCwwLDEyLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsNywxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LAotICAgIDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDUsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTE0LDM0LDAsMTE2LDIsMCwxMjQsMSwwLAotICAgIDEyNCwwLDAsMTAwLDEsMCwxMDAsMiwwLDEzMSwyLDEsODMsMTAwLDAsMCwKLSAgICA4MywxMDAsMCwwLDgzLDQxLDMsNzgsMTE0LDEwNywwLDAsMCw5MCw2LDEwMiwKLSAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDQxLDMsMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsCi0gICAgMCwxMTQsODUsMCwwLDAsNDEsNCwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLAotICAgIDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NCwwLDAsMCwKLSAgICAyMSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTUsMSwxOSwyLDEyMiwKLSAgICAyNCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjMsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMTQsCi0gICAgMTksMCwxMjQsMCwwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsOTMsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDU3LAotICAgIDAsMCwwLDExNCw4MiwwLDAsMCw0MSwzLDExNCwxNTEsMCwwLDAsMTE0LAotICAgIDc4LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NSwwLDAsMCwyOCwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCi0gICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsMTA4LAotICAgIDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsNDYsCi0gICAgNzgsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsODgsMCwKKyAgICAwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNTYsODIsMTAxLAorICAgIDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwKKyAgICAxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsCisgICAgMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICAzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUyLAorICAgIDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTAsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSwyNDQsMiwwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyNiwKKyAgICA2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsCisgICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICA0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNTIsODIsMTAxLDExNiwxMTcsCisgICAgMTE0LDExMCwzMiw3MCw5NywxMDgsMTE1LDEwMSwzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsCisgICAgMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExNCwxMDEsCisgICAgMzIsMTEwLDEwMSwxMTgsMTAxLDExNCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDQ2LAorICAgIDcwLDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LDc4LDAsCiAgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwxMzgsMCwwLDAsMzcsMywwLDAsMTE1LDAsMCwwLDAsMTIyLAotICAgIDI4LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LAotICAgIDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw5MiwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTA2LDEsMCwKLSAgICAxMjUsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTE1LAotICAgIDU0LDAsMTE2LDQsMCwxMDAsMSwwLDEwNiw1LDAsMTI0LDEsMCwxMzEsMSwKLSAgICAwLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTE2LDYsMCwKLSAgICAxMTYsMiwwLDEwNiw3LDAsMTI0LDEsMCwxMzEsMiwwLDEyNSwyLDAsMTE2LAotICAgIDgsMCwxMjQsMiwwLDEyNCwwLDAsMTA2LDksMCwxMzEsMiwwLDEsMTAwLAotICAgIDAsMCw4Myw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLAotICAgIDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSwxMCwxMTQsOTUsMCwwLDAsMTE0LAotICAgIDE1LDAsMCwwLDExNCw1NywwLDAsMCwxMTQsODIsMCwwLDAsMTE0LDc3LAotICAgIDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsNjUsMCwwLDAsMjE4LDE3LDEwMywKLSAgICAxMDEsMTE2LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAyMTgsNCwxMDEsMTIwLDEwMSw5OSwxMTQsNywwLDAsMCw0MSwzLDExNCw4OSwwLAotICAgIDAsMCwxMTQsMTUsMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEzOSwwLDAsCi0gICAgMCw0MSwzLDAsMCwxMTUsMTIsMCwwLDAsMCwyLDEyLDEsMTUsMSwKLSAgICAxOCwxLDksMSwxOCwxLDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMTYsMCwwLDEyNCwKLSAgICAwLDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLDEsMTIyLDk1LDc2LDExMSw5NywKKyAgICAwLDExNCwxMDksMCwwLDAsMjUwLDIsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgNCwxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQxLDIsNzgsCisgICAgNzgsNDEsMSw3OCw0MSwxNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwKKyAgICAxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwyMTgsMTIsMTE1LDExNiw5NywxMTYsCisgICAgMTA1LDk5LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCw5MiwwLDAsMCwyMTgsMTEsOTksCisgICAgMTA4LDk3LDExNSwxMTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDE1NSwwLDAsMCwxMTQsCisgICAgMTU2LDAsMCwwLDExNCwxMzgsMCwwLDAsMTE0LDEzOSwwLDAsMCwxMTQsODEsCisgICAgMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwxMDksMCwKKyAgICAwLDAsMTE0LDkwLDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDExNCwxNTEsMCwwLDAsMTg2LDIsMCwwLDExNSwzMCwwLDAsMCw4LDcsCisgICAgNCwyLDEyLDksMiwxLDEyLDgsMiwxLDEyLDExLDEyLDgsMTIsNSwKKyAgICAyLDEsMTQsNSwyLDEsMTQsNSwyLDEsMTQsNSwxMTQsMTUxLDAsMCwKKyAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwKKyAgICAwLDAsNjQsMCwwLDAsMTE1LDE0MCwwLDAsMCwxMDEsMCw5MCwxLDEwMCwKKyAgICAwLDkwLDIsMTAwLDEsOTAsMywxMDEsNCwxMDAsMiwxMDAsMywxMzIsMCwxMzEsCisgICAgMSw5MCw1LDEwMSw2LDEwMCwyMSwxMDAsNSwxMDAsNiwxMzIsMSwxMzEsMSw5MCwKKyAgICA3LDEwMSw2LDEwMCwyMiwxMDAsNywxMDAsOCwxMzIsMSwxMzEsMSw5MCw4LDEwMSwKKyAgICA2LDEwMCw5LDEwMCwxMCwxMzIsMCwxMzEsMSw5MCw5LDEwMSw0LDEwMCwxMSwxMDAsCisgICAgMTIsMTMyLDAsMTMxLDEsOTAsMTAsMTAxLDYsMTAwLDEzLDEwMCwxNCwxMzIsMCwxMzEsCisgICAgMSw5MCwxMSwxMDEsNiwxMDEsMTIsMTAwLDE1LDEwMCwxNiwxMzIsMCwxMzEsMSwxMzEsCisgICAgMSw5MCwxMywxMDEsNiwxMDEsMTIsMTAwLDE3LDEwMCwxOCwxMzIsMCwxMzEsMSwxMzEsCisgICAgMSw5MCwxNCwxMDEsNiwxMDEsMTIsMTAwLDE5LDEwMCwyMCwxMzIsMCwxMzEsMSwxMzEsCisgICAgMSw5MCwxNSwxMDAsNCw4MywwLDQxLDIzLDIxOCwxNCw3MCwxMTQsMTExLDEyMiwxMDEsCisgICAgMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQyLDc3LDEwMSwxMTYsOTcsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsCisgICAgMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LAorICAgIDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksMTA4LDk3LDExNSwKKyAgICAxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMTAsMTE1LAorICAgIDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDk5LDEwOCw5NywKKyAgICAxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLAorICAgIDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsNDEsCisgICAgMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLAorICAgIDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA5LDk3LAorICAgIDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyMiw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw0MSw2Miw0MSwyLAorICAgIDExNCw1MCwwLDAsMCwxMTQsMSwwLDAsMCw0MSwxLDIxOCwxLDEwOSwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTIsCisgICAgMCwwLDAsMTIsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiwKKyAgICA3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsNzgsOTksNCwwLDAsMCwKKyAgICAwLDAsMCwwLDQsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMzYsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDEsMTMxLDEsMTE0LDI4LDExNiwKKyAgICAyLDEyNCwxLDEyNCwwLDEwMCwxLDEwMCwyLDE0NCwxLDEzMSwyLDgzLDAsMTEwLAorICAgIDQsMTAwLDAsODMsMCwxMDAsMCw4MywwLDQxLDMsNzgsMTE0LDEwNywwLDAsCisgICAgMCw5MCw2LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQxLDMsMTE0LDU3LDAsMCwwLAorICAgIDExNCw4MiwwLDAsMCwxMTQsODUsMCwwLDAsNDEsNCwxMTQsMTUyLDAsMCwKKyAgICAwLDExNCw3OCwwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxNTQsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LAorICAgIDE1NSwwLDAsMCwyMSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTAsCisgICAgMSwxOCwyLDEyMiwyNCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMTgsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDEsMTMxLDEsMTE0LAorICAgIDE0LDEyNCwwLDgzLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw5Myw3MCwxMDUsMTEwLAogICAgIDEwMCwzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAogICAgIDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwKICAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsCi0gICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAotICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDExNCw5MCwKLSAgICAwLDAsMCw0MSwyLDExNCwxNTEsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNDYsCi0gICAgMCwwLDAsNTAsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiwKLSAgICA3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDgsCi0gICAgMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAxMywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLAotICAgIDgzLDQxLDEsMTIyLDQ1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDQ2LDQxLDIsMTE0LDU3LDAsMCwwLDExNCwxNjIsMCwwLDAsNDEsMiwKLSAgICAxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTU2LDAsMCwwLDU5LDMsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjMsNzAsMTE0LDExMSwxMjIsMTAxLAotICAgIDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLAotICAgIDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLAotICAgIDQxLDIsMTIyLDU0LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsCi0gICAgOTcsMTE1LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLAotICAgIDQxLDIsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NywwLDAsMCwKLSAgICA2NSwzLDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDI1LDcwLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsCi0gICAgMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCw4Myw0MSwxLDEyMiwKLSAgICA0Niw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsNDEsCi0gICAgMiwxMTQsNTcsMCwwLDAsOTAsMTcsMTA1LDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLAotICAgIDExMCw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsMiwxMTQsMTUxLDAsMCwwLAotICAgIDExNCw3OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwxMTQsMTA5LDAsMCwwLDcxLDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsNCwxMjIsMjUsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsCi0gICAgMTYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCi0gICAgMTE0LDMsMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LAotICAgIDE1OSwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDEzOCwKLSAgICAwLDAsMCwxMTQsMTM5LDAsMCwwLDExNCwxNDYsMCwwLDAsMTE0LDg0LDAsCi0gICAgMCwwLDExNCwxNTYsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTA5LDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMSwwLDAsMCwxMTQsMTYwLDAsMCwwLDMsMywwLDAsMTE1LDMwLAotICAgIDAsMCwwLDEyLDcsNiwyLDE4LDksMywxLDIxLDYsMywxLDE4LAotICAgIDgsMTgsNCwxOCw5LDE4LDksMywxLDIxLDUsMywxLDIxLDUsMywKLSAgICAxLDExNCwxNjAsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwwLDAsCi0gICAgMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwKLSAgICAzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LAotICAgIDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDgzLDQxLDcsCi0gICAgMjE4LDE4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsMTEwLAotICAgIDExNiwxMDEsMTIwLDExNiwxMjIsMzYsNjcsMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsMzIsMTA5LDk3LAotICAgIDExMCw5NywxMDMsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LAotICAgIDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICAxNCwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxLDEwMCwxLAotICAgIDAsODMsNDEsMiwxMjIsMjQsNjUsOTksMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwKLSAgICAyLDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsMCwwLDQxLDEsMTE0LDE5LDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwyMywwLDAsMCw4NCwzLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDIsMTIyLDI4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsCi0gICAgMTEwLDExNiwxMDEsMTIwLDExNiw0Niw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LAotICAgIDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDEsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE0LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMCwwLDEsMTAwLDEsMCw4Myw0MSwyLDEyMiw2MCw4MiwxMDEsMTA4LDEwMSw5NywKLSAgICAxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsCi0gICAgOTksMTA3LDMyLDExNCwxMDEsMTAzLDk3LDExNCwxMDAsMTA4LDEwMSwxMTUsMTE1LDMyLDExMSwxMDIsCi0gICAgMzIsOTcsMTEwLDEyMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDMyLDEwMSwxMjAsOTksMTAxLAotICAgIDExMiwxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LDc4LDQxLDIsMTE0LDU3LDAsMCwwLDExNCwKLSAgICA1OCwwLDAsMCw0MSw0LDExNCwxOSwwLDAsMCw5MCw4LDEwMSwxMjAsOTksCi0gICAgOTUsMTE2LDEyMSwxMTIsMTAxLDkwLDksMTAxLDEyMCw5OSw5NSwxMTgsOTcsMTA4LDExNywxMDEsCi0gICAgOTAsMTMsMTAxLDEyMCw5OSw5NSwxMTYsMTE0LDk3LDk5LDEwMSw5OCw5Nyw5OSwxMDcsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDMwLAotICAgIDAsMCwwLDg4LDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjcsCi0gICAgOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwKLSAgICAxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSw3OCw0MSw2LDExNCwxLAotICAgIDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsCi0gICAgMCwwLDExNCwyMywwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICA5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCw1NywwLAorICAgIDAsMCwxMTQsODIsMCwwLDAsNDEsMywxMTQsMTUyLDAsMCwwLDExNCw3OCwKKyAgICAwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwxNTYsMCwwLDAsMjgsMywwLDAsCisgICAgMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywKKyAgICAwLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsCisgICAgMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDc4LAorICAgIDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LDg4LDAsMCwKICAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAotICAgIDExNCwxNjUsMCwwLDAsODAsMywwLDAsMTE1LDYsMCwwLDAsMTIsMiwKLSAgICA2LDIsMTIsNCwxMTQsMTY1LDAsMCwwLDk5LDMsMCwwLDAsMCwwLAotICAgIDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg4LAotICAgIDAsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDAsMSwwLDEyNCwyLDAsMTAwLAotICAgIDIsMCwyNCwxMzEsMiwwLDEyNSwzLDAsMTE2LDEsMCwxMjQsMywwLDEzMSwKLSAgICAxLDAsMTI0LDIsMCwxMDcsMCwwLDExNCw1MiwwLDExNiwyLDAsMTAwLDMsCi0gICAgMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDMsMCwxMDAsNCwwLDI1LDEyNSw0LAotICAgIDAsMTI0LDAsMCwxMTQsODQsMCwxMDAsNSwwLDEwNiwzLDAsMTI0LDQsMCwKLSAgICAxMjQsMCwwLDEzMSwyLDAsODMsMTI0LDQsMCw4Myw0MSw2LDEyMiw1MCw4MiwKLSAgICAxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwKLSAgICAxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTE2LDExMSwKLSAgICAzMiw5NywxMTAsMzIsOTcsOTgsMTE1LDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTExLDExMCwxMDEsCi0gICAgNDYsMTE0LDEyMSwwLDAsMCwxMTQsNDUsMCwwLDAsMTIyLDUwLDk3LDExNiwxMTYsCi0gICAgMTAxLDEwOSwxMTIsMTE2LDEwMSwxMDAsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLAotICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk4LDEwMSwxMjEsMTExLDExMCwxMDAsMzIsMTE2LDExMSwKLSAgICAxMTIsNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LAotICAgIDMzLDAsMCwwLDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw0MSw0LDIxOCw2LDExNCwKLSAgICAxMTUsMTEyLDEwOCwxMDUsMTE2LDIxOCwzLDEwOCwxMDEsMTEwLDIxOCwxMCw4Niw5NywxMDgsMTE3LAotICAgIDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDUsMTE0LDE1LDAsCi0gICAgMCwwLDIxOCw3LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwyMTgsNSwxMDgsMTAxLDExOCwKLSAgICAxMDEsMTA4LDkwLDQsOTgsMTA1LDExNiwxMTUsOTAsNCw5OCw5NywxMTUsMTAxLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMyw5NSwKLSAgICAxMTQsMTAxLDExNSwxMTEsMTA4LDExOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsOTMsMywwLDAsCi0gICAgMTE1LDEwLDAsMCwwLDAsMiwyMiwxLDE4LDEsMTIsMSwxMCwxLDExNCwKLSAgICAxNzEsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLAotICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsNDcsMCwwLDAsMTI0LDAsCi0gICAgMCwxMDYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSwzLDAsCi0gICAgMTI0LDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDM0LDAsMTAwLDAsMCw4MywKLSAgICAxMTYsMSwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsMiwwLDgzLDQxLDEsNzgsCi0gICAgNDEsMiwxMTQsMTU1LDAsMCwwLDExNCw4NSwwLDAsMCw0MSw0LDIxOCw2LAotICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCwxNSwwLDAsMCwxMTQsMTUyLDAsMCwwLAotICAgIDExNCw5OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsMTcsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LAotICAgIDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSwxMDIsMywwLDAsMTE1LDgsMCwwLDAsCi0gICAgMCwzLDE4LDEsMTIsMSw0LDEsMTE0LDE3MywwLDAsMCw5OSwzLDAsCi0gICAgMCwwLDAsMCwwLDAsOSwwLDAsMCwyNywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNDIsMSwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDksMCwxMTQsNDEsMCwxMTYsMCwwLDEwNiwxLDAsMTIsMTE0LDQxLDAsCi0gICAgMTE2LDIsMCwxMDYsMywwLDEwMCwyLDAsMTE2LDQsMCwxMzEsMiwwLDEsCi0gICAgMTI0LDAsMCwxMTYsMCwwLDEwNiw1LDAsMTA3LDYsMCwxMjUsMywwLDEyMCwKLSAgICAyMzUsMCwxMTYsMCwwLDEwNiwxLDAsNjgsOTMsMjIwLDAsMTI1LDQsMCwxMTYsCi0gICAgNiwwLDEzMSwwLDAsMTQzLDkwLDAsMSwxMjEsMTMsMCwxMjQsNCwwLDEwNiwKLSAgICA3LDAsMTI1LDUsMCw4NywxMTAsNTEsMCw0LDExNiw4LDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0OCwwLDEsMSwxLDExNiw5LDAsMTI0LDQsMCwxMjQsMCwwLDEyNCwKLSAgICAxLDAsMTMxLDMsMCwxMjUsNiwwLDEyNCw2LDAsMTAwLDEsMCwxMDcsOCwKLSAgICAwLDExNCwxNDQsMCwxMTksNjYsMCw4OSwxMTAsMTksMCw4OCwxMjQsNSwwLDEyNCwKLSAgICAwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDYsMCw4NywxMDAsCi0gICAgMSwwLDgxLDgyLDg4LDEyNCw2LDAsMTAwLDEsMCwxMDcsOSwwLDExNCw2NiwKLSAgICAwLDEyNCwzLDAsMTIsMTE0LDI2LDEsMTI0LDAsMCwxMTYsMCwwLDEwNiw1LAotICAgIDAsMTA3LDYsMCwxMTQsMjYsMSwxMTYsMCwwLDEwNiw1LDAsMTI0LDAsMCwKLSAgICAyNSwxMjUsNywwLDEyMSwxMywwLDEyNCw3LDAsMTA2LDEwLDAsMTI1LDgsMCwKLSAgICA4NywxMTAsMjIsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LDIsMSwxLDEsCi0gICAgMSwxMjQsNiwwLDgzLDg5LDExMywzMCwxLDg4LDEyNCw4LDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCwxOSwxLDEyNCw2LDAsODMsMTI0LDgsMCw4MywxMTMsNjYsCi0gICAgMCwxMjQsNiwwLDgzLDExMyw2NiwwLDg3LDEwMCwxLDAsODMsMTAwLDEsMCwKLSAgICA4Myw0MSwzLDEyMiwyMyw3MCwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwzOSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0Niw3OCwxMjIsMjIsMTE1LAotICAgIDEyMSwxMTUsNDYsMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwKLSAgICAxMDEsMTA5LDExMiwxMTYsMTIxLDQxLDExLDExNCwxNCwwLDAsMCwyMTgsOSwxMDksMTAxLAotICAgIDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTQxLDAsMCwwLDExNCwxNDIsMCwwLAotICAgIDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMywKLSAgICAxMTQsMjEsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwKLSAgICA5NiwwLDAsMCwxMTQsMTczLDAsMCwwLDExNCw5NSwwLDAsMCw0MSw5LAotICAgIDExNCwxNSwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxNTMsMCwwLDAsOTAsCi0gICAgOSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LDExMSw5NywxMDAsMTE0LDE3MiwwLDAsMCwxMTQsCi0gICAgMTU0LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDk1LAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCi0gICAgMCwwLDIxOCwxMCw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMTExLDMsCi0gICAgMCwwLDExNSw0OCwwLDAsMCwwLDIsMjUsMSwxNiw0LDE1LDEsMTYsCi0gICAgMSwxMCwxLDMsMSwxMywxLDEzLDEsMTgsMSwxMiwxLDgsMiwyNSwKLSAgICAxLDEyLDIsMjIsMSwxMywxLDMsMSwxMywxLDEzLDQsOSwyLDEyLAotICAgIDEsNCwyLDcsMiw4LDIsMTE0LDE3NiwwLDAsMCw5OSwzLDAsMCwKLSAgICAwLDAsMCwwLDAsNCwwLDAsMCw0LDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxODUsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDExNiwxLDAsMTMxLAotICAgIDIsMCwxMTUsNDIsMCwxMTYsMiwwLDEwMCwxLDAsMTA2LDMsMCwxMTYsNCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwKLSAgICAxMjQsMiwwLDEwMCwyLDAsMTA3LDAsMCwxMTQsNjYsMCwxMTYsNSwwLDEwMCwKLSAgICAzLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwyLDAsMTAwLDIsMCwxMDcsNCwKLSAgICAwLDExNCwxNTAsMCwxMTYsMCwwLDEyNCwxLDAsMTE2LDEsMCwxMzEsMiwwLAotICAgIDExNSwxMDgsMCwxMTYsMiwwLDEwMCw0LDAsMTMxLDEsMCwxMzAsMSwwLDExMCwKLSAgICA0MiwwLDEyNCwxLDAsMTE2LDYsMCwxMDYsNywwLDEwNyw3LDAsMTE0LDE1MCwKLSAgICAwLDEwMCw1LDAsMTI1LDMsMCwxMTYsOCwwLDEyNCwzLDAsMTA2LDMsMCwKLSAgICAxMjQsMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwwLDAsMTIsCi0gICAgMTE0LDE4MSwwLDEyNCwyLDAsMTAwLDIsMCwxMDcsMiwwLDExNCwxODEsMCwxMTYsCi0gICAgNSwwLDEwMCw2LDAsMTMxLDEsMCwxMzAsMSwwLDEwMCw3LDAsODMsNDEsCi0gICAgOCwxMjIsMjgsODYsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLAorICAgIDExNCwxMzgsMCwwLDAsMzcsMywwLDAsMTE1LDAsMCwwLDAsMTIyLDI4LAorICAgIDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LAorICAgIDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw2NiwwLDAsMCwxMjQsMCwxMDYsMCwxMDYsMSwxMjUsMSwxMTYsMiwKKyAgICAxMDYsMywxMjQsMSwxMzEsMSwxMTUsMzgsMTE2LDQsMTAwLDEsMTA2LDUsMTI0LDEsCisgICAgMTMxLDEsMTAwLDIsMTI0LDEsMTQ0LDEsMTMxLDEsMTMwLDEsMTE2LDYsMTE2LDIsCisgICAgMTA2LDcsMTI0LDEsMTMxLDIsMTI1LDIsMTE2LDgsMTI0LDIsMTI0LDAsMTA2LDksCisgICAgMTMxLDIsMSwwLDEwMCwwLDgzLDAsNDEsMyw3OCwxMjIsMjcsMTIzLDMzLDExNCwKKyAgICAxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLAorICAgIDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsMTAsMTE0LAorICAgIDk1LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsNTcsMCwwLDAsMTE0LDgyLAorICAgIDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDY1LDAsCisgICAgMCwwLDIxOCwxNywxMDMsMTAxLDExNiw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTEsCisgICAgOTgsMTA2LDEwMSw5OSwxMTYsMjE4LDQsMTAxLDEyMCwxMDEsOTksMTE0LDcsMCwwLDAsCisgICAgNDEsMywxMTQsODksMCwwLDAsMTE0LDE1LDAsMCwwLDIxOCw0LDk5LDExMSwKKyAgICAxMDAsMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCwxMzksMCwwLDAsNDEsMywwLDAsMTE1LDEyLDAsMCwwLDAsCisgICAgMiw4LDEsMTAsMSwxMiwxLDgsMSwxMiwxLDEyMiwyNiw3MCwxMTQsMTExLAorICAgIDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCisgICAgMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLDAsCisgICAgMCwxMTYsMCwxMjQsMCwxMjQsMSwxMzEsMiw4MywwLDQxLDEsMTIyLDk1LDc2LAorICAgIDExMSw5NywxMDAsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwKKyAgICAxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwKKyAgICAxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LAorICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwKKyAgICAxMTQsOTAsMCwwLDAsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsCisgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKKyAgICAxMTQsMTQ3LDAsMCwwLDUwLDMsMCwwLDExNSwyLDAsMCwwLDAsNywKKyAgICAxMjIsMjYsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsCisgICAgNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTAsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDEsMTMxLDEsODMsMCwKKyAgICA0MSwxLDEyMiw0NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA0Niw0MSwyLDExNCw1NywwLDAsMCwxMTQsMTYzLDAsMCwwLDQxLDIsMTE0LAorICAgIDE1MiwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NywwLDAsMCw1OSwzLDAsCisgICAgMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDIzLDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsCisgICAgNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsCisgICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwKKyAgICAyLDEyMiw1NCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LAorICAgIDExNSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCisgICAgMzIsMTAwLDExMSwzMiwxMTAsMTExLDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwKKyAgICAyLDExNCwxNTIsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTgsMCwwLDAsNjUsCisgICAgMywwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwKKyAgICAxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsCisgICAgMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwKKyAgICAwLDEwNiwxLDEyNCwxLDEzMSwxLDgzLDAsNDEsMSwxMjIsNDYsODIsMTAxLDExNiwKKyAgICAxMTcsMTE0LDExMCwzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsCisgICAgMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ2LDQxLDIsMTE0LDU3LDAsCisgICAgMCwwLDkwLDE3LDEwNSwxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDQxLDIsMTE0LDE1MiwwLDAsMCwxMTQsNzgsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDEwOSwwLDAsMCw3MSwzLDAsMCwxMTUsMiwwLDAsMCwwLDQsCisgICAgMTIyLDI1LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LAorICAgIDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQxLDIsNzgsNzgsNDEsCisgICAgMSw3OCw0MSwxNiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwKKyAgICAwLDAsMCwxMTQsMywwLDAsMCwxMTQsMTU5LDAsMCwwLDExNCw5MiwwLAorICAgIDAsMCwxMTQsMTYwLDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDE1NiwwLDAsCisgICAgMCwxMTQsMTM4LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NywwLDAsMCwKKyAgICAxMTQsODQsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwKKyAgICAxMDksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNjEsMCwwLDAsMywzLDAsCisgICAgMCwxMTUsMzAsMCwwLDAsOCw3LDQsMiwxMiw5LDIsMSwxMiw2LAorICAgIDIsMSwxMiw4LDEyLDQsMTIsOSwxMiw5LDIsMSwxNCw1LDIsMSwKKyAgICAxNCw1LDIsMSwxMTQsMTYxLDAsMCwwLDk5LDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDMyLAorICAgIDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwKKyAgICAyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsCisgICAgNiw4MywwLDQxLDcsMjE4LDE4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLAorICAgIDk5LDEwNyw2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiwxMjIsMzYsNjcsMTExLDExMCwxMTYsMTAxLAorICAgIDEyMCwxMTYsMzIsMTA5LDk3LDExMCw5NywxMDMsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw5OSwKKyAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSwxMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxLAorICAgIDAsMTAwLDEsODMsMCw0MSwyLDEyMiwyNCw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LAorICAgIDQ2LDc4LDQxLDIsMTE0LDU3LDAsMCwwLDExNCwxNDYsMCwwLDAsNDEsMSwKKyAgICAxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMTE0LDIzLDAsMCwwLDg0LDMsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMiwxMjIsMjgsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksCisgICAgMTA3LDY3LDExMSwxMTAsMTE2LDEwMSwxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsCisgICAgOTUsOTUsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTE2LDAsMTA2LDEsCisgICAgMTMxLDAsMSwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNjAsODIsMTAxLDEwOCwxMDEsCisgICAgOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsCisgICAgMTExLDk5LDEwNywzMiwxMTQsMTAxLDEwMyw5NywxMTQsMTAwLDEwOCwxMDEsMTE1LDExNSwzMiwxMTEsCisgICAgMTAyLDMyLDk3LDExMCwxMjEsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwzMiwxMDEsMTIwLDk5LAorICAgIDEwMSwxMTIsMTE2LDEwNSwxMTEsMTEwLDExNSw0Niw3OCw0MSwyLDExNCw1NywwLDAsMCwKKyAgICAxMTQsNTgsMCwwLDAsNDEsNCwxMTQsMTksMCwwLDAsOTAsOCwxMDEsMTIwLAorICAgIDk5LDk1LDExNiwxMjEsMTEyLDEwMSw5MCw5LDEwMSwxMjAsOTksOTUsMTE4LDk3LDEwOCwxMTcsCisgICAgMTAxLDkwLDEzLDEwMSwxMjAsOTksOTUsMTE2LDExNCw5Nyw5OSwxMDEsOTgsOTcsOTksMTA3LAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwKKyAgICAzMCwwLDAsMCw4OCwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLAorICAgIDI3LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsNzYsMTExLDk5LDEwNyw2NywxMTEsMTEwLDExNiwKKyAgICAxMDEsMTIwLDExNiw0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsCisgICAgMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywKKyAgICAwLDAsMCwxMTQsMjMsMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwxMTQsMTY2LDAsMCwwLDgwLDMsMCwwLDExNSw2LDAsMCwwLDgsCisgICAgMiw0LDIsOCw0LDExNCwxNjYsMCwwLDAsOTksMywwLDAsMCwwLAorICAgIDAsMCwwLDUsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgNjQsMCwwLDAsMTI0LDEsMTA2LDAsMTAwLDEsMTI0LDIsMTAwLDIsMjQsMCwKKyAgICAxMzEsMiwxMjUsMywxMTYsMSwxMjQsMywxMzEsMSwxMjQsMiwxMDcsMCwxMTQsMzYsCisgICAgMTE2LDIsMTAwLDMsMTMxLDEsMTMwLDEsMTI0LDMsMTAwLDQsMjUsMCwxMjUsNCwKKyAgICAxMjQsMCwxMTQsNjAsMTAwLDUsMTA2LDMsMTI0LDQsMTI0LDAsMTMxLDIsODMsMCwKKyAgICAxMjQsNCw4MywwLDQxLDYsMTIyLDUwLDgyLDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLAorICAgIDk3LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiw5Nyw5OCwxMTUsCisgICAgMTExLDEwOCwxMTcsMTE2LDEwMSwzMiwxMTEsMTEwLDEwMSw0NiwxMTQsMTIxLDAsMCwwLDExNCwKKyAgICA0NSwwLDAsMCwxMjIsNTAsOTcsMTE2LDExNiwxMDEsMTA5LDExMiwxMTYsMTAxLDEwMCwzMiwKKyAgICAxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCisgICAgOTgsMTAxLDEyMSwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLDExMiw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LAorICAgIDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsMzMsMCwwLDAsMTIyLDUsMTIzLAorICAgIDEyNSw0NiwxMjMsMTI1LDQxLDQsMjE4LDYsMTE0LDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDMsCisgICAgMTA4LDEwMSwxMTAsMjE4LDEwLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsCisgICAgNTAsMCwwLDAsNDEsNSwxMTQsMTUsMCwwLDAsMjE4LDcsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDIxOCw1LDEwOCwxMDEsMTE4LDEwMSwxMDgsOTAsNCw5OCwxMDUsMTE2LAorICAgIDExNSw5MCw0LDk4LDk3LDExNSwxMDEsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNCwxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSwKKyAgICA5NSwxMTAsOTcsMTA5LDEwMSw5MywzLDAsMCwxMTUsMTAsMCwwLDAsMCwyLAorICAgIDE2LDEsMTIsMSw4LDEsOCwxLDExNCwxNzIsMCwwLDAsOTksMywwLAorICAgIDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMzQsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTI0LDIsMTMxLAorICAgIDIsMTI1LDMsMTI0LDMsMTAwLDAsMTA3LDgsMTE0LDI0LDEwMCwwLDgzLDAsMTE2LAorICAgIDEsMTI0LDEsMTI0LDMsMTMxLDIsODMsMCw0MSwxLDc4LDQxLDIsMTE0LDE1NiwKKyAgICAwLDAsMCwxMTQsODUsMCwwLDAsNDEsNCwyMTgsNiwxMDIsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCwxMTQsMTUsMCwwLDAsMTE0LDE1MywwLDAsMCwxMTQsOTksMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMjE4LDE3LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5NSwxMDgsMTAxLDEwMywKKyAgICA5Nyw5OSwxMjEsMTAyLDMsMCwwLDExNSw4LDAsMCwwLDAsMywxMiwxLAorICAgIDgsMSw0LDEsMTE0LDE3NCwwLDAsMCw5OSwzLDAsMCwwLDAsMCwKKyAgICAwLDAsMTAsMCwwLDAsMjcsMCwwLDAsNjcsMCwwLDAsMTE1LDI0NCwKKyAgICAwLDAsMCwxMTYsMCwxMDYsMSwxMjUsMywxMjQsMywxMDAsMSwxMDcsOCwxMTQsCisgICAgMjIsMTE2LDIsMTAwLDIsMTMxLDEsMTMwLDEsMTI0LDMsMTE1LDM4LDExNiwzLDEwNiwKKyAgICA0LDEwMCwzLDExNiw1LDEzMSwyLDEsMCwxMjQsMCwxMTYsMCwxMDYsNiwxMDcsCisgICAgNiwxMjUsNCwxMjAsMTkwLDEyNCwzLDY4LDAsOTMsMTc4LDEyNSw1LDExNiw3LDEzMSwKKyAgICAwLDE0Myw3MiwxLDAsMTIxLDEwLDEyNCw1LDEwNiw4LDEyNSw2LDg3LDAsMTEwLAorICAgIDQyLDQsMCwxMTYsOSwxMDcsMTAsMTE0LDExOCwxLDAsMSwwLDEsMCwxMTYsCisgICAgMTAsMTI0LDUsMTI0LDAsMTI0LDEsMTMxLDMsMTI1LDcsMTI0LDcsMTAwLDEsMTA3LAorICAgIDgsMTE0LDExNCwxMTksNTQsODksMCwxMTAsMTQsODgsMCwxMjQsNiwxMjQsMCwxMjQsCisgICAgMSwxMjQsMiwxMzEsMywxMjUsNyw4NywwLDEwMCwxLDgxLDAsODIsMCw4OCwKKyAgICAwLDEyNCw3LDEwMCwxLDEwNyw5LDExNCw1NCwxMjQsNCwxMiwwLDExNCwyMjgsMTI0LAorICAgIDAsMTE2LDAsMTA2LDYsMTA3LDYsMTE0LDIyOCwxMTYsMCwxMDYsNiwxMjQsMCwyNSwKKyAgICAwLDEyNSw4LDEyMSwxMCwxMjQsOCwxMDYsMTEsMTI1LDksODcsMCwxMTAsMjAsNCwKKyAgICAwLDExNiw5LDEwNywxMCwxMTQsMjA2LDEsMCwxLDAsMSwwLDEyNCw3LDgzLAorICAgIDAsODgsMCwxMjQsOSwxMDAsMSwxMDcsOCwxMTQsMjIyLDEyNCw3LDgzLDAsMTEzLAorICAgIDIzMiwxMjQsOSw4MywwLDExMyw1NCwxMjQsNyw4MywwLDExMyw1NCw4NywwLDEwMCwKKyAgICAxLDgzLDAsMTAwLDEsODMsMCw0MSw0LDEyMiwyMyw3MCwxMDUsMTEwLDEwMCwzMiwKKyAgICA5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0Niw3OCwxMjIsNTMsMTE1LDEyMSwxMTUsNDYsMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSw0NCwzMiw4MCwxMjEsMTE2LDEwNCwKKyAgICAxMTEsMTEwLDMyLDEwNSwxMTUsMzIsMTA4LDEwNSwxMDcsMTAxLDEwOCwxMjEsMzIsMTE1LDEwNCwxMTcsCisgICAgMTE2LDExNiwxMDUsMTEwLDEwMywzMiwxMDAsMTExLDExOSwxMTAsMTIyLDIyLDExNSwxMjEsMTE1LDQ2LAorICAgIDEwOSwxMDEsMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTAxLDEwOSwxMTIsCisgICAgMTE2LDEyMSw0MSwxMiwxMTQsMTQsMCwwLDAsMjE4LDksMTA5LDEwMSwxMTYsOTcsOTUsCisgICAgMTEyLDk3LDExNiwxMDQsMTE0LDc3LDAsMCwwLDExNCwxNDIsMCwwLDAsMTE0LDE0MywKKyAgICAwLDAsMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwKKyAgICAxMTAsMTAzLDExNCwyMSwwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwxNTUsMCwwLAorICAgIDAsMTE0LDk2LDAsMCwwLDExNCwxNzQsMCwwLDAsMTE0LDk1LDAsMCwwLAorICAgIDQxLDEwLDExNCwxNSwwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxNTQsMCwwLAorICAgIDAsMTE0LDE3NSwwLDAsMCw5MCw5LDEwNSwxMTUsOTUsMTE0LDEwMSwxMDgsMTExLDk3LAorICAgIDEwMCwxMTQsMTczLDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDg4LDAsMCwwLAorICAgIDExNCw4OSwwLDAsMCwxMTQsOTUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDk1LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSwxMTEsMywwLDAsMTE1LDU0LDAsMCwwLDAsMiwKKyAgICA2LDEsOCwyLDgsMyw0LDEsMTIsNSwxMCwxLDEwLDEsOCwxLAorICAgIDIsMSwxMCwxLDE0LDEsMTIsMSw4LDEsOCwyLDIyLDEsOCwyLAorICAgIDE2LDEsMTAsMSwyLDEsMTAsMSwxNCw0LDYsMiw4LDEsNiwyLAorICAgIDYsMiw4LDIsMTE0LDE3NywwLDAsMCw5OSwzLDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxNDAsCisgICAgMCwwLDAsMTE2LDAsMTI0LDAsMTE2LDEsMTMxLDIsMTE1LDI4LDExNiwyLDEwMCwKKyAgICAxLDEwNiwzLDExNiw0LDEyNCwwLDEzMSwxLDEzMSwxLDEzMSwxLDEzMCwxLDEyNCwKKyAgICAyLDEwMCwyLDEwNywwLDExNCw0NCwxMTYsNSwxMDAsMywxMzEsMSwxMzAsMSwxMjQsCisgICAgMiwxMDAsMiwxMDcsNCwxMTQsMTE0LDExNiwwLDEyNCwxLDExNiwxLDEzMSwyLDExNSwKKyAgICA3MiwxMTYsMiwxMDAsNCwxMzEsMSwxMzAsMSwxMTAsNDIsMTI0LDEsMTE1LDg2LDExNiwKKyAgICA2LDEwMCw1LDEzMSwxLDEzMCwxLDExMCwyOCwxMjQsMSwxMTYsNywxMDYsOCwxMDcsCisgICAgNywxMTQsMTE0LDEwMCw2LDEyNSwzLDExNiw5LDEyNCwzLDEwNiwzLDEyNCwxLDEzMSwKKyAgICAxLDEzMSwxLDEzMCwxLDEyNCwwLDEyLDAsMTE0LDEzNiwxMjQsMiwxMDAsMiwxMDcsCisgICAgMiwxMTQsMTM2LDExNiw1LDEwMCw3LDEzMSwxLDEzMCwxLDEwMCw4LDgzLDAsNDEsCisgICAgOSwxMjIsMjgsODYsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLAogICAgIDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsMzIsMzQsMTE1LDk3LDExMCwxMDEsMzQsNDYsMTIyLAogICAgIDMxLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDEwOSwxMTcsMTE1LAogICAgIDExNiwzMiw5OCwxMDEsMzIsMTE1LDExNiwxMTQsNDQsMzIsMTEwLDExMSwxMTYsMzIsMTIzLDEyNSwKICAgICAxMTQsMzMsMCwwLDAsMTIyLDE4LDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTA5LDExNywxMTUsCiAgICAgMTE2LDMyLDk4LDEwMSwzMiw2Miw2MSwzMiw0OCwxMjIsMzEsOTUsOTUsMTEyLDk3LDk5LAogICAgIDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDExMCwxMTEsMTE2LDMyLDExNSwxMDEsMTE2LDMyLDExNiwKLSAgICAxMTEsMzIsOTcsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTIyLDYxLDgwLDk3LDExNCwxMDEsCi0gICAgMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMTAsCi0gICAgMTExLDExNiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDQ0LDMyLDk5LDk3LDExMCwxMTAsMTExLAotICAgIDExNiwzMiwxMTIsMTAxLDExNCwxMDIsMTExLDExNCwxMDksMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwKLSAgICAxMTgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEyMiwxNyw2OSwxMDksMTEyLDExNiwxMjEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNzgsNDEsOSwyMTgsCi0gICAgMTAsMTA1LDExNSwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwyMTgsMywxMTUsMTE2LDExNCwKLSAgICAyMTgsOSw4NCwxMjEsMTEyLDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLAotICAgIDExNCwxMywwLDAsMCwxMTQsMTY4LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsCi0gICAgMjEsMCwwLDAsMjE4LDExLDgzLDEyMSwxMTUsMTE2LDEwMSwxMDksNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDQxLDQsMTE0LDE1LDAsMCwwLDExNCwxNjksMCwwLDAsMTE0LDE3MCwwLAotICAgIDAsMCwxMTQsMTQ3LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDIxOCwxMyw5NSwxMTUsOTcsMTEwLDEwNSwxMTYsMTIxLDk1LAotICAgIDk5LDEwNCwxMDEsOTksMTA3LDE1MSwzLDAsMCwxMTUsMjQsMCwwLDAsMCwyLAotICAgIDE1LDEsMjcsMSwxMiwxLDEyLDEsMTIsMSwxNSwxLDE1LDEsMTUsMSwKLSAgICA2LDIsMjEsMSwxOSwxLDExNCwxODEsMCwwLDAsMTIyLDE2LDc4LDExMSwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsMzIsMTIyLDQsMTIzLAotICAgIDMzLDExNCwxMjUsOTksMiwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsCi0gICAgMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDQwLDEsMCwwLDEwMCwwLDAsCi0gICAgMTI1LDIsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDEsMCwxMzEsMSwwLDEwMCwKLSAgICAyLDAsMjUsMTI1LDMsMCwxMjQsMywwLDExNCwxNzUsMCwxMjQsMywwLDExNiwKLSAgICAxLDAsMTA2LDIsMCwxMDcsNywwLDExNCw1OSwwLDExNiwzLDAsMTI0LDEsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsMSwxMjQsMCwwLDExNiwxLDAsMTA2LDIsCi0gICAgMCwxMDcsNiwwLDExNCw4NSwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMCwwLAotICAgIDI1LDgzLDExNiwxLDAsMTA2LDIsMCwxMjQsMywwLDI1LDEyNSw0LDAsMTIxLAotICAgIDEzLDAsMTI0LDQsMCwxMDYsNCwwLDEyNSwyLDAsODcsMTEwLDYxLDAsNCwKLSAgICAxMTYsNSwwLDEwNywxMCwwLDExNCwxNzQsMCwxLDEsMSwxMTYsNiwwLDEwMCwKLSAgICAzLDAsMjMsMTA2LDcsMCwxMjQsMCwwLDEyNCwzLDAsMTMxLDIsMCwxMjUsCi0gICAgNSwwLDExNiw4LDAsMTI0LDUsMCwxMDAsNCwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMSwxMDAsMCwwLDEzMCwyLDAsODksMTEwLDEsMCw4OCwxMTYsOSwwLDEyNCwKLSAgICAwLDAsMTI0LDIsMCwxMzEsMiwwLDEyNSw2LDAsMTI0LDYsMCwxMDAsMCwKLSAgICAwLDEwNyw4LDAsMTE0LDIzMiwwLDExNiw4LDAsMTE2LDYsMCwxMDYsNywwLAotICAgIDEyNCwwLDAsMTMxLDEsMCwxMDAsNCwwLDEyNCwwLDAsMTMxLDEsMSwxMzAsCi0gICAgMSwwLDExMCwxMiwwLDExNiwxMCwwLDEyNCw2LDAsMTMxLDEsMCwxMjUsNywKLSAgICAwLDEyNCwzLDAsMTE0LDM2LDEsMTE2LDEsMCwxMDYsMiwwLDEyNCwzLDAsCi0gICAgMjUsMTI1LDQsMCwxMTYsMTEsMCwxMjQsNCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMDAsMSwwLDEzMSwxLDAsMTAwLDUsMCwyNSwxMjQsNywwLDEzMSwzLDAsCi0gICAgMSwxMjQsNywwLDgzLDQxLDYsNzgsMTE0LDEyMSwwLDAsMCwxMTQsMzMsMCwKLSAgICAwLDAsMTIyLDIzLDU5LDMyLDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwKLSAgICAxMTYsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDExNCwxNSwwLDAsMCwKLSAgICAxMTQsMTQwLDAsMCwwLDQxLDEyLDExNCwxMjIsMCwwLDAsMTE0LDE0LDAsMCwKLSAgICAwLDExNCwyMSwwLDAsMCwxMTQsNjUsMCwwLDAsMTE0LDEzMSwwLDAsMCwKLSAgICAxMTQsOTYsMCwwLDAsMjE4LDgsOTUsNjksODIsODIsOTUsNzcsODMsNzEsMTE0LAotICAgIDUwLDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwxNDksCi0gICAgMCwwLDAsMTE0LDUsMCwwLDAsNDEsOCwxMTQsMTUsMCwwLDAsMjE4LAotICAgIDcsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMTE0LDE1MiwwLDAsMCwxMTQsMTIzLDAsCi0gICAgMCwwLDkwLDEzLDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsMTE0LDE0NywwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLAorICAgIDExMSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMjIsNTQsOTcsMTE2LDExNiwxMDEsCisgICAgMTA5LDExMiwxMTYsMTAxLDEwMCwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExMCwxMTEsMzIsMTA3LDExMCwKKyAgICAxMTEsMTE5LDExMCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDExMiw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwxMjIsNjEsODAsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMDAsNDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LAorICAgIDEwOSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTIyLDE3LDY5LDEwOSwxMTIsMTE2LDEyMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKKyAgICAxMTAsOTcsMTA5LDEwMSw3OCw0MSwxMCwyMTgsMTAsMTA1LDExNSwxMDUsMTEwLDExNSwxMTYsOTcsCisgICAgMTEwLDk5LDEwMSwyMTgsMywxMTUsMTE2LDExNCwyMTgsOSw4NCwxMjEsMTEyLDEwMSw2OSwxMTQsCisgICAgMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDExNCwxMywwLDAsMCwxMTQsMTY5LDAsCisgICAgMCwwLDExNCw3NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwKKyAgICAwLDIxOCwxMSw4MywxMjEsMTE1LDExNiwxMDEsMTA5LDY5LDExNCwxMTQsMTExLDExNCw0MSw0LAorICAgIDExNCwxNSwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCwxNzEsMCwwLDAsMTE0LAorICAgIDE0OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwKKyAgICAwLDAsMCwyMTgsMTMsOTUsMTE1LDk3LDExMCwxMDUsMTE2LDEyMSw5NSw5OSwxMDQsMTAxLAorICAgIDk5LDEwNywxNTgsMywwLDAsMTE1LDI4LDAsMCwwLDAsMiwxMCwxLDE4LAorICAgIDEsOCwxLDgsMSw4LDEsMTAsMSwxMCwxLDQsMSwxMCwyLDEwLAorICAgIDEsNCwyLDE0LDEsMTQsMSwxMTQsMTgyLDAsMCwwLDEyMiwxNiw3OCwxMTEsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEyMiw0LAorICAgIDEyMywzMywxMTQsMTI1LDk5LDIsMCwwLDAsMCwwLDAsMCw4LDAsMCwKKyAgICAwLDEyLDAsMCwwLDY3LDAsMCwwLDExNSwyMjQsMCwwLDAsMTAwLDAsCisgICAgMTI1LDIsMTI0LDAsMTA2LDAsMTAwLDEsMTMxLDEsMTAwLDIsMjUsMCwxMjUsMywKKyAgICAxMjQsMywxMTQsMTM2LDEyNCwzLDExNiwxLDEwNiwyLDEwNyw3LDExNCw0MiwxMTYsMywKKyAgICAxMjQsMSwxMjQsMywxMzEsMiwxLDAsMTI0LDAsMTE2LDEsMTA2LDIsMTA3LDYsCisgICAgMTE0LDYyLDExNiwxLDEwNiwyLDEyNCwwLDI1LDAsODMsMCwxMTYsMSwxMDYsMiwKKyAgICAxMjQsMywyNSwwLDEyNSw0LDEyMSwxMCwxMjQsNCwxMDYsNCwxMjUsMiw4NywwLAorICAgIDExMCw1Miw0LDAsMTE2LDUsMTA3LDEwLDExNCwxMzQsMSwwLDEsMCwxLDAsCisgICAgMTE2LDYsMTAwLDMsMjMsMCwxMDYsNywxMjQsMCwxMjQsMywxMzEsMiwxMjUsNSwKKyAgICAxMTYsOCwxMjQsNSwxMDAsNCwxMjQsMCwxNDQsMSwxMzEsMSwxMDAsMCwxMzAsMiwKKyAgICA4OSwwLDExMCwyLDg4LDAsMTE2LDksMTI0LDAsMTI0LDIsMTMxLDIsMTI1LDYsCisgICAgMTI0LDYsMTAwLDAsMTA3LDgsMTE0LDE3NiwxMTYsOCwxMTYsNiwxMDYsNywxMjQsMCwKKyAgICAxMzEsMSwxMDAsNCwxMjQsMCwxNDQsMSwxMzEsMSwxMzAsMSwxMTAsOCwxMTYsMTAsCisgICAgMTI0LDYsMTMxLDEsMTI1LDcsMTI0LDMsMTE0LDIyMCwxMTYsMSwxMDYsMiwxMjQsMywKKyAgICAyNSwwLDEyNSw0LDExNiwxMSwxMjQsNCwxMjQsMCwxMDYsMCwxMDAsMSwxMzEsMSwKKyAgICAxMDAsNSwyNSwwLDEyNCw3LDEzMSwzLDEsMCwxMjQsNyw4MywwLDQxLDYsCisgICAgNzgsMTE0LDEyMSwwLDAsMCwxMTQsMzMsMCwwLDAsMTIyLDIzLDU5LDMyLDEyMywKKyAgICAzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDExNCwxNSwwLDAsMCwxMTQsMTQxLDAsMCwwLDQxLDEyLAorICAgIDExNCwxMjIsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsCisgICAgNjUsMCwwLDAsMTE0LDEzMSwwLDAsMCwxMTQsOTYsMCwwLDAsMjE4LDgsCisgICAgOTUsNjksODIsODIsOTUsNzcsODMsNzEsMTE0LDUwLDAsMCwwLDExNCw3NywwLAorICAgIDAsMCwxMTQsMTc3LDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDUsMCwwLAorICAgIDAsNDEsOCwxMTQsMTUsMCwwLDAsMjE4LDcsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgOTUsMTE0LDE1MywwLDAsMCwxMTQsMTIzLDAsMCwwLDkwLDEzLDExMiw5NywxMTQsCisgICAgMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE0OCwwLDAsMCwxMTQsCisgICAgODgsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgOTcsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMTcsMTEwLDEwOCwxMTEsOTksMTA3LDEwMSwKKyAgICAxMDAsMTgxLDMsMCwwLDExNSw0MiwwLDAsMCwwLDEsNCwxLDE0LDEsCisgICAgNCwxLDEwLDEsMTAsMiwxMCwxLDEwLDEsMTAsMSwyLDEsMTAsMSwKKyAgICAxNCwxLDE2LDEsMjIsMSwxMCwxLDgsMSwyMiwyLDgsMSw0LDIsCisgICAgMTAsMSwyMiwxLDExNCwxODUsMCwwLDAsOTksMiwwLDAsMCwwLDAsCisgICAgMCwwLDIsMCwwLDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDMwLAorICAgIDAsMCwwLDExNiwwLDEyNCwwLDEzMSwxLDE0MywxMiwxLDAsMTE2LDEsMTI0LAorICAgIDAsMTI0LDEsMTMxLDIsODMsMCw4MSwwLDgyLDAsODgsMCwxMDAsMSw4MywKKyAgICAwLDQxLDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLDk3LDExMCwxMDAsMzIsMTA4LDExMSwKKyAgICA5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsCisgICAgMTEwLDEwMCwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCw1NCwKKyAgICAwLDAsMCwxMTQsMTg1LDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwwLDExNCwKKyAgICAxODQsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMjE4LDE0LDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwKKyAgICAxMTEsOTcsMTAwLDIwOCwzLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTAsMSwKKyAgICAxMTQsMTg2LDAsMCwwLDExNCwzMywwLDAsMCw5OSwzLDAsMCwwLDAsCisgICAgMCwwLDAsNSwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAxMjIsMCwwLDAsMTE2LDAsMTI0LDAsMTI0LDEsMTI0LDIsMTMxLDMsMSwwLAorICAgIDEyNCwyLDEwMCwxLDEwNyw0LDExNCwzMiwxMTYsMSwxMjQsMCwxMjQsMSwxMjQsMiwKKyAgICAxMzEsMywxMjUsMCwxMTYsMiwxMDYsMywxMzEsMCwxLDAsMTI0LDAsMTE2LDQsCisgICAgMTA2LDUsMTA3LDcsMTE0LDYwLDExNiw2LDEyNCwwLDExNiw3LDEzMSwyLDgzLDAsCisgICAgMTE2LDQsMTA2LDUsMTI0LDAsMjUsMCwxMjUsMywxMjQsMywxMDAsMiwxMDcsOCwKKyAgICAxMTQsMTEwLDExNiwyLDEwNiw4LDEzMSwwLDEsMCwxMDAsMywxMDYsOSwxMjQsMCwKKyAgICAxMzEsMSwxMjUsNCwxMTYsMTAsMTI0LDQsMTAwLDQsMTI0LDAsMTQ0LDEsMTMxLDEsCisgICAgMTMwLDEsMTE2LDExLDEyNCwwLDEzMSwxLDEsMCwxMjQsMyw4MywwLDQxLDUsCisgICAgOTcsNTAsMSwwLDAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5NywxMTAsMTAwLDMyLAorICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTA1LDExNiwxMTUsMzIsMTEwLAorICAgIDk3LDEwOSwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwKKyAgICAzMiw5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTA5LDk3LDEwMCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LAorICAgIDQ0LDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwKKyAgICA5NywxMDAsMTA2LDExNywxMTUsMTE2LDEwOSwxMDEsMTEwLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE0LAorICAgIDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwMywxMTQsCisgICAgMTAxLDk3LDExNiwxMDEsMTE1LDExNiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDEwMCwxMDEsCisgICAgMTEwLDExMSwxMDksMTA1LDExMCw5NywxMTYsMTExLDExNCwzMiwxMTEsMTAyLDMyLDEwMiwxMTcsMTEwLAorICAgIDk5LDExNiwxMDUsMTExLDExMCw5NywxMDgsMTA1LDExNiwxMjEsMTAsMzIsMzIsMzIsMzIsOTgsCisgICAgMTAxLDExNiwxMTksMTAxLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsOTcsMTEwLDEwMCwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw5NSw5NSw0NiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLAorICAgIDEwMSwxMTUsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDk1LDk1LDExMiw5Nyw5OSwKKyAgICAxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAwLDEwNSwxMDAsMzIsMTEwLDExMSwxMTYsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDMzLDAsMCwwLDc4LDEyMiw0MCwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTEsMTAyLDMyLDEyMywxMjUsMzIsMTA0LDk3LDEwOCwxMTYsCisgICAgMTAxLDEwMCw1OSwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwxMTQsMTUsMCwwLDAsNDEsMTIsMTE0LDE4MiwKKyAgICAwLDAsMCwxMTQsMTcyLDAsMCwwLDExNCw1NywwLDAsMCwxMTQsMTQ2LDAsCisgICAgMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDE4NiwwLDAsCisgICAgMCwyMTgsMTEsOTUsMTAzLDk5LDEwMCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTQsNTgsCisgICAgMCwwLDAsMTE0LDUwLDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNjMsMCwKKyAgICAwLDAsNDEsNSwxMTQsMTUsMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsMTcxLAorICAgIDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsNzQsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE4NywwLDAsCisgICAgMCwyMTQsMywwLDAsMTE1LDI4LDAsMCwwLDAsOSwxMiwxLDgsMSwKKyAgICAxMiwxLDgsMSwxMCwxLDEwLDEsMTAsMSw4LDEsOCwxLDQsMSwKKyAgICA2LDEsMTQsMSw4LDEsMTE0LDE4NywwLDAsMCw5OSwzLDAsMCwwLAorICAgIDAsMCwwLDAsNiwwLDAsMCwxNywwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMTc4LDAsMCwwLDExNiwwLDEyNCwwLDEwMCwxLDEzMSwyLDExNCwxNzQsMTAwLAorICAgIDIsMTI0LDEsMTA3LDYsMTE0LDU4LDExNiwxLDEyNCwxLDEzMSwxLDEyNSwxLDEyNCwKKyAgICAxLDEwNiwyLDEwMCwyLDEzMSwxLDEsMCwxMTYsMCwxMjQsMCwxMDAsMywxMzEsCisgICAgMiwxMTQsNTgsMTI0LDEsMTA2LDMsMTI0LDAsMTA2LDQsMTMxLDEsMSwwLDEyMCwKKyAgICAxMTQsMTI0LDEsNjgsMCw5MywxMDYsMTI1LDMsMTE2LDAsMTI0LDAsMTI0LDMsMTMxLAorICAgIDIsMTE1LDY0LDEwMCw0LDEwNiw1LDEyNCwwLDEwNiw2LDEyNCwzLDEzMSwyLDEyNSwKKyAgICA0LDEyMSwxNCwxMTYsNywxMjQsMiwxMjQsNCwxMzEsMiwxLDAsODcsMCwxMTMsCisgICAgNjQsNCwwLDExNiw4LDEwNywxMCwxMTQsMTY4LDEsMCwxMjUsNSwxLDAsMTIyLAorICAgIDM0LDExNiw5LDEyNCw1LDEzMSwxLDEwNiwxMCwxMTYsMTEsMTMxLDEsMTE0LDE1MCwxMjQsCisgICAgNSwxMDYsMTIsMTI0LDQsMTA3LDIsMTE0LDE1MCwxMTksNjQsMTMwLDAsODcsMCw4OSwKKyAgICAwLDEwMCw1LDEwMCw1LDEyNSw1LDEyNiw1LDg4LDAsMTEzLDY0LDg4LDAsMTEzLAorICAgIDY0LDg3LDAsMTI0LDAsODMsMCw0MSw2LDEyMiwyMzgsNzAsMTA1LDEwMywxMTcsMTE0LAorICAgIDEwMSwzMiwxMTEsMTE3LDExNiwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTQsMTAxLDExNiwKKyAgICAxMTcsMTE0LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDk1LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwKKyAgICAxMDUsMTE1LDMyLDk3LDMyLDk5LDk3LDEwOCwxMDgsOTcsOTgsMTA4LDEwMSwzMiwxMTksMTA0LAorICAgIDEwNSw5OSwxMDQsMzIsMTE2LDk3LDEwNywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywKKyAgICAxMDksMTAxLDMyLDExMSwxMDIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE2LDExMSwxMCwKKyAgICAzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw3MywxMTYsMzIsMTA1LAorICAgIDExNSwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAwLDEwMSwKKyAgICA5OSwxMTEsMTE3LDExMiwxMDgsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsOTcsMTE1LDExNSwxMTcsMTA5LDEwNSwxMTAsCisgICAgMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzksMTE1LDEwLDMyLDMyLAorICAgIDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwKKyAgICAxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMTQsCisgICAgMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMTMxLDAsMCwwLDI1MCwxLAorICAgIDQyLDIxOCw3LDk1LDk1LDk3LDEwOCwxMDgsOTUsOTUsMTIyLDUsMTIzLDEyNSw0NiwxMjMsCisgICAgMTI1LDc4LDQxLDEzLDExNCw0LDAsMCwwLDExNCwxMzAsMCwwLDAsMjE4LDYsCisgICAgMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMjE4LDYsMTAxLDEyMCwxMTYsMTAxLDExMCwxMDAsMTE0LDE4OSwKKyAgICAwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDY1LDAsCisgICAgMCwwLDExNCw3NywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCw3MSwwLDAsCisgICAgMCwyMTgsMTUsOTUsNjksODIsODIsOTUsNzcsODMsNzEsOTUsODAsODIsNjksNzAsCisgICAgNzMsODgsMTE0LDE1LDAsMCwwLDQxLDYsMTE0LDg5LDAsMCwwLDIxOCw4LAorICAgIDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMTE0LDE4NCwwLDAsMCwyMTgsMSwxMjAsCisgICAgOTAsOSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsOTAsMywxMDEsMTIwLDk5LAogICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKLSAgICAyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsOTcsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCw5NSwKLSAgICAxMTcsMTEwLDEwOCwxMTEsOTksMTA3LDEwMSwxMDAsMTcxLDMsMCwwLDExNSw0MiwwLDAsCi0gICAgMCwwLDEsNiwxLDE5LDEsNiwxLDE1LDEsMTMsMiwxNSwxLDExLAotICAgIDEsMTMsMSwzLDEsMTMsMSwxMywxLDIyLDEsMjYsMSwxNSwxLDEyLAotICAgIDEsMzAsMiwxMiwxLDYsMiwxMywxLDI5LDEsMTE0LDE4NCwwLDAsMCwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxMCwwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsMzcsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsMTQzLDE4LDAsMSwxMTYsMSwwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICAxMzEsMiwwLDgzLDg3LDEwMCwxLDAsODEsODIsODgsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDEyMiw1NCw3MCwxMDUsMTEwLDEwMCwzMiw5NywxMTAsMTAwLDMyLDEwOCwxMTEsOTcsMTAwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDk3LDExMCwxMDAsCi0gICAgMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwxMDcsNDYsNzgsNDEsMiwxMTQsNTQsMCwwLAotICAgIDAsMTE0LDE4NCwwLDAsMCw0MSwyLDExNCwxNSwwLDAsMCwxMTQsMTgzLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDIxOCwxNCw5NSwxMDIsMTA1LDExMCwxMDAsOTUsOTcsMTEwLDEwMCw5NSwxMDgsMTExLDk3LAotICAgIDEwMCwxOTgsMywwLDAsMTE1LDQsMCwwLDAsMCwyLDEzLDEsMTE0LDE4NSwKLSAgICAwLDAsMCwxMTQsMzMsMCwwLDAsOTksMywwLDAsMCwwLDAsMCwKLSAgICAwLDUsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTY2LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDMsCi0gICAgMCwxLDEyNCwyLDAsMTAwLDEsMCwxMDcsNCwwLDExNCw0NiwwLDExNiwxLAotICAgIDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDMsMCwxMjUsMCwwLAotICAgIDExNiwyLDAsMTA2LDMsMCwxMzEsMCwwLDEsMTI0LDAsMCwxMTYsNCwwLAotICAgIDEwNiw1LDAsMTA3LDcsMCwxMTQsODQsMCwxMTYsNiwwLDEyNCwwLDAsMTE2LAotICAgIDcsMCwxMzEsMiwwLDgzLDExNiw0LDAsMTA2LDUsMCwxMjQsMCwwLDI1LAotICAgIDEyNSwzLDAsMTI0LDMsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDE1MiwwLDExNiwKLSAgICAyLDAsMTA2LDgsMCwxMzEsMCwwLDEsMTAwLDMsMCwxMDYsOSwwLDEyNCwKLSAgICAwLDAsMTMxLDEsMCwxMjUsNCwwLDExNiwxMCwwLDEyNCw0LDAsMTAwLDQsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDEsMTMwLDEsMCwxMTYsMTEsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsMSwxMjQsMywwLDgzLDQxLDUsOTcsNTAsMSwwLDAsNzMsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDk3LDExNSwxMDEsCi0gICAgMTAwLDMyLDExMSwxMTAsMzIsMTA1LDExNiwxMTUsMzIsMTEwLDk3LDEwOSwxMDEsNDQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDk5LAotICAgIDk3LDEwOCwxMDgsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiw5OCwxMDEsMTA1LDExMCwxMDMsCi0gICAgMzIsMTA5LDk3LDEwMCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDQ0LDMyLDk3LDExMCwxMDAsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiw5NywxMDAsMTA2LDExNywxMTUsMTE2LAotICAgIDEwOSwxMDEsMTEwLDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwKLSAgICAxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLAotICAgIDExMCwxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwMywxMTQsMTAxLDk3LDExNiwxMDEsMTE1LDExNiwKLSAgICAzMiw5OSwxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDEwMCwxMDEsMTEwLDExMSwxMDksMTA1LDExMCw5NywKLSAgICAxMTYsMTExLDExNCwzMiwxMTEsMTAyLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCw5NywKLSAgICAxMDgsMTA1LDExNiwxMjEsMTAsMzIsMzIsMzIsMzIsOTgsMTAxLDExNiwxMTksMTAxLDEwMSwxMTAsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTcsCi0gICAgMTEwLDEwMCwzMiw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw5NSw0NiwzMiw4NCwKLSAgICAxMDQsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLDEwMSwxMTUsMzIsMTE1LDEwMSwxMTYsCi0gICAgMTE2LDEwNSwxMTAsMTAzLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwKLSAgICAzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMzIsMTAwLDEwNSwxMDAsMzIsMTEwLDExMSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE0LDMzLDAsMCwwLDc4LDEyMiw0MCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwKLSAgICAxMTEsMTAyLDMyLDEyMywxMjUsMzIsMTA0LDk3LDEwOCwxMTYsMTAxLDEwMCw1OSwzMiw3OCwxMTEsCi0gICAgMTEwLDEwMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwxMTQsMTUsMCwwLDAsNDEsMTIsMTE0LDE4MSwwLDAsMCwxMTQsMTcxLDAsCi0gICAgMCwwLDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsMCwwLDExNCwxNCwwLDAsCi0gICAgMCwxMTQsMjEsMCwwLDAsMTE0LDE4NSwwLDAsMCwyMTgsMTEsOTUsMTAzLDk5LAotICAgIDEwMCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTQsNTgsMCwwLDAsMTE0LDUwLDAsCi0gICAgMCwwLDExNCw3NywwLDAsMCwxMTQsNjMsMCwwLDAsNDEsNSwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCw4OSwwLAotICAgIDAsMCwxMTQsNzQsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMTE0LDE4NiwwLDAsMCwyMDQsMywwLDAsMTE1LAotICAgIDI4LDAsMCwwLDAsOSwxNiwxLDEyLDEsMTgsMSwxMCwxLDE1LDEsCi0gICAgMTMsMSwxMywxLDEyLDEsMTAsMSw2LDEsOSwxLDE4LDEsMTAsMSwKLSAgICAxMTQsMTg2LDAsMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsCi0gICAgMCwwLDE3LDAsMCwwLDY3LDAsMCwwLDExNSwyMzksMCwwLDAsMTE2LAotICAgIDAsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLDIsMCwxMTQsMjM1LDAsMTAwLDIsCi0gICAgMCwxMjQsMSwwLDEwNyw2LDAsMTE0LDgzLDAsMTE2LDEsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsMTI1LDEsMCwxMjQsMSwwLDEwNiwyLDAsMTAwLDIsMCwxMzEsCi0gICAgMSwwLDEsMTE2LDAsMCwxMjQsMCwwLDEwMCwzLDAsMTMxLDIsMCwxMTQsCi0gICAgODMsMCwxMjQsMSwwLDEwNiwzLDAsMTI0LDAsMCwxMDYsNCwwLDEzMSwxLAotICAgIDAsMSwxMjAsMTQ5LDAsMTI0LDEsMCw2OCw5MywxNDEsMCwxMjUsMywwLDExNiwKLSAgICAwLDAsMTI0LDAsMCwxMjQsMywwLDEzMSwyLDAsMTE1LDkwLDAsMTAwLDQsCi0gICAgMCwxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsMywwLDEzMSwyLDAsCi0gICAgMTI1LDQsMCwxMjEsMTcsMCwxMTYsNywwLDEyNCwyLDAsMTI0LDQsMCwxMzEsCi0gICAgMiwwLDEsODcsMTEzLDkwLDAsNCwxMTYsOCwwLDEwNywxMCwwLDExNCwyMzAsCi0gICAgMCwxLDEyNSw1LDAsMSwxMjIsNDcsMCwxMTYsOSwwLDEyNCw1LDAsMTMxLAotICAgIDEsMCwxMDYsMTAsMCwxMTYsMTEsMCwxMzEsMSwwLDExNCwyMDksMCwxMjQsNSwKLSAgICAwLDEwNiwxMiwwLDEyNCw0LDAsMTA3LDIsMCwxMTQsMjA5LDAsMTE5LDkwLDAsCi0gICAgMTMwLDAsMCw4Nyw4OSwxMDAsNSwwLDEwMCw1LDAsMTI1LDUsMCwxMjYsNSwKLSAgICAwLDg4LDExMyw5MCwwLDg4LDExMyw5MCwwLDg3LDEyNCwwLDAsODMsNDEsNiwKLSAgICAxMjIsMjM4LDcwLDEwNSwxMDMsMTE3LDExNCwxMDEsMzIsMTExLDExNywxMTYsMzIsMTE5LDEwNCw5NywKLSAgICAxMTYsMzIsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsOTUsMzIsMTE1LDEwNCwxMTEsCi0gICAgMTE3LDEwOCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsCi0gICAgMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwzMiwxMTIsOTcsMTE0LAotICAgIDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiw5NywzMiw5OSw5NywxMDgsMTA4LAotICAgIDk3LDk4LDEwOCwxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiw5NywxMDcsMTAxLDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKLSAgICAxMTYsNDYsMzIsNzMsMTE2LDMyLDEwNSwxMTUsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAotICAgIDEwMCwzMiwxMTYsMTExLDMyLDEwMCwxMDEsOTksMTExLDExNywxMTIsMTA4LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLAotICAgIDk3LDExNSwxMTUsMTE3LDEwOSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsCi0gICAgMTA1LDk4LDM5LDExNSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwKLSAgICAxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA1LAotICAgIDExNSwzMiwxMDAsMTAxLDExNSwxMDUsMTE0LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgMTE0LDEzMSwwLDAsMCwyNTAsMSw0MiwyMTgsNyw5NSw5NSw5NywxMDgsMTA4LDk1LAotICAgIDk1LDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw3OCw0MSwxMywxMTQsNCwwLDAsMCwKLSAgICAxMTQsMTMwLDAsMCwwLDIxOCw2LDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDIxOCw2LDEwMSwKLSAgICAxMjAsMTE2LDEwMSwxMTAsMTAwLDExNCwxODgsMCwwLDAsMTE0LDUwLDAsMCwwLDExNCwKLSAgICAxLDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE3OCwKLSAgICAwLDAsMCwxMTQsNzEsMCwwLDAsMjE4LDE1LDk1LDY5LDgyLDgyLDk1LDc3LAotICAgIDgzLDcxLDk1LDgwLDgyLDY5LDcwLDczLDg4LDExNCwxNSwwLDAsMCw0MSw2LAotICAgIDExNCw4OSwwLDAsMCwyMTgsOCwxMDIsMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsMTE2LDExNCwKLSAgICAxODMsMCwwLDAsMjE4LDEsMTIwLDkwLDksMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywKLSAgICAxMDksMTAxLDkwLDMsMTAxLDEyMCw5OSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTYsOTUsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSw5NSwKLSAgICAxMDIsMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsMTE2LDIyOCwzLDAsMCwxMTUsMzQsMCwwLAotICAgIDAsMCwxMCwxNSwxLDEyLDEsMTIsMSwxMywxLDE1LDEsMTYsMSwxMywKLSAgICAxLDE1LDEsMjEsMSwzLDEsMTcsMSwxOCw0LDIxLDEsMTUsMSwzLAotICAgIDEsMjYsMSwxMTQsMTk0LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDcyLDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTI1LDEsCi0gICAgMCwxMjQsMSwwLDEwMCwyLDAsMTA3LDgsMCwxMTQsNjgsMCwxMjQsMCwwLAotICAgIDEwMCwzLDAsMjUsMTI1LDEsMCwxMDAsNCwwLDEyNCwwLDAsMTA3LDcsMCwKLSAgICAxMTQsNjgsMCwxMjQsMSwwLDEwNiwxLDAsMTAwLDUsMCwxMzEsMSwwLDEwMCwKLSAgICA2LDAsMjUsMTI1LDEsMCwxMjQsMSwwLDgzLDQxLDcsMTIyLDE2Nyw2Nyw5NywKLSAgICAxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDMyLDExOSwxMDQsOTcsMTE2LDMyLDk1LDk1LDExMiwKLSAgICA5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKLSAgICA5OCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywKLSAgICAxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTAzLDExNyw5NywxMTQsCi0gICAgOTcsMTEwLDExNiwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTAxLDEwMiwKLSAgICAxMDUsMTEwLDEwMSwxMDAsMzIsMTExLDExNCwzMiw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsMTAxLAotICAgIDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsNzgsMTExLDExMCwxMDEsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE2LDExMSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwzMiwxMTYsMTA0LAotICAgIDk3LDExNiwzMiwxMDUsMTE2LDExNSwzMiwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwzMiwxMTgsOTcsCi0gICAgMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwxMTcsMTEwLDEwNywxMTAsMTExLDExOSwxMTAsNDYsMTAsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTE0LDEzNCwwLDAsMCw3OCwxMTQsMSwwLDAsMCwKLSAgICAxMTQsMTMxLDAsMCwwLDExNCwxMjEsMCwwLDAsMTE0LDMzLDAsMCwwLDQxLAotICAgIDIsMTE0LDQyLDAsMCwwLDExNCwxMjIsMCwwLDAsNDEsMiwyMTgsNywxMDMsCi0gICAgMTA4LDExMSw5OCw5NywxMDgsMTE1LDExNCwxNjksMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LDk1LDk5LDk3LDEwOCwKLSAgICA5OSw5NSw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsNCw0LDAsCi0gICAgMCwxMTUsMTIsMCwwLDAsMCw3LDE1LDEsMTIsMSwxMCwxLDEyLDEsCi0gICAgMTksMSwxMTQsMTk2LDAsMCwwLDk5LDUsMCwwLDAsMCwwLDAsMCwKLSAgICA5LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDIyNywwLDAsCi0gICAgMCwxMjQsNCwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsMjcsMCwxMTYsMCwwLAotICAgIDEyNCwwLDAsMTMxLDEsMCwxMjUsNSwwLDExMCw1NCwwLDEyNCwxLDAsMTAwLAotICAgIDIsMCwxMDcsOSwwLDExNCw0NSwwLDEyNCwxLDAsMTEwLDMsMCwxMDUsMCwKLSAgICAwLDEyNSw2LDAsMTE2LDEsMCwxMjQsNiwwLDEzMSwxLDAsMTI1LDcsMCwKLSAgICAxMTYsMCwwLDEyNCwwLDAsMTI0LDcsMCwxMjQsNCwwLDEzMSwzLDAsMTI1LAotICAgIDUsMCwxMjQsMywwLDExNSwyMDcsMCwxMjQsNCwwLDEwMCwxLDAsMTA3LDIsCi0gICAgMCwxMTQsMTIyLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwyLDAsMTAwLDMsMCwKLSAgICAxMzEsMSwwLDEwMCwxLDAsMjUsMTMxLDEsMCw4MywxMjQsMCwwLDExNSwxMzIsCi0gICAgMCwxMjQsNSwwLDgzLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLDExNiwzLAotICAgIDAsMTI0LDAsMCwxMDYsMiwwLDEwMCwzLDAsMTMxLDEsMCwxMDAsMSwwLAotICAgIDI1LDEzMSwxLDAsMjQsMTI1LDgsMCwxMTYsNCwwLDEwNiw1LDAsMTI0LDUsCi0gICAgMCwxMDYsNiwwLDEwMCwyLDAsMTE2LDMsMCwxMjQsNSwwLDEwNiw2LDAsCi0gICAgMTMxLDEsMCwxMjQsOCwwLDI0LDEzMywyLDAsMjUsMjUsODMsMTEwLDE2LDAsCi0gICAgMTE2LDcsMCwxMjQsNSwwLDEyNCwzLDAsMTE2LDAsMCwxMzEsMywwLDgzLAotICAgIDEwMCwyLDAsODMsNDEsNCw5NywyMTUsMSwwLDAsNzMsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTAxLDMyLDM5LDEwMywxMDgsMTExLDk4LDk3LDEwOCwxMTUsMzksMzIsOTcsCi0gICAgMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLAotICAgIDExNiwxMTEsMzIsMTA1LDExMCwxMDIsMTAxLDExNCwzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMTUsMzIsMTExLDk5LDk5LAotICAgIDExNywxMTQsMTE0LDEwNSwxMTAsMTAzLDMyLDEwMiwxMTQsMTExLDEwOSwxMCwzMiwzMiwzMiwzMiwKLSAgICAxMTYsMTExLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwKLSAgICAxMTgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDExNSw0NiwzMiw4NCwxMDQsMTAxLDMyLAotICAgIDM5LDEwOCwxMTEsOTksOTcsMTA4LDExNSwzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwKLSAgICAxMTYsMzIsMTA1LDExNSwzMiwxMDUsMTAzLDExMCwxMTEsMTE0LDEwMSwxMDAsNDYsMzIsODQsMTA0LAotICAgIDEwMSwxMCwzMiwzMiwzMiwzMiwzOSwxMDIsMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsMTE2LDM5LAotICAgIDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLAotICAgIDEwNSwxMDEsMTE1LDMyLDExOSwxMDQsOTcsMTE2LDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLAotICAgIDEwMSwxMjAsMTA1LDExNSwxMTYsMzIsOTcsMTE1LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsCi0gICAgMTE2LDEwMSwxMTUsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxMCwzMiwzMiwzMiwzMiw5OCwxMDEsMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDEwMCwzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDk2LDk2LDEwMiwxMTQsMTExLAotICAgIDEwOSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwKLSAgICA2MCwxMDIsMTE0LDExMSwxMDksMTA4LDEwNSwxMTUsMTE2LDYyLDk2LDk2LDQxLDQ2LDMyLDMyLAotICAgIDg0LDEwNCwxMDEsMzIsMzksMTA4LDEwMSwxMTgsMTAxLDEwOCwzOSwxMCwzMiwzMiwzMiwzMiwKLSAgICA5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLAotICAgIDExMCwxMTYsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwKLSAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMDUsMTEwLDMyLDk3LDMyLDExNCwxMDEsMTA4LAotICAgIDk3LDExNiwxMDUsMTE4LDEwMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLDk2LDk2LDEwMiwxMTQsMTExLDEwOSwzMiw0Niw0NiwKLSAgICAxMTIsMTA3LDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksMTExLDEwMCw5Niw5NiwKLSAgICAzMiwxMTksMTExLDExNywxMDgsMTAwLDMyLDEwNCw5NywxMTgsMTAxLDMyLDk3LDMyLDM5LDEwOCwKLSAgICAxMDEsMTE4LDEwMSwxMDgsMzksMzIsMTExLDEwMiwzMiw1MCw0MSw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwxMTQsMzMsMCwwLDAsNzgsMTE0LDEyMSwwLDAsMCw0MSw4LDExNCwKLSAgICAxODYsMCwwLDAsMTE0LDE5NiwwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDExNCwxNjcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwKLSAgICAwLDAsMCwxMTQsMSwwLDAsMCwxMTQsMTk0LDAsMCwwLDQxLDksMTE0LAotICAgIDE1LDAsMCwwLDExNCwxOTUsMCwwLDAsMjE4LDYsMTA4LDExMSw5OSw5NywxMDgsCi0gICAgMTE1LDExNCwxOTIsMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgOTAsOCwxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDk1LDExNCwxNjksMCwwLDAsOTAsCi0gICAgNyw5OSwxMTcsMTE2LDk1LDExMSwxMDIsMTAyLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxMCw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw5NSw5NSwxOSw0LDAsMCwxMTUsMjYsMCwwLDAsMCwxMSwxMiwxLAotICAgIDE1LDIsMjQsMSwxMiwxLDE4LDEsNiwzLDEyLDEsMjMsMSw2LDEsCi0gICAgNCw0LDM1LDMsNDAsMiwxMTQsMTk5LDAsMCwwLDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDUzLDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEzMSwxLAotICAgIDAsMTI1LDEsMCwxMjQsMSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsNDMsMCwKLSAgICAxMTYsMiwwLDEwMCwxLDAsMTI0LDAsMCwyMywxMzEsMSwwLDEzMCwxLDAsCi0gICAgMTE2LDMsMCwxMjQsMSwwLDEzMSwxLDAsODMsNDEsMiw3OCwxMjIsMjUsMTEwLAorICAgIDE2LDk1LDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LAorICAgIDExNiwyMzgsMywwLDAsMTE1LDM0LDAsMCwwLDAsMTAsMTAsMSw4LDEsCisgICAgOCwxLDEwLDEsMTAsMSwxMiwxLDEwLDEsMTAsMSwxNCwxLDIsMSwKKyAgICAxNCwxLDE2LDQsMTQsMSwxMCwxLDIsMSwyNCwxLDExNCwxOTUsMCwwLAorICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTYwLDAsMCwwLDEyNCwwLDEwNiwwLDEwMCwKKyAgICAxLDEzMSwxLDEyNSwxLDEyNCwwLDEwNiwwLDEwMCwyLDEzMSwxLDEyNSwyLDEyNCwKKyAgICAxLDEwMCwzLDEwNyw5LDExNCw5MiwxMjQsMiwxMDAsMywxMDcsOSwxMTQsODYsMTI0LAorICAgIDEsMTI0LDIsMTA2LDEsMTA3LDMsMTE0LDg2LDExNiwyLDEwNiwzLDEwMCw0LDEwNiwKKyAgICA0LDEwMCw1LDEyNCwxLDE1NSwyLDEwMCw2LDEyNCwyLDEwNiwxLDE1NSwyLDEwMCwKKyAgICA3LDEwMyw1LDEzMSwxLDExNiw1LDEwMCw4LDEwMCw5LDE0NCwxLDEzMSwyLDEsCisgICAgMCwxMjQsMSw4MywwLDExMCw2NCwxMjQsMiwxMDAsMywxMDcsOSwxMTQsMTA4LDEyNCwKKyAgICAyLDEwNiwxLDgzLDAsMTEwLDQ4LDExNiwyLDEwNiwzLDEwMCwxMCwxMTYsNSwxMDAsCisgICAgOCwxMDAsOSwxNDQsMSwxMzEsMiwxLDAsMTI0LDAsMTAwLDExLDI1LDAsMTI1LAorICAgIDEsMTAwLDEyLDEyNCwwLDEwNyw3LDExNCwxNTYsMTI0LDEsMTA2LDYsMTAwLDEzLDEzMSwKKyAgICAxLDEwMCwxNCwyNSwwLDEyNSwxLDEyNCwxLDgzLDAsNDEsMTUsMTIyLDE2Nyw2NywKKyAgICA5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDMyLDExOSwxMDQsOTcsMTE2LDMyLDk1LDk1LAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwKKyAgICAzMiw5OCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTAzLDExNyw5NywKKyAgICAxMTQsOTcsMTEwLDExNiwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTAxLAorICAgIDEwMiwxMDUsMTEwLDEwMSwxMDAsMzIsMTExLDExNCwzMiw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsCisgICAgMTAxLDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsNzgsMTExLDExMCwxMDEsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE2LDExMSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwzMiwxMTYsCisgICAgMTA0LDk3LDExNiwzMiwxMDUsMTE2LDExNSwzMiwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwzMiwxMTgsCisgICAgOTcsMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwxMTcsMTEwLDEwNywxMTAsMTExLDExOSwxMTAsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDEzNCwwLDAsMCwxMTQsOTUsMCwwLDAsCisgICAgNzgsMjE4LDAsMTIyLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwKKyAgICAzMiwzMyw2MSwzMiw5NSw5NSwxMTUsMTEyLDEwMSw5OSw5NSw5NSw0NiwxMTIsOTcsMTE0LAorICAgIDEwMSwxMTAsMTE2LDMyLDQwLDEyMiw0LDMyLDMzLDYxLDMyLDI1MCwxLDQxLDExNCwxNDAsCisgICAgMCwwLDAsMjMzLDMsMCwwLDAsMTIyLDg5LDk5LDk3LDExMCwzOSwxMTYsMzIsCisgICAgMTE0LDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwKKyAgICAxMDIsMTE0LDExMSwxMDksMzIsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMzIsMTExLDExNCwKKyAgICAzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsNDQsMzIsMTAyLDk3LAorICAgIDEwOCwxMDgsMTA1LDExMCwxMDMsMzIsOTgsOTcsOTksMTA3LDMyLDExMSwxMTAsMzIsOTUsOTUsCisgICAgMTEwLDk3LDEwOSwxMDEsOTUsOTUsMzIsOTcsMTEwLDEwMCwzMiw5NSw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCw5NSw5NSwxMTQsMSwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwxMjEsMCwKKyAgICAwLDAsMTE0LDMzLDAsMCwwLDQxLDcsMTE0LDQyLDAsMCwwLDExNCwxMjMsCisgICAgMCwwLDAsMTE0LDE0MiwwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxMTUsMCwKKyAgICAwLDAsMTE0LDE3NiwwLDAsMCwxMTQsMTIyLDAsMCwwLDQxLDMsMjE4LDcsCisgICAgMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwxMTQsMTcwLDAsMCwwLDExNCw4OCwwLDAsCisgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKKyAgICAyMTgsMTcsOTUsOTksOTcsMTA4LDk5LDk1LDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLAorICAgIDEwMSw5NSw5NSwxNCw0LDAsMCwxMTUsMzAsMCwwLDAsMCw3LDEwLDEsCisgICAgMTAsMSw4LDEsMTgsMSwyOCwyLDEyLDEsNiwxLDgsMSw4LDIsCisgICAgNiwyLDEyLDEsOCwxLDgsMSwxNCwxLDExNCwyMDAsMCwwLDAsOTksCisgICAgNSwwLDAsMCwwLDAsMCwwLDksMCwwLDAsNSwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTcwLDAsMCwwLDEyNCw0LDEwMCwxLDEwNywyLDExNCwKKyAgICAxOCwxMTYsMCwxMjQsMCwxMzEsMSwxMjUsNSwxMTAsMzYsMTI0LDEsMTAwLDIsMTA3LAorICAgIDksMTE0LDMwLDEyNCwxLDExMCwyLDEwNSwwLDEyNSw2LDExNiwxLDEyNCw2LDEzMSwKKyAgICAxLDEyNSw3LDExNiwwLDEyNCwwLDEyNCw3LDEyNCw0LDEzMSwzLDEyNSw1LDEyNCwKKyAgICAzLDExNSwxNTQsMTI0LDQsMTAwLDEsMTA3LDIsMTE0LDg2LDExNiwwLDEyNCwwLDEwNiwKKyAgICAyLDEwMCwzLDEzMSwxLDEwMCwxLDI1LDAsMTMxLDEsODMsMCwxMTMsMTY2LDEyNCwKKyAgICAwLDExNSw5NiwxMjQsNSw4MywwLDExMywxNjYsMTE2LDMsMTI0LDAsMTMxLDEsMTE2LAorICAgIDMsMTI0LDAsMTA2LDIsMTAwLDMsMTMxLDEsMTAwLDEsMjUsMCwxMzEsMSwyNCwKKyAgICAwLDEyNSw4LDExNiw0LDEwNiw1LDEyNCw1LDEwNiw2LDEwMCwyLDExNiwzLDEyNCwKKyAgICA1LDEwNiw2LDEzMSwxLDEyNCw4LDI0LDAsMTMzLDIsMjUsMCwyNSwwLDgzLAorICAgIDAsMTEwLDEyLDExNiw3LDEyNCw1LDEyNCwzLDExNiwwLDEzMSwzLDgzLDAsMTAwLAorICAgIDIsODMsMCw0MSw0LDk3LDIxNSwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDg0LDEwNCwxMDEsMzIsMzksMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwzOSwzMiw5NywxMTQsCisgICAgMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LAorICAgIDExMSwzMiwxMDUsMTEwLDEwMiwxMDEsMTE0LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDExNSwzMiwxMTEsOTksOTksMTE3LAorICAgIDExNCwxMTQsMTA1LDExMCwxMDMsMzIsMTAyLDExNCwxMTEsMTA5LDEwLDMyLDMyLDMyLDMyLDExNiwKKyAgICAxMTEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwKKyAgICAxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDMyLDg0LDEwNCwxMDEsMzIsMzksCisgICAgMTA4LDExMSw5OSw5NywxMDgsMTE1LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwKKyAgICAzMiwxMDUsMTE1LDMyLDEwNSwxMDMsMTEwLDExMSwxMTQsMTAxLDEwMCw0NiwzMiw4NCwxMDQsMTAxLAorICAgIDEwLDMyLDMyLDMyLDMyLDM5LDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsMzksMzIsCisgICAgOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LAorICAgIDEwMSwxMTUsMzIsMTE5LDEwNCw5NywxMTYsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTAxLAorICAgIDEyMCwxMDUsMTE1LDExNiwzMiw5NywxMTUsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsCisgICAgMTAxLDExNSwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDEsMTAwLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTYsOTYsMTAyLDExNCwxMTEsMTA5LAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDYwLAorICAgIDEwMiwxMTQsMTExLDEwOSwxMDgsMTA1LDExNSwxMTYsNjIsOTYsOTYsNDEsNDYsMzIsMzIsODQsCisgICAgMTA0LDEwMSwzMiwzOSwxMDgsMTAxLDExOCwxMDEsMTA4LDM5LDEwLDMyLDMyLDMyLDMyLDk3LAorICAgIDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLAorICAgIDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDEwOCwKKyAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEwNSwxMTAsMzIsOTcsMzIsMTE0LDEwMSwxMDgsOTcsCisgICAgMTE2LDEwNSwxMTgsMTAxLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLAorICAgIDQwLDEwMSw0NiwxMDMsNDYsMzIsOTYsOTYsMTAyLDExNCwxMTEsMTA5LDMyLDQ2LDQ2LDExMiwKKyAgICAxMDcsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOSwxMTEsMTAwLDk2LDk2LDMyLAorICAgIDExOSwxMTEsMTE3LDEwOCwxMDAsMzIsMTA0LDk3LDExOCwxMDEsMzIsOTcsMzIsMzksMTA4LDEwMSwKKyAgICAxMTgsMTAxLDEwOCwzOSwzMiwxMTEsMTAyLDMyLDUwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDExNCwzMywwLDAsMCw3OCwxMTQsMTIxLDAsMCwwLDQxLDgsMTE0LDE4NywKKyAgICAwLDAsMCwxMTQsMjAwLDAsMCwwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsCisgICAgMTA1LDExMSwxMTAsMTE0LDE2OCwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsCisgICAgMCwwLDExNCwxLDAsMCwwLDExNCwxOTUsMCwwLDAsNDEsOSwxMTQsMTUsCisgICAgMCwwLDAsMTE0LDE5OSwwLDAsMCwyMTgsNiwxMDgsMTExLDk5LDk3LDEwOCwxMTUsCisgICAgMTE0LDE5MywwLDAsMCwxMTQsMTcxLDAsMCwwLDExNCw4OSwwLDAsMCw5MCwKKyAgICA4LDEwMywxMDgsMTExLDk4LDk3LDEwOCwxMTUsOTUsMTE0LDE3MCwwLDAsMCw5MCw3LAorICAgIDk5LDExNywxMTYsOTUsMTExLDEwMiwxMDIsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDk1LDk1LDQxLDQsMCwwLDExNSwyNiwwLDAsMCwwLDExLDgsMSwxMCwKKyAgICAyLDE2LDEsOCwxLDEyLDEsNCwzLDgsMSwyMCwxLDQsMSw2LAorICAgIDQsMjYsMywzMiwyLDExNCwyMDMsMCwwLDAsOTksMSwwLDAsMCwwLAorICAgIDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMzgsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTMxLDEsMTI1LDEsMTI0LDEsCisgICAgMTAwLDAsMTA3LDgsMTE0LDMwLDExNiwyLDEwMCwxLDEyNCwwLDIzLDAsMTMxLDEsCisgICAgMTMwLDEsMTE2LDMsMTI0LDEsMTMxLDEsODMsMCw0MSwyLDc4LDEyMiwyNSwxMTAsCiAgICAgMTExLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiw0MSw0LDExNCwxNTAsMCwwLDAsMTE0LAotICAgIDE1NCwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE0OSwwLDAsMCw0MSwyLAorICAgIDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsMzIsNDEsNCwxMTQsMTUxLDAsMCwwLDExNCwKKyAgICAxNTUsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNTAsMCwwLDAsNDEsMiwKICAgICAxMTQsMTUsMCwwLDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCiAgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxOCw5NSw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsNTQsNCwwLAotICAgIDAsMTE1LDgsMCwwLDAsMCwxLDE1LDEsMTIsMSwxNiwxLDExNCwyMDAsCisgICAgMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDc2LDQsMCwKKyAgICAwLDExNSw4LDAsMCwwLDAsMSwxMCwxLDgsMSwxMiwxLDExNCwyMDQsCiAgICAgMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDEyLDAsMCwwLAotICAgIDEyLDAsMCwwLDY3LDAsMCwwLDExNSw3NCwxLDAsMCwxMjQsMSwwLAotICAgIDk3LDAsMCwxMjQsMCwwLDk3LDEsMCwxMTYsMiwwLDExNiwxLDAsMTMxLAotICAgIDEsMCwxMjUsMiwwLDEyMCwxMjMsMCwxMTYsMSwwLDEwNiwzLDAsMTA2LDQsCi0gICAgMCwxMzEsMCwwLDY4LDkzLDEwNiwwLDkyLDIsMCwxMjUsMywwLDEyNSw0LAotICAgIDAsMTE2LDUsMCwxMjQsNCwwLDEyNCwyLDAsMTMxLDIsMCwxMTQsNDAsMCwKLSAgICAxMjQsMywwLDExNiwxLDAsMTA2LDYsMCwxMDcsNiwwLDExNCw5MSwwLDExNiwKLSAgICA3LDAsMTI1LDUsMCwxMTAsMjcsMCwxMTYsMCwwLDEwNiw4LDAsMTI0LDMsCi0gICAgMCwxMzEsMSwwLDExNCw0MCwwLDExNiw5LDAsMTI1LDUsMCwxMTAsMywwLAotICAgIDExMyw0MCwwLDExNiwxMCwwLDEyNCw0LDAsMTI0LDUsMCwxMzEsMiwwLDEyNSwKLSAgICA2LDAsMTE2LDExLDAsMTI0LDYsMCwxMjQsNCwwLDEzMSwyLDAsMSwxMTMsCi0gICAgNDAsMCw4NywxMTYsMSwwLDEwNiwzLDAsMTE2LDEyLDAsMjUsMTI1LDcsMCwKLSAgICAxMjAsNzMsMCwxMDAsNSwwLDY4LDkzLDY1LDAsMTI1LDgsMCwxMjQsOCwwLAotICAgIDExNiwxLDAsMTA2LDMsMCwxMDcsNywwLDExNCwyMDYsMCwxMTYsMTMsMCwxMjQsCi0gICAgOCwwLDEzMSwxLDAsMTI1LDksMCwxMTAsMTMsMCwxMTYsMSwwLDEwNiwzLAotICAgIDAsMTI0LDgsMCwyNSwxMjUsOSwwLDExNiwxNCwwLDEyNCw3LDAsMTI0LDgsCi0gICAgMCwxMjQsOSwwLDEzMSwzLDAsMSwxMTMsMTcwLDAsODcsMTIxLDE2LDAsMTE2LAotICAgIDEzLDAsMTAwLDIsMCwxMzEsMSwwLDEyNSwxMCwwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDE1LDAsMTA3LDEwLDAsMTE0LDI1LDEsMSwxLDEsMTAwLDMsMCwxMjUsCi0gICAgMTAsMCw4OSwxMTAsMSwwLDg4LDExNiwxNCwwLDEyNCw3LDAsMTAwLDIsMCwKLSAgICAxMjQsMTAsMCwxMzEsMywwLDEsMTE2LDEzLDAsMTAwLDQsMCwxMzEsMSwwLAotICAgIDEyNSwxMSwwLDExNiwxNCwwLDEyNCw3LDAsMTAwLDQsMCwxMjQsMTEsMCwxMzEsCi0gICAgMywwLDEsMTAwLDMsMCw4Myw0MSw2LDEyMiwyNTAsODMsMTAxLDExNiwxMTcsMTEyLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTgsMTIxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKLSAgICA5NywxMTAsMTAwLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTA5LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTE1LDMyLDExNSwxMjEsMTE1LDMyLDEwNSwxMTUsCi0gICAgMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTE1LDEyMSwxMTUsNDYsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDk5LDk5LDEwMSwxMTUsMTE1LDMyLDk3LAotICAgIDExMCwxMDAsMzIsOTUsMTA1LDEwOSwxMTIsMzIsMTA1LDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLAotICAgIDEwMCwzMiwxMTYsMTExLDMyLDEwOCwxMTEsOTcsMTAwLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwKLSAgICAxMDUsMTEwLDEwLDMyLDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwKLSAgICAxMTYsMTA0LDExMSwxMTUsMTAxLDMyLDExNiwxMTksMTExLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNSwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDEwMSwxMjAsMTEyLDEwOCwxMDUsOTksCi0gICAgMTA1LDExNiwxMDgsMTIxLDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMzIsMTA1LDExMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiwxMTQsMTQxLDAsMCwwLDExNCwzNCwwLDAsMCw3OCwKLSAgICAxMTQsNjIsMCwwLDAsNDEsMSwxMjIsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLAotICAgIDEwMywxMTUsNDEsMTYsMTE0LDU3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTMsCi0gICAgMCwwLDAsMTE0LDIxLDAsMCwwLDIxOCw1LDEwNSwxMTYsMTAxLDEwOSwxMTUsMTE0LAotICAgIDE3NywwLDAsMCwxMTQsNzYsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsODIsCi0gICAgMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMTMyLDAsMCwwLDExNCwxMzcsMCwKLSAgICAwLDAsMTE0LDEsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsNSwwLDAsCi0gICAgMCwxMTQsNzcsMCwwLDAsNDEsMTIsMjE4LDEwLDExNSwxMjEsMTE1LDk1LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDIxOCwxMSw5NSwxMDUsMTA5LDExMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw5MCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsMTE0LDE1LAotICAgIDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDg4LDAsCi0gICAgMCwwLDkwLDExLDExNSwxMDEsMTA4LDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwKLSAgICAxMiw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMTAsOTcsMTA5LDEwMSw5MCwxNCw5OCwKLSAgICAxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsCi0gICAgMTA0LDExNCwxMDEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsCi0gICAgOTcsMTA3LDExNCwxMDEsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw2LDk1LDExNSwxMDEsCi0gICAgMTE2LDExNywxMTIsNjEsNCwwLDAsMTE1LDUwLDAsMCwwLDAsOSw2LDEsCi0gICAgNiwzLDEyLDEsMjgsMSwxNSwxLDE1LDEsOSwxLDE1LDEsOSwyLAotICAgIDMsMSwxNSwxLDE3LDMsMTMsMSwxMywxLDE1LDEsMTUsMiwxMywxLAotICAgIDIwLDMsMywxLDE2LDEsMTMsMiwxMSwxLDE2LDMsMTIsMSwxMTQsMjA0LAotICAgIDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLAotICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDg3LDAsMCwwLDExNiwwLDAsCi0gICAgMTI0LDAsMCwxMjQsMSwwLDEzMSwyLDAsMSwxMTYsMSwwLDEwNiwyLDAsCi0gICAgMTA2LDMsMCwxMTYsNCwwLDEzMSwxLDAsMSwxMTYsMSwwLDEwNiwyLDAsCi0gICAgMTA2LDMsMCwxMTYsNSwwLDEzMSwxLDAsMSwxMDAsMSwwLDEwMCwyLDAsCi0gICAgMTA4LDYsMCwxMjUsMiwwLDEyNCwyLDAsOTcsNywwLDEyNCwyLDAsMTA2LAotICAgIDgsMCwxMTYsMSwwLDEwNiw5LDAsMTE2LDEwLDAsMjUsMTMxLDEsMCwxLAotICAgIDEwMCwyLDAsODMsNDEsMywxMjIsNTAsNzMsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwzMiwKLSAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsCi0gICAgMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMTQsMzMsMCwwLDAsNzgsCi0gICAgNDEsMTEsMTE0LDIwNCwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDE3NCwwLDAsCi0gICAgMCwxMTQsMTEzLDAsMCwwLDExNCwxNTAsMCwwLDAsMTE0LDE2MCwwLDAsMCwKLSAgICAyMTgsMjYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsCi0gICAgMTA4LDEwNSw5OCw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsMTE0LDExOSwwLDAsCi0gICAgMCwyMTgsOCw5NSwxMDUsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDEsMCwwLDAsNDEsMywxMTQsMjAyLDAsMCwwLDExNCwyMDMsMCwwLAotICAgIDAsMTE0LDIwNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMSwwLDAsMCwxMTQsMjA2LDAsMCwwLDEwOCw0LDAsMCwxMTUsMTIsCi0gICAgMCwwLDAsMCwyLDEzLDIsMTYsMSwxNiwzLDEyLDEsNiwxLDExNCwKLSAgICAyMDYsMCwwLDAsNDEsNTEsMTE0LDMsMCwwLDAsMTE0LDExOSwwLDAsMCwKLSAgICAxMTQsMTIsMCwwLDAsMTE0LDE2LDAsMCwwLDExNCwxNywwLDAsMCwxMTQsCi0gICAgNTksMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0OCwwLDAsMCwxMTQsMzEsCi0gICAgMCwwLDAsMTE0LDMyLDAsMCwwLDExNCw1MywwLDAsMCwxMTQsNTQsMCwKLSAgICAwLDAsMTE0LDU2LDAsMCwwLDExNCw2MywwLDAsMCwxMTQsNjUsMCwwLAotICAgIDAsMTE0LDc1LDAsMCwwLDExNCw4MSwwLDAsMCwxMTQsODQsMCwwLDAsCi0gICAgMTE0LDkwLDAsMCwwLDExNCwxMDEsMCwwLDAsMTE0LDEwMiwwLDAsMCwxMTQsCi0gICAgMTA2LDAsMCwwLDExNCw4NSwwLDAsMCwyMTgsNiwxMTEsOTgsMTA2LDEwMSw5OSwKLSAgICAxMTYsOTAsOSw5NSw4MCw3OSw4MCw4NSw3Niw2NSw4NCw2OSwxMTQsMTMyLDAsMCwKLSAgICAwLDExNCwxMzcsMCwwLDAsMTE0LDE0NCwwLDAsMCwxMTQsOTcsMCwwLDAsCi0gICAgMTE0LDg2LDAsMCwwLDExNCwxNDgsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsCi0gICAgODcsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMTYwLDAsMCwwLDExNCwxNjUsCi0gICAgMCwwLDAsMTE0LDE3MSwwLDAsMCwxMTQsMTczLDAsMCwwLDExNCwxNzYsMCwKLSAgICAwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxODIsMCwwLAotICAgIDAsMTE0LDE4NCwwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxODYsMCwwLDAsCi0gICAgMTE0LDE5NCwwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxOTksMCwwLDAsMTE0LAotICAgIDIwMCwwLDAsMCwxMTQsMjA0LDAsMCwwLDExNCwyMDYsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCi0gICAgMCwwLDIxOCw4LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDYyLDgsMCwwLDAsCi0gICAgMTE1LDk2LDAsMCwwLDYsMTcsNiwyLDEyLDgsMTIsNCwxOSwyMCw2LAotICAgIDIsNiwzLDIyLDQsMTksNjgsMTksMjEsMTksMTksMTIsMTksMTIsMTksMTIsCi0gICAgMTEsMTgsOCwxMiwxMSwxMiwxMiwxMiwxNiwxMiwzNiwxOSwyNywxOSwxMDEsMjQsCi0gICAgMjYsOSwzLDE4LDQ1LDE4LDYwLDEyLDE4LDEyLDE3LDEyLDI1LDEyLDI5LDEyLAotICAgIDIzLDEyLDE2LDE5LDczLDE5LDc3LDE5LDEzLDEyLDksMTIsOSwxNSw0MCwxMiwKLSAgICAxNyw2LDEsMTAsMiwxMiwyNywxMiw2LDE4LDI0LDEyLDMyLDEyLDE1LDI0LAotICAgIDM1LDEyLDcsMTIsNDcsCisgICAgMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDI0NCwwLDAsMCwxMjQsMSw5NywKKyAgICAwLDEyNCwwLDk3LDEsMTE2LDIsMTE2LDEsMTMxLDEsMTI1LDIsMTIwLDg2LDExNiwKKyAgICAxLDEwNiwzLDEwNiw0LDEzMSwwLDY4LDAsOTMsNzIsOTIsMiwxMjUsMywxMjUsCisgICAgNCwxMTYsNSwxMjQsNCwxMjQsMiwxMzEsMiwxMTQsMjgsMTI0LDMsMTE2LDEsMTA2LAorICAgIDYsMTA3LDYsMTE0LDYyLDExNiw3LDEyNSw1LDExMCwxOCwxMTYsMCwxMDYsOCwxMjQsCisgICAgMywxMzEsMSwxMTQsMjgsMTE2LDksMTI1LDUsMTEwLDIsMTEzLDI4LDExNiwxMCwxMjQsCisgICAgNCwxMjQsNSwxMzEsMiwxMjUsNiwxMTYsMTEsMTI0LDYsMTI0LDQsMTMxLDIsMSwKKyAgICAwLDExMywyOCw4NywwLDExNiwxLDEwNiwzLDExNiwxMiwyNSwwLDEyNSw3LDEyMCwKKyAgICA1NCwxMDAsNSw2OCwwLDkzLDQ2LDEyNSw4LDEyNCw4LDExNiwxLDEwNiwzLDEwNywKKyAgICA3LDExNCwxNDQsMTE2LDEzLDEyNCw4LDEzMSwxLDEyNSw5LDExMCwxMCwxMTYsMSwxMDYsCisgICAgMywxMjQsOCwyNSwwLDEyNSw5LDExNiwxNCwxMjQsNywxMjQsOCwxMjQsOSwxMzEsCisgICAgMywxLDAsMTEzLDEyMCw4NywwLDEyMSwxMiwxMTYsMTMsMTAwLDIsMTMxLDEsMTI1LAorICAgIDEwLDg3LDAsMTEwLDI0LDQsMCwxMTYsMTUsMTA3LDEwLDExNCwyMDYsMSwwLDEsCisgICAgMCwxLDAsMTAwLDMsMTI1LDEwLDg5LDAsMTEwLDIsODgsMCwxMTYsMTQsMTI0LAorICAgIDcsMTAwLDIsMTI0LDEwLDEzMSwzLDEsMCwxMTYsMTMsMTAwLDQsMTMxLDEsMTI1LAorICAgIDExLDExNiwxNCwxMjQsNywxMDAsNCwxMjQsMTEsMTMxLDMsMSwwLDEwMCwzLDgzLAorICAgIDAsNDEsNiwxMjIsMjUwLDgzLDEwMSwxMTYsMTE3LDExMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLAorICAgIDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LAorICAgIDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsMTEwLAorICAgIDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDEwOSwxMCwzMiwzMiwzMiwKKyAgICAzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LAorICAgIDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDY1LDExNSwzMiwxMTUsMTIxLDExNSwzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsCisgICAgMTAwLDMyLDEwMiwxMTEsMTE0LDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDExNSwzMiw5Nyw5OSw5OSwxMDEsMTE1LDExNSwzMiw5NywxMTAsMTAwLDMyLDk1LDEwNSwxMDksCisgICAgMTEyLDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDgsCisgICAgMTExLDk3LDEwMCwzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwxMCwzMiwzMiwzMiwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMTEsMTE1LDEwMSwzMiwKKyAgICAxMTYsMTE5LDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LAorICAgIDMyLDk4LDEwMSwzMiwxMDEsMTIwLDExMiwxMDgsMTA1LDk5LDEwNSwxMTYsMTA4LDEyMSwzMiwxMTIsCisgICAgOTcsMTE1LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LAorICAgIDE0MiwwLDAsMCwxMTQsMzQsMCwwLDAsNzgsMTE0LDYyLDAsMCwwLDQxLAorICAgIDEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDQxLDE2LDExNCw1NywKKyAgICAwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDEzLDAsMCwwLDExNCwyMSwwLAorICAgIDAsMCwyMTgsNSwxMDUsMTE2LDEwMSwxMDksMTE1LDExNCwxNzgsMCwwLDAsMTE0LDc2LAorICAgIDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDgyLDAsMCwwLDExNCwxNjEsMCwKKyAgICAwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsMCwwLDExNCwxLDAsMCwKKyAgICAwLDExNCwyMDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDc3LDAsMCwwLAorICAgIDQxLDEyLDIxOCwxMCwxMTUsMTIxLDExNSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTgsMTEsCisgICAgOTUsMTA1LDEwOSwxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTEsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDExNCwxNSwwLDAsMCwxMTQsODksMCwKKyAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCw4OCwwLDAsMCw5MCwxMSwxMTUsMTAxLAorICAgIDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTIsOTgsMTE3LDEwNSwxMDgsMTE2LAorICAgIDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsCisgICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMSwwLDAsMCwyMTgsNiw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDgzLDQsMCwKKyAgICAwLDExNSw1MCwwLDAsMCwwLDksNCwxLDQsMyw4LDEsMjAsMSwKKyAgICAxMCwxLDEwLDEsNiwxLDEwLDEsNiwyLDIsMSwxMCwxLDE0LDMsCisgICAgMTAsMSwxMCwxLDEwLDEsMTAsMiwxMCwxLDE2LDMsMiwxLDEyLDEsCisgICAgMTQsMiwxMCwxLDEyLDMsOCwxLDExNCwyMDgsMCwwLDAsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNjYsMCwwLDAsMTE2LDAsMTI0LDAsMTI0LDEsMTMxLDIsMSwKKyAgICAwLDExNiwxLDEwNiwyLDEwNiwzLDExNiw0LDEzMSwxLDEsMCwxMTYsMSwxMDYsCisgICAgMiwxMDYsMywxMTYsNSwxMzEsMSwxLDAsMTAwLDEsMTAwLDIsMTA4LDYsMTI1LAorICAgIDIsMTI0LDIsOTcsNywxMjQsMiwxMDYsOCwxMTYsMSwxMDYsOSwxMTYsMTAsMjUsCisgICAgMCwxMzEsMSwxLDAsMTAwLDIsODMsMCw0MSwzLDEyMiw1MCw3MywxMTAsMTE1LAorICAgIDExNiw5NywxMDgsMTA4LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsCisgICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDExNCwKKyAgICAzMywwLDAsMCw3OCw0MSwxMSwxMTQsMjA4LDAsMCwwLDExNCwxNCwwLDAsCisgICAgMCwxMTQsMTc1LDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDE1MSwwLDAsMCwKKyAgICAxMTQsMTYxLDAsMCwwLDIxOCwyNiw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LAorICAgIDEwOCwxMTQsMTE5LDAsMCwwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LAorICAgIDExNCwyMSwwLDAsMCwxMTQsMSwwLDAsMCw0MSwzLDExNCwyMDYsMCwwLAorICAgIDAsMTE0LDIwNywwLDAsMCwxMTQsMjA5LDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMTAsMCwwLDAsMTMwLAorICAgIDQsMCwwLDExNSwxMiwwLDAsMCwwLDIsMTAsMiwxMiwxLDEyLDMsCisgICAgOCwxLDQsMSwxMTQsMjEwLDAsMCwwLDQxLDIsNzgsNzgsNDEsMSw3OCwKKyAgICA0MSwyLDc4LDExNCwzMywwLDAsMCw0MSw1MSwxMTQsMywwLDAsMCwxMTQsCisgICAgMTE5LDAsMCwwLDExNCwxMiwwLDAsMCwxMTQsMTYsMCwwLDAsMTE0LDE3LAorICAgIDAsMCwwLDExNCw1OSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQ4LDAsCisgICAgMCwwLDExNCwzMSwwLDAsMCwxMTQsMzIsMCwwLDAsMTE0LDUzLDAsMCwKKyAgICAwLDExNCw1NCwwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDYzLDAsMCwwLAorICAgIDExNCw2NSwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCwKKyAgICA4NCwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDEwMSwwLDAsMCwxMTQsMTAyLAorICAgIDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDg1LDAsMCwwLDIxOCw2LDExMSwKKyAgICA5OCwxMDYsMTAxLDk5LDExNiw5MCw5LDk1LDgwLDc5LDgwLDg1LDc2LDY1LDg0LDY5LAorICAgIDExNCwxMzIsMCwwLDAsMTE0LDEzNywwLDAsMCwxMTQsMTQ1LDAsMCwwLDExNCwKKyAgICA5NywwLDAsMCwxMTQsODYsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsMTUwLAorICAgIDAsMCwwLDExNCw4NywwLDAsMCwxMTQsMTUxLDAsMCwwLDExNCwxNjEsMCwKKyAgICAwLDAsMTE0LDE2NiwwLDAsMCwxMTQsMTcyLDAsMCwwLDExNCwxNzQsMCwwLAorICAgIDAsMTE0LDE3NywwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxOTIsMCwwLDAsCisgICAgMTE0LDE4MywwLDAsMCwxMTQsMTg1LDAsMCwwLDExNCwxODYsMCwwLDAsMTE0LAorICAgIDE4NywwLDAsMCwxMTQsMTk1LDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LDIwMywKKyAgICAwLDAsMCwxMTQsMjA0LDAsMCwwLDExNCwyMDgsMCwwLDAsMTE0LDIxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsCisgICAgOCwwLDAsMCwxMTUsOTYsMCwwLDAsNCwxNyw0LDIsOCw4LDgsCisgICAgNCwxNCwyMCw0LDIsNCwzLDE2LDQsMTQsNjgsMTQsMjEsMTQsMTksOCwKKyAgICAxOSw4LDE5LDgsMTEsMTQsOCw4LDExLDgsMTIsOCwxNiw4LDM2LDE0LAorICAgIDI3LDE0LDEwMSwxNiwyNiw2LDMsMTAsNDUsMTQsNjAsOCwxOCw4LDE3LDgsCisgICAgMjUsOCwyOSw4LDIzLDgsMTYsMTQsNzMsMTQsNzcsMTQsMTMsOCw5LDgsCisgICAgOSwxMCw0Nyw4LDIwLDQsMSw4LDIsOCwyNyw4LDYsMTAsMjQsOCwKKyAgICAzMiw4LDI3LDE4LDM1LDgsNyw4LDQ3LAogfTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaCBiL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAppbmRleCBhODcxZjU0Li5iYTJmNmJiIDEwMDY0NAotLS0gYS9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKKysrIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCkBAIC0xLDExNiArMSw5OSBAQAogLyogQXV0by1nZW5lcmF0ZWQgYnkgUHJvZ3JhbXMvX2ZyZWV6ZV9pbXBvcnRsaWIuYyAqLwogY29uc3QgdW5zaWduZWQgY2hhciBfUHlfTV9faW1wb3J0bGliX2V4dGVybmFsW10gPSB7Ci0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNywwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMjI4LDIsMCwwLDEwMCwwLDAsOTAsMCwwLAotICAgIDEwMCw5NiwwLDkwLDEsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwKLSAgICAyLDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsMywwLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDkwLDQsMCwxMDAsMTAsMCwxMDAsMTEsMCwKLSAgICAxMzIsMCwwLDkwLDUsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLAotICAgIDYsMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTYsCi0gICAgMCwxMDAsMTcsMCwxMzIsMCwwLDkwLDgsMCwxMDAsMTgsMCwxMDAsMTksMCwKLSAgICAxMzIsMCwwLDkwLDksMCwxMDAsMjAsMCwxMDAsMjEsMCwxMzIsMCwwLDkwLAotICAgIDEwLDAsMTAwLDIyLDAsMTAwLDIzLDAsMTAwLDI0LDAsMTMyLDEsMCw5MCwxMSwKLSAgICAwLDEwMSwxMiwwLDEwMSwxMSwwLDEwNiwxMywwLDEzMSwxLDAsOTAsMTQsMCwKLSAgICAxMDAsMjUsMCwxMDYsMTUsMCwxMDAsMjYsMCwxMDAsMjcsMCwxMzEsMiwwLDEwMCwKLSAgICAyOCwwLDIzLDkwLDE2LDAsMTAxLDE3LDAsMTA2LDE4LDAsMTAxLDE2LDAsMTAwLAotICAgIDI3LDAsMTMxLDIsMCw5MCwxOSwwLDEwMCwyOSwwLDkwLDIwLDAsMTAwLDMwLAotICAgIDAsOTAsMjEsMCwxMDAsMzEsMCwxMDMsMSwwLDkwLDIyLDAsMTAwLDMyLDAsCi0gICAgMTAzLDEsMCw5MCwyMywwLDEwMSwyMywwLDQsOTAsMjQsMCw5MCwyNSwwLAotICAgIDEwMCwzMywwLDEwMCwzNCwwLDEwMCwzMywwLDEwMCwzNSwwLDEwMCwzNiwwLDEzMiwKLSAgICAxLDEsOTAsMjYsMCwxMDAsMzcsMCwxMDAsMzgsMCwxMzIsMCwwLDkwLDI3LAotICAgIDAsMTAwLDM5LDAsMTAwLDQwLDAsMTMyLDAsMCw5MCwyOCwwLDEwMCw0MSwwLAotICAgIDEwMCw0MiwwLDEzMiwwLDAsOTAsMjksMCwxMDAsNDMsMCwxMDAsNDQsMCwxMzIsCi0gICAgMCwwLDkwLDMwLDAsMTAwLDQ1LDAsMTAwLDQ2LDAsMTAwLDQ3LDAsMTAwLDQ4LAotICAgIDAsMTMyLDAsMSw5MCwzMSwwLDEwMCw0OSwwLDEwMCw1MCwwLDEzMiwwLDAsCi0gICAgOTAsMzIsMCwxMDAsNTEsMCwxMDAsNTIsMCwxMzIsMCwwLDkwLDMzLDAsMTAwLAotICAgIDMzLDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDUzLDAsMTAwLDU0LDAsMTMyLDMsCi0gICAgMCw5MCwzNCwwLDEwMCwzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCw1NSwwLAotICAgIDEwMCw1NiwwLDEzMiwzLDAsOTAsMzUsMCwxMDAsNTcsMCwxMDAsNTcsMCwxMDAsCi0gICAgNTgsMCwxMDAsNTksMCwxMzIsMiwwLDkwLDM2LDAsMTAwLDYwLDAsMTAwLDYxLAotICAgIDAsMTMyLDAsMCw5MCwzNywwLDEwMSwzOCwwLDEzMSwwLDAsOTAsMzksMCwKLSAgICAxMDAsMzMsMCwxMDAsNjIsMCwxMDAsMzMsMCwxMDAsNjMsMCwxMDEsMzksMCwxMDAsCi0gICAgNjQsMCwxMDAsNjUsMCwxMzIsMSwyLDkwLDQwLDAsNzEsMTAwLDY2LDAsMTAwLAotICAgIDY3LDAsMTMyLDAsMCwxMDAsNjcsMCwxMzEsMiwwLDkwLDQxLDAsNzEsMTAwLAotICAgIDY4LDAsMTAwLDY5LDAsMTMyLDAsMCwxMDAsNjksMCwxMzEsMiwwLDkwLDQyLAotICAgIDAsNzEsMTAwLDcwLDAsMTAwLDcxLDAsMTMyLDAsMCwxMDAsNzEsMCwxMDEsNDIsCi0gICAgMCwxMzEsMywwLDkwLDQzLDAsNzEsMTAwLDcyLDAsMTAwLDczLDAsMTMyLDAsCi0gICAgMCwxMDAsNzMsMCwxMzEsMiwwLDkwLDQ0LDAsNzEsMTAwLDc0LDAsMTAwLDc1LAotICAgIDAsMTMyLDAsMCwxMDAsNzUsMCwxMDEsNDQsMCwxMDEsNDMsMCwxMzEsNCwwLAotICAgIDkwLDQ1LDAsNzEsMTAwLDc2LDAsMTAwLDc3LDAsMTMyLDAsMCwxMDAsNzcsMCwKLSAgICAxMDEsNDQsMCwxMDEsNDIsMCwxMzEsNCwwLDkwLDQ2LDAsMTAzLDAsMCw5MCwKLSAgICA0NywwLDcxLDEwMCw3OCwwLDEwMCw3OSwwLDEzMiwwLDAsMTAwLDc5LDAsMTAxLAotICAgIDQ0LDAsMTAxLDQyLDAsMTMxLDQsMCw5MCw0OCwwLDcxLDEwMCw4MCwwLDEwMCwKLSAgICA4MSwwLDEzMiwwLDAsMTAwLDgxLDAsMTMxLDIsMCw5MCw0OSwwLDcxLDEwMCwKLSAgICA4MiwwLDEwMCw4MywwLDEzMiwwLDAsMTAwLDgzLDAsMTMxLDIsMCw5MCw1MCwKLSAgICAwLDcxLDEwMCw4NCwwLDEwMCw4NSwwLDEzMiwwLDAsMTAwLDg1LDAsMTMxLDIsCi0gICAgMCw5MCw1MSwwLDcxLDEwMCw4NiwwLDEwMCw4NywwLDEzMiwwLDAsMTAwLDg3LAotICAgIDAsMTMxLDIsMCw5MCw1MiwwLDEwMCwzMywwLDEwMCw4OCwwLDEwMCw4OSwwLAotICAgIDEzMiwxLDAsOTAsNTMsMCwxMDAsOTAsMCwxMDAsOTEsMCwxMzIsMCwwLDkwLAotICAgIDU0LDAsMTAwLDkyLDAsMTAwLDkzLDAsMTMyLDAsMCw5MCw1NSwwLDEwMCw5NCwKLSAgICAwLDEwMCw5NSwwLDEzMiwwLDAsOTAsNTYsMCwxMDAsMzMsMCw4Myw0MSw5NywKLSAgICA5Nyw5NCwxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwKLSAgICAxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCwKLSAgICA0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCwKLSAgICA4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LAotICAgIDc5LDg0LDMyLDEwOSwxMDEsOTcsMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsCi0gICAgMTA1LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwKLSAgICAzMywzMiw3MywxMTYsMzIsMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLAotICAgIDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LAotICAgIDMyLDEwNSwxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsCi0gICAgMTE2LDExNCw5NywxMTIsMTEyLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsCi0gICAgMTA0LDExMSwxMTAsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsCi0gICAgMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDQ2LDMyLDY1LDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLAotICAgIDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsCi0gICAgMTAxLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCi0gICAgMTA1LDk5LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LAotICAgIDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwKLSAgICAxMDEsMTE0LDMyLDExNiwxMTEsMTAsMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsCi0gICAgMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKLSAgICAxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsCi0gICAgMTA1LDk5LDQ1LDEwMiw5Nyw5OSwxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwKLSAgICAxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNDYsMTAsMTAsMjE4LDMsMTE5LDEwNSwxMTAsMjE4LDYsOTksMTIxLDEwMywxMTksMTA1LDExMCwKLSAgICAyMTgsNiwxMDAsOTcsMTE0LDExOSwxMDUsMTEwLDk5LDAsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDQ5LDAsCi0gICAgMCwwLDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDExNiwzLDAsMTMxLDEsCi0gICAgMCwxMTQsMzMsMCwxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCwxMjUsMCwwLAotICAgIDExMCwxMiwwLDEwMCwzLDAsMTAwLDIsMCwxMzIsMCwwLDEyNSwwLDAsMTI0LAotICAgIDAsMCw4Myw0MSw0LDc4LDk5LDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDIsMCwwLDAsODMsMCwwLDAsMTE1LDEzLDAsMCwwLAotICAgIDEwMCwxLDAsMTE2LDAsMCwxMDYsMSwwLDEwNyw2LDAsODMsNDEsMiwxMjIsCi0gICAgNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwKLSAgICAxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSw5OSwxMDcsCi0gICAgMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsCi0gICAgMTA1LDExOCwxMDEsMTA4LDEyMSw0NiwxMTUsMTIsMCwwLDAsODAsODksODQsNzIsNzksCi0gICAgNzgsNjcsNjUsODMsNjksNzksNzUsNDEsMiwyMTgsMyw5NSwxMTEsMTE1LDkwLDcsCi0gICAgMTAxLDExMCwxMTgsMTA1LDExNCwxMTEsMTEwLDE2OSwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDI1MCwzOCw2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LAotICAgIDExMiw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsNjIsMjE4LDExLDk1LDExNCwxMDEsCi0gICAgMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDMwLDAsMCwwLDExNSwyLDAsMCwKLSAgICAwLDAsMiwxMjIsMzcsOTUsMTA5LDk3LDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLAotICAgIDk1LDk5LDk3LDExNSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LAotICAgIDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDk5LDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsODMsMCwwLDAsMTE1LAotICAgIDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwKLSAgICAzMiwxMDUsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywKLSAgICAxMTUsMTE2LDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LAotICAgIDExNSwxMDEsNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLAotICAgIDQ2LDcwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDM0LDAsMCwwLDExNSwyLDAsMCwwLDAsMiw0MSw0LDIxOCwzLDExNSwKLSAgICAxMjEsMTE1LDIxOCw4LDExMiwxMDgsOTcsMTE2LDEwMiwxMTEsMTE0LDEwOSwyMTgsMTAsMTE1LDExNiwKLSAgICA5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDI3LDk1LDY3LDY1LDgzLDY5LDk1LAotICAgIDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LAotICAgIDcwLDc5LDgyLDc3LDgzLDQxLDEsMTE0LDYsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDEwOSw5NywKLSAgICAxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDI4LDAsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMSwxOCwxLDE1LDQsMTIsMywxMTQsMTEsCi0gICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTAwLDEsMCw2NCwxMDYsMSwwLDEwMCwyLDAsCi0gICAgMTAwLDMsMCwxMzEsMiwwLDgzLDQxLDQsMTIyLDQyLDY3LDExMSwxMTAsMTE4LDEwMSwKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwyMzYsMSwwLDAsMTAwLDAsOTAsMCwxMDAsOTEsCisgICAgOTAsMSwxMDAsNCwxMDAsNSwxMzIsMCw5MCwyLDEwMCw2LDEwMCw3LDEzMiwwLAorICAgIDkwLDMsMTAwLDgsMTAwLDksMTMyLDAsOTAsNCwxMDAsMTAsMTAwLDExLDEzMiwwLAorICAgIDkwLDUsMTAwLDEyLDEwMCwxMywxMzIsMCw5MCw2LDEwMCwxNCwxMDAsMTUsMTMyLDAsCisgICAgOTAsNywxMDAsMTYsMTAwLDE3LDEzMiwwLDkwLDgsMTAwLDE4LDEwMCwxOSwxMzIsMCwKKyAgICA5MCw5LDEwMCwyMCwxMDAsMjEsMTMyLDAsOTAsMTAsMTAwLDkyLDEwMCwyMywxMDAsMjQsCisgICAgMTMyLDEsOTAsMTEsMTAxLDEyLDEwMSwxMSwxMDYsMTMsMTMxLDEsOTAsMTQsMTAwLDI1LAorICAgIDEwNiwxNSwxMDAsMjYsMTAwLDI3LDEzMSwyLDEwMCwyOCwyMywwLDkwLDE2LDEwMSwxNywKKyAgICAxMDYsMTgsMTAxLDE2LDEwMCwyNywxMzEsMiw5MCwxOSwxMDAsMjksOTAsMjAsMTAwLDMwLAorICAgIDkwLDIxLDEwMCwzMSwxMDMsMSw5MCwyMiwxMDAsMzIsMTAzLDEsOTAsMjMsMTAxLDIzLAorICAgIDQsMCw5MCwyNCw5MCwyNSwxMDAsOTMsMTAwLDMzLDEwMCwzNCwxNTYsMSwxMDAsMzUsCisgICAgMTAwLDM2LDEzMiwzLDkwLDI2LDEwMCwzNywxMDAsMzgsMTMyLDAsOTAsMjcsMTAwLDM5LAorICAgIDEwMCw0MCwxMzIsMCw5MCwyOCwxMDAsNDEsMTAwLDQyLDEzMiwwLDkwLDI5LDEwMCw0MywKKyAgICAxMDAsNDQsMTMyLDAsOTAsMzAsMTAwLDQ1LDEwMCw0NiwxMzIsMCw5MCwzMSwxMDAsNDcsCisgICAgMTAwLDQ4LDEzMiwwLDkwLDMyLDEwMCw5NCwxMDAsNDksMTAwLDUwLDEzMiwxLDkwLDMzLAorICAgIDEwMCw5NSwxMDAsNTEsMTAwLDUyLDEzMiwxLDkwLDM0LDEwMCw5NiwxMDAsNTQsMTAwLDU1LAorICAgIDEzMiwxLDkwLDM1LDEwMCw1NiwxMDAsNTcsMTMyLDAsOTAsMzYsMTAxLDM3LDEzMSwwLAorICAgIDkwLDM4LDEwMCw5NywxMDAsMzMsMTAxLDM4LDEwMCw1OCwxNTYsMiwxMDAsNTksMTAwLDYwLAorICAgIDEzMiwzLDkwLDM5LDcxLDAsMTAwLDYxLDEwMCw2MiwxMzIsMCwxMDAsNjIsMTMxLDIsCisgICAgOTAsNDAsNzEsMCwxMDAsNjMsMTAwLDY0LDEzMiwwLDEwMCw2NCwxMzEsMiw5MCw0MSwKKyAgICA3MSwwLDEwMCw2NSwxMDAsNjYsMTMyLDAsMTAwLDY2LDEwMSw0MSwxMzEsMyw5MCw0MiwKKyAgICA3MSwwLDEwMCw2NywxMDAsNjgsMTMyLDAsMTAwLDY4LDEzMSwyLDkwLDQzLDcxLDAsCisgICAgMTAwLDY5LDEwMCw3MCwxMzIsMCwxMDAsNzAsMTAxLDQzLDEwMSw0MiwxMzEsNCw5MCw0NCwKKyAgICA3MSwwLDEwMCw3MSwxMDAsNzIsMTMyLDAsMTAwLDcyLDEwMSw0MywxMDEsNDEsMTMxLDQsCisgICAgOTAsNDUsMTAzLDAsOTAsNDYsNzEsMCwxMDAsNzMsMTAwLDc0LDEzMiwwLDEwMCw3NCwKKyAgICAxMDEsNDMsMTAxLDQxLDEzMSw0LDkwLDQ3LDcxLDAsMTAwLDc1LDEwMCw3NiwxMzIsMCwKKyAgICAxMDAsNzYsMTMxLDIsOTAsNDgsNzEsMCwxMDAsNzcsMTAwLDc4LDEzMiwwLDEwMCw3OCwKKyAgICAxMzEsMiw5MCw0OSw3MSwwLDEwMCw3OSwxMDAsODAsMTMyLDAsMTAwLDgwLDEzMSwyLAorICAgIDkwLDUwLDcxLDAsMTAwLDgxLDEwMCw4MiwxMzIsMCwxMDAsODIsMTMxLDIsOTAsNTEsCisgICAgMTAwLDk4LDEwMCw4MywxMDAsODQsMTMyLDEsOTAsNTIsMTAwLDg1LDEwMCw4NiwxMzIsMCwKKyAgICA5MCw1MywxMDAsODcsMTAwLDg4LDEzMiwwLDkwLDU0LDEwMCw4OSwxMDAsOTAsMTMyLDAsCisgICAgOTAsNTUsMTAwLDMzLDgzLDAsNDEsOTksOTcsOTQsMSwwLDAsNjcsMTExLDExNCwKKyAgICAxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLAorICAgIDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMTAsMTAsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw3OCw3OSw4NCwzMiwxMDksMTAxLDk3LDExMCwxMTYsCisgICAgMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsMzMsMzIsNzMsMTE2LDMyLDEwNCw5NywxMTUsCisgICAgMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTAwLDEwMSwxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTUsCisgICAgMTE3LDk5LDEwNCwxMCwxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTE2LDMyLDk5LDk3LDExMCwzMiwKKyAgICA5OCwxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDExMiwxMDEsMTAwLDMyLAorICAgIDEwNSwxMTAsMTE2LDExMSwzMiw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDMyLDk3LDExNSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwKKyAgICAxMTAsMzIsMTExLDEwMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwzMiw2NSwxMTUsMTAsCisgICAgMTE1LDExNyw5OSwxMDQsMzIsMTA1LDExNiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMSwxMTAsMzIsMTExLAorICAgIDEwMiwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSw5OSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsCisgICAgMTE1LDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLDExNCwzMiwxMTYsMTExLDEwLDExOSwxMTEsCisgICAgMTE0LDEwNyw0NiwzMiw3OSwxMTAsMTAxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDExNywKKyAgICAxMTUsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExMiwxMTcsOTgsMTA4LDEwNSw5OSw0NSwxMDIsOTcsOTksMTA1LDExMCwKKyAgICAxMDMsMzIsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDUsCisgICAgMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDIxOCwzLDExOSwxMDUsMTEwLAorICAgIDIxOCw2LDk5LDEyMSwxMDMsMTE5LDEwNSwxMTAsMjE4LDYsMTAwLDk3LDExNCwxMTksMTA1LDExMCwKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMTYsMCwxMDYsMSwxMDYsMiwKKyAgICAxMTYsMywxMzEsMSwxMTQsMjIsMTAwLDEsMTAwLDIsMTMyLDAsMTI1LDAsMTEwLDgsCisgICAgMTAwLDMsMTAwLDIsMTMyLDAsMTI1LDAsMTI0LDAsODMsMCw0MSw0LDc4LDk5LAorICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgODMsMCwwLDAsMTE1LDEwLDAsMCwwLDEwMCwxLDExNiwwLDEwNiwxLDEwNywKKyAgICA2LDgzLDAsNDEsMiwxMjIsNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsCisgICAgMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwxMTAsCisgICAgMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSw0NiwxMTUsMTIsMCwwLAorICAgIDAsODAsODksODQsNzIsNzksNzgsNjcsNjUsODMsNjksNzksNzUsNDEsMiwyMTgsCisgICAgMyw5NSwxMTEsMTE1LDkwLDcsMTAxLDExMCwxMTgsMTA1LDExNCwxMTEsMTEwLDE2OSwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDI1MCwzOCw2MCwxMDIsMTE0LDExMSwxMjIsCisgICAgMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk1LDk4LDExMSwKKyAgICAxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDEsMTIwLDExNiwxMDEsMTE0LDExMCw5NywxMDgsCisgICAgNjIsMjE4LDExLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDMwLDAsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMzcsOTUsMTA5LDk3LDEwNywxMDEsCisgICAgOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsNDYsNjAsMTA4LDExMSw5OSwKKyAgICA5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAorICAgIDAsODMsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLAorICAgIDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCisgICAgMTA5LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLDk5LAorICAgIDEwNywxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LAorICAgIDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDcwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDM0LDAsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMiw0MSw0LDIxOCwzLDExNSwxMjEsMTE1LDIxOCw4LDExMiwxMDgsOTcsMTE2LDEwMiwxMTEsCisgICAgMTE0LDEwOSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDI3LAorICAgIDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLDg0LDczLDg2LAorICAgIDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDQxLDEsMTE0LDYsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAorICAgIDAsMjE4LDE2LDk1LDEwOSw5NywxMDcsMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSwKKyAgICA5NywxMTUsMTAxLDI4LDAsMCwwLDExNSw4LDAsMCwwLDAsMSwxMiwxLAorICAgIDEwLDQsOCwzLDExNCwxMSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwKKyAgICAwLDAsMCwxMTYsMCwxMjQsMCwxMzEsMSwxMDAsMSw2NCwwLDEwNiwxLDEwMCwKKyAgICAyLDEwMCwzLDEzMSwyLDgzLDAsNDEsNCwxMjIsNDIsNjcsMTExLDExMCwxMTgsMTAxLAogICAgIDExNCwxMTYsMzIsOTcsMzIsNTEsNTAsNDUsOTgsMTA1LDExNiwzMiwxMDUsMTEwLDExNiwxMDEsCiAgICAgMTAzLDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSw0NSwxMDEsMTEwLAogICAgIDEwMCwxMDUsOTcsMTEwLDQ2LDEwOCwzLDAsMCwwLDI1NSwxMjcsMjU1LDEyNywzLDAsCkBAIC0xMjAsMjQ3NyArMTAzLDIzMjQgQEAKICAgICAwLDAsMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0MCwwLDAsMCwxMTUsCiAgICAgMiwwLDAsMCwwLDIsMTE0LDE3LDAsMCwwLDk5LDEsMCwwLDAsCiAgICAgMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEwMCwxLAotICAgIDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw0Nyw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwKLSAgICAzMiw1MiwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMDgsMTA1LDExNiwxMTYsCi0gICAgMTA4LDEwMSw0NSwxMDEsMTEwLDEwMCwxMDUsOTcsMTEwLDMyLDExNiwxMTEsMzIsOTcsMTEwLDMyLAotICAgIDEwNSwxMTAsMTE2LDEwMSwxMDMsMTAxLDExNCw0NiwxMTQsMTMsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTQsMCwwLDAsMjE4LDEwLDEwMiwxMTQsMTExLDEwOSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsCi0gICAgNDEsMSw5MCw5LDEwNSwxMTAsMTE2LDk1LDk4LDEyMSwxMTYsMTAxLDExNSwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNyw5NSwxMTQsCi0gICAgOTUsMTA4LDExMSwxMTAsMTAzLDQ1LDAsMCwwLDExNSwyLDAsMCwwLDAsMiwKLSAgICAxMTQsMTksMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMywwLDAsMCw3MSwwLDAsMCwxMTUsMjYsMCwwLDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwwLAotICAgIDAsNjgsMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDMsMTIyLDMxLDgyLDEwMSwxMTIsCi0gICAgMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMDYsMTExLDEwNSwxMTAsNDAsNDEsNDYsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw4MywwLDAsCi0gICAgMCwxMTUsMzcsMCwwLDAsMTAzLDAsMCwxMjQsMCwwLDkzLDI3LDAsMTI1LAotICAgIDEsMCwxMjQsMSwwLDExNCw2LDAsMTI0LDEsMCwxMDYsMCwwLDExNiwxLAotICAgIDAsMTMxLDEsMCwxNDUsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwwLDAsCi0gICAgNDEsMiwyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsCi0gICAgOTUsMTE1LDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LAotICAgIDQ4LDIxOCw0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwKLSAgICAxMTIsNjIsNTIsMCwwLDAsMTE1LDIsMCwwLDAsOSwxLDEyMiwzMCw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsCi0gICAgMTE1LDYyLDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCwKLSAgICA4LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwKLSAgICAxLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1MCwwLDAsMCwxMTUsNCwwLDAsCi0gICAgMCwwLDIsMTUsMSwxMTQsMjgsMCwwLDAsOTksMSwwLDAsMCwwLAotICAgIDAsMCwwLDUsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMTM0LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwwLDEwMCwxLDAsCi0gICAgMTA3LDIsMCwxMTQsNTIsMCwxMjQsMCwwLDEwNiwyLDAsMTE2LDMsMCwxMzEsCi0gICAgMSwwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTAyLDIsMCw4MywxMjAsNjksMCwxMTYsNCwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCw2OCw5Myw1NSwwLDEyNSw0LDAsMTI0LDQsMCwxMTYsMSwKLSAgICAwLDEwNyw2LDAsMTE0LDY1LDAsMTI0LDAsMCwxMDYsNSwwLDEyNCw0LDAsCi0gICAgMTAwLDIsMCwxMDAsMSwwLDEzMSwxLDEsOTIsMiwwLDEyNSwxLDAsMTI1LAotICAgIDMsMCwxMjQsMSwwLDEyNCwzLDAsMTAyLDIsMCw4MywxMTMsNjUsMCw4NywKLSAgICAxMDAsMywwLDEyNCwwLDAsMTAyLDIsMCw4Myw0MSw0LDEyMiwzMiw4MiwxMDEsCi0gICAgMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsCi0gICAgNDYsMTEyLDk3LDExNiwxMDQsNDYsMTE1LDExMiwxMDgsMTA1LDExNiw0MCw0MSw0NiwyMzMsMSwKLSAgICAwLDAsMCw5MCw4LDEwOSw5NywxMjAsMTE1LDExMiwxMDgsMTA1LDExNiwyMTgsMCw0MSwKLSAgICA2LDIxOCwzLDEwOCwxMDEsMTEwLDExNCwyMSwwLDAsMCwyMTgsMTAsMTE0LDExMiw5NywKLSAgICAxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI1LDAsMCwwLDIxOCw4LDExNCwxMDEsCi0gICAgMTE4LDEwMSwxMTQsMTE1LDEwMSwxMDAsMjE4LDYsMTE0LDExNSwxMTIsMTA4LDEwNSwxMTYsNDEsNSwKLSAgICAyMTgsNCwxMTIsOTcsMTE2LDEwNCw5MCw1LDEwMiwxMTQsMTExLDExMCwxMTYsMjE4LDEsOTUsCi0gICAgMjE4LDQsMTE2LDk3LDEwNSwxMDgsMTE0LDE2LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LAotICAgIDEwNCw5NSwxMTUsMTEyLDEwOCwxMDUsMTE2LDU2LDAsMCwwLDExNSwxNiwwLDAsMCwKLSAgICAwLDIsMTgsMSwyNCwxLDEwLDEsMTksMSwxMiwxLDI3LDEsMTQsMSwKLSAgICAxMTQsMzgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwwLDAsMTE2LAotICAgIDAsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCw4Myw0MSwxLDEyMiwxMjYsCi0gICAgODMsMTE2LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLDk3LDMyLDExNSwxMDEsMTEyLDk3LDExNCwKLSAgICA5NywxMTYsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLAotICAgIDEwOSw5NywxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLDk3LDExNSwxMDUsMTAxLDExNCwzMiwxMTYsCi0gICAgMTExLDMyLDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LDExMCwzMiwxMDEsMTIwLAotICAgIDExMiwxMDEsMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LDEwLDMyLDMyLDMyLDMyLDQwLDEwMSwKLSAgICA0NiwxMDMsNDYsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMTUsMTE2LDk3LDExNiwzMiwxMTQsCi0gICAgMTAxLDExNSwxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNDEsMiwKLSAgICAxMTQsMywwLDAsMCw5MCw0LDExNSwxMTYsOTcsMTE2LDQxLDEsMTE0LDM1LDAsCisgICAgMTE1LDEyLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEwMCwxLDEzMSwyLDgzLAorICAgIDAsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsNTIsMzIsOTgsCisgICAgMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsNDUsMTAxLAorICAgIDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNiwxMDEsCisgICAgMTAzLDEwMSwxMTQsNDYsMTE0LDEzLDAsMCwwLDQxLDIsMTE0LDE0LDAsMCwwLAorICAgIDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDEsOTAsOSwKKyAgICAxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDcsOTUsMTE0LDk1LDEwOCwxMTEsMTEwLAorICAgIDEwMyw0NSwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDE5LDAsMCwKKyAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwKKyAgICAwLDAsNzEsMCwwLDAsMTE1LDIwLDAsMCwwLDExNiwwLDEwNiwxLDEwMCwKKyAgICAxLDEwMCwyLDEzMiwwLDEyNCwwLDY4LDAsMTMxLDEsMTMxLDEsODMsMCw0MSwKKyAgICAzLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA2LDExMSwxMDUsMTEwLDQwLAorICAgIDQxLDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsCisgICAgMCwwLDAsODMsMCwwLDAsMTE1LDI2LDAsMCwwLDEwMywwLDEyNCwwLAorICAgIDkzLDE4LDEyNSwxLDEyNCwxLDExNCw0LDEyNCwxLDEwNiwwLDExNiwxLDEzMSwxLAorICAgIDE0NSwyLDExMyw0LDgzLDAsMTE0LDQsMCwwLDAsNDEsMiwyMTgsNiwxMTQsCisgICAgMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDEwMSwxMTIsOTcsCisgICAgMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LDQ4LDIxOCw0LDExMiw5NywKKyAgICAxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNTIsMCwwLAorICAgIDAsMTE1LDIsMCwwLDAsNiwxLDEyMiwzMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwOCwKKyAgICAxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCw4LDExMiw5NywxMTYsMTA0LAorICAgIDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwxLDIxOCwxMCwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNiwKKyAgICAxMTEsMTA1LDExMCw1MCwwLDAsMCwxMTUsNCwwLDAsMCwwLDIsMTAsMSwKKyAgICAxMTQsMjgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwKKyAgICAwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsOTgsMCwwLDAsMTE2LAorICAgIDAsMTE2LDEsMTMxLDEsMTAwLDEsMTA3LDIsMTE0LDM2LDEyNCwwLDEwNiwyLDExNiwKKyAgICAzLDEzMSwxLDkyLDMsMTI1LDEsMTI1LDIsMTI1LDMsMTI0LDEsMTI0LDMsMTAyLAorICAgIDIsODMsMCwxMjAsNTIsMTE2LDQsMTI0LDAsMTMxLDEsNjgsMCw5Myw0MCwxMjUsCisgICAgNCwxMjQsNCwxMTYsMSwxMDcsNiwxMTQsNDYsMTI0LDAsMTA2LDUsMTI0LDQsMTAwLAorICAgIDIsMTAwLDEsMTQ0LDEsMTMxLDEsOTIsMiwxMjUsMSwxMjUsMywxMjQsMSwxMjQsCisgICAgMywxMDIsMiw4MywwLDExMyw0Niw4NywwLDEwMCwzLDEyNCwwLDEwMiwyLDgzLAorICAgIDAsNDEsNCwxMjIsMzIsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDExNSwxMTIsMTA4LAorICAgIDEwNSwxMTYsNDAsNDEsNDYsMjMzLDEsMCwwLDAsOTAsOCwxMDksOTcsMTIwLDExNSwKKyAgICAxMTIsMTA4LDEwNSwxMTYsMjE4LDAsNDEsNiwyMTgsMywxMDgsMTAxLDExMCwxMTQsMjEsMCwKKyAgICAwLDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyNSwKKyAgICAwLDAsMCwyMTgsOCwxMTQsMTAxLDExOCwxMDEsMTE0LDExNSwxMDEsMTAwLDIxOCw2LDExNCwKKyAgICAxMTUsMTEyLDEwOCwxMDUsMTE2LDQxLDUsMjE4LDQsMTEyLDk3LDExNiwxMDQsOTAsNSwxMDIsCisgICAgMTE0LDExMSwxMTAsMTE2LDIxOCwxLDk1LDIxOCw0LDExNiw5NywxMDUsMTA4LDExNCwxNiwwLAogICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCi0gICAgMCwyMTgsMTAsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsNjgsMCwwLAotICAgIDAsMTE1LDIsMCwwLDAsMCw3LDExNCwzOSwwLDAsMCw5OSwyLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNTgsMCwwLDAsMTIxLDE2LDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsMTI1LDIsMCw4NywxMTAsMjIsMCw0LDExNiwxLDAsMTA3LDEwLAotICAgIDAsMTE0LDQwLDAsMSwxLDEsMTAwLDEsMCw4Myw4OSwxMTAsMSwwLDg4LAotICAgIDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLDY0LDEyNCwxLDAsMTA3LDIsMCwKLSAgICA4Myw0MSwzLDEyMiw0OSw4NCwxMDEsMTE1LDExNiwzMiwxMTksMTA0LDEwMSwxMTYsMTA0LDEwMSwKLSAgICAxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDEwMSwKLSAgICAzMiwxMTYsMTIxLDExMiwxMDEsNDYsNzAsMTA1LDAsMjQwLDAsMCw0MSwzLDExNCwzOSwKLSAgICAwLDAsMCwyMTgsNyw3OSw4Myw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDcsMTE1LDExNiwKLSAgICA5NSwxMDksMTExLDEwMCwxMDEsNDEsMywxMTQsMzUsMCwwLDAsMjE4LDQsMTA5LDExMSwKLSAgICAxMDAsMTAxLDkwLDksMTE1LDExNiw5NywxMTYsOTUsMTA1LDExMCwxMDIsMTExLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxOCw5NSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsCi0gICAgNzgsMCwwLDAsMTE1LDEwLDAsMCwwLDAsMiwzLDEsMTYsMSwxMywKLSAgICAxLDksMSwxMTQsNDMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTMsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwKLSAgICAyLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDIsMTA1LDEwOCwKLSAgICAxMDEsNDYsMTA1LDAsMTI4LDAsMCw0MSwxLDExNCw0MywwLDAsMCw0MSwxLAotICAgIDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTIsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDExNSwxMDIsMTA1LAotICAgIDEwOCwxMDEsODcsMCwwLDAsMTE1LDIsMCwwLDAsMCwyLDExNCw0NCwwLAorICAgIDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTIsMTA4LDEwNSwxMTYsNTYsMCwKKyAgICAwLDAsMTE1LDE2LDAsMCwwLDAsMiwxMiwxLDE2LDEsOCwxLDE0LAorICAgIDEsOCwxLDIwLDEsMTIsMSwxMTQsMzgsMCwwLDAsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMTAsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTMxLDEsODMsMCwKKyAgICA0MSwxLDEyMiwxMjYsODMsMTE2LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLDk3LDMyLDExNSwKKyAgICAxMDEsMTEyLDk3LDExNCw5NywxMTYsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwKKyAgICAzMiwxMTYsMTExLDMyLDEwOSw5NywxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLDk3LDExNSwxMDUsCisgICAgMTAxLDExNCwzMiwxMTYsMTExLDMyLDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LAorICAgIDExMCwzMiwxMDEsMTIwLDExMiwxMDEsMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LDEwLDMyLDMyLAorICAgIDMyLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMTUsMTE2LAorICAgIDk3LDExNiwzMiwxMTQsMTAxLDExNSwxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsNDEsMiwxMTQsMywwLDAsMCw5MCw0LDExNSwxMTYsOTcsMTE2LDQxLAorICAgIDEsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LAorICAgIDExNiw2OCwwLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTE0LDM5LDAsMCwKKyAgICAwLDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMjEsMTIsMTE2LDAsMTI0LAorICAgIDAsMTMxLDEsMTI1LDIsODcsMCwxMTAsMjAsNCwwLDExNiwxLDEwNywxMCwxMTQsCisgICAgMzIsMSwwLDEsMCwxLDAsMTAwLDEsODMsMCw4OCwwLDEyNCwyLDEwNiwKKyAgICAyLDEwMCwyLDY0LDAsMTI0LDEsMTA3LDIsODMsMCw0MSwzLDEyMiw0OSw4NCwKKyAgICAxMDEsMTE1LDExNiwzMiwxMTksMTA0LDEwMSwxMTYsMTA0LDEwMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTYsMTIxLDExMiwxMDEsNDYsCisgICAgNzAsMTA1LDAsMjQwLDAsMCw0MSwzLDExNCwzOSwwLDAsMCwyMTgsNyw3OSwKKyAgICA4Myw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LDcsMTE1LDExNiw5NSwxMDksMTExLDEwMCwxMDEsNDEsCisgICAgMywxMTQsMzUsMCwwLDAsMjE4LDQsMTA5LDExMSwxMDAsMTAxLDkwLDksMTE1LDExNiwKKyAgICA5NywxMTYsOTUsMTA1LDExMCwxMDIsMTExLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDIxOCwxOCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LAorICAgIDk1LDEwOSwxMTEsMTAwLDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsNzgsMCwwLDAsMTE1LDEwLAorICAgIDAsMCwwLDAsMiwyLDEsMTIsMSwxNCwxLDYsMSwxMTQsNDMsMCwKICAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMzEsMCwwLDAsMTI0LDAsMCwxMTUsCi0gICAgMTgsMCwxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMCwwLDExNiwyLAotICAgIDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwyLDAsODMsNDEsMiwxMjIsMzAsODIsCi0gICAgMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsCi0gICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDEwNSwxMTUsMTAwLDEwNSwxMTQsNDYsMTA1LDAsNjQsCi0gICAgMCwwLDQxLDMsMTE0LDMsMCwwLDAsMjE4LDYsMTAzLDEwMSwxMTYsOTksMTE5LAotICAgIDEwMCwxMTQsNDMsMCwwLDAsNDEsMSwxMTQsMzUsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDk1LDEwNSwxMTUsMTAwLDEwNSwxMTQsOTIsMCwwLDAsMTE1LDYsMCwKLSAgICAwLDAsMCwyLDYsMSwxMiwxLDExNCw0NiwwLDAsMCwxMDUsMTgyLDEsCi0gICAgMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDE3LAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxOTMsMCwwLDAsMTAwLDEsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTE2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsCi0gICAgMCwxMjUsMywwLDExNiwyLDAsMTA2LDMsMCwxMjQsMywwLDExNiwyLDAsCi0gICAgMTA2LDQsMCwxMTYsMiwwLDEwNiw1LDAsNjYsMTE2LDIsMCwxMDYsNiwwLAotICAgIDY2LDEyNCwyLDAsMTAwLDIsMCw2NCwxMzEsMywwLDEyNSw0LDAsMTIxLDYxLAotICAgIDAsMTE2LDcsMCwxMDYsOCwwLDEyNCw0LDAsMTAwLDMsMCwxMzEsMiwwLAotICAgIDE0MywyMCwwLDEyNSw1LDAsMTI0LDUsMCwxMDYsOSwwLDEyNCwxLDAsMTMxLAotICAgIDEsMCwxLDg3LDEwMCw0LDAsODEsODIsODgsMTE2LDIsMCwxMDYsMTAsMCwKLSAgICAxMjQsMywwLDEyNCwwLDAsMTMxLDIsMCwxLDg3LDExMCw1OSwwLDQsMTE2LAotICAgIDExLDAsMTA3LDEwLDAsMTE0LDE4OCwwLDEsMSwxLDEyMSwxNywwLDExNiwyLAotICAgIDAsMTA2LDEyLDAsMTI0LDMsMCwxMzEsMSwwLDEsODcsMTEwLDE4LDAsNCwKLSAgICAxMTYsMTEsMCwxMDcsMTAsMCwxMTQsMTgwLDAsMSwxLDEsODksMTEwLDEsMCwKLSAgICA4OCwxMzAsMCwwLDg5LDExMCwxLDAsODgsMTAwLDQsMCw4Myw0MSw1LDEyMiwKLSAgICAxNjIsNjYsMTAxLDExNSwxMTYsNDUsMTAxLDEwMiwxMDIsMTExLDExNCwxMTYsMzIsMTAyLDExNywxMTAsCi0gICAgOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwzMiwxMDAsCi0gICAgOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE2LAotICAgIDExMSwxMDksMTA1LDk5LDk3LDEwOCwxMDgsMTIxLDQ2LDEwLDMyLDMyLDMyLDMyLDY2LDEwMSwKLSAgICAzMiwxMTIsMTE0LDEwMSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDQsOTcsMTEwLAotICAgIDEwMCwxMDgsMTAxLDMyLDk3LDMyLDcwLDEwNSwxMDgsMTAxLDY5LDEyMCwxMDUsMTE1LDExNiwxMTUsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMDIsMzIsOTksMTExLDExMCw5OSwxMTcsMTE0LDExNCwKLSAgICAxMDEsMTEwLDExNiwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwxMTYsMTAxLDEwOSwxMTIsMTExLDExNCw5NywxMTQsMTIxLAotICAgIDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LAotICAgIDEwMSwxMDAsNDYsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDEwNSwxODIsMSwwLDAsOTAsCi0gICAgMiwxMTksOTgsNzgsNDEsMTMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwyMTgsMiwKLSAgICAxMDUsMTAwLDExNCwzLDAsMCwwLDkwLDQsMTExLDExMiwxMDEsMTEwLDkwLDYsNzksCi0gICAgOTUsNjksODgsNjcsNzYsOTAsNyw3OSw5NSw2Nyw4Miw2OSw2NSw4NCw5MCw4LAotICAgIDc5LDk1LDg3LDgyLDc5LDc4LDc2LDg5LDIxOCwzLDk1LDEwNSwxMTEsMjE4LDYsNzAsCi0gICAgMTA1LDEwOCwxMDEsNzMsNzksMjE4LDUsMTE5LDExNCwxMDUsMTE2LDEwMSwyMTgsNywxMTQsMTAxLAotICAgIDExMiwxMDgsOTcsOTksMTAxLDExNCw0MCwwLDAsMCw5MCw2LDExNywxMTAsMTA4LDEwNSwKLSAgICAxMTAsMTA3LDQxLDYsMTE0LDM1LDAsMCwwLDIxOCw0LDEwMCw5NywxMTYsOTcsMTE0LAotICAgIDQyLDAsMCwwLDkwLDgsMTEyLDk3LDExNiwxMDQsOTUsMTE2LDEwOSwxMTIsOTAsMiwKLSAgICAxMDIsMTAwLDIxOCw0LDEwMiwxMDUsMTA4LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsOTUsMTE5LDExNCwxMDUsMTE2LDEwMSw5NSwKLSAgICA5NywxMTYsMTExLDEwOSwxMDUsOTksOTksMCwwLDAsMTE1LDI2LDAsMCwwLDAsCi0gICAgNSwyNCwxLDksMSwzMywxLDMsMywyMSwxLDIwLDEsMjAsMSwxMywKLSAgICAxLDMsMSwxNywxLDEzLDEsNSwxLDExNCw1NSwwLDAsMCwxMDUsMjMsCi0gICAgMTMsMCwwLDIzMywyLDAsMCwwLDExNCwxMywwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwxMywxMCw5MCwxMSw5NSw5NSwxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTUsCi0gICAgOTUsMTIyLDQsMTExLDExMiwxMTYsNDUsMTIyLDMsNDYsMTEyLDEyMSwxMjIsNCw0NiwxMTIsCi0gICAgMTIxLDk5LDc4LDIxOCwxMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDk5LDIsMCwwLDAsMSwwLDAsMCwxMSwwLDAsMCw2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw4NywxLDAsMCwxMjQsMSwwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsNzYsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDIsMCwKLSAgICAxMTYsMiwwLDEzMSwyLDAsMSwxMjQsMiwwLDEwMCwxLDAsMTA3LDksMCwKLSAgICAxMTQsNTgsMCwxMDAsMywwLDEyNSwzLDAsMTE2LDMsMCwxMjQsMywwLDEzMSwKLSAgICAxLDAsMTMwLDEsMCwxMjQsMSwwLDExNCw3MCwwLDEwMCw0LDAsMTEwLDMsCi0gICAgMCwxMDAsNSwwLDEyNSwyLDAsMTE2LDQsMCwxMjQsMCwwLDEzMSwxLDAsCi0gICAgOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMjQsNSwwLDEwNiw1LDAsMTAwLAotICAgIDYsMCwxMzEsMSwwLDkyLDMsMCwxMjUsNiwwLDEyNSw3LDAsMTI1LDgsCi0gICAgMCwxMTYsNiwwLDEwNiw3LDAsMTA2LDgsMCwxMjUsOSwwLDEyNCw5LDAsCi0gICAgMTAwLDEsMCwxMDcsOCwwLDExNCwxNTQsMCwxMTYsOSwwLDEwMCw3LDAsMTMxLAotICAgIDEsMCwxMzAsMSwwLDEwMCw0LDAsMTA2LDEwLDAsMTI0LDYsMCwxMTQsMTcyLAotICAgIDAsMTI0LDYsMCwxMTAsMywwLDEyNCw4LDAsMTI0LDcsMCwxMjQsOSwwLAotICAgIDEwMywzLDAsMTMxLDEsMCwxMjUsMTAsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LAotICAgIDgsMCwxMTQsMjQxLDAsMTE2LDYsMCwxMDYsMTEsMCwxMDYsMTIsMCwxMDAsOCwKLSAgICAwLDEwNywyLDAsMTE0LDIyOSwwLDEwMCw0LDAsMTI1LDIsMCwxMTAsMTIsMCwKLSAgICAxMTYsNiwwLDEwNiwxMSwwLDEwNiwxMiwwLDEyNSwyLDAsMTE2LDEzLDAsMTI0LAotICAgIDIsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsNCwwLDEwNywzLAotICAgIDAsMTE0LDYzLDEsMTI0LDIsMCwxMDYsMTQsMCwxMzEsMCwwLDExNSw0MiwxLAotICAgIDExNiwxNSwwLDEwMCw5LDAsMTA2LDE2LDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsMTMwLDEsMCwxMDAsMTAsMCwxMDYsMTYsMCwxMjQsMTAsMCwxMTYsMTcsCi0gICAgMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDEwLDAsMTE2LDE4LDAsMTI0LDQsMCwKLSAgICAxMTYsMTksMCwxMjQsMTAsMCwxMTYsMjAsMCwxMDAsOCwwLDI1LDIzLDEzMSwzLAotICAgIDAsODMsNDEsMTEsOTcsMjU0LDIsMCwwLDcxLDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDQ2LDExMiwxMjEsCi0gICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLAotICAgIDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LAotICAgIDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsCi0gICAgMTEwLDExMSwxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LAotICAgIDExNiw1OSwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LAotICAgIDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsNDYsMTEyLDEyMSw5OSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsCi0gICAgOTcsMTE1LDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LAotICAgIDEwOCwxMDEsMzIsMTE5LDEwMSwxMTQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwxMTEsMTEyLDExNiwxMDUsCi0gICAgMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwKLSAgICAxMTYsMTAxLDExNCwzMiw5OSwxMTEsMTEwLDExNiwxMTQsMTExLDEwOCwxMTUsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTEyLDExNCwxMDEsMTE1LDExNywxMDksMTAxLDEwMCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwKLSAgICAxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTExLDEwMiwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICAzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsNzMsMTAyLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksCi0gICAgMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwKLSAgICA3OCwxMTEsMTEwLDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywKLSAgICAzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5NywxMTQsMTAzLDExNywxMDksCi0gICAgMTAxLDExMCwxMTYsMzIsMTA1LDExNSwzMiwxMTYsOTcsMTA3LDEwMSwxMTAsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDMyLAotICAgIDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDQwLDEwMSwxMDgsCi0gICAgMTE1LDEwMSwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTAsMzIsMzIsCi0gICAgMzIsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLAotICAgIDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLAotICAgIDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiw3MywKLSAgICAxMDIsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsCi0gICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw3OCwxMTEsMTEwLDEwMSw0NCwxMCwzMiwzMiwKLSAgICAzMiwzMiw5NywzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LAotICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsOTcsMTA5LDEwMSwzMiw5NywxMTUsMzIsMTE1LDEwMSwKLSAgICAxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDEsMTA5LDExMiwxMTYsCi0gICAgMTIxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLDMyLDExOSwxMDQsMTA1LAotICAgIDEwOCwxMDEsMzIsOTcsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsMTAxLDExMywxMTcsMTA1LDExOCw5NywxMDgsMTAxLDExMCwxMTYsMzIsMTE2LAotICAgIDExMSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwKLSAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLDM5LDQ5LDM5LDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwKLSAgICAxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LAotICAgIDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTEwLDMyLDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsCi0gICAgMTAwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDcwLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsCi0gICAgOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsCi0gICAgOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksCi0gICAgOTcsMTE2LDEwMSwxMDAsNTksMzIsMTE3LDExNSwxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwKLSAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwKLSAgICAxMjIsNTAsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsCi0gICAgMzIsMTExLDExNCwzMiwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LDExMSwzMiwKLSAgICA3OCwxMTEsMTEwLDEwMSwxMTQsMzAsMCwwLDAsMTE0LDI5LDAsMCwwLDIxOCwxLAotICAgIDQ2LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwwLDAsMTE2LDAsMTI0LDAsCisgICAgMTAwLDEsMTMxLDIsODMsMCw0MSwyLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwKKyAgICAxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwKKyAgICAxMDQsNDYsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsNDYsMTA1LDAsMTI4LDAsMCw0MSwxLAorICAgIDExNCw0MywwLDAsMCw0MSwxLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTIsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTA1LDExNSwxMDIsMTA1LDEwOCwxMDEsODcsMCwwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCwyLDExNCw0NCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwKKyAgICAwLDAsMCwxMjQsMCwxMTUsMTIsMTE2LDAsMTA2LDEsMTMxLDAsMTI1LDAsMTE2LAorICAgIDIsMTI0LDAsMTAwLDEsMTMxLDIsODMsMCw0MSwyLDEyMiwzMCw4MiwxMDEsMTEyLAorICAgIDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsNDYsMTA1LDExNSwxMDAsMTA1LDExNCw0NiwxMDUsMCw2NCwwLDAsCisgICAgNDEsMywxMTQsMywwLDAsMCwyMTgsNiwxMDMsMTAxLDExNiw5OSwxMTksMTAwLDExNCwKKyAgICA0MywwLDAsMCw0MSwxLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwKKyAgICAxMDQsOTUsMTA1LDExNSwxMDAsMTA1LDExNCw5MiwwLDAsMCwxMTUsNiwwLDAsMCwKKyAgICAwLDIsNCwxLDgsMSwxMTQsNDYsMCwwLDAsMjMzLDE4MiwxLDAsMCwKKyAgICA5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTYyLDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLAorICAgIDExNiwxLDEyNCwwLDEzMSwxLDEzMSwyLDEyNSwzLDExNiwyLDEwNiwzLDEyNCwzLAorICAgIDExNiwyLDEwNiw0LDExNiwyLDEwNiw1LDY2LDAsMTE2LDIsMTA2LDYsNjYsMCwKKyAgICAxMjQsMiwxMDAsMiw2NCwwLDEzMSwzLDEyNSw0LDEyMSw1MCwxMTYsNywxMDYsOCwKKyAgICAxMjQsNCwxMDAsMywxMzEsMiwxNDMsMTYsMTI1LDUsMTI0LDUsMTA2LDksMTI0LDEsCisgICAgMTMxLDEsMSwwLDg3LDAsMTAwLDQsODEsMCw4MiwwLDg4LDAsMTE2LDIsCisgICAgMTA2LDEwLDEyNCwzLDEyNCwwLDEzMSwyLDEsMCw4NywwLDExMCw1OCw0LDAsCisgICAgMTE2LDExLDEwNywxMCwxMTQsMTU2LDEsMCwxLDAsMSwwLDEyMSwxNCwxMTYsMiwKKyAgICAxMDYsMTIsMTI0LDMsMTMxLDEsMSwwLDg3LDAsMTEwLDIwLDQsMCwxMTYsMTEsCisgICAgMTA3LDEwLDExNCwxNDgsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLAorICAgIDEzMCwwLDg5LDAsMTEwLDIsODgsMCwxMDAsNCw4MywwLDQxLDUsMTIyLDE2MiwKKyAgICA2NiwxMDEsMTE1LDExNiw0NSwxMDEsMTAyLDEwMiwxMTEsMTE0LDExNiwzMiwxMDIsMTE3LDExMCw5OSwKKyAgICAxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDExMSwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDMyLDEwMCw5NywKKyAgICAxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTYsMTExLAorICAgIDEwOSwxMDUsOTksOTcsMTA4LDEwOCwxMjEsNDYsMTAsMzIsMzIsMzIsMzIsNjYsMTAxLDMyLAorICAgIDExMiwxMTQsMTAxLDExMiw5NywxMTQsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNCw5NywxMTAsMTAwLAorICAgIDEwOCwxMDEsMzIsOTcsMzIsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsMTE2LDExNSw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDEwMiwzMiw5OSwxMTEsMTEwLDk5LDExNywxMTQsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDExNiwxMDQsCisgICAgMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMDEsMTA5LDExMiwxMTEsMTE0LDk3LDExNCwxMjEsMzIsCisgICAgMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsMTE2LDExNiwxMDEsMTA5LDExMiwxMTYsMTAxLAorICAgIDEwMCw0NiwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsMTA1LDE4MiwxLDAsMCw5MCwyLAorICAgIDExOSw5OCw3OCw0MSwxMywyMTgsNiwxMDIsMTExLDExNCwxMDksOTcsMTE2LDIxOCwyLDEwNSwKKyAgICAxMDAsMTE0LDMsMCwwLDAsOTAsNCwxMTEsMTEyLDEwMSwxMTAsOTAsNiw3OSw5NSwKKyAgICA2OSw4OCw2Nyw3Niw5MCw3LDc5LDk1LDY3LDgyLDY5LDY1LDg0LDkwLDgsNzksCisgICAgOTUsODcsODIsNzksNzgsNzYsODksMjE4LDMsOTUsMTA1LDExMSwyMTgsNiw3MCwxMDUsCisgICAgMTA4LDEwMSw3Myw3OSwyMTgsNSwxMTksMTE0LDEwNSwxMTYsMTAxLDIxOCw3LDExNCwxMDEsMTEyLAorICAgIDEwOCw5Nyw5OSwxMDEsMTE0LDQwLDAsMCwwLDkwLDYsMTE3LDExMCwxMDgsMTA1LDExMCwKKyAgICAxMDcsNDEsNiwxMTQsMzUsMCwwLDAsMjE4LDQsMTAwLDk3LDExNiw5NywxMTQsNDIsCisgICAgMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCw5NSwxMTYsMTA5LDExMiw5MCwyLDEwMiwKKyAgICAxMDAsMjE4LDQsMTAyLDEwNSwxMDgsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDIxOCwxMyw5NSwxMTksMTE0LDEwNSwxMTYsMTAxLDk1LDk3LAorICAgIDExNiwxMTEsMTA5LDEwNSw5OSw5OSwwLDAsMCwxMTUsMjYsMCwwLDAsMCw1LAorICAgIDE2LDEsNiwxLDI2LDEsMiwzLDE0LDEsMjAsMSwxNiwxLDE0LDEsCisgICAgMiwxLDE0LDEsMTQsMSw2LDEsMTE0LDU2LDAsMCwwLDEwNSw0NCwxMywKKyAgICAwLDAsMjMzLDIsMCwwLDAsMTE0LDEzLDAsMCwwLDExNSwyLDAsMCwKKyAgICAwLDEzLDEwLDkwLDExLDk1LDk1LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSw5NSwKKyAgICAxMjIsNCwxMTEsMTEyLDExNiw0NSwxMjIsMyw0NiwxMTIsMTIxLDEyMiw0LDQ2LDExMiwxMjEsCisgICAgOTksNzgsNDEsMSwyMTgsMTIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsCisgICAgMTExLDExMCw5OSwyLDAsMCwwLDEsMCwwLDAsMTEsMCwwLDAsNiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMjM0LDAsMCwwLDEyNCwxLDEwMCwxLAorICAgIDEwNyw5LDExNCw1MiwxMTYsMCwxMDYsMSwxMDAsMiwxMTYsMiwxMzEsMiwxLDAsCisgICAgMTI0LDIsMTAwLDEsMTA3LDksMTE0LDQwLDEwMCwzLDEyNSwzLDExNiwzLDEyNCwzLAorICAgIDEzMSwxLDEzMCwxLDEyNCwxLDExNCw0OCwxMDAsNCwxMTAsMiwxMDAsNSwxMjUsMiwKKyAgICAxMTYsNCwxMjQsMCwxMzEsMSw5MiwyLDEyNSw0LDEyNSw1LDEyNCw1LDEwNiw1LAorICAgIDEwMCw2LDEzMSwxLDkyLDMsMTI1LDYsMTI1LDcsMTI1LDgsMTE2LDYsMTA2LDcsCisgICAgMTA2LDgsMTI1LDksMTI0LDksMTAwLDEsMTA3LDgsMTE0LDEwNCwxMTYsOSwxMDAsNywKKyAgICAxMzEsMSwxMzAsMSwxMDAsNCwxMDYsMTAsMTI0LDYsMTE0LDExNiwxMjQsNiwxMTAsMiwKKyAgICAxMjQsOCwxMjQsNywxMjQsOSwxMDMsMywxMzEsMSwxMjUsMTAsMTI0LDIsMTAwLDEsCisgICAgMTA3LDgsMTE0LDE2MiwxMTYsNiwxMDYsMTEsMTA2LDEyLDEwMCw4LDEwNywyLDExNCwxNTQsCisgICAgMTAwLDQsMTI1LDIsMTEwLDgsMTE2LDYsMTA2LDExLDEwNiwxMiwxMjUsMiwxMTYsMTMsCisgICAgMTI0LDIsMTMxLDEsMTI1LDIsMTI0LDIsMTAwLDQsMTA3LDMsMTE0LDIxNCwxMjQsMiwKKyAgICAxMDYsMTQsMTMxLDAsMTE1LDIwMCwxMTYsMTUsMTAwLDksMTA2LDE2LDEyNCwyLDEzMSwxLAorICAgIDEzMSwxLDEzMCwxLDEwMCwxMCwxMDYsMTYsMTI0LDEwLDExNiwxNywxMjQsMiwxMzEsMywKKyAgICAxMjUsMTAsMTE2LDE4LDEyNCw0LDExNiwxOSwxMjQsMTAsMTE2LDIwLDEwMCw4LDI1LDAsCisgICAgMjMsMCwxMzEsMyw4MywwLDQxLDExLDk3LDI1NCwyLDAsMCw3MSwxMDUsMTE4LAorICAgIDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywKKyAgICAzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LAorICAgIDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsCisgICAgMTE1LDMyLDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLAorICAgIDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLAorICAgIDEwMSwxMjAsMTA1LDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwKKyAgICAxMDgsMTIxLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDQ2LAorICAgIDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LAorICAgIDExNiwxMDEsMTAwLDMyLDk3LDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwKKyAgICAxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExOSwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksCisgICAgMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTIsOTcsCisgICAgMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsOTksMTExLDExMCwxMTYsMTE0LDExMSwxMDgsMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTQsMTAxLDExNSwxMTcsMTA5LDEwMSwxMDAsMzIsMTExLDExMiwKKyAgICAxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LAorICAgIDMyLDExMSwxMDIsMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDczLDEwMiwzMiwzOSwxMTEsCisgICAgMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDEwNSwxMTUsMzIsCisgICAgMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExNiwKKyAgICAxMTQsMTA1LDExMCwxMDMsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsOTcsMTE2LAorICAgIDEwNSwxMTEsMTEwLDEwLDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTcsCisgICAgMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTE2LDk3LDEwNywxMDEsMTEwLAorICAgIDMyLDk3LDExMCwxMDAsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMTYsMTExLAorICAgIDMyLDk4LDEwMSwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwKKyAgICAzMiw0MCwxMDEsMTA4LDExNSwxMDEsMzIsODYsOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsCisgICAgMTE0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0MSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMCwxMDEsOTgsMTE3LDEwMywKKyAgICA5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsOTcsMTA5LDEwMSwKKyAgICAxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwKKyAgICAxMDAsNDYsMzIsNzMsMTAyLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsCisgICAgMTE0LDEwNSwxMDAsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsCisgICAgNDQsMTAsMzIsMzIsMzIsMzIsOTcsMzIsODQsMTE0LDExNywxMDEsMzIsMTE4LDk3LDEwOCwKKyAgICAxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDk3LDEwOSwxMDEsMzIsOTcsCisgICAgMTE1LDMyLDExNSwxMDEsMTE2LDExNiwxMDUsMTEwLDEwMywzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LAorICAgIDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTAxLDEwOSwxMTIsMTE2LDEyMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwKKyAgICAzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDk3LDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDExOCwKKyAgICA5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwKKyAgICAxMTAsMTE2LDMyLDExNiwxMTEsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDM5LDExMSwKKyAgICAxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTE2LDExMSwzMiwKKyAgICAzOSw0OSwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE1LDEyMSwxMTUsCisgICAgNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LAorICAgIDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsCisgICAgMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksCisgICAgMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsCisgICAgMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw3MCwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwKKyAgICAzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAorICAgIDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDU5LDMyLDExNywxMTUsMTAxLDMyLDM5LDExMSwKKyAgICAxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTA1LDExMCwxMTUsCisgICAgMTE2LDEwMSw5NywxMDAsMTIyLDUwLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsCisgICAgMTE0LDEwNSwxMDAsMTAxLDMyLDExMSwxMTQsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLDExNSwxMDEsMTE2LAorICAgIDMyLDExNiwxMTEsMzIsNzgsMTExLDExMCwxMDEsMTE0LDMwLDAsMCwwLDExNCwyOSwwLAorICAgIDAsMCwyMTgsMSw0NiwxMjIsMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwKKyAgICAxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsCisgICAgMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDIzMywwLDAsMCwwLAorICAgIDEyMiwyNCwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwOCwKKyAgICAxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDEyMiw3LDEyMywxMjUsNDYsMTIzLAorICAgIDEyNSwxMjMsMTI1LDQxLDIxLDIxOCw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwKKyAgICAyMTgsNCwxMTksOTcsMTE0LDExMCwyMTgsMTgsNjgsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwKKyAgICAxMDUsMTExLDExMCw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDIxOCw5LDg0LDEyMSwxMTIsMTAxLAorICAgIDY5LDExNCwxMTQsMTExLDExNCwxMTQsMzgsMCwwLDAsMTE0LDMyLDAsMCwwLDExNCwKKyAgICA3LDAsMCwwLDIxOCwxNCwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywKKyAgICAxMTYsMTA1LDExMSwxMTAsMjE4LDksOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDIxOCwKKyAgICAxOSw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDI2LDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwKKyAgICAyMTgsOCwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLDIxOCwzLDExNSwxMTYsMTE0LDIxOCwKKyAgICA3LDEwNSwxMTUsOTcsMTA4LDExMCwxMTcsMTA5LDIxOCwxMCw4Niw5NywxMDgsMTE3LDEwMSw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDQ4LDAsMCwwLDIxOCw0LDk1LDc5LDgwLDg0LDExNCwKKyAgICAyOCwwLDAsMCwyMTgsOCw5NSw4MCw4OSw2Nyw2NSw2Nyw3Miw2OSwyMTgsMTcsCisgICAgNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksCisgICAgODMsNDEsMTEsMTE0LDM1LDAsMCwwLDkwLDE0LDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwKKyAgICAxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDExNCw1OCwwLDAsMCwyMTgsNywxMDksCisgICAgMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwyMTgsNCwxMDQsMTAxLDk3LDEwMCwxMTQsMzcsMCwwLAorICAgIDAsOTAsNCw5OCw5NywxMTUsMTAxLDIxOCwzLDExNSwxMDEsMTEyLDIxOCw0LDExNCwxMDEsCisgICAgMTE1LDExNiw5MCwzLDExNiw5NywxMDMsOTAsMTUsOTcsMTA4LDEwOSwxMTEsMTE1LDExNiw5NSwKKyAgICAxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDE3LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLAorICAgIDExNCwxMTEsMTA5LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjQ5LDAsMCwwLDExNSw0NiwKKyAgICAwLDAsMCwwLDE4LDgsMSw2LDEsNiwxLDgsMSw0LDEsOCwKKyAgICAxLDEyLDEsMTIsMSwxNiwxLDgsMSw4LDEsOCwxLDI0LDEsOCwKKyAgICAxLDEyLDEsNiwyLDgsMSw4LDEsOCwxLDgsMSwxNCwxLDE0LAorICAgIDEsMTE0LDgwLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw4LAorICAgIDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDIyMCwwLDAsMCwKKyAgICAxMTYsMCwxMDYsMSwxMDYsMiwxMDAsMSwxMDcsOCwxMTQsMjAsMTE2LDMsMTAwLDIsCisgICAgMTMxLDEsMTMwLDEsMTE2LDQsMTI0LDAsMTMxLDEsOTIsMiwxMjUsMSwxMjUsMiwKKyAgICAxMTYsNCwxMjQsMSwxMzEsMSw5MiwyLDEyNSwxLDEyNSwzLDEyNCwzLDExNiw1LAorICAgIDEwNywzLDExNCw2OCwxMTYsNiwxMDAsMywxMDYsNywxMTYsNSwxMjQsMCwxMzEsMiwKKyAgICAxMzEsMSwxMzAsMSwxMjQsMiwxMDYsOCwxMDAsNCwxMzEsMSwxMjUsNCwxMjQsNCwKKyAgICAxMDAsMTEsMTA3LDcsMTE0LDEwMiwxMTYsNiwxMDAsNywxMDYsNywxMjQsMiwxMzEsMSwKKyAgICAxMzEsMSwxMzAsMSwxMTAsODYsMTI0LDQsMTAwLDYsMTA3LDIsMTE0LDE4OCwxMjQsMiwKKyAgICAxMDYsOSwxMDAsNCwxMDAsNSwxMzEsMiwxMDAsMTIsMjUsMCwxMjUsNSwxMjQsNSwKKyAgICAxMDYsMTAsMTE2LDExLDEzMSwxLDExNSwxNTAsMTE2LDYsMTAwLDgsMTA2LDcsMTE2LDExLAorICAgIDEzMSwxLDEzMSwxLDEzMCwxLDEyNCw1LDExNiwxMiwxMTYsMTEsMTMxLDEsMTAwLDEsCisgICAgMTMzLDIsMjUsMCwxMjUsNiwxMjQsNiwxMDYsMTMsMTMxLDAsMTE1LDE4OCwxMTYsNiwKKyAgICAxMDAsOSwxMDYsNywxMjQsNSwxMzEsMSwxMzEsMSwxMzAsMSwxMjQsMiwxMDYsMTQsCisgICAgMTAwLDQsMTMxLDEsMTAwLDEwLDI1LDAsMTI1LDcsMTE2LDE1LDEyNCwxLDEyNCw3LAorICAgIDExNiwxNiwxMDAsMTAsMjUsMCwyMywwLDEzMSwyLDgzLDAsNDEsMTMsOTcsMTEwLAorICAgIDEsMCwwLDcxLDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDQ2LDExMiwxMjEsOTksNDYsMzIsMTAyLDEwNSwxMDgsCisgICAgMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKKyAgICAxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLAorICAgIDk5LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsCisgICAgMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwzMiwxMTYsCisgICAgMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwKKyAgICAxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMTAsMzIsCisgICAgMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsCisgICAgOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsMTE2LDExMSwzMiw5OSwxMTEsCisgICAgMTE0LDExNCwxMDEsMTE1LDExMiwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDMyLDczLDEwMiwzMiwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMDAsMTExLDEwMSwxMTUsMTAsMzIsMzIsMzIsMzIsMTEwLDExMSwxMTYsCisgICAgMzIsOTksMTExLDExMCwxMDIsMTExLDExNCwxMDksMzIsMTE2LDExMSwzMiw4MCw2OSw4MCwzMiwKKyAgICA1MSw0OSw1Miw1NSw0Nyw1Miw1Niw1NiwzMiwxMDIsMTExLDExNCwxMDksOTcsMTE2LDQ0LAorICAgIDMyLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA1LDEwOCwxMDgsCisgICAgMzIsOTgsMTAxLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMzIsNzMsMTAyLDEwLDMyLAorICAgIDMyLDMyLDMyLDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LAogICAgIDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsCi0gICAgMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwyMzMsMCwwLDAsMCwxMjIsMjQsMTIzLDMzLAotICAgIDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsCi0gICAgMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwxMjIsNywxMjMsMTI1LDQ2LDEyMywxMjUsMTIzLDEyNSw0MSwKLSAgICAyMSwyMTgsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMjE4LDQsMTE5LDk3LAotICAgIDExNCwxMTAsMjE4LDE4LDY4LDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsODcsCi0gICAgOTcsMTE0LDExMCwxMDUsMTEwLDEwMywyMTgsOSw4NCwxMjEsMTEyLDEwMSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMTE0LDM4LDAsMCwwLDExNCwzMiwwLDAsMCwxMTQsNywwLDAsMCwKLSAgICAyMTgsMTQsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDIxOCw5LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywyMTgsMTksNzgsMTExLDExNiwKKyAgICAxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LAogICAgIDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMTE0LDI2LDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwyMTgsOCwxMTEsMTEyLAotICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLDIxOCwzLDExNSwxMTYsMTE0LDIxOCw3LDEwNSwxMTUsOTcsCi0gICAgMTA4LDExMCwxMTcsMTA5LDIxOCwxMCw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgMTE0LDQ3LDAsMCwwLDIxOCw0LDk1LDc5LDgwLDg0LDExNCwyOCwwLDAsMCwKLSAgICAyMTgsOCw5NSw4MCw4OSw2Nyw2NSw2Nyw3Miw2OSwyMTgsMTcsNjYsODksODQsNjksCi0gICAgNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsMTEsMTE0LAotICAgIDM1LDAsMCwwLDkwLDE0LDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsCi0gICAgMTE0LDEwNSwxMDAsMTAxLDExNCw1NywwLDAsMCwyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsCi0gICAgMTAzLDEwMSwyMTgsNCwxMDQsMTAxLDk3LDEwMCwxMTQsMzcsMCwwLDAsOTAsNCw5OCwKLSAgICA5NywxMTUsMTAxLDIxOCwzLDExNSwxMDEsMTEyLDIxOCw0LDExNCwxMDEsMTE1LDExNiw5MCwzLAotICAgIDExNiw5NywxMDMsOTAsMTUsOTcsMTA4LDEwOSwxMTEsMTE1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMjE4LDE3LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjQ3LDAsMCwwLDExNSw0NiwwLDAsMCwwLAotICAgIDE4LDEyLDEsOSwxLDcsMSwxMiwxLDYsMSwxMiwxLDE4LDEsMTgsCi0gICAgMSwyNCwxLDEyLDEsMTIsMSwxMiwxLDM2LDEsMTIsMSwxOCwxLDksCi0gICAgMiwxMiwxLDEyLDEsMTIsMSwxMiwxLDIxLDEsMjEsMSwxMTQsNzksMCwKLSAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDgsMCwwLDAsNSwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNjIsMSwwLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEwNiwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwzMCwwLDExNiwzLAotICAgIDAsMTAwLDIsMCwxMzEsMSwwLDEzMCwxLDAsMTE2LDQsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsOTIsMiwwLDEyNSwxLDAsMTI1LDIsMCwxMTYsNCwwLDEyNCwKLSAgICAxLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDEsMCwxMjUsMywwLDEyNCwzLAotICAgIDAsMTE2LDUsMCwxMDcsMywwLDExNCwxMDIsMCwxMTYsNiwwLDEwMCwzLDAsCi0gICAgMTA2LDcsMCwxMTYsNSwwLDEyNCwwLDAsMTMxLDIsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDIsMCwxMDYsOCwwLDEwMCw0LDAsMTMxLDEsMCwxMjUsNCwKLSAgICAwLDEyNCw0LDAsMTAwLDExLDAsMTA3LDcsMCwxMTQsMTUzLDAsMTE2LDYsMCwKLSAgICAxMDAsNywwLDEwNiw3LDAsMTI0LDIsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMTAsMTI1LDAsMTI0LDQsMCwxMDAsNiwwLDEwNywyLDAsMTE0LDIyLAotICAgIDEsMTI0LDIsMCwxMDYsOSwwLDEwMCw0LDAsMTAwLDUsMCwxMzEsMiwwLAotICAgIDEwMCwxMiwwLDI1LDEyNSw1LDAsMTI0LDUsMCwxMDYsMTAsMCwxMTYsMTEsMCwKLSAgICAxMzEsMSwwLDExNSwyMjMsMCwxMTYsNiwwLDEwMCw4LDAsMTA2LDcsMCwxMTYsCi0gICAgMTEsMCwxMzEsMSwwLDEzMSwxLDAsMTMwLDEsMCwxMjQsNSwwLDExNiwxMiwKLSAgICAwLDExNiwxMSwwLDEzMSwxLDAsMTAwLDEsMCwxMzMsMiwwLDI1LDEyNSw2LAotICAgIDAsMTI0LDYsMCwxMDYsMTMsMCwxMzEsMCwwLDExNSwyMiwxLDExNiw2LDAsCi0gICAgMTAwLDksMCwxMDYsNywwLDEyNCw1LDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDIsMCwxMDYsMTQsMCwxMDAsNCwwLDEzMSwxLDAsMTAwLDEwLAotICAgIDAsMjUsMTI1LDcsMCwxMTYsMTUsMCwxMjQsMSwwLDEyNCw3LDAsMTE2LDE2LAotICAgIDAsMTAwLDEwLDAsMjUsMjMsMTMxLDIsMCw4Myw0MSwxMyw5NywxMTAsMSwwLAotICAgIDAsNzEsMTA1LDExOCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAotICAgIDExNiwxMTEsMzIsOTcsMzIsNDYsMTEyLDEyMSw5OSw0NiwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsCi0gICAgMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsMTE2LDExMSwzMiwxMDUsMTE2LDExNSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsOTksMzIsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTAsMTAxLAotICAgIDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDU5LDMyLDExNiwxMDQsMTA1LAotICAgIDExNSwzMiwxMTUsMTA1LDEwOSwxMTIsMTA4LDEyMSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5OSw5NywKLSAgICAxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LAotICAgIDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLAotICAgIDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMzIsMzIsNzMsMTAyLDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDMyLDEwMCwxMTEsMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTAsMTExLDExNiwzMiw5OSwKLSAgICAxMTEsMTEwLDEwMiwxMTEsMTE0LDEwOSwzMiwxMTYsMTExLDMyLDgwLDY5LDgwLDMyLDUxLDQ5LAotICAgIDUyLDU1LDQ3LDUyLDU2LDU2LDMyLDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsNDQsMzIsODYsCi0gICAgOTcsMTA4LDExNywxMDEsNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5OCwKLSAgICAxMDEsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwzMiw3MywxMDIsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LAotICAgIDMyLDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwKLSAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LAotICAgIDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LAotICAgIDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywKLSAgICAxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLDMyLDEwNSwKLSAgICAxMTUsMzIsNzgsMTExLDExMCwxMDEsMTIyLDM3LDEyMywxMjUsMzIsMTEwLDExMSwxMTYsMzIsOTgsCi0gICAgMTExLDExNiwxMTYsMTExLDEwOSw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwMCwxMDUsMTE0LDEwMSwKLSAgICA5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsNTgsMCwKLSAgICAwLDAsMTE0LDU2LDAsMCwwLDIzMywzLDAsMCwwLDEyMiwzMywxMDEsMTIwLAotICAgIDExMiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsMTExLDExMCwxMDgsMTIxLDMyLDUwLDMyLDExMSwxMTQsCi0gICAgMzIsNTEsMzIsMTAwLDExMSwxMTYsMTE1LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTIyLAotICAgIDU3LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksCi0gICAgMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTUsMTE2LDk3LDExNCwxMTYsCi0gICAgMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDEyMywzMywxMTQsMTI1LDEyMiw1MiwxMTEsMTEyLDExNiwxMDUsCi0gICAgMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsMTIzLAotICAgIDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTAsMzIsOTcsMTA4LAotICAgIDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE4LDk3LDEwOCwxMTcsMTAxLAotICAgIDExNCw1OSwwLDAsMCw2MiwyLDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsCi0gICAgODAsMCwwLDAsMjMzLDI1NCwyNTUsMjU1LDI1NSw0MSwxNywxMTQsNywwLDAsMCwKLSAgICAxMTQsNjQsMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsCi0gICAgMzgsMCwwLDAsMTE0LDczLDAsMCwwLDExNCw3MSwwLDAsMCwxMTQsNDcsCi0gICAgMCwwLDAsMjE4LDUsOTksMTExLDExNywxMTAsMTE2LDExNCwzNCwwLDAsMCwxMTQsCi0gICAgOSwwLDAsMCwxMTQsNzIsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCw3MCwKLSAgICAwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDExNCwyOCwKLSAgICAwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksOTUsODMsODUsNzAsNzAsCi0gICAgNzMsODgsNjksODMsNDEsOCwxMTQsMzUsMCwwLDAsMTE0LDc2LDAsMCwwLAotICAgIDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTAsOSwxMDAsMTExLDExNiwKLSAgICA5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDU3LDAsMCwwLDkwLDksMTExLDExMiwxMTYsCi0gICAgOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsMTAxLDk1LDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDIsMTE0LDExMSwKLSAgICAxMDksOTUsOTksOTcsOTksMTA0LDEwMSwzNSwxLDAsMCwxMTUsNDQsMCwwLDAsCi0gICAgMCw5LDE4LDEsMTIsMSwxOCwxLDE4LDEsMTIsMSw5LDEsMTUsMSwKLSAgICAxNSwxLDEyLDEsOSwxLDE1LDEsMTIsMSwyMiwxLDE1LDEsOSwxLAotICAgIDEyLDEsMjIsMSwxMiwxLDksMSwxMiwxLDE5LDEsMTE0LDg1LDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDEyLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwxNjQsMCwwLDAsMTE2LDAsMCwxMjQsMCwKLSAgICAwLDEzMSwxLDAsMTAwLDEsMCwxMDcsMiwwLDExNCwyMiwwLDEwMCwyLDAsCi0gICAgODMsMTI0LDAsMCwxMDYsMSwwLDEwMCwzLDAsMTMxLDEsMCw5MiwzLDAsCi0gICAgMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDEsMCwxMiwxMTUsODEsMCwKLSAgICAxMjQsMywwLDEwNiwyLDAsMTMxLDAsMCwxMDAsNywwLDEwMCw4LDAsMTMzLAotICAgIDIsMCwyNSwxMDAsNiwwLDEwNywzLDAsMTE0LDg1LDAsMTI0LDAsMCw4MywKLSAgICAxMjEsMTYsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwxMjUsNCwwLDg3LAotICAgIDExMCw0MCwwLDQsMTE2LDQsMCwxMTYsNSwwLDEwMiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDE0MywwLDEsMSwxLDEyNCwwLDAsMTAwLDIsMCwxMDAsOSwwLDEzMywKLSAgICAyLDAsMjUsMTI1LDQsMCw4OSwxMTAsMSwwLDg4LDExNiw2LDAsMTI0LDQsCi0gICAgMCwxMzEsMSwwLDExNCwxNjAsMCwxMjQsNCwwLDgzLDEyNCwwLDAsODMsNDEsCi0gICAgMTAsMTIyLDE4OCw2NywxMTEsMTEwLDExOCwxMDEsMTE0LDExNiwzMiw5NywzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsCi0gICAgMTE2LDExMSwzMiw5NywzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywxMTYsMTA0LAotICAgIDMyLDQwLDEwNSwxMDIsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDQxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsCi0gICAgMTExLDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDExNSwzMiwxMTIsMTE3LDExNCwxMDEsMTA4LDEyMSwKLSAgICAzMiwxMDIsMTExLDExNCwzMiw5OCw5Nyw5OSwxMDcsMTE5LDk3LDExNCwxMDAsMTE1LDQ1LDk5LAotICAgIDExMSwxMDksMTEyLDk3LDExNiwxMDUsOTgsMTA1LDEwOCwxMDUsMTE2LDEyMSwzMiwxMDIsMTExLDExNCwKLSAgICAxMCwzMiwzMiwzMiwzMiw4MCwxMjEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw5NSw2OSwxMjAsCi0gICAgMTAxLDk5LDY3LDExMSwxMDAsMTAxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODcsMTA1LDExNiwxMDQsCi0gICAgNzAsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDQwLDQxLDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsNjcsMzIsNjUsODAsNzMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LAotICAgIDU5LDAsMCwwLDc4LDExNCw1OCwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LAotICAgIDI5LDAsMCwwLDkwLDIsMTEyLDEyMSwyMzMsMjUzLDI1NSwyNTUsMjU1LDIzMywyNTUsMjU1LAotICAgIDI1NSwyNTUsMTE0LDg3LDAsMCwwLDQxLDcsMTE0LDMxLDAsMCwwLDExNCwzMiwKLSAgICAwLDAsMCwyMTgsNSwxMDgsMTExLDExOSwxMDEsMTE0LDExNCw4NSwwLDAsMCwxMTQsCi0gICAgNjYsMCwwLDAsMTE0LDcxLDAsMCwwLDExNCw0NCwwLDAsMCw0MSw1LAotICAgIDIxOCwxMyw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsCi0gICAgNzgsMCwwLDAsMTE0LDM2LDAsMCwwLDkwLDksMTAxLDEyMCwxMTYsMTAxLDExMCwKLSAgICAxMTUsMTA1LDExMSwxMTAsMjE4LDExLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTEyLDk3LDExNiwKLSAgICAxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDE1LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTAyLDEwNSwxMDgsCi0gICAgMTAxLDY4LDEsMCwwLDExNSwyMCwwLDAsMCwwLDcsMTgsMSw0LDEsCi0gICAgMjQsMSwzNSwxLDQsMSwzLDEsMTYsMSwxOSwxLDIxLDEsMTE0LDkxLAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAotICAgIDExLDAsMCwwLDY3LDAsMCwwLDExNSw5MiwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTE2LDEsMCwxMTYsMiwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsCi0gICAgNTksMCwxMjEsMTQsMCwxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCw4Myw4NywKLSAgICAxMTMsODgsMCw0LDExNiw0LDAsMTA3LDEwLDAsMTE0LDU1LDAsMSwxLDEsCi0gICAgODksMTEzLDg4LDAsODgsMTEwLDI5LDAsMTI0LDAsMCwxMDYsMCwwLDExNiwxLAotICAgIDAsMTE2LDUsMCwxMzEsMSwwLDEzMSwxLDAsMTE0LDg0LDAsMTI0LDAsMCwKLSAgICA4MywxMDAsMCwwLDgzLDEwMCwwLDAsODMsNDEsMSw3OCw0MSw2LDIxOCw4LAotICAgIDEwMSwxMTAsMTAwLDExNSwxMTksMTA1LDExNiwxMDQsMjE4LDUsMTE2LDExNywxMTIsMTA4LDEwMSwxMTQsCi0gICAgODQsMCwwLDAsMTE0LDc5LDAsMCwwLDExNCw2NiwwLDAsMCwxMTQsNzQsCi0gICAgMCwwLDAsNDEsMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLAotICAgIDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDg3LDEsMCwwLDExNSwKLSAgICAxNiwwLDAsMCwwLDEsMjEsMSwzLDEsMTQsMSwxMywxLDgsMSwKLSAgICAyMSwxLDQsMiwxMTQsOTUsMCwwLDAsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDYwLAotICAgIDAsMCwwLDEyMSwxOSwwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLDEwNiwKLSAgICAxLDAsMTI1LDEsMCw4NywxMTAsMjQsMCw0LDExNiwyLDAsMTA3LDEwLDAsCi0gICAgMTE0LDQ1LDAsMSwxLDEsMTAwLDEsMCwxMjUsMSwwLDg5LDExMCwxLDAsCi0gICAgODgsMTI0LDEsMCwxMDAsMiwwLDc5LDEyNSwxLDAsMTI0LDEsMCw4Myw0MSwKLSAgICAzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsCi0gICAgMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLAotICAgIDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsMCwwLDIzMywxMjgsMCwwLDAsCi0gICAgNDEsMywxMTQsMzksMCwwLDAsMTE0LDQxLDAsMCwwLDExNCw0MCwwLDAsCi0gICAgMCw0MSwyLDExNCwzNSwwLDAsMCwxMTQsNDIsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDk1LDk5LAotICAgIDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsOTksMSwwLDAsMTE1LDEyLDAsMCwKLSAgICAwLDAsMiwzLDEsMTksMSwxMywxLDExLDMsMTAsMSwxMTQsOTcsMCwKLSAgICAwLDAsMjE4LDksMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDUsMTE2LDEyMSwxMTQsMjksMCwKLSAgICAwLDAsOTksMSwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNCwKLSAgICAwLDAsMCw3MSwwLDAsMCwxMTUsNzUsMCwwLDAsMTE2LDAsMCwxMDYsCi0gICAgMSwwLDEwNiwyLDAsMTI0LDEsMCwxMDcsNSwwLDExNCw3MSwwLDEyNCwwLAotICAgIDAsMTA2LDMsMCwxMDAsNiwwLDEzMSwxLDAsMTE1LDQzLDAsMTAwLDMsMCwKLSAgICAxMjQsMCwwLDIzLDEyNSwwLDAsMTE2LDQsMCwxMjQsMCwwLDEwNiw1LDAsCi0gICAgMTI0LDIsMCwxNDAsMCwwLDEwMCw0LDAsMTE2LDAsMCwxMDYsNiwwLDEzMSwKLSAgICAxLDEsMSwxMDAsNSwwLDgzLDQxLDcsMTIyLDYxLDgwLDExNCwxMDUsMTEwLDExNiwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwzMiwxMTYsMTExLDMyLAotICAgIDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LDMyLDEwNSwxMDIsMzIsNDUsMTE4LDQ3LDgwLDg5LDg0LAotICAgIDcyLDc5LDc4LDg2LDY5LDgyLDY2LDc5LDgzLDY5LDMyLDEwNSwxMTUsMzIsMTE2LDExNywKLSAgICAxMTQsMTEwLDEwMSwxMDAsMzIsMTExLDExMCw0NiwyNTAsMSwzNSwyNTAsNywxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMjIsMiwzNSwzMiwxMTQsNTQsMCwwLDAsNzgsNDEsMiwKLSAgICAxMTQsOTksMCwwLDAsMTE0LDEwMCwwLDAsMCw0MSw3LDExNCw3LDAsMCwKLSAgICAwLDExNCw2NywwLDAsMCwyMTgsNywxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSwxMTQsCi0gICAgOSwwLDAsMCwyMTgsNSwxMTIsMTE0LDEwNSwxMTAsMTE2LDExNCw0NywwLDAsMCwKLSAgICAyMTgsNiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCw0MSwzLDExNCw3NSwwLDAsMCwxMTQsCi0gICAgOTgsMCwwLDAsMjE4LDQsOTcsMTE0LDEwMywxMTUsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE2LDk1LDExOCwxMDEsMTE0LDk4LAotICAgIDExMSwxMTUsMTAxLDk1LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDExMSwxLDAsMCwxMTUsCi0gICAgOCwwLDAsMCwwLDIsMTgsMSwxNSwxLDEwLDEsMTE0LDEwNSwwLDAsCi0gICAgMCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLAotICAgIDAsMCwzLDAsMCwwLDExNSw4NCwwLDAsMCwxMDAsMSwwLDEzNSwwLAotICAgIDAsMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDEsMCwxMjUsMSwwLAotICAgIDEyMSwxMywwLDExNiwwLDAsMTA2LDEsMCwxMjUsMiwwLDg3LDExMCwzMCwwLAotICAgIDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjYsMCwxLDEsMSwxMDAsNCwwLAotICAgIDEwMCw1LDAsMTMyLDAsMCwxMjUsMiwwLDg5LDExMCwxLDAsODgsMTI0LDIsCi0gICAgMCwxMjQsMSwwLDEzNiwwLDAsMTMxLDIsMCwxLDEyNCwxLDAsODMsNDEsCi0gICAgNiwxMjIsMjUyLDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsCi0gICAgMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEzLAotICAgIDExNywxMDEsMTE1LDExNiwxMDEsMTAwLDMyLDEwOSw5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSw5NywxMTAsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMiwxMDUsMTE0LDExNSwxMTYsCi0gICAgMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDQwLDExNSwxMDEsMTA4LDEwMiw0MSwKLSAgICAzMiwxMDksMTE3LDExNSwxMTYsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsMzIsOTUsMTEwLDk3LAotICAgIDEwOSwxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTksCi0gICAgMTExLDExMCwxMDAsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMTAsCi0gICAgMzIsMzIsMzIsMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwMSwxMDAsMzIsOTcsMTAzLDk3LAotICAgIDEwNSwxMTAsMTE1LDExNiw0NiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDEwOSwKLSAgICAxMTIsOTcsMTE0LDEwNSwxMTUsMTExLDExMCwzMiwxMDIsOTcsMTA1LDEwOCwxMTUsMzIsMTE2LDEwNCwKLSAgICAxMDEsMTEwLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwKLSAgICAxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsMCwKLSAgICAwLDMxLDAsMCwwLDExNSw4OSwwLDAsMCwxMjQsMSwwLDEwMCwwLDAsCi0gICAgMTA3LDgsMCwxMTQsMjQsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMTAsCi0gICAgNDYsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDcsMywwLDExNCw3MCwKLSAgICAwLDExNiwxLDAsMTAwLDEsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwKLSAgICAxMDIsMiwwLDIyLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsCi0gICAgMTM2LDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywwLDE0MiwKLSAgICAyLDAsODMsNDEsMyw3OCwxMjIsMzAsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsCi0gICAgMTExLDExNCwzMiwzNywxMTUsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTAsCi0gICAgMTAwLDEwOCwxMDEsMzIsMzcsMTE1LDIxOCw0LDExMCw5NywxMDksMTAxLDQxLDIsMTE0LDEwNiwKLSAgICAwLDAsMCwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsCi0gICAgNDEsNCwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDEwNiwwLDAsMCwxMTQsMTA0LDAsCi0gICAgMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSw0MSwxLDIxOCw2LDEwOSwxMDEsCi0gICAgMTE2LDEwNCwxMTEsMTAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxOSwKLSAgICA5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw5NSwxMTksMTE0LDk3LDExMiwKLSAgICAxMTIsMTAxLDExNCwxMjcsMSwwLDAsMTE1LDEyLDAsMCwwLDAsMSwxMiwxLAotICAgIDEyLDEsMTUsMSw2LDEsMjUsMSwxMjIsNDAsOTUsOTksMTA0LDEwMSw5OSwxMDcsCi0gICAgOTUsMTEwLDk3LDEwOSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LAotICAgIDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwxMTQsOTcsMTEyLDExMiwKLSAgICAxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDcsCi0gICAgMCwwLDAsODMsMCwwLDAsMTE1LDkyLDAsMCwwLDEyMCw2NiwwLDEwMCwKLSAgICAxLDAsMTAwLDIsMCwxMDAsMywwLDEwMCw0LDAsMTAzLDQsMCw2OCw5MywKLSAgICA0NiwwLDEyNSwyLDAsMTE2LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDIsCi0gICAgMCwxMTQsMTksMCwxMTYsMSwwLDEyNCwwLDAsMTI0LDIsMCwxMTYsMiwwLAotICAgIDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEzMSwzLDAsMSwxMTMsMTksMCwKLSAgICA4NywxMjQsMCwwLDEwNiwzLDAsMTA2LDQsMCwxMjQsMSwwLDEwNiwzLDAsCi0gICAgMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsNSw3OCwyMTgsMTAsOTUsOTUsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsCi0gICAgOTUsMjE4LDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwKLSAgICA3LDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LAotICAgIDExNiwxMTYsMTE0LDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsCi0gICAgMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCwKLSAgICA2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsCi0gICAgMTExLDEwOCwxMDAsMTE0LDUyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsOTcsMTEyLDEzOCwxLAotICAgIDAsMCwxMTUsOCwwLDAsMCwwLDEsMjUsMSwxNSwxLDI5LDEsMTIyLAotICAgIDI2LDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsCi0gICAgOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTksMTE0LDk3LDExMiw0MSwzLDIxOCwxMCw5NSwKLSAgICA5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTE0LDEyMCwwLDAsMCwyMTgsOSwKLSAgICA3OCw5NywxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCw0MSwzLDExNCwxMDksMCwwLDAsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCw0LDAsMCwwLDQxLAotICAgIDEsMTE0LDEwOSwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsOTksMTA0LAotICAgIDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsMTE5LDEsMCwwLDExNSwxNCwwLDAsCi0gICAgMCwwLDgsMjEsNywzLDEsMTMsMSwxMywyLDE3LDUsMTMsMSwxMTQsCi0gICAgMTIzLDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwKLSAgICAwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg0LDAsMCwwLDEyNCwwLAotICAgIDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSwyLDAsCi0gICAgMTI1LDMsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsODAsMCwxMTYsCi0gICAgMSwwLDEyNCwzLDAsMTMxLDEsMCwxMTQsODAsMCwxMDAsMiwwLDEyNSw0LAotICAgIDAsMTE2LDIsMCwxMDYsMywwLDEyNCw0LDAsMTA2LDQsMCwxMjQsMywwLAotICAgIDEwMCwzLDAsMjUsMTMxLDEsMCwxMTYsNSwwLDEzMSwyLDAsMSwxMjQsMiwKLSAgICAwLDgzLDQxLDQsMTIyLDE1NSw4NCwxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsCi0gICAgMTAwLDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiw5OCwxMjEsMzIsMTAwLDEwMSwxMDgsMTAxLDEwMyw5NywxMTYsMTA1LDExMCwKLSAgICAxMDMsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDAsNDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwKLSAgICAzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTAyLAotICAgIDk3LDExOCwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLAotICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDc4LDEyMiw0NCw3OCwxMTEsMTE2LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsCi0gICAgMTAzLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTIzLDEyNSw1OCwzMiwKLSAgICAxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LAotICAgIDExNCw1OSwwLDAsMCw0MSw2LDIxOCwxMSwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCwxMTQsMzEsMCwwLDAsMTE0LDYwLDAsMCwwLDExNCw2MSwKLSAgICAwLDAsMCwxMTQsNDcsMCwwLDAsMjE4LDEzLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCi0gICAgODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMyw0MSw1LDExNCwxMDgsMCwwLDAsMjE4LDgsCi0gICAgMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDIxOCw2LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMjE4LDgsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwyMTgsMywxMDksMTE1LDEwMywxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTcsCi0gICAgOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDQsMTA1LAotICAgIDEwOSwxNDcsMSwwLDAsMTE1LDEwLDAsMCwwLDAsMTAsMjEsMSwyNCwxLAotICAgIDYsMSwyOSwxLDExNCwxMzAsMCwwLDAsOTksNCwwLDAsMCwwLDAsCi0gICAgMCwwLDExLDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwyNDAsCi0gICAgMSwwLDAsMTA1LDAsMCwxMjUsNCwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsCi0gICAgOSwwLDExNCwzMSwwLDEyNCwyLDAsMTI0LDQsMCwxMDAsMiwwLDYwLDExMCwKLSAgICA2LDAsMTAwLDMsMCwxMjUsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMDcsOSwKLSAgICAwLDExNCw1OSwwLDEyNCwzLDAsMTI0LDQsMCwxMDAsNCwwLDYwLDEyNCwwLAotICAgIDAsMTAwLDEsMCwxMDAsNSwwLDEzMywyLDAsMjUsMTI1LDUsMCwxMjQsMCwKLSAgICAwLDEwMCw1LDAsMTAwLDYsMCwxMzMsMiwwLDI1LDEyNSw2LDAsMTI0LDAsCi0gICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMzLDIsMCwyNSwxMjUsNywwLDEyNCw1LAotICAgIDAsMTE2LDAsMCwxMDcsMywwLDExNCwxNjgsMCwxMDAsOCwwLDEwNiwxLDAsCi0gICAgMTI0LDIsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LDgsMCwxMTYsMiwwLDEwMCwKLSAgICA5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LDMsMCwxMjQsOCwwLDEyNCwKLSAgICA0LDAsMTQxLDEsMCwxMzAsMSwwLDExMCwxMTksMCwxMTYsNCwwLDEyNCw2LAotICAgIDAsMTMxLDEsMCwxMDAsNSwwLDEwNywzLDAsMTE0LDIyOSwwLDEwMCwxMCwwLAotICAgIDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsCi0gICAgOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiw1LDAsMTI0LDgsMCwxMzEsCi0gICAgMSwwLDEzMCwxLDAsMTEwLDU4LDAsMTE2LDQsMCwxMjQsNywwLDEzMSwxLAotICAgIDAsMTAwLDUsMCwxMDcsMywwLDExNCwzMSwxLDEwMCwxMSwwLDEwNiwxLDAsCi0gICAgMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwxMDAsOSwwLDEyNCwKLSAgICA4LDAsMTMxLDIsMCwxLDExNiw1LDAsMTI0LDgsMCwxMzEsMSwwLDEzMCwKLSAgICAxLDAsMTI0LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDIyNiwxLDEyMSwyMCwKLSAgICAwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTIsMCwyNSwxMzEsMSwwLDEyNSw5LAotICAgIDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCw4MywxLDEsCi0gICAgMSwxLDg5LDExMCw2MiwwLDg4LDExNiw4LDAsMTI0LDYsMCwxMzEsMSwwLAotICAgIDEyNCw5LDAsMTA3LDMsMCwxMTQsMTQ1LDEsMTAwLDEzLDAsMTA2LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwxLDAsMTI1LDgsMCwxMTYsMiwwLDEwMCw5LDAsMTI0LDgsCi0gICAgMCwxMzEsMiwwLDEsMTE2LDMsMCwxMjQsOCwwLDEyNCw0LDAsMTQxLDEsCi0gICAgMCwxMzAsMSwwLDEyMSwxOCwwLDEyNCwxLDAsMTAwLDE0LDAsMjUsMTAwLDE1LAotICAgIDAsNjQsMTI1LDEwLDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLAotICAgIDExNCwxODMsMSwxLDEsMSw4OSwxMTAsNDMsMCw4OCwxMTYsOCwwLDEyNCw3LAotICAgIDAsMTMxLDEsMCwxMjQsMTAsMCwxMDcsMywwLDExNCwyMjYsMSwxMTYsMywwLAotICAgIDEwMCwxMywwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNCw0LDAsMTQxLAotICAgIDEsMCwxMzAsMSwwLDEyNCwwLDAsMTAwLDcsMCwxMDAsMSwwLDEzMywyLAotICAgIDAsMjUsODMsNDEsMTYsOTcsMTIyLDEsMCwwLDg2LDk3LDEwOCwxMDUsMTAwLDk3LAotICAgIDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTAyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsNDUsMTA1LDExMCwzMiw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDMyLAotICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LDMyLDQwLDEwNSwxMDIsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCw0MSwzMiw5NywxMTAsMTAwLDMyLAotICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwKLSAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDk3LDExMCwzMiwKLSAgICA5OCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OSwKLSAgICAxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwKLSAgICAxMDgsMTA4LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsCi0gICAgMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwKLSAgICAxMTAsMTA0LDk3LDExMCw5OSwxMDEsMzIsMTAxLDExNCwxMTQsMTExLDExNCwzMiwxMTQsMTAxLDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LAotICAgIDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSw5NywxMDMsMTA1LAotICAgIDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDExMSwKLSAgICAxMTQsMTE0LDEwMSw5OSwxMTYsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTEsMTE3LAotICAgIDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTE1LDExNiw5NywxMDgsMTAxLDQ2LDMyLAotICAgIDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LAotICAgIDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsCi0gICAgMzIsMTA1LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDEwLAotICAgIDMyLDMyLDMyLDMyLDExNiwxMTQsMTE3LDExMCw5OSw5NywxMTYsMTAxLDEwMCw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw3OCwxMTQsMTA2LDAsMCwwLDEyMiwxMCw2MCw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSw2MiwxMTQsMzUsMCwwLDAsMTE0LDEyLDAsMCwwLAotICAgIDIzMyw4LDAsMCwwLDIzMywxMiwwLDAsMCwxMjIsMzAsOTgsOTcsMTAwLDMyLAotICAgIDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExMCwzMiwKLSAgICAxMjMsMzMsMTE0LDEyNSw1OCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsMiwxMjMsMTI1LDEyMiw0MywKLSAgICAxMTQsMTAxLDk3LDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwKLSAgICAxMDEsMzIsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsCi0gICAgOTcsMTA5LDExMiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDEyMiw0OCwxMTQsMTAxLDk3LAotICAgIDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsMTE0LAotICAgIDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE1LDEwNSwxMjIsMTAxLDMyLDExMSwxMDIsMzIsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDIxOCw1LDEwOSwKLSAgICAxMTYsMTA1LDEwOSwxMDEsMTIyLDI2LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwNSwKLSAgICAxMTUsMzIsMTE1LDExNiw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMywzMywxMTQsMTI1LAotICAgIDIxOCw0LDExNSwxMDUsMTIyLDEwMSwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwxMjcsMywKLSAgICAwLDQxLDksMjE4LDEyLDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LAotICAgIDgyLDExNCw0NywwLDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxMDcsMCwwLDAsCi0gICAgMTE0LDMxLDAsMCwwLDIxOCw4LDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsCi0gICAgMTQsMCwwLDAsMjE4LDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDE5LAotICAgIDAsMCwwLDQxLDExLDExNCw1MywwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwKLSAgICAwLDAsOTAsMTEsMTAxLDEyMCw5OSw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCwKLSAgICA1LDEwOSw5NywxMDMsMTA1LDk5LDkwLDEzLDExNCw5NywxMTksOTUsMTE2LDEwNSwxMDksMTAxLAotICAgIDExNSwxMTYsOTcsMTA5LDExMiw5MCw4LDExNCw5NywxMTksOTUsMTE1LDEwNSwxMjIsMTAxLDExNCwKLSAgICA3NSwwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDksMTE2LDEwNSwKLSAgICAxMDksMTAxLDIxOCwxMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMjUsCisgICAgMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDc4LDEyMiwzNiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLAorICAgIDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsOTcsMTAzLAorICAgIDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMTIyLDM3LDEyMywxMjUsMzIsMTEwLDExMSwxMTYsCisgICAgMzIsOTgsMTExLDExNiwxMTYsMTExLDEwOSw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwMCwxMDUsCisgICAgMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsCisgICAgNTksMCwwLDAsMTE0LDU3LDAsMCwwLDIzMywzLDAsMCwwLDEyMiwzMywKKyAgICAxMDEsMTIwLDExMiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsMTExLDExMCwxMDgsMTIxLDMyLDUwLDMyLAorICAgIDExMSwxMTQsMzIsNTEsMzIsMTAwLDExMSwxMTYsMTE1LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwKKyAgICAxMjUsMTIyLDU3LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsCisgICAgMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCwKKyAgICA5NywxMDksMTAxLDMyLDEwMCwxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTUsMTE2LDk3LAorICAgIDExNCwxMTYsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDEyMywzMywxMTQsMTI1LDEyMiw1MiwxMTEsMTEyLAorICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsCisgICAgMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTAsMzIsCisgICAgOTcsMTA4LDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE4LDk3LDEwOCwKKyAgICAxMTcsMTAxLDExNCw2MCwwLDAsMCw2MiwyLDAsMCwwLDExNCw1NywwLDAsCisgICAgMCwxMTQsODEsMCwwLDAsMjMzLDI1NCwyNTUsMjU1LDI1NSw0MSwxNywxMTQsNywwLAorICAgIDAsMCwxMTQsNjUsMCwwLDAsMTE0LDY2LDAsMCwwLDExNCw2NywwLDAsCisgICAgMCwxMTQsMzgsMCwwLDAsMTE0LDc0LDAsMCwwLDExNCw3MiwwLDAsMCwKKyAgICAxMTQsNDgsMCwwLDAsMjE4LDUsOTksMTExLDExNywxMTAsMTE2LDExNCwzNCwwLDAsCisgICAgMCwxMTQsOSwwLDAsMCwxMTQsNzMsMCwwLDAsMTE0LDMxLDAsMCwwLAorICAgIDExNCw3MSwwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLAorICAgIDExNCwyOCwwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksOTUsODMsODUsCisgICAgNzAsNzAsNzMsODgsNjksODMsNDEsOCwxMTQsMzUsMCwwLDAsMTE0LDc3LDAsCisgICAgMCwwLDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsMTA1LDEwOCwxMDEsCisgICAgMTEwLDk3LDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsOTAsOSwxMDAsCisgICAgMTExLDExNiw5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDU4LDAsMCwwLDkwLDksMTExLAorICAgIDExMiwxMTYsOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsMTAxLDk1LDEwMiwKKyAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNSwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDIsCisgICAgMTE0LDExMSwxMDksOTUsOTksOTcsOTksMTA0LDEwMSwzNywxLDAsMCwxMTUsNDQsMCwKKyAgICAwLDAsMCw5LDEyLDEsOCwxLDEyLDEsMTIsMSw4LDEsNiwxLAorICAgIDEwLDEsMTAsMSw4LDEsNiwxLDEwLDEsOCwxLDE2LDEsMTAsMSwKKyAgICA2LDEsOCwxLDE2LDEsOCwxLDYsMSw4LDEsMTQsMSwxMTQsODYsCisgICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCisgICAgMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyOCwwLDAsMCwxMTYsMCwxMjQsCisgICAgMCwxMzEsMSwxMDAsMSwxMDcsMiwxMTQsMTYsMTAwLDIsODMsMCwxMjQsMCwxMDYsCisgICAgMSwxMDAsMywxMzEsMSw5MiwzLDEyNSwxLDEyNSwyLDEyNSwzLDEyNCwxLDEyLAorICAgIDAsMTE1LDU4LDEyNCwzLDEwNiwyLDEzMSwwLDEwMCw3LDEwMCw4LDEzMywyLDI1LAorICAgIDAsMTAwLDYsMTA3LDMsMTE0LDYyLDEyNCwwLDgzLDAsMTIxLDEyLDExNiwzLDEyNCwKKyAgICAwLDEzMSwxLDEyNSw0LDg3LDAsMTEwLDM2LDQsMCwxMTYsNCwxMTYsNSwxMDIsCisgICAgMiwxMDcsMTAsMTE0LDExMCwxLDAsMSwwLDEsMCwxMjQsMCwxMDAsMiwxMDAsCisgICAgOSwxMzMsMiwyNSwwLDEyNSw0LDg5LDAsMTEwLDIsODgsMCwxMTYsNiwxMjQsCisgICAgNCwxMzEsMSwxMTQsMTI0LDEyNCw0LDgzLDAsMTI0LDAsODMsMCw0MSwxMCwxMjIsCisgICAgMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsCisgICAgMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsNDEsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLAorICAgIDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsMTE0LDEwMSwxMDgsMTIxLDMyLDEwMiwKKyAgICAxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCwxMTUsNDUsOTksMTExLDEwOSwKKyAgICAxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLDMyLDEwMiwxMTEsMTE0LDEwLDMyLAorICAgIDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDk1LDY5LDEyMCwxMDEsOTksCisgICAgNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4NywxMDUsMTE2LDEwNCw3MCwxMDUsCisgICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsNjAsMCwKKyAgICAwLDAsNzgsMTE0LDU5LDAsMCwwLDExNCw4MSwwLDAsMCwxMTQsMjksMCwKKyAgICAwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwyNTUsMjMzLDI1NSwyNTUsMjU1LDI1NSwKKyAgICAxMTQsODgsMCwwLDAsNDEsNywxMTQsMzEsMCwwLDAsMTE0LDMyLDAsMCwKKyAgICAwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg2LDAsMCwwLDExNCw2NywwLAorICAgIDAsMCwxMTQsNzIsMCwwLDAsMTE0LDQ0LDAsMCwwLDQxLDUsMjE4LDEzLAorICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCw3OSwwLAorICAgIDAsMCwxMTQsMzYsMCwwLDAsOTAsOSwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCisgICAgMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTUsCisgICAgOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMDIsMTA1LDEwOCwxMDEsNzAsCisgICAgMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywxMiwxLDQsMSwxNiwxLAorICAgIDI2LDEsNCwxLDIsMSwxMiwxLDE4LDEsMTgsMSwxMTQsOTIsMCwwLAorICAgIDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMTEsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDc0LDAsMCwwLDEyNCwwLDEwNiwwLDExNiwKKyAgICAxLDExNiwyLDEzMSwxLDEzMSwxLDExNCw0NiwxMjEsOCwxMTYsMywxMjQsMCwxMzEsCisgICAgMSw4MywwLDQsMCwxMTYsNCwxMDcsMTAsMTE0LDQyLDEsMCwxLDAsMSwKKyAgICAwLDg5LDAsMTEzLDcwLDg4LDAsMTEwLDI0LDEyNCwwLDEwNiwwLDExNiwxLDExNiwKKyAgICA1LDEzMSwxLDEzMSwxLDExNCw2NiwxMjQsMCw4MywwLDExMCw0LDEwMCwwLDgzLAorICAgIDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDYsMjE4LDgsMTAxLDExMCwxMDAsMTE1LAorICAgIDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNCw4NSwwLDAsMCwKKyAgICAxMTQsODAsMCwwLDAsMTE0LDY3LDAsMCwwLDExNCw3NSwwLDAsMCw0MSwKKyAgICAxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsOTUsMTAzLDEwMSwxMTYsCisgICAgOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsODksMSwwLDAsMTE1LDE2LDAsMCwwLAorICAgIDAsMSwxNCwxLDIsMSw4LDEsMTQsMSw4LDEsMTQsMSw2LDIsCisgICAgMTE0LDk2LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw1MiwwLDAsMCwxMjEsCisgICAgMTQsMTE2LDAsMTI0LDAsMTMxLDEsMTA2LDEsMTI1LDEsODcsMCwxMTAsMjQsNCwKKyAgICAwLDExNiwyLDEwNywxMCwxMTQsMzgsMSwwLDEsMCwxLDAsMTAwLDEsMTI1LAorICAgIDEsODksMCwxMTAsMiw4OCwwLDEyNCwxLDEwMCwyLDc5LDAsMTI1LDEsMTI0LAorICAgIDEsODMsMCw0MSwzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwKKyAgICAxMTUsMTA1LDExMSwxMTAsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LDEyMSwxMTYsMTAxLAorICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsMCwwLDIzMywKKyAgICAxMjgsMCwwLDAsNDEsMywxMTQsMzksMCwwLDAsMTE0LDQxLDAsMCwwLAorICAgIDExNCw0MCwwLDAsMCw0MSwyLDExNCwzNSwwLDAsMCwxMTQsNDIsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMjE4LDEwLDk1LDk5LDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsMTAxLDEsMCwwLAorICAgIDExNSwxMiwwLDAsMCwwLDIsMiwxLDE0LDEsMTQsMSwxMCwzLDgsCisgICAgMSwxMTQsOTgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsCisgICAgMCwwLDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsNjgsMCwwLDAsCisgICAgMTAwLDYsMTM1LDAsMTAyLDEsMTAwLDIsMTAwLDMsMTMyLDksMTI1LDEsMTIxLDEwLAorICAgIDExNiwwLDEwNiwxLDEyNSwyLDg3LDAsMTEwLDI4LDQsMCwxMTYsMiwxMDcsMTAsCisgICAgMTE0LDUyLDEsMCwxLDAsMSwwLDEwMCw0LDEwMCw1LDEzMiwwLDEyNSwyLAorICAgIDg5LDAsMTEwLDIsODgsMCwxMjQsMiwxMjQsMSwxMzYsMCwxMzEsMiwxLDAsCisgICAgMTI0LDEsODMsMCw0MSw3LDEyMiwyNTIsNjgsMTAxLDk5LDExMSwxMTQsOTcsMTE2LDExMSwKKyAgICAxMTQsMzIsMTE2LDExMSwzMiwxMTgsMTAxLDExNCwxMDUsMTAyLDEyMSwzMiwxMTYsMTA0LDk3LDExNiwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCwxMDEsMTA1LDExMCwKKyAgICAxMDMsMzIsMTE0LDEwMSwxMTMsMTE3LDEwMSwxMTUsMTE2LDEwMSwxMDAsMzIsMTA5LDk3LDExNiw5OSwKKyAgICAxMDQsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMCwKKyAgICAzMiwzMiwzMiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDk3LDExMCwzMiwxMDQsCisgICAgOTcsMTEwLDEwMCwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgMTAyLDEwNSwxMTQsMTE1LDExNiwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsNDAsCisgICAgMTE1LDEwMSwxMDgsMTAyLDQxLDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLAorICAgIDEwMSwzMiw5NSwxMTAsOTcsMTA5LDEwMSwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTE1LDEwMSw5OSwxMTEsMTEwLDEwMCwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwKKyAgICAxMTYsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiw5OSwxMTEsMTA5LDExMiw5NywxMTQsMTAxLAorICAgIDEwMCwzMiw5NywxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDQ2LDMyLDczLDEwMiwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiw5OSwxMTEsMTA5LDExMiw5NywxMTQsMTA1LDExNSwxMTEsMTEwLDMyLDEwMiw5NywxMDUsCisgICAgMTA4LDExNSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsCisgICAgMTE0LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLAorICAgIDMyLDMyLDMyLDMyLDc4LDk5LDIsMCwwLDAsMCwwLDAsMCw0LDAsCisgICAgMCwwLDUsMCwwLDAsMzEsMCwwLDAsMTE1LDY0LDAsMCwwLDEyNCwKKyAgICAxLDEwMCwwLDEwNyw4LDExNCwxNiwxMjQsMCwxMDYsMCwxMjUsMSwxMTAsMzQsMTI0LAorICAgIDAsMTA2LDAsMTI0LDEsMTA3LDMsMTE0LDUwLDExNiwxLDEwMCwxLDEyNCwwLDEwNiwKKyAgICAwLDEyNCwxLDEwMiwyLDIyLDAsMTAwLDIsMTI0LDEsMTQ0LDEsMTMxLDEsMTMwLAorICAgIDEsMTM2LDAsMTI0LDAsMTI0LDEsMTI0LDIsMTI0LDMsMTQyLDIsODMsMCw0MSwKKyAgICAzLDc4LDEyMiwzMCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDM3LAorICAgIDExNSwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwzMiwKKyAgICAzNywxMTUsMjE4LDQsMTEwLDk3LDEwOSwxMDEsNDEsMiwxMTQsOTksMCwwLDAsMjE4LAorICAgIDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDQxLDQsMjE4LDQsCisgICAgMTE1LDEwMSwxMDgsMTAyLDExNCw5OSwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSw5MCwKKyAgICA2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsMSwyMTgsNiwxMDksMTAxLDExNiwxMDQsMTExLAorICAgIDEwMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTksOTUsOTksMTA0LAorICAgIDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsCisgICAgMTIxLDEsMCwwLDExNSwxMiwwLDAsMCwwLDEsOCwxLDgsMSwxMCwKKyAgICAxLDQsMSwyMCwxLDEyMiw0MCw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsCisgICAgMTA5LDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsOTksMTA0LDEwMSwKKyAgICA5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCwKKyAgICA4MywwLDAsMCwxMTUsNjAsMCwwLDAsMTIwLDQwLDEwMCw1LDY4LDAsOTMsCisgICAgMzIsMTI1LDIsMTE2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTE0LDYsMTE2LDEsMTI0LAorICAgIDAsMTI0LDIsMTE2LDIsMTI0LDEsMTI0LDIsMTMxLDIsMTMxLDMsMSwwLDExMywKKyAgICA2LDg3LDAsMTI0LDAsMTA2LDMsMTA2LDQsMTI0LDEsMTA2LDMsMTMxLDEsMSwKKyAgICAwLDEwMCwwLDgzLDAsNDEsNiw3OCwyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLAorICAgIDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LAorICAgIDEwMCwxMTEsOTksOTUsOTUsNDEsNCwxMjIsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsOTUsOTUsMTIyLDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMTIyLDEyLDk1LAorICAgIDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiw3LDk1LDk1LDEwMCwKKyAgICAxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LDIxOCwKKyAgICA3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwxMTYsCisgICAgMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsMTAwLAorICAgIDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsMTE0LAorICAgIDUzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsOTcsMTEyLDEzMiwxLDAsMCwxMTUsOCwKKyAgICAwLDAsMCwwLDEsMTAsMSwxMCwxLDIyLDEsMTIyLDI2LDk1LDk5LDEwNCwKKyAgICAxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSwKKyAgICA2Miw0Niw5NSwxMTksMTE0LDk3LDExMiw0MSwxLDc4LDQxLDMsMjE4LDEwLDk1LDk4LAorICAgIDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTQsMTE0LDAsMCwwLDIxOCw5LDc4LAorICAgIDk3LDEwOSwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDQxLDMsMTE0LDEwMywwLDAsMCwxMTQsCisgICAgMTA0LDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwKKyAgICAxMTQsMTAzLDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSw5OSwxMDQsMTAxLAorICAgIDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwxMTMsMSwwLDAsMTE1LDE0LDAsMCwwLAorICAgIDAsOCwxNCw3LDIsMSwxMCwxLDE0LDIsMTQsNSwxMCwxLDExNCwxMTcsCisgICAgMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCisgICAgNCwwLDAsMCw2NywwLDAsMCwxMTUsNjAsMCwwLDAsMTI0LDAsMTA2LAorICAgIDAsMTI0LDEsMTMxLDEsOTIsMiwxMjUsMiwxMjUsMywxMjQsMiwxMDAsMSwxMDcsCisgICAgOCwxMTQsNTYsMTE2LDEsMTI0LDMsMTMxLDEsMTE0LDU2LDEwMCwyLDEyNSw0LDExNiwKKyAgICAyLDEwNiwzLDEyNCw0LDEwNiw0LDEyNCwzLDEwMCwzLDI1LDAsMTMxLDEsMTE2LAorICAgIDUsMTMxLDIsMSwwLDEyNCwyLDgzLDAsNDEsNCwxMjIsMTU1LDg0LDExNCwxMjEsCisgICAgMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLAorICAgIDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDEyMSwzMiwxMDAsMTAxLAorICAgIDEwOCwxMDEsMTAzLDk3LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLAorICAgIDExNSwxMDEsMTA4LDEwMiw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAorICAgIDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMDIsOTcsMTE4LDExMSwxMTQsMzIsMTExLDEwMiwzMiwxMDIsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsCisgICAgNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDQ0LDc4LDExMSwxMTYsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsCisgICAgMTE0LDEyMSwzMiwxMjMsMTI1LDU4LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiw5NSwKKyAgICA5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsMTE0LDYwLDAsMCwwLDQxLDYsMjE4LDExLAorICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwzMSwwLDAsMCwKKyAgICAxMTQsNjEsMCwwLDAsMTE0LDYyLDAsMCwwLDExNCw0OCwwLDAsMCwyMTgsCisgICAgMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDQxLDUsCisgICAgMTE0LDEwMSwwLDAsMCwyMTgsOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMjE4LAorICAgIDYsMTA4LDExMSw5NywxMDAsMTAxLDExNCwyMTgsOCwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsCisgICAgMTE1LDIxOCwzLDEwOSwxMTUsMTAzLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw1LDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDE0MSwxLDAsMCwxMTUsMTAsMCwwLAorICAgIDAsMCwxMCwxNCwxLDE2LDEsNCwxLDIyLDEsMTE0LDEyNCwwLDAsMCwKKyAgICA5OSw0LDAsMCwwLDAsMCwwLDAsMTEsMCwwLDAsMTksMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDEyOCwxLDAsMCwxMDUsMCwxMjUsNCwxMjQsMiwKKyAgICAxMDAsMSwxMDcsOSwxMTQsMjIsMTI0LDIsMTI0LDQsMTAwLDIsNjAsMCwxMTAsNCwKKyAgICAxMDAsMywxMjUsMiwxMjQsMywxMDAsMSwxMDcsOSwxMTQsNDIsMTI0LDMsMTI0LDQsCisgICAgMTAwLDQsNjAsMCwxMjQsMCwxMDAsMSwxMDAsNSwxMzMsMiwyNSwwLDEyNSw1LAorICAgIDEyNCwwLDEwMCw1LDEwMCw2LDEzMywyLDI1LDAsMTI1LDYsMTI0LDAsMTAwLDYsCisgICAgMTAwLDcsMTMzLDIsMjUsMCwxMjUsNywxMjQsNSwxMTYsMCwxMDcsMywxMTQsMTIyLAorICAgIDEwMCw4LDEwNiwxLDEyNCwyLDEyNCw1LDEzMSwyLDEyNSw4LDExNiwyLDEwNiwzLAorICAgIDEwMCw5LDEyNCw4LDEzMSwyLDEsMCwxMTYsNCwxMjQsOCwxMjQsNCwxNDEsMSwKKyAgICAxMzAsMSwxMTAsODYsMTE2LDUsMTI0LDYsMTMxLDEsMTAwLDUsMTA3LDMsMTE0LDE2NiwKKyAgICAxMDAsMTAsMTA2LDEsMTI0LDIsMTMxLDEsMTI1LDgsMTE2LDIsMTA2LDMsMTAwLDksCisgICAgMTI0LDgsMTMxLDIsMSwwLDExNiw2LDEyNCw4LDEzMSwxLDEzMCwxLDExMCw0MiwKKyAgICAxMTYsNSwxMjQsNywxMzEsMSwxMDAsNSwxMDcsMywxMTQsMjA4LDEwMCwxMSwxMDYsMSwKKyAgICAxMjQsMiwxMzEsMSwxMjUsOCwxMTYsMiwxMDYsMywxMDAsOSwxMjQsOCwxMzEsMiwKKyAgICAxLDAsMTE2LDYsMTI0LDgsMTMxLDEsMTMwLDEsMTI0LDEsMTAwLDEsMTA3LDksCisgICAgMTQ0LDEsMTE0LDExNiwxMjEsMTYsMTE2LDcsMTI0LDEsMTAwLDEyLDI1LDAsMTMxLDEsCisgICAgMTI1LDksODcsMCwxMTAsMjAsNCwwLDExNiw4LDEwNywxMCwxMTQsMjU0LDEsMCwKKyAgICAxLDAsMSwwLDg5LDAsMTEwLDQ4LDg4LDAsMTE2LDksMTI0LDYsMTMxLDEsCisgICAgMTI0LDksMTA3LDMsMTQ0LDEsMTE0LDQ2LDEwMCwxMywxMDYsMSwxMjQsMiwxMzEsMSwKKyAgICAxMjUsOCwxMTYsMiwxMDYsMywxMDAsOSwxMjQsOCwxMzEsMiwxLDAsMTE2LDQsCisgICAgMTI0LDgsMTI0LDQsMTQxLDEsMTMwLDEsMTIxLDE2LDEyNCwxLDEwMCwxNCwyNSwwLAorICAgIDEwMCwxNSw2NCwwLDEyNSwxMCw4NywwLDExMCwyMiw0LDAsMTE2LDgsMTA3LDEwLAorICAgIDE0NCwxLDExNCw4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwzMiw4OCwwLAorICAgIDExNiw5LDEyNCw3LDEzMSwxLDEyNCwxMCwxMDcsMywxNDQsMSwxMTQsMTE2LDExNiw0LAorICAgIDEwMCwxMywxMDYsMSwxMjQsMiwxMzEsMSwxMjQsNCwxNDEsMSwxMzAsMSwxMjQsMCwKKyAgICAxMDAsNywxMDAsMSwxMzMsMiwyNSwwLDgzLDAsNDEsMTYsOTcsMTIyLDEsMCwKKyAgICAwLDg2LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA0LDEwMSwKKyAgICA5NywxMDAsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTUsMTE1LAorICAgIDEwMSwxMDAsNDUsMTA1LDExMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywKKyAgICAxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiwKKyAgICA5NywxMTYsMTE1LDMyLDQwLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTAzLDEwNSwxMTgsMTAxLAorICAgIDExMCw0MSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwNSwxMTAsMTAzLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDExNiwxMDQsCisgICAgOTcsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwKKyAgICAxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw2NSwxMDgsMTA4LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMzIsCisgICAgOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDExNywxMTUsCisgICAgMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMTAsMTA0LDk3LDExMCw5OSwxMDEsMzIsMTAxLDExNCwKKyAgICAxMTQsMTExLDExNCwzMiwxMTQsMTAxLDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMyw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwKKyAgICAxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsCisgICAgMTA1LDExNSwzMiwxMDUsMTEwLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMzIsMTExLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDEwLAorICAgIDMyLDMyLDMyLDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsCisgICAgMTE1LDExNiw5NywxMDgsMTAxLDQ2LDMyLDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwzMiwKKyAgICAxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTA1LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLAorICAgIDMyLDExNiwxMTEsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMTQsMTE3LDExMCw5OSwKKyAgICA5NywxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMTQsOTksMCwwLAorICAgIDAsMTIyLDEwLDYwLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDYyLDExNCwzNSwwLAorICAgIDAsMCwxMTQsMTIsMCwwLDAsMjMzLDgsMCwwLDAsMjMzLDEyLDAsMCwKKyAgICAwLDEyMiwzMCw5OCw5NywxMDAsMzIsMTA5LDk3LDEwMywxMDUsOTksMzIsMTEwLDExNywxMDksCisgICAgOTgsMTAxLDExNCwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsCisgICAgMTI1LDEyMiwyLDEyMywxMjUsMTIyLDQzLDExNCwxMDEsOTcsOTksMTA0LDEwMSwxMDAsMzIsNjksCisgICAgNzksNzAsMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywKKyAgICAzMiwxMTYsMTA1LDEwOSwxMDEsMTE1LDExNiw5NywxMDksMTEyLDMyLDEwNSwxMTAsMzIsMTIzLDMzLAorICAgIDExNCwxMjUsMTIyLDQ4LDExNCwxMDEsOTcsOTksMTA0LDEwMSwxMDAsMzIsNjksNzksNzAsMzIsCisgICAgMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiwxMTQsMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsMTA1LAorICAgIDEyMiwxMDEsMzIsMTExLDEwMiwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwNSwxMTAsMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMjE4LDUsMTA5LDExNiwxMDUsMTA5LDEwMSwxMjIsMjYsOTgsMTIxLDExNiwKKyAgICAxMDEsOTksMTExLDEwMCwxMDEsMzIsMTA1LDExNSwzMiwxMTUsMTE2LDk3LDEwOCwxMDEsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsMTIzLDMzLDExNCwxMjUsMjE4LDQsMTE1LDEwNSwxMjIsMTAxLDEwOCwzLDAsCisgICAgMCwwLDI1NSwxMjcsMjU1LDEyNywzLDAsNDEsMTAsMjE4LDEyLDc3LDY1LDcxLDczLAorICAgIDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCw0OCwwLDAsMCwxMTQsMTE1LDAsCisgICAgMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LDEwMSw5NSwxMDksMTAxLDExNSwKKyAgICAxMTUsOTcsMTAzLDEwMSwxMTQsMTAwLDAsMCwwLDExNCwzMSwwLDAsMCwyMTgsOCwKKyAgICA2OSw3OSw3MCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDE0LDAsMCwwLDIxOCw4LDc1LAorICAgIDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwxOSwwLDAsMCw0MSwxMSwxMTQsNTQsCisgICAgMCwwLDAsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsCisgICAgMTE1LDExNCw5OSwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsMTEsMTAxLDEyMCw5OSwKKyAgICA5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCw1LDEwOSw5NywxMDMsMTA1LDk5LDkwLAorICAgIDEzLDExNCw5NywxMTksOTUsMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsOTcsMTA5LDExMiw5MCw4LAorICAgIDExNCw5NywxMTksOTUsMTE1LDEwNSwxMjIsMTAxLDExNCw3NiwwLDAsMCwyMTgsMTIsMTE1LAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDIxOCwxMSwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDk1LDExNSwxMDUsMTIyLDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMjUsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LAorICAgIDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsCisgICAgMTAxLDExNCwxNTgsMSwwLDAsMTE1LDc2LDAsMCwwLDAsMTEsNCwxLDgsCisgICAgMSwxMCwzLDQsMSw4LDEsOCwxLDEyLDEsMTIsMSwxMiwxLDgsCisgICAgMSwxMiwxLDEyLDEsMTIsMSwxMiwxLDEwLDEsMTIsMSwxMCwxLDEyLAorICAgIDEsMTAsMSwxMiwxLDgsMSwxMCwxLDIsMSwxNiwxLDE0LDEsNiwKKyAgICAyLDE0LDEsMTAsMSwxMiwxLDEwLDEsMiwxLDE2LDEsMTYsMSw2LAorICAgIDIsMTQsMSwxMCwxLDYsMSwxMTQsMTM2LDAsMCwwLDk5LDQsMCwwLAorICAgIDAsMCwwLDAsMCw1LDAsMCwwLDYsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDg2LDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEzMSwxLDEyNSw0LAorICAgIDExNiwyLDEyNCw0LDExNiwzLDEzMSwyLDExNCw1OCwxMTYsNCwxMDYsNSwxMDAsMSwKKyAgICAxMjQsMiwxMzEsMiwxLDAsMTI0LDMsMTAwLDIsMTA3LDksMTE0LDUyLDExNiw2LAorICAgIDEwNiw3LDEyNCw0LDEyNCwzLDEzMSwyLDEsMCwxMjQsNCw4MywwLDExMCwyNCwKKyAgICAxMTYsOCwxMDAsMywxMDYsOSwxMjQsMiwxMzEsMSwxMDAsNCwxMjQsMSwxMDAsNSwKKyAgICAxMjQsMiwxNDQsMiwxMzEsMSwxMzAsMSwxMDAsMiw4MywwLDQxLDYsMTIyLDYwLAorICAgIDY3LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLAorICAgIDMyLDk3LDExNSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiwKICAgICA5NSwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCi0gICAgMTAwLDEwMSw5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDE2NCwxLDAsMCwxMTUsNzYsMCwKLSAgICAwLDAsMCwxMSw2LDEsMTIsMSwxMywzLDYsMSwxMiwxLDEwLDEsCi0gICAgMTYsMSwxNiwxLDE2LDEsMTIsMSwxOCwxLDEzLDEsMTgsMSwxOCwxLAotICAgIDE1LDEsMTMsMSwxNSwxLDE4LDEsMTUsMSwxMywxLDEyLDEsMTIsMSwKLSAgICAzLDEsMjAsMSwxMywxLDUsMiwxOCwxLDE1LDEsMTMsMSwxNSwxLAotICAgIDMsMSwxOCwxLDEzLDEsNSwyLDE4LDEsMTUsMSw5LDEsMTE0LDE0MSwKLSAgICAwLDAsMCw5OSw0LDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwKLSAgICA2LDAsMCwwLDY3LDAsMCwwLDExNSwxMTIsMCwwLDAsMTE2LDAsMCwKLSAgICAxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsNCwwLDExNiwyLDAsMTI0LAotICAgIDQsMCwxMTYsMywwLDEzMSwyLDAsMTE0LDc1LDAsMTE2LDQsMCwxMDAsMSwKLSAgICAwLDEyNCwyLDAsMTMxLDIsMCwxLDEyNCwzLDAsMTAwLDIsMCwxMDcsOSwKLSAgICAwLDExNCw3MSwwLDExNiw1LDAsMTA2LDYsMCwxMjQsNCwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCwxLDEyNCw0LDAsODMsMTE2LDcsMCwxMDAsMywwLDEwNiw4LAotICAgIDAsMTI0LDIsMCwxMzEsMSwwLDEwMCw0LDAsMTI0LDEsMCwxMDAsNSwwLAotICAgIDEyNCwyLDAsMTMxLDEsMiwxMzAsMSwwLDEwMCwyLDAsODMsNDEsNiwxMjIsCi0gICAgNjAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwKLSAgICAxMDEsMzIsOTcsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsMTIxLAotICAgIDMyLDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LAotICAgIDExMSwxMDAsMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsNDAsNDEsNDYsMTIyLDIxLDk5LAotICAgIDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsCi0gICAgMTIzLDMzLDExNCwxMjUsNzgsMTIyLDIzLDc4LDExMSwxMTAsNDUsOTksMTExLDEwMCwxMDEsMzIsCi0gICAgMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsMzUsMCwwLDAsNDEsOSwyMTgsNywxMDksOTcsMTE0LDExNSwKLSAgICAxMDQsOTcsMTA4LDkwLDUsMTA4LDExMSw5NywxMDAsMTE1LDIxOCwxMCwxMDUsMTE1LDEwNSwxMTAsCi0gICAgMTE1LDExNiw5NywxMTAsOTksMTAxLDIxOCwxMCw5NSw5OSwxMTEsMTAwLDEwMSw5NSwxMTYsMTIxLAotICAgIDExMiwxMDEsMTE0LDEwNSwwLDAsMCwyMTgsNCw5NSwxMDUsMTA5LDExMiw5MCwxNiw5NSwKLSAgICAxMDIsMTA1LDEyMCw5NSw5OSwxMTEsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCwKLSAgICAxMDcsMCwwLDAsMTE0LDQ3LDAsMCwwLDQxLDUsMTE0LDUzLDAsMCwwLAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw5MCwwLDAsMCwyMTgsCi0gICAgNCw5OSwxMTEsMTAwLDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsOTUsOTgsCi0gICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjE5LDEsMCwwLDExNSwxNiwwLDAsMCwKLSAgICAwLDIsMTUsMSwxNSwxLDEzLDEsMTIsMSwxNiwxLDQsMiwxOCwxLAotICAgIDExNCwxNDcsMCwwLDAsMTE0LDU5LDAsMCwwLDk5LDMsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDc2LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwwLDEyNSwzLDAsCi0gICAgMTI0LDMsMCwxMDYsMiwwLDExNiwzLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsMSwxMjQsMywwLDEwNiwyLDAsMTE2LDMsMCwxMjQsMiwwLDEzMSwKLSAgICAxLDAsMTMxLDEsMCwxLDEyNCwzLDAsMTA2LDIsMCwxMTYsNCwwLDEwNiwKLSAgICA1LDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwxLDAsMSwxMjQsMywwLDgzLAorICAgIDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCw0MCw0MSw0NiwxMjIsMjEsOTksMTExLAorICAgIDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsCisgICAgMzMsMTE0LDEyNSw3OCwxMjIsMjMsNzgsMTExLDExMCw0NSw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsCisgICAgOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSwxMTQsOTksMCwKKyAgICAwLDAsMTE0LDM1LDAsMCwwLDQxLDEwLDIxOCw3LDEwOSw5NywxMTQsMTE1LDEwNCwKKyAgICA5NywxMDgsOTAsNSwxMDgsMTExLDk3LDEwMCwxMTUsMjE4LDEwLDEwNSwxMTUsMTA1LDExMCwxMTUsCisgICAgMTE2LDk3LDExMCw5OSwxMDEsMjE4LDEwLDk1LDk5LDExMSwxMDAsMTAxLDk1LDExNiwxMjEsMTEyLAorICAgIDEwMSwxMTQsMTE1LDAsMCwwLDExNCwxMzAsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwKKyAgICAxMTIsOTAsMTYsOTUsMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsCisgICAgOTcsMTA5LDEwMSwxMTQsMTAwLDAsMCwwLDExNCw0OCwwLDAsMCw0MSw1LDExNCwKKyAgICA1NCwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDkwLDAsMCwwLDExNCw5MSwKKyAgICAwLDAsMCwyMTgsNCw5OSwxMTEsMTAwLDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwOSwxMTIsMTA1LAorICAgIDEwOCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjEzLDEsMCwwLDExNSwKKyAgICAxNiwwLDAsMCwwLDIsMTAsMSwxMCwxLDEyLDEsOCwxLDEyLDEsCisgICAgNiwyLDEyLDEsMTE0LDE0MiwwLDAsMCwxMTQsNjAsMCwwLDAsOTksMywKKyAgICAwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsNTYsMCwwLDAsMTE2LDAsMTE2LDEsMTMxLDEsMTI1LDMsCisgICAgMTI0LDMsMTA2LDIsMTE2LDMsMTI0LDEsMTMxLDEsMTMxLDEsMSwwLDEyNCwzLAorICAgIDEwNiwyLDExNiwzLDEyNCwyLDEzMSwxLDEzMSwxLDEsMCwxMjQsMywxMDYsMiwKKyAgICAxMTYsNCwxMDYsNSwxMjQsMCwxMzEsMSwxMzEsMSwxLDAsMTI0LDMsODMsMCwKICAgICA0MSwxLDEyMiw4MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5NywzMiw5OSwxMTEsCiAgICAgMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwxMTYsMTExLDMyLDk4LAogICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExOSwxMTQsMTA1LDExNiwKICAgICAxMDUsMTEwLDEwMywzMiwxMTEsMTE3LDExNiwzMiwxMTYsMTExLDMyLDk3LDMyLDk4LDEyMSwxMTYsCiAgICAgMTAxLDQ1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwxMCwzMiwzMiwzMiwzMiwxMDIsCiAgICAgMTA1LDEwOCwxMDEsNDYsNDEsNiwyMTgsOSw5OCwxMjEsMTE2LDEwMSw5NywxMTQsMTE0LDk3LAotICAgIDEyMSwxMTQsMTM1LDAsMCwwLDIxOCw2LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTAwLDExNCwxNywKLSAgICAwLDAsMCwxMTQsMTQyLDAsMCwwLDkwLDUsMTAwLDExNywxMDksMTEyLDExNSw0MSwKLSAgICA0LDExNCwxNDYsMCwwLDAsMTE0LDEzMywwLDAsMCwxMTQsMTQwLDAsMCwwLAotICAgIDExNCw1MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgMTIxLDExNCwxMjksMCwwLDAsMjE4LDYsMTAxLDEyMCwxMTYsMTAxLDExMCwxMDAsMTE0LDE3LAorICAgIDAsMCwwLDExNCwxMzcsMCwwLDAsOTAsNSwxMDAsMTE3LDEwOSwxMTIsMTE1LDQxLAorICAgIDQsMTE0LDE0MSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxMzUsMCwwLDAsCisgICAgMTE0LDU0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKICAgICA1LDAsMCwwLDIxOCwxNyw5NSw5OSwxMTEsMTAwLDEwMSw5NSwxMTYsMTExLDk1LDk4LAotICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIzMSwxLDAsMCwxMTUsMTAsMCwwLDAsCi0gICAgMCwzLDEyLDEsMTksMSwxOSwxLDIyLDEsMTE0LDE1MCwwLDAsMCw5OSwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMjUsMSwwLDAsMTE1LDEwLDAsMCwwLAorICAgIDAsMyw4LDEsMTQsMSwxNCwxLDE2LDEsMTE0LDE0NSwwLDAsMCw5OSwKICAgICAxLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw0LDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw4OSwwLDAsMCwxMDAsMSwwLDEwMCwyLDAsMTA4LAotICAgIDAsMCwxMjUsMSwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMCwwLDEzMSwxLAotICAgIDAsMTA2LDMsMCwxMjUsMiwwLDEyNCwxLDAsMTA2LDQsMCwxMjQsMiwwLAotICAgIDEzMSwxLDAsMTI1LDMsMCwxMTYsMSwwLDEwNiw1LDAsMTAwLDIsMCwxMDAsCi0gICAgMywwLDEzMSwyLDAsMTI1LDQsMCwxMjQsNCwwLDEwNiw2LDAsMTI0LDAsCi0gICAgMCwxMDYsNiwwLDEyNCwzLDAsMTAwLDEsMCwyNSwxMzEsMSwwLDEzMSwxLAotICAgIDAsODMsNDEsNCwxMjIsMTIxLDY4LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMTAsMTAwLDMyLAotICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsCi0gICAgMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg1LDExMCwxMDUsMTE4LDEwMSwxMTQsMTE1LDk3LAotICAgIDEwOCwzMiwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsCi0gICAgMTE2LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTAwLDEwMSw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDQ2LDEwLDMyLDMyLDMyLDMyLDExNCwKLSAgICA1OSwwLDAsMCw3OCw4NCw0MSw3LDIxOCw4LDExNiwxMTEsMTA3LDEwMSwxMTAsMTA1LAotICAgIDEyMiwxMDEsMTE0LDQ5LDAsMCwwLDkwLDcsNjYsMTIxLDExNiwxMDEsMTE1LDczLDc5LAotICAgIDkwLDgsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDkwLDE1LDEwMCwxMDEsMTE2LDEwMSwKLSAgICA5OSwxMTYsOTUsMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDkwLDI1LDczLDExMCw5OSwKLSAgICAxMTQsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMDgsNzgsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsNjgsCi0gICAgMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMTgsNiwxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDQxLDUsCi0gICAgMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwxNTEsCi0gICAgMCwwLDAsOTAsMjEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSwKLSAgICAxMTUsOTUsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDIxOCw4LDEwMSwxMTAsOTksMTExLAotICAgIDEwMCwxMDUsMTEwLDEwMyw5MCwxNSwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsOTUsMTAwLDEwMSwKLSAgICA5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDEzLDEwMCwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTE1LDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSwyNDEsMSwwLDAsMTE1LDEwLDAsMCwwLDAsNSwxMiwxLAotICAgIDE4LDEsMTUsMSwxOCwxLDExNCwxNTUsMCwwLDAsMTE0LDEyNywwLDAsMCwKLSAgICAyMTgsMjYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCwKLSAgICA5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk5LDIsMCwwLAotICAgIDAsMiwwLDAsMCw5LDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSw4OSwxLDAsMCwxMjQsMSwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgNzMsMCwxMDAsMiwwLDEyNSwxLDAsMTE2LDAsMCwxMjQsMiwwLDEwMCwzLAotICAgIDAsMTMxLDIsMCwxMTQsNzMsMCwxMjEsMTksMCwxMjQsMiwwLDEwNiwxLDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEyNSwxLDAsODcsMTEwLDE4LDAsNCwxMTYsMiwKLSAgICAwLDEwNywxMCwwLDExNCw3MiwwLDEsMSwxLDg5LDExMCwxLDAsODgsMTE2LAotICAgIDMsMCwxMDYsNCwwLDEyNCwwLDAsMTI0LDIsMCwxMDAsNCwwLDEyNCwxLAotICAgIDAsMTMxLDIsMSwxMjUsNCwwLDEwMCw1LDAsMTI0LDQsMCw5NSw1LDAsCi0gICAgMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDE5NCwwLDEyMCw3MywwLDExNiwKLSAgICA2LDAsMTMxLDAsMCw2OCw5Myw1OCwwLDkyLDIsMCwxMjUsNSwwLDEyNSwKLSAgICA2LDAsMTI0LDEsMCwxMDYsNywwLDExNiw4LDAsMTI0LDYsMCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsMTE0LDEyOCwwLDEyNCw1LDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsMTI1LDIsMCwxMjQsMiwwLDEyNCw0LDAsOTUsOSwwLDgwLAotICAgIDExMywxMjgsMCw4NywxMDAsMSwwLDgzLDEyNCwzLDAsMTE2LDEwLDAsMTA3LDgsCi0gICAgMCwxMTQsMjMsMSwxMTYsMCwwLDEyNCwyLDAsMTAwLDYsMCwxMzEsMiwwLAotICAgIDExNCwzMiwxLDEyMSwxOSwwLDEyNCwyLDAsMTA2LDExLDAsMTI0LDAsMCwxMzEsCi0gICAgMSwwLDEyNSw3LDAsODcsMTEwLDE4LDAsNCwxMTYsMiwwLDEwNywxMCwwLAotICAgIDExNCw0LDEsMSwxLDEsODksMTEzLDMyLDEsODgsMTI0LDcsMCwxMTQsMzIsCi0gICAgMSwxMDMsMCwwLDEyNCw0LDAsOTUsMTIsMCwxMTAsOSwwLDEyNCwzLDAsCi0gICAgMTI0LDQsMCw5NSwxMiwwLDEyNCw0LDAsMTA2LDEyLDAsMTAzLDAsMCwxMDcsCi0gICAgMiwwLDExNCw4NSwxLDEyNCwxLDAsMTE0LDg1LDEsMTE2LDEzLDAsMTI0LDEsCi0gICAgMCwxMzEsMSwwLDEwMCw3LDAsMjUsMTI1LDgsMCwxMjQsNCwwLDEwNiwxMiwKLSAgICAwLDEwNiwxNCwwLDEyNCw4LDAsMTMxLDEsMCwxLDEyNCw0LDAsODMsNDEsCi0gICAgOCw5Nyw2MSwxLDAsMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDk4LDk3LDExNSwxMDEsMTAwLAotICAgIDMyLDExMSwxMTAsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwOCwxMTEsOTksOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDExMSwzMiwxMDUsMTEwLDEwMCwKLSAgICAxMDUsOTksOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSw0NCwzMiwxMTUsMTAxLDExNiwxMCwzMiwzMiwzMiwzMiwxMTUsMTE3LDk4LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LAotICAgIDk3LDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE2LDExMSwzMiw5NywzMiwxMDgsMTA1LDExNSwxMTYsCi0gICAgMzIsMTExLDEwMiwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDExNSw0NiwzMiwzMiw2NSwxMTAsMTAsMzIsMzIsMzIsMzIsMTAxLDEwOSwxMTIsCi0gICAgMTE2LDEyMSwzMiwxMDgsMTA1LDExNSwxMTYsMzIsMTA1LDExNSwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LAotICAgIDk5LDEwNSwxMDEsMTEwLDExNiw0NCwzMiwxMTYsMTA0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDUsMTE2LAotICAgIDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTEsMTE2LDEwNCwxMDEsMTE0LDExOSwxMDUsMTE1LDEwMSwzMiwKLSAgICAxMTcsMTE1LDEwMSwxMDIsMTE3LDEwOCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLAotICAgIDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiwxMDksMTE3LDExNSwxMTYsMzIsMTE2LDk3LDEwNywxMDEsMzIsOTcsMzIsMTE1LDExMiwxMDEsCi0gICAgOTksMzIsOTcsMTE1LDMyLDEwNSwxMTYsMTE1LDMyLDExMSwxMTAsMTA4LDEyMSwzMiw5NSw5NSwKLSAgICAxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDAsNDEsMzIsOTcsMTE0LDEwMyw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw3OCwxMjIsOSw2MCwxMTcsMTEwLDEwNywxMTAsMTExLDExOSwxMTAsNjIsMjE4LAotICAgIDEyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwyMTgsNiwxMTEsCi0gICAgMTE0LDEwNSwxMDMsMTA1LDExMCw4NCwyMTgsMTAsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LAotICAgIDEwMywxMDEsMTE0LDU5LDAsMCwwLDQxLDE1LDExNCwxMTUsMCwwLDAsMTE0LDE1NywKLSAgICAwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMjEsMCwwLDAsMjE4LDEwLDc3LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw5MCwxMyw5NSwxMTUsMTAxLDExNiw5NSwKLSAgICAxMDIsMTA1LDEwOCwxMDEsOTcsMTE2LDExNiwxMTQsMjE4LDI3LDk1LDEwMywxMDEsMTE2LDk1LDExNSwKLSAgICAxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDExNSwxMTQsOTIsMCwwLDAsMTE0LDkzLDAsMCwwLDExNCwKLSAgICAxMjcsMCwwLDAsMjE4LDksOTUsODAsNzksODAsODUsNzYsNjUsODQsNjksMTE0LAotICAgIDE1OSwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCwzOCwwLDAsMCwyMTgsNiwKLSAgICA5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDQxLDksMTE0LDEwNiwwLDAsMCw5MCw4LDEwOCwKLSAgICAxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNCwxMjcsMCwwLDAsMTE0LDE1NiwwLDAsCi0gICAgMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsMTIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwKLSAgICA5OSwxMDgsOTcsMTE1LDExNSwyMTgsOCwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDExNCwKLSAgICAxNTksMCwwLDAsOTAsNywxMDAsMTA1LDExNCwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMjMsMTE1LDExMiwKLSAgICAxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsMTExLDk5LAotICAgIDk3LDExNiwxMDUsMTExLDExMCwyLDIsMCwwLDExNSw2MCwwLDAsMCwwLDEyLAotICAgIDEyLDQsNiwxLDE1LDIsMywxLDE5LDEsMTMsMSw1LDgsMjQsMSwKLSAgICA5LDMsMTIsMSwyMiwxLDIxLDEsMTUsMSw5LDEsNSwyLDQsMywKLSAgICAxMiwyLDE1LDEsMywxLDE5LDEsMTMsMSw1LDIsNiwxLDEyLDIsCi0gICAgOSwxLDE1LDEsNiwxLDE2LDEsMTYsMiwxMTQsMTY3LDAsMCwwLDk5LAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNjQsMCwwLDAsMTE1LDEyMSwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsCi0gICAgMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDkwLDQsCi0gICAgMCwxMDAsMywwLDkwLDUsMCwxMDAsNCwwLDkwLDYsMCwxMDEsNywwLAotICAgIDEwMCw1LDAsMTAwLDYsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOCwwLDEwMSwKLSAgICA3LDAsMTAwLDcsMCwxMDAsOCwwLDEzMiwwLDAsMTMxLDEsMCw5MCw5LAotICAgIDAsMTAxLDcsMCwxMDAsOSwwLDEwMCw5LDAsMTAwLDEwLDAsMTAwLDExLDAsCi0gICAgMTMyLDIsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDcsMCwxMDAsOSwwLDEwMCwKLSAgICAxMiwwLDEwMCwxMywwLDEzMiwxLDAsMTMxLDEsMCw5MCwxMSwwLDEwMCw5LAotICAgIDAsODMsNDEsMTQsMjE4LDIxLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCi0gICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LAotICAgIDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDAsMTAxLDk5LDEwOCw5NywxMTQsCi0gICAgMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksCi0gICAgMTE1LDMyLDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTIyLDU5LDgzLDExMSwxMDIsCi0gICAgMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwKLSAgICAxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsCi0gICAgMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLAotICAgIDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDEyNSwxMjIsNjUsODMsMTExLDEwMiwxMTYsMTE5LDk3LAorICAgIDY3LDAsMCwwLDExNSw2MiwwLDAsMCwxMDAsMSwxMDAsMiwxMDgsMCwxMjUsCisgICAgMSwxMTYsMSwxMDYsMiwxMjQsMCwxMzEsMSwxMDYsMywxMjUsMiwxMjQsMSwxMDYsCisgICAgNCwxMjQsMiwxMzEsMSwxMjUsMywxMTYsMSwxMDYsNSwxMDAsMiwxMDAsMywxMzEsCisgICAgMiwxMjUsNCwxMjQsNCwxMDYsNiwxMjQsMCwxMDYsNiwxMjQsMywxMDAsMSwyNSwKKyAgICAwLDEzMSwxLDEzMSwxLDgzLDAsNDEsNCwxMjIsMTIxLDY4LDEwMSw5OSwxMTEsMTAwLAorICAgIDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwKKyAgICAxMTYsMTA1LDExMCwxMDMsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwKKyAgICAzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg1LDExMCwxMDUsCisgICAgMTE4LDEwMSwxMTQsMTE1LDk3LDEwOCwzMiwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsMzIsMTE1LAorICAgIDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDEwNSwKKyAgICAxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwMSw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLDQ2LDEwLAorICAgIDMyLDMyLDMyLDMyLDExNCw2MCwwLDAsMCw3OCw4NCw0MSw3LDIxOCw4LDExNiwKKyAgICAxMTEsMTA3LDEwMSwxMTAsMTA1LDEyMiwxMDEsMTE0LDUwLDAsMCwwLDkwLDcsNjYsMTIxLAorICAgIDExNiwxMDEsMTE1LDczLDc5LDkwLDgsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDkwLAorICAgIDE1LDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsOTUsMTAxLDExMCw5OSwxMTEsMTAwLDEwNSwxMTAsMTAzLAorICAgIDkwLDI1LDczLDExMCw5OSwxMTQsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMDgsNzgsMTAxLDExOSwKKyAgICAxMDgsMTA1LDExMCwxMDEsNjgsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMTgsNiwxMDAsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDQxLDUsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsOTgsMTIxLAorICAgIDExNiwxMDEsMTE1LDExNCwxNDYsMCwwLDAsOTAsMjEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA5NSw5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwxMTAsMTAxLDIxOCwKKyAgICA4LDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw5MCwxNSwxMTAsMTAxLDExOSwxMDgsMTA1LAorICAgIDExMCwxMDEsOTUsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEzLDEwMCwxMDEsOTksMTExLDEwMCwKKyAgICAxMDEsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyMzUsMSwwLDAsMTE1LDEwLDAsMCwKKyAgICAwLDAsNSw4LDEsMTIsMSwxMCwxLDEyLDEsMTE0LDE1MCwwLDAsMCwKKyAgICA0MSwyLDExNCwxMjEsMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDExNSw5OSwyLDAsMCwwLDIsMCwwLDAsOSwwLDAsMCwKKyAgICAxOSwwLDAsMCw2NywwLDAsMCwxMTUsOCwxLDAsMCwxMjQsMSwxMDAsCisgICAgMSwxMDcsOCwxMTQsNTgsMTAwLDIsMTI1LDEsMTE2LDAsMTI0LDIsMTAwLDMsMTMxLAorICAgIDIsMTE0LDU4LDEyMSwxNCwxMjQsMiwxMDYsMSwxMjQsMCwxMzEsMSwxMjUsMSw4NywKKyAgICAwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCw1NiwxLDAsMSwwLDEsCisgICAgMCw4OSwwLDExMCwyLDg4LDAsMTE2LDMsMTA2LDQsMTI0LDAsMTI0LDIsMTAwLAorICAgIDQsMTI0LDEsMTQ0LDEsMTMxLDIsMTI1LDQsMTAwLDUsMTI0LDQsOTUsNSwxMjQsCisgICAgMiwxMDAsMSwxMDcsOCwxMTQsMTQ2LDEyMCw1NCwxMTYsNiwxMzEsMCw2OCwwLDkzLAorICAgIDQwLDkyLDIsMTI1LDUsMTI1LDYsMTI0LDEsMTA2LDcsMTE2LDgsMTI0LDYsMTMxLAorICAgIDEsMTMxLDEsMTE0LDk4LDEyNCw1LDEyNCwwLDEyNCwxLDEzMSwyLDEyNSwyLDEyNCwKKyAgICAyLDEyNCw0LDk1LDksODAsMCwxMTMsOTgsODcsMCwxMDAsMSw4MywwLDEyNCwKKyAgICAzLDExNiwxMCwxMDcsOCwxMTQsMjEyLDExNiwwLDEyNCwyLDEwMCw2LDEzMSwyLDExNCwKKyAgICAyMTgsMTIxLDE0LDEyNCwyLDEwNiwxMSwxMjQsMCwxMzEsMSwxMjUsNyw4NywwLDExMCwKKyAgICAyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCwxOTgsMSwwLDEsMCwxLDAsODksCisgICAgMCwxMTMsMjE4LDg4LDAsMTI0LDcsMTE0LDIxOCwxMDMsMCwxMjQsNCw5NSwxMiwxMTAsCisgICAgNiwxMjQsMywxMjQsNCw5NSwxMiwxMjQsNCwxMDYsMTIsMTAzLDAsMTA3LDIsMTQ0LAorICAgIDEsMTE0LDQsMTI0LDEsMTQ0LDEsMTE0LDQsMTE2LDEzLDEyNCwxLDEzMSwxLDEwMCwKKyAgICA3LDI1LDAsMTI1LDgsMTI0LDQsMTA2LDEyLDEwNiwxNCwxMjQsOCwxMzEsMSwxLAorICAgIDAsMTI0LDQsODMsMCw0MSw4LDk3LDYxLDEsMCwwLDgyLDEwMSwxMTYsMTE3LAorICAgIDExNCwxMTAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE1LDExMiwxMDEsOTksCisgICAgMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsCisgICAgMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgODQsMTExLDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDMyLDExNiwxMDQsOTcsMTE2LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsCisgICAgMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LDEwLDMyLDMyLAorICAgIDMyLDMyLDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsCisgICAgOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTYsMTExLDMyLAorICAgIDk3LDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsCisgICAgMTExLDExNCwxMjEsMzIsMTEyLDk3LDExNiwxMDQsMTE1LDQ2LDMyLDMyLDY1LDExMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMDUsMTE1LAorICAgIDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsOTksMTA1LDEwMSwxMTAsMTE2LDQ0LDMyLDExNiwxMDQsMTExLAorICAgIDExNywxMDMsMTA0LDMyLDEwNSwxMTYsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMSwxMTYsMTA0LDEwMSwKKyAgICAxMTQsMTE5LDEwNSwxMTUsMTAxLDMyLDExNywxMTUsMTAxLDEwMiwxMTcsMTA4LDMyLDExNiwxMTEsMzIsCisgICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTE1LAorICAgIDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMTYsOTcsMTA3LDEwMSwKKyAgICAzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzMiw5NywxMTUsMzIsMTA1LDExNiwxMTUsMzIsMTExLAorICAgIDExMCwxMDgsMTIxLDMyLDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCw0MSwzMiw5NywKKyAgICAxMTQsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw5LDYwLDExNywxMTAsMTA3LAorICAgIDExMCwxMTEsMTE5LDExMCw2MiwyMTgsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCwKKyAgICA5NywxMDksMTAxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwxMCwxMDUsMTE1LAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNjAsMCwwLDAsNDEsMTUsMTE0LAorICAgIDEwOSwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxMDAsMCwwLDAsMTE0LDExNSwKKyAgICAwLDAsMCwyMTgsMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDkwLAorICAgIDEzLDk1LDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsMjcsCisgICAgOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTAyLAorICAgIDEwNSwxMDgsMTAxLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw5MywwLDAsMCwKKyAgICAxMTQsOTQsMCwwLDAsMTE0LDEyMSwwLDAsMCwyMTgsOSw5NSw4MCw3OSw4MCwKKyAgICA4NSw3Niw2NSw4NCw2OSwxMTQsMTU0LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LAorICAgIDM4LDAsMCwwLDIxOCw2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNDEsOSwxMTQsOTksCisgICAgMCwwLDAsOTAsOCwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTIxLDAsCisgICAgMCwwLDExNCwxNTEsMCwwLDAsMjE4LDQsMTE1LDExMiwxMDEsOTksMjE4LDEyLDEwOCwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTksMTA4LDk3LDExNSwxMTUsMjE4LDgsMTE1LDExNywxMDIsCisgICAgMTAyLDEwNSwxMjAsMTAxLDExNSwxMTQsMTU0LDAsMCwwLDkwLDcsMTAwLDEwNSwxMTQsMTEwLAorICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMjE4LDIzLDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LAorICAgIDEwOCwxMDEsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMjUyLDEsMCwwLDExNSwKKyAgICA2MCwwLDAsMCwwLDEyLDgsNCw0LDEsMTAsMiwyLDEsMTQsMSwKKyAgICAxNCwxLDYsOCwxOCwxLDYsMyw4LDEsMTYsMSwxNCwxLDEwLDEsCisgICAgNiwxLDYsMiw0LDMsOCwyLDEwLDEsMiwxLDE0LDEsMTQsMSwKKyAgICA2LDIsNCwxLDgsMiw2LDEsMTIsMSw2LDEsMTIsMSwxMiwyLAorICAgIDExNCwxNjIsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsODAsMCwwLDAsMTAxLAorICAgIDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsOTAsNCwxMDAsCisgICAgMyw5MCw1LDEwMCw0LDkwLDYsMTAxLDcsMTAwLDUsMTAwLDYsMTMyLDAsMTMxLAorICAgIDEsOTAsOCwxMDEsNywxMDAsNywxMDAsOCwxMzIsMCwxMzEsMSw5MCw5LDEwMSwKKyAgICA3LDEwMCwxNCwxMDAsMTAsMTAwLDExLDEzMiwxLDEzMSwxLDkwLDEwLDEwMSw3LDEwMCwKKyAgICAxNSwxMDAsMTIsMTAwLDEzLDEzMiwxLDEzMSwxLDkwLDExLDEwMCw5LDgzLDAsNDEsCisgICAgMTYsMjE4LDIxLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsCisgICAgMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLDExMiwKKyAgICA5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDAsMTAxLDk5LDEwOCw5NywxMTQsMTAxLDEwMCwzMiwKKyAgICAxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDMyLDExNCwKKyAgICAxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNDYsMTIyLDU5LDgzLDExMSwxMDIsMTE2LDExOSw5NywKICAgICAxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCwKICAgICA2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsCiAgICAgMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLDExNywxMDgsMTA4LAotICAgIDExMCw5NywxMDksMTAxLDEyNSw5Miw2OCwxMDEsOTgsMTE3LDEwMyw3MCw5OSwyLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNjcsMCwwLDAsMTIxLDIzLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwKLSAgICAwLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLDAsODMsODcsMTEwLDM3LDAsCi0gICAgNCwxMTYsMywwLDEwNywxMCwwLDExNCw2MiwwLDEsMSwxLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMTYsMCwwLDEwNiw0LDAsMTI0LDEsMCwxMzEsMiwwLDgzLAotICAgIDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDUsMjE4LDcsCi0gICAgOTUsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsNyw3OSwxMTIsMTAxLDExMCw3NSwxMDEsMTIxLAotICAgIDkwLDE3LDcyLDc1LDY5LDg5LDk1LDY3LDg1LDgyLDgyLDY5LDc4LDg0LDk1LDg1LAotICAgIDgzLDY5LDgyLDExNCw0MCwwLDAsMCw5MCwxOCw3Miw3NSw2OSw4OSw5NSw3NiwKLSAgICA3OSw2Nyw2NSw3Niw5NSw3Nyw2NSw2Nyw3Miw3Myw3OCw2OSw0MSwyLDIxOCwzLAotICAgIDk5LDEwOCwxMTUsMjE4LDMsMTA3LDEwMSwxMjEsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMjE4LDE0LDk1LDExMSwxMTIsMTAxLDExMCw5NSwxMTQsCi0gICAgMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDgwLDIsMCwwLDExNSw4LDAsMCwwLAotICAgIDAsMiwzLDEsMjMsMSwxMywxLDEyMiwzNiw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LAotICAgIDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICA5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5OSwyLAotICAgIDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNiwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsMTQzLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMTQsMjEsCi0gICAgMCwxMjQsMCwwLDEwNiwxLDAsMTI1LDIsMCwxMTAsOSwwLDEyNCwwLDAsCi0gICAgMTA2LDIsMCwxMjUsMiwwLDEyNCwyLDAsMTA2LDMsMCwxMDAsMSwwLDEyNCwKLSAgICAxLDAsMTAwLDIsMCwxMTYsNCwwLDEwNiw1LDAsMTAwLDAsMCwxMDAsMywKLSAgICAwLDEzMywyLDAsMjUsMTMxLDAsMiwxMjUsMywwLDEyMSw0NywwLDEyNCwwLAotICAgIDAsMTA2LDYsMCwxMjQsMywwLDEzMSwxLDAsMTQzLDI1LDAsMTI1LDQsMCwKLSAgICAxMTYsNywwLDEwNiw4LDAsMTI0LDQsMCwxMDAsNCwwLDEzMSwyLDAsMTI1LAotICAgIDUsMCw4NywxMDAsMCwwLDgxLDgyLDg4LDg3LDExMCwyMiwwLDQsMTE2LDksCi0gICAgMCwxMDcsMTAsMCwxMTQsMTM4LDAsMSwxLDEsMTAwLDAsMCw4Myw4OSwxMTAsCi0gICAgMSwwLDg4LDEyNCw1LDAsODMsNDEsNSw3OCwxMTQsMTI2LDAsMCwwLDkwLAotICAgIDExLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMTQsODAsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDQxLDEwLDIxOCwxMSw2OCw2OSw2Niw4NSw3MSw5NSwKLSAgICA2Niw4NSw3Myw3Niw2OCwyMTgsMTgsODIsNjksNzEsNzMsODMsODQsODIsODksOTUsCi0gICAgNzUsNjksODksOTUsNjgsNjksNjYsODUsNzEsMjE4LDEyLDgyLDY5LDcxLDczLDgzLAotICAgIDg0LDgyLDg5LDk1LDc1LDY5LDg5LDExNCw0NywwLDAsMCwxMTQsNywwLDAsCi0gICAgMCwyMTgsNywxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTE0LDE3MiwwLDAsMCwxMTQsCi0gICAgMTY5LDAsMCwwLDkwLDEwLDgxLDExNywxMDEsMTE0LDEyMSw4Niw5NywxMDgsMTE3LDEwMSwKLSAgICAxMTQsNDAsMCwwLDAsNDEsNiwxMTQsMTcwLDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsOTAsMTIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NSwxMDcsMTAxLDEyMSwxMTQsCi0gICAgMTcxLDAsMCwwLDkwLDQsMTA0LDEwNywxMDEsMTIxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwKLSAgICAxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwyMTgsMTYsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLAotICAgIDEwNSwxMTUsMTE2LDExNCwxMjEsODcsMiwwLDAsMTE1LDIyLDAsMCwwLDAsMiwKLSAgICA5LDEsMTIsMiw5LDEsMTUsMSwyMiwxLDMsMSwxOCwxLDI5LDEsCi0gICAgMTMsMSw5LDEsMTIyLDM4LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsCi0gICAgMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExNSwxMDEsOTcsCi0gICAgMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc4LDk5LDQsMCwKLSAgICAwLDAsMCwwLDAsMCw4LDAsMCwwLDE0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxNTgsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLDAsMCwxMDcsOCwwLDExNCwKLSAgICAzMSwwLDEwMCwwLDAsODMsMTIxLDE0LDAsMTE2LDEsMCwxMjQsNCwwLDEzMSwKLSAgICAxLDAsMSw4NywxMTAsMjIsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDY5LAotICAgIDAsMSwxLDEsMTAwLDAsMCw4Myw4OSwxMTAsMSwwLDg4LDEyMCw4MSwwLAotICAgIDExNiwzLDAsMTMxLDAsMCw2OCw5Myw3MCwwLDkyLDIsMCwxMjUsNSwwLAotICAgIDEyNSw2LDAsMTI0LDQsMCwxMDYsNCwwLDExNiw1LDAsMTI0LDYsMCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMTE0LDgwLDAsMTE2LDYsMCwxMDYsNywwLDEyNCwxLAotICAgIDAsMTI0LDUsMCwxMjQsMSwwLDEyNCw0LDAsMTMxLDIsMCwxMDAsMSwwLAotICAgIDEyNCw0LDAsMTMxLDIsMSwxMjUsNywwLDEyNCw3LDAsODMsMTEzLDgwLDAsCi0gICAgODcsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwxNTgsMCwwLDAsNDEsOCwxMTQsCi0gICAgMTc4LDAsMCwwLDExNCwzOSwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDE2MSwKLSAgICAwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDkzLDAsMCwwLDExNCwxMjEsMCwKLSAgICAwLDAsMjE4LDE2LDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDgsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQxLDgsMTE0LDE3MCwwLDAsMCwxMTQsMTI2LDAsMCwwLAotICAgIDExNCwzNSwwLDAsMCwyMTgsNiwxMTYsOTcsMTE0LDEwMywxMDEsMTE2LDExNCwxNzcsMCwKLSAgICAwLDAsMTE0LDEyNywwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwxNjQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMjE4LDksMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDEwMiwyLDAsMCwxMTUsCi0gICAgMjYsMCwwLDAsMCwyLDE1LDEsMTIsMSw0LDEsMywxLDE0LDEsCi0gICAgMTMsMSw5LDEsMjIsMSwyMSwxLDksMSwxNSwxLDksMSwxMjIsMzEsCi0gICAgODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LAotICAgIDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDQ1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsMywwLDEyNCwzLDAsMTAwLDEsCi0gICAgMCwxMDcsOSwwLDExNCwzNywwLDEyNCwzLDAsMTA2LDEsMCw4MywxMDAsMSwKLSAgICAwLDgzLDEwMCwxLDAsODMsNDEsMiwxMjIsMTA4LDcwLDEwNSwxMTAsMTAwLDMyLDEwOSwKKyAgICAxMTAsOTcsMTA5LDEwMSwxMjUsMTIyLDY1LDgzLDExMSwxMDIsMTE2LDExOSw5NywxMTQsMTAxLDkyLAorICAgIDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCw2NywxMTEsMTE0LAorICAgIDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwxMTQsMTE1LDEwNSwxMTEsMTEwLDEyNSw5MiwKKyAgICA3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksCisgICAgMTAxLDEyNSw5Miw2OCwxMDEsOTgsMTE3LDEwMyw3MCw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNTAsCisgICAgMCwwLDAsMTIxLDE0LDExNiwwLDEwNiwxLDExNiwwLDEwNiwyLDEyNCwxLDEzMSwKKyAgICAyLDgzLDAsNCwwLDExNiwzLDEwNywxMCwxMTQsNDQsMSwwLDEsMCwxLAorICAgIDAsMTE2LDAsMTA2LDEsMTE2LDAsMTA2LDQsMTI0LDEsMTMxLDIsODMsMCw4OCwKKyAgICAwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSw1LDIxOCw3LDk1LDExOSwxMDUsMTEwLAorICAgIDExNCwxMDEsMTAzLDkwLDcsNzksMTEyLDEwMSwxMTAsNzUsMTAxLDEyMSw5MCwxNyw3Miw3NSwKKyAgICA2OSw4OSw5NSw2Nyw4NSw4Miw4Miw2OSw3OCw4NCw5NSw4NSw4Myw2OSw4MiwxMTQsCisgICAgNDAsMCwwLDAsOTAsMTgsNzIsNzUsNjksODksOTUsNzYsNzksNjcsNjUsNzYsCisgICAgOTUsNzcsNjUsNjcsNzIsNzMsNzgsNjksNDEsMiwyMTgsMyw5OSwxMDgsMTE1LDIxOCwKKyAgICAzLDEwNywxMDEsMTIxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDIxOCwxNCw5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwKKyAgICAxMTYsMTE0LDEyMSw3NCwyLDAsMCwxMTUsOCwwLDAsMCwwLDIsMiwxLAorICAgIDE0LDEsMTQsMSwxMjIsMzYsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywKKyAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTExLDExMiwxMDEsCisgICAgMTEwLDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDYsMCwwLDAsMTYsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDExNiwwLDAsMCwxMjQsMCwxMDYsMCwxMTQsMTQsMTI0LDAsMTA2LDEsMTI1LDIsCisgICAgMTEwLDYsMTI0LDAsMTA2LDIsMTI1LDIsMTI0LDIsMTA2LDMsMTAwLDEsMTI0LDEsCisgICAgMTAwLDIsMTAwLDMsMTE2LDQsMTA2LDUsMTAwLDAsMTAwLDQsMTMzLDIsMjUsMCwKKyAgICAyMiwwLDE0NCwyLDEzMSwwLDEyNSwzLDEyMSwzOCwxMjQsMCwxMDYsNiwxMjQsMywKKyAgICAxMzEsMSwxNDMsMTgsMTI1LDQsMTE2LDcsMTA2LDgsMTI0LDQsMTAwLDUsMTMxLDIsCisgICAgMTI1LDUsODcsMCwxMDAsMCw4MSwwLDgyLDAsODgsMCw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDksMTA3LDEwLDExNCwxMTAsMSwwLDEsMCwxLDAsMTAwLDAsCisgICAgODMsMCw4OCwwLDEyNCw1LDgzLDAsNDEsNiw3OCwxMTQsMTIwLDAsMCwwLAorICAgIDkwLDExLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMjIsNSwzNywKKyAgICAxMDAsNDYsMzcsMTAwLDExNCw1NywwLDAsMCwxMTQsMzAsMCwwLDAsNDEsMTAsCisgICAgMjE4LDExLDY4LDY5LDY2LDg1LDcxLDk1LDY2LDg1LDczLDc2LDY4LDIxOCwxOCw4MiwKKyAgICA2OSw3MSw3Myw4Myw4NCw4Miw4OSw5NSw3NSw2OSw4OSw5NSw2OCw2OSw2Niw4NSwKKyAgICA3MSwyMTgsMTIsODIsNjksNzEsNzMsODMsODQsODIsODksOTUsNzUsNjksODksMTE0LAorICAgIDQ4LDAsMCwwLDExNCw3LDAsMCwwLDIxOCwxMiwxMTgsMTAxLDExNCwxMTUsMTA1LAorICAgIDExMSwxMTAsOTUsMTA1LDExMCwxMDIsMTExLDExNCwxNjcsMCwwLDAsMTE0LDE2NCwwLDAsCisgICAgMCw5MCwxMCw4MSwxMTcsMTAxLDExNCwxMjEsODYsOTcsMTA4LDExNywxMDEsMTE0LDQwLDAsCisgICAgMCwwLDQxLDYsMTE0LDE2NSwwLDAsMCwxMTQsMTIwLDAsMCwwLDkwLDEyLAorICAgIDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsOTUsMTA3LDEwMSwxMjEsMTE0LDE2NiwwLDAsCisgICAgMCw5MCw0LDEwNCwxMDcsMTAxLDEyMSwyMTgsOCwxMDIsMTA1LDEwOCwxMDEsMTEyLDk3LDExNiwKKyAgICAxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMjE4LDE2LDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwKKyAgICAxMTQsMTIxLDgxLDIsMCwwLDExNSwyMiwwLDAsMCwwLDIsNiwxLDgsCisgICAgMiw2LDEsMTAsMSwyMiwxLDIsMSwxMiwxLDI2LDEsMTQsMSw2LAorICAgIDEsMTIyLDM4LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsCisgICAgMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCwKKyAgICA5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDc4LDk5LDQsMCwwLDAsMCwKKyAgICAwLDAsMCw4LDAsMCwwLDE0LDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAxMjIsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTMxLDEsMTI1LDQsMTI0LDQsCisgICAgMTAwLDAsMTA3LDgsMTE0LDIyLDEwMCwwLDgzLDAsMTIxLDEyLDExNiwxLDEyNCw0LAorICAgIDEzMSwxLDEsMCw4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCw1NCwKKyAgICAxLDAsMSwwLDEsMCwxMDAsMCw4MywwLDg4LDAsMTIwLDYwLDExNiwzLAorICAgIDEzMSwwLDY4LDAsOTMsNTAsOTIsMiwxMjUsNSwxMjUsNiwxMjQsNCwxMDYsNCwKKyAgICAxMTYsNSwxMjQsNiwxMzEsMSwxMzEsMSwxMTQsNjQsMTE2LDYsMTA2LDcsMTI0LDEsCisgICAgMTI0LDUsMTI0LDEsMTI0LDQsMTMxLDIsMTAwLDEsMTI0LDQsMTQ0LDEsMTMxLDIsCisgICAgMTI1LDcsMTI0LDcsODMsMCwxMTMsNjQsODcsMCwxMDAsMCw4MywwLDQxLDIsCisgICAgNzgsMTE0LDE1MywwLDAsMCw0MSw4LDExNCwxNzMsMCwwLDAsMTE0LDM5LDAsCisgICAgMCwwLDExNCw0MCwwLDAsMCwxMTQsMTU2LDAsMCwwLDExNCw5MywwLDAsCisgICAgMCwxMTQsOTQsMCwwLDAsMTE0LDExNSwwLDAsMCwyMTgsMTYsMTE1LDExMiwxMDEsCisgICAgOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDEsOCwxMTQsCisgICAgMTY1LDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCw2LAorICAgIDExNiw5NywxMTQsMTAzLDEwMSwxMTYsMTE0LDE3MiwwLDAsMCwxMTQsMTIxLDAsMCwwLAorICAgIDExNCwxNjEsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgMTE1LDExMiwxMDEsOTksOTYsMiwwLDAsMTE1LDI2LDAsMCwwLDAsMiwxMCwKKyAgICAxLDgsMSw0LDEsMiwxLDEyLDEsMTQsMSw2LDEsMTYsMSwxNCwKKyAgICAxLDYsMSwxMCwxLDgsMSwxMjIsMzEsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsCisgICAgODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLAorICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLDAsCisgICAgMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsCisgICAgMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSwzLDEyNCwzLAorICAgIDEwMCwxLDEwNyw5LDExNCwyOCwxMjQsMywxMDYsMSw4MywwLDExMCw0LDEwMCwxLAorICAgIDgzLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwxMDgsNzAsMTA1LDExMCwxMDAsMzIsMTA5LAogICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LAogICAgIDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMCwxMCwzMiwzMiwKICAgICAzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAogICAgIDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsCiAgICAgMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAogICAgIDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxODEsMCwwLDAsMTE0LDEyNywKLSAgICAwLDAsMCw0MSw0LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsCi0gICAgMzUsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxNzYsMCwwLDAsMTE0LDEyMSwKKyAgICAwLDAsMCw0MSw0LDExNCwxNjUsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKICAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExOCwyLDAsMCwxMTUsOCwwLDAsMCwwLDcsCi0gICAgMTgsMSwxMiwxLDcsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTIsMiwwLDAsMTE1LDgsMCwwLDAsMCw3LAorICAgIDEyLDEsOCwxLDgsMiwxMjIsMzMsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsCiAgICAgMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwxMTIsMCwwLDAsCi0gICAgMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LAotICAgIDE3NSwwLDAsMCwxMTQsMTc0LDAsMCwwLDExNCwxNzMsMCwwLDAsMjE4LDExLAotICAgIDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNzIsMCwwLDAsCi0gICAgMTE0LDE3OCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE2OCwwLDAsMCw2OCwyLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMTIsMiw2LDMsNiwzLDYsMiw2LDIsMTgsNywxOCwxNSwzLAotICAgIDEsMjEsMTUsMywxLDExNCwxNjgsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgNzAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsCi0gICAgMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwKLSAgICAwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDgsMCwxMDAsOSwwLAotICAgIDEzMiwwLDAsOTAsNywwLDEwMCwxMCwwLDgzLDQxLDExLDIxOCwxMyw5NSw3NiwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLDgzLDY2LDk3LDExNSwKLSAgICAxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwxMTEsMTA5LDEwOSwxMTEsCi0gICAgMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LDEyMSwKLSAgICAzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsODMsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsODgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDEzMSwxLDAsMTAwLDEsMCwyNSwKLSAgICAxMjUsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDAsMiwwLDEwMCwxLDAsMTMxLAotICAgIDIsMCwxMDAsMywwLDI1LDEyNSwzLDAsMTI0LDEsMCwxMDYsMywwLDEwMCwKLSAgICAyLDAsMTMxLDEsMCwxMDAsNCwwLDI1LDEyNSw0LDAsMTI0LDMsMCwxMDAsCi0gICAgNSwwLDEwNywyLDAsMTExLDg3LDAsMTI0LDQsMCwxMDAsNSwwLDEwNywzLAotICAgIDAsODMsNDEsNiwxMjIsMTQxLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwKLSAgICAxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDk4LDEyMSwzMiw5OSwxMDQsMTAxLAotICAgIDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCi0gICAgMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LAotICAgIDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0NiwxMTIsCi0gICAgMTIxLDM5LDQ2LDExNCwyOSwwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDU5LDAsCi0gICAgMCwwLDExNCw1NiwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsCi0gICAgOTUsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMzQsMCwKLSAgICAwLDAsMTE0LDMyLDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LAotICAgIDAsMCwwLDExNCw5NCwwLDAsMCw5MCwxMywxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LAotICAgIDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSw5MCw5LDExNiw5NywxMDUsMTA4LDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwxNTksMCwwLDAsMTM3LDIsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMywyNSwxLDIyLDEsMTksMSwxMjIsMjQsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsCi0gICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwKLSAgICAyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwKLSAgICAxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwKLSAgICAwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE0NSwyLDAsCi0gICAgMCwxMTUsMCwwLDAsMCwxMjIsMjcsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LAotICAgIDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICA0LDAsMCwwLDY3LDAsMCwwLDExNSw4MCwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsCi0gICAgMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsNTQsMCwxMTYsMiwwLDEwMCwyLAotICAgIDAsMTA2LDMsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCwxMzEsMSwwLAotICAgIDEzMCwxLDAsMTE2LDQsMCwxMDYsNSwwLDExNiw2LDAsMTI0LDIsMCwxMjQsCi0gICAgMSwwLDEwNiw3LDAsMTMxLDMsMCwxLDEwMCwxLDAsODMsNDEsMywxMjIsCi0gICAgMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExOSwKLSAgICAxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0MCw0MSwzMiwxMTQsCi0gICAgMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsOCwyMTgsOCwxMDMsCi0gICAgMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTEyLDAsMCwwLDExNCwxMDcsMCwwLAotICAgIDAsMTE0LDQ3LDAsMCwwLDExNCwxMjEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LAotICAgIDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LAotICAgIDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCwxMTgsMCwwLAotICAgIDAsNDEsMywxMTQsMTA4LDAsMCwwLDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDExNCwxNDYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDE0OCwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDE4LDEsMTIsMSwKLSAgICA5LDEsMTUsMSwxMjIsMjUsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwKLSAgICAxMDUsOTksMTE1LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsCi0gICAgMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDEyMSwKLSAgICAwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxNTYsMiwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzgsNDEsOCwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLAotICAgIDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxNTksMCwwLDAsCi0gICAgMTE0LDE4NiwwLDAsMCwxMTQsMTkxLDAsMCwwLDExNCwxOTMsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCi0gICAgMCwwLDAsMTE0LDE4NCwwLDAsMCwxMzIsMiwwLDAsMTE1LDEwLDAsMCwKLSAgICAwLDEyLDMsNiwyLDEyLDgsMTIsMywxMiw4LDExNCwxODQsMCwwLDAsCi0gICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCw2NCwwLDAsMCwxMTUsMTA2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLAotICAgIDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLAotICAgIDMsMCwxMDAsMywwLDEwMCw0LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDUsCi0gICAgMCwxMDAsNiwwLDEzMiwwLDAsOTAsNSwwLDEwMCw3LDAsMTAwLDgsMCwKLSAgICAxMzIsMCwwLDkwLDYsMCwxMDAsOSwwLDEwMCwxMCwwLDEzMiwwLDAsOTAsCi0gICAgNywwLDEwMCwxMSwwLDEwMCwxOCwwLDEwMCwxMywwLDEwMCwxNCwwLDEzMiwwLAotICAgIDEsOTAsOCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLDAsOTAsOSwwLAotICAgIDEwMCwxNywwLDgzLDQxLDE5LDIxOCwxMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwwLAotICAgIDAsMTMwLDEsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE3OCw3OSwxMTIsMTE2LDEwNSwKLSAgICAxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTYsMTA0LDk3LDExNiwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExNiwxMDUsMTA5LDEwMSwzMiw0MCwKLSAgICA5NywxMTAsMzIsMTA1LDExMCwxMTYsNDEsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMTAsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLAotICAgIDEwMCwzMiwxMTIsOTcsMTE2LDEwNCw0NCwzMiwxMTksMTA0LDEwMSwxMTQsMTAxLDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE1LDExNiwxMTQsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsODIsOTcsMTA1LDExNSwxMDEsMTE1LDMyLDczLDc5LDY5LAotICAgIDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk4LDEwMSwzMiwxMDQsOTcsMTEwLAotICAgIDEwMCwxMDgsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICAxLDIxOCw3LDczLDc5LDY5LDExNCwxMTQsMTExLDExNCw0MSwyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksCi0gICAgMTAxLDE2MiwyLDAsMCwxMTUsMiwwLDAsMCwwLDYsMTIyLDIzLDgzLDExMSwKLSAgICAxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgMTA5LDExNiwxMDUsMTA5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLDAsMCwxMDAsCi0gICAgMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTA1LDEsCi0gICAgMCw4Myw0MSwyLDk3LDE3MCwxLDAsMCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LAotICAgIDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDUsCi0gICAgMTEwLDEwMywzMiw5NywzMiwxMDksMTAxLDExNiw5NywxMDAsOTcsMTE2LDk3LDMyLDEwMCwxMDUsCi0gICAgOTksMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKLSAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTEyLDk3LDExNiwxMDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMTE2LDExMSwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsNDAsMTE1LDExNiwxMTQsNDEsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgODAsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsMzIsMTA3LDEwMSwxMjEsMTE1LDU4LDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDEwOSwxMTYsMTA1LDEwOSwxMDEsMzksCi0gICAgMzIsNDAsMTA5LDk3LDExMCwxMDAsOTcsMTE2LDExMSwxMTQsMTIxLDQxLDMyLDEwNSwxMTUsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksMzIsMTE2LDEwNSwxMDksMTAxLAotICAgIDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMTEsMTAyLDMyLDEwOCw5NywxMTUsMTE2LDMyLDExNSwxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsOTksCi0gICAgMTExLDEwMCwxMDEsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAotICAgIDU5LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQ1LDMyLDM5LDExNSwxMDUsMTIyLAotICAgIDEwMSwzOSwzMiw0MCwxMTEsMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsNDEsMzIsMTA1LDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTA1LDEyMiwxMDEsMzIsMTA1LDExMCwzMiw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDMyLDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDEsMiw3OCw3OCw0MSwxLDc4LAorICAgIDQxLDEyLDExNCwxMDYsMCwwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwKKyAgICAwLDExNCwxMDgsMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsMTY5LDAsMCwwLAorICAgIDExNCwxNjgsMCwwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwxMDEsMTE2LDEwNCwKKyAgICAxMTEsMTAwLDExNCwxNjcsMCwwLDAsMTE0LDE3MywwLDAsMCwxMTQsMTc2LDAsMCwKKyAgICAwLDExNCwxNzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE2MywwLDAsMCw2MiwKKyAgICAyLDAsMCwxMTUsMjAsMCwwLDAsOCwyLDQsMyw0LDMsNCwyLAorICAgIDQsMiwxMiw3LDEyLDE1LDIsMSwxMiwxNSwyLDEsMTE0LDE2MywwLDAsCisgICAgMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDY0LDAsMCwwLDExNSw0OCwwLDAsMCwxMDEsMCw5MCwxLDEwMCwKKyAgICAwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LDEwMCwKKyAgICA0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLDAsOTAsNiwxMDAsCisgICAgOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwxMCw4MywwLDQxLDExLDIxOCwxMyw5NSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLDgzLDY2LDk3LAorICAgIDExNSwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwxMTEsMTA5LDEwOSwKKyAgICAxMTEsMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LAorICAgIDEyMSwzMiw5OCwxMTEsMTE2LDEwNCwzMiw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsODMsMTExLDExNywxMTQsCisgICAgOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsNjQsMCwwLDAsMTE2LDAsMTI0LDAsMTA2LAorICAgIDEsMTI0LDEsMTMxLDEsMTMxLDEsMTAwLDEsMjUsMCwxMjUsMiwxMjQsMiwxMDYsCisgICAgMiwxMDAsMiwxMDAsMSwxMzEsMiwxMDAsMywyNSwwLDEyNSwzLDEyNCwxLDEwNiwKKyAgICAzLDEwMCwyLDEzMSwxLDEwMCw0LDI1LDAsMTI1LDQsMTI0LDMsMTAwLDUsMTA3LAorICAgIDIsMTExLDYyLDEyNCw0LDEwMCw1LDEwNywzLDgzLDAsNDEsNiwxMjIsMTQxLDY3LAorICAgIDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwKKyAgICAxMTYsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywKKyAgICAxMDMsMTAxLDMyLDk4LDEyMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDUsMTEwLDEwMywzMiwxMDUsCisgICAgMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKKyAgICAxMTYsMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsOTgsMTIxLDMyLDEwMywKKyAgICAxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDQsOTcsMTE1LDMyLAorICAgIDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDM5LDk1LAorICAgIDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0NiwxMTIsMTIxLDM5LDQ2LDExNCwyOSwwLDAsCisgICAgMCwxMTQsNTksMCwwLDAsMTE0LDYwLDAsMCwwLDExNCw1NywwLDAsMCwKKyAgICAyMTgsOCw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsNDEsNCwxMTQsMzgsMCwwLAorICAgIDAsMTE0LDE1MiwwLDAsMCwxMTQsMzQsMCwwLDAsMTE0LDMyLDAsMCwwLAorICAgIDQxLDUsMTE0LDEwMSwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCw5NSwwLDAsCisgICAgMCw5MCwxMywxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTUsOTgsOTcsMTE1LDEwMSwKKyAgICA5MCw5LDExNiw5NywxMDUsMTA4LDk1LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNTQsMCwwLDAsMTMxLAorICAgIDIsMCwwLDExNSw4LDAsMCwwLDAsMywxOCwxLDE2LDEsMTQsMSwKKyAgICAxMjIsMjQsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LAorICAgIDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLAorICAgIDEwMCwxMDEsMTAyLDk3LDExNywxMDgsMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LAorICAgIDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLAorICAgIDk3LDExNiwxMDUsMTExLDExMCw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDEsCisgICAgMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsMTMsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEzOSwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsCisgICAgMjcsOTUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDY2LDk3LDExNSwxMDUsOTksMTE1LDQ2LDk5LAorICAgIDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw1NiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMSwxMzEsMSwKKyAgICAxMjUsMiwxMjQsMiwxMDAsMSwxMDcsOCwxMTQsMzYsMTE2LDIsMTAwLDIsMTA2LDMsCisgICAgMTI0LDEsMTA2LDEsMTMxLDEsMTMxLDEsMTMwLDEsMTE2LDQsMTA2LDUsMTE2LDYsCisgICAgMTI0LDIsMTI0LDEsMTA2LDcsMTMxLDMsMSwwLDEwMCwxLDgzLDAsNDEsMywKKyAgICAxMjIsMTksNjksMTIwLDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMjIsNTIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwOCwKKyAgICAxMTEsOTcsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLAorICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw0MCw0MSwzMiwKKyAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNzgsMTExLDExMCwxMDEsNDEsOCwyMTgsOCwKKyAgICAxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTA2LDAsMCwwLDExNCwxMDAsMCwKKyAgICAwLDAsMTE0LDQ4LDAsMCwwLDExNCwxMTUsMCwwLDAsMjE4LDI1LDk1LDk5LAorICAgIDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsCisgICAgMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCwxMTIsMCwKKyAgICAwLDAsNDEsMywxMTQsMTAxLDAsMCwwLDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDExNCwxNDEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDUsMCwwLDAsMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDE0MiwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDEyLDEsOCwKKyAgICAxLDYsMSwxMCwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsCisgICAgMTE1LDEwNSw5OSwxMTUsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMywwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsCisgICAgMTI0LDEsMTMxLDIsODMsMCw0MSwxLDEyMiwyNiw4NCwxMDQsMTA1LDExNSwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsCisgICAgMTE2LDEwMSwxMDAsNDYsNDEsMiwxMTQsMTE1LDAsMCwwLDIxOCwxNyw5NSwxMDgsMTExLAorICAgIDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwxMDksNDEsMiwKKyAgICAxMTQsMTAxLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDExLDEwOCwxMTEsOTcsMTAwLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE1MCwyLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDIsMTIyLDI1LDk1LDc2LDExMSw5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSwKKyAgICA0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSw4LDExNCwKKyAgICAxMDYsMCwwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsCisgICAgMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxODYsMCwKKyAgICAwLDAsMTE0LDE4OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTc5LDAsMCwwLAorICAgIDEyNiwyLDAsMCwxMTUsMTAsMCwwLDAsOCwzLDQsMiw4LDgsOCwKKyAgICAzLDgsOCwxMTQsMTc5LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDMsMCwwLDAsNjQsMCwwLDAsMTE1LDc0LDAsCisgICAgMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSwxMDAsMiwxMzIsMCwKKyAgICA5MCwzLDEwMCwzLDEwMCw0LDEzMiwwLDkwLDQsMTAwLDUsMTAwLDYsMTMyLDAsCisgICAgOTAsNSwxMDAsNywxMDAsOCwxMzIsMCw5MCw2LDEwMCw5LDEwMCwxMCwxMzIsMCwKKyAgICA5MCw3LDEwMCwxOCwxMDAsMTIsMTU2LDEsMTAwLDEzLDEwMCwxNCwxMzIsMiw5MCw4LAorICAgIDEwMCwxNSwxMDAsMTYsMTMyLDAsOTAsOSwxMDAsMTcsODMsMCw0MSwxOSwyMTgsMTIsCisgICAgODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw4LDAsMCwwLDExNiwwLDEzMCwxLDEwMCwxLDgzLDAsNDEsMiwKKyAgICAxMjIsMTc4LDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsCisgICAgMTAwLDMyLDExNiwxMDQsOTcsMTE2LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsCisgICAgMTE2LDEwNSwxMDksMTAxLDMyLDQwLDk3LDExMCwzMiwxMDUsMTEwLDExNiw0MSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTEyLAorICAgIDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDQ0LDMyLDExOSwxMDQsCisgICAgMTAxLDExNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LAorICAgIDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LAorICAgIDEwMSwxMTUsMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsCisgICAgOTgsMTAxLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDc4LDQxLDEsMjE4LDcsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LAorICAgIDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMTU3LDIsMCwwLDExNSwyLDAsMCwwLAorICAgIDAsNiwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDk5LDIsMCwwLDAsCisgICAgMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDE0LDAsMCwwLDEwMCwxLDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDEwNSwKKyAgICAxLDgzLDAsNDEsMiw5NywxNzAsMSwwLDAsNzksMTEyLDExNiwxMDUsMTExLDExMCwKKyAgICA5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMTA1LDExMCwxMDMsMzIsOTcsMzIsMTA5LDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDAsCisgICAgMTA1LDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDExNiwxMTEsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCisgICAgMTA0LDMyLDQwLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDgwLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDEwNywxMDEsMTIxLDExNSw1OCwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0NSwzMiwzOSwxMDksMTE2LDEwNSwxMDksMTAxLAorICAgIDM5LDMyLDQwLDEwOSw5NywxMTAsMTAwLDk3LDExNiwxMTEsMTE0LDEyMSw0MSwzMiwxMDUsMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDExNiwxMDUsMTA5LAorICAgIDEwMSwxMTUsMTE2LDk3LDEwOSwxMTIsMzIsMTExLDEwMiwzMiwxMDgsOTcsMTE1LDExNiwzMiwxMTUsCisgICAgMTExLDExNywxMTQsOTksMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDk5LDk3LDExNiwxMDUsMTExLAorICAgIDExMCw1OSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0NSwzMiwzOSwxMTUsMTA1LAorICAgIDEyMiwxMDEsMzksMzIsNDAsMTExLDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDQxLDMyLDEwNSwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwNSwxMjIsMTAxLDMyLDEwNSwxMTAsMzIsOTgsMTIxLAorICAgIDExNiwxMDEsMTE1LDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsCisgICAgMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwzMiwxMTQsCisgICAgMTAxLDk3LDEwMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwKKyAgICAxMDEsMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgyLDk3LDEwNSwxMTUsCisgICAgMTAxLDExNSwzMiw3Myw3OSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwKKyAgICA5OCwxMDEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMTE0LDEyNywwLDAsMCw0MSwxLDExNCwxOTEsMCwwLDAsCisgICAgNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwKKyAgICAxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDE2NSwyLDAsMCwxMTUsMiwwLDAsMCwKKyAgICAwLDExLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLAorICAgIDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxMiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMiwxMjQsMywxMzEsMiw4MywKKyAgICAwLDQxLDEsMTIyLDIyOCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwKKyAgICAxMTUsMzIsMTAwLDk3LDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMzIsMTE2LAorICAgIDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsOTcsCisgICAgMzIsMTE1LDExNiwxMTQsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCiAgICAgNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwNSwKICAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTE0LDEwMSwKLSAgICA5NywxMDAsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLAotICAgIDExNSw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LDEwMSwKLSAgICAxMTUsMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTgsCi0gICAgMTAxLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDExNCwxMzMsMCwwLDAsNDEsMSwxMTQsMTk2LDAsMCwwLDQxLAotICAgIDIsMTE0LDEwOCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LAotICAgIDk1LDExNSwxMTYsOTcsMTE2LDExNSwxNzAsMiwwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAxMSwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsOTksNCwwLDAsMCwwLAotICAgIDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMTYsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwyLDAsMTI0LDMsMCwKLSAgICAxMzEsMiwwLDgzLDQxLDEsMTIyLDIyOCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwKLSAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwKLSAgICAxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsCi0gICAgNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwKLSAgICAxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsCi0gICAgMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LAotICAgIDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsCi0gICAgMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCi0gICAgMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLAotICAgIDExNCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMTYsCi0gICAgMTE0LDk3LDExMCwxMTUsMTAyLDEwMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDIxOCw4LAotICAgIDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsNCwxMTQsMTA4LDAsMCwwLDExNCwKLSAgICA5MCwwLDAsMCw5MCwxMCw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExMiw5NywxMTYsMTA0LAotICAgIDExNCw1MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMTUsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LAotICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwxODMsMiwwLDAsMTE1LDIsMCwwLDAsMCw4LAotICAgIDEyMiwyOCw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTksMywKLSAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDE1MCwKLSAgICA3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwKLSAgICAxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiwKLSAgICA5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsCi0gICAgMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLAotICAgIDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsCi0gICAgMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsCi0gICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDc4LDExNCw0LDAsMCwwLDQxLDMsMTE0LDEwOCwKLSAgICAwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTgsMCwwLAotICAgIDAsMTkzLDIsMCwwLDExNSwwLDAsMCwwLDEyMiwyMSw4MywxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsCi0gICAgOTcsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsMTYsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDEwNSwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTIxLDE5LDAsMTI0LDAsMCwKLSAgICAxMDYsMSwwLDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDg3LDExMCw1OCwwLAotICAgIDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsOTQsMCwxLDEyNSw0LDAsMSwxMjIsCi0gICAgMjYsMCwxMTYsMywwLDEwMCwxLDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwxLAotICAgIDEsMTI0LDQsMCwxMzAsMiwwLDg3LDg5LDEwMCwzLDAsMTAwLDMsMCwxMjUsCi0gICAgNCwwLDEyNiw0LDAsODgsMTEwLDEsMCw4OCwxMTYsNCwwLDEyNCwzLDAsCi0gICAgMTMxLDEsMCw4Myw0MSw0LDEyMiw1Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwKLSAgICAzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsCi0gICAgMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEyMiwzOSwxMTUsMTExLAotICAgIDExNywxMTQsOTksMTAxLDMyLDExMCwxMTEsMTE2LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LAotICAgIDEwOCwxMDEsMzIsMTE2LDEwNCwxMTQsMTExLDExNywxMDMsMTA0LDMyLDEwMywxMDEsMTE2LDk1LDEwMCwKLSAgICA5NywxMTYsOTcsNDAsNDEsMTE0LDEwNiwwLDAsMCw3OCw0MSw1LDExNCwxNTcsMCwKLSAgICAwLDAsMjE4LDgsMTAzLDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5NywxMTQsNDAsMCwwLAotICAgIDAsMTE0LDEwNywwLDAsMCwxMTQsMTU1LDAsMCwwLDQxLDUsMTE0LDEwOCwwLAotICAgIDAsMCwxMTQsMTI2LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTUzLDAsMCwKLSAgICAwLDIxOCwzLDEwMSwxMjAsOTksMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDUsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwKLSAgICAxMDEsMjAwLDIsMCwwLDExNSwxNCwwLDAsMCwwLDIsMTUsMSwzLDEsCi0gICAgMTksMSwxOCwxLDksMSwzMSwxLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwKLSAgICAxMDEsMjE4LDksOTUsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDEwMSwxMTQsMjksMCwwLAotICAgIDAsOTksMywwLDAsMCwxLDAsMCwwLDQsMCwwLDAsOSwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTE2LDAsMCwxMDYsMSwKLSAgICAwLDExNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEwMCwxLDAsMTAwLDIsMCwKLSAgICAxMDAsMywwLDEwMCw0LDAsMTI0LDMsMCwxMzEsNCwyLDgzLDQxLDUsMTIyLAotICAgIDEzMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDExMSwxMDAsMTAxLAotICAgIDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwxMDAsCi0gICAgMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwzOSwxMDAsOTcsMTE2LDk3LAotICAgIDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiw5OSw5NywxMTAsMzIsOTgsCi0gICAgMTAxLDMyLDk3LDExMCwxMjEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDExNiwxMjEsMTEyLAotICAgIDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSwKLSAgICAzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDExNCwxODksMCwwLDAsMjE4LDEyLDEwMCwxMTEsMTEwLDExNiw5NSwxMDUsCi0gICAgMTEwLDEwNCwxMDEsMTE0LDEwNSwxMTYsODQsMTE0LDY4LDAsMCwwLDQxLDMsMTE0LDEyMSwKLSAgICAwLDAsMCwxMTQsMTg4LDAsMCwwLDIxOCw3LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsCi0gICAgMTAxLDQxLDQsMTE0LDEwOCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDM1LDAsCi0gICAgMCwwLDExNCwyMDMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDUsMCwwLDAsMjE4LDE0LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LAotICAgIDExMSw5NSw5OSwxMTEsMTAwLDEwMSwyMTAsMiwwLDAsMTE1LDQsMCwwLDAsMCwKLSAgICA1LDIxLDEsMTIyLDI3LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTYsMTExLDk1LDk5LDExMSwxMDAsMTAxLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwxMCwwLDAsMCw0MywwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsMTc0LDEsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwwLDEyNSwzLDAsMTIxLAotICAgIDE2LDAsMTE2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDQsMCw4NywxMTAsCi0gICAgMjQsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDYzLDAsMSwxLDEsMTAwLAotICAgIDEsMCwxMjUsNCwwLDg5LDExMCwyMDIsMCw4OCwxMjEsMTksMCwxMjQsMCwwLAotICAgIDEwNiwzLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw1LDAsODcsMTEwLDE4LDAsCi0gICAgNCwxMTYsNCwwLDEwNywxMCwwLDExNCwxMDMsMCwxLDEsMSw4OSwxMTAsMTYyLAotICAgIDAsODgsMTE2LDUsMCwxMjQsNSwwLDEwMCwyLDAsMjUsMTMxLDEsMCwxMjUsCi0gICAgMywwLDEyMSwxOSwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsNCwwLDEzMSwxLAotICAgIDAsMTI1LDYsMCw4NywxMTAsMTgsMCw0LDExNiw3LDAsMTA3LDEwLDAsMTE0LAotICAgIDE1OSwwLDEsMSwxLDg5LDExMCwxMDYsMCw4OCwxMjEsMzQsMCwxMTYsOCwwLAotICAgIDEyNCw2LDAsMTAwLDMsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDEsMCwxMDAsCi0gICAgNSwwLDEyNCw0LDAsMTMxLDEsMywxMjUsNywwLDg3LDExMCwyNCwwLDQsCi0gICAgMTE2LDksMCwxMTYsMTAsMCwxMDIsMiwwLDEwNywxMCwwLDExNCwyMjAsMCwxLAotICAgIDEsMSw4OSwxMTAsNDUsMCw4OCwxMTYsMTEsMCwxMDAsNiwwLDEyNCw0LDAsCi0gICAgMTI0LDIsMCwxMzEsMywwLDEsMTE2LDEyLDAsMTI0LDcsMCwxMDAsNCwwLAotICAgIDEyNCwxLDAsMTAwLDcsMCwxMjQsNCwwLDEwMCw4LDAsMTI0LDIsMCwxMzEsCi0gICAgMSwzLDgzLDEyNCwwLDAsMTA2LDYsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LAotICAgIDgsMCwxMjQsMCwwLDEwNiwxMywwLDEyNCw4LDAsMTI0LDIsMCwxMzEsMiwKLSAgICAwLDEyNSw5LDAsMTE2LDExLDAsMTAwLDksMCwxMjQsMiwwLDEzMSwyLDAsCi0gICAgMSwxMTYsMTQsMCwxMDYsMTUsMCwxMiwxMTQsMTcwLDEsMTI0LDQsMCwxMDAsMSwKLSAgICAwLDEwNyw5LDAsMTE0LDE3MCwxLDEyNCwzLDAsMTAwLDEsMCwxMDcsOSwwLAotICAgIDExNCwxNzAsMSwxMTYsMTYsMCwxMjQsOSwwLDEyNCwzLDAsMTE2LDE3LDAsMTI0LAotICAgIDgsMCwxMzEsMSwwLDEzMSwzLDAsMTI1LDYsMCwxMjEsMzYsMCwxMjQsMCwKLSAgICAwLDEwNiwxOCwwLDEyNCwyLDAsMTI0LDQsMCwxMjQsNiwwLDEzMSwzLDAsCi0gICAgMSwxMTYsMTEsMCwxMDAsMTAsMCwxMjQsNCwwLDEzMSwyLDAsMSw4NywxMTAsCi0gICAgMTgsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDE2OSwxLDEsMSwxLDg5LAotICAgIDExMCwxLDAsODgsMTI0LDksMCw4Myw0MSwxMSwxMjIsMTkwLDY3LDExMSwxMTAsOTksCi0gICAgMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDQ2LDEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgyLDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsCi0gICAgMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTQsMTAxLDExMywxMTcsCi0gICAgMTA1LDExNCwxMDEsMTE1LDMyLDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSwzMiwKLSAgICAxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsCi0gICAgMTAwLDQ2LDMyLDg0LDExMSwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDQ0LDMyLDExNSwxMDEsCi0gICAgMTE2LDk1LDEwMCw5NywxMTYsOTcsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk3LDEwOCwxMTUsMTExLAorICAgIDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwKKyAgICAxMTEsMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwKKyAgICAxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTEwLAorICAgIDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwKKyAgICAxMTEsMzIsOTksMTExLDExNCwxMTQsMTAxLDk5LDExNiwxMDgsMTIxLDMyLDExNiwxMTQsOTcsMTEwLAorICAgIDExNSwxMDIsMTAxLDExNCwzMiwxMTIsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsMTE1LAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQxLDEsMjE4LDgsMTE1LDEwMSwxMTYsCisgICAgOTUsMTAwLDk3LDExNiw5Nyw0MSw0LDExNCwxMDEsMCwwLDAsMTE0LDkxLDAsMCwKKyAgICAwLDkwLDEwLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDU0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDIxOCwxNSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKKyAgICAxMDAsMTAxLDE3OCwyLDAsMCwxMTUsMiwwLDAsMCwwLDgsMTIyLDI4LDgzLAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTksOTcsOTksCisgICAgMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5OSwzLDAsMCwwLAorICAgIDAsMCwwLDAsMywwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTUwLDc5LDExMiwxMTYsCisgICAgMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LAorICAgIDk5LDEwNCwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDQwLAorICAgIDk4LDEyMSwxMTYsMTAxLDExNSw0MSwzMiwxMTYsMTExLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiw0MCw5NywzMiwxMTUsMTE2LDExNCw0MSw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwKKyAgICAzMiw5NywxMDgsMTA4LDExMSwxMTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LAorICAgIDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTUsNDYsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsNzgsMTE0LDQsMCwwLDAsNDEsMywxMTQsMTAxLDAsMCwwLAorICAgIDExNCwzNSwwLDAsMCwxMTQsNTQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MywwLDAsMCwxODgsMiwKKyAgICAwLDAsMTE1LDAsMCwwLDAsMTIyLDIxLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw5OSwyLAorICAgIDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwxNiwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsODQsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTMxLDEsCisgICAgMTI1LDIsMTIxLDE0LDEyNCwwLDEwNiwxLDEyNCwyLDEzMSwxLDEyNSwzLDg3LDAsCisgICAgMTEwLDUwLDQsMCwxMTYsMiwxMDcsMTAsMTE0LDc0LDEsMCwxMjUsNCwxLDAsCisgICAgMTIyLDIyLDExNiwzLDEwMCwxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEyNCw0LAorICAgIDEzMCwyLDg3LDAsODksMCwxMDAsMywxMDAsMywxMjUsNCwxMjYsNCw4OCwwLAorICAgIDExMCwyLDg4LDAsMTE2LDQsMTI0LDMsMTMxLDEsODMsMCw0MSw0LDEyMiw1MiwKKyAgICA2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCisgICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsCisgICAgOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDQ2LDEyMiwzOSwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDExMCwxMTEsMTE2LAorICAgIDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsMzIsMTE2LDEwNCwxMTQsMTExLDExNywKKyAgICAxMDMsMTA0LDMyLDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDAsNDEsMTE0LDk5LDAsCisgICAgMCwwLDc4LDQxLDUsMTE0LDE1MiwwLDAsMCwyMTgsOCwxMDMsMTAxLDExNiw5NSwKKyAgICAxMDAsOTcsMTE2LDk3LDExNCw0MCwwLDAsMCwxMTQsMTAwLDAsMCwwLDExNCwxNTAsCisgICAgMCwwLDAsNDEsNSwxMTQsMTAxLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LAorICAgIDM1LDAsMCwwLDExNCwxNDgsMCwwLDAsMjE4LDMsMTAxLDEyMCw5OSwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTAsMTAzLAorICAgIDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxOTUsMiwwLDAsMTE1LDE0LDAsCisgICAgMCwwLDAsMiwxMCwxLDIsMSwxNCwxLDE2LDEsNiwxLDI4LDEsCisgICAgMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLAorICAgIDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMTQsMjksMCwwLDAsNDEsMSwKKyAgICAyMTgsOSw5NSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLDk5LDMsMCwwLDAsCisgICAgMSwwLDAsMCw0LDAsMCwwLDksMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDI2LDAsMCwwLDExNiwwLDEwNiwxLDExNiwyLDEyNCwxLDEyNCwyLDEwMCwKKyAgICAxLDEwMCwyLDEwMCwzLDEwMCw0LDEyNCwzLDE0NCwyLDEzMSw0LDgzLDAsNDEsCisgICAgNSwxMjIsMTMwLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLAorICAgIDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDk5LDExMSwxMDksMTEyLDEwNSwxMDgsCisgICAgMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDM5LDEwMCw5NywKKyAgICAxMTYsOTcsMzksMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDk5LDk3LDExMCwKKyAgICAzMiw5OCwxMDEsMzIsOTcsMTEwLDEyMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTE2LAorICAgIDEyMSwxMTIsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLAorICAgIDQwLDQxLDMyLDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMTUsNDYsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMTE0LDE4NCwwLDAsMCwyMTgsMTIsMTAwLDExMSwxMTAsMTE2LAorICAgIDk1LDEwNSwxMTAsMTA0LDEwMSwxMTQsMTA1LDExNiw4NCwxMTQsNjksMCwwLDAsNDEsMywKKyAgICAxMTQsMTE1LDAsMCwwLDExNCwxODMsMCwwLDAsMjE4LDcsOTksMTExLDEwOSwxMTIsCisgICAgMTA1LDEwOCwxMDEsNDEsNCwxMTQsMTAxLDAsMCwwLDExNCw1NCwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDE5OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTQsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA5NSwxMTYsMTExLDk1LDk5LDExMSwxMDAsMTAxLDIwNSwyLDAsMCwxMTUsNCwwLDAsCisgICAgMCwwLDUsMTQsMSwxMjIsMjcsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0NiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNiwxMTEsOTUsOTksMTExLAorICAgIDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDEwLDAsMCwwLDQzLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxMDYsMSwwLDAsMTI0LDAsMTA2LDAsCisgICAgMTI0LDEsMTMxLDEsMTI1LDIsMTAwLDEsMTI1LDMsMTIxLDEyLDExNiwxLDEyNCwyLAorICAgIDEzMSwxLDEyNSw0LDg3LDAsMTEwLDI0LDQsMCwxMTYsMiwxMDcsMTAsMTE0LDUwLAorICAgIDEsMCwxLDAsMSwwLDEwMCwxLDEyNSw0LDg5LDAsMTEwLDE3NCw4OCwwLAorICAgIDEyMSwxNCwxMjQsMCwxMDYsMywxMjQsMiwxMzEsMSwxMjUsNSw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDQsMTA3LDEwLDExNCw4NiwxLDAsMSwwLDEsMCw4OSwwLAorICAgIDExMCwxMzgsODgsMCwxMTYsNSwxMjQsNSwxMDAsMiwyNSwwLDEzMSwxLDEyNSwzLAorICAgIDEyMSwxNCwxMjQsMCwxMDYsNiwxMjQsNCwxMzEsMSwxMjUsNiw4NywwLDExMCwyMCwKKyAgICA0LDAsMTE2LDcsMTA3LDEwLDExNCwxMzQsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsOTAsODgsMCwxMjEsMjYsMTE2LDgsMTI0LDYsMTAwLDMsMTI0LDUsMTAwLDQsCisgICAgMTI0LDEsMTAwLDUsMTI0LDQsMTQ0LDMsMTMxLDEsMTI1LDcsODcsMCwxMTAsMjQsCisgICAgNCwwLDExNiw5LDExNiwxMCwxMDIsMiwxMDcsMTAsMTE0LDE4NiwxLDAsMSwwLAorICAgIDEsMCw4OSwwLDExMCwzOCw4OCwwLDExNiwxMSwxMDYsMTIsMTAwLDYsMTI0LDQsCisgICAgMTI0LDIsMTMxLDMsMSwwLDExNiwxMywxMjQsNywxMDAsNCwxMjQsMSwxMDAsNywKKyAgICAxMjQsNCwxMDAsOCwxMjQsMiwxNDQsMywxMzEsMSw4MywwLDEyNCwwLDEwNiw2LAorICAgIDEyNCwyLDEzMSwxLDEyNSw4LDEyNCwwLDEwNiwxNCwxMjQsOCwxMjQsMiwxMzEsMiwKKyAgICAxMjUsOSwxMTYsMTEsMTA2LDEyLDEwMCw5LDEyNCwyLDEzMSwyLDEsMCwxMTYsMTUsCisgICAgMTA2LDE2LDEyLDAsMTQ0LDEsMTE0LDEwMiwxMjQsNCwxMDAsMSwxMDcsOSwxNDQsMSwKKyAgICAxMTQsMTAyLDEyNCwzLDEwMCwxLDEwNyw5LDE0NCwxLDExNCwxMDIsMTE2LDE3LDEyNCw5LAorICAgIDEyNCwzLDExNiwxOCwxMjQsOCwxMzEsMSwxMzEsMywxMjUsNiwxMjEsMzAsMTI0LDAsCisgICAgMTA2LDE5LDEyNCwyLDEyNCw0LDEyNCw2LDEzMSwzLDEsMCwxMTYsMTEsMTA2LDEyLAorICAgIDEwMCwxMCwxMjQsNCwxMzEsMiwxLDAsODcsMCwxMTAsMjIsNCwwLDExNiwyLAorICAgIDEwNywxMCwxNDQsMSwxMTQsMTAwLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsCisgICAgODgsMCwxMjQsOSw4MywwLDQxLDExLDEyMiwxOTAsNjcsMTExLDExMCw5OSwxMTQsMTAxLAorICAgIDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsCisgICAgMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsODIsMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTEsMTAyLAorICAgIDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LAorICAgIDEwMSwxMTUsMzIsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDMyLDExNiwxMTEsCiAgICAgMzIsOTgsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTE0LDEzMywwLDAsMCwKLSAgICAxMTQsMTM4LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDEyMiwKLSAgICAxMywxMjMsMTI1LDMyLDEwOSw5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTIzLDEyNSwxMTQsODksCi0gICAgMCwwLDAsMTE0LDkwLDAsMCwwLDEyMiwxOSw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsCi0gICAgOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywxMjUsMTIyLDEwLDExOSwKLSAgICAxMTQsMTExLDExNiwxMDEsMzIsMTIzLDMzLDExNCwxMjUsNDEsMTksMTE0LDE1NywwLDAsMCwKLSAgICAxMTQsNzksMCwwLDAsMTE0LDY2LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5NSwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsNDAsCi0gICAgMCwwLDAsMTE0LDE0MSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMzYsMCwKLSAgICAwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTQ3LDAsMCwwLDExNCwyMDYsMCwwLAotICAgIDAsMTE0LDcsMCwwLDAsMjE4LDE5LDEwMCwxMTEsMTEwLDExNiw5NSwxMTksMTE0LDEwNSwKLSAgICAxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwxNTAsMCwwLDAsCi0gICAgMTE0LDMxLDAsMCwwLDExNCwxOTksMCwwLDAsNDEsMTAsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCw5MCwwLDAsMCwxMTQsMTM5LDAsMCwwLAotICAgIDExNCw4OSwwLDAsMCwyMTgsMiwxMTUsMTE2LDExNCw1MywwLDAsMCwyMTgsMTAsCi0gICAgOTgsMTIxLDExNiwxMDEsMTE1LDk1LDEwMCw5NywxMTYsOTcsMTE0LDE1MywwLDAsMCw5MCwKLSAgICAxMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NywwLDAsMCwKLSAgICAyMTgsMiwwLDAsMTE1LDc4LDAsMCwwLDAsNywxNSwxLDYsMSwzLAotICAgIDEsMTYsMSwxMywxLDExLDIsMywxLDE5LDEsMTMsMSw1LDIsMTYsCi0gICAgMSwzLDEsMTksMSwxMywxLDUsMiwzLDEsOSwxLDEyLDEsMTMsCi0gICAgMSwxOSwxLDUsMiw5LDEsNywxLDE1LDEsNiwxLDcsMSwxNSwKLSAgICAxLDE4LDEsMTMsMSwyMiwxLDEyLDEsOSwxLDE1LDEsMywxLDE5LAotICAgIDEsMTcsMSwxMywxLDUsMSwxMjIsMjEsODMsMTExLDExNywxMTQsOTksMTAxLDc2LAotICAgIDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw3OCwxMTQsCi0gICAgODcsMCwwLDAsNDEsMTAsMTE0LDExMiwwLDAsMCwxMTQsMTExLDAsMCwwLAotICAgIDExNCwxMTMsMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsMTk3LDAsMCwwLDExNCwKLSAgICAxOTksMCwwLDAsMTE0LDE5OCwwLDAsMCwxMTQsMjAyLDAsMCwwLDExNCwyMDYsCi0gICAgMCwwLDAsMTE0LDE4NywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTk0LDAsMCwKLSAgICAwLDE2MCwyLDAsMCwxMTUsMTQsMCwwLDAsMTIsMiwxMiw4LDEyLDEzLAotICAgIDEyLDEwLDEyLDcsMTIsMTAsMTgsOCwxMTQsMTk0LDAsMCwwLDk5LDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMCwwLAotICAgIDAsMCwxMTUsMTEyLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsCi0gICAgOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsCi0gICAgMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LAotICAgIDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMSw3LDAsCi0gICAgMTM1LDAsMCwxMDIsMSwwLDEwMCw4LDAsMTAwLDksMCwxMzQsMCwwLDEzMSwKLSAgICAxLDAsOTAsOCwwLDEwMSw3LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsCi0gICAgMCwxMzEsMSwwLDkwLDksMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLAotICAgIDkwLDEwLDAsMTM1LDAsMCw4Myw0MSwxNCwyMTgsMTAsNzAsMTA1LDEwOCwxMDEsNzYsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDEyMiwxMDMsNjYsOTcsMTE1LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSwxMDgsOTcsMTE1LDExNSwzMiwxMTksMTA0LAotICAgIDEwNSw5OSwxMDQsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTE1LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTEyLDExNCwxMTEsMTE2LDExMSw5OSwKLSAgICAxMTEsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNSwzMiwxMTYsMTA0LDk3LDExNiwxMCwKLSAgICAzMiwzMiwzMiwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLAotICAgIDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDExNywxMTUsOTcsMTAzLDEwMSw0Niw5OSwzLAotICAgIDAsMCwwLDAsMCwwLDAsMywwLDAsMCwyLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwKLSAgICAwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDEsMCw4Myw0MSwyLAotICAgIDEyMiw3NSw2Nyw5Nyw5OSwxMDQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMzIsMTAyLDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsNzgsNDEsMiwKLSAgICAxMTQsMTA2LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwzLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NSwwLDAsMCwxOSwKLSAgICAzLDAsMCwxMTUsNCwwLDAsMCwwLDMsOSwxLDEyMiwxOSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LAotICAgIDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMjQsMSwwLDEwNiwwLDAsMTA3LDIsMCwxMTEsMzMsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywyLDAsODMsNDEsMSw3OCwKLSAgICA0MSwyLDIxOCw5LDk1LDk1LDk5LDEwOCw5NywxMTUsMTE1LDk1LDk1LDExNCwxMTgsMCwKLSAgICAwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDIxOCw1LDExMSwxMTYsMTA0LDEwMSwxMTQsCisgICAgMzIsODQsMTExLDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsNDQsMzIsMTE1LDEwMSwxMTYsOTUsCisgICAgMTAwLDk3LDExNiw5NywzMiwxMDksMTE3LDExNSwxMTYsMzIsOTcsMTA4LDExNSwxMTEsMzIsOTgsCisgICAgMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTE0LDEyNywwLDAsMCwxMTQsMTMzLAorICAgIDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMzUsMCwwLDAsMTIyLDEzLDEyMywKKyAgICAxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwxMjMsMTI1LDExNCw5MCwwLDAsCisgICAgMCwxMTQsOTEsMCwwLDAsMTIyLDE5LDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsCisgICAgMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDEyNSwxMjIsMTAsMTE5LDExNCwxMTEsCisgICAgMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwyMCwxMTQsMTUyLDAsMCwwLDExNCw4MCwKKyAgICAwLDAsMCwxMTQsNjcsMCwwLDAsMTE0LDE5MiwwLDAsMCwxMTQsMTkwLDAsCisgICAgMCwwLDExNCwxNCwwLDAsMCwxMTQsMTk1LDAsMCwwLDExNCw0MCwwLDAsCisgICAgMCwxMTQsMTM2LDAsMCwwLDExNCwxMDAsMCwwLDAsMTE0LDEzMSwwLDAsMCwKKyAgICAxMTQsMTE1LDAsMCwwLDExNCwxMzAsMCwwLDAsMTE0LDE0MiwwLDAsMCwxMTQsCisgICAgMjAxLDAsMCwwLDExNCw3LDAsMCwwLDIxOCwxOSwxMDAsMTExLDExMCwxMTYsOTUsCisgICAgMTE5LDExNCwxMDUsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTQ1LAorICAgIDAsMCwwLDExNCwzMSwwLDAsMCwxMTQsMTk0LDAsMCwwLDQxLDEwLDExNCwKKyAgICAxMDEsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDEzNCwKKyAgICAwLDAsMCwxMTQsOTAsMCwwLDAsMjE4LDIsMTE1LDExNiwxMTQsNTQsMCwwLAorICAgIDAsMjE4LDEwLDk4LDEyMSwxMTYsMTAxLDExNSw5NSwxMDAsOTcsMTE2LDk3LDExNCwxNDgsMCwKKyAgICAwLDAsOTAsMTEsOTksMTExLDEwMCwxMDEsOTUsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODIsCisgICAgMCwwLDAsMjEzLDIsMCwwLDExNSw3OCwwLDAsMCwwLDcsMTAsMSwKKyAgICA0LDEsMiwxLDEyLDEsMTQsMSwxMCwyLDIsMSwxNCwxLDE0LDEsCisgICAgNiwyLDEyLDEsMiwxLDE0LDEsMTQsMSw2LDIsMiwxLDYsMSwKKyAgICA4LDEsMTIsMSwxOCwxLDYsMiw4LDEsNiwxLDEwLDEsNCwxLAorICAgIDgsMSwxMCwxLDEyLDEsMTIsMSwyMCwxLDEwLDEsNiwxLDEwLDEsCisgICAgMiwxLDE0LDEsMTYsMSwxNiwxLDYsMSwxMjIsMjEsODMsMTExLDExNywxMTQsCisgICAgOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLAorICAgIDEwMSw3OCwxMTQsODgsMCwwLDAsNDEsMTAsMTE0LDEwNiwwLDAsMCwxMTQsMTA1LAorICAgIDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsMTkyLDAsCisgICAgMCwwLDExNCwxOTQsMCwwLDAsMTE0LDE5MywwLDAsMCwxMTQsMTk3LDAsMCwKKyAgICAwLDExNCwyMDEsMCwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCisgICAgMTg5LDAsMCwwLDE1NSwyLDAsMCwxMTUsMTQsMCwwLDAsOCwyLDgsCisgICAgOCw4LDEzLDgsMTAsOCw3LDgsMTAsMTQsOCwxMTQsMTg5LDAsMCwwLAorICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwwLAorICAgIDAsMCwwLDAsMCwxMTUsNzYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCwKKyAgICA5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsNCwKKyAgICAxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDEzMiwwLDkwLDYsMTAxLDcsCisgICAgMTM1LDAsMTAyLDEsMTAwLDgsMTAwLDksMTMyLDgsMTMxLDEsOTAsOCwxMDEsNywKKyAgICAxMDAsMTAsMTAwLDExLDEzMiwwLDEzMSwxLDkwLDksMTAwLDEyLDEwMCwxMywxMzIsMCwKKyAgICA5MCwxMCwxMzUsMCw4MywwLDQxLDE0LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwKKyAgICAxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLDExOSwxMDQsMTA1LAorICAgIDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LDExMSwxMTYsMTExLDk5LDExMSwKKyAgICAxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDEwLDMyLAorICAgIDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsCisgICAgMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsMTAxLDQ2LDk5LDMsMCwKKyAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDE2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTI0LDIsMTI0LAorICAgIDAsOTUsMSwxMDAsMSw4MywwLDQxLDIsMTIyLDc1LDY3LDk3LDk5LDEwNCwxMDEsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLAorICAgIDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMDIsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw3OCw0MSwyLDExNCw5OSwwLDAsMCwxMTQsMzUsCisgICAgMCwwLDAsNDEsMywxMTQsMTAxLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LAorICAgIDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwxODAsMCwwLDAsMTQsMywwLDAsMTE1LDQsMCwwLAorICAgIDAsMCwzLDYsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwKKyAgICAyNCwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMCwxMDcsMiwxMTEsMjIsCisgICAgMTI0LDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsODMsMCw0MSwxLDc4LDQxLAorICAgIDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsOTUsMTE0LDExMiwwLDAsCisgICAgMCw0MSwyLDExNCwxMDEsMCwwLDAsMjE4LDUsMTExLDExNiwxMDQsMTAxLDExNCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNiwKKyAgICA5NSw5NSwxMDEsMTEzLDk1LDk1LDIwLDMsMCwwLDExNSw0LDAsMCwwLDAsCisgICAgMSwxMiwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwKKyAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLDAsMCwKKyAgICAxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwxMTYsMCwxMjQsMCwxMDYsMiwxMzEsMSwKKyAgICA2NSwwLDgzLDAsNDEsMSw3OCw0MSwzLDIxOCw0LDEwNCw5NywxMTUsMTA0LDExNCwKKyAgICA5OSwwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMSwxMTQsMTAxLDAsMCwwLAogICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwKLSAgICA2LDk1LDk1LDEwMSwxMTMsOTUsOTUsMjUsMywwLDAsMTE1LDQsMCwwLDAsCi0gICAgMCwxLDE4LDEsMTIyLDE3LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0Niw5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwKLSAgICAwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEwNiwyLDAsMTMxLDEsMCw2NSw4Myw0MSwxLDc4LDQxLDMsCi0gICAgMjE4LDQsMTA0LDk3LDExNSwxMDQsMTE0LDEwNiwwLDAsMCwxMTQsMzUsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw1LDAsMCwwLDIxOCw4LDk1LDk1LDEwNCw5NywxMTUsMTA0LDk1LDk1LAotICAgIDI5LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMTksNzAsMTA1LDEwOCwKLSAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNCw5NywxMTUsMTA0LDk1LDk1LAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLAotICAgIDAsMywwLDAsMCwxMTUsMjIsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLAotICAgIDEyNCwwLDAsMTMxLDIsMCwxMDYsMiwwLDEyNCwxLDAsMTMxLDEsMCw4MywKLSAgICA0MSwxLDEyMiwxMDAsNzYsMTExLDk3LDEwMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDIsMTE0LDExMSwxMDksMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LAotICAgIDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLAotICAgIDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDQxLDMsMjE4LDUsMTE1LDExNywxMTIsMTAxLAotICAgIDExNCwxMTQsMjEwLDAsMCwwLDExNCwxOTMsMCwwLDAsNDEsMiwxMTQsMTA4LDAsCi0gICAgMCwwLDExNCwxMjYsMCwwLDAsNDEsMSwxMTQsMjExLDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTMsMCwwLDAsMzIsMywwLAotICAgIDAsMTE1LDIsMCwwLDAsMCwxMCwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDcsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDgzLDQxLDEsMTIyLDU4LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgOCw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwyNCwzLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsMTE1LDE2LAorICAgIDAsMCwwLDExNiwwLDExNiwxLDEyNCwwLDEzMSwyLDEwNiwyLDEyNCwxLDEzMSwKKyAgICAxLDgzLDAsNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwKKyAgICAxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksCisgICAgOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwzLDIxOCw1LDExNSwKKyAgICAxMTcsMTEyLDEwMSwxMTQsMTE0LDIwNSwwLDAsMCwxMTQsMTg4LDAsMCwwLDQxLDIsCisgICAgMTE0LDEwMSwwLDAsMCwxMTQsMTIwLDAsMCwwLDQxLDEsMTE0LDIwNiwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg4LDAsMCwwLAorICAgIDI3LDMsMCwwLDExNSwyLDAsMCwwLDAsMTAsMTIyLDIyLDcwLDEwNSwxMDgsCisgICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKKyAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw2LDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDgzLDAsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTEsCisgICAgMTE3LDExNCw5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwxMDIsMTExLDExNywKKyAgICAxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICA0Niw0MSwxLDExNCwzNSwwLDAsMCw0MSwyLDExNCwxMDEsMCwwLDAsMTE0LAorICAgIDEyMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKKyAgICAwLDAsMCwxMTQsMTUyLDAsMCwwLDM5LDMsMCwwLDExNSwyLDAsMCwKKyAgICAwLDAsMywxMjIsMjMsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMywwLDAsMCw5LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwzMiwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMDAsMSwxMzEsMiwKKyAgICAxNDMsMTAsMTI1LDIsMTI0LDIsMTA2LDIsMTMxLDAsODMsMCw4MSwwLDgyLDAsCisgICAgODgsMCwxMDAsMiw4MywwLDQxLDMsMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMDIsMTE0LDExMSwxMDksMzIsMTEyLAorICAgIDk3LDExNiwxMDQsMzIsOTcsMTE1LDMyLDExNCw5NywxMTksMzIsOTgsMTIxLDExNiwxMDEsMTE1LAorICAgIDQ2LDIxOCwxLDExNCw3OCw0MSwzLDExNCw1MCwwLDAsMCwxMTQsNTEsMCwwLAorICAgIDAsOTAsNCwxMTQsMTAxLDk3LDEwMCw0MSwzLDExNCwxMDEsMCwwLDAsMTE0LDM1LAorICAgIDAsMCwwLDExNCw1NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTk1LDAsMCwwLDQ0LDMsMCwwLAorICAgIDExNSw0LDAsMCwwLDAsMiwxNCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSwxMSwKKyAgICAxMTQsMTA2LDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsCisgICAgMTA4LDAsMCwwLDExNCwxODAsMCwwLDAsMTE0LDIwOCwwLDAsMCwxMTQsMjEwLAorICAgIDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsMTUyLDAsCisgICAgMCwwLDExNCwxOTUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsNDEsMSwxMTQsMjA2LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMDUsMCwKKyAgICAwLDAsOSwzLDAsMCwxMTUsMTQsMCwwLDAsOCwzLDQsMiw4LAorICAgIDYsOCw0LDgsMywxNiwxMiwxMiw1LDExNCwyMDUsMCwwLDAsOTksMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwKKyAgICAwLDAsMCwxMTUsNDYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLAorICAgIDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsNCwxMDAsNSwKKyAgICAxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDE1NiwxLDEwMCw4LDEwMCw5LDEzMiwyLAorICAgIDkwLDYsMTAwLDEwLDgzLDAsNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LDExMSwxMTAsOTksCisgICAgMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKKyAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMjIsMCwwLDAsMTE2LDAsMTI0LDEsMTMxLDEsMTI1LDIsMTI0LDIsMTA2LDEsCisgICAgMTI0LDIsMTA2LDIsMTAwLDEsMTU2LDIsODMsMCw0MSwyLDEyMiwzMyw4MiwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDk3LDEwMCw5NywxMTYsCisgICAgOTcsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDYsNDEsCisgICAgMiwxMjIsNSwxMDksMTE2LDEwNSwxMDksMTAxLDEyMiw0LDExNSwxMDUsMTIyLDEwMSw0MSwzLAorICAgIDExNCwzOSwwLDAsMCwyMTgsOCwxMTUsMTE2LDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsOTAsCisgICAgNywxMTUsMTE2LDk1LDExNSwxMDUsMTIyLDEwMSw0MSwzLDExNCwxMDEsMCwwLDAsMTE0LAorICAgIDM1LDAsMCwwLDExNCwyMDMsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MiwwLDAsMCw1NCwzLDAsCisgICAgMCwxMTUsNCwwLDAsMCwwLDIsOCwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSw5OSw0LDAsMCwwLDAsMCwwLDAsCisgICAgNSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwyNiwwLDAsCisgICAgMCwxMTYsMCwxMjQsMSwxMzEsMSwxMjUsNCwxMjQsMCwxMDYsMSwxMjQsMiwxMjQsCisgICAgMywxMDAsMSwxMjQsNCwxNDQsMSwxMzEsMiw4MywwLDQxLDIsNzgsMjE4LDUsCisgICAgOTUsMTA5LDExMSwxMDAsMTAxLDQxLDIsMTE0LDk4LDAsMCwwLDExNCwxOTMsMCwwLAorICAgIDAsNDEsNSwxMTQsMTAxLDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTAsMCwKKyAgICAwLDAsMTE0LDU0LDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTk0LDAsMCwwLAorICAgIDU5LDMsMCwwLDExNSw0LDAsMCwwLDAsMiw4LDEsMTIyLDMyLDgzLAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMDUsCisgICAgMTgyLDEsMCwwLDQxLDEsMTE0LDIxNSwwLDAsMCw5OSwzLDAsMCwwLAorICAgIDEsMCwwLDAsOSwwLDAsMCwxNywwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMjUwLDAsMCwwLDExNiwwLDEyNCwxLDEzMSwxLDkyLDIsMTI1LDQsMTI1LAorICAgIDUsMTAzLDAsMTI1LDYsMTIwLDQwLDEyNCw0LDExNCw1NiwxMTYsMSwxMjQsNCwxMzEsCisgICAgMSwxMiwwLDExNCw1NiwxMTYsMCwxMjQsNCwxMzEsMSw5MiwyLDEyNSw0LDEyNSwKKyAgICA3LDEyNCw2LDEwNiwyLDEyNCw3LDEzMSwxLDEsMCwxMTMsMTgsODcsMCwxMjAsCisgICAgMTA4LDExNiwzLDEyNCw2LDEzMSwxLDY4LDAsOTMsOTYsMTI1LDcsMTE2LDQsMTI0LAorICAgIDQsMTI0LDcsMTMxLDIsMTI1LDQsMTIxLDE0LDExNiw1LDEwNiw2LDEyNCw0LDEzMSwKKyAgICAxLDEsMCw4NywwLDExMyw2OCw0LDAsMTE2LDcsMTA3LDEwLDExNCwxMTgsMSwKKyAgICAwLDEsMCwxLDAsMTE5LDY4LDg5LDAsMTEzLDY4LDQsMCwxMTYsOCwxMDcsCisgICAgMTAsMTE0LDE2MiwxLDAsMTI1LDgsMSwwLDEyMiwxOCwxMTYsOSwxMDYsMTAsMTAwLAorICAgIDEsMTI0LDQsMTI0LDgsMTMxLDMsMSwwLDEwMCwyLDgzLDAsMTAwLDIsMTI1LAorICAgIDgsMTI2LDgsODgsMCwxMTMsNjgsODgsMCwxMTMsNjgsODcsMCwxMjEsMjgsMTE2LAorICAgIDExLDEyNCwxLDEyNCwyLDEyNCwzLDEzMSwzLDEsMCwxMTYsOSwxMDYsMTAsMTAwLAorICAgIDMsMTI0LDEsMTMxLDIsMSwwLDg3LDAsMTEwLDQ4LDQsMCwxMTYsOCwxMDcsCisgICAgMTAsMTE0LDI0NCwxLDAsMTI1LDgsMSwwLDEyMiwyMCwxMTYsOSwxMDYsMTAsMTAwLAorICAgIDEsMTI0LDEsMTI0LDgsMTMxLDMsMSwwLDg3LDAsODksMCwxMDAsMiwxMDAsCisgICAgMiwxMjUsOCwxMjYsOCw4OCwwLDExMCwyLDg4LDAsMTAwLDIsODMsMCw0MSwKKyAgICA0LDEyMiwyNyw4NywxMTQsMTA1LDExNiwxMDEsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwMCwKKyAgICA5NywxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsNDYsMTIyLDI3LAorICAgIDk5LDExMSwxMTcsMTA4LDEwMCwzMiwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCisgICAgMzIsMTIzLDMzLDExNCwxMjUsNTgsMzIsMTIzLDMzLDExNCwxMjUsNzgsMTIyLDEyLDk5LDExNCwKKyAgICAxMDEsOTcsMTE2LDEwMSwxMDAsMzIsMTIzLDMzLDExNCwxMjUsNDEsMTIsMTE0LDM4LDAsMCwKKyAgICAwLDExNCw0NiwwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCwzMywwLDAsMCwKKyAgICAxMTQsMjgsMCwwLDAsMTE0LDMsMCwwLDAsOTAsNSwxMDksMTA3LDEwMCwxMDUsCisgICAgMTE0LDIxOCwxNSw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsMTA1LDExNSwxMTYsMTE1LDY5LDExNCwxMTQsCisgICAgMTExLDExNCwxMTQsNDAsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTMwLDAsMCwKKyAgICAwLDExNCw1NiwwLDAsMCw0MSw5LDExNCwxMDEsMCwwLDAsMTE0LDM1LDAsCisgICAgMCwwLDExNCw1NCwwLDAsMCwxMTQsMjE1LDAsMCwwLDIxOCw2LDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsMTE0LDk1LDAsMCwwLDExNCwyNywwLDAsMCwxMTQsMjMsCisgICAgMCwwLDAsMTE0LDE5NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMTkzLDAsMCwwLDY0LDMsMCwwLAorICAgIDExNSw0MiwwLDAsMCwwLDIsMTIsMSw0LDIsMTYsMSwxMiwxLDE0LAorICAgIDIsMTQsMSwxMCwxLDIsMSwxNCwxLDE0LDIsNiwxLDE2LDMsNiwKKyAgICAxLDgsMSwyMCwxLDIsMSwxMiwxLDE2LDEsMTYsMiw4LDEsMTIyLAorICAgIDI1LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw3OCw0MSw3LDExNCwxMDYsMCwKKyAgICAwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLAorICAgIDAsMTE0LDE5MiwwLDAsMCwxMTQsMTk0LDAsMCwwLDExNCwxOTMsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDIxMywwLDAsMCw1MCwzLDAsMCwxMTUsOCwwLAorICAgIDAsMCw4LDIsNCwyLDgsNSw4LDUsMTE0LDIxMywwLDAsMCw5OSwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDY0LDAsMCwwLDExNSwzMiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLAorICAgIDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LDEwMCw0LDEwMCwKKyAgICA1LDEzMiwwLDkwLDUsMTAwLDYsODMsMCw0MSw3LDIxOCwyMCw4MywxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCwxMjIsNDUsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwKKyAgICAxMDQsOTcsMTEwLDEwMCwxMDgsMTAxLDExNSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsCisgICAgMTE1LDExNSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LAorICAgIDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDYsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDU2LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLAorICAgIDEzMSwxLDEyNSwyLDEyNCwwLDEwNiwxLDEyNCwyLDEzMSwxLDEyNSwzLDExNiwyLAorICAgIDEyNCwzLDEwMCwxLDEyNCwxLDEwMCwyLDEyNCwyLDE0NCwyLDEzMSwxLDEyNSw0LAorICAgIDExNiwzLDEyNCw0LDEwMCwxLDEyNCwxLDEwMCwzLDEyNCwyLDE0NCwyLDEzMSwxLAorICAgIDgzLDAsNDEsNCw3OCwxMTQsOTksMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKKyAgICA5MCwwLDAsMCw0MSw0LDExNCwxNTIsMCwwLDAsMTE0LDE5NSwwLDAsMCwKKyAgICAxMTQsMTM2LDAsMCwwLDExNCwxNDIsMCwwLDAsNDEsNSwxMTQsMTAxLDAsMCwKKyAgICAwLDExNCwxMjAsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw1NCwwLDAsMCwKKyAgICAxMTQsMjA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDExNCwxODIsMCwwLDAsOTksMywwLDAsMTE1LDgsMCwKKyAgICAwLDAsMCwxLDEwLDEsMTAsMSwxOCwxLDEyMiwyOSw4MywxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LAorICAgIDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMzksODIsMTAxLDExNiwxMTcsMTE0LAorICAgIDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMTE0LDEwMSwzMiwKKyAgICAxMDUsMTE1LDMyLDExMCwxMTEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLAorICAgIDEwMSw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDEsMCwwLDAsMTE0LAorICAgIDEyMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKKyAgICAwLDAsMCwxMTQsMTk3LDAsMCwwLDEwNSwzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDIsMTIyLDMxLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsCisgICAgMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsCisgICAgMTE3LDExNCw5OSwxMDEsNzgsNDEsNiwxMTQsMTA2LDAsMCwwLDExNCwxMDUsMCwwLAorICAgIDAsMTE0LDEwNywwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwxODIsMCwwLDAsCisgICAgMTE0LDE5NywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjE4LDAsMCwwLDk1LDMsCisgICAgMCwwLDExNSw2LDAsMCwwLDgsMiw0LDIsOCw2LDExNCwyMTgsMCwKKyAgICAwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywKKyAgICAwLDAsMCw2NCwwLDAsMCwxMTUsOTIsMCwwLDAsMTAxLDAsOTAsMSwKKyAgICAxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwKKyAgICAxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LDEzMiwwLDkwLDYsCisgICAgMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsMTAwLDExLDEzMiwwLDkwLDgsCisgICAgMTAwLDEyLDEwMCwxMywxMzIsMCw5MCw5LDEwMCwxNCwxMDAsMTUsMTMyLDAsOTAsMTAsCisgICAgMTAwLDE2LDEwMCwxNywxMzIsMCw5MCwxMSwxMDEsMTIsMTAwLDE4LDEwMCwxOSwxMzIsMCwKKyAgICAxMzEsMSw5MCwxMywxMDAsMjAsODMsMCw0MSwyMSwyMTgsMTksNjksMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLAorICAgIDkzLDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMDEsMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiw5OSwxMTEsMTEwLDExNSwxMTYsMTE0LDExNyw5OSwKKyAgICAxMTYsMTExLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsCisgICAgMTE2LDExMSwzMiwxMTksMTExLDExNCwxMDcsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDcwLDEwNSwxMDgsCisgICAgMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMywKKyAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMjQsMiwKKyAgICAxMjQsMCw5NSwxLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwyLDExNCw5OSwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsNDEsMywxMTQsMTAxLDAsMCwwLDExNCw5OSwKKyAgICAwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE4MCwwLDAsMCwxMjIsMywwLDAsCisgICAgMTE1LDQsMCwwLDAsMCwxLDYsMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLAorICAgIDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsCisgICAgOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDI0LDAsMCwKKyAgICAwLDEyNCwwLDEwNiwwLDEyNCwxLDEwNiwwLDEwNywyLDExMSwyMiwxMjQsMCwxMDYsCisgICAgMSwxMjQsMSwxMDYsMSwxMDcsMiw4MywwLDQxLDEsNzgsNDEsMiwxMTQsMjA2LAorICAgIDAsMCwwLDExNCwxMTIsMCwwLDAsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwKKyAgICAyMDcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMTE0LDIwOCwwLDAsMCwxMjYsMywwLDAsMTE1LDQsMCwwLAorICAgIDAsMCwxLDEyLDEsMTIyLDI2LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCisgICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTMsOTUsCisgICAgOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMjAsMCwwLDAsMTE2LDAsMTI0LDAsMTA2LAorICAgIDEsMTMxLDEsMTE2LDAsMTI0LDAsMTA2LDIsMTMxLDEsNjUsMCw4MywwLDQxLAorICAgIDEsNzgsNDEsMywxMTQsMjA5LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMzUsCisgICAgMCwwLDAsNDEsMSwxMTQsMTAxLDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTAsMCwwLDAsMTMwLDMsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjgsNjksMTIwLDExNiwxMDEsMTEwLAorICAgIDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsCisgICAgOTUsMTA0LDk3LDExNSwxMDQsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLAorICAgIDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzYsMCwwLAorICAgIDAsMTE2LDAsMTA2LDEsMTE2LDIsMTA2LDMsMTI0LDEsMTMxLDIsMTI1LDIsMTE2LAorICAgIDAsMTA2LDQsMTAwLDEsMTI0LDEsMTA2LDUsMTI0LDAsMTA2LDYsMTMxLDMsMSwKKyAgICAwLDEyNCwyLDgzLDAsNDEsMiwxMjIsMzgsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLAorICAgIDk3LDExMCwzMiwxMTcsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLAorICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLAorICAgIDM4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwKKyAgICAxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDQxLDcsMTE0LDExNSwwLDAsMCwxMTQsMTgzLAorICAgIDAsMCwwLDExNCwxNDAsMCwwLDAsOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLAorICAgIDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksMTE0LDEzMCwwLDAsMCwxMTQsOTksMCwKKyAgICAwLDAsMTE0LDM1LDAsMCwwLDQxLDMsMTE0LDEwMSwwLDAsMCwxMTQsMTU5LAorICAgIDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMzMsMywwLDAsCisgICAgMTE1LDEwLDAsMCwwLDAsMiw0LDEsMTAsMSw2LDEsMTIsMSwxMjIsCisgICAgMzMsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDExNiwwLDEwNiwxLAorICAgIDExNiwyLDEwNiwzLDEyNCwxLDEzMSwyLDEsMCwxMTYsMCwxMDYsNCwxMDAsMSwKKyAgICAxMjQsMCwxMDYsNSwxMjQsMCwxMDYsNiwxMzEsMywxLDAsMTAwLDIsODMsMCwKKyAgICA0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDMyLDk3LAorICAgIDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAxLDEyMCwxMDEsOTksMTE3LDExNiwKKyAgICAxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw3OCw0MSw3LDExNCwKKyAgICAxMTUsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTQwLDAsMCwwLDkwLDEyLAorICAgIDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksMTE0LDEzMCwwLDAsCisgICAgMCwxMTQsOTksMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwMSwwLAorICAgIDAsMCwxMTQsMTg1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDExNCwxODYsMCwwLDAsMTQxLDMsMCwwLDExNSwKKyAgICA2LDAsMCwwLDAsMiwxNCwxLDYsMSwxMjIsMzEsNjksMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwKKyAgICAwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLAorICAgIDExNSwzNiwwLDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwxMDAsMSwyNSwKKyAgICAwLDEzNywwLDExNiwyLDEzNSwwLDEwMiwxLDEwMCwyLDEwMCwzLDEzMiw4LDExNiwKKyAgICAzLDY4LDAsMTMxLDEsMTMxLDEsODMsMCw0MSw0LDEyMiw0OSw4MiwxMDEsMTE2LAorICAgIDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsMTE0LDI5LAorICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDQsMCwwLDAsNTEsMCwwLDAsMTE1LDI2LDAsMCwwLDEyNCwwLDkzLAorICAgIDE4LDEyNSwxLDEzNiwwLDEwMCwwLDEyNCwxLDIzLDAsMTA3LDIsODYsMCwxLAorICAgIDAsMTEzLDIsMTAwLDEsODMsMCw0MSwyLDExNCwxODAsMCwwLDAsNzgsMTE0LAorICAgIDQsMCwwLDAsNDEsMiwxMTQsMjIsMCwwLDAsMjE4LDYsMTE1LDExNywxMDIsCisgICAgMTAyLDEwNSwxMjAsNDEsMSwyMTgsOSwxMDIsMTA1LDEwOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsCisgICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsMTAzLDEwMSwxMTAsCisgICAgMTAxLDEyMCwxMTIsMTE0LDYyLDE1MCwzLDAsMCwxMTUsMiwwLDAsMCw0LDEsCisgICAgMTIyLDQ5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAorICAgIDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLAorICAgIDExMiwxMTQsNjIsNDEsNCwxMTQsMzgsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwKKyAgICAzLDk3LDExMCwxMjEsMjE4LDE4LDY5LDg4LDg0LDY5LDc4LDgzLDczLDc5LDc4LDk1LAorICAgIDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsCisgICAgMTIwLDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDIyMSwwLDAsMCwKKyAgICAxMTQsNSwwLDAsMCwxMTQsMTU0LDAsMCwwLDE0NywzLDAsMCwxMTUsNiwKKyAgICAwLDAsMCwwLDIsMTQsMSwxMiwxLDEyMiwzMCw2OSwxMjAsMTE2LDEwMSwxMTAsCisgICAgMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsCisgICAgMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LAorICAgIDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNjMsODIsMTAxLDExNiwxMTcsMTE0LAorICAgIDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsOTcsMTEwLDMyLDEwMSwxMjAsMTE2LAorICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDk3LAorICAgIDExMCwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMzIsOTksMTExLAorICAgIDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDQ2LDc4LDExNCw0LDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODIsMCwwLDAsCisgICAgMTUzLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjgsNjksMTIwLDExNiwKKyAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsCisgICAgMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwKKyAgICAwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDUzLDgyLDEwMSwxMTYsMTE3LDExNCwKKyAgICAxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LAorICAgIDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDQsOTcsMTE4LDEwMSwKKyAgICAzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsCisgICAgNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwxMjAsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAorICAgIDAsMTE0LDE5NywwLDAsMCwxNTcsMywwLDAsMTE1LDIsMCwwLDAsMCwKKyAgICAyLDEyMiwzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLAorICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksCisgICAgMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDYsMCwwLDAsMTI0LDAsMTA2LDAsODMsCisgICAgMCw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAogICAgIDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LAogICAgIDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsCiAgICAgMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDQxLAotICAgIDEsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTI2LDAsCisgICAgMSwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwxMjAsMCwKICAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLAotICAgIDAsMTE0LDE1NywwLDAsMCw0NCwzLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDMsMTIyLDIzLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLAotICAgIDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTksMiwwLDAsMCwwLAotICAgIDAsMCwwLDMsMCwwLDAsOSwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgNDIsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMzEsMiwwLDE0MywxNywwLDEyNSwyLDAsMTI0LDIsMCwxMDYsMiwwLDEzMSwKLSAgICAwLDAsODMsODcsMTAwLDIsMCw4MSw4Miw4OCwxMDAsMiwwLDgzLDQxLDMsCi0gICAgMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiwKLSAgICA5NywzMiwxMDIsMTE0LDExMSwxMDksMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE1LDMyLDExNCwKLSAgICA5NywxMTksMzIsOTgsMTIxLDExNiwxMDEsMTE1LDQ2LDIxOCwxLDExNCw3OCw0MSwzLDExNCwKLSAgICA0OSwwLDAsMCwxMTQsNTAsMCwwLDAsOTAsNCwxMTQsMTAxLDk3LDEwMCw0MSwKLSAgICAzLDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw1NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjAwLDAsMCwwLDQ5LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwyMSwKLSAgICAxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKLSAgICAxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSwxMSwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwKLSAgICAwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxODUsMCwwLAotICAgIDAsMTE0LDIxMywwLDAsMCwxMTQsMjE1LDAsMCwwLDExNCwxMjMsMCwwLDAsCi0gICAgMTE0LDE5MywwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwyMDAsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMjExLDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDExNCwyMTAsMCwwLDAsMTQsMywwLDAsMTE1LDE0LAotICAgIDAsMCwwLDEyLDMsNiwyLDEyLDYsMTIsNCwxMiwzLDI0LDEyLDE4LAotICAgIDUsMTE0LDIxMCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSw2NCwwLDAsMCwKLSAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAotICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LDAsMTAwLDcsMCwKLSAgICAxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMSw5MCw2LDAsMTAwLDEwLDAsODMsCi0gICAgNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LDExMSwxMTAsOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwKLSAgICAxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLAotICAgIDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTE3LDExNSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsCi0gICAgMTE2LDEwMSwxMDksNDYsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTE2LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwwLDEyNCwyLDAsCi0gICAgMTA2LDEsMCwxMDAsMiwwLDEyNCwyLDAsMTA2LDIsMCwxMDUsMiwwLDgzLAotICAgIDQxLDMsMTIyLDMzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAotICAgIDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMTQsMTMzLDAsMCwwLDExNCwxMzQsMCwwLDAsNDEsCi0gICAgMywxMTQsMzksMCwwLDAsMjE4LDgsMTE1LDExNiw5NSwxMDksMTE2LDEwNSwxMDksMTAxLAotICAgIDkwLDcsMTE1LDExNiw5NSwxMTUsMTA1LDEyMiwxMDEsNDEsMywxMTQsMTA4LDAsMCwwLAotICAgIDExNCwzNSwwLDAsMCwxMTQsMjA4LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxOTcsMCwwLDAsNTksMywKLSAgICAwLDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLDI3LDgzLDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSw0LDAsMTI0LDAsCi0gICAgMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMDAsMSwwLDEyNCw0LDAsCi0gICAgMTMxLDIsMSw4Myw0MSwyLDc4LDIxOCw1LDk1LDEwOSwxMTEsMTAwLDEwMSw0MSwyLAotICAgIDExNCw5NywwLDAsMCwxMTQsMTk4LDAsMCwwLDQxLDUsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsOTAsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw1MywwLDAsMCwKLSAgICAxMTQsNDIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDE5OSwwLDAsMCw2NCwzLDAsMCwxMTUsNCwwLAotICAgIDAsMCwwLDIsMTIsMSwxMjIsMzIsODMsMTExLDExNywxMTQsOTksMTAxLDcwLDEwNSwKLSAgICAxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LAotICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMjAsMCwwLDAsMTA1LDE4MiwxLAotICAgIDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsOSwwLDAsMCwxNywKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsNTMsMSwwLDAsMTE2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LDUsMCwxMDMsMCwKLSAgICAwLDEyNSw2LDAsMTIwLDU0LDAsMTI0LDQsMCwxMTQsODAsMCwxMTYsMSwwLAotICAgIDEyNCw0LDAsMTMxLDEsMCwxMiwxMTQsODAsMCwxMTYsMCwwLDEyNCw0LDAsCi0gICAgMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNywwLDEyNCw2LDAsMTA2LAotICAgIDIsMCwxMjQsNywwLDEzMSwxLDAsMSwxMTMsMjcsMCw4NywxMjAsMTMyLDAsCi0gICAgMTE2LDMsMCwxMjQsNiwwLDEzMSwxLDAsNjgsOTMsMTE4LDAsMTI1LDcsMCwKLSAgICAxMTYsNCwwLDEyNCw0LDAsMTI0LDcsMCwxMzEsMiwwLDEyNSw0LDAsMTIxLAotICAgIDE3LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTMxLDEsMCwxLDg3LAotICAgIDExMyw5NCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMTU1LDAsMSwxLDEsCi0gICAgMTE5LDk0LDAsODksMTEzLDk0LDAsNCwxMTYsOCwwLDEwNywxMCwwLDExNCwyMTEsCi0gICAgMCwxLDEyNSw4LDAsMSwxMjIsMjUsMCwxMTYsOSwwLDEwMCwxLDAsMTI0LAotICAgIDQsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMDAsMiwwLDgzLDg3LDg5LDEwMCwKLSAgICAyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsMTEzLDk0LDAsODgsCi0gICAgMTEzLDk0LDAsODcsMTIxLDMzLDAsMTE2LDEwLDAsMTI0LDEsMCwxMjQsMiwwLAotICAgIDEyNCwzLDAsMTMxLDMsMCwxLDExNiw5LDAsMTAwLDMsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsMSw4NywxMTAsNTMsMCw0LDExNiw4LDAsMTA3LDEwLDAsMTE0LAotICAgIDQ4LDEsMSwxMjUsOCwwLDEsMTIyLDIxLDAsMTE2LDksMCwxMDAsMSwwLAotICAgIDEyNCwxLDAsMTI0LDgsMCwxMzEsMywwLDEsODcsODksMTAwLDIsMCwxMDAsCi0gICAgMiwwLDEyNSw4LDAsMTI2LDgsMCw4OCwxMTAsMSwwLDg4LDEwMCwyLDAsCi0gICAgODMsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDExNSwKLSAgICAzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LAotICAgIDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywKLSAgICAxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwxMiwKLSAgICA5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LDQxLDExLDExNCwzOCwKLSAgICAwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDE2MywwLDAsMCwxMTQsMzMsMCwKLSAgICAwLDAsMTE0LDI4LDAsMCwwLDExNCwzLDAsMCwwLDkwLDUsMTA5LDEwNywKLSAgICAxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwxMTUsMTE2LDExNSw2OSwKLSAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDQwLDAsMCwwLDExNCwxMDUsMCwwLDAsMTE0LDU1LAotICAgIDAsMCwwLDQxLDksMTE0LDEwOCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LAotICAgIDUzLDAsMCwwLDExNCwyMjAsMCwwLDAsMjE4LDYsMTEyLDk3LDExNCwxMDEsMTEwLAotICAgIDExNiwxMTQsOTQsMCwwLDAsMTE0LDI3LDAsMCwwLDExNCwyMywwLDAsMCwKLSAgICAxMTQsMjAxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxOTgsMCwwLDAsNjksMywwLDAsMTE1LDM4LDAsCi0gICAgMCwwLDAsMiwxOCwxLDYsMiwyMiwxLDE4LDEsMTcsMiwxOSwxLAotICAgIDE1LDEsMywxLDE3LDEsMTMsMiw3LDEsMTgsMywxNiwxLDI3LDEsCi0gICAgMywxLDE2LDEsMTcsMSwxOCwyLDEyMiwyNSw4MywxMTEsMTE3LDExNCw5OSwxMDEsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMDEsMTE2LDk1LDEwMCwKLSAgICA5NywxMTYsOTcsNzgsNDEsNywxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxOTcsMCwwLDAsMTE0LAotICAgIDE5OSwwLDAsMCwxMTQsMTk4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMTgsMCwKLSAgICAwLDAsNTUsMywwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNSwxMiw1LDExNCwyMTgsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNDYsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDAsNiwwLDgzLAotICAgIDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTE1LDMyLDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsNzYsMCwwLAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLAotICAgIDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTYsCi0gICAgMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwyLDAsMTI0LDIsCi0gICAgMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwwLDEwMCwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiw4Myw0MSw0LDc4LAotICAgIDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw4OSwwLDAsMCw0MSwKLSAgICA0LDExNCwxNTcsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTQxLDAsMCwwLAotICAgIDExNCwxNDcsMCwwLDAsNDEsNSwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCw1MywwLDAsMCwxMTQsMjA5LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODcsMCwwLDAsMTAyLDMsMCwwLDExNSw4LDAsMCwwLDAsMSwxNSwKLSAgICAxLDE1LDEsMjQsMSwxMjIsMjksODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LAotICAgIDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCi0gICAgOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwKLSAgICAxMDEsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDQsCi0gICAgMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIwMiwKLSAgICAwLDAsMCwxMDgsMywwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwzMSwKLSAgICA4MywxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDc4LAotICAgIDQxLDYsMTE0LDExMiwwLDAsMCwxMTQsMTExLDAsMCwwLDExNCwxMTMsMCwwLAotICAgIDAsMTE0LDExNCwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCwyMDIsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDUsMCwwLDAsMTE0LDIyMywwLDAsMCw5OCwzLDAsMCwxMTUsNiwwLAotICAgIDAsMCwxMiwyLDYsMiwxMiw2LDExNCwyMjMsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLAotICAgIDAsMCwxMTUsMTM2LDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsCi0gICAgOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsCi0gICAgMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LAotICAgIDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsCi0gICAgMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsCi0gICAgMCwwLDkwLDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLDksCi0gICAgMCwxMDAsMTQsMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE2LDAsCi0gICAgMTAwLDE3LDAsMTMyLDAsMCw5MCwxMSwwLDEwMSwxMiwwLDEwMCwxOCwwLDEwMCwKLSAgICAxOSwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMywwLDEwMCwyMCwwLDgzLDQxLAotICAgIDIxLDIxOCwxOSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsOTMsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDk5LAotICAgIDExMSwxMTAsMTE1LDExNiwxMTQsMTE3LDk5LDExNiwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTUsMTA1LDEwMywxMTAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDExOSwxMTEsMTE0LDEwNywzMiwxMTksCi0gICAgMTA1LDExNiwxMDQsMzIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwzLDAsMCwwLDAsMCwwLDAsMywwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsOTUsMCwwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLAotICAgIDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDEwNiwwLDAsMCwxMTQsCi0gICAgMzUsMCwwLDAsNDEsMywxMTQsMTA4LDAsMCwwLDExNCwxMDYsMCwwLDAsCi0gICAgMTE0LDM1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODUsMCwwLDAsMTI1LDMsMCwwLDExNSw0LDAsCi0gICAgMCwwLDAsMSw5LDEsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKLSAgICAxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsCi0gICAgMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwzNCwwLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMDYsMCwwLDEwNywyLDAsMTExLDMzLDAsCi0gICAgMTI0LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTA2LDEsMCwxMDcsMiwwLDgzLAotICAgIDQxLDEsNzgsNDEsMiwxMTQsMjExLDAsMCwwLDExNCwxMTgsMCwwLDAsNDEsCi0gICAgMiwxMTQsMTA4LDAsMCwwLDExNCwyMTIsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIxMywwLDAsMCwxMjksCi0gICAgMywwLDAsMTE1LDQsMCwwLDAsMCwxLDE4LDEsMTIyLDI2LDY5LDEyMCwKLSAgICAxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ2LDk1LDk1LDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjYsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCwxMTYsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMzEsMSwwLDY1LDgzLDQxLDEsNzgsNDEsCi0gICAgMywxMTQsMjE0LDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwxMTQsMjE1LDAsMCwwLDEzMywzLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDEsMTIyLDI4LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwKLSAgICAxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNCw5NywKLSAgICAxMTUsMTA0LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwKLSAgICAwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LDAsMCwwLDExNiwwLAotICAgIDAsMTA2LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMiwwLAotICAgIDEyNSwyLDAsMTE2LDQsMCwxMDAsMSwwLDEyNCwxLDAsMTA2LDUsMCwxMjQsCi0gICAgMCwwLDEwNiw2LDAsMTMxLDMsMCwxLDEyNCwyLDAsODMsNDEsMiwxMjIsCi0gICAgMzgsNjcsMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDExMCwzMiwxMTcsMTEwLDEwNSwxMTYsMTA1LAotICAgIDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLDM4LDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwKLSAgICAxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDQxLAotICAgIDcsMTE0LDEyMSwwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCwxNDUsMCwwLDAsCi0gICAgOTAsMTQsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsOTksCi0gICAgMTE0LDEwNSwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwzNSwwLDAsMCw0MSwKLSAgICAzLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLDAsMCwxMTQsMTkwLDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODYsMCwwLDAsMTM2LDMsMCwwLDExNSwxMCwwLDAsMCwwLDIsNiwKLSAgICAxLDE1LDEsNiwxLDE2LDEsMTIyLDMzLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsCi0gICAgOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwKLSAgICA0NSwwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTE2LDIsMCwxMDYsMywwLAotICAgIDEyNCwxLDAsMTMxLDIsMCwxLDExNiw0LDAsMTAwLDEsMCwxMjQsMCwwLAotICAgIDEwNiw1LDAsMTI0LDAsMCwxMDYsNiwwLDEzMSwzLDAsMSwxMDAsMiwwLAotICAgIDgzLDQxLDMsMTIyLDMwLDczLDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMzIsCi0gICAgOTcsMTEwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDEyMiw0MCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsCi0gICAgMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDc4LDQxLDcsCi0gICAgMTE0LDEyMSwwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCwxNDUsMCwwLDAsOTAsCi0gICAgMTIsMTAxLDEyMCwxMDEsOTksOTUsMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSwxMTQsMTA1LDAsCi0gICAgMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwKLSAgICAwLDAsMCwxMTQsMTkwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDExNCwxOTEsMCwwLDAsMTQ0LDMsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsMiwxOSwxLDYsMSwxMjIsMzEsNjksMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCwzLDAsMCwKLSAgICAwLDExNSw0OCwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDEwMCwxLDAsMjUsMTM3LDAsMCwxMTYsMiwwLDEzNSwwLDAsMTAyLAotICAgIDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDAsMCwxMTYsMywwLDY4LDEzMSwKLSAgICAxLDAsMTMxLDEsMCw4Myw0MSw0LDEyMiw0OSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTAxLDEyMCwxMTYsCi0gICAgMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwKLSAgICAzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsMTE0LDI5LDAsMCwwLAotICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAotICAgIDAsNTEsMCwwLDAsMTE1LDMxLDAsMCwwLDEyNCwwLDAsOTMsMjEsMCwKLSAgICAxMjUsMSwwLDEzNiwwLDAsMTAwLDAsMCwxMjQsMSwwLDIzLDEwNywyLDAsCi0gICAgODYsMSwxMTMsMywwLDEwMCwxLDAsODMsNDEsMiwxMTQsMTg1LDAsMCwwLAotICAgIDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDIyLDAsMCwwLDIxOCw2LDExNSwKLSAgICAxMTcsMTAyLDEwMiwxMDUsMTIwLDQxLDEsMjE4LDksMTAyLDEwNSwxMDgsMTAxLDk1LDExMCw5NywKLSAgICAxMDksMTAxLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDI1MCw5LDYwLDEwMywKLSAgICAxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxNTMsMywwLDAsMTE1LDIsMCwwLDAsCi0gICAgNiwxLDEyMiw0OSw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsCi0gICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsCi0gICAgMTAxLDEyMCwxMTIsMTE0LDYyLDQxLDQsMTE0LDM4LDAsMCwwLDExNCwzNSwwLDAsCi0gICAgMCwyMTgsMyw5NywxMTAsMTIxLDIxOCwxOCw2OSw4OCw4NCw2OSw3OCw4Myw3Myw3OSwKLSAgICA3OCw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSwyLDExNCwxMDgsMCwwLAotICAgIDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwyMjYsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE1OSwwLDAsMCwxNTAsMywwLDAsCi0gICAgMTE1LDYsMCwwLDAsMCwyLDE5LDEsMTgsMSwxMjIsMzAsNjksMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCi0gICAgNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDYzLDgyLDEwMSwxMTYsCi0gICAgMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk3LDExMCwzMiwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICA5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDk3LDMyLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiw0Niw3OCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsCi0gICAgMCwwLDE1NiwzLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDI4LDY5LAotICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiw1Myw4MiwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwxMDEsMTIwLDExNiwxMDEsCi0gICAgMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTA0LDk3LAotICAgIDExOCwxMDEsMzIsMTEwLDExMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsCi0gICAgMTAxLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsCi0gICAgMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAotICAgIDAsMCwwLDExNCwyMDIsMCwwLDAsMTYwLDMsMCwwLDExNSwyLDAsMCwKLSAgICAwLDAsMiwxMjIsMzAsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw3LDAsMCwwLDEyNCwwLDAsCi0gICAgMTA2LDAsMCw4Myw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAotICAgIDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDQxLDEsMTE0LDM1LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwKLSAgICAxMTQsMTI2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxNTcsMCwwLDAsMTY0LDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwKLSAgICAxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMTIsMCwwLDAsMTE0LDExMSwKLSAgICAwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLDAsMTE0LDE4NSwwLAotICAgIDAsMCwxMTQsMjEzLDAsMCwwLDExNCwyMTUsMCwwLDAsMTE0LDE4NiwwLDAsCi0gICAgMCwxMTQsMTkxLDAsMCwwLDExNCwxNTksMCwwLDAsMTE0LDE4NywwLDAsMCwKLSAgICAxMTQsMjAyLDAsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwxMTQsMjI0LDAsMCwwLDExNywzLDAsMCwxMTUsMjAsMCwwLAotICAgIDAsMTIsNiw2LDIsMTIsNCwxMiw0LDEyLDMsMTIsOCwxMiw2LDEyLAotICAgIDYsMTIsNCwxMiw0LDExNCwyMjQsMCwwLDAsOTksMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCi0gICAgMTMwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLAotICAgIDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLDkwLAotICAgIDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDYsCi0gICAgMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsMTAwLDksMCwKLSAgICAxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLDkwLAotICAgIDgsMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMCwwLDkwLDksMCwxMDAsMTQsCi0gICAgMCwxMDAsMTUsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE2LDAsMTAwLDE3LDAsCi0gICAgMTMyLDAsMCw5MCwxMSwwLDEwMCwxOCwwLDEwMCwxOSwwLDEzMiwwLDAsOTAsCi0gICAgMTIsMCwxMDAsMjAsMCw4Myw0MSwyMSwyMTgsMTQsOTUsNzgsOTcsMTA5LDEwMSwxMTUsCi0gICAgMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDk3LDM4LDEsMCwwLDgyLDEwMSwxMTIsCi0gICAgMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsCi0gICAgOTcsOTksMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzOSwxMTUsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsNDYsMzIsMzIsNzMsMTE2LDMyLDExNywxMTUsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMCwzMiwzMiwzMiwKLSAgICAzMiwxMTYsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiwxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LAotICAgIDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDk3LDExMCwxMDAsMzIsCi0gICAgMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExNiwzMiwxMDgsMTExLAotICAgIDExMSwxMDcsMTE1LDMyLDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNCwxMDEsMTEwLAotICAgIDExNiwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsCi0gICAgNDYsMzIsMzIsODcsMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDk5LDEwNCw5NywKLSAgICAxMTAsMTAzLDEwMSwxMTUsNDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMzksMTE1LDMyLDExMSwxMTksMTEwLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwNSwxMTUsMzIsMTE0LAotICAgIDEwMSw5OSwxMTEsMTA5LDExMiwxMTcsMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMTE3LAotICAgIDExNSwxMDUsMTEwLDEwMywzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKLSAgICA0NiwzMiwzMiw3MCwxMTEsMTE0LDMyLDExNiwxMTEsMTEyLDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywKLSAgICAxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywKLSAgICAxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsNDYsOTksNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCi0gICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNTIsMCwwLDAsMTI0LDEsMCwKLSAgICAxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwwLDAsOTUsMSwwLDExNiwKLSAgICAyLDAsMTI0LDAsMCwxMDYsMywwLDEzMSwwLDAsMTMxLDEsMCwxMjQsMCwKLSAgICAwLDk1LDQsMCwxMjQsMywwLDEyNCwwLDAsOTUsNSwwLDEwMCwwLDAsCi0gICAgODMsNDEsMSw3OCw0MSw2LDIxOCw1LDk1LDExMCw5NywxMDksMTAxLDIxOCw1LDk1LAotICAgIDExMiw5NywxMTYsMTA0LDExNCw5MywwLDAsMCwyMTgsMTYsOTUsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTcsOTUsMTA4LDk3LAotICAgIDExNSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwyMTgsMTIsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDEsNCwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwxMDYsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwxMSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg1LDAsMCwwLDE3NywzLAotICAgIDAsMCwxMTUsOCwwLDAsMCwwLDEsOSwxLDksMSwyMSwxLDEyMiwKLSAgICAyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsCi0gICAgOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDUzLDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEwMCwxLDAsMTMxLDEsCi0gICAgMCw5MiwzLDAsMTI1LDEsMCwxMjUsMiwwLDEyNSwzLDAsMTI0LDIsMCwKLSAgICAxMDAsMiwwLDEwNywyLDAsMTE0LDQzLDAsMTAwLDYsMCw4MywxMjQsMSwwLAotICAgIDEwMCw1LDAsMTAyLDIsMCw4Myw0MSw3LDEyMiw2Miw4MiwxMDEsMTE2LDExNywxMTQsCi0gICAgMTEwLDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLDExMSwxMDIsMzIsNDAsMTEyLAotICAgIDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NSwxMTAsOTcsMTA5LAotICAgIDEwMSw0NCwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ1LDExMiw5NywxMTYsMTA0LDQ1LDk3LAotICAgIDExNiwxMTYsMTE0LDQ1LDExMCw5NywxMDksMTAxLDQxLDExNCw1OCwwLDAsMCwxMTQsMzAsCi0gICAgMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDM1LDAsMCwwLDkwLDgsOTUsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsNDEsMiwxMjIsMywxMTUsMTIxLDExNSwxMjIsNCwKLSAgICAxMTIsOTcsMTE2LDEwNCw0MSwyLDExNCwyMzEsMCwwLDAsMTE0LDMyLDAsMCwwLAotICAgIDQxLDQsMTE0LDEwOCwwLDAsMCwxMTQsMjIyLDAsMCwwLDIxOCwzLDEwMCwxMTEsCi0gICAgMTE2LDkwLDIsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNSwwLDAsMCwyMTgsMjMsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDExMiw5NywxMTQsMTAxLAotICAgIDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDE4MywzLDAsCi0gICAgMCwxMTUsOCwwLDAsMCwwLDIsMjcsMSwxMiwyLDQsMywxMjIsMzgsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDEwMiwxMDUsMTEwLDEwMCw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LAotICAgIDk1LDExMCw5NywxMDksMTAxLDExNSw5OSwxLDAsMCwwLDAsMCwwLDAsMywKLSAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwKLSAgICAxMjQsMCwwLDEwNiwwLDAsMTMxLDAsMCw5MiwyLDAsMTI1LDEsMCwxMjUsCi0gICAgMiwwLDExNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLDAsMjUsMTI0LAotICAgIDIsMCwxMzEsMiwwLDgzLDQxLDEsNzgsNDEsNCwxMTQsMjM4LDAsMCwwLAotICAgIDExNCwxMTcsMCwwLDAsMTE0LDcsMCwwLDAsMjE4LDcsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsMTE1LDQxLDMsMTE0LDEwOCwwLDAsMCw5MCwxOCwxMTIsOTcsMTE0LDEwMSwKLSAgICAxMTAsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LAotICAgIDExMiw5NywxMTYsMTA0LDk1LDk3LDExNiwxMTYsMTE0LDk1LDExMCw5NywxMDksMTAxLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyMzMsMCwKLSAgICAwLDAsMTkzLDMsMCwwLDExNSw0LDAsMCwwLDAsMSwxOCwxLDEyMiwKLSAgICAzMSw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsCi0gICAgOTUsMTAzLDEwMSwxMTYsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCwKLSAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwxMTgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTMxLDAsMCwxMzEsMSwwLDEyNSwxLDAsMTI0LDEsMCwxMjQsCi0gICAgMCwwLDEwNiwyLDAsMTA3LDMsMCwxMTQsMTExLDAsMTI0LDAsMCwxMDYsMywKLSAgICAwLDEyNCwwLDAsMTA2LDQsMCwxMjQsMSwwLDEzMSwyLDAsMTI1LDIsMCwKLSAgICAxMjQsMiwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTAyLDAsMTI0LDIsMCwxMDYsCi0gICAgNSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTAyLDAsMTI0LDIsMCwxMDYsNiwKLSAgICAwLDExNCwxMDIsMCwxMjQsMiwwLDEwNiw2LDAsMTI0LDAsMCw5NSw3LDAsCi0gICAgMTI0LDEsMCwxMjQsMCwwLDk1LDIsMCwxMjQsMCwwLDEwNiw3LDAsODMsCi0gICAgNDEsMSw3OCw0MSw4LDExNCw5MywwLDAsMCwxMTQsMjMzLDAsMCwwLDExNCwKLSAgICAyMzQsMCwwLDAsMTE0LDIzNSwwLDAsMCwxMTQsMjMxLDAsMCwwLDExNCwxMjcsCi0gICAgMCwwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMjMyLDAsMCwwLDQxLDMsMTE0LAotICAgIDEwOCwwLDAsMCw5MCwxMSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDExNCwxNjQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDUsMCwwLDAsMjE4LDEyLDk1LDExNCwxMDEsOTksOTcsMTA4LDk5LDExNywxMDgsCi0gICAgOTcsMTE2LDEwMSwxOTcsMywwLDAsMTE1LDE2LDAsMCwwLDAsMiwxOCwxLAotICAgIDE1LDEsMjEsMywyNywxLDksMSwxMiwxLDksMSwxMjIsMjcsOTUsNzgsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDExNCwxMDEsCi0gICAgOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSw5OSwxLDAsMCwwLDAsMCwKLSAgICAwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKLSAgICAwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwKLSAgICAxLDAsODMsNDEsMSw3OCw0MSwyLDIxOCw0LDEwNSwxMTYsMTAxLDExNCwxMTQsMjQwLAotICAgIDAsMCwwLDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMDUsMTE2LDEwMSwKLSAgICAxMTQsOTUsOTUsMjEwLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCi0gICAgMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsCi0gICAgMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMCwwLDEzMSwxLDAsCi0gICAgODMsNDEsMSw3OCw0MSwyLDExNCwzMSwwLDAsMCwxMTQsMjQwLDAsMCwwLAotICAgIDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSwyMTMsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMiw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA4LDEwMSwxMTAsCi0gICAgOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDEsMCwxMDYsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLDQxLDIsNzgsMTIyLAotICAgIDIwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0MCwKLSAgICAxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw0NywwLDAsMCwxMTQsMjMyLDAsMCwKLSAgICAwLDQxLDEsMTE0LDEwOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNSwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsCi0gICAgOTUsMjE2LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsCi0gICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDExNCwKLSAgICAxMDEsMTEyLDExNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDEwNyw2LDAsODMsNDEsCi0gICAgMSw3OCw0MSwxLDExNCwyNDAsMCwwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLAotICAgIDIxOCw0LDEwNSwxMTYsMTAxLDEwOSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNSwwLDAsMCwyMTgsMTIsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwKLSAgICAxMTUsOTUsOTUsMjE5LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsCi0gICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LAotICAgIDk1LDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDk5LDIsMCwwLDAsCi0gICAgMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDIwLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsMSwwLDEyNCwxLAotICAgIDAsMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwyMzIsCi0gICAgMCwwLDAsMTE0LDE2MywwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LAotICAgIDI0NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKLSAgICAwLDAsMCwxMTQsMTYzLDAsMCwwLDIyMiwzLDAsMCwxMTUsMiwwLDAsCi0gICAgMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLDEzLDExNCwxMTIsMCwKLSAgICAwLDAsMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsMCwwLAotICAgIDAsMTE0LDE4NSwwLDAsMCwxMTQsMjM4LDAsMCwwLDExNCwyMzMsMCwwLDAsCi0gICAgMTE0LDI0MCwwLDAsMCwxMTQsMjQyLDAsMCwwLDExNCwyNDMsMCwwLDAsMTE0LAotICAgIDI0NCwwLDAsMCwxMTQsMjQ2LDAsMCwwLDExNCwxNjMsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMTE0LDIzMCwwLDAsMCwxNzAsMywwLDAsMTE1LDIwLDAsMCwwLAotICAgIDEyLDUsNiwyLDEyLDYsMTIsMTAsMTIsNCwxMiwxMywxMiwzLDEyLDMsCi0gICAgMTIsMywxMiwzLDExNCwyMzAsMCwwLDAsOTksMCwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLDAsMCwxMTUsMTE4LAotICAgIDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwwLDEwMCwKLSAgICAxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLDMsMCwxMDEsNCwwLDEwMCwzLAotICAgIDAsMTAwLDQsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMCw1LDAsCi0gICAgMTAwLDYsMCwxMzIsMCwwLDkwLDYsMCwxMDAsNywwLDEwMCw4LDAsMTMyLAotICAgIDAsMCw5MCw3LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLDkwLDgsCi0gICAgMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMCwwLDkwLDksMCwxMDAsMTMsMCwKLSAgICAxMDAsMTQsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLAotICAgIDAsMCw5MCwxMSwwLDEwMCwxNywwLDgzLDQxLDE4LDIxOCwxNiw5NSw3OCw5NywKLSAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw5OSw0LDAsCi0gICAgMCwwLDAsMCwwLDAsNCwwLDAsMCw0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwyNSwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTI0LDIsMCwKLSAgICAxMjQsMywwLDEzMSwzLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDAsMCw4MywKLSAgICA0MSwxLDc4LDQxLDIsMTE0LDIzMCwwLDAsMCwxMTQsMjMyLDAsMCwwLDQxLAotICAgIDQsMTE0LDEwOCwwLDAsMCwxMTQsMTA2LDAsMCwwLDExNCwzNSwwLDAsMCwKLSAgICAxMTQsMjM2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA1LDAsMCwwLDExNCwxODUsMCwwLDAsMjI4LDMsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKLSAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEwNiwxLDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLAotICAgIDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwKLSAgICAxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LAotICAgIDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMTIyLDI1LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLAotICAgIDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDYyLDQxLDIsMTE0LDQ3LDAsCi0gICAgMCwwLDExNCwxMTIsMCwwLDAsNDEsMiwxMTQsMTcwLDAsMCwwLDExNCwxOTAsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKLSAgICAwLDAsMjE4LDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwyMzEsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyOCw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLAotICAgIDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsODQsMTE0LDQsMCwwLDAsNDEsCi0gICAgMiwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE1OSwwLDAsMCwyNDAsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDUsMTE1LDk1LAotICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwKLSAgICAwLDEwMCwxLDAsODMsNDEsMiw3OCwxMTQsMzAsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsNDEsMiwxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIwMiwwLAotICAgIDAsMCwyNDMsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNyw5NSwKLSAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDIyLDAsMCwwLDExNiwwLDAsMTAwLDEsMCwxMDAsMiwwLDEwMCwzLDAsCi0gICAgMTAwLDQsMCwxMDAsNSwwLDEzMSwzLDEsODMsNDEsNiw3OCwxMTQsMzAsMCwKLSAgICAwLDAsMTIyLDgsNjAsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsNjIsMTE0LDE4OSwwLDAsCi0gICAgMCwxMTQsMjA0LDAsMCwwLDg0LDQxLDEsMTE0LDIwNSwwLDAsMCw0MSwyLAotICAgIDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTg3LDAsMCwwLDI0NiwzLAotICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LDc4LDk3LDEwOSwxMDEsCi0gICAgMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAotICAgIDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiw0Miw4NSwxMTUsMTAxLDMyLDEwMCwxMDEsMTAyLDk3LDExNywxMDgsCi0gICAgMTE2LDMyLDExNSwxMDEsMTA5LDk3LDExMCwxMTYsMTA1LDk5LDExNSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDUsMTExLDExMCw0NiwKLSAgICA3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDE2NCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCi0gICAgMCwxMTQsMTg2LDAsMCwwLDI0OSwzLDAsMCwxMTUsMCwwLDAsMCwxMjIsCi0gICAgMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LAotICAgIDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwOCwwLDAsMCwxMTQsMTkwLDAsMCwKKyAgICAwLDExNCwxNTIsMCwwLDAsMTYxLDMsMCwwLDExNSwyLDAsMCwwLDAsCisgICAgMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCwKKyAgICA5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMDYsMCwwLDAsMTE0LDEwNSwwLDAsMCwKKyAgICAxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDE4MCwwLDAsMCwxMTQsCisgICAgMjA4LDAsMCwwLDExNCwyMTAsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMTg2LAorICAgIDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsMTk3LDAsCisgICAgMCwwLDExNCwxMTcsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsNCwwLDAsCiAgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKLSAgICAxMTQsMTkxLDAsMCwwLDI1MiwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsCi0gICAgMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LDIsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDMyLDAsMCwwLDExNiwwLDAsMTAwLDEsMCwxMjQsMCwKLSAgICAwLDEwNiwxLDAsMTMxLDIsMCwxLDExNiwyLDAsMTA2LDMsMCwxMjQsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw5OCw3NiwxMTEsOTcsMTAwLAotICAgIDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwKLSAgICAxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsCi0gICAgMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsCi0gICAgMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwKLSAgICAxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwzOCwKLSAgICAxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTIsOTcsMTE2LAotICAgIDEwNCwzMiwxMjMsMzMsMTE0LDEyNSw0MSw0LDExNCwxMDUsMCwwLDAsMTE0LDIzMiwwLAotICAgIDAsMCwxMTQsMTIxLDAsMCwwLDExNCwxOTIsMCwwLDAsNDEsMiwxMTQsMTA4LAotICAgIDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDE5MywwLDAsMCwyNTUsMywwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCw3LDE2LDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsCi0gICAgMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLAotICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDc4LDQxLDEyLDExNCwxMTIsMCwwLDAsMTE0LAotICAgIDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDE4MywKLSAgICAwLDAsMCwxMTQsMjQ4LDAsMCwwLDExNCwxNTksMCwwLDAsMTE0LDIwMiwwLAotICAgIDAsMCwxMTQsMTg3LDAsMCwwLDExNCwxODYsMCwwLDAsMTE0LDE5MSwwLDAsCi0gICAgMCwxMTQsMTkzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDcsMCwwLDAsMjI3LAotICAgIDMsMCwwLDExNSwxNiwwLDAsMCwxMiwxLDEyLDMsMTgsOSwxMiwzLAotICAgIDEyLDMsMTIsMywxMiwzLDEyLDMsMTE0LDI0NywwLDAsMCw5OSwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDY0LDAsCi0gICAgMCwwLDExNSwxNjAsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCwKLSAgICA5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAxLDQsMCwxMDAsMiwwLDEwMCwKLSAgICAzLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDUsMCwxMDEsNCwwLDEwMCw0LAotICAgIDAsMTAwLDUsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNiwwLDEwMSw0LDAsCi0gICAgMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsMTMxLDEsMCw5MCw3LDAsMTAxLAotICAgIDQsMCwxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDgsCi0gICAgMCwxMDEsNCwwLDEwMCwxMCwwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwxLDAsCi0gICAgMTMxLDEsMCw5MCw5LDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTAsMCwxMDAsCi0gICAgMTMsMCwxMDAsMTQsMCwxMzIsMiwwLDEzMSwxLDAsOTAsMTAsMCwxMDEsNCwKLSAgICAwLDEwMCwxMCwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwxLDAsMTMxLDEsMCwKLSAgICA5MCwxMSwwLDEwMCwxMCwwLDgzLDQxLDE3LDIxOCwxMCw4MCw5NywxMTYsMTA0LDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLDYyLDc3LDEwMSwxMTYsOTcsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE1LDEyMSwxMTUsNDYsCi0gICAgMTEyLDk3LDExNiwxMDQsMzIsOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsCi0gICAgMzIsOTUsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LAotICAgIDExNywxMTYsMTAxLDExNSw0Niw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw1NSwwLDAsMCwxMjAsCi0gICAgNDgsMCwxMTYsMCwwLDEwNiwxLDAsMTA2LDIsMCwxMzEsMCwwLDY4LDkzLAotICAgIDMxLDAsMTI1LDEsMCwxMTYsMywwLDEyNCwxLDAsMTAwLDEsMCwxMzEsMiwKLSAgICAwLDExNCwxNiwwLDEyNCwxLDAsMTA2LDQsMCwxMzEsMCwwLDEsMTEzLDE2LAotICAgIDAsODcsMTAwLDIsMCw4Myw0MSwzLDEyMiwxMjUsNjcsOTcsMTA4LDEwOCwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LAotICAgIDk5LDEwNCwxMDEsMTE1LDQwLDQxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExMSwxMTAsCi0gICAgMzIsOTcsMTA4LDEwOCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLAotICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAxMTUsMTE2LDExMSwxMTQsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSwxMTUsMzIsNDAsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwKLSAgICAxMDEsMTEwLDExNiwxMDEsMTAwLDQxLDQ2LDIxOCwxNywxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCwKLSAgICA5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDc4LDQxLDUsMTE0LDcsMCwKLSAgICAwLDAsMjE4LDE5LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKLSAgICAxMTQsOTUsOTksOTcsOTksMTA0LDEwMSwyMTgsNiwxMTgsOTcsMTA4LDExNywxMDEsMTE1LDExNCwKLSAgICAxMTUsMCwwLDAsMTE0LDI1MCwwLDAsMCw0MSwyLDExNCwxNzAsMCwwLDAsCi0gICAgMjE4LDYsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDUsMCwwLDAsMTE0LDI1MCwwLDAsMCwxNiw0LDAsMCwKLSAgICAxMTUsNiwwLDAsMCwwLDQsMjIsMSwxNSwxLDEyMiwyOCw4MCw5NywxMTYsCi0gICAgMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsCi0gICAgMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwKLSAgICAwLDAsMywwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsMTA3LAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LAotICAgIDQxLDAsMTE2LDAsMCwxMDYsMSwwLDEyLDExNCw0MSwwLDExNiwyLDAsMTA2LAotICAgIDMsMCwxMDAsMiwwLDExNiw0LDAsMTMxLDIsMCwxLDEyMCw1OSwwLDExNiwKLSAgICAwLDAsMTA2LDEsMCw2OCw5Myw0NCwwLDEyNSwyLDAsMTIxLDE0LDAsMTI0LAotICAgIDIsMCwxMjQsMSwwLDEzMSwxLDAsODMsODcsMTEzLDUxLDAsNCwxMTYsNSwKLSAgICAwLDEwNywxMCwwLDExNCw5NCwwLDEsMSwxLDExOSw1MSwwLDg5LDExMyw1MSwKLSAgICAwLDg4LDExMyw1MSwwLDg3LDEwMCwxLDAsODMsMTAwLDEsMCw4Myw0MSwzLAotICAgIDEyMiwxMTMsODMsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksCi0gICAgMTAxLDMyLDExMSwxMDIsMzIsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwxMDIsMTExLDExNCwzMiw5NywKLSAgICAzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LAotICAgIDEwNCwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsCi0gICAgMzksMTA0LDExMSwxMTEsMTA3LDExNSwzOSwzMiwxMDUsMTE1LDMyLDEwMiw5NywxMDgsMTE1LDEwMSwKLSAgICAzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE3LDExNSwxMDEsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw3OCwxMjIsMjMsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LAotICAgIDExMSwxMTEsMTA3LDExNSwzMiwxMDUsMTE1LDMyLDEwMSwxMDksMTEyLDExNiwxMjEsNDEsNiwxMTQsCi0gICAgNywwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwKLSAgICAxMTQsNjAsMCwwLDAsMTE0LDYxLDAsMCwwLDExNCwxMjUsMCwwLDAsMTE0LAotICAgIDEwNywwLDAsMCw0MSwzLDExNCwxNzAsMCwwLDAsMTE0LDM1LDAsMCwwLAotICAgIDkwLDQsMTA0LDExMSwxMTEsMTA3LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwKLSAgICAxMDcsMTE1LDI0LDQsMCwwLDExNSwxNiwwLDAsMCwwLDcsMjUsMSwxNiwKLSAgICAxLDE2LDEsMywxLDE0LDEsMTMsMSwxMiwyLDEyMiwyMiw4MCw5NywxMTYsCi0gICAgMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwKLSAgICAxMTEsMTA3LDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICAxOSwwLDAsMCw2NywwLDAsMCwxMTUsMTIzLDAsMCwwLDEyNCwxLDAsCi0gICAgMTAwLDEsMCwxMDcsMiwwLDExNCw1MywwLDEyMSwxNiwwLDExNiwwLDAsMTA2LAotICAgIDEsMCwxMzEsMCwwLDEyNSwxLDAsODcsMTEwLDIyLDAsNCwxMTYsMiwwLAotICAgIDEwNywxMCwwLDExNCw1MiwwLDEsMSwxLDEwMCwyLDAsODMsODksMTEwLDEsCi0gICAgMCw4OCwxMjEsMTcsMCwxMTYsMywwLDEwNiw0LDAsMTI0LDEsMCwyNSwxMjUsCi0gICAgMiwwLDg3LDExMCw0NiwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMTE4LDAsCi0gICAgMSwxLDEsMTI0LDAsMCwxMDYsNiwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsCi0gICAgMiwwLDEyNCwyLDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwxLDAsNjAsODksCi0gICAgMTEwLDEsMCw4OCwxMjQsMiwwLDgzLDQxLDMsMTIyLDIxMCw3MSwxMDEsMTE2LDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTAyLDExNCwKLSAgICAxMTEsMTA5LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCi0gICAgMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSw0NCwzMiwxMDIsMTA1LDExMCwxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsOTcsMTEyLDExMiwxMTQsMTExLDExMiwxMTQsMTA1LDk3LDExNiwxMDEsCi0gICAgMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDEwNSwxMTYsNDYsMzIsNzMsMTAyLAotICAgIDMyLDExMCwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTA1LDExNSwzMiw5NywxMTgsCi0gICAgOTcsMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDQ0LDMyLDExNSwxMTYsMTExLDExNCwxMDEsMzIsNzgsCi0gICAgMTExLDExMCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDMwLAotICAgIDAsMCwwLDc4LDQxLDcsMTE0LDMsMCwwLDAsMTE0LDQ1LDAsMCwwLAotICAgIDIxOCwxNyw3MCwxMDUsMTA4LDEwMSw3OCwxMTEsMTE2LDcwLDExMSwxMTcsMTEwLDEwMCw2OSwxMTQsCi0gICAgMTE0LDExMSwxMTQsMTE0LDcsMCwwLDAsMTE0LDI1MSwwLDAsMCwxMTQsMTM3LDAsCi0gICAgMCwwLDExNCwyNTUsMCwwLDAsNDEsMywxMTQsMTcwLDAsMCwwLDExNCwzNSwKLSAgICAwLDAsMCwxMTQsMjUzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw1LDAsMCwwLDIxOCwyMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDEsNCwwLAotICAgIDAsMTE1LDIyLDAsMCwwLDAsOCwxMiwxLDMsMSwxNiwxLDEzLDMsCi0gICAgOSwxLDMsMSwxNywxLDEzLDEsMTUsMSwxOCwxLDEyMiwzMSw4MCw5NywKLSAgICAxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA1LAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDMsMCwKLSAgICAwLDAsMCwwLDAsMCw2LDAsMCwwLDMsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDExOSwwLDAsMCwxMTYsMCwwLDEyNCwyLDAsMTAwLDEsMCwKLSAgICAxMzEsMiwwLDExNCwzOSwwLDEyNCwyLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDAsOTIsMiwwLDEyNSwzLDAsMTI1LDQsMCwxMTAsMjEsMCwxMjQsMiwKLSAgICAwLDEwNiwyLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwzLDAsMTAzLDAsMCwKLSAgICAxMjUsNCwwLDEyNCwzLDAsMTAwLDAsMCwxMDcsOSwwLDExNCw4OCwwLDExNiwKLSAgICAzLDAsMTA2LDQsMCwxMjQsMSwwLDEyNCwzLDAsMTMxLDIsMCw4MywxMTYsCi0gICAgMywwLDEwNiw1LDAsMTI0LDEsMCwxMDAsMCwwLDEzMSwyLDAsMTI1LDUsCi0gICAgMCwxMjQsNCwwLDEyNCw1LDAsOTUsNiwwLDEyNCw1LDAsODMsNDEsMiwKLSAgICA3OCwxMTQsMTI0LDAsMCwwLDQxLDcsMTE0LDExNSwwLDAsMCwxMTQsMTI0LDAsCi0gICAgMCwwLDExNCwxODIsMCwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsMTc5LDAsMCwKLSAgICAwLDExNCwxNjAsMCwwLDAsMTE0LDE1NiwwLDAsMCw0MSw2LDExNCwxNzAsMCwKLSAgICAwLDAsMTE0LDEyNiwwLDAsMCwxMTQsMjUzLDAsMCwwLDExNCwxMjcsMCwwLAotICAgIDAsMTE0LDEyOCwwLDAsMCwxMTQsMTY0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxNiw5NSwxMDgsMTAxLDEwMywKLSAgICA5Nyw5OSwxMjEsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNjMsNCwwLDAsCi0gICAgMTE1LDE4LDAsMCwwLDAsNCwxNSwxLDI0LDIsMTUsMSw2LDEsMTIsCi0gICAgMSwxNiwxLDE4LDEsOSwxLDEyMiwyNyw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsCi0gICAgMTAwLDEwMSwxMTQsNDYsOTUsMTA4LDEwMSwxMDMsOTcsOTksMTIxLDk1LDEwMywxMDEsMTE2LDk1LAotICAgIDExNSwxMTIsMTAxLDk5LDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw5LDAsCi0gICAgMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDI0MywwLDAsMCwxMDMsCi0gICAgMCwwLDEyNSw0LDAsMTIwLDIzMCwwLDEyNCwyLDAsNjgsOTMsMTkxLDAsMTI1LAotICAgIDUsMCwxMTYsMCwwLDEyNCw1LDAsMTE2LDEsMCwxMTYsMiwwLDEwMiwyLAotICAgIDAsMTMxLDIsMCwxMTUsNDMsMCwxMTMsMTMsMCwxMjQsMCwwLDEwNiwzLDAsCi0gICAgMTI0LDUsMCwxMzEsMSwwLDEyNSw2LDAsMTI0LDYsMCwxMDAsMSwwLDEwNywKLSAgICA5LDAsMTE0LDEzLDAsMTE2LDQsMCwxMjQsNiwwLDEwMCwyLDAsMTMxLDIsCi0gICAgMCwxMTQsMTA2LDAsMTI0LDYsMCwxMDYsNSwwLDEyNCwxLDAsMTI0LDMsMCwKLSAgICAxMzEsMiwwLDEyNSw3LDAsMTEwLDE4LDAsMTI0LDAsMCwxMDYsNiwwLDEyNCwKLSAgICAxLDAsMTI0LDYsMCwxMzEsMiwwLDEyNSw3LDAsMTI0LDcsMCwxMDAsMSwKLSAgICAwLDEwNyw4LDAsMTE0LDEzOSwwLDExMywxMywwLDEyNCw3LDAsMTA2LDcsMCwKLSAgICAxMDAsMSwwLDEwNyw5LDAsMTE0LDE1OCwwLDEyNCw3LDAsODMsMTI0LDcsMCwKLSAgICAxMDYsOCwwLDEyNSw4LDAsMTI0LDgsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LAotICAgIDE5MSwwLDExNiw5LDAsMTAwLDMsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDQsCi0gICAgMCwxMDYsMTAsMCwxMjQsOCwwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMTYsCi0gICAgMTEsMCwxMDYsMTIsMCwxMjQsMSwwLDEwMCwxLDAsMTMxLDIsMCwxMjUsNywKLSAgICAwLDEyNCw0LDAsMTI0LDcsMCw5NSw4LDAsMTI0LDcsMCw4MywxMDAsMSwKLSAgICAwLDgzLDQxLDQsMTIyLDYzLDcwLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTExLDExNCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAotICAgIDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDcsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLAotICAgIDExMCw5NywxMDksMTAxLDQ2LDc4LDExNCwxODEsMCwwLDAsMTIyLDE5LDExNSwxMTIsMTAxLAotICAgIDk5LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDQxLDEzLDExNCwxNDMsMCwwLDAsMTE0LDY5LDAsMCwwLDIxOCw1LDk4LDEyMSwKLSAgICAxMTYsMTAxLDExNSwxMTQsMSwxLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxODEsMCwKLSAgICAwLDAsMTE0LDIsMSwwLDAsMTE0LDEyNywwLDAsMCwxMTQsMTU2LDAsMCwKLSAgICAwLDExNCwxMDcsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsMTIxLDAsMCwwLAotICAgIDExNCwxNjAsMCwwLDAsNDEsOSwxMTQsMTcwLDAsMCwwLDExNCwxMjYsMCwwLAotICAgIDAsMTE0LDM1LDAsMCwwLDExNCwxODAsMCwwLDAsMjE4LDE0LDExMCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDkwLDUsMTAxLDExMCwxMTYsCi0gICAgMTE0LDEyMSwxMTQsMjUzLDAsMCwwLDExNCwxNjQsMCwwLDAsMTE0LDEyOCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKLSAgICAyMTgsOSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw3OCw0LDAsMCwxMTUsCi0gICAgNDAsMCwwLDAsMCw1LDYsMSwxMywxLDIxLDEsMywxLDE1LDEsCi0gICAgMTIsMSwxNSwxLDIxLDIsMTgsMSwxMiwxLDMsMSwxNSwxLDQsMSwKLSAgICA5LDEsMTIsMSwxMiw1LDE3LDIsMTgsMSw5LDEsMTIyLDIwLDgwLDk3LAotICAgIDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLAotICAgIDEwMSw5OSw5OSw0LDAsMCwwLDAsMCwwLDAsNiwwLDAsMCw0LAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNDAsMCwwLDAsMTI0LDIsMCwxMDAsCi0gICAgMSwwLDEwNyw4LDAsMTE0LDIxLDAsMTE2LDAsMCwxMDYsMSwwLDEyNSwyLAotICAgIDAsMTI0LDAsMCwxMDYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMjQsMywwLAotICAgIDEzMSwzLDAsMTI1LDQsMCwxMjQsNCwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgNTgsMCwxMDAsMSwwLDgzLDEyNCw0LDAsMTA2LDMsMCwxMDAsMSwwLDEwNywKLSAgICA4LDAsMTE0LDEzMiwwLDEyNCw0LDAsMTA2LDQsMCwxMjUsNSwwLDEyNCw1LAotICAgIDAsMTE0LDEyNSwwLDEwMCwyLDAsMTI0LDQsMCw5NSw1LDAsMTE2LDYsMCwKLSAgICAxMjQsMSwwLDEyNCw1LDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwzLDAsMTI0LAotICAgIDQsMCw5NSw0LDAsMTI0LDQsMCw4MywxMDAsMSwwLDgzLDExMCw0LDAsCi0gICAgMTI0LDQsMCw4MywxMDAsMSwwLDgzLDQxLDMsMTIyLDk4LDEwMiwxMDUsMTEwLDEwMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwKLSAgICAxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsCi0gICAgMzksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDc4LDkwLAotICAgIDksMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsNywxMTQsNywwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDUsMSwwLDAsMTE0LDEyNywwLDAsMCwKLSAgICAxMTQsMTU2LDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDIzMCwwLDAsMCw0MSwKLSAgICA2LDExNCwxNzAsMCwwLDAsMTE0LDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsCi0gICAgMTE0LDE4MCwwLDAsMCwxMTQsMTY0LDAsMCwwLDExNCw0LDEsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODEsCi0gICAgMCwwLDAsMTEwLDQsMCwwLDExNSwyNiwwLDAsMCwwLDQsMTIsMSwKLSAgICA5LDEsMjEsMSwxMiwxLDQsMSwxNSwxLDksMSw2LDMsOSwxLAotICAgIDI0LDEsNCwyLDcsMiwxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwKLSAgICAxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwKLSAgICAwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSw0MSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTI1LDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDgsCi0gICAgMCwxMTQsMzQsMCwxMDAsMSwwLDgzLDEyNCwzLDAsMTA2LDEsMCw4Myw0MSwKLSAgICAyLDEyMiwxNzAsMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLAotICAgIDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsCi0gICAgMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsCi0gICAgMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSwKLSAgICA0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LAotICAgIDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAotICAgIDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLAotICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsCi0gICAgOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsCi0gICAgMTE0LDE4MSwwLDAsMCwxMTQsMTI3LDAsMCwwLDQxLDQsMTE0LDE3MCwwLDAsCi0gICAgMCwxMTQsMTI2LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTY0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAxODIsMCwwLDAsMTMyLDQsMCwwLDExNSw4LDAsMCwwLDAsOCwxOCwKLSAgICAxLDEyLDEsNCwxLDEyMiwyMiw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEyLDExNCwKLSAgICAxMTIsMCwwLDAsMTE0LDExMSwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTQsCi0gICAgMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMjUwLDAsMCwwLDExNCwyNTUsMCwKLSAgICAwLDAsMTE0LDEsMSwwLDAsMTE0LDIsMSwwLDAsMTE0LDUsMSwwLAotICAgIDAsMTE0LDE4MSwwLDAsMCwxMTQsMTgyLDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwKLSAgICAyNDksMCwwLDAsMTIsNCwwLDAsMTE1LDIyLDAsMCwwLDEyLDIsNiwKLSAgICAyLDE4LDgsMTgsMTcsMTgsMjIsMTgsMTUsMywxLDE4LDMxLDMsMSwyMSwKLSAgICAyMSwzLDEsMTE0LDI0OSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwwLDExNSwxMzMsMCwKLSAgICAwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsCi0gICAgMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwxMDEsNiwwLDkwLAotICAgIDcsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw4LDAsMTAwLDgsCi0gICAgMCwxMDAsOSwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxMCwwLDEwMCwxMSwwLAotICAgIDEwMCwxMiwwLDEzMiwxLDAsOTAsMTAsMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsCi0gICAgMCwwLDkwLDExLDAsMTAxLDEyLDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsCi0gICAgMCwxMzEsMSwwLDkwLDEzLDAsMTAwLDE3LDAsMTAwLDE4LDAsMTMyLDAsMCwKLSAgICA5MCwxNCwwLDEwMCwxMCwwLDgzLDQxLDE5LDIxOCwxMCw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwxNzIsNzAsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwKLSAgICAxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsCi0gICAgMTEwLDExNiwxMDEsMTE0LDk3LDk5LDExNiwxMDUsMTExLDExMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwKLSAgICAzMiw5NywxMTQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSw5NywxMTAsOTksMTAxLDQ0LDMyLDk4LDEwMSwxMDUsCi0gICAgMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLDExNSwxMDQsMTAxLDEwMCwKLSAgICAzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwKLSAgICAxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsOTcsMTE1LDMyLDk4LAotICAgIDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNSwwLDAsMCw3LDAsMCwwLDExNSwxMjIsMCwwLDAsMTAzLDAsMCwKLSAgICAxMjUsMywwLDEyMCw1MiwwLDEyNCwyLDAsNjgsOTMsNDQsMCw5MiwyLDAsCi0gICAgMTM3LDAsMCwxMjUsNCwwLDEyNCwzLDAsMTA2LDAsMCwxMzUsMCwwLDEwMiwKLSAgICAxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI0LDQsMCw2OCwxMzEsCi0gICAgMSwwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMjQsMywwLDEyNCwwLDAsCi0gICAgOTUsMSwwLDEyNCwxLDAsMTEyLDc5LDAsMTAwLDMsMCwxMjQsMCwwLDk1LAotICAgIDIsMCwxMDAsNiwwLDEyNCwwLDAsOTUsMywwLDExNiw0LDAsMTMxLDAsCi0gICAgMCwxMjQsMCwwLDk1LDUsMCwxMTYsNCwwLDEzMSwwLDAsMTI0LDAsMCwKLSAgICA5NSw2LDAsMTAwLDUsMCw4Myw0MSw3LDEyMiwxNTQsNzMsMTEwLDEwNSwxMTYsMTA1LAotICAgIDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTExLDExMCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDk3LDMyLDExOCw5NywxMTQsMTA1LDk3LDk4LDEwOCwxMDEsMzIsCi0gICAgMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDUwLDQ1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE1LDMyLDk5LDExMSwxMTAsMTE2LDk3LAotICAgIDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTE3LAotICAgIDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEwMSw5OSwxMTEsMTAzLDExMCwKLSAgICAxMDUsMTIyLDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMywwLDAsMCw1MSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LAotICAgIDAsMCw5MywxNywwLDEyNSwxLDAsMTI0LDEsMCwxMzYsMCwwLDEwMiwyLAotICAgIDAsODYsMSwxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsNCwwLAotICAgIDAsMCw0MSwyLDExNCwyMiwwLDAsMCwxMTQsMjI1LDAsMCwwLDQxLDEsCi0gICAgMTE0LDEyNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMjI3LDAsMCwwLDE2MSw0LDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDM4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwKLSAgICAxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsCi0gICAgMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDU4LDAsMCwwLDExNCwyOSwwLDAsCi0gICAgMCw3OCwxMTQsODcsMCwwLDAsNDEsNywxMTQsMTQ5LDAsMCwwLDIxOCw4LAotICAgIDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwzNSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMywxMTUsMTAxLDExNiwyMTgsCi0gICAgMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSwyMTgsMTksOTUsMTE0LAotICAgIDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0MSw1LDExNCwxMDgsMCwwLDAsMTE0LDM1LDAsMCwwLDIxOCwxNCwxMDgsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDcsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDE2NiwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICA0MSwxLDExNCwxMjcsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDE4NSwwLDAsCi0gICAgMCwxNTUsNCwwLDAsMTE1LDE2LDAsMCwwLDAsNCw2LDEsMTksMSwKLSAgICAzNiwxLDksMiwxNSwxLDksMSwxMiwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSwKLSAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMDAsMywwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEwMCwyLDAsODMsNDEsNCwxMjIsMzEsNzMsMTEwLDExOCw5NywxMDgsMTA1LAotICAgIDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLAotICAgIDExNCwxMjEsMzIsMTA5LDExNiwxMDUsMTA5LDEwMSw0NiwxMTQsMjksMCwwLDAsNzgsMTE0LAotICAgIDg3LDAsMCwwLDQxLDEsMTE0LDgsMSwwLDAsNDEsMSwxMTQsMTA4LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCwyNTAsMCwwLDAsMTY5LDQsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLAotICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDU5LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsCi0gICAgMSwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsCi0gICAgMCwxMTQsMzcsMCwxMDAsMSwwLDEwMywwLDAsMTAyLDIsMCw4MywxMjQsMiwKLSAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMDYsMiwwLDExMiw1NSwwLDEwMywwLDAsCi0gICAgMTAyLDIsMCw4Myw0MSwyLDEyMiwxOTcsODQsMTE0LDEyMSwzMiwxMTYsMTExLDMyLDEwMiwKLSAgICAxMDUsMTEwLDEwMCwzMiw5NywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwKLSAgICA0NiwzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDQ0LDMyLDEwOCwxMDUsMTE1LDExNiw0NSwxMTEsMTAyLDQ1LDExMiwxMTEsMTE0LDExNiwxMDUsCi0gICAgMTExLDExMCwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLAotICAgIDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAyLAotICAgIDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsCi0gICAgOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDMsCi0gICAgMTE0LDE4MSwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCwxNTYsMCwwLDAsNDEsCi0gICAgMywxMTQsMTA4LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDE2NCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsCi0gICAgMTI0LDAsMCwwLDE3NSw0LDAsMCwxMTUsOCwwLDAsMCwwLDcsMTUsCi0gICAgMSwxMiwxLDEwLDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTksNiwwLAotICAgIDAsMCwwLDAsMCwwLDcsMCwwLDAsNywwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNDAsMCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLDAsCi0gICAgMTMxLDIsMCwxMjUsNiwwLDExNiwwLDAsMTI0LDIsMCwxMjQsMywwLDEwMCwKLSAgICAxLDAsMTI0LDYsMCwxMDAsMiwwLDEyNCw0LDAsMTMxLDIsMiw4Myw0MSwKLSAgICAzLDc4LDExNCwxMjcsMCwwLDAsMTE0LDE1NiwwLDAsMCw0MSwxLDExNCwxNjcsCi0gICAgMCwwLDAsNDEsNywxMTQsMTA4LDAsMCwwLDExNCwxNjUsMCwwLDAsMTE0LAotICAgIDEyNiwwLDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LAotICAgIDE4MCwwLDAsMCwxMTQsMTI3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCw1LDEsMCwwLDE4Nyw0LDAsCi0gICAgMCwxMTUsNiwwLDAsMCwwLDEsMTUsMSwxOCwxLDEyMiwyMCw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsCi0gICAgMTAxLDk5LDc4LDk5LDMsMCwwLDAsMCwwLDAsMCwxNCwwLDAsMCwKLSAgICAxNSwwLDAsMCw2NywwLDAsMCwxMTUsMjM0LDEsMCwwLDEwMCwxLDAsCi0gICAgMTI1LDMsMCwxMjQsMSwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsMSwwLDEwMCwKLSAgICAzLDAsMjUsMTI1LDQsMCwxMjEsMzQsMCwxMTYsMSwwLDEyNCwwLDAsMTA2LAotICAgIDIsMCwxMTIsNDksMCwxMTYsMywwLDEwNiw0LDAsMTMxLDAsMCwxMzEsMSwKLSAgICAwLDEwNiw1LDAsMTI1LDUsMCw4NywxMTAsMjQsMCw0LDExNiw2LDAsMTA3LAotICAgIDEwLDAsMTE0LDg1LDAsMSwxLDEsMTAwLDEwLDAsMTI1LDUsMCw4OSwxMTAsCi0gICAgMSwwLDg4LDEyNCw1LDAsMTI0LDAsMCwxMDYsNywwLDEwNywzLDAsMTE0LAotICAgIDEyMCwwLDEyNCwwLDAsMTA2LDgsMCwxMzEsMCwwLDEsMTI0LDUsMCwxMjQsCi0gICAgMCwwLDk1LDcsMCwxMTYsOSwwLDEzMSwwLDAsMTE0LDE1MywwLDEyNCwwLAotICAgIDAsMTA2LDEwLDAsMTI1LDYsMCwxMjQsNCwwLDEwNiwxMSwwLDEzMSwwLDAsCi0gICAgMTI1LDcsMCwxMTAsMTUsMCwxMjQsMCwwLDEwNiwxMiwwLDEyNSw2LDAsMTI0LAotICAgIDQsMCwxMjUsNywwLDEyNCw3LDAsMTI0LDYsMCwxMDcsNiwwLDExNCw0NSwKLSAgICAxLDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEzMSwyLDAsCi0gICAgMTI1LDgsMCwxMjAsMTAwLDAsMTI0LDAsMCwxMDYsMTQsMCw2OCw5Myw3NywwLAotICAgIDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLDEwMCw1LDAsMTI0LDksMCwyMywKLSAgICAxMjUsMTEsMCwxMTYsMTMsMCwxMjQsOCwwLDEyNCwxMSwwLDEzMSwyLDAsMTI1LAotICAgIDEyLDAsMTE2LDE1LDAsMTI0LDEyLDAsMTMxLDEsMCwxMTQsMjA4LDAsMTI0LDAsCi0gICAgMCwxMDYsMTYsMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEyNCw4LDAsCi0gICAgMTAzLDEsMCwxMjQsMiwwLDEzMSw1LDAsODMsMTEzLDIwOCwwLDg3LDExNiwxNywKLSAgICAwLDEyNCw4LDAsMTMxLDEsMCwxMjUsMywwLDEyMCwxMjMsMCwxMjQsMCwwLAotICAgIDEwNiwxNCwwLDY4LDkzLDExMiwwLDkyLDIsMCwxMjUsOSwwLDEyNSwxMCwwLAotICAgIDExNiwxMywwLDEyNCwwLDAsMTA2LDIsMCwxMjQsNCwwLDEyNCw5LDAsMjMsCi0gICAgMTMxLDIsMCwxMjUsMTIsMCwxMTYsMTgsMCwxMDAsNiwwLDEwNiwxOSwwLDEyNCwKLSAgICAxMiwwLDEzMSwxLDAsMTAwLDcsMCwxMDAsMywwLDEzMSwxLDEsMSwxMjQsCi0gICAgNywwLDEyNCw5LDAsMjMsMTI0LDYsMCwxMDcsNiwwLDExNCw1NSwxLDExNiwKLSAgICAxNSwwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LDU1LDEsMTI0LDAsMCwxMDYsMTYsCi0gICAgMCwxMjQsMTAsMCwxMjQsMSwwLDEyNCwxMiwwLDEwMCw4LDAsMTI0LDIsMCwKLSAgICAxMzEsNSwwLDgzLDExMyw1NSwxLDg3LDEyNCwzLDAsMTE0LDIzMCwxLDExNiwxOCwKLSAgICAwLDEwMCw5LDAsMTA2LDE5LDAsMTI0LDgsMCwxMzEsMSwwLDEzMSwxLDAsCi0gICAgMSwxMTYsMjAsMCwxMDYsMjEsMCwxMjQsMSwwLDEwMCw4LDAsMTMxLDIsMCwKLSAgICAxMjUsMTMsMCwxMjQsOCwwLDEwMywxLDAsMTI0LDEzLDAsOTUsMjIsMCwxMjQsCi0gICAgMTMsMCw4MywxMDAsOCwwLDgzLDQxLDExLDEyMiwxMDIsODQsMTE0LDEyMSwzMiwxMTYsCi0gICAgMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzMiwxMDIsMTExLAotICAgIDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDMyLDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEwOSw5NywxMTYsCi0gICAgOTksMTA0LDEwNSwxMTAsMTAzLDMyLDExNSwxMTIsMTAxLDk5LDQ0LDMyLDExMSwxMTQsMzIsNzgsCi0gICAgMTExLDExMCwxMDEsMzIsMTA1LDEwMiwzMiwxMTAsMTExLDExNiwzMiwxMDIsMTExLDExNywxMTAsMTAwLAotICAgIDQ2LDcwLDExNCw1OCwwLDAsMCwxMTQsNTYsMCwwLDAsMTE0LDI5LDAsMCwKLSAgICAwLDExNCwxODUsMCwwLDAsMTIyLDksMTE2LDExNCwxMjEsMTA1LDExMCwxMDMsMzIsMTIzLAotICAgIDEyNSwxMTQsOTgsMCwwLDAsNzgsMTIyLDI1LDExMiwxMTEsMTE1LDExNSwxMDUsOTgsMTA4LAotICAgIDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMjMsMTI1LDExNCw4NywwLDAsMCw0MSwyMywxMTQsMzIsMCwwLDAsMTE0LDM5LAotICAgIDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMywwLDAsMCwxMTQsNDUsMCwKLSAgICAwLDAsMTE0LDIxOSwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDgsMSwwLAotICAgIDAsMjE4LDExLDk1LDEwMiwxMDUsMTA4LDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNCw2LAotICAgIDAsMCwwLDExNCwxMSwxLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDEsCi0gICAgMCwwLDExNCwyOCwwLDAsMCwxMTQsNywxLDAsMCwxMTQsNDQsMCwwLAotICAgIDAsMTE0LDUsMSwwLDAsMTE0LDQ2LDAsMCwwLDExNCwxMDUsMCwwLDAsCi0gICAgMTE0LDQ3LDAsMCwwLDExNCwxMjEsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsCi0gICAgMTU2LDAsMCwwLDQxLDE0LDExNCwxMDgsMCwwLDAsMTE0LDEyNiwwLDAsMCwKLSAgICAxMTQsMTgwLDAsMCwwLDkwLDEyLDEwNSwxMTUsOTUsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiwKLSAgICA5Nyw5OSwxMDEsOTAsMTEsMTE2LDk3LDEwNSwxMDgsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE0LDEzMywwLDAsMCw5MCw1LDk5LDk3LDk5LDEwNCwxMDEsOTAsMTIsOTksOTcsCi0gICAgOTksMTA0LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCw5LDk4LDk3LDExNSwxMDEsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsMTE0LDIyNSwwLDAsMCwxMTQsMTY1LDAsMCwwLDkwLAotICAgIDEzLDEwNSwxMTAsMTA1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsOSwKLSAgICAxMDIsMTE3LDEwOCwxMDgsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE2NCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTgxLDAsCi0gICAgMCwwLDE5Miw0LDAsMCwxMTUsNjgsMCwwLDAsMCwzLDYsMSwxOSwKLSAgICAxLDMsMSwzNCwxLDEzLDEsMTEsMSwxNSwxLDEwLDEsOSwyLDksCi0gICAgMSw5LDEsMTUsMiw5LDEsNiwyLDEyLDEsMTgsMSwyMiwxLDEwLAotICAgIDEsMTUsMSwxMiwxLDMyLDQsMTIsMiwyMiwxLDIyLDEsMjUsMSwxNiwKLSAgICAxLDEyLDEsMjksMSw2LDEsMTksMSwxOCwxLDEyLDEsNCwxLDEyMiwKLSAgICAyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCwKLSAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSwxLDAsMCwwLDAsMCwwLDAsOSwwLAotICAgIDAsMCwxMywwLDAsMCw2NywwLDAsMCwxMTUsMTEsMSwwLDAsMTI0LAotICAgIDAsMCwxMDYsMCwwLDEyNSwxLDAsMTIxLDMxLDAsMTE2LDEsMCwxMDYsMiwKLSAgICAwLDEyNCwxLDAsMTEyLDMzLDAsMTE2LDEsMCwxMDYsMywwLDEzMSwwLDAsCi0gICAgMTMxLDEsMCwxMjUsMiwwLDg3LDExMCwzMywwLDQsMTE2LDQsMCwxMTYsNSwKLSAgICAwLDExNiw2LDAsMTAyLDMsMCwxMDcsMTAsMCwxMTQsNzUsMCwxLDEsMSwKLSAgICAxMDMsMCwwLDEyNSwyLDAsODksMTEwLDEsMCw4OCwxMTYsNywwLDEwNiw4LAotICAgIDAsMTA2LDksMCwxMDAsMSwwLDEzMSwxLDAsMTE1LDExMiwwLDExNiwxMCwwLAotICAgIDEyNCwyLDAsMTMxLDEsMCwxMjQsMCwwLDk1LDExLDAsMTEwLDExMSwwLDExNiwKLSAgICAxMCwwLDEzMSwwLDAsMTI1LDMsMCwxMjAsOTAsMCwxMjQsMiwwLDY4LDkzLAotICAgIDgyLDAsMTI1LDQsMCwxMjQsNCwwLDEwNiwxMiwwLDEwMCwyLDAsMTMxLDEsCi0gICAgMCw5MiwzLDAsMTI1LDUsMCwxMjUsNiwwLDEyNSw3LDAsMTI0LDYsMCwKLSAgICAxMTQsMTkxLDAsMTAwLDMsMCwxMDYsMTMsMCwxMjQsNSwwLDEyNCw3LDAsMTA2LAotICAgIDE0LDAsMTMxLDAsMCwxMzEsMiwwLDEyNSw4LDAsMTEwLDYsMCwxMjQsNSwKLSAgICAwLDEyNSw4LDAsMTI0LDMsMCwxMDYsMTUsMCwxMjQsOCwwLDEzMSwxLDAsCi0gICAgMSwxMTMsMTI4LDAsODcsMTI0LDMsMCwxMjQsMCwwLDk1LDExLDAsMTE2LDcsCi0gICAgMCwxMDYsOCwwLDEwNiw5LDAsMTE2LDE2LDAsMTMxLDEsMCwxMTQsNywxLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDEyNCwyLDAsNjgsMTMxLDEsMCwKLSAgICAxMjQsMCwwLDk1LDE3LDAsMTAwLDYsMCw4Myw0MSw3LDEyMiw2OCw3MCwxMDUsCi0gICAgMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDExMSwxMDIsMzIsCi0gICAgMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsMTA1LDk3LDEwOCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsCi0gICAgMTIxLDQ2LDExNCwwLDAsMCwwLDExNCw1OCwwLDAsMCwxMjIsNSwxMjMsMTI1LAotICAgIDQ2LDEyMywxMjUsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCi0gICAgMywwLDAsMCw4MywwLDAsMCwxMTUsMjgsMCwwLDAsMTA0LDAsMCwKLSAgICAxMjQsMCwwLDkzLDE4LDAsMTI1LDEsMCwxMjQsMSwwLDEwNiwwLDAsMTMxLAotICAgIDAsMCwxNDYsMiwwLDExMyw2LDAsODMsMTE0LDQsMCwwLDAsNDEsMSwKLSAgICAxMTQsODgsMCwwLDAsNDEsMiwxMTQsMjIsMCwwLDAsOTAsMiwxMDIsMTEwLAotICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDI1MCwKLSAgICA5LDYwLDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDEwLDUsMCwwLDExNSwyLAotICAgIDAsMCwwLDksMCwxMjIsNDEsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLAotICAgIDExNCw0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSw0Niw2MCwxMDgsCi0gICAgMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsNjIsCi0gICAgNzgsNDEsMTgsMTE0LDM1LDAsMCwwLDExNCwzLDAsMCwwLDkwLDcsMTA4LAotICAgIDEwNSwxMTUsMTE2LDEwMCwxMDUsMTE0LDExNCw0NSwwLDAsMCwxMTQsMCwxLDAsMCwKLSAgICAyMTgsMTUsODAsMTAxLDExNCwxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDIxOCwxOCw3OCwxMTEsMTE2LDY1LDY4LDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwKLSAgICA2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDcsMCwwLDAsMTE0LDgsMCwwLDAsMTE0LAotICAgIDksMCwwLDAsMTE0LDksMSwwLDAsMTE0LDEwLDEsMCwwLDExNCw4MywKLSAgICAwLDAsMCwxMTQsNDcsMCwwLDAsMTE0LDg4LDAsMCwwLDIxOCwzLDk3LAotICAgIDEwMCwxMDAsMTE0LDEwLDAsMCwwLDExNCwxMSwxLDAsMCw0MSw5LDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDkwLDgsOTksMTExLDExMCwxMTYsMTAxLDExMCwKLSAgICAxMTYsMTE1LDkwLDIxLDEwOCwxMTEsMTE5LDEwMSwxMTQsOTUsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsCi0gICAgOTUsOTksMTExLDExMCwxMTYsMTAxLDExMCwxMTYsMTE1LDExNCwyNDUsMCwwLDAsMTE0LDEwNiwKLSAgICAwLDAsMCwxMTQsMjM3LDAsMCwwLDExNCwyMjUsMCwwLDAsOTAsOCwxMTAsCi0gICAgMTAxLDExOSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNSwwLDAsMCwxMTQsMTMsMSwwLDAsMjM3LDQsMCwwLDExNSwKLSAgICAzNCwwLDAsMCwwLDIsOSwxLDMsMSwzMSwxLDIyLDMsMTEsMywKLSAgICAxOCwxLDE4LDcsOSwxLDEzLDEsMjQsMSw2LDEsMjcsMiw2LDEsCi0gICAgMTcsMSw5LDEsMTgsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsCi0gICAgMTAxLDExNCw0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSw5OSwxLAotICAgIDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDcsCi0gICAgMCwwLDAsMTE1LDI1LDAsMCwwLDEzNSwwLDAsMTM1LDEsMCwxMDIsMiwKLSAgICAwLDEwMCwxLDAsMTAwLDIsMCwxMzQsMCwwLDEyNSwyLDAsMTI0LDIsMCwKLSAgICA4Myw0MSwzLDk3LDIwLDEsMCwwLDY1LDMyLDk5LDEwOCw5NywxMTUsMTE1LDMyLAotICAgIDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTQsMTAxLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsMTE2LAotICAgIDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsCi0gICAgMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTksCi0gICAgMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAotICAgIDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwzMiwxMTcsMTE1LDEwNSwKLSAgICAxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OSw5NywKLSAgICAxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwKLSAgICAxMTcsMTE0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsMTA4LDEwOCwxMDEsMTAwLAotICAgIDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDExMSwxMTUsMTE3LDExNCwxMDEsMzIsCi0gICAgMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwKLSAgICAxMTQsMTIxLDQ0LDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLAotICAgIDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLAotICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsMSwwLDAsMCw0LDAsMCwwLDE5LDAsMCwKLSAgICAwLDExNSw0MywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsMCwxMTUsCi0gICAgMzAsMCwxMTYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMjQsMCwwLDEzMSwxLAotICAgIDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTM2LDEsMCwxNDAsMSwwLAotICAgIDgzLDQxLDMsMTIyLDQ1LDgwLDk3LDExNiwxMDQsMzIsMTA0LDExMSwxMTEsMTA3LDMyLDEwMiwKLSAgICAxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsMTA5LDk3LDk5LAotICAgIDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDQ2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTIyLDMwLDExMSwxMTAsMTA4LDEyMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwKLSAgICAxMTQsMTA1LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsCi0gICAgMTAxLDEwMCwxMTQsMzUsMCwwLDAsNDEsMiwxMTQsNDYsMCwwLDAsMTE0LDEwNywKLSAgICAwLDAsMCw0MSwxLDExNCwzNSwwLDAsMCw0MSwyLDExNCwxNzAsMCwwLAotICAgIDAsMTE0LDEyLDEsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAotICAgIDIxOCwyNCwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsCi0gICAgNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwyMiw1LDAsMCwxMTUsNiwKLSAgICAwLDAsMCwwLDIsMTIsMSwxOCwxLDEyMiw1NCw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw0NiwKLSAgICA2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwKLSAgICAxMTEsMTA3LDk1LDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKLSAgICAxMTQsMTE0LDQsMCwwLDAsNDEsMywxMTQsMTcwLDAsMCwwLDExNCwxMiwxLAotICAgIDAsMCwxMTQsMTgsMSwwLDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTcwLAotICAgIDAsMCwwLDExNCwxMiwxLDAsMCwxMTQsNSwwLDAsMCwyMTgsOSwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTIsNSwwLDAsMTE1LDQsMCwwLAotICAgIDAsMCwxMCwyMSw2LDEyMiwyMCw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwxNiwwLDAsMCwxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMSwKLSAgICAwLDEzMSwxLDAsODMsNDEsMiw3OCwxMjIsMTYsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LAotICAgIDExMCwxMDAsMTAxLDExNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw0NywwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsNDEsMSwxMTQsMTA4LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDQsMCwwLAotICAgIDAsMzAsNSwwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwxOSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSwKLSAgICA5NSw0MSwxNSwxMTQsMTEyLDAsMCwwLDExNCwxMTEsMCwwLDAsMTE0LDExMywwLAotICAgIDAsMCwxMTQsMTE0LDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDI1MCwwLDAsCi0gICAgMCwxMTQsMTMwLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDEyNCwwLDAsMCwKLSAgICAxMTQsNSwxLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxMywxLDAsMCwxMTQsCi0gICAgMTgzLDAsMCwwLDExNCwxOSwxLDAsMCwxMTQsMjQ0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsCi0gICAgMCwwLDExNCw2LDEsMCwwLDE0Niw0LDAsMCwxMTUsMjAsMCwwLDAsCi0gICAgMTIsNyw2LDIsMTIsMTQsMTIsNCw2LDIsMTIsMTIsMTIsNSwxNSw0NSwKLSAgICAxMiwzMSwxOCwxOCwxMTQsNiwxLDAsMCw5OSw0LDAsMCwwLDAsMCwKLSAgICAwLDAsNiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsMTk1LAotICAgIDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTI1LAotICAgIDQsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsMSwwLDEyNSw1LAotICAgIDAsMTI0LDQsMCwxMTUsOTksMCwxMjQsNSwwLDExNCw1NCwwLDEyNCw1LDAsCi0gICAgMTA2LDEsMCwxMjUsNCwwLDExMCw0NSwwLDEyNCwyLDAsMTI0LDMsMCwxMDcsCi0gICAgMiwwLDExNCw4NCwwLDExNiwyLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLAotICAgIDAsMTI1LDQsMCwxMTAsMTUsMCwxMTYsMywwLDEyNCwxLDAsMTI0LDIsMCwKLSAgICAxMzEsMiwwLDEyNSw0LDAsMTI0LDUsMCwxMTUsMTI2LDAsMTE2LDQsMCwxMjQsCi0gICAgMSwwLDEyNCwyLDAsMTAwLDMsMCwxMjQsNCwwLDEzMSwyLDEsMTI1LDUsCi0gICAgMCwxMjEsNDQsMCwxMjQsNSwwLDEyNCwwLDAsMTAwLDIsMCw2MCwxMjQsNCwKLSAgICAwLDEyNCwwLDAsMTAwLDEsMCw2MCwxMjQsMiwwLDEyNCwwLDAsMTAwLDQsCi0gICAgMCw2MCwxMjQsMywwLDEyNCwwLDAsMTAwLDUsMCw2MCw4NywxMTAsMTgsMCwKLSAgICA0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDE5MCwwLDEsMSwxLDg5LDExMCwxLAotICAgIDAsODgsMTAwLDAsMCw4Myw0MSw2LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDk1LDk1LDIxOCw4LDk1LDk1LDExNSwxMTIsMTAxLDk5LDk1LDk1LDExNCwKLSAgICAxMjcsMCwwLDAsOTAsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsOTUsOTAsMTAsCi0gICAgOTUsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsOTUsOTUsNDEsNiwyMTgsMywxMDMsMTAxLAotICAgIDExNiwxMTQsMTI3LDAsMCwwLDExNCwyMjMsMCwwLDAsMTE0LDIxOCwwLDAsMCwKLSAgICAxMTQsMTY3LDAsMCwwLDIxOCw5LDY5LDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCwKLSAgICA0MSw2LDkwLDIsMTEwLDExNSwxMTQsMTA2LDAsMCwwLDkwLDgsMTEyLDk3LDExNiwKLSAgICAxMDQsMTEwLDk3LDEwOSwxMDEsOTAsOSw5OSwxMTIsOTcsMTE2LDEwNCwxMTAsOTcsMTA5LDEwMSwKLSAgICAxMTQsMTI3LDAsMCwwLDExNCwxNjQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDE0LDk1LDEwMiwxMDUsMTIwLDk1LAotICAgIDExNywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzYsNSwwLDAsMTE1LDM0LDAsCi0gICAgMCwwLDAsMiwxNSwxLDE1LDEsNiwxLDYsMSwxMiwxLDEyLDEsCi0gICAgMTgsMiwxNSwxLDYsMSwyMSwxLDMsMSwxMCwxLDEwLDEsMTAsMSwKLSAgICAxNCwxLDEzLDIsMTE0LDI0LDEsMCwwLDk5LDAsMCwwLDAsMCwwLAotICAgIDAsMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDU1LAotICAgIDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMDYsMiwwLDEzMSwwLDAsMTAyLAotICAgIDIsMCwxMjUsMCwwLDExNiwzLDAsMTE2LDQsMCwxMDIsMiwwLDEyNSwxLAotICAgIDAsMTE2LDUsMCwxMTYsNiwwLDEwMiwyLDAsMTI1LDIsMCwxMjQsMCwwLAotICAgIDEyNCwxLDAsMTI0LDIsMCwxMDMsMywwLDgzLDQxLDEsMTIyLDk1LDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLAotICAgIDEwMiwxMDUsMTA4LDEwMSw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKLSAgICA2OSw5Nyw5OSwxMDQsMzIsMTA1LDExNiwxMDEsMTA5LDMyLDEwNSwxMTUsMzIsOTcsMzIsMTE2LAotICAgIDExNywxMTIsMTA4LDEwMSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ0LDMyLDExNSwxMTcsCi0gICAgMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsNDEsNDYsMTAsMzIsMzIsMzIsMzIsNDEsNywxMTQsCi0gICAgMjI0LDAsMCwwLDExNCwxNDUsMCwwLDAsMjE4LDE4LDEwMSwxMjAsMTE2LDEwMSwxMTAsCi0gICAgMTE1LDEwNSwxMTEsMTEwLDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMTE0LDIxOCwwLAotICAgIDAsMCwxMTQsODQsMCwwLDAsMTE0LDIyMywwLDAsMCwxMTQsNzQsMCwwLAotICAgIDAsNDEsMyw5MCwxMCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwxMTUsOTAsCi0gICAgNiwxMTUsMTExLDExNywxMTQsOTksMTAxLDkwLDgsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwKKyAgICAxMTQsMjE5LDAsMCwwLDExNCwzLDAsMCwxMTUsMjAsMCwwLDAsOCw2LAorICAgIDQsMiw4LDQsOCw0LDgsMyw4LDgsOCw2LDgsNiw4LDQsCisgICAgOCw0LDExNCwyMTksMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsOTYsMCwwLAorICAgIDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLAorICAgIDMsMTMyLDAsOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCwKKyAgICA3LDEzMiwwLDkwLDYsMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsMTAwLAorICAgIDExLDEzMiwwLDkwLDgsMTAwLDEyLDEwMCwxMywxMzIsMCw5MCw5LDEwMCwxNCwxMDAsCisgICAgMTUsMTMyLDAsOTAsMTAsMTAwLDE2LDEwMCwxNywxMzIsMCw5MCwxMSwxMDAsMTgsMTAwLAorICAgIDE5LDEzMiwwLDkwLDEyLDEwMCwyMCwxMDAsMjEsMTMyLDAsOTAsMTMsMTAwLDIyLDgzLAorICAgIDAsNDEsMjMsMjE4LDE0LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCisgICAgOTcsMTE2LDEwNCw5NywzOCwxLDAsMCw4MiwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsCisgICAgMTE2LDExNSwzMiw5NywzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMTIsCisgICAgOTcsOTksMTA3LDk3LDEwMywxMDEsMzksMTE1LDMyLDExMiw5NywxMTYsMTA0LDQ2LDMyLDMyLAorICAgIDczLDExNiwzMiwxMTcsMTE1LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMDIsCisgICAgMTA1LDExMCwxMDAsMzIsMTA1LDExNiwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiw5NywxMTAsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKKyAgICAxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTYsMzIsMTA4LDExMSwxMTEsMTA3LDExNSwzMiwxMTcsCisgICAgMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzksMTE1LDEwLDMyLAorICAgIDMyLDMyLDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDQ2LDMyLDMyLDg3LDEwNCwKKyAgICAxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwzMiw5OSwxMDQsOTcsMTEwLDEwMywxMDEsMTE1LDQ0LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTEsMTE5LAorICAgIDExMCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExNCwxMDEsOTksMTExLDEwOSwxMTIsCisgICAgMTE3LDExNiwxMDEsMTAwLDQ0LDEwLDMyLDMyLDMyLDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMzIsMzIsNzAsMTExLAorICAgIDExNCwzMiwxMTYsMTExLDExMiw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMDUsMTE1LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDk5LDQsCisgICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDIsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDM2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTI0LDIsCisgICAgMTI0LDAsOTUsMSwxMTYsMiwxMjQsMCwxMDYsMywxMzEsMCwxMzEsMSwxMjQsMCwKKyAgICA5NSw0LDEyNCwzLDEyNCwwLDk1LDUsMTAwLDAsODMsMCw0MSwxLDc4LDQxLAorICAgIDYsMjE4LDUsOTUsMTEwLDk3LDEwOSwxMDEsMjE4LDUsOTUsMTEyLDk3LDExNiwxMDQsMTE0LAorICAgIDk0LDAsMCwwLDIxOCwxNiw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsCisgICAgMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxNyw5NSwxMDgsOTcsMTE1LDExNiw5NSwxMTIsOTcsCisgICAgMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxMiw5NSwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0MSw0LDExNCwxMDEsMCwwLDAsMTE0LDk5LAorICAgIDAsMCwwLDExNCwzNSwwLDAsMCwyMTgsMTEsMTEyLDk3LDExNiwxMDQsOTUsMTAyLAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDUsMCwwLDAsMTE0LDE4MCwwLDAsMCwxNzQsMywwLDAsMTE1LDgsMCwKKyAgICAwLDAsMCwxLDYsMSw2LDEsMTQsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LAorICAgIDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAorICAgIDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwKKyAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLDAsMCwxMjQsMCwxMDYsCisgICAgMCwxMDYsMSwxMDAsMSwxMzEsMSw5MiwzLDEyNSwxLDEyNSwyLDEyNSwzLDEyNCwKKyAgICAyLDEwMCwyLDEwNywyLDExNCwzMCwxMDAsNiw4MywwLDEyNCwxLDEwMCw1LDEwMiwKKyAgICAyLDgzLDAsNDEsNywxMjIsNjIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsCisgICAgMzIsMTE2LDExNywxMTIsMTA4LDEwMSwzMiwxMTEsMTAyLDMyLDQwLDExMiw5NywxMTQsMTAxLDExMCwKKyAgICAxMTYsNDUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDUsMTEwLDk3LDEwOSwxMDEsNDQsMzIsMTEyLAorICAgIDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMTIsOTcsMTE2LDEwNCw0NSw5NywxMTYsMTE2LDExNCw0NSwKKyAgICAxMTAsOTcsMTA5LDEwMSw0MSwxMTQsNTksMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwKKyAgICA3LDAsMCwwLDExNCwzNSwwLDAsMCw5MCw4LDk1LDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDk1LDQxLDIsMTIyLDMsMTE1LDEyMSwxMTUsMTIyLDQsMTEyLDk3LDExNiwxMDQsCisgICAgNDEsMiwxMTQsMjI2LDAsMCwwLDExNCwzMiwwLDAsMCw0MSw0LDExNCwxMDEsCisgICAgMCwwLDAsMTE0LDIxNywwLDAsMCwyMTgsMywxMDAsMTExLDExNiw5MCwyLDEwOSwKICAgICAxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCi0gICAgMTE0LDE2MSwwLDAsMCw1OSw1LDAsMCwxMTUsOCwwLDAsMCwwLDUsCi0gICAgMTgsMSwxMiwxLDEyLDEsMTE0LDE2MSwwLDAsMCw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMTIsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDcwLDIsMCwwLDEyNCwwLDAsOTcsMCwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCw5NywxLDAsMTE2LDAsMCwxMDYsMiwwLDk3LDIsMCwxMTYsMSwwLAotICAgIDEwNiwzLDAsMTE2LDQsMCwyNSwxMjUsMSwwLDEyMCw3NiwwLDEwMCwyNiwwLAotICAgIDY4LDkzLDY4LDAsMTI1LDIsMCwxMjQsMiwwLDExNiwxLDAsMTA2LDMsMCwKLSAgICAxMDcsNywwLDExNCw4MywwLDExNiwwLDAsMTA2LDUsMCwxMjQsMiwwLDEzMSwKLSAgICAxLDAsMTI1LDMsMCwxMTAsMTMsMCwxMTYsMSwwLDEwNiwzLDAsMTI0LDIsCi0gICAgMCwyNSwxMjUsMywwLDExNiw2LDAsMTI0LDEsMCwxMjQsMiwwLDEyNCwzLAotICAgIDAsMTMxLDMsMCwxLDExMyw0NCwwLDg3LDEwMCw1LDAsMTAwLDYsMCwxMDMsCi0gICAgMSwwLDEwMiwyLDAsMTAwLDcsMCwxMDAsOCwwLDEwMCw2LDAsMTAzLDIsCi0gICAgMCwxMDIsMiwwLDEwMiwyLDAsMTI1LDQsMCwxMjAsMTQ5LDAsMTI0LDQsMCwKLSAgICA2OCw5MywxMjksMCw5MiwyLDAsMTI1LDUsMCwxMjUsNiwwLDExNiw3LDAsCi0gICAgMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLDEyNCw2LDAsNjgsMTMxLDEsMCwKLSAgICAxMzEsMSwwLDExNSwxOTksMCwxMTYsOCwwLDEzMCwxLDAsMTI0LDYsMCwxMDAsCi0gICAgMTEsMCwyNSwxMjUsNywwLDEyNCw1LDAsMTE2LDEsMCwxMDYsMywwLDEwNywKLSAgICA2LDAsMTE0LDI0MSwwLDExNiwxLDAsMTA2LDMsMCwxMjQsNSwwLDI1LDEyNSwKLSAgICA4LDAsODAsMTEzLDE1NiwwLDEyMSwyMCwwLDExNiwwLDAsMTA2LDUsMCwxMjQsCi0gICAgNSwwLDEzMSwxLDAsMTI1LDgsMCw4MCw4NywxMTMsMTU2LDAsNCwxMTYsOSwKLSAgICAwLDEwNywxMCwwLDExNCwyOCwxLDEsMSwxLDExOSwxNTYsMCw4OSwxMTMsMTU2LAotICAgIDAsODgsMTEzLDE1NiwwLDg3LDExNiw5LDAsMTAwLDEyLDAsMTMxLDEsMCwxMzAsCi0gICAgMSwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTMsMCwxMjQsOCwwLDEzMSwzLAotICAgIDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLDE0LDAsMTI0LDcsMCwxMzEsMywKLSAgICAwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwxNSwwLDEwMCwxNiwwLDEwNiwxMCwKLSAgICAwLDEyNCw2LDAsMTMxLDEsMCwxMzEsMywwLDEsMTIxLDE5LDAsMTE2LDAsCi0gICAgMCwxMDYsNSwwLDEwMCwxNywwLDEzMSwxLDAsMTI1LDksMCw4NywxMTAsMjQsCi0gICAgMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDE0NywxLDEsMSwxLDEwMCwxOCwKLSAgICAwLDEyNSw5LDAsODksMTEwLDEsMCw4OCwxMTYsNiwwLDEyNCwxLDAsMTAwLAotICAgIDE3LDAsMTI0LDksMCwxMzEsMywwLDEsMTE2LDAsMCwxMDYsNSwwLDEwMCwKLSAgICAxOSwwLDEzMSwxLDAsMTI1LDEwLDAsMTE2LDYsMCwxMjQsMSwwLDEwMCwxOSwKLSAgICAwLDEyNCwxMCwwLDEzMSwzLDAsMSwxMjQsNSwwLDEwMCw3LDAsMTA3LDIsCi0gICAgMCwxMTQsMjM4LDEsMTE2LDAsMCwxMDYsNSwwLDEwMCwyMCwwLDEzMSwxLDAsCi0gICAgMTI1LDExLDAsMTE2LDYsMCwxMjQsMSwwLDEwMCwyMSwwLDEyNCwxMSwwLDEzMSwKLSAgICAzLDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLDIyLDAsMTE2LDExLDAsMTMxLAotICAgIDAsMCwxMzEsMywwLDEsMTE2LDEyLDAsMTA2LDEzLDAsMTE2LDIsMCwxMDYsCi0gICAgMTQsMCwxMzEsMCwwLDEzMSwxLDAsMSwxMjQsNSwwLDEwMCw3LDAsMTA3LAotICAgIDIsMCwxMTQsNjYsMiwxMTYsMTUsMCwxMDYsMTYsMCwxMDAsMjMsMCwxMzEsMSwKLSAgICAwLDEsMTAwLDI0LDAsMTE2LDEyLDAsMTA3LDYsMCwxMTQsNjYsMiwxMDAsMjUsCi0gICAgMCwxMTYsMTcsMCw5NSwxOCwwLDEwMCwxOCwwLDgzLDQxLDI3LDEyMiwyMDUsODMsCi0gICAgMTAxLDExNiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDQ1LDk4LDk3LAotICAgIDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTgsMTIxLDMyLDEwNSwKLSAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDEwLAotICAgIDMyLDMyLDMyLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDEwNSwxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LAotICAgIDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMTA5LDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwKLSAgICAxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksMTE2LDEwNCwxMDEsMTE0LDMyLDk5LDExMSwKLSAgICAxMDksMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEyMCwxMTYsCi0gICAgMTE0LDk3LDk5LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICA5OSwxMTEsMTE0LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDQ5LDAsMCwKLSAgICAwLDExNCw2MCwwLDAsMCwyMTgsOCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwxMTUsCi0gICAgMTE0LDE0MiwwLDAsMCw5MCw1LDExMiwxMTEsMTE1LDEwNSwxMjAsMjUwLDEsNDcsMjE4LAotICAgIDIsMTEwLDExNiwyNTAsMSw5Miw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCwzLDAsMCwwLDExNSwwLDAsMCwxMTUsMzMsMCwwLDAsCi0gICAgMTI0LDAsMCw5MywyMywwLDEyNSwxLDAsMTE2LDAsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDAsMTAwLDAsMCwxMDcsMiwwLDg2LDEsMTEzLDMsMCwxMDAsMSwwLAotICAgIDgzLDQxLDIsMTE0LDI5LDAsMCwwLDc4LDQxLDEsMTE0LDMxLDAsMCwwLAotICAgIDQxLDIsMTE0LDIyLDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMjI3LDAsMCwwLAotICAgIDk1LDUsMCwwLDExNSwyLDAsMCwwLDYsMCwxMjIsMjUsOTUsMTE1LDEwMSwKLSAgICAxMTYsMTE3LDExMiw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwKLSAgICAxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDExNCw1OSwwLDAsMCwxMjIsMzAsMTA1LDEwOSwxMTIsCi0gICAgMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDMyLAotICAgIDExMiwxMTEsMTE1LDEwNSwxMjAsMzIsMTExLDExNCwzMiwxMTAsMTE2LDExNCwzLDAsMCwwLAotICAgIDExNCwyNSwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDMwLDAsMCwwLDkwLAotICAgIDcsOTUsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw3OCw5MCw4LDk1LDExOSwxMDEsOTcsMTA3LAotICAgIDExNCwxMDEsMTAyLDkwLDYsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsMTE0LDE2OSwwLDAsMCwKLSAgICAxMTQsNiwwLDAsMCwxMjIsNCw0NiwxMTIsMTIxLDExOSwxMjIsNiw5NSwxMDAsNDYsCi0gICAgMTEyLDEyMSwxMDAsODQsNDEsNCwxMjIsMyw5NSwxMDUsMTExLDEyMiw5LDk1LDExOSw5NywKLSAgICAxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwxMjIsOCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwxMTUsCi0gICAgMTIyLDcsMTA5LDk3LDExNCwxMTUsMTA0LDk3LDEwOCw0MSwxOSwxMTQsMTIxLDAsMCwwLAotICAgIDExNCw3LDAsMCwwLDExNCwxNDUsMCwwLDAsMTE0LDIzOSwwLDAsMCwxMTQsCi0gICAgMTEyLDAsMCwwLDkwLDE4LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwMiwKLSAgICAxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsMTE2LDAsMCwwLDIxOCwzLDk3LAotICAgIDEwOCwxMDgsMjE4LDE0LDY1LDExNSwxMTUsMTAxLDExNCwxMTYsMTA1LDExMSwxMTAsNjksMTE0LDExNCwKLSAgICAxMTEsMTE0LDExNCwxMDcsMCwwLDAsMTE0LDI2LDAsMCwwLDExNCwxMSwwLDAsCi0gICAgMCwxMTQsMjI5LDAsMCwwLDExNCwxNDksMCwwLDAsMTE0LDI1LDEsMCwwLAotICAgIDExNCw4NCwwLDAsMCwxMTQsMTYzLDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LAotICAgIDE3MywwLDAsMCw0MSwxMiwyMTgsMTcsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsCi0gICAgOTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDExLDExNSwxMDEsMTA4LDEwMiw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMiw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwKLSAgICAxMTAsOTcsMTA5LDEwMSw5MCwxNCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSw5MCwxMCwxMTEsMTE1LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LAotICAgIDkwLDEwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMSwxMTUsMTE0LDIxLDAsMCwKLSAgICAwLDExNCwyNSwwLDAsMCw5MCw5LDExMSwxMTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTAsMTMsMTE2LDEwNCwxMTQsMTAxLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5MCwxNCwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5MCwxMywxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwyMTgsNiwKLSAgICA5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDcwLDUsMCwwLDExNSw4MiwwLDAsMCwwLAotICAgIDgsNiwxLDksMSw5LDMsMTMsMSwxMywxLDE1LDEsMTgsMiwxMywKLSAgICAxLDIwLDMsMzMsMSwxOSwyLDMxLDEsMTAsMSwxNSwxLDEzLDEsNCwKLSAgICAyLDMsMSwxNSwxLDUsMSwxMywxLDEyLDIsMTIsMSwxNiwxLDE2LAotICAgIDEsMjUsMywzLDEsMTksMSwxMywyLDExLDEsMTYsMywxNSwxLDE2LAotICAgIDMsMTIsMSwxNSwxLDE2LDMsMTksMSwxOSwxLDEyLDEsMTMsMSwxMiwKLSAgICAxLDExNCwzMywxLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMTYsMCwwLDAsCi0gICAgMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMSwxMTYsMSwwLDEzMSwwLDAsCi0gICAgMTI1LDEsMCwxMTYsMiwwLDEwNiwzLDAsMTA2LDQsMCwxMTYsNSwwLDEwNiwKLSAgICA2LDAsMTI0LDEsMCwxNDAsMCwwLDEwMywxLDAsMTMxLDEsMCwxLDExNiwKLSAgICA3LDAsMTA2LDgsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDc4LDAsMTE2LDIsCi0gICAgMCwxMDYsOSwwLDEwNiwxMCwwLDExNiwxMSwwLDEzMSwxLDAsMSwxMTYsMiwKLSAgICAwLDEwNiw5LDAsMTA2LDEwLDAsMTE2LDEyLDAsMTMxLDEsMCwxLDExNiw1LAotICAgIDAsMTI0LDAsMCw5NSw1LDAsMTE2LDEzLDAsMTI0LDAsMCw5NSwxMywwLAotICAgIDEwMCwyLDAsODMsNDEsMywxMjIsNDEsNzMsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwzMiw5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSwKLSAgICA0NiwxMTQsMjgsMSwwLDAsNzgsNDEsMTQsMTE0LDMzLDEsMCwwLDExNCwxNjEsCi0gICAgMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDI1NCwwLDAsMCwxMTQsMTQ5LDAsCi0gICAgMCwwLDExNCw2LDEsMCwwLDExNCwxOSwxLDAsMCwxMTQsMywwLDAsCi0gICAgMCwxMTQsMTEyLDAsMCwwLDIxOCw5LDEwOSwxMDEsMTE2LDk3LDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDExNCwxNjMsMCwwLDAsMTE0LDE2OCwwLDAsMCwxMTQsMjQ5LDAsMCwwLAotICAgIDExNCwyMTgsMCwwLDAsNDEsMiwxMTQsMzIsMSwwLDAsOTAsMTcsMTE1LDExNywKLSAgICAxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDgsCi0gICAgOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTM4LDUsMCwwLDExNSwxNiwwLDAsCi0gICAgMCwwLDIsMTAsMSw5LDEsMjgsMSwxNSwxLDE2LDEsMTYsNCw5LAotICAgIDEsMTE0LDM1LDEsMCwwLDQxLDMsMTIyLDMsMTE5LDEwNSwxMTAsMTE0LDEsMCwKLSAgICAwLDAsMTE0LDIsMCwwLDAsNDEsNTcsMTE0LDExNCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNywwLDAsMCwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDI4LDAsMCwwLDExNCwzOCwwLDAsMCwxMTQsMzksMCwwLAotICAgIDAsMTE0LDQzLDAsMCwwLDExNCw0NCwwLDAsMCwxMTQsNDYsMCwwLDAsCi0gICAgMTE0LDU1LDAsMCwwLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsOCw5NSw5NSw5OSwKLSAgICAxMTEsMTAwLDEwMSw5NSw5NSwxMTQsMTQ0LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsCi0gICAgMTM1LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTgsMCwwLDAsOTAsMTcsCi0gICAgOTUsODIsNjUsODcsOTUsNzcsNjUsNzEsNzMsNjcsOTUsNzgsODUsNzcsNjYsNjksCi0gICAgODIsMTE0LDczLDAsMCwwLDExNCw3MiwwLDAsMCwxMTQsODQsMCwwLDAsCi0gICAgMTE0LDc0LDAsMCwwLDkwLDIzLDY4LDY5LDY2LDg1LDcxLDk1LDY2LDg5LDg0LAotICAgIDY5LDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDkwLDI3LAotICAgIDc5LDgwLDg0LDczLDc3LDczLDkwLDY5LDY4LDk1LDY2LDg5LDg0LDY5LDY3LDc5LAotICAgIDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDExNCw3OSwwLDAsMCwKLSAgICAxMTQsODUsMCwwLDAsMTE0LDkxLDAsMCwwLDExNCw5NSwwLDAsMCwxMTQsCi0gICAgOTcsMCwwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxMzAsCi0gICAgMCwwLDAsMTE0LDE0MSwwLDAsMCwxMTQsMTQ3LDAsMCwwLDExNCwxNTAsMCwKLSAgICAwLDAsMTE0LDE1NSwwLDAsMCwyMTgsNiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMTE0LAotICAgIDE2MiwwLDAsMCwxMTQsMTY3LDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LDE4NCwKLSAgICAwLDAsMCwxMTQsMTk0LDAsMCwwLDExNCwyMTAsMCwwLDAsMTE0LDIxOCwwLAotICAgIDAsMCwxMTQsMjIzLDAsMCwwLDExNCwyMjksMCwwLDAsMTE0LDIyNCwwLDAsCi0gICAgMCwxMTQsMjMwLDAsMCwwLDExNCwyNDcsMCwwLDAsMTE0LDI0OSwwLDAsMCwKLSAgICAxMTQsNiwxLDAsMCwxMTQsMjQsMSwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsCi0gICAgMzMsMSwwLDAsMTE0LDM1LDEsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCw4LDYwLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDYyLDgsMCwwLDAsMTE1LDEwMCwwLDAsMCwKLSAgICA2LDE3LDYsMywxMiwxMiwxMiw1LDEyLDUsMTIsNiwxMiwxMiwxMiwxMCwKLSAgICAxMiw5LDEyLDUsMTIsNywxNSwyMiwxNSwxMTQsMjIsMSwxOCwyLDYsMSwKLSAgICA2LDIsOSwyLDksMiwxMCwyLDIxLDQ0LDEyLDMzLDEyLDE5LDEyLDEyLAotICAgIDEyLDEyLDE4LDgsMTIsMjgsMTIsMTcsMjEsNTUsMjEsMTIsMTgsMTAsMTIsMTQsCi0gICAgOSwzLDEyLDEsMTUsNjUsMTksNjQsMTksMjgsMjIsMTEwLDE5LDQxLDI1LDQzLAotICAgIDI1LDE2LDYsMywyNSw1MywxOSw1NywxOSw0MSwxOSwxMzQsMTksMTQ2LDE1LDIzLAotICAgIDEyLDExLDEyLDY4LAorICAgIDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTgwLDMsMCwwLDExNSw4LDAsCisgICAgMCwwLDAsMiwxOCwxLDgsMiw0LDMsMTIyLDM4LDk1LDc4LDk3LDEwOSwKKyAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSwxMDIsMTA1LDExMCwxMDAsCisgICAgOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LAorICAgIDEwMSwxMTUsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMywKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMjgsMCwwLDAsMTI0LDAsMTA2LDAsCisgICAgMTMxLDAsOTIsMiwxMjUsMSwxMjUsMiwxMTYsMSwxMTYsMiwxMDYsMywxMjQsMSwKKyAgICAyNSwwLDEyNCwyLDEzMSwyLDgzLDAsNDEsMSw3OCw0MSw0LDExNCwyMzMsMCwKKyAgICAwLDAsMTE0LDExMSwwLDAsMCwxMTQsNywwLDAsMCwyMTgsNywxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsNDEsMywxMTQsMTAxLDAsMCwwLDkwLDE4LDExMiw5NywKKyAgICAxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsCisgICAgOTAsMTQsMTEyLDk3LDExNiwxMDQsOTUsOTcsMTE2LDExNiwxMTQsOTUsMTEwLDk3LDEwOSwxMDEsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LAorICAgIDIyOCwwLDAsMCwxOTAsMywwLDAsMTE1LDQsMCwwLDAsMCwxLDEyLAorICAgIDEsMTIyLDMxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LAorICAgIDEwNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDgwLDAsMCwwLDExNiwwLDEyNCwwLAorICAgIDEwNiwxLDEzMSwwLDEzMSwxLDEyNSwxLDEyNCwxLDEyNCwwLDEwNiwyLDEwNywzLAorICAgIDExNCw3NCwxMjQsMCwxMDYsMywxMjQsMCwxMDYsNCwxMjQsMSwxMzEsMiwxMjUsMiwKKyAgICAxMjQsMiwxMDAsMCwxMDcsOSwxMTQsNjgsMTI0LDIsMTA2LDUsMTAwLDAsMTA3LDgsCisgICAgMTE0LDY4LDEyNCwyLDEwNiw2LDExNCw2OCwxMjQsMiwxMDYsNiwxMjQsMCw5NSw3LAorICAgIDEyNCwxLDEyNCwwLDk1LDIsMTI0LDAsMTA2LDcsODMsMCw0MSwxLDc4LDQxLAorICAgIDgsMTE0LDk0LDAsMCwwLDExNCwyMjgsMCwwLDAsMTE0LDIyOSwwLDAsMCwKKyAgICAxMTQsMjMwLDAsMCwwLDExNCwyMjYsMCwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsCisgICAgMTUxLDAsMCwwLDExNCwyMjcsMCwwLDAsNDEsMywxMTQsMTAxLDAsMCwwLAorICAgIDkwLDExLDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsMTE0LDE1OSwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsCisgICAgMCwyMTgsMTIsOTUsMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDE5NCwKKyAgICAzLDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEyLDEsMTAsMSwxNCwzLAorICAgIDE4LDEsNiwxLDgsMSw2LDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LAorICAgIDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSwxMTQsMTAxLDk5LDk3LDEwOCw5OSwKKyAgICAxMTcsMTA4LDk3LDExNiwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKKyAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTE2LAorICAgIDAsMTI0LDAsMTA2LDEsMTMxLDAsMTMxLDEsODMsMCw0MSwxLDc4LDQxLDIsCisgICAgMjE4LDQsMTA1LDExNiwxMDEsMTE0LDExNCwyMzUsMCwwLDAsNDEsMSwxMTQsMTAxLDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDIxOCw4LDk1LDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSwyMDcsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsCisgICAgOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA1LDExNiwxMDEsMTE0LDk1LDk1LDk5LAorICAgIDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDE0LDAsMCwwLDEyNCwyLDEyNCwwLDEwNiwwLDEyNCwKKyAgICAxLDYwLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDEsMTE0LDIyNywwLDAsCisgICAgMCw0MSwzLDExNCwxMDEsMCwwLDAsMjE4LDUsMTA1LDExMCwxMDAsMTAxLDEyMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMjE4LDExLDk1LDk1LDExNSwxMDEsMTE2LDEwNSwxMTYsMTAxLDEwOSw5NSw5NSwKKyAgICAyMTAsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNiw5NSw3OCw5NywKKyAgICAxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTE1LDEwMSwKKyAgICAxMTYsMTA1LDExNiwxMDEsMTA5LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwKKyAgICAwLDExNiwwLDEyNCwwLDEwNiwxLDEzMSwwLDEzMSwxLDgzLDAsNDEsMSw3OCwKKyAgICA0MSwyLDExNCwzMSwwLDAsMCwxMTQsMjM1LDAsMCwwLDQxLDEsMTE0LDEwMSwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLAorICAgIDAsMCwyMTgsNyw5NSw5NSwxMDgsMTAxLDExMCw5NSw5NSwyMTMsMywwLDAsMTE1LAorICAgIDIsMCwwLDAsMCwxLDEyMiwyMiw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsCisgICAgOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA4LDEwMSwxMTAsOTUsOTUsOTksMSwKKyAgICAwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsMTI0LDAsMTA2LDEsCisgICAgMTMxLDEsODMsMCw0MSwyLDc4LDEyMiwyMCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsCisgICAgOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDAsMTIzLDMzLDExNCwxMjUsNDEsNDEsMiwxMTQsCisgICAgNDgsMCwwLDAsMTE0LDIyNywwLDAsMCw0MSwxLDExNCwxMDEsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMjE4LAorICAgIDgsOTUsOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDIxNiwzLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDEsMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCisgICAgODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsMTIsMCwwLDAsMTI0LDEsMTI0LDAsMTA2LDAsMTMxLDAsMTA3LAorICAgIDYsODMsMCw0MSwxLDc4LDQxLDEsMTE0LDIzNSwwLDAsMCw0MSwyLDExNCwKKyAgICAxMDEsMCwwLDAsMjE4LDQsMTA1LDExNiwxMDEsMTA5LDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMiw5NSw5NSw5OSwxMTEsMTEwLAorICAgIDExNiw5NywxMDUsMTEwLDExNSw5NSw5NSwyMTksMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwxLDEyMiwyNyw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LAorICAgIDExNiwxMDQsNDYsOTUsOTUsOTksMTExLDExMCwxMTYsOTcsMTA1LDExMCwxMTUsOTUsOTUsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDAsMTA2LDAsMTA2LDEsMTI0LAorICAgIDEsMTMxLDEsMSwwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSwyLDExNCwyMjcsCisgICAgMCwwLDAsMTE0LDE1OCwwLDAsMCw0MSwyLDExNCwxMDEsMCwwLDAsMTE0LAorICAgIDI0MiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKKyAgICAwLDAsMCwxMTQsMTU4LDAsMCwwLDIyMiwzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCisgICAgOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLDE0LDExNCwxMDYsMCwKKyAgICAwLDAsMTE0LDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLAorICAgIDAsMTE0LDE4MCwwLDAsMCwxMTQsMjMzLDAsMCwwLDExNCwyMjgsMCwwLDAsCisgICAgMTE0LDIzNSwwLDAsMCwxMTQsMjM3LDAsMCwwLDExNCwyMzksMCwwLDAsMTE0LAorICAgIDI0MCwwLDAsMCwxMTQsMjQxLDAsMCwwLDExNCwyNDMsMCwwLDAsMTE0LDE1OCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNSwwLDAsMCwxMTQsMjI1LDAsMCwwLDE2NywzLDAsMCwKKyAgICAxMTUsMjIsMCwwLDAsOCw1LDQsMiw4LDYsOCwxMCw4LDQsOCwKKyAgICAxMyw4LDMsOCwzLDgsMyw4LDMsOCwzLDExNCwyMjUsMCwwLDAsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsODAsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCwKKyAgICA5MCwyLDEwMCwxLDEwMCwyLDEzMiwwLDkwLDMsMTAxLDQsMTAwLDMsMTAwLDQsCisgICAgMTMyLDAsMTMxLDEsOTAsNSwxMDAsNSwxMDAsNiwxMzIsMCw5MCw2LDEwMCw3LAorICAgIDEwMCw4LDEzMiwwLDkwLDcsMTAwLDksMTAwLDEwLDEzMiwwLDkwLDgsMTAwLDExLAorICAgIDEwMCwxMiwxMzIsMCw5MCw5LDEwMCwxMywxMDAsMTQsMTMyLDAsOTAsMTAsMTAwLDE1LAorICAgIDEwMCwxNiwxMzIsMCw5MCwxMSwxMDAsMTcsODMsMCw0MSwxOCwyMTgsMTYsOTUsNzgsCisgICAgOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsOTksNCwKKyAgICAwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNCwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMTgsMCwwLDAsMTE2LDAsMTI0LDEsMTI0LDIsMTI0LDMsCisgICAgMTMxLDMsMTI0LDAsOTUsMSwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsCisgICAgMjI1LDAsMCwwLDExNCwyMjcsMCwwLDAsNDEsNCwxMTQsMTAxLDAsMCwwLAorICAgIDExNCw5OSwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDIzMSwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsMTgwLAorICAgIDAsMCwwLDIyOCwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LAorICAgIDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LAorICAgIDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwwLDAsMCwKKyAgICAwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMiwKKyAgICAwLDAsMCwxMDAsMSwxMDYsMCwxMjQsMSwxMDYsMSwxMzEsMSw4MywwLDQxLAorICAgIDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNCwxMDEsMTEyLDExNCwzMiwxMDIsCisgICAgMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOSwxMDEsMTE2LDEwNCwKKyAgICAxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCwKKyAgICA0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOSw5NywKKyAgICA5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LDEwMiw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjUsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMzIsNDAsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsCisgICAgNjIsNDEsMiwxMTQsNDgsMCwwLDAsMTE0LDEwNiwwLDAsMCw0MSwyLDExNCwKKyAgICAxNjUsMCwwLDAsMTE0LDE4NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMTEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTUsMTE0LDEwMSwxMTIsMTE0LDIzMSwzLDAsMCwxMTUsMiwwLDAsMCwwLDcsCisgICAgMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw5OSwyLAorICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiw3OCw4NCwKKyAgICAxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDEsMCwwLDAsMTE0LDEyMCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwwLDAsMCwKKyAgICAxMTQsMTU0LDAsMCwwLDI0MCwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsCisgICAgMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDc4LDExNCwzMCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDEsMCwwLDAsMTE0LAorICAgIDEyMCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNSwKKyAgICAwLDAsMCwxMTQsMTk3LDAsMCwwLDI0MywzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCisgICAgOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNiwwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTgsMCwwLDAsMTE2LDAsMTAwLDEsMTAwLDIsCisgICAgMTAwLDMsMTAwLDQsMTAwLDUsMTQ0LDEsMTMxLDMsODMsMCw0MSw2LDc4LDExNCwKKyAgICAzMCwwLDAsMCwxMjIsOCw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMyw2MiwxMTQsMTg0LAorICAgIDAsMCwwLDExNCwxOTksMCwwLDAsODQsNDEsMSwxMTQsMjAwLDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODIsMCwwLDAsCisgICAgMjQ2LDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsCisgICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwKKyAgICAxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwKKyAgICAxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsCisgICAgMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsCisgICAgMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMSwwLDAsMCwxMTQsCisgICAgMTU5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwxODEsMCwwLDAsMjQ5LDMsMCwwLDExNSwwLDAsMCwKKyAgICAwLDEyMiwzMCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMCw4MywwLDQxLAorICAgIDEsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwxODUsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMTE0LDE4NiwwLDAsMCwyNTIsMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwxLDEyMiwyOCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwyNiwwLDAsMCwxMTYsMCwxMDYsMSwxMDAsMSwKKyAgICAxMjQsMCwxMDYsMiwxMzEsMiwxLDAsMTE2LDAsMTA2LDMsMTI0LDAsMTI0LDEsCisgICAgMTMxLDIsODMsMCw0MSwyLDEyMiw5OCw3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDExMCwKKyAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwKKyAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywKKyAgICAxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwzOCwxMTAsOTcsMTA5LDEwMSwKKyAgICAxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMjMsMzMsCisgICAgMTE0LDEyNSw0MSw0LDExNCwxMTUsMCwwLDAsMTE0LDEzMCwwLDAsMCwxMTQsMjI3LAorICAgIDAsMCwwLDExNCwxODcsMCwwLDAsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwKKyAgICAxMjAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsCisgICAgMCwwLDAsMTE0LDE4OCwwLDAsMCwyNTUsMywwLDAsMTE1LDYsMCwwLAorICAgIDAsMCw3LDYsMSw4LDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiwKKyAgICA5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDc4LDQxLDEyLDExNCwxMDYsMCwwLDAsMTE0LDEwNSwwLAorICAgIDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxODAsMCwwLDAsMTE0LDE3OCwwLDAsCisgICAgMCwxMTQsMjQ1LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE5NywwLDAsMCwKKyAgICAxMTQsMTgyLDAsMCwwLDExNCwxODEsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsCisgICAgMTg4LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDQsMCwwLDAsMjI3LDMsMCwKKyAgICAwLDExNSwxNiwwLDAsMCw4LDEsOCwzLDEyLDksOCwzLDgsMywKKyAgICA4LDMsOCwzLDgsMywxMTQsMjQ0LDAsMCwwLDk5LDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNjQsMCwwLDAsCisgICAgMTE1LDEwNiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsCisgICAgMywxMDEsNCwxMDAsMiwxMDAsMywxMzIsMCwxMzEsMSw5MCw1LDEwMSw0LDEwMCwKKyAgICA0LDEwMCw1LDEzMiwwLDEzMSwxLDkwLDYsMTAxLDQsMTAwLDYsMTAwLDcsMTMyLAorICAgIDAsMTMxLDEsOTAsNywxMDEsNCwxMDAsOCwxMDAsOSwxMzIsMCwxMzEsMSw5MCwKKyAgICA4LDEwMSw0LDEwMCwxNywxMDAsMTEsMTAwLDEyLDEzMiwxLDEzMSwxLDkwLDksMTAxLAorICAgIDQsMTAwLDE4LDEwMCwxMywxMDAsMTQsMTMyLDEsMTMxLDEsOTAsMTAsMTAxLDQsMTAwLAorICAgIDE5LDEwMCwxNSwxMDAsMTYsMTMyLDEsMTMxLDEsOTAsMTEsMTAwLDEwLDgzLDAsNDEsCisgICAgMjAsMjE4LDEwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsNjIsNzcsCisgICAgMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwKKyAgICAxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiw5NywxMTAsMTAwLAorICAgIDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiw5NSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICA5NSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDQ2LDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDQyLDAsMCwwLDEyMCwzNiwxMTYsMCwxMDYsMSwxMDYsMiwxMzEsCisgICAgMCw2OCwwLDkzLDIyLDEyNSwxLDExNiwzLDEyNCwxLDEwMCwxLDEzMSwyLDExNCwKKyAgICAxMiwxMjQsMSwxMDYsNCwxMzEsMCwxLDAsMTEzLDEyLDg3LDAsMTAwLDIsODMsCisgICAgMCw0MSwzLDEyMiwxMjUsNjcsOTcsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTEwLAorICAgIDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDQwLAorICAgIDQxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExMSwxMTAsMzIsOTcsMTA4LDEwOCwzMiwKKyAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTE2LDExMSwxMTQsMTAxLAorICAgIDEwMCwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsMzIsNDAsMTE5LAorICAgIDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLAorICAgIDQxLDQ2LDIxOCwxNywxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LAorICAgIDk3LDk5LDEwNCwxMDEsMTE1LDc4LDQxLDUsMTE0LDcsMCwwLDAsMjE4LDE5LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksCisgICAgMTA0LDEwMSwyMTgsNiwxMTgsOTcsMTA4LDExNywxMDEsMTE1LDExNCwxMDksMCwwLDAsMTE0LAorICAgIDI0NywwLDAsMCw0MSwyLDExNCwxNjUsMCwwLDAsMjE4LDYsMTAyLDEwNSwxMTAsCisgICAgMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwKKyAgICAwLDAsMTE0LDI0NywwLDAsMCwxNyw0LDAsMCwxMTUsNiwwLDAsMCwKKyAgICAwLDQsMTYsMSwxMCwxLDEyMiwyOCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5NywKKyAgICA5OSwxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsCisgICAgMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsODYsMCwwLDAsMTE2LDAsCisgICAgMTA2LDEsMTAwLDEsMTA3LDksMTE0LDMwLDExNiwwLDEwNiwxLDEyLDAsMTE0LDMwLAorICAgIDExNiwyLDEwNiwzLDEwMCwyLDExNiw0LDEzMSwyLDEsMCwxMjAsNTAsMTE2LDAsCisgICAgMTA2LDEsNjgsMCw5MywzNiwxMjUsMiwxMjEsOCwxMjQsMiwxMjQsMSwxMzEsMSwKKyAgICA4MywwLDQsMCwxMTYsNSwxMDcsMTAsMTE0LDcyLDEsMCwxLDAsMSwwLAorICAgIDExOSwzOCw4OSwwLDExMywzOCw4OCwwLDExMywzOCw4NywwLDEwMCwxLDgzLDAsCisgICAgMTAwLDEsODMsMCw0MSwzLDEyMiwxMTMsODMsMTAxLDk3LDExNCw5OSwxMDQsMzIsMTE1LAorICAgIDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksMTAxLDMyLDExMSwxMDIsMzIsMTA0LDExMSwxMTEsMTA3LDExNSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLAorICAgIDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiw3MywxMDIsMzIsMzksMTA0LDExMSwxMTEsMTA3LDExNSwzOSwzMiwxMDUsMTE1LAorICAgIDMyLDEwMiw5NywxMDgsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE3LDExNSwxMDEsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMjIsMjMsMTE1LDEyMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMiwxMDUsMTE1LDMyLDEwMSwxMDksCisgICAgMTEyLDExNiwxMjEsNDEsNiwxMTQsNywwLDAsMCwyMTgsMTAsMTEyLDk3LDExNiwxMDQsCisgICAgOTUsMTA0LDExMSwxMTEsMTA3LDExNSwxMTQsNjEsMCwwLDAsMTE0LDYyLDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDEwMCwwLDAsMCw0MSwzLDExNCwxNjUsMCwwLAorICAgIDAsMTE0LDM1LDAsMCwwLDkwLDQsMTA0LDExMSwxMTEsMTA3LDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDIxOCwxMSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDI1LDQsMCwwLDExNSwxNiwwLDAsCisgICAgMCwwLDcsMTgsMSwxMiwxLDEyLDEsMiwxLDgsMSwxNCwxLDEyLAorICAgIDIsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDk5LDIsMCwwLDAsMCwwLAorICAgIDAsMCwzLDAsMCwwLDE5LDAsMCwwLDY3LDAsMCwwLDExNSwxMDIsCisgICAgMCwwLDAsMTI0LDEsMTAwLDEsMTA3LDIsMTE0LDQyLDEyMSwxMiwxMTYsMCwxMDYsCisgICAgMSwxMzEsMCwxMjUsMSw4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCwKKyAgICA0MCwxLDAsMSwwLDEsMCwxMDAsMiw4MywwLDg4LDAsMTIxLDE0LDExNiwKKyAgICAzLDEwNiw0LDEyNCwxLDI1LDAsMTI1LDIsODcsMCwxMTAsNDAsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsOTYsMSwwLDEsMCwxLDAsMTI0LDAsMTA2LDYsMTI0LAorICAgIDEsMTMxLDEsMTI1LDIsMTI0LDIsMTE2LDMsMTA2LDQsMTI0LDEsNjAsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDIsODMsMCw0MSwzLDEyMiwyMTAsNzEsMTAxLDExNiwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwMiwKKyAgICAxMTQsMTExLDEwOSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCisgICAgMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiwxMDUsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsNDQsMzIsMTAyLDEwNSwxMTAsCisgICAgMTAwLDMyLDExNiwxMDQsMTAxLDMyLDk3LDExMiwxMTIsMTE0LDExMSwxMTIsMTE0LDEwNSw5NywxMTYsCisgICAgMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDk3LDExMCwxMDAsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMDUsMTE2LDQ2LDMyLDczLAorICAgIDEwMiwzMiwxMTAsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsCisgICAgMTE4LDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NCwzMiwxMTUsMTE2LDExMSwxMTQsMTAxLDMyLAorICAgIDc4LDExMSwxMTAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwKKyAgICAzMCwwLDAsMCw3OCw0MSw3LDExNCwzLDAsMCwwLDExNCw0NSwwLDAsCisgICAgMCwyMTgsMTcsNzAsMTA1LDEwOCwxMDEsNzgsMTExLDExNiw3MCwxMTEsMTE3LDExMCwxMDAsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDExNCw3LDAsMCwwLDExNCwyNDgsMCwwLDAsMTE0LDEzMiwKKyAgICAwLDAsMCwxMTQsMjUyLDAsMCwwLDQxLDMsMTE0LDE2NSwwLDAsMCwxMTQsCisgICAgMzUsMCwwLDAsMTE0LDI1MCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNSwwLDAsMCwyMTgsMjAsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQyLDQsCisgICAgMCwwLDExNSwyMiwwLDAsMCwwLDgsOCwxLDIsMSwxMiwxLDE0LAorICAgIDMsNiwxLDIsMSwxNCwxLDE0LDEsMTAsMSwxNiwxLDEyMiwzMSw4MCwKKyAgICA5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTEyLDk3LDExNiwxMDQsOTUsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk5LDMsCisgICAgMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDgyLDAsMCwwLDExNiwwLDEyNCwyLDEwMCwxLDEzMSwyLAorICAgIDExNCwyNiwxMjQsMiwxMDYsMSwxMjQsMSwxMzEsMSw5MiwyLDEyNSwzLDEyNSw0LAorICAgIDExMCwxNCwxMjQsMiwxMDYsMiwxMjQsMSwxMzEsMSwxMjUsMywxMDMsMCwxMjUsNCwKKyAgICAxMjQsMywxMDAsMCwxMDcsOSwxMTQsNjAsMTE2LDMsMTA2LDQsMTI0LDEsMTI0LDMsCisgICAgMTMxLDIsODMsMCwxMTYsMywxMDYsNSwxMjQsMSwxMDAsMCwxMzEsMiwxMjUsNSwKKyAgICAxMjQsNCwxMjQsNSw5NSw2LDEyNCw1LDgzLDAsNDEsMiw3OCwxMTQsMTE4LDAsCisgICAgMCwwLDQxLDcsMTE0LDEwOSwwLDAsMCwxMTQsMTE4LDAsMCwwLDExNCwxNzcsCisgICAgMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTc0LDAsMCwwLDExNCwxNTUsMCwKKyAgICAwLDAsMTE0LDE1MSwwLDAsMCw0MSw2LDExNCwxNjUsMCwwLDAsMTE0LDEyMCwKKyAgICAwLDAsMCwxMTQsMjUwLDAsMCwwLDExNCwxMjEsMCwwLDAsMTE0LDEyMiwwLAorICAgIDAsMCwxMTQsMTU5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDIxOCwxNiw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsCisgICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNjQsNCwwLDAsMTE1LDE4LDAsMCwKKyAgICAwLDAsNCwxMCwxLDE2LDIsMTAsMSw0LDEsOCwxLDEyLDEsMTIsCisgICAgMSw2LDEsMTIyLDI3LDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKKyAgICA5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksCisgICAgNzgsOTksNCwwLDAsMCwwLDAsMCwwLDksMCwwLDAsNSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTcwLDAsMCwwLDEwMywwLDEyNSw0LDEyMCwKKyAgICAxNjAsMTI0LDIsNjgsMCw5MywxMzAsMTI1LDUsMTE2LDAsMTI0LDUsMTE2LDEsMTE2LAorICAgIDIsMTAyLDIsMTMxLDIsMTE1LDMwLDExMywxMCwxMjQsMCwxMDYsMywxMjQsNSwxMzEsCisgICAgMSwxMjUsNiwxMjQsNiwxMDAsMSwxMDcsOSwxMTQsMTAsMTE2LDQsMTI0LDYsMTAwLAorICAgIDIsMTMxLDIsMTE0LDcyLDEyNCw2LDEwNiw1LDEyNCwxLDEyNCwzLDEzMSwyLDEyNSwKKyAgICA3LDExMCwxMiwxMjQsMCwxMDYsNiwxMjQsMSwxMjQsNiwxMzEsMiwxMjUsNywxMjQsCisgICAgNywxMDAsMSwxMDcsOCwxMTQsOTQsMTEzLDEwLDEyNCw3LDEwNiw3LDEwMCwxLDEwNywKKyAgICA5LDExNCwxMDgsMTI0LDcsODMsMCwxMjQsNywxMDYsOCwxMjUsOCwxMjQsOCwxMDAsCisgICAgMSwxMDcsOCwxMTQsMTMwLDExNiw5LDEwMCwzLDEzMSwxLDEzMCwxLDEyNCw0LDEwNiwKKyAgICAxMCwxMjQsOCwxMzEsMSwxLDAsMTEzLDEwLDg3LDAsMTE2LDExLDEwNiwxMiwxMjQsCisgICAgMSwxMDAsMSwxMzEsMiwxMjUsNywxMjQsNCwxMjQsNyw5NSw4LDEyNCw3LDgzLAorICAgIDAsMTAwLDEsODMsMCw0MSw0LDEyMiw2Myw3MCwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExMSwxMTQsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LAorICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ3LDExMiw5Nyw5OSwxMDcsOTcsCisgICAgMTAzLDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0Niw3OCwxMTQsMTc2LDAsMCwwLDEyMiwxOSwKKyAgICAxMTUsMTEyLDEwMSw5OSwzMiwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0MSwxMywxMTQsMTM4LDAsMCwwLDExNCw3MCwwLDAsMCwyMTgsCisgICAgNSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDI1NCwwLDAsMCwxMTQsMTA5LDAsMCwwLAorICAgIDExNCwxNzYsMCwwLDAsMTE0LDI1NSwwLDAsMCwxMTQsMTIxLDAsMCwwLDExNCwKKyAgICAxNTEsMCwwLDAsMTE0LDEwMCwwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCwxMTUsCisgICAgMCwwLDAsMTE0LDE1NSwwLDAsMCw0MSw5LDExNCwxNjUsMCwwLDAsMTE0LAorICAgIDEyMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDE3NSwwLDAsMCwyMTgsMTQsCisgICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsNSwKKyAgICAxMDEsMTEwLDExNiwxMTQsMTIxLDExNCwyNTAsMCwwLDAsMTE0LDE1OSwwLDAsMCwxMTQsCisgICAgMTIyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDIxOCw5LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDc5LDQsCisgICAgMCwwLDExNSw0MCwwLDAsMCwwLDUsNCwxLDEwLDEsMTQsMSwyLAorICAgIDEsMTAsMSw4LDEsMTAsMSwxNCwyLDEyLDEsOCwxLDIsMSwxMCwKKyAgICAxLDQsMSw2LDEsOCwxLDgsNSwxNCwyLDEyLDEsNiwxLDEyMiwKKyAgICAyMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAzLDEwMSwxMTYsCisgICAgOTUsMTE1LDExMiwxMDEsOTksOTksNCwwLDAsMCwwLDAsMCwwLDYsMCwKKyAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTA0LDAsMCwwLDEyNCwKKyAgICAyLDEwMCwxLDEwNyw4LDExNCwxNCwxMTYsMCwxMDYsMSwxMjUsMiwxMjQsMCwxMDYsCisgICAgMiwxMjQsMSwxMjQsMiwxMjQsMywxMzEsMywxMjUsNCwxMjQsNCwxMDAsMSwxMDcsCisgICAgOCwxMTQsNDIsMTAwLDEsODMsMCwxMTAsNTgsMTI0LDQsMTA2LDMsMTAwLDEsMTA3LAorICAgIDgsMTE0LDk2LDEyNCw0LDEwNiw0LDEyNSw1LDEyNCw1LDExNCw5MCwxMDAsMiwxMjQsCisgICAgNCw5NSw1LDExNiw2LDEyNCwxLDEyNCw1LDEyNCwwLDEwNiwyLDEzMSwzLDEyNCwKKyAgICA0LDk1LDQsMTI0LDQsODMsMCwxMTMsMTAwLDEwMCwxLDgzLDAsMTEwLDQsMTI0LAorICAgIDQsODMsMCwxMDAsMSw4MywwLDQxLDMsMTIyLDk4LDEwMiwxMDUsMTEwLDEwMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsCisgICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwxMTQsMzIsMzksMTEyLDk3LDExNiwxMDQsMzksCisgICAgMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwKKyAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDc4LDkwLDksCisgICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDEsNywxMTQsNywwLDAsMCwKKyAgICAxMTQsMzUsMCwwLDAsMTE0LDIsMSwwLDAsMTE0LDEyMSwwLDAsMCwxMTQsCisgICAgMTUxLDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDIyNSwwLDAsMCw0MSw2LAorICAgIDExNCwxNjUsMCwwLDAsMTE0LDEyMCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LAorICAgIDE3NSwwLDAsMCwxMTQsMTU5LDAsMCwwLDExNCwxLDEsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwxNzYsMCwKKyAgICAwLDAsMTExLDQsMCwwLDExNSwyNiwwLDAsMCwwLDQsOCwxLDYsCisgICAgMSwxNCwxLDgsMSw2LDEsMTAsMSw2LDEsNCwzLDYsMSwxNiwKKyAgICAxLDYsMiw2LDIsMTIyLDIwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwKKyAgICAwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsMzAsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTI1LAorICAgIDMsMTI0LDMsMTAwLDEsMTA3LDgsMTE0LDI0LDEwMCwxLDgzLDAsMTI0LDMsMTA2LAorICAgIDEsODMsMCw0MSwyLDEyMiwxNzAsMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywxMTUsCisgICAgMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwKKyAgICAxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLDEwMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LAorICAgIDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LAorICAgIDExNSwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDMyLDEwNSwKKyAgICAxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDc4LDQxLDIsMTE0LDE3NiwwLDAsMCwxMTQsMTIxLDAsMCwwLDQxLDQsCisgICAgMTE0LDE2NSwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsCisgICAgMTU5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LAorICAgIDAsMCwwLDExNCwxNzcsMCwwLDAsMTMzLDQsMCwwLDExNSw4LDAsMCwKKyAgICAwLDAsOCwxMiwxLDgsMSw0LDEsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsCisgICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsNDEsMSw3OCw0MSwyLDc4LDc4LDQxLDEsNzgsNDEsMTIsMTE0LDEwNiwwLAorICAgIDAsMCwxMTQsMTA1LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLDAsCisgICAgMCwxMTQsMTc4LDAsMCwwLDExNCwyNDcsMCwwLDAsMTE0LDI1MiwwLDAsMCwKKyAgICAxMTQsMjU0LDAsMCwwLDExNCwyNTUsMCwwLDAsMTE0LDIsMSwwLDAsMTE0LAorICAgIDE3NiwwLDAsMCwxMTQsMTc3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDYsMCwKKyAgICAwLDAsMTMsNCwwLDAsMTE1LDIyLDAsMCwwLDgsMiw0LDIsMTIsCisgICAgOCwxMiwxNywxMiwyMiwxMiwxNSwyLDEsMTIsMzEsMiwxLDEyLDIxLDIsCisgICAgMSwxMTQsMjQ2LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDMsMCwwLDAsNjQsMCwwLDAsMTE1LDkwLDAsMCwwLAorICAgIDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLAorICAgIDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDEsNiw5MCw3LAorICAgIDEwMCw2LDEwMCw3LDEzMiwwLDkwLDgsMTAwLDgsMTAwLDksMTMyLDAsOTAsOSwKKyAgICAxMDAsMTksMTAwLDExLDEwMCwxMiwxMzIsMSw5MCwxMCwxMDAsMTMsMTAwLDE0LDEzMiwwLAorICAgIDkwLDExLDEwMSwxMiwxMDAsMTUsMTAwLDE2LDEzMiwwLDEzMSwxLDkwLDEzLDEwMCwxNywKKyAgICAxMDAsMTgsMTMyLDAsOTAsMTQsMTAwLDEwLDgzLDAsNDEsMjAsMjE4LDEwLDcwLDEwNSwKKyAgICAxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLDE3Miw3MCwxMDUsMTA4LDEwMSw0NSw5OCwKKyAgICA5NywxMTUsMTAxLDEwMCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiw3MywxMTAsMTE2LDEwMSwxMTQsOTcsOTksMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwxMTksCisgICAgMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwxMjEsMTE1LAorICAgIDExNiwxMDEsMTA5LDMyLDk3LDExNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSwxMDAsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTAyLDExMSwxMTQsMTA5LDk3LDExMCw5OSwxMDEsNDQsMzIsCisgICAgOTgsMTAxLDEwNSwxMTAsMTAzLDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTAyLDExNCwxMDEsMTE1LAorICAgIDEwNCwxMDEsMTAwLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDAsMTA1LDExNCwKKyAgICAxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDMyLDEwNSwxMTUsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwNSwxMTAsMTAzLDMyLDEwNCw5NywKKyAgICAxMTUsMzIsOTgsMTAxLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTA1LDEwMiwxMDUsMTAxLDEwMCw0NiwKKyAgICAxMCwxMCwzMiwzMiwzMiwzMiw5OSwyLDAsMCwwLDAsMCwwLDAsNSwKKyAgICAwLDAsMCw1LDAsMCwwLDcsMCwwLDAsMTE1LDg4LDAsMCwwLAorICAgIDEwMywwLDEyNSwzLDEyMCw0MCwxMjQsMiw2OCwwLDkzLDMyLDkyLDIsMTM3LDAsCisgICAgMTI1LDQsMTI0LDMsMTA2LDAsMTM1LDAsMTAyLDEsMTAwLDEsMTAwLDIsMTMyLDgsCisgICAgMTI0LDQsNjgsMCwxMzEsMSwxMzEsMSwxLDAsMTEzLDEwLDg3LDAsMTI0LDMsCisgICAgMTI0LDAsOTUsMSwxMjQsMSwxMTIsNTgsMTAwLDMsMTI0LDAsOTUsMiwxMDAsNiwKKyAgICAxMjQsMCw5NSwzLDExNiw0LDEzMSwwLDEyNCwwLDk1LDUsMTE2LDQsMTMxLDAsCisgICAgMTI0LDAsOTUsNiwxMDAsNSw4MywwLDQxLDcsMTIyLDE1NCw3MywxMTAsMTA1LDExNiwKKyAgICAxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMTEsCisgICAgMTEwLDMyLDk3LDExMCwxMDAsMzIsOTcsMzIsMTE4LDk3LDExNCwxMDUsOTcsOTgsMTA4LDEwMSwKKyAgICAzMiwxMTAsMTE3LDEwOSw5OCwxMDEsMTE0LDMyLDExMSwxMDIsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsNTAsNDUsMTE2LDExNywxMTIsMTA4LDEwMSwxMTUsMzIsOTksMTExLDExMCwxMTYsCisgICAgOTcsMTA1LDExMCwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDMyLDk3LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExNSwKKyAgICAxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsCisgICAgMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTAxLDk5LDExMSwxMDMsCisgICAgMTEwLDEwNSwxMjIsMTAxLDExNSw0Niw5OSwxLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwzLDAsMCwwLDUxLDAsMCwwLDExNSwyMiwwLDAsMCwKKyAgICAxMjQsMCw5MywxNCwxMjUsMSwxMjQsMSwxMzYsMCwxMDIsMiw4NiwwLDEsMCwKKyAgICAxMTMsMiwxMDAsMCw4MywwLDQxLDEsNzgsMTE0LDQsMCwwLDAsNDEsMiwKKyAgICAxMTQsMjIsMCwwLDAsMTE0LDIyMCwwLDAsMCw0MSwxLDExNCwxMjEsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDIyMiwwLDAsMCwKKyAgICAxNjIsNCwwLDAsMTE1LDIsMCwwLDAsNCwwLDEyMiwzOCw3MCwxMDUsMTA4LAorICAgIDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSwKKyAgICA0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsMTAxLDEyMCwKKyAgICAxMTIsMTE0LDYyLDExNCw1OSwwLDAsMCwxMTQsMjksMCwwLDAsNzgsMTE0LDg4LAorICAgIDAsMCwwLDQxLDcsMTE0LDE0NCwwLDAsMCwyMTgsOCw5NSwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDExNSwxMTQsMzUsMCwwLDAsMjE4LDExLDk1LDExMiw5NywxMTYsMTA0LAorICAgIDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMjE4LDMsMTE1LDEwMSwxMTYsMjE4LDExLDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMjE4LDE5LDk1LDExNCwxMDEsMTA4LDk3LDEyMCwKKyAgICAxMDEsMTAwLDk1LDExMiw5NywxMTYsMTA0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDEsNSwxMTQsCisgICAgMTAxLDAsMCwwLDExNCwzNSwwLDAsMCwyMTgsMTQsMTA4LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCw3LDEwOCwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsMTE1LDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsMTIxLAorICAgIDAsMCwwLDExNCw1LDAsMCwwLDExNCwxODAsMCwwLDAsMTU2LDQsMCwKKyAgICAwLDExNSwxNiwwLDAsMCwwLDQsNCwxLDE0LDEsMjgsMSw2LDIsCisgICAgMTAsMSw2LDEsOCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwKKyAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwwLAorICAgIDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxMCwwLDAsMCwxMDAsMywxMjQsMCw5NSwwLDEwMCwyLDgzLDAsNDEsCisgICAgNCwxMjIsMzEsNzMsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTA5LDExNiwxMDUsMTA5LAorICAgIDEwMSw0NiwxMTQsMjksMCwwLDAsNzgsMTE0LDg4LDAsMCwwLDQxLDEsMTE0LAorICAgIDUsMSwwLDAsNDEsMSwxMTQsMTAxLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLDExNCwyNDcsMCwwLDAsMTcwLAorICAgIDQsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjgsNzAsMTA1LDEwOCwxMDEsCisgICAgNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsCisgICAgMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDk5LDIsMCwwLDAsMCwwLDAsCisgICAgMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDQyLDAsCisgICAgMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEzMSwxLDEyNSwyLDEyNCwyLDEwMCwxLAorICAgIDEwNyw4LDExNCwyNiwxMDAsMSwxMDMsMCwxMDIsMiw4MywwLDEyNCwyLDEwNiwxLAorICAgIDEyNCwyLDEwNiwyLDExMiwzOCwxMDMsMCwxMDIsMiw4MywwLDQxLDIsMTIyLDE5NywKKyAgICA4NCwxMTQsMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsCisgICAgOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMTEsCisgICAgMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwKKyAgICAxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDQ2LDMyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMTE1LDMyLDQwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTA4LDEwNSwxMTUsMTE2LDQ1LAorICAgIDExMSwxMDIsNDUsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSw0MSw0NiwxMCwxMCwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsCisgICAgMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsCisgICAgNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksCisgICAgNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsMzIsNzgsNDEsMywxMTQsMTc2LDAsMCwwLDExNCwxMjEsMCwKKyAgICAwLDAsMTE0LDE1MSwwLDAsMCw0MSwzLDExNCwxMDEsMCwwLDAsMTE0LDEyMCwKKyAgICAwLDAsMCwxMTQsMTU5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw1LDAsMCwwLDExNCwxMTgsMCwwLDAsMTc2LDQsMCwwLAorICAgIDExNSw4LDAsMCwwLDAsNywxMCwxLDgsMSw4LDEsMTIyLDIyLDcwLAorICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMTQsOTksNiwwLDAsMCwwLDAsMCwwLDcsMCwKKyAgICAwLDAsNywwLDAsMCw2NywwLDAsMCwxMTUsMzAsMCwwLDAsMTI0LAorICAgIDEsMTI0LDIsMTI0LDMsMTMxLDIsMTI1LDYsMTE2LDAsMTI0LDIsMTI0LDMsMTAwLAorICAgIDEsMTI0LDYsMTAwLDIsMTI0LDQsMTQ0LDIsMTMxLDIsODMsMCw0MSwzLDc4LAorICAgIDExNCwxMjEsMCwwLDAsMTE0LDE1MSwwLDAsMCw0MSwxLDExNCwxNjIsMCwwLAorICAgIDAsNDEsNywxMTQsMTAxLDAsMCwwLDExNCwxNjAsMCwwLDAsMTE0LDEyMCwwLAorICAgIDAsMCwxMTQsMzUsMCwwLDAsOTAsNCwxMTUsMTA5LDExNSwxMDgsMTE0LDE3NSwwLAorICAgIDAsMCwxMTQsMTIxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw1LDAsMCwwLDExNCwyLDEsMCwwLDE4OCw0LDAsMCwxMTUsCisgICAgNiwwLDAsMCwwLDEsMTAsMSwxMiwxLDEyMiwyMCw3MCwxMDUsMTA4LDEwMSwKKyAgICA3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LAorICAgIDc4LDk5LDMsMCwwLDAsMCwwLDAsMCwxNCwwLDAsMCwxNSwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMTAwLDEsMCwwLDEwMCwxLDEyNSwzLDEyNCwKKyAgICAxLDEwNiwwLDEwMCwyLDEzMSwxLDEwMCwzLDI1LDAsMTI1LDQsMTIxLDI0LDExNiwKKyAgICAxLDEyNCwwLDEwNiwyLDExMiwzNCwxMTYsMywxMDYsNCwxMzEsMCwxMzEsMSwxMDYsCisgICAgNSwxMjUsNSw4NywwLDExMCwyNCw0LDAsMTE2LDYsMTA3LDEwLDExNCw2NiwxLAorICAgIDAsMSwwLDEsMCwxMDAsMTAsMTI1LDUsODksMCwxMTAsMiw4OCwwLDEyNCwKKyAgICA1LDEyNCwwLDEwNiw3LDEwNywzLDExNCw5MiwxMjQsMCwxMDYsOCwxMzEsMCwxLAorICAgIDAsMTI0LDUsMTI0LDAsOTUsNywxMTYsOSwxMzEsMCwxMTQsMTE0LDEyNCwwLDEwNiwKKyAgICAxMCwxMjUsNiwxMjQsNCwxMDYsMTEsMTMxLDAsMTI1LDcsMTEwLDEwLDEyNCwwLDEwNiwKKyAgICAxMiwxMjUsNiwxMjQsNCwxMjUsNywxMjQsNywxMjQsNiwxMDcsNiwxMTQsMjE4LDExNiwKKyAgICAxMywxMjQsMCwxMDYsMiwxMjQsNCwxMzEsMiwxMjUsOCwxMjAsNzIsMTI0LDAsMTA2LAorICAgIDE0LDY4LDAsOTMsNTQsOTIsMiwxMjUsOSwxMjUsMTAsMTAwLDUsMTI0LDksMjMsCisgICAgMCwxMjUsMTEsMTE2LDEzLDEyNCw4LDEyNCwxMSwxMzEsMiwxMjUsMTIsMTE2LDE1LDEyNCwKKyAgICAxMiwxMzEsMSwxMTQsMTUyLDEyNCwwLDEwNiwxNiwxMjQsMTAsMTI0LDEsMTI0LDEyLDEyNCwKKyAgICA4LDEwMywxLDEyNCwyLDEzMSw1LDgzLDAsMTEzLDE1Miw4NywwLDExNiwxNywxMjQsCisgICAgOCwxMzEsMSwxMjUsMywxMjAsOTAsMTI0LDAsMTA2LDE0LDY4LDAsOTMsODAsOTIsCisgICAgMiwxMjUsOSwxMjUsMTAsMTE2LDEzLDEyNCwwLDEwNiwyLDEyNCw0LDEyNCw5LDIzLAorICAgIDAsMTMxLDIsMTI1LDEyLDExNiwxOCwxMDYsMTksMTAwLDYsMTI0LDEyLDEwMCw3LDEwMCwKKyAgICAzLDE0NCwxLDEzMSwyLDEsMCwxMjQsNywxMjQsOSwyMywwLDEyNCw2LDEwNywKKyAgICA2LDExNCwyMjYsMTE2LDE1LDEyNCwxMiwxMzEsMSwxMTQsMjI2LDEyNCwwLDEwNiwxNiwxMjQsCisgICAgMTAsMTI0LDEsMTI0LDEyLDEwMCw4LDEyNCwyLDEzMSw1LDgzLDAsMTEzLDIyNiw4NywKKyAgICAwLDEyNCwzLDE0NCwxLDExNCw5NiwxMTYsMTgsMTA2LDE5LDEwMCw5LDEyNCw4LDEzMSwKKyAgICAyLDEsMCwxMTYsMTgsMTA2LDIwLDEyNCwxLDEwMCw4LDEzMSwyLDEyNSwxMywxMjQsCisgICAgOCwxMDMsMSwxMjQsMTMsOTUsMjEsMTI0LDEzLDgzLDAsMTAwLDgsODMsMCw0MSwKKyAgICAxMSwxMjIsMTAyLDg0LDExNCwxMjEsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsCisgICAgMzIsMTE1LDExMiwxMDEsOTksMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwKKyAgICAxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwKKyAgICAzMiw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwxMDksOTcsMTE2LDk5LDEwNCwxMDUsMTEwLDEwMywzMiwxMTUsMTEyLAorICAgIDEwMSw5OSw0NCwzMiwxMTEsMTE0LDMyLDc4LDExMSwxMTAsMTAxLDMyLDEwNSwxMDIsMzIsMTEwLAorICAgIDExMSwxMTYsMzIsMTAyLDExMSwxMTcsMTEwLDEwMCw0Niw3MCwxMTQsNTksMCwwLDAsMTE0LAorICAgIDU3LDAsMCwwLDExNCwyOSwwLDAsMCwxMTQsMTgwLDAsMCwwLDEyMiw5LAorICAgIDExNiwxMTQsMTIxLDEwNSwxMTAsMTAzLDMyLDEyMywxMjUsOTAsOSwxMTgsMTAxLDExNCw5OCwxMTEsCisgICAgMTE1LDEwNSwxMTYsMTIxLDc4LDEyMiwyNSwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsMzIsCisgICAgMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTAyLDExMSwxMTQsMzIsMTIzLDEyNSwKKyAgICAxMTQsODgsMCwwLDAsNDEsMjIsMTE0LDMyLDAsMCwwLDExNCwzOSwwLDAsCisgICAgMCwxMTQsMzUsMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDQ1LDAsMCwwLAorICAgIDExNCwyMTQsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw1LDEsMCwwLDIxOCwKKyAgICAxMSw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSwxMTQsNiwwLDAsCisgICAgMCwxMTQsOCwxLDAsMCwxMTQsODksMCwwLDAsMTE0LDcsMSwwLDAsCisgICAgMTE0LDI4LDAsMCwwLDExNCw0LDEsMCwwLDExNCw0NCwwLDAsMCwxMTQsCisgICAgMiwxLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTMwLAorICAgIDAsMCwwLDExNCwxNTUsMCwwLDAsMTE0LDE1MSwwLDAsMCw0MSwxNCwxMTQsCisgICAgMTAxLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE3NSwwLDAsMCw5MCwxMiwKKyAgICAxMDUsMTE1LDk1LDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDkwLDExLDExNiw5NywKKyAgICAxMDUsMTA4LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMjcsMCwwLDAsOTAsNSwKKyAgICA5OSw5Nyw5OSwxMDQsMTAxLDkwLDEyLDk5LDk3LDk5LDEwNCwxMDEsOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTAsOSw5OCw5NywxMTUsMTAxLDk1LDExMiw5NywxMTYsMTA0LDExNCwyMjAsCisgICAgMCwwLDAsMTE0LDE2MCwwLDAsMCw5MCwxMywxMDUsMTEwLDEwNSwxMTYsOTUsMTAyLAorICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDkwLDksMTAyLDExNywxMDgsMTA4LDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDExNCwxNTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDUsMCwwLDAsMTE0LDE3NiwwLDAsMCwxOTMsNCwwLDAsMTE1LAorICAgIDcwLDAsMCwwLDAsMyw0LDEsMTQsMSwyLDEsMjQsMSwxNCwxLAorICAgIDEwLDEsMTAsMSw4LDEsNiwyLDYsMSw2LDEsMTAsMiw2LDEsCisgICAgNCwyLDgsMSwxMiwxLDE2LDEsOCwxLDEwLDEsOCwxLDI0LDQsCisgICAgOCwyLDE2LDEsMTYsMSwxOCwxLDEyLDEsOCwxLDEwLDEsMTIsMSwKKyAgICA2LDEsMTIsMSwxMiwxLDgsMSw0LDEsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLAorICAgIDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCw5LDAsMCwwLDEzLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxOTQsMCwwLDAsMTI0LDAsMTA2LDAsMTI1LDEsCisgICAgMTIxLDIyLDExNiwxLDEwNiwyLDEyNCwxLDExMiwyMiwxMTYsMSwxMDYsMywxMzEsMCwKKyAgICAxMzEsMSwxMjUsMiw4NywwLDExMCwzMCw0LDAsMTE2LDQsMTE2LDUsMTE2LDYsCisgICAgMTAyLDMsMTA3LDEwLDExNCw1OCwxLDAsMSwwLDEsMCwxMDMsMCwxMjUsMiwKKyAgICA4OSwwLDExMCwyLDg4LDAsMTE2LDcsMTA2LDgsMTA2LDksMTAwLDEsMTMxLDEsCisgICAgMTE1LDg0LDExNiwxMCwxMjQsMiwxMzEsMSwxMjQsMCw5NSwxMSwxMTAsNzgsMTE2LDEwLAorICAgIDEzMSwwLDEyNSwzLDEyMCw2NCwxMjQsMiw2OCwwLDkzLDU2LDEyNSw0LDEyNCw0LAorICAgIDEwNiwxMiwxMDAsMiwxMzEsMSw5MiwzLDEyNSw1LDEyNSw2LDEyNSw3LDEyNCw2LAorICAgIDExNCwxMzgsMTAwLDMsMTA2LDEzLDEyNCw1LDEyNCw3LDEwNiwxNCwxMzEsMCwxMzEsMiwKKyAgICAxMjUsOCwxMTAsNCwxMjQsNSwxMjUsOCwxMjQsMywxMDYsMTUsMTI0LDgsMTMxLDEsCisgICAgMSwwLDExMyw5Niw4NywwLDEyNCwzLDEyNCwwLDk1LDExLDExNiw3LDEwNiw4LAorICAgIDEwNiw5LDExNiwxNiwxMzEsMSwxMTQsMTkwLDEwMCw0LDEwMCw1LDEzMiwwLDEyNCwyLAorICAgIDY4LDAsMTMxLDEsMTI0LDAsOTUsMTcsMTAwLDYsODMsMCw0MSw3LDEyMiw2OCwKKyAgICA3MCwxMDUsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDExMSwKKyAgICAxMDIsMzIsMTEyLDExMSwxMTYsMTAxLDExMCwxMTYsMTA1LDk3LDEwOCwzMiwxMDksMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSwxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LAorICAgIDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LAorICAgIDExMSwxMTQsMTIxLDQ2LDExNCwwLDAsMCwwLDExNCw1OSwwLDAsMCwxMjIsNSwKKyAgICAxMjMsMTI1LDQ2LDEyMywxMjUsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsMywwLDAsMCw4MywwLDAsMCwxMTUsMjAsMCwwLDAsMTA0LAorICAgIDAsMTI0LDAsOTMsMTIsMTI1LDEsMTI0LDEsMTA2LDAsMTMxLDAsMTQ2LDIsMTEzLAorICAgIDQsODMsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCw4OSwwLDAsMCw0MSwKKyAgICAyLDExNCwyMiwwLDAsMCw5MCwyLDEwMiwxMTAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMjUwLDksNjAsMTE1LDEwMSwxMTYsOTksCisgICAgMTExLDEwOSwxMTIsNjIsMTIsNSwwLDAsMTE1LDIsMCwwLDAsNiwwLDEyMiwKKyAgICA0MSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMiwxMDUsMTA4LAorICAgIDEwOCw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2MiwKKyAgICA0Niw2MCwxMTUsMTAxLDExNiw5OSwxMTEsMTA5LDExMiw2Miw3OCw0MSwxOCwxMTQsMzUsMCwKKyAgICAwLDAsMTE0LDMsMCwwLDAsOTAsNywxMDgsMTA1LDExNSwxMTYsMTAwLDEwNSwxMTQsCisgICAgMTE0LDQ1LDAsMCwwLDExNCwyNTMsMCwwLDAsMjE4LDE1LDgwLDEwMSwxMTQsMTA5LAorICAgIDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwyMTgsMTgsNzgsMTExLDExNiwKKyAgICA2NSw2OCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCwKKyAgICA3LDAsMCwwLDExNCw4LDAsMCwwLDExNCw5LDAsMCwwLDExNCw2LAorICAgIDEsMCwwLDExNCw3LDEsMCwwLDExNCw4NCwwLDAsMCwxMTQsNDgsMCwKKyAgICAwLDAsMTE0LDg5LDAsMCwwLDIxOCwzLDk3LDEwMCwxMDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCw4LDEsMCwwLDQxLDksMTE0LDEwMSwwLDAsMCwxMTQsMzUsMCwKKyAgICAwLDAsOTAsOCw5OSwxMTEsMTEwLDExNiwxMDEsMTEwLDExNiwxMTUsOTAsMjEsMTA4LDExMSwKKyAgICAxMTksMTAxLDExNCw5NSwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCw5NSw5OSwxMTEsMTEwLDExNiwxMDEsCisgICAgMTEwLDExNiwxMTUsMTE0LDI0MiwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDIzMiwwLAorICAgIDAsMCwxMTQsMjIwLDAsMCwwLDkwLDgsMTEwLDEwMSwxMTksOTUsMTEwLDk3LDEwOSwKKyAgICAxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDUsMCwwLDAsCisgICAgMTE0LDEwLDEsMCwwLDIzOSw0LDAsMCwxMTUsMzQsMCwwLDAsMCwyLAorICAgIDYsMSwyLDEsMjIsMSwyMCwzLDEwLDMsMTIsMSwxMiw3LDYsMSwKKyAgICAxMCwxLDE2LDEsNCwxLDE4LDIsNCwxLDE0LDEsNiwxLDEyLDEsCisgICAgMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwKKyAgICAxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDMsMCwwLDAsMywwLDAsMCw3LDAsMCwwLDExNSwxOCwwLAorICAgIDAsMCwxMzUsMCwxMzUsMSwxMDIsMiwxMDAsMSwxMDAsMiwxMzIsOCwxMjUsMiwKKyAgICAxMjQsMiw4MywwLDQxLDMsOTcsMjAsMSwwLDAsNjUsMzIsOTksMTA4LDk3LAorICAgIDExNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLAorICAgIDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiw5OSwxMDgsMTExLDExNSwxMTcsMTE0LAorICAgIDEwMSwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksMTA1LDEwOCwxMDgsMzIsMTE0LDEwMSwxMTYsCisgICAgMTE3LDExNCwxMTAsMzIsOTcsMTEwLDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDMyLAorICAgIDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwKKyAgICAxMDUsMTAxLDEwMCwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwzMiw5NywxMTAsMTAwLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LAorICAgIDEwOCwxMTEsMTE1LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMDgsCisgICAgMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwxMDgsMTExLDExNSwxMTcsCisgICAgMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMCwxMDUsMTE0LDEwMSwKKyAgICA5OSwxMTYsMTExLDExNCwxMjEsNDQsMzIsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LAorICAgIDExMSwxMTQsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsOTcsCisgICAgMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk5LAorICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDQsMCwwLDAsCisgICAgMTksMCwwLDAsMTE1LDMyLDAsMCwwLDExNiwwLDEyNCwwLDEzMSwxLDExNSwKKyAgICAyMiwxMTYsMSwxMDAsMSwxMDAsMiwxMjQsMCwxNDQsMSwxMzEsMSwxMzAsMSwxMzYsCisgICAgMCwxMjQsMCwxMzYsMSwxNDAsMSw4MywwLDQxLDMsMTIyLDQ1LDgwLDk3LDExNiwKKyAgICAxMDQsMzIsMTA0LDExMSwxMTEsMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDEwOCwxMDUsOTgsNDYsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDQ2LDcwLAorICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTIyLDMwLDExMSwxMTAsMTA4LDEyMSwKKyAgICAzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTA1LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwKKyAgICAzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwxMTQsMzUsMCwwLDAsNDEsCisgICAgMiwxMTQsNDYsMCwwLDAsMTE0LDEwMCwwLDAsMCw0MSwxLDExNCwzNSwwLAorICAgIDAsMCw0MSwyLDExNCwxNjUsMCwwLDAsMTE0LDksMSwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDUsMCwwLDAsMjE4LDI0LDExMiw5NywxMTYsMTA0LDk1LDEwNCwKKyAgICAxMTEsMTExLDEwNyw5NSwxMDIsMTExLDExNCw5NSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwKKyAgICAxMDEsMTE0LDI0LDUsMCwwLDExNSw2LDAsMCwwLDAsMiw4LDEsMTQsCisgICAgMSwxMjIsNTQsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAorICAgIDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5NSwxMDIsMTExLDExNCw5NSw3MCwKKyAgICAxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDQxLDMsCisgICAgMTE0LDE2NSwwLDAsMCwxMTQsOSwxLDAsMCwxMTQsMTUsMSwwLDAsMTE0LAorICAgIDQsMCwwLDAsNDEsMiwxMTQsMTY1LDAsMCwwLDExNCw5LDEsMCwwLAorICAgIDExNCw1LDAsMCwwLDIxOCw5LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywKKyAgICAxNCw1LDAsMCwxMTUsNCwwLDAsMCwwLDEwLDE0LDYsMTIyLDIwLDcwLAorICAgIDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LAorICAgIDExMSwxMTEsMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDEwMCwxLDEwNiwKKyAgICAwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsNDEsMiw3OCwxMjIsMTYsNzAsMTA1LAorICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLAorICAgIDExNCw0OCwwLDAsMCwxMTQsMzUsMCwwLDAsNDEsMSwxMTQsMTAxLDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwwLAorICAgIDExNCwyNDEsMCwwLDAsMzIsNSwwLDAsMTE1LDIsMCwwLDAsMCwxLAorICAgIDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDExNCwKKyAgICAxMDEsMTEyLDExNCw5NSw5NSw0MSwxLDc4LDQxLDE1LDExNCwxMDYsMCwwLDAsMTE0LAorICAgIDEwNSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDgsMCwwLDAsMTE0LDE4MCwKKyAgICAwLDAsMCwxMTQsMjQ3LDAsMCwwLDExNCwxMjQsMCwwLDAsMTE0LDE3NywwLAorICAgIDAsMCwxMTQsMTE4LDAsMCwwLDExNCwyLDEsMCwwLDExNCwxNzYsMCwwLAorICAgIDAsMTE0LDEwLDEsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDE2LDEsMCwwLAorICAgIDExNCwyNDEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDUsMCwwLDAsMTE0LDMsMSwwLDAsMTQ3LDQsCisgICAgMCwwLDExNSwyMCwwLDAsMCw4LDcsNCwyLDgsMTQsOCw0LDQsCisgICAgMiw4LDEyLDgsNSwxMCw0Niw4LDMxLDEyLDE4LDExNCwzLDEsMCwwLAorICAgIDk5LDQsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLDExLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxNDgsMCwwLDAsMTI0LDAsMTA2LDAsMTAwLDEsCisgICAgMTMxLDEsMTI1LDQsMTI0LDAsMTA2LDAsMTAwLDIsMTMxLDEsMTI1LDUsMTI0LDQsCisgICAgMTE1LDY2LDEyNCw1LDExNCwzNiwxMjQsNSwxMDYsMSwxMjUsNCwxMTAsMzAsMTI0LDIsCisgICAgMTI0LDMsMTA3LDIsMTE0LDU2LDExNiwyLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSw0LAorICAgIDExMCwxMCwxMTYsMywxMjQsMSwxMjQsMiwxMzEsMiwxMjUsNCwxMjQsNSwxMTUsODYsCisgICAgMTE2LDQsMTI0LDEsMTI0LDIsMTAwLDMsMTI0LDQsMTQ0LDEsMTMxLDIsMTI1LDUsCisgICAgMTIxLDM2LDEyNCw1LDEyNCwwLDEwMCwyLDYwLDAsMTI0LDQsMTI0LDAsMTAwLDEsCisgICAgNjAsMCwxMjQsMiwxMjQsMCwxMDAsNCw2MCwwLDEyNCwzLDEyNCwwLDEwMCw1LAorICAgIDYwLDAsODcsMCwxMTAsMjAsNCwwLDExNiw1LDEwNywxMCwxMTQsMTQyLDEsMCwKKyAgICAxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMDAsMCw4MywwLDQxLDYsCisgICAgNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTUsMjE4LDgsOTUsCisgICAgOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMTE0LDEyMSwwLDAsMCw5MCw4LDk1LDk1LAorICAgIDEwMiwxMDUsMTA4LDEwMSw5NSw5NSw5MCwxMCw5NSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwKKyAgICA5NSw5NSw0MSw2LDIxOCwzLDEwMywxMDEsMTE2LDExNCwxMjEsMCwwLDAsMTE0LDIxOCwKKyAgICAwLDAsMCwxMTQsMjEzLDAsMCwwLDExNCwxNjIsMCwwLDAsMjE4LDksNjksCisgICAgMTIwLDk5LDEwMSwxMTIsMTE2LDEwNSwxMTEsMTEwLDQxLDYsOTAsMiwxMTAsMTE1LDExNCw5OSwKKyAgICAwLDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDExMCw5NywxMDksMTAxLDkwLDksOTksCisgICAgMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwxMDEsMTE0LDEyMSwwLDAsMCwxMTQsMTU5LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDIxOCwxNCw5NSwxMDIsMTA1LDEyMCw5NSwxMTcsMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDM4LDUsMCwwLDExNSwzNCwwLDAsMCwwLDIsMTAsMSwxMCwxLAorICAgIDQsMSw0LDEsOCwxLDgsMSwxMiwyLDEwLDEsNCwxLDE2LDEsCisgICAgMiwxLDgsMSw4LDEsOCwxLDEyLDEsMTQsMiwxMTQsMjEsMSwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsMzgsMCwwLDAsMTE2LDAsMTE2LDEsMTA2LAorICAgIDIsMTMxLDAsMTAyLDIsMTI1LDAsMTE2LDMsMTE2LDQsMTAyLDIsMTI1LDEsMTE2LAorICAgIDUsMTE2LDYsMTAyLDIsMTI1LDIsMTI0LDAsMTI0LDEsMTI0LDIsMTAzLDMsODMsCisgICAgMCw0MSwxLDEyMiw5NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiwxMDgsCisgICAgMTA1LDExNSwxMTYsMzIsMTExLDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDUsOTgsOTcsMTE1LDEwMSwKKyAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjksOTcsOTksMTA0LDMyLDEwNSwxMTYsMTAxLDEwOSwKKyAgICAzMiwxMDUsMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsNDAsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0NCwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDQxLDQ2LDEwLAorICAgIDMyLDMyLDMyLDMyLDQxLDcsMTE0LDIxOSwwLDAsMCwxMTQsMTQwLDAsMCwwLAorICAgIDIxOCwxOCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw5NSwxMTUsMTE3LDEwMiwxMDIsCisgICAgMTA1LDEyMCwxMDEsMTE1LDExNCwyMTMsMCwwLDAsMTE0LDg1LDAsMCwwLDExNCwyMTgsCisgICAgMCwwLDAsMTE0LDc1LDAsMCwwLDQxLDMsOTAsMTAsMTAxLDEyMCwxMTYsMTAxLAorICAgIDExMCwxMTUsMTA1LDExMSwxMTAsMTE1LDkwLDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5MCw4LAorICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw1LDAsMCwwLDExNCwxNTYsMCwwLDAsNjEsNSwwLDAsCisgICAgMTE1LDgsMCwwLDAsMCw1LDEyLDEsOCwxLDgsMSwxMTQsMTU2LDAsCisgICAgMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxMiwwLDAsMCwxMiwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTg4LDEsMCwwLDEyNCwwLDk3LDAsCisgICAgMTE2LDAsMTA2LDEsOTcsMSwxMTYsMCwxMDYsMiw5NywyLDExNiwxLDEwNiwzLAorICAgIDExNiw0LDI1LDAsMTI1LDEsMTIwLDU2LDEwMCwyNiw2OCwwLDkzLDQ4LDEyNSwyLAorICAgIDEyNCwyLDExNiwxLDEwNiwzLDEwNyw3LDExNCw1OCwxMTYsMCwxMDYsNSwxMjQsMiwKKyAgICAxMzEsMSwxMjUsMywxMTAsMTAsMTE2LDEsMTA2LDMsMTI0LDIsMjUsMCwxMjUsMywKKyAgICAxMTYsNiwxMjQsMSwxMjQsMiwxMjQsMywxMzEsMywxLDAsMTEzLDMyLDg3LDAsCisgICAgMTAwLDUsMTAwLDYsMTAzLDEsMTAyLDIsMTAwLDcsMTAwLDgsMTAwLDYsMTAzLDIsCisgICAgMTAyLDIsMTAyLDIsMTI1LDQsMTIwLDExOCwxMjQsNCw2OCwwLDkzLDEwMiw5MiwyLAorICAgIDEyNSw1LDEyNSw2LDExNiw3LDEwMCw5LDEwMCwxMCwxMzIsMCwxMjQsNiw2OCwwLAorICAgIDEzMSwxLDEzMSwxLDExNSwxNDIsMTE2LDgsMTMwLDEsMTI0LDYsMTAwLDExLDI1LDAsCisgICAgMTI1LDcsMTI0LDUsMTE2LDEsMTA2LDMsMTA3LDYsMTE0LDE3NCwxMTYsMSwxMDYsMywKKyAgICAxMjQsNSwyNSwwLDEyNSw4LDgwLDAsMTEzLDExMiwxMjEsMTYsMTE2LDAsMTA2LDUsCisgICAgMTI0LDUsMTMxLDEsMTI1LDgsODAsMCw4NywwLDExMywxMTIsNCwwLDExNiw5LAorICAgIDEwNywxMCwxMTQsMjEyLDEsMCwxLDAsMSwwLDExOSwxMTIsODksMCwxMTMsMTEyLAorICAgIDg4LDAsMTEzLDExMiw4NywwLDExNiw5LDEwMCwxMiwxMzEsMSwxMzAsMSwxMTYsNiwKKyAgICAxMjQsMSwxMDAsMTMsMTI0LDgsMTMxLDMsMSwwLDExNiw2LDEyNCwxLDEwMCwxNCwKKyAgICAxMjQsNywxMzEsMywxLDAsMTE2LDYsMTI0LDEsMTAwLDE1LDEwMCwxNiwxMDYsMTAsCisgICAgMTI0LDYsMTMxLDEsMTMxLDMsMSwwLDEyMSwxNCwxMTYsMCwxMDYsNSwxMDAsMTcsCisgICAgMTMxLDEsMTI1LDksODcsMCwxMTAsMjYsNCwwLDExNiw5LDEwNywxMCwxNDQsMSwKKyAgICAxMTQsNTIsMSwwLDEsMCwxLDAsMTAwLDE4LDEyNSw5LDg5LDAsMTEwLDIsCisgICAgODgsMCwxMTYsNiwxMjQsMSwxMDAsMTcsMTI0LDksMTMxLDMsMSwwLDExNiwwLAorICAgIDEwNiw1LDEwMCwxOSwxMzEsMSwxMjUsMTAsMTE2LDYsMTI0LDEsMTAwLDE5LDEyNCwxMCwKKyAgICAxMzEsMywxLDAsMTI0LDUsMTAwLDcsMTA3LDIsMTQ0LDEsMTE0LDEyMCwxMTYsMCwKKyAgICAxMDYsNSwxMDAsMjAsMTMxLDEsMTI1LDExLDExNiw2LDEyNCwxLDEwMCwyMSwxMjQsMTEsCisgICAgMTMxLDMsMSwwLDExNiw2LDEyNCwxLDEwMCwyMiwxMTYsMTEsMTMxLDAsMTMxLDMsCisgICAgMSwwLDExNiwxMiwxMDYsMTMsMTE2LDIsMTA2LDE0LDEzMSwwLDEzMSwxLDEsMCwKKyAgICAxMjQsNSwxMDAsNywxMDcsMiwxNDQsMSwxMTQsMTg0LDExNiwxNSwxMDYsMTYsMTAwLDIzLAorICAgIDEzMSwxLDEsMCwxMDAsMjQsMTE2LDEyLDEwNyw2LDE0NCwxLDExNCwxODQsMTAwLDI1LAorICAgIDExNiwxNyw5NSwxOCwxMDAsMTgsODMsMCw0MSwyNywxMjIsMjA1LDgzLDEwMSwxMTYsMTE3LAorICAgIDExMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwKKyAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwxMCwzMiwzMiwzMiwKKyAgICAzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAxMTUsMzIsOTcsMTEwLDEwMCwzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTAsMTAzLDMyLAorICAgIDExNiwxMDQsMTAxLDEwOSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLDEwOCwKKyAgICAxMTEsOTgsOTcsMTA4LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwzMiw5OSwxMTEsMTA5LDExMiwxMTEsCisgICAgMTEwLDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDEwMSwxMjAsMTE2LDExNCw5Nyw5OSwKKyAgICAxMTYsMTAxLDEwMCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDExNCwKKyAgICAxMDEsMzIsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCw1MCwwLDAsMCwxMTQsNjEsCisgICAgMCwwLDAsMjE4LDgsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LDExNCwxMzcsMCwKKyAgICAwLDAsOTAsNSwxMTIsMTExLDExNSwxMDUsMTIwLDI1MCwxLDQ3LDIxOCwyLDExMCwxMTYsCisgICAgMjUwLDEsOTIsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgMywwLDAsMCwxMTUsMCwwLDAsMTE1LDI2LDAsMCwwLDEyNCwwLDkzLAorICAgIDE4LDEyNSwxLDExNiwwLDEyNCwxLDEzMSwxLDEwMCwwLDEwNywyLDg2LDAsMSwKKyAgICAwLDExMywyLDEwMCwxLDgzLDAsNDEsMiwxMTQsMjksMCwwLDAsNzgsNDEsCisgICAgMSwxMTQsMzEsMCwwLDAsNDEsMiwxMTQsMjIsMCwwLDAsMTE0LDc4LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw1LDAsMCwKKyAgICAwLDExNCwyMjIsMCwwLDAsOTcsNSwwLDAsMTE1LDIsMCwwLDAsNCwKKyAgICAwLDEyMiwyNSw5NSwxMTUsMTAxLDExNiwxMTcsMTEyLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LAorICAgIDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDYwLDAsMCwKKyAgICAwLDEyMiwzMCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDExNCwxMDEsMTEzLAorICAgIDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTEyLDExMSwxMTUsMTA1LDEyMCwzMiwxMTEsMTE0LDMyLDExMCwKKyAgICAxMTYsMTE0LDMsMCwwLDAsMTE0LDI1LDAsMCwwLDExNCwyMSwwLDAsMCwKKyAgICAxMTQsMzAsMCwwLDAsOTAsNyw5NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDc4LDkwLAorICAgIDgsOTUsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTAsNiwxMTksMTA1LDExMCwxMTQsMTAxLAorICAgIDEwMywxMTQsMTY0LDAsMCwwLDExNCw2LDAsMCwwLDEyMiw0LDQ2LDExMiwxMjEsCisgICAgMTE5LDEyMiw2LDk1LDEwMCw0NiwxMTIsMTIxLDEwMCw4NCw0MSw0LDEyMiwzLDk1LDEwNSwKKyAgICAxMTEsMTIyLDksOTUsMTE5LDk3LDExNCwxMTAsMTA1LDExMCwxMDMsMTE1LDEyMiw4LDk4LDExNywKKyAgICAxMDUsMTA4LDExNiwxMDUsMTEwLDExNSwxMjIsNywxMDksOTcsMTE0LDExNSwxMDQsOTcsMTA4LDQxLAorICAgIDE5LDExNCwxMTUsMCwwLDAsMTE0LDcsMCwwLDAsMTE0LDE0MCwwLDAsMCwKKyAgICAxMTQsMjM0LDAsMCwwLDExNCwxMDYsMCwwLDAsOTAsMTgsOTUsOTgsMTE3LDEwNSwKKyAgICAxMDgsMTE2LDEwNSwxMTAsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExMCw5NywxMDksMTAxLDExNCwxMTAsCisgICAgMCwwLDAsMjE4LDMsOTcsMTA4LDEwOCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwKKyAgICAxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDEwMCwwLDAsMCwxMTQsMjYsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwyMjQsMCwwLDAsMTE0LDE0NCwwLDAsCisgICAgMCwxMTQsMjIsMSwwLDAsMTE0LDg1LDAsMCwwLDExNCwxNTgsMCwwLDAsCisgICAgMTE0LDE2MywwLDAsMCwxMTQsMTY4LDAsMCwwLDQxLDEyLDIxOCwxNyw5NSw5OCwKKyAgICAxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsCisgICAgMTEsMTE1LDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEyLDk4LDExNywKKyAgICAxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LDExNywxMDUsMTA4LAorICAgIDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEwLDExMSwxMTUsOTUsMTAwLAorICAgIDEwMSwxMTYsOTcsMTA1LDEwOCwxMTUsOTAsMTAsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsCisgICAgMTExLDExNSwxMTQsMjEsMCwwLDAsMTE0LDI1LDAsMCwwLDkwLDksMTExLDExNSwKKyAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDk1LAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDIxOCw2LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNzIsNSwwLDAsCisgICAgMTE1LDgyLDAsMCwwLDAsOCw0LDEsNiwxLDYsMywxMCwxLDEwLAorICAgIDEsMTAsMSwxMiwyLDEwLDEsMTYsMywyMiwxLDE0LDIsMjIsMSw4LAorICAgIDEsMTAsMSwxMCwxLDQsMiwyLDEsMTAsMSw2LDEsMTQsMSwxMiwKKyAgICAyLDgsMSwxMiwxLDEyLDEsMTgsMywyLDEsMTQsMSwxNiwyLDEwLAorICAgIDEsMTIsMywxMCwxLDEyLDMsMTAsMSwxMCwxLDEyLDMsMTQsMSwxNCwKKyAgICAxLDEwLDEsMTAsMSwxMCwxLDExNCwzMCwxLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw4NCwwLDAsMCwxMTYsMCwxMjQsMCwxMzEsMSwxLDAsMTE2LDEsCisgICAgMTMxLDAsMTI1LDEsMTE2LDIsMTA2LDMsMTA2LDQsMTE2LDUsMTA2LDYsMTI0LDEsCisgICAgMTQwLDAsMTAzLDEsMTMxLDEsMSwwLDExNiw3LDEwNiw4LDEwMCwxLDEwNywyLAorICAgIDExNCw1NiwxMTYsMiwxMDYsOSwxMDYsMTAsMTE2LDExLDEzMSwxLDEsMCwxMTYsMiwKKyAgICAxMDYsOSwxMDYsMTAsMTE2LDEyLDEzMSwxLDEsMCwxMTYsNSwxMjQsMCw5NSw1LAorICAgIDExNiwxMywxMjQsMCw5NSwxMywxMDAsMiw4MywwLDQxLDMsMTIyLDQxLDczLDExMCwKKyAgICAxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsCisgICAgOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTksMTExLDEwOSwxMTIsCisgICAgMTExLDExMCwxMDEsMTEwLDExNiwxMTUsNDYsMTE0LDI1LDEsMCwwLDc4LDQxLDE0LDExNCwKKyAgICAzMCwxLDAsMCwxMTQsMTU2LDAsMCwwLDExNCw3LDAsMCwwLDExNCwyNTEsCisgICAgMCwwLDAsMTE0LDE0NCwwLDAsMCwxMTQsMywxLDAsMCwxMTQsMTYsMSwKKyAgICAwLDAsMTE0LDMsMCwwLDAsMTE0LDEwNiwwLDAsMCwyMTgsOSwxMDksMTAxLAorICAgIDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTU4LDAsMCwwLDExNCwxNjMsMCwwLAorICAgIDAsMTE0LDI0NiwwLDAsMCwxMTQsMjEzLDAsMCwwLDQxLDIsMTE0LDI5LDEsCisgICAgMCwwLDkwLDE3LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwOCwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDE0MCw1LAorICAgIDAsMCwxMTUsMTYsMCwwLDAsMCwyLDgsMSw2LDEsMjAsMSwxMCwKKyAgICAxLDEyLDEsMTIsNCw2LDEsMTE0LDMyLDEsMCwwLDQxLDMsMTIyLDMsCisgICAgMTE5LDEwNSwxMTAsMTE0LDEsMCwwLDAsMTE0LDIsMCwwLDAsNDEsMSwxMTQsCisgICAgNDcsMCwwLDAsNDEsMSw3OCw0MSwzLDc4LDc4LDc4LDQxLDMsNzgsNzgsCisgICAgNzgsNDEsMiwxMTQsNjAsMCwwLDAsMTE0LDYwLDAsMCwwLDQxLDEsNzgsCisgICAgNDEsMSw3OCw0MSw1NiwxMTQsMTA4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwxOSwwLDAsMCwxMTQsMjgsCisgICAgMCwwLDAsMTE0LDM4LDAsMCwwLDExNCwzOSwwLDAsMCwxMTQsNDMsMCwKKyAgICAwLDAsMTE0LDQ0LDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsNTYsMCwwLAorICAgIDAsMjE4LDQsMTE2LDEyMSwxMTIsMTAxLDIxOCw4LDk1LDk1LDk5LDExMSwxMDAsMTAxLDk1LAorICAgIDk1LDExNCwxMzksMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMjksMCwwLDAsCisgICAgMTE0LDE0LDAsMCwwLDExNCwxOCwwLDAsMCw5MCwxNyw5NSw4Miw2NSw4NywKKyAgICA5NSw3Nyw2NSw3MSw3Myw2Nyw5NSw3OCw4NSw3Nyw2Niw2OSw4MiwxMTQsNzQsMCwKKyAgICAwLDAsMTE0LDczLDAsMCwwLDExNCw4NSwwLDAsMCwxMTQsNzUsMCwwLAorICAgIDAsOTAsMjMsNjgsNjksNjYsODUsNzEsOTUsNjYsODksODQsNjksNjcsNzksNjgsCisgICAgNjksOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsOTAsMjcsNzksODAsODQsNzMsCisgICAgNzcsNzMsOTAsNjksNjgsOTUsNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsCisgICAgODUsNzAsNzAsNzMsODgsNjksODMsMTE0LDgwLDAsMCwwLDExNCw4NiwwLDAsCisgICAgMCwxMTQsOTIsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCw5OCwwLDAsMCwKKyAgICAxMTQsMTE3LDAsMCwwLDExNCwxMjQsMCwwLDAsMTE0LDEzNiwwLDAsMCwxMTQsCisgICAgMTQyLDAsMCwwLDExNCwxNDUsMCwwLDAsMTE0LDE1MCwwLDAsMCwyMTgsNiwKKyAgICAxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMTE0LDE1NywwLDAsMCwxMTQsMTYyLDAsMCwwLAorICAgIDExNCwxNjMsMCwwLDAsMTE0LDE3OSwwLDAsMCwxMTQsMTg5LDAsMCwwLDExNCwKKyAgICAyMDUsMCwwLDAsMTE0LDIxMywwLDAsMCwxMTQsMjE4LDAsMCwwLDExNCwyMjQsCisgICAgMCwwLDAsMTE0LDIxOSwwLDAsMCwxMTQsMjI1LDAsMCwwLDExNCwyNDQsMCwKKyAgICAwLDAsMTE0LDI0NiwwLDAsMCwxMTQsMywxLDAsMCwxMTQsMjEsMSwwLAorICAgIDAsMTE0LDE1NiwwLDAsMCwxMTQsMzAsMSwwLDAsMTE0LDMyLDEsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA1LDAsMCwwLDIxOCw4LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDYyLDgsMCwKKyAgICAwLDAsMTE1LDEwMiwwLDAsMCw0LDE3LDQsMyw4LDEyLDgsNSw4LAorICAgIDUsOCw2LDgsMTIsOCwxMCw4LDksOCw1LDgsNywxMCwyMiwxMCwKKyAgICAxMTYsMTYsMSwxMiwyLDQsMSw0LDIsNiwyLDYsMiw4LDIsMTYsCisgICAgNDQsOCwzMyw4LDE5LDgsMTIsOCwxMiw4LDI4LDgsMTcsMTAsNTUsMTAsCisgICAgMTIsMTAsMTAsOCwxNCw2LDMsNCwxLDE0LDY1LDE0LDY0LDE0LDI5LDE2LAorICAgIDExMCwxNCw0MSwxOCw0NSwxOCwxNiw0LDMsMTgsNTMsMTQsNjAsMTQsNDIsMTQsCisgICAgMTI3LDAsNywxNCwxMjcsMCwyMCwxMCwyMyw4LDExLDgsNjgsCiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5IGIvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5CmluZGV4IGQ5YTA4NTUuLjAyM2M5ZTYgMTAwNzU1Ci0tLSBhL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weQorKysgYi9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkKQEAgLTMsMjQgKzMsMzQgQEAKIChmb3IgY29tcGlsZXJzIHN1cHBvcnRpbmcgY29tcHV0ZWQgZ290b3Mgb3IgImxhYmVscy1hcy12YWx1ZXMiLCBzdWNoIGFzIGdjYykuCiAiIiIKIAotIyBUaGlzIGNvZGUgc2hvdWxkIHN0YXkgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGF0IGxlYXN0IHdoaWxlCi0jIHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBoYXZlIFB5dGhvbiAyLjMgYXMgdGhlaXIgc3lzdGVtIFB5dGhvbi4KLQotaW1wb3J0IGltcAogaW1wb3J0IG9zCitpbXBvcnQgc3lzCiAKIAotZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgotICAgICIiIkZpbmRzIGFuZCByZXR1cm5zIGEgbW9kdWxlIGluIHRoZSBsb2NhbCBkaXN0L2NoZWNrb3V0LgotICAgICIiIgotICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgIkxpYiIpCi0gICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShtb2RuYW1lLCAqaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUsIFttb2RwYXRoXSkpCit0cnk6CisgICAgZnJvbSBpbXBvcnRsaWIubWFjaGluZXJ5IGltcG9ydCBTb3VyY2VGaWxlTG9hZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGltcAorCisgICAgZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgorICAgICAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KKyAgICAgICAgIiIiCisgICAgICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiKQorICAgICAgICByZXR1cm4gaW1wLmxvYWRfbW9kdWxlKG1vZG5hbWUsICppbXAuZmluZF9tb2R1bGUobW9kbmFtZSwgW21vZHBhdGhdKSkKK2Vsc2U6CisgICAgZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgorICAgICAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KKyAgICAgICAgIiIiCisgICAgICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiLCBtb2RuYW1lICsgIi5weSIpCisgICAgICAgIHJldHVybiBTb3VyY2VGaWxlTG9hZGVyKG1vZG5hbWUsIG1vZHBhdGgpLmxvYWRfbW9kdWxlKCkKKwogCiBkZWYgd3JpdGVfY29udGVudHMoZik6CiAgICAgIiIiV3JpdGUgQyBjb2RlIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgZmlsZSBvYmplY3QuCiAgICAgIiIiCi0gICAgb3Bjb2RlID0gZmluZF9tb2R1bGUoIm9wY29kZSIpCisgICAgb3Bjb2RlID0gZmluZF9tb2R1bGUoJ29wY29kZScpCiAgICAgdGFyZ2V0cyA9IFsnX3Vua25vd25fb3Bjb2RlJ10gKiAyNTYKICAgICBmb3Igb3BuYW1lLCBvcCBpbiBvcGNvZGUub3BtYXAuaXRlbXMoKToKICAgICAgICAgdGFyZ2V0c1tvcF0gPSAiVEFSR0VUXyVzIiAlIG9wbmFtZQpAQCAtMjksMTUgKzM5LDE3IEBACiAgICAgZi53cml0ZSgiXG59O1xuIikKIAogCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCBzeXMKLSAgICBhc3NlcnQgbGVuKHN5cy5hcmd2KSA8IDMsICJUb28gbWFueSBhcmd1bWVudHMiCitkZWYgbWFpbigpOgorICAgIGlmIGxlbihzeXMuYXJndikgPj0gMzoKKyAgICAgICAgc3lzLmV4aXQoIlRvbyBtYW55IGFyZ3VtZW50cyIpCiAgICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAyOgogICAgICAgICB0YXJnZXQgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIHRhcmdldCA9ICJQeXRob24vb3Bjb2RlX3RhcmdldHMuaCIKLSAgICBmID0gb3Blbih0YXJnZXQsICJ3IikKLSAgICB0cnk6CisgICAgd2l0aCBvcGVuKHRhcmdldCwgInciKSBhcyBmOgogICAgICAgICB3cml0ZV9jb250ZW50cyhmKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGYuY2xvc2UoKQorICAgIHByaW50KCJKdW1wIHRhYmxlIHdyaXR0ZW4gaW50byAlcyIgJSB0YXJnZXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYXJzaGFsLmMgYi9QeXRob24vbWFyc2hhbC5jCmluZGV4IDViOGRlOTkuLjYyN2E4NDIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tYXJzaGFsLmMKKysrIGIvUHl0aG9uL21hcnNoYWwuYwpAQCAtMjYzLDEwICsyNjMsMTAgQEAKICAgICBpZiAoUHlfUkVGQ05UKHYpID09IDEpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShwLT5oYXNodGFibGUsIHYpOworICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkocC0+aGFzaHRhYmxlLCB2KTsKICAgICBpZiAoZW50cnkgIT0gTlVMTCkgewogICAgICAgICAvKiB3cml0ZSB0aGUgcmVmZXJlbmNlIGluZGV4IHRvIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEocC0+aGFzaHRhYmxlLCAmdywgc2l6ZW9mKHcpLCBlbnRyeSk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHAtPmhhc2h0YWJsZSwgZW50cnksIHcpOwogICAgICAgICAvKiB3ZSBkb24ndCBzdG9yZSAibG9uZyIgaW5kaWNlcyBpbiB0aGUgZGljdCAqLwogICAgICAgICBhc3NlcnQoMCA8PSB3ICYmIHcgPD0gMHg3ZmZmZmZmZik7CiAgICAgICAgIHdfYnl0ZShUWVBFX1JFRiwgcCk7CkBAIC01NzEsNyArNTcxLDggQEAKIHdfaW5pdF9yZWZzKFdGSUxFICp3ZiwgaW50IHZlcnNpb24pCiB7CiAgICAgaWYgKHZlcnNpb24gPj0gMykgewotICAgICAgICB3Zi0+aGFzaHRhYmxlID0gX1B5X2hhc2h0YWJsZV9uZXcoc2l6ZW9mKGludCksIF9QeV9oYXNodGFibGVfaGFzaF9wdHIsCisgICAgICAgIHdmLT5oYXNodGFibGUgPSBfUHlfaGFzaHRhYmxlX25ldyhzaXplb2YoUHlPYmplY3QgKiksIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9kaXJlY3QpOwogICAgICAgICBpZiAod2YtPmhhc2h0YWJsZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwpAQCAtNTgyLDkgKzU4MywxMyBAQAogfQogCiBzdGF0aWMgaW50Ci13X2RlY3JlZl9lbnRyeShfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICpQeV9VTlVTRUQoZGF0YSkpCit3X2RlY3JlZl9lbnRyeShfUHlfaGFzaHRhYmxlX3QgKmh0LCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgdm9pZCAqUHlfVU5VU0VEKGRhdGEpKQogewotICAgIFB5X1hERUNSRUYoZW50cnktPmtleSk7CisgICAgUHlPYmplY3QgKmVudHJ5X2tleTsKKworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBlbnRyeV9rZXkpOworICAgIFB5X1hERUNSRUYoZW50cnlfa2V5KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjQzLDcgKzY0OCw3IEBACiAgICAgUHlPYmplY3QgKnJlZnM7ICAvKiBhIGxpc3QgKi8KIH0gUkZJTEU7CiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIHJfc3RyaW5nKFB5X3NzaXplX3QgbiwgUkZJTEUgKnApCiB7CiAgICAgUHlfc3NpemVfdCByZWFkID0gLTE7CkBAIC03MjksNyArNzM0LDcgQEAKICAgICAgICAgYyA9IGdldGMocC0+ZnApOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgICAgY2hhciAqcHRyID0gcl9zdHJpbmcoMSwgcCk7CisgICAgICAgIGNvbnN0IGNoYXIgKnB0ciA9IHJfc3RyaW5nKDEsIHApOwogICAgICAgICBpZiAocHRyICE9IE5VTEwpCiAgICAgICAgICAgICBjID0gKih1bnNpZ25lZCBjaGFyICopIHB0cjsKICAgICB9CkBAIC03NDAsOSArNzQ1LDkgQEAKIHJfc2hvcnQoUkZJTEUgKnApCiB7CiAgICAgc2hvcnQgeCA9IC0xOwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKLSAgICBidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZygyLCBwKTsKKyAgICBidWZmZXIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByX3N0cmluZygyLCBwKTsKICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgeCA9IGJ1ZmZlclswXTsKICAgICAgICAgeCB8PSBidWZmZXJbMV0gPDwgODsKQEAgLTc1Niw5ICs3NjEsOSBAQAogcl9sb25nKFJGSUxFICpwKQogewogICAgIGxvbmcgeCA9IC0xOwotICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAKLSAgICBidWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg0LCBwKTsKKyAgICBidWZmZXIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg0LCBwKTsKICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgeCA9IGJ1ZmZlclswXTsKICAgICAgICAgeCB8PSAobG9uZylidWZmZXJbMV0gPDwgODsKQEAgLTk3OCw3ICs5ODMsOCBAQAogCiAgICAgY2FzZSBUWVBFX0ZMT0FUOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdLCAqcHRyOworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgICAgICAgICAgIGRvdWJsZSBkeDsKICAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CiAgICAgICAgICAgICBpZiAobiA9PSBFT0YpIHsKQEAgLTEwMDEsOSArMTAwNyw5IEBACiAKICAgICBjYXNlIFRZUEVfQklOQVJZX0ZMT0FUOgogICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpidWY7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CiAgICAgICAgICAgICBkb3VibGUgeDsKLSAgICAgICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIHJfc3RyaW5nKDgsIHApOworICAgICAgICAgICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CiAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB4ID0gX1B5RmxvYXRfVW5wYWNrOChidWYsIDEpOwpAQCAtMTAxNiw3ICsxMDIyLDggQEAKIAogICAgIGNhc2UgVFlQRV9DT01QTEVYOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsyNTZdLCAqcHRyOworICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgICAgICAgICAgIFB5X2NvbXBsZXggYzsKICAgICAgICAgICAgIG4gPSByX2J5dGUocCk7CiAgICAgICAgICAgICBpZiAobiA9PSBFT0YpIHsKQEAgLTEwNTMsMTUgKzEwNjAsMTUgQEAKIAogICAgIGNhc2UgVFlQRV9CSU5BUllfQ09NUExFWDoKICAgICAgICAgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmOwogICAgICAgICAgICAgUHlfY29tcGxleCBjOwotICAgICAgICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CisgICAgICAgICAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGMucmVhbCA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKICAgICAgICAgICAgIGlmIChjLnJlYWwgPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIgKikgcl9zdHJpbmcoOCwgcCk7CisgICAgICAgICAgICBidWYgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSByX3N0cmluZyg4LCBwKTsKICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGMuaW1hZyA9IF9QeUZsb2F0X1VucGFjazgoYnVmLCAxKTsKQEAgLTEwNzQsNyArMTA4MSw3IEBACiAKICAgICBjYXNlIFRZUEVfU1RSSU5HOgogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICpwdHI7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwdHI7CiAgICAgICAgICAgICBuID0gcl9sb25nKHApOwogICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTE5LDcgKzExMjYsNyBAQAogICAgICAgICB9CiAgICAgX3JlYWRfYXNjaWk6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXIgKnB0cjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnB0cjsKICAgICAgICAgICAgIHB0ciA9IHJfc3RyaW5nKG4sIHApOwogICAgICAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTEzNyw3ICsxMTQ0LDcgQEAKICAgICAgICAgaXNfaW50ZXJuZWQgPSAxOwogICAgIGNhc2UgVFlQRV9VTklDT0RFOgogICAgICAgICB7Ci0gICAgICAgIGNoYXIgKmJ1ZmZlcjsKKyAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyOwogCiAgICAgICAgIG4gPSByX2xvbmcocCk7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQpAQCAtMTI2NCw0MSArMTI3MSw1MiBAQAogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgbWFyc2hhbCBkYXRhIChzZXQgc2l6ZSBvdXQgb2YgcmFuZ2UpIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB2ID0gKHR5cGUgPT0gVFlQRV9TRVQpID8gUHlTZXRfTmV3KE5VTEwpIDogUHlGcm96ZW5TZXRfTmV3KE5VTEwpOwotICAgICAgICBpZiAodHlwZSA9PSBUWVBFX1NFVCkgewotICAgICAgICAgICAgUl9SRUYodik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBtdXN0IHVzZSBkZWxheWVkIHJlZ2lzdHJhdGlvbiBvZiBmcm96ZW5zZXRzIGJlY2F1c2UgdGhleSBtdXN0Ci0gICAgICAgICAgICAgKiBiZSBpbml0IHdpdGggYSByZWZjb3VudCBvZiAxCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlkeCA9IHJfcmVmX3Jlc2VydmUoZmxhZywgcCk7Ci0gICAgICAgICAgICBpZiAoaWR4IDwgMCkKLSAgICAgICAgICAgICAgICBQeV9DTEVBUih2KTsgLyogc2lnbmFsIGVycm9yICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKHYgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIHYyID0gcl9vYmplY3QocCk7Ci0gICAgICAgICAgICBpZiAoIHYyID09IE5VTEwgKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIk5VTEwgb2JqZWN0IGluIG1hcnNoYWwgZGF0YSBmb3Igc2V0Iik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgICAgIHYgPSBOVUxMOworICAgICAgICBpZiAobiA9PSAwICYmIHR5cGUgPT0gVFlQRV9GUk9aRU5TRVQpIHsKKyAgICAgICAgICAgIC8qIGNhbGwgZnJvemVuc2V0KCkgdG8gZ2V0IHRoZSBlbXB0eSBmcm96ZW5zZXQgc2luZ2xldG9uICovCisgICAgICAgICAgICB2ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopJlB5RnJvemVuU2V0X1R5cGUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQeVNldF9BZGQodiwgdjIpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2Mik7Ci0gICAgICAgICAgICAgICAgdiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgUl9SRUYodik7CisgICAgICAgICAgICByZXR2YWwgPSB2OwogICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlICE9IFRZUEVfU0VUKQotICAgICAgICAgICAgdiA9IHJfcmVmX2luc2VydCh2LCBpZHgsIGZsYWcsIHApOwotICAgICAgICByZXR2YWwgPSB2OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHYgPSAodHlwZSA9PSBUWVBFX1NFVCkgPyBQeVNldF9OZXcoTlVMTCkgOiBQeUZyb3plblNldF9OZXcoTlVMTCk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBUWVBFX1NFVCkgeworICAgICAgICAgICAgICAgIFJfUkVGKHYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBkZWxheWVkIHJlZ2lzdHJhdGlvbiBvZiBmcm96ZW5zZXRzIGJlY2F1c2UgdGhleSBtdXN0CisgICAgICAgICAgICAgICAgICogYmUgaW5pdCB3aXRoIGEgcmVmY291bnQgb2YgMQorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlkeCA9IHJfcmVmX3Jlc2VydmUoZmxhZywgcCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICAgICAgICAgIFB5X0NMRUFSKHYpOyAvKiBzaWduYWwgZXJyb3IgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2ID09IE5VTEwpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICB2MiA9IHJfb2JqZWN0KHApOworICAgICAgICAgICAgICAgIGlmICggdjIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBvYmplY3QgaW4gbWFyc2hhbCBkYXRhIGZvciBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOworICAgICAgICAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChQeVNldF9BZGQodiwgdjIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKKyAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYyKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGUgIT0gVFlQRV9TRVQpCisgICAgICAgICAgICAgICAgdiA9IHJfcmVmX2luc2VydCh2LCBpZHgsIGZsYWcsIHApOworICAgICAgICAgICAgcmV0dmFsID0gdjsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgVFlQRV9DT0RFOgpkaWZmIC0tZ2l0IGEvUHl0aG9uL21vZHN1cHBvcnQuYyBiL1B5dGhvbi9tb2RzdXBwb3J0LmMKaW5kZXggMGQwOTM3MS4uZGFjMThiZSAxMDA2NDQKLS0tIGEvUHl0aG9uL21vZHN1cHBvcnQuYworKysgYi9QeXRob24vbW9kc3VwcG9ydC5jCkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICAgICAgY2FzZSAnVSc6ICAgLyogWFhYIGRlcHJlY2F0ZWQgYWxpYXMgKi8KICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKnY7Ci0gICAgICAgICAgICBjaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNvbnN0IGNoYXIgKik7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IG47CiAgICAgICAgICAgICBpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKICAgICAgICAgICAgICAgICArKypwX2Zvcm1hdDsKQEAgLTM1MSw3ICszNTEsNyBAQAogICAgICAgICBjYXNlICd5JzoKICAgICAgICAgewogICAgICAgICAgICAgUHlPYmplY3QgKnY7Ci0gICAgICAgICAgICBjaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNoYXIgKik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSB2YV9hcmcoKnBfdmEsIGNvbnN0IGNoYXIgKik7CiAgICAgICAgICAgICBQeV9zc2l6ZV90IG47CiAgICAgICAgICAgICBpZiAoKipwX2Zvcm1hdCA9PSAnIycpIHsKICAgICAgICAgICAgICAgICArKypwX2Zvcm1hdDsKZGlmZiAtLWdpdCBhL1B5dGhvbi9teXN0cnRvdWwuYyBiL1B5dGhvbi9teXN0cnRvdWwuYwppbmRleCA5ODQyOWQ0Li5hODU3OTBlIDEwMDY0NAotLS0gYS9QeXRob24vbXlzdHJ0b3VsLmMKKysrIGIvUHl0aG9uL215c3RydG91bC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBzbWFsbG1heFtiYXNlXSBpcyB0aGUgbGFyZ2VzdCB1bnNpZ25lZCBsb25nIGkgc3VjaCB0aGF0CiAgKiBpICogYmFzZSBkb2Vzbid0IG92ZXJmbG93IHVuc2lnbmVkIGxvbmcuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNtYWxsbWF4W10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBzbWFsbG1heFtdID0gewogICAgIDAsIC8qIGJhc2VzIDAgYW5kIDEgYXJlIGludmFsaWQgKi8KICAgICAwLAogICAgIFVMT05HX01BWCAvIDIsCkBAIC02MiwxNCArNjIsMTQgQEAKICAqIE5vdGUgdGhhdCB0aGlzIGlzIHBlc3NpbWlzdGljIGlmIHNpemVvZihsb25nKSA+IDQuCiAgKi8KICNpZiBTSVpFT0ZfTE9ORyA9PSA0Ci1zdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgZGlnaXRsaW1pdFtdID0gewogICAgIDAsICAwLCAzMiwgMjAsIDE2LCAxMywgMTIsIDExLCAxMCwgMTAsICAvKiAgMCAtICA5ICovCiAgICAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIC8qIDEwIC0gMTkgKi8KICAgICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgLyogMjAgLSAyOSAqLwogICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDZ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCiAjZWxpZiBTSVpFT0ZfTE9ORyA9PSA4CiAvKiBbaW50KG1hdGguZmxvb3IobWF0aC5sb2coMioqNjQsIGkpKSkgZm9yIGkgaW4gcmFuZ2UoMiwgMzcpXSAqLwotc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CitzdGF0aWMgY29uc3QgaW50IGRpZ2l0bGltaXRbXSA9IHsKICAgICAgICAgIDAsICAgMCwgNjQsIDQwLCAzMiwgMjcsIDI0LCAyMiwgMjEsIDIwLCAgLyogIDAgLSAgOSAqLwogICAgIDE5LCAgMTgsIDE3LCAxNywgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgIC8qIDEwIC0gMTkgKi8KICAgICAxNCwgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsICAvKiAyMCAtIDI5ICovCmRpZmYgLS1naXQgYS9QeXRob24vb3Bjb2RlX3RhcmdldHMuaCBiL1B5dGhvbi9vcGNvZGVfdGFyZ2V0cy5oCmluZGV4IDE5MjU5ZTEuLjYxODJlODAgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9vcGNvZGVfdGFyZ2V0cy5oCisrKyBiL1B5dGhvbi9vcGNvZGVfdGFyZ2V0cy5oCkBAIC0xMzMsNyArMTMzLDcgQEAKICAgICAmJlRBUkdFVF9DQUxMX0ZVTkNUSU9OLAogICAgICYmVEFSR0VUX01BS0VfRlVOQ1RJT04sCiAgICAgJiZUQVJHRVRfQlVJTERfU0xJQ0UsCi0gICAgJiZUQVJHRVRfTUFLRV9DTE9TVVJFLAorICAgICYmX3Vua25vd25fb3Bjb2RlLAogICAgICYmVEFSR0VUX0xPQURfQ0xPU1VSRSwKICAgICAmJlRBUkdFVF9MT0FEX0RFUkVGLAogICAgICYmVEFSR0VUX1NUT1JFX0RFUkVGLApAQCAtMTU0LDggKzE1NCw4IEBACiAgICAgJiZUQVJHRVRfQlVJTERfVFVQTEVfVU5QQUNLLAogICAgICYmVEFSR0VUX0JVSUxEX1NFVF9VTlBBQ0ssCiAgICAgJiZUQVJHRVRfU0VUVVBfQVNZTkNfV0lUSCwKLSAgICAmJl91bmtub3duX29wY29kZSwKLSAgICAmJl91bmtub3duX29wY29kZSwKKyAgICAmJlRBUkdFVF9GT1JNQVRfVkFMVUUsCisgICAgJiZUQVJHRVRfQlVJTERfQ09OU1RfS0VZX01BUCwKICAgICAmJl91bmtub3duX29wY29kZSwKICAgICAmJl91bmtub3duX29wY29kZSwKICAgICAmJl91bmtub3duX29wY29kZSwKZGlmZiAtLWdpdCBhL1B5dGhvbi9wZWVwaG9sZS5jIGIvUHl0aG9uL3BlZXBob2xlLmMKaW5kZXggNGU2NTdmYS4uNjI2MjVmNyAxMDA2NDQKLS0tIGEvUHl0aG9uL3BlZXBob2xlLmMKKysrIGIvUHl0aG9uL3BlZXBob2xlLmMKQEAgLTgsOCArOCw4IEBACiAjaW5jbHVkZSAiY29kZS5oIgogI2luY2x1ZGUgInN5bXRhYmxlLmgiCiAjaW5jbHVkZSAib3Bjb2RlLmgiCisjaW5jbHVkZSAid29yZGNvZGVfaGVscGVycy5oIgogCi0jZGVmaW5lIEdFVEFSRyhhcnIsIGkpICgoaW50KSgoYXJyW2krMl08PDgpICsgYXJyW2krMV0pKQogI2RlZmluZSBVTkNPTkRJVElPTkFMX0pVTVAob3ApICAob3A9PUpVTVBfQUJTT0xVVEUgfHwgb3A9PUpVTVBfRk9SV0FSRCkKICNkZWZpbmUgQ09ORElUSU9OQUxfSlVNUChvcCkgKG9wPT1QT1BfSlVNUF9JRl9GQUxTRSB8fCBvcD09UE9QX0pVTVBfSUZfVFJVRSBcCiAgICAgfHwgb3A9PUpVTVBfSUZfRkFMU0VfT1JfUE9QIHx8IG9wPT1KVU1QX0lGX1RSVUVfT1JfUE9QKQpAQCAtMTcsMjIgKzE3LDE1IEBACiAgICAgfHwgb3A9PVBPUF9KVU1QX0lGX0ZBTFNFIHx8IG9wPT1QT1BfSlVNUF9JRl9UUlVFIFwKICAgICB8fCBvcD09SlVNUF9JRl9GQUxTRV9PUl9QT1AgfHwgb3A9PUpVTVBfSUZfVFJVRV9PUl9QT1ApCiAjZGVmaW5lIEpVTVBTX09OX1RSVUUob3ApIChvcD09UE9QX0pVTVBfSUZfVFJVRSB8fCBvcD09SlVNUF9JRl9UUlVFX09SX1BPUCkKLSNkZWZpbmUgR0VUSlVNUFRHVChhcnIsIGkpIChHRVRBUkcoYXJyLGkpICsgKEFCU09MVVRFX0pVTVAoYXJyW2ldKSA/IDAgOiBpKzMpKQotI2RlZmluZSBTRVRBUkcoYXJyLCBpLCB2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFzc2VydCgwIDw9IHZhbCAmJiB2YWwgPD0gMHhmZmZmKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFycltpKzJdID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgaW50KXZhbCk+PjgpOyAgICAgXAotICAgIGFycltpKzFdID0gKHVuc2lnbmVkIGNoYXIpKCgodW5zaWduZWQgaW50KXZhbCkgJiAyNTUpOyAgXAotfSB3aGlsZSgwKQotI2RlZmluZSBDT0RFU0laRShvcCkgIChIQVNfQVJHKG9wKSA/IDMgOiAxKQotI2RlZmluZSBJU0JBU0lDQkxPQ0soYmxvY2tzLCBzdGFydCwgYnl0ZXMpIFwKLSAgICAoYmxvY2tzW3N0YXJ0XT09YmxvY2tzW3N0YXJ0K2J5dGVzLTFdKQorI2RlZmluZSBHRVRKVU1QVEdUKGFyciwgaSkgKGdldF9hcmcoYXJyLCBpKSArIChBQlNPTFVURV9KVU1QKGFycltpXSkgPyAwIDogaSsyKSkKKyNkZWZpbmUgSVNCQVNJQ0JMT0NLKGJsb2Nrcywgc3RhcnQsIGVuZCkgXAorICAgIChibG9ja3Nbc3RhcnRdPT1ibG9ja3NbZW5kXSkKIAogCiAjZGVmaW5lIENPTlNUX1NUQUNLX0NSRUFURSgpIHsgXAogICAgIGNvbnN0X3N0YWNrX3NpemUgPSAyNTY7IFwKICAgICBjb25zdF9zdGFjayA9IFB5TWVtX05ldyhQeU9iamVjdCAqLCBjb25zdF9zdGFja19zaXplKTsgXAotICAgIGxvYWRfY29uc3Rfc3RhY2sgPSBQeU1lbV9OZXcoUHlfc3NpemVfdCwgY29uc3Rfc3RhY2tfc2l6ZSk7IFwKLSAgICBpZiAoIWNvbnN0X3N0YWNrIHx8ICFsb2FkX2NvbnN0X3N0YWNrKSB7IFwKKyAgICBpZiAoIWNvbnN0X3N0YWNrKSB7IFwKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsgXAogICAgICAgICBnb3RvIGV4aXRFcnJvcjsgXAogICAgIH0gXApAQCAtNDEsMjcgKzM0LDIzIEBACiAjZGVmaW5lIENPTlNUX1NUQUNLX0RFTEVURSgpIGRvIHsgXAogICAgIGlmIChjb25zdF9zdGFjaykgXAogICAgICAgICBQeU1lbV9GcmVlKGNvbnN0X3N0YWNrKTsgXAotICAgIGlmIChsb2FkX2NvbnN0X3N0YWNrKSBcCi0gICAgICAgIFB5TWVtX0ZyZWUobG9hZF9jb25zdF9zdGFjayk7IFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgQ09OU1RfU1RBQ0tfTEVOKCkgKGNvbnN0X3N0YWNrX3RvcCArIDEpCisjZGVmaW5lIENPTlNUX1NUQUNLX0xFTigpICgodW5zaWduZWQpKGNvbnN0X3N0YWNrX3RvcCArIDEpKQogCiAjZGVmaW5lIENPTlNUX1NUQUNLX1BVU0hfT1AoaSkgZG8geyBcCiAgICAgUHlPYmplY3QgKl94OyBcCiAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7IFwKLSAgICBhc3NlcnQoUHlMaXN0X0dFVF9TSVpFKGNvbnN0cykgPiBHRVRBUkcoY29kZXN0ciwgaSkpOyBcCi0gICAgX3ggPSBQeUxpc3RfR0VUX0lURU0oY29uc3RzLCBHRVRBUkcoY29kZXN0ciwgaSkpOyBcCisgICAgYXNzZXJ0KFB5TGlzdF9HRVRfU0laRShjb25zdHMpID4gKFB5X3NzaXplX3QpZ2V0X2FyZyhjb2Rlc3RyLCBpKSk7IFwKKyAgICBfeCA9IFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGdldF9hcmcoY29kZXN0ciwgaSkpOyBcCiAgICAgaWYgKCsrY29uc3Rfc3RhY2tfdG9wID49IGNvbnN0X3N0YWNrX3NpemUpIHsgXAogICAgICAgICBjb25zdF9zdGFja19zaXplICo9IDI7IFwKICAgICAgICAgUHlNZW1fUmVzaXplKGNvbnN0X3N0YWNrLCBQeU9iamVjdCAqLCBjb25zdF9zdGFja19zaXplKTsgXAotICAgICAgICBQeU1lbV9SZXNpemUobG9hZF9jb25zdF9zdGFjaywgUHlfc3NpemVfdCwgY29uc3Rfc3RhY2tfc2l6ZSk7IFwKLSAgICAgICAgaWYgKCFjb25zdF9zdGFjayB8fCAhbG9hZF9jb25zdF9zdGFjaykgeyBcCisgICAgICAgIGlmICghY29uc3Rfc3RhY2spIHsgXAogICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsgXAogICAgICAgICAgICAgZ290byBleGl0RXJyb3I7IFwKICAgICAgICAgfSBcCiAgICAgfSBcCi0gICAgbG9hZF9jb25zdF9zdGFja1tjb25zdF9zdGFja190b3BdID0gaTsgXAogICAgIGNvbnN0X3N0YWNrW2NvbnN0X3N0YWNrX3RvcF0gPSBfeDsgXAogICAgIGluX2NvbnN0cyA9IDE7IFwKICAgICB9IHdoaWxlKDApCkBAIC03MCwyMiArNTksMTA4IEBACiAgICAgY29uc3Rfc3RhY2tfdG9wID0gLTE7IFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgQ09OU1RfU1RBQ0tfVE9QKCkgXAotICAgIGNvbnN0X3N0YWNrW2NvbnN0X3N0YWNrX3RvcF0KLQogI2RlZmluZSBDT05TVF9TVEFDS19MQVNUTihpKSBcCi0gICAgJmNvbnN0X3N0YWNrW2NvbnN0X3N0YWNrX3RvcCAtIGkgKyAxXQorICAgICZjb25zdF9zdGFja1tDT05TVF9TVEFDS19MRU4oKSAtIGldCiAKICNkZWZpbmUgQ09OU1RfU1RBQ0tfUE9QKGkpIGRvIHsgXAotICAgIGFzc2VydChjb25zdF9zdGFja190b3AgKyAxID49IGkpOyBcCisgICAgYXNzZXJ0KENPTlNUX1NUQUNLX0xFTigpID49IGkpOyBcCiAgICAgY29uc3Rfc3RhY2tfdG9wIC09IGk7IFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgQ09OU1RfU1RBQ0tfT1BfTEFTVE4oaSkgXAotICAgICgoY29uc3Rfc3RhY2tfdG9wID49IGkgLSAxKSA/IGxvYWRfY29uc3Rfc3RhY2tbY29uc3Rfc3RhY2tfdG9wIC0gaSArIDFdIDogLTEpCisvKiBTY2FucyBiYWNrIE4gY29uc2VjdXRpdmUgTE9BRF9DT05TVCBpbnN0cnVjdGlvbnMsIHNraXBwaW5nIE5PUHMsCisgICByZXR1cm5zIGluZGV4IG9mIHRoZSBOdGggbGFzdCdzIExPQURfQ09OU1QncyBFWFRFTkRFRF9BUkcgcHJlZml4LgorICAgQ2FsbGVycyBhcmUgcmVzcG9uc2libGUgdG8gY2hlY2sgQ09OU1RfU1RBQ0tfTEVOIGJlZm9yZWhhbmQuCisqLworc3RhdGljIFB5X3NzaXplX3QKK2xhc3RuX2NvbnN0X3N0YXJ0KHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgaSwgUHlfc3NpemVfdCBuKQoreworICAgIGFzc2VydChuID4gMCAmJiAoaSYxKSA9PSAwKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGkgLT0gMjsKKyAgICAgICAgYXNzZXJ0KGkgPj0gMCk7CisgICAgICAgIGlmIChjb2Rlc3RyW2ldID09IExPQURfQ09OU1QpIHsKKyAgICAgICAgICAgIGlmICghLS1uKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIGNvZGVzdHJbaS0yXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgICAgICAgICAgaSAtPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjb2Rlc3RyW2ldID09IE5PUCB8fCBjb2Rlc3RyW2ldID09IEVYVEVOREVEX0FSRyk7CisgICAgICAgIH0KKyAgICB9Cit9CiAKKy8qIFNjYW5zIHRocm91Z2ggRVhURU5ERUQgQVJHcywgc2Vla2luZyB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdGl2ZSBvcGNvZGUgKi8KK3N0YXRpYyBQeV9zc2l6ZV90CitmaW5kX29wKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgaSkKK3sKKyAgICBhc3NlcnQoKGkmMSkgPT0gMCk7CisgICAgd2hpbGUgKGNvZGVzdHJbaV0gPT0gRVhURU5ERURfQVJHKSB7CisgICAgICAgIGkgKz0gMjsKKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CiAKLS8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMS4gTE9BRF9DT05TVCBjMiAuLi4gTE9BRF9DT05TVCBjbiBCVUlMRF9UVVBMRSBuCisvKiBHaXZlbiB0aGUgaW5kZXggb2YgdGhlIGVmZmVjdGl2ZSBvcGNvZGUsCisgICBzY2FuIGJhY2sgdG8gY29uc3RydWN0IHRoZSBvcGFyZyB3aXRoIEVYVEVOREVEX0FSRyAqLworc3RhdGljIHVuc2lnbmVkIGludAorZ2V0X2FyZyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IGkpCit7CisgICAgdW5zaWduZWQgaW50IG9wYXJnID0gY29kZXN0cltpKzFdOworICAgIGFzc2VydCgoaSYxKSA9PSAwKTsKKyAgICBpZiAoaSA+PSAyICYmIGNvZGVzdHJbaS0yXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgb3BhcmcgfD0gY29kZXN0cltpLTFdIDw8IDg7CisgICAgICAgIGlmIChpID49IDQgJiYgY29kZXN0cltpLTRdID09IEVYVEVOREVEX0FSRykgeworICAgICAgICAgICAgb3BhcmcgfD0gY29kZXN0cltpLTNdIDw8IDE2OworICAgICAgICAgICAgaWYgKGkgPj0gNiAmJiBjb2Rlc3RyW2ktNl0gPT0gRVhURU5ERURfQVJHKSB7CisgICAgICAgICAgICAgICAgb3BhcmcgfD0gY29kZXN0cltpLTVdIDw8IDI0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvcGFyZzsKK30KKworLyogR2l2ZW4gdGhlIGluZGV4IG9mIHRoZSBlZmZlY3RpdmUgb3Bjb2RlLAorICAgYXR0ZW1wdCB0byByZXBsYWNlIHRoZSBhcmd1bWVudCwgdGFraW5nIGludG8gYWNjb3VudCBFWFRFTkRFRF9BUkcuCisgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUsIG9yIHRoZSBuZXcgb3AgaW5kZXggb24gc3VjY2VzcyAqLworc3RhdGljIFB5X3NzaXplX3QKK3NldF9hcmcodW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBpLCB1bnNpZ25lZCBpbnQgb3BhcmcpCit7CisgICAgdW5zaWduZWQgaW50IGN1cmFyZyA9IGdldF9hcmcoY29kZXN0ciwgaSk7CisgICAgaW50IGN1cmlsZW4sIG5ld2lsZW47CisgICAgaWYgKGN1cmFyZyA9PSBvcGFyZykKKyAgICAgICAgcmV0dXJuIGk7CisgICAgY3VyaWxlbiA9IGluc3Ryc2l6ZShjdXJhcmcpOworICAgIG5ld2lsZW4gPSBpbnN0cnNpemUob3BhcmcpOworICAgIGlmIChjdXJpbGVuIDwgbmV3aWxlbikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgd3JpdGVfb3BfYXJnKGNvZGVzdHIgKyBpICsgMiAtIGN1cmlsZW4sIGNvZGVzdHJbaV0sIG9wYXJnLCBuZXdpbGVuKTsKKyAgICBtZW1zZXQoY29kZXN0ciArIGkgKyAyIC0gY3VyaWxlbiArIG5ld2lsZW4sIE5PUCwgY3VyaWxlbiAtIG5ld2lsZW4pOworICAgIHJldHVybiBpLWN1cmlsZW4rbmV3aWxlbjsKK30KKworLyogQXR0ZW1wdCB0byB3cml0ZSBvcC9hcmcgYXQgZW5kIG9mIHNwZWNpZmllZCByZWdpb24gb2YgbWVtb3J5LgorICAgUHJlY2VkaW5nIG1lbW9yeSBpbiB0aGUgcmVnaW9uIGlzIG92ZXJ3cml0dGVuIHdpdGggTk9Qcy4KKyAgIFJldHVybnMgLTEgb24gZmFpbHVyZSwgb3AgaW5kZXggb24gc3VjY2VzcyAqLworc3RhdGljIFB5X3NzaXplX3QKK2NvcHlfb3BfYXJnKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgaSwgdW5zaWduZWQgY2hhciBvcCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBvcGFyZywgUHlfc3NpemVfdCBtYXhpKQoreworICAgIGludCBpbGVuID0gaW5zdHJzaXplKG9wYXJnKTsKKyAgICBhc3NlcnQoKGkmMSkgPT0gMCk7CisgICAgaWYgKGkgKyBpbGVuID4gbWF4aSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHdyaXRlX29wX2FyZyhjb2Rlc3RyICsgbWF4aSAtIGlsZW4sIG9wLCBvcGFyZywgaWxlbik7CisgICAgbWVtc2V0KGNvZGVzdHIgKyBpLCBOT1AsIG1heGkgLSBpIC0gaWxlbik7CisgICAgcmV0dXJuIG1heGkgLSAyOworfQorCisvKiBSZXBsYWNlIExPQURfQ09OU1QgYzEsIExPQURfQ09OU1QgYzIgLi4uIExPQURfQ09OU1QgY24sIEJVSUxEX1RVUExFIG4KICAgIHdpdGggICAgTE9BRF9DT05TVCAoYzEsIGMyLCAuLi4gY24pLgogICAgVGhlIGNvbnN0cyB0YWJsZSBtdXN0IHN0aWxsIGJlIGluIGxpc3QgZm9ybSBzbyB0aGF0IHRoZQogICAgbmV3IGNvbnN0YW50IChjMSwgYzIsIC4uLiBjbikgY2FuIGJlIGFwcGVuZGVkLgpAQCAtOTQsOSArMTY5LDEwIEBACiAgICBBbHNvIHdvcmtzIGZvciBCVUlMRF9MSVNUIGFuZCBCVUlMVF9TRVQgd2hlbiBmb2xsb3dlZCBieSBhbiAiaW4iIG9yICJub3QgaW4iCiAgICB0ZXN0OyBmb3IgQlVJTERfU0VUIGl0IGFzc2VtYmxlcyBhIGZyb3plbnNldCByYXRoZXIgdGhhbiBhIHR1cGxlLgogKi8KLXN0YXRpYyBpbnQKLXR1cGxlX29mX2NvbnN0YW50cyh1bnNpZ25lZCBjaGFyICpjb2Rlc3RyLCBQeV9zc2l6ZV90IG4sCi0gICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKipvYmpzKQorc3RhdGljIFB5X3NzaXplX3QKK2ZvbGRfdHVwbGVfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgY19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb3Bjb2RlX2VuZCwgdW5zaWduZWQgY2hhciBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqKm9ianMsIGludCBuKQogewogICAgIFB5T2JqZWN0ICpuZXdjb25zdCwgKmNvbnN0YW50OwogICAgIFB5X3NzaXplX3QgaSwgbGVuX2NvbnN0czsKQEAgLTEwNiw5ICsxODIsOSBAQAogCiAgICAgLyogQnVpbGR1cCBuZXcgdHVwbGUgb2YgY29uc3RhbnRzICovCiAgICAgbmV3Y29uc3QgPSBQeVR1cGxlX05ldyhuKTsKLSAgICBpZiAobmV3Y29uc3QgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOworICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKICAgICAgICAgY29uc3RhbnQgPSBvYmpzW2ldOwogICAgICAgICBQeV9JTkNSRUYoY29uc3RhbnQpOwpAQCAtMTE2LDMwICsxOTIsMjYgQEAKICAgICB9CiAKICAgICAvKiBJZiBpdCdzIGEgQlVJTERfU0VULCB1c2UgdGhlIFB5VHVwbGUgd2UganVzdCBidWlsdCB0byBjcmVhdGUgYQotICAgICAgUHlGcm96ZW5TZXQsIGFuZCB1c2UgdGhhdCBhcyB0aGUgY29uc3RhbnQgaW5zdGVhZDogKi8KLSAgICBpZiAoY29kZXN0clswXSA9PSBCVUlMRF9TRVQpIHsKLSAgICAgICAgUHlPYmplY3QgKnR1cGxlID0gbmV3Y29uc3Q7Ci0gICAgICAgIG5ld2NvbnN0ID0gUHlGcm96ZW5TZXRfTmV3KHR1cGxlKTsKLSAgICAgICAgUHlfREVDUkVGKHR1cGxlKTsKLSAgICAgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICBQeUZyb3plblNldCwgYW5kIHVzZSB0aGF0IGFzIHRoZSBjb25zdGFudCBpbnN0ZWFkOiAqLworICAgIGlmIChvcGNvZGUgPT0gQlVJTERfU0VUKSB7CisgICAgICAgIFB5X1NFVFJFRihuZXdjb25zdCwgUHlGcm96ZW5TZXRfTmV3KG5ld2NvbnN0KSk7CisgICAgICAgIGlmIChuZXdjb25zdCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IG9udG8gY29uc3RzICovCisgICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwogICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLSAgICAvKiBXcml0ZSBOT1BzIG92ZXIgb2xkIExPQURfQ09OU1RTIGFuZAotICAgICAgIGFkZCBhIG5ldyBMT0FEX0NPTlNUIG5ld2NvbnN0IG9uIHRvcCBvZiB0aGUgQlVJTERfVFVQTEUgbiAqLwotICAgIGNvZGVzdHJbMF0gPSBMT0FEX0NPTlNUOwotICAgIFNFVEFSRyhjb2Rlc3RyLCAwLCBsZW5fY29uc3RzKTsKLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gY29weV9vcF9hcmcoY29kZXN0ciwgY19zdGFydCwgTE9BRF9DT05TVCwgbGVuX2NvbnN0cywgb3Bjb2RlX2VuZCk7CiB9CiAKLS8qIFJlcGxhY2UgTE9BRF9DT05TVCBjMS4gTE9BRF9DT05TVCBjMiBCSU5PUAorLyogUmVwbGFjZSBMT0FEX0NPTlNUIGMxLCBMT0FEX0NPTlNUIGMyLCBCSU5PUAogICAgd2l0aCAgICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKQogICAgVGhlIGNvbnN0cyB0YWJsZSBtdXN0IHN0aWxsIGJlIGluIGxpc3QgZm9ybSBzbyB0aGF0IHRoZQogICAgbmV3IGNvbnN0YW50IGNhbiBiZSBhcHBlbmRlZC4KQEAgLTE0OSwyMCArMjIxLDIxIEBACiAgICBpcyBiZWxvdyBhIHRocmVzaG9sZCB2YWx1ZS4gIFRoYXQga2VlcHMgcHljIGZpbGVzIGZyb20KICAgIGJlY29taW5nIGxhcmdlIGluIHRoZSBwcmVzZW5jZSBvZiBjb2RlIGxpa2U6ICAoTm9uZSwpKjEwMDAuCiAqLwotc3RhdGljIGludAotZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICoqb2JqcykKK3N0YXRpYyBQeV9zc2l6ZV90Citmb2xkX2Jpbm9wc19vbl9jb25zdGFudHModW5zaWduZWQgY2hhciAqY29kZXN0ciwgUHlfc3NpemVfdCBjX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb3Bjb2RlX2VuZCwgdW5zaWduZWQgY2hhciBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNvbnN0cywgUHlPYmplY3QgKipvYmpzKQogewogICAgIFB5T2JqZWN0ICpuZXdjb25zdCwgKnYsICp3OwogICAgIFB5X3NzaXplX3QgbGVuX2NvbnN0cywgc2l6ZTsKLSAgICBpbnQgb3Bjb2RlOwogCiAgICAgLyogUHJlLWNvbmRpdGlvbnMgKi8KICAgICBhc3NlcnQoUHlMaXN0X0NoZWNrRXhhY3QoY29uc3RzKSk7CisgICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwogCiAgICAgLyogQ3JlYXRlIG5ldyBjb25zdGFudCAqLwogICAgIHYgPSBvYmpzWzBdOwogICAgIHcgPSBvYmpzWzFdOwotICAgIG9wY29kZSA9IGNvZGVzdHJbMF07CiAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgY2FzZSBCSU5BUllfUE9XRVI6CiAgICAgICAgICAgICBuZXdjb25zdCA9IFB5TnVtYmVyX1Bvd2VyKHYsIHcsIFB5X05vbmUpOwpAQCAtMjA4LDUwICsyODEsNDggQEAKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgYmluYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpKQorICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgc2l6ZSA9IFB5T2JqZWN0X1NpemUobmV3Y29uc3QpOwogICAgIGlmIChzaXplID09IC0xKSB7Ci0gICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleWJvYXJkSW50ZXJydXB0KSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgICAgICBQeUVycl9DbGVhcigpOwogICAgIH0gZWxzZSBpZiAoc2l6ZSA+IDIwKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyogQXBwZW5kIGZvbGRlZCBjb25zdGFudCBpbnRvIGNvbnN0cyB0YWJsZSAqLwotICAgIGxlbl9jb25zdHMgPSBQeUxpc3RfR0VUX1NJWkUoY29uc3RzKTsKICAgICBpZiAoUHlMaXN0X0FwcGVuZChjb25zdHMsIG5ld2NvbnN0KSkgewogICAgICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBQeV9ERUNSRUYobmV3Y29uc3QpOwogCi0gICAgLyogV3JpdGUgTk9QIE5PUCBOT1AgTk9QIExPQURfQ09OU1QgbmV3Y29uc3QgKi8KLSAgICBjb2Rlc3RyWy0yXSA9IExPQURfQ09OU1Q7Ci0gICAgU0VUQVJHKGNvZGVzdHIsIC0yLCBsZW5fY29uc3RzKTsKLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gY29weV9vcF9hcmcoY29kZXN0ciwgY19zdGFydCwgTE9BRF9DT05TVCwgbGVuX2NvbnN0cywgb3Bjb2RlX2VuZCk7CiB9CiAKLXN0YXRpYyBpbnQKLWZvbGRfdW5hcnlvcHNfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5T2JqZWN0ICpjb25zdHMsIFB5T2JqZWN0ICp2KQorc3RhdGljIFB5X3NzaXplX3QKK2ZvbGRfdW5hcnlvcHNfb25fY29uc3RhbnRzKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIFB5X3NzaXplX3QgY19zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgb3Bjb2RlX2VuZCwgdW5zaWduZWQgY2hhciBvcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY29uc3RzLCBQeU9iamVjdCAqdikKIHsKICAgICBQeU9iamVjdCAqbmV3Y29uc3Q7CiAgICAgUHlfc3NpemVfdCBsZW5fY29uc3RzOwotICAgIGludCBvcGNvZGU7CiAKICAgICAvKiBQcmUtY29uZGl0aW9ucyAqLwogICAgIGFzc2VydChQeUxpc3RfQ2hlY2tFeGFjdChjb25zdHMpKTsKLSAgICBhc3NlcnQoY29kZXN0clswXSA9PSBMT0FEX0NPTlNUKTsKKyAgICBsZW5fY29uc3RzID0gUHlMaXN0X0dFVF9TSVpFKGNvbnN0cyk7CiAKICAgICAvKiBDcmVhdGUgbmV3IGNvbnN0YW50ICovCi0gICAgb3Bjb2RlID0gY29kZXN0clszXTsKICAgICBzd2l0Y2ggKG9wY29kZSkgewogICAgICAgICBjYXNlIFVOQVJZX05FR0FUSVZFOgogICAgICAgICAgICAgbmV3Y29uc3QgPSBQeU51bWJlcl9OZWdhdGl2ZSh2KTsKQEAgLTI2NywzNSArMzM4LDMxIEBACiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHVuYXJ5IG9wZXJhdGlvbiAlZCBvbiBhIGNvbnN0YW50IiwKICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKG5ld2NvbnN0ID09IE5VTEwpIHsKLSAgICAgICAgaWYoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQpKQorICAgICAgICBpZighUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlib2FyZEludGVycnVwdCkpIHsKICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICAvKiBBcHBlbmQgZm9sZGVkIGNvbnN0YW50IGludG8gY29uc3RzIHRhYmxlICovCi0gICAgbGVuX2NvbnN0cyA9IFB5TGlzdF9HRVRfU0laRShjb25zdHMpOwogICAgIGlmIChQeUxpc3RfQXBwZW5kKGNvbnN0cywgbmV3Y29uc3QpKSB7CiAgICAgICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRihuZXdjb25zdCk7CiAKLSAgICAvKiBXcml0ZSBOT1AgTE9BRF9DT05TVCBuZXdjb25zdCAqLwotICAgIGNvZGVzdHJbMF0gPSBOT1A7Ci0gICAgY29kZXN0clsxXSA9IExPQURfQ09OU1Q7Ci0gICAgU0VUQVJHKGNvZGVzdHIsIDEsIGxlbl9jb25zdHMpOwotICAgIHJldHVybiAxOworICAgIHJldHVybiBjb3B5X29wX2FyZyhjb2Rlc3RyLCBjX3N0YXJ0LCBMT0FEX0NPTlNULCBsZW5fY29uc3RzLCBvcGNvZGVfZW5kKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCAqCiBtYXJrYmxvY2tzKHVuc2lnbmVkIGNoYXIgKmNvZGUsIFB5X3NzaXplX3QgbGVuKQogewogICAgIHVuc2lnbmVkIGludCAqYmxvY2tzID0gUHlNZW1fTmV3KHVuc2lnbmVkIGludCwgbGVuKTsKLSAgICBpbnQgaSxqLCBvcGNvZGUsIGJsb2NrY250ID0gMDsKKyAgICBpbnQgaSwgaiwgb3Bjb2RlLCBibG9ja2NudCA9IDA7CiAKICAgICBpZiAoYmxvY2tzID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTMwNCw3ICszNzEsNyBAQAogICAgIG1lbXNldChibG9ja3MsIDAsIGxlbipzaXplb2YoaW50KSk7CiAKICAgICAvKiBNYXJrIGxhYmVscyBpbiB0aGUgZmlyc3QgcGFzcyAqLwotICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKz1DT0RFU0laRShvcGNvZGUpKSB7CisgICAgZm9yIChpPTAgOyBpPGxlbiA7IGkrPTIpIHsKICAgICAgICAgb3Bjb2RlID0gY29kZVtpXTsKICAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9SX0lURVI6CkBAIC0zMjYsNyArMzkzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvKiBCdWlsZCBibG9jayBudW1iZXJzIGluIHRoZSBzZWNvbmQgcGFzcyAqLwotICAgIGZvciAoaT0wIDsgaTxsZW4gOyBpKyspIHsKKyAgICBmb3IgKGk9MCA7IGk8bGVuIDsgaSs9MikgewogICAgICAgICBibG9ja2NudCArPSBibG9ja3NbaV07ICAgICAgICAgIC8qIGluY3JlbWVudCBibG9ja2NudCBvdmVyIGxhYmVscyAqLwogICAgICAgICBibG9ja3NbaV0gPSBibG9ja2NudDsKICAgICB9CkBAIC0zMzcsMzMgKzQwNCwyNyBAQAogICAgVGhlIGNvbnN0cyBvYmplY3Qgc2hvdWxkIHN0aWxsIGJlIGluIGxpc3QgZm9ybSB0byBhbGxvdyBuZXcgY29uc3RhbnRzCiAgICB0byBiZSBhcHBlbmRlZC4KIAotICAgVG8ga2VlcCB0aGUgb3B0aW1pemVyIHNpbXBsZSwgaXQgYmFpbHMgb3V0IChkb2VzIG5vdGhpbmcpIGZvciBjb2RlIHRoYXQKLSAgIGhhcyBhIGxlbmd0aCBvdmVyIDMyLDcwMCwgYW5kIGRvZXMgbm90IGNhbGN1bGF0ZSBleHRlbmRlZCBhcmd1bWVudHMuCi0gICBUaGF0IGFsbG93cyB1cyB0byBhdm9pZCBvdmVyZmxvdyBhbmQgc2lnbiBpc3N1ZXMuIExpa2V3aXNlLCBpdCBiYWlscyB3aGVuCi0gICB0aGUgbGluZW5vIHRhYmxlIGhhcyBjb21wbGV4IGVuY29kaW5nIGZvciBnYXBzID49IDI1NS4gRVhURU5ERURfQVJHIGNhbgotICAgYXBwZWFyIGJlZm9yZSBNQUtFX0ZVTkNUSU9OOyBpbiB0aGlzIGNhc2UgYm90aCBvcGNvZGVzIGFyZSBza2lwcGVkLgotICAgRVhURU5ERURfQVJHIHByZWNlZGluZyBhbnkgb3RoZXIgb3Bjb2RlIGNhdXNlcyB0aGUgb3B0aW1pemVyIHRvIGJhaWwuCisgICBUbyBrZWVwIHRoZSBvcHRpbWl6ZXIgc2ltcGxlLCBpdCBiYWlscyB3aGVuIHRoZSBsaW5lbm8gdGFibGUgaGFzIGNvbXBsZXgKKyAgIGVuY29kaW5nIGZvciBnYXBzID49IDI1NS4KIAogICAgT3B0aW1pemF0aW9ucyBhcmUgcmVzdHJpY3RlZCB0byBzaW1wbGUgdHJhbnNmb3JtYXRpb25zIG9jY3VycmluZyB3aXRoaW4gYQogICAgc2luZ2xlIGJhc2ljIGJsb2NrLiAgQWxsIHRyYW5zZm9ybWF0aW9ucyBrZWVwIHRoZSBjb2RlIHNpemUgdGhlIHNhbWUgb3IKICAgIHNtYWxsZXIuICBGb3IgdGhvc2UgdGhhdCByZWR1Y2Ugc2l6ZSwgdGhlIGdhcHMgYXJlIGluaXRpYWxseSBmaWxsZWQgd2l0aAogICAgTk9Qcy4gIExhdGVyIHRob3NlIE5PUHMgYXJlIHJlbW92ZWQgYW5kIHRoZSBqdW1wIGFkZHJlc3NlcyByZXRhcmdldGVkIGluCi0gICBhIHNpbmdsZSBwYXNzLiAgTGluZSBudW1iZXJpbmcgaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICovCisgICBhIHNpbmdsZSBwYXNzLiAqLwogCiBQeU9iamVjdCAqCiBQeUNvZGVfT3B0aW1pemUoUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0KiBjb25zdHMsIFB5T2JqZWN0ICpuYW1lcywKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqbGluZW5vX29iaikKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqbG5vdGFiX29iaikKIHsKLSAgICBQeV9zc2l6ZV90IGksIGosIGNvZGVsZW47Ci0gICAgaW50IG5vcHMsIGgsIGFkajsKLSAgICBpbnQgdGd0LCB0Z3R0Z3QsIG9wY29kZTsKKyAgICBQeV9zc2l6ZV90IGgsIGksIG5leHRpLCBvcF9zdGFydCwgY29kZWxlbiwgdGd0OworICAgIHVuc2lnbmVkIGludCBqLCBub3BzOworICAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlLCBuZXh0b3A7CiAgICAgdW5zaWduZWQgY2hhciAqY29kZXN0ciA9IE5VTEw7Ci0gICAgdW5zaWduZWQgY2hhciAqbGluZW5vOwotICAgIGludCAqYWRkcm1hcCA9IE5VTEw7Ci0gICAgaW50IG5ld19saW5lLCBjdW1fb3JpZ19saW5lLCBsYXN0X2xpbmU7CisgICAgdW5zaWduZWQgY2hhciAqbG5vdGFiOworICAgIHVuc2lnbmVkIGludCBjdW1fb3JpZ19vZmZzZXQsIGxhc3Rfb2Zmc2V0OwogICAgIFB5X3NzaXplX3QgdGFic2l6OwogICAgIFB5T2JqZWN0ICoqY29uc3Rfc3RhY2sgPSBOVUxMOwotICAgIFB5X3NzaXplX3QgKmxvYWRfY29uc3Rfc3RhY2sgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgY29uc3Rfc3RhY2tfdG9wID0gLTE7CiAgICAgUHlfc3NpemVfdCBjb25zdF9zdGFja19zaXplID0gMDsKICAgICBpbnQgaW5fY29uc3RzID0gMDsgIC8qIHdoZXRoZXIgd2UgYXJlIGluIGEgTE9BRF9DT05TVCBzZXF1ZW5jZSAqLwpAQCAtMzczLDE4ICs0MzQsMjEgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgZ290byBleGl0RXJyb3I7CiAKLSAgICAvKiBCeXBhc3Mgb3B0aW1pemF0aW9uIHdoZW4gdGhlIGxpbmVubyB0YWJsZSBpcyB0b28gY29tcGxleCAqLwotICAgIGFzc2VydChQeUJ5dGVzX0NoZWNrKGxpbmVub19vYmopKTsKLSAgICBsaW5lbm8gPSAodW5zaWduZWQgY2hhciopUHlCeXRlc19BU19TVFJJTkcobGluZW5vX29iaik7Ci0gICAgdGFic2l6ID0gUHlCeXRlc19HRVRfU0laRShsaW5lbm9fb2JqKTsKLSAgICBpZiAobWVtY2hyKGxpbmVubywgMjU1LCB0YWJzaXopICE9IE5VTEwpCisgICAgLyogQnlwYXNzIG9wdGltaXphdGlvbiB3aGVuIHRoZSBsbm90YWIgdGFibGUgaXMgdG9vIGNvbXBsZXggKi8KKyAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhsbm90YWJfb2JqKSk7CisgICAgbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIqKVB5Qnl0ZXNfQVNfU1RSSU5HKGxub3RhYl9vYmopOworICAgIHRhYnNpeiA9IFB5Qnl0ZXNfR0VUX1NJWkUobG5vdGFiX29iaik7CisgICAgYXNzZXJ0KHRhYnNpeiA9PSAwIHx8IFB5X1JFRkNOVChsbm90YWJfb2JqKSA9PSAxKTsKKyAgICBpZiAobWVtY2hyKGxub3RhYiwgMjU1LCB0YWJzaXopICE9IE5VTEwpIHsKKyAgICAgICAgLyogMjU1IHZhbHVlIGFyZSB1c2VkIGZvciBtdWx0aWJ5dGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zICovCiAgICAgICAgIGdvdG8gZXhpdFVuY2hhbmdlZDsKKyAgICB9CisgICAgLyogTm90ZTogLTEyOCBhbmQgMTI3IHNwZWNpYWwgdmFsdWVzIGZvciBsaW5lIG51bWJlciBkZWx0YSBhcmUgb2ssCisgICAgICAgdGhlIHBlZXBob2xlIG9wdGltaXplciBkb2Vzbid0IG1vZGlmeSBsaW5lIG51bWJlcnMuICovCiAKLSAgICAvKiBBdm9pZCBzaXR1YXRpb25zIHdoZXJlIGp1bXAgcmV0YXJnZXRpbmcgY291bGQgb3ZlcmZsb3cgKi8KICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhjb2RlKSk7CiAgICAgY29kZWxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoY29kZSk7Ci0gICAgaWYgKGNvZGVsZW4gPiAzMjcwMCkKLSAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOworICAgIGFzc2VydChjb2RlbGVuICUgMiA9PSAwKTsKIAogICAgIC8qIE1ha2UgYSBtb2RpZmlhYmxlIGNvcHkgb2YgdGhlIGNvZGUgc3RyaW5nICovCiAgICAgY29kZXN0ciA9ICh1bnNpZ25lZCBjaGFyICopUHlNZW1fTWFsbG9jKGNvZGVsZW4pOwpAQCAtMzk1LDIxICs0NTksNiBAQAogICAgIGNvZGVzdHIgPSAodW5zaWduZWQgY2hhciAqKW1lbWNweShjb2Rlc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhjb2RlKSwgY29kZWxlbik7CiAKLSAgICAvKiBWZXJpZnkgdGhhdCBSRVRVUk5fVkFMVUUgdGVybWluYXRlcyB0aGUgY29kZXN0cmluZy4gICAgICBUaGlzIGFsbG93cwotICAgICAgIHRoZSB2YXJpb3VzIHRyYW5zZm9ybWF0aW9uIHBhdHRlcm5zIHRvIGxvb2sgYWhlYWQgc2V2ZXJhbAotICAgICAgIGluc3RydWN0aW9ucyB3aXRob3V0IGFkZGl0aW9uYWwgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGV5IGFyZSBub3QKLSAgICAgICBsb29raW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBjb2RlIHN0cmluZy4KLSAgICAqLwotICAgIGlmIChjb2Rlc3RyW2NvZGVsZW4tMV0gIT0gUkVUVVJOX1ZBTFVFKQotICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7Ci0KLSAgICAvKiBNYXBwaW5nIHRvIG5ldyBqdW1wIHRhcmdldHMgYWZ0ZXIgTk9QcyBhcmUgcmVtb3ZlZCAqLwotICAgIGFkZHJtYXAgPSBQeU1lbV9OZXcoaW50LCBjb2RlbGVuKTsKLSAgICBpZiAoYWRkcm1hcCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgIGdvdG8gZXhpdEVycm9yOwotICAgIH0KLQogICAgIGJsb2NrcyA9IG1hcmtibG9ja3MoY29kZXN0ciwgY29kZWxlbik7CiAgICAgaWYgKGJsb2NrcyA9PSBOVUxMKQogICAgICAgICBnb3RvIGV4aXRFcnJvcjsKQEAgLTQxNyw5ICs0NjYsMTcgQEAKIAogICAgIENPTlNUX1NUQUNLX0NSRUFURSgpOwogCi0gICAgZm9yIChpPTAgOyBpPGNvZGVsZW4gOyBpICs9IENPREVTSVpFKGNvZGVzdHJbaV0pKSB7Ci0gICAgICByZW9wdGltaXplX2N1cnJlbnQ6CisgICAgZm9yIChpPWZpbmRfb3AoY29kZXN0ciwgMCkgOyBpPGNvZGVsZW4gOyBpPW5leHRpKSB7CiAgICAgICAgIG9wY29kZSA9IGNvZGVzdHJbaV07CisgICAgICAgIG9wX3N0YXJ0ID0gaTsKKyAgICAgICAgd2hpbGUgKG9wX3N0YXJ0ID49IDIgJiYgY29kZXN0cltvcF9zdGFydC0yXSA9PSBFWFRFTkRFRF9BUkcpIHsKKyAgICAgICAgICAgIG9wX3N0YXJ0IC09IDI7CisgICAgICAgIH0KKworICAgICAgICBuZXh0aSA9IGkgKyAyOworICAgICAgICB3aGlsZSAobmV4dGkgPCBjb2RlbGVuICYmIGNvZGVzdHJbbmV4dGldID09IEVYVEVOREVEX0FSRykKKyAgICAgICAgICAgIG5leHRpICs9IDI7CisgICAgICAgIG5leHRvcCA9IG5leHRpIDwgY29kZWxlbiA/IGNvZGVzdHJbbmV4dGldIDogMDsKIAogICAgICAgICBpZiAoIWluX2NvbnN0cykgewogICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUkVTRVQoKTsKQEAgLTQzMCwxNCArNDg3LDEyIEBACiAgICAgICAgICAgICAvKiBSZXBsYWNlIFVOQVJZX05PVCBQT1BfSlVNUF9JRl9GQUxTRQogICAgICAgICAgICAgICAgd2l0aCAgICBQT1BfSlVNUF9JRl9UUlVFICovCiAgICAgICAgICAgICBjYXNlIFVOQVJZX05PVDoKLSAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzFdICE9IFBPUF9KVU1QX0lGX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgIHx8ICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSsxKTsKLSAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUE9QX0pVTVBfSUZfVFJVRTsKLSAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7Ci0gICAgICAgICAgICAgICAgY29kZXN0cltpKzNdID0gTk9QOwotICAgICAgICAgICAgICAgIGdvdG8gcmVvcHRpbWl6ZV9jdXJyZW50OworICAgICAgICAgICAgICAgIGlmIChuZXh0b3AgIT0gUE9QX0pVTVBfSUZfRkFMU0UKKyAgICAgICAgICAgICAgICAgICAgfHwgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpKzIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0LCBOT1AsIGkgLSBvcF9zdGFydCArIDIpOworICAgICAgICAgICAgICAgIGNvZGVzdHJbbmV4dGldID0gUE9QX0pVTVBfSUZfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgICAgIC8qIG5vdCBhIGlzIGIgLS0+ICBhIGlzIG5vdCBiCiAgICAgICAgICAgICAgICAgICAgbm90IGEgaW4gYiAtLT4gIGEgbm90IGluIGIKQEAgLTQ0NSw3OCArNTAwLDc5IEBACiAgICAgICAgICAgICAgICAgICAgbm90IGEgbm90IGluIGIgLS0+ICBhIGluIGIKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgY2FzZSBDT01QQVJFX09QOgotICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGogPCA2ICB8fCAgaiA+IDkgIHx8Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaSszXSAhPSBVTkFSWV9OT1QgIHx8Ci0gICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLGksNCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCAoal4xKSk7Ci0gICAgICAgICAgICAgICAgY29kZXN0cltpKzNdID0gTk9QOworICAgICAgICAgICAgICAgIGogPSBnZXRfYXJnKGNvZGVzdHIsIGkpOworICAgICAgICAgICAgICAgIGlmIChqIDwgNiB8fCBqID4gOSB8fAorICAgICAgICAgICAgICAgICAgICBuZXh0b3AgIT0gVU5BUllfTk9UIHx8CisgICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLCBvcF9zdGFydCwgaSArIDIpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjb2Rlc3RyW2krMV0gPSAoal4xKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIGkgKyAyLCBOT1AsIG5leHRpIC0gaSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAvKiBTa2lwIG92ZXIgTE9BRF9DT05TVCB0cnVlY29uc3QKLSAgICAgICAgICAgICAgICAgICBQT1BfSlVNUF9JRl9GQUxTRSB4eC4gVGhpcyBpbXByb3ZlcwotICAgICAgICAgICAgICAgICAgICJ3aGlsZSAxIiBwZXJmb3JtYW5jZS4gKi8KKyAgICAgICAgICAgICAgICAgICBQT1BfSlVNUF9JRl9GQUxTRSB4eC4gIFRoaXMgaW1wcm92ZXMKKyAgICAgICAgICAgICAgICAgICAid2hpbGUgMSIgcGVyZm9ybWFuY2UuICAqLwogICAgICAgICAgICAgY2FzZSBMT0FEX0NPTlNUOgogICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BVU0hfT1AoaSk7Ci0gICAgICAgICAgICAgICAgaiA9IEdFVEFSRyhjb2Rlc3RyLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzNdICE9IFBPUF9KVU1QX0lGX0ZBTFNFICB8fAotICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDYpICB8fAotICAgICAgICAgICAgICAgICAgICAhUHlPYmplY3RfSXNUcnVlKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGopKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSwgTk9QLCA2KTsKLSAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19SRVNFVCgpOworICAgICAgICAgICAgICAgIGlmIChuZXh0b3AgIT0gUE9QX0pVTVBfSUZfRkFMU0UgIHx8CisgICAgICAgICAgICAgICAgICAgICFJU0JBU0lDQkxPQ0soYmxvY2tzLCBvcF9zdGFydCwgaSArIDIpICB8fAorICAgICAgICAgICAgICAgICAgICAhUHlPYmplY3RfSXNUcnVlKFB5TGlzdF9HRVRfSVRFTShjb25zdHMsIGdldF9hcmcoY29kZXN0ciwgaSkpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIgKyBvcF9zdGFydCwgTk9QLCBuZXh0aSAtIG9wX3N0YXJ0ICsgMik7CisgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKDEpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICAgICAgLyogVHJ5IHRvIGZvbGQgdHVwbGVzIG9mIGNvbnN0YW50cyAoaW5jbHVkZXMgYSBjYXNlIGZvciBsaXN0cyBhbmQgc2V0cwotICAgICAgICAgICAgICAgICAgIHdoaWNoIGFyZSBvbmx5IHVzZWQgZm9yICJpbiIgYW5kICJub3QgaW4iIHRlc3RzKS4KKyAgICAgICAgICAgICAgICAvKiBUcnkgdG8gZm9sZCB0dXBsZXMgb2YgY29uc3RhbnRzIChpbmNsdWRlcyBhIGNhc2UgZm9yIGxpc3RzCisgICAgICAgICAgICAgICAgICAgYW5kIHNldHMgd2hpY2ggYXJlIG9ubHkgdXNlZCBmb3IgImluIiBhbmQgIm5vdCBpbiIgdGVzdHMpLgogICAgICAgICAgICAgICAgICAgIFNraXAgb3ZlciBCVUlMRF9TRVFOIDEgVU5QQUNLX1NFUU4gMS4KICAgICAgICAgICAgICAgICAgICBSZXBsYWNlIEJVSUxEX1NFUU4gMiBVTlBBQ0tfU0VRTiAyIHdpdGggUk9UMi4KICAgICAgICAgICAgICAgICAgICBSZXBsYWNlIEJVSUxEX1NFUU4gMyBVTlBBQ0tfU0VRTiAzIHdpdGggUk9UMyBST1QyLiAqLwogICAgICAgICAgICAgY2FzZSBCVUlMRF9UVVBMRToKICAgICAgICAgICAgIGNhc2UgQlVJTERfTElTVDoKICAgICAgICAgICAgIGNhc2UgQlVJTERfU0VUOgotICAgICAgICAgICAgICAgIGogPSBHRVRBUkcoY29kZXN0ciwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGogPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaCA9IENPTlNUX1NUQUNLX09QX0xBU1ROKGopOwotICAgICAgICAgICAgICAgIGFzc2VydCgoaCA+PSAwIHx8IENPTlNUX1NUQUNLX0xFTigpIDwgaikpOwotICAgICAgICAgICAgICAgIGlmIChoID49IDAgJiYgaiA+IDAgJiYgaiA8PSBDT05TVF9TVEFDS19MRU4oKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG9wY29kZSA9PSBCVUlMRF9UVVBMRSAmJgotICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGktaCszKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX0xJU1QgfHwgb3Bjb2RlID09IEJVSUxEX1NFVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krM109PUNPTVBBUkVfT1AgJiYKLSAgICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBpLWgrNikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoR0VUQVJHKGNvZGVzdHIsaSszKT09NiB8fAotICAgICAgICAgICAgICAgICAgICAgICBHRVRBUkcoY29kZXN0cixpKzMpPT03KSkpICYmCi0gICAgICAgICAgICAgICAgICAgIHR1cGxlX29mX2NvbnN0YW50cygmY29kZXN0cltpXSwgaiwgY29uc3RzLCBDT05TVF9TVEFDS19MQVNUTihqKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldCgmY29kZXN0cltoXSwgTk9QLCBpIC0gaCk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUChqKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaiA9IGdldF9hcmcoY29kZXN0ciwgaSk7CisgICAgICAgICAgICAgICAgaWYgKGogPiAwICYmIENPTlNUX1NUQUNLX0xFTigpID49IGopIHsKKyAgICAgICAgICAgICAgICAgICAgaCA9IGxhc3RuX2NvbnN0X3N0YXJ0KGNvZGVzdHIsIG9wX3N0YXJ0LCBqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChvcGNvZGUgPT0gQlVJTERfVFVQTEUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSVNCQVNJQ0JMT0NLKGJsb2NrcywgaCwgb3Bfc3RhcnQpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICgob3Bjb2RlID09IEJVSUxEX0xJU1QgfHwgb3Bjb2RlID09IEJVSUxEX1NFVCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChuZXh0b3A9PUNPTVBBUkVfT1AgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGVzdHJbbmV4dGkrMV09PTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbbmV4dGkrMV09PTcpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0b3AgPT0gR0VUX0lURVIpICYmIElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIGkgKyAyKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBmb2xkX3R1cGxlX29uX2NvbnN0YW50cyhjb2Rlc3RyLCBoLCBpKzIsIG9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHMsIENPTlNUX1NUQUNLX0xBU1ROKGopLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1Aoaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUFVTSF9PUChoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb2Rlc3RyW2krM10gIT0gVU5QQUNLX1NFUVVFTkNFICB8fAotICAgICAgICAgICAgICAgICAgICAhSVNCQVNJQ0JMT0NLKGJsb2NrcyxpLDYpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGogIT0gR0VUQVJHKGNvZGVzdHIsIGkrMykgfHwKKyAgICAgICAgICAgICAgICBpZiAobmV4dG9wICE9IFVOUEFDS19TRVFVRU5DRSAgfHwKKyAgICAgICAgICAgICAgICAgICAgIUlTQkFTSUNCTE9DSyhibG9ja3MsIG9wX3N0YXJ0LCBpICsgMikgfHwKKyAgICAgICAgICAgICAgICAgICAgaiAhPSBnZXRfYXJnKGNvZGVzdHIsIG5leHRpKSB8fAogICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPT0gQlVJTERfU0VUKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2ksIE5PUCwgNik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmIChqIDwgMikgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citvcF9zdGFydCwgTk9QLCBuZXh0aSAtIG9wX3N0YXJ0ICsgMik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IFJPVF9UV087Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA1KTsKKyAgICAgICAgICAgICAgICAgICAgY29kZXN0cltvcF9zdGFydF0gPSBST1RfVFdPOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0ICsgMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0ICsgMiwgTk9QLCBuZXh0aSAtIG9wX3N0YXJ0KTsKICAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUkVTRVQoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGogPT0gMykgewotICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2ldID0gUk9UX1RIUkVFOwotICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW2krMV0gPSBST1RfVFdPOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0citpKzIsIE5PUCwgNCk7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnRdID0gUk9UX1RIUkVFOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0ICsgMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0ICsgMl0gPSBST1RfVFdPOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0ICsgM10gPSAwOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0ICsgNCwgTk9QLCBuZXh0aSAtIG9wX3N0YXJ0IC0gMik7CiAgICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1JFU0VUKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgLyogRm9sZCBiaW5hcnkgb3BzIG9uIGNvbnN0YW50cy4KLSAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxIExPQURfQ09OU1QgYzIgQklOT1AgLS0+ICBMT0FEX0NPTlNUIGJpbm9wKGMxLGMyKSAqLworICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgTE9BRF9DT05TVCBjMiBCSU5PUCAtLT4gTE9BRF9DT05TVCBiaW5vcChjMSxjMikgKi8KICAgICAgICAgICAgIGNhc2UgQklOQVJZX1BPV0VSOgogICAgICAgICAgICAgY2FzZSBCSU5BUllfTVVMVElQTFk6CiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9UUlVFX0RJVklERToKQEAgLTUzMCwzNSArNTg2LDM0IEBACiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9BTkQ6CiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9YT1I6CiAgICAgICAgICAgICBjYXNlIEJJTkFSWV9PUjoKLSAgICAgICAgICAgICAgICAvKiBOT1RFOiBMT0FEX0NPTlNUIGlzIHNhdmVkIGF0IGBpLTJgIHNpbmNlIGl0IGhhcyBhbiBhcmcKLSAgICAgICAgICAgICAgICAgICB3aGlsZSBCSU5PUCBoYXNuJ3QgKi8KLSAgICAgICAgICAgICAgICBoID0gQ09OU1RfU1RBQ0tfT1BfTEFTVE4oMik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KChoID49IDAgfHwgQ09OU1RfU1RBQ0tfTEVOKCkgPCAyKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGggPj0gMCAmJgotICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBpLWgrMSkgICYmCi0gICAgICAgICAgICAgICAgICAgIGZvbGRfYmlub3BzX29uX2NvbnN0YW50cygmY29kZXN0cltpXSwgY29uc3RzLCBDT05TVF9TVEFDS19MQVNUTigyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaSAtPSAyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJmNvZGVzdHJbaF0sIE5PUCwgaSAtIGgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY29kZXN0cltpXSA9PSBMT0FEX0NPTlNUKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUE9QKDIpOwotICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGkpOworICAgICAgICAgICAgICAgIGlmIChDT05TVF9TVEFDS19MRU4oKSA8IDIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGggPSBsYXN0bl9jb25zdF9zdGFydChjb2Rlc3RyLCBvcF9zdGFydCwgMik7CisgICAgICAgICAgICAgICAgaWYgKElTQkFTSUNCTE9DSyhibG9ja3MsIGgsIG9wX3N0YXJ0KSkgeworICAgICAgICAgICAgICAgICAgICBoID0gZm9sZF9iaW5vcHNfb25fY29uc3RhbnRzKGNvZGVzdHIsIGgsIGkrMiwgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cywgQ09OU1RfU1RBQ0tfTEFTVE4oMikpOworICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMik7CisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICAgICAgLyogRm9sZCB1bmFyeSBvcHMgb24gY29uc3RhbnRzLgotICAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgYzEgIFVOQVJZX09QIC0tPiAgICAgICAgICAgICAgICAgIExPQURfQ09OU1QgdW5hcnlfb3AoYykgKi8KKyAgICAgICAgICAgICAgICAgICBMT0FEX0NPTlNUIGMxICBVTkFSWV9PUCAtLT4gTE9BRF9DT05TVCB1bmFyeV9vcChjKSAqLwogICAgICAgICAgICAgY2FzZSBVTkFSWV9ORUdBVElWRToKICAgICAgICAgICAgIGNhc2UgVU5BUllfSU5WRVJUOgogICAgICAgICAgICAgY2FzZSBVTkFSWV9QT1NJVElWRToKLSAgICAgICAgICAgICAgICBoID0gQ09OU1RfU1RBQ0tfT1BfTEFTVE4oMSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0KChoID49IDAgfHwgQ09OU1RfU1RBQ0tfTEVOKCkgPCAxKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGggPj0gMCAmJgotICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBpLWgrMSkgICYmCi0gICAgICAgICAgICAgICAgICAgIGZvbGRfdW5hcnlvcHNfb25fY29uc3RhbnRzKCZjb2Rlc3RyW2ktM10sIGNvbnN0cywgQ09OU1RfU1RBQ0tfVE9QKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNvZGVzdHJbaV0gPT0gTE9BRF9DT05TVCk7Ci0gICAgICAgICAgICAgICAgICAgIENPTlNUX1NUQUNLX1BPUCgxKTsKLSAgICAgICAgICAgICAgICAgICAgQ09OU1RfU1RBQ0tfUFVTSF9PUChpKTsKKyAgICAgICAgICAgICAgICBpZiAoQ09OU1RfU1RBQ0tfTEVOKCkgPCAxKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBoID0gbGFzdG5fY29uc3Rfc3RhcnQoY29kZXN0ciwgb3Bfc3RhcnQsIDEpOworICAgICAgICAgICAgICAgIGlmIChJU0JBU0lDQkxPQ0soYmxvY2tzLCBoLCBvcF9zdGFydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaCA9IGZvbGRfdW5hcnlvcHNfb25fY29uc3RhbnRzKGNvZGVzdHIsIGgsIGkrMiwgb3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzLCAqQ09OU1RfU1RBQ0tfTEFTVE4oMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QT1AoMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDT05TVF9TVEFDS19QVVNIX09QKGgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01NzMsMjUgKzYyOCwyNCBAQAogICAgICAgICAgICAgICAgICAgIHg6SlVNUF9JRl9GQUxTRV9PUl9QT1AgeSAgIHk6SlVNUF9JRl9GQUxTRV9PUl9QT1AgegogICAgICAgICAgICAgICAgICAgICAgIC0tPiAgeDpKVU1QX0lGX0ZBTFNFX09SX1BPUCB6CiAgICAgICAgICAgICAgICAgICAgeDpKVU1QX0lGX0ZBTFNFX09SX1BPUCB5ICAgeTpKVU1QX0lGX1RSVUVfT1JfUE9QIHoKLSAgICAgICAgICAgICAgICAgICAgICAtLT4gIHg6UE9QX0pVTVBfSUZfRkFMU0UgeSszCi0gICAgICAgICAgICAgICAgICAgd2hlcmUgeSszIGlzIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIHNlY29uZCB0ZXN0LgorICAgICAgICAgICAgICAgICAgICAgIC0tPiAgeDpQT1BfSlVNUF9JRl9GQUxTRSB5KzIKKyAgICAgICAgICAgICAgICAgICB3aGVyZSB5KzIgaXMgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgc2Vjb25kIHRlc3QuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9GQUxTRV9PUl9QT1A6CiAgICAgICAgICAgICBjYXNlIEpVTVBfSUZfVFJVRV9PUl9QT1A6Ci0gICAgICAgICAgICAgICAgdGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBoID0gZ2V0X2FyZyhjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICB0Z3QgPSBmaW5kX29wKGNvZGVzdHIsIGgpOworCiAgICAgICAgICAgICAgICAgaiA9IGNvZGVzdHJbdGd0XTsKICAgICAgICAgICAgICAgICBpZiAoQ09ORElUSU9OQUxfSlVNUChqKSkgewogICAgICAgICAgICAgICAgICAgICAvKiBOT1RFOiBhbGwgcG9zc2libGUganVtcHMgaGVyZSBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGUhICovCiAgICAgICAgICAgICAgICAgICAgIGlmIChKVU1QU19PTl9UUlVFKGopID09IEpVTVBTX09OX1RSVUUob3Bjb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHNlY29uZCBqdW1wIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VuIGlmZiB0aGUgZmlyc3QgaXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICB0Z3R0Z3QgPSBHRVRKVU1QVEdUKGNvZGVzdHIsIHRndCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCBvcGNvZGUgaW5oZXJpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyB0YXJnZXQncyBzdGFjayBiZWhhdmlvdXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBqOwotICAgICAgICAgICAgICAgICAgICAgICAgU0VUQVJHKGNvZGVzdHIsIGksIHRndHRndCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlb3B0aW1pemVfY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VuIGlmZiB0aGUgZmlyc3QgaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY3VycmVudCBvcGNvZGUgaW5oZXJpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyB0YXJnZXQncyBzdGFjayBlZmZlY3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBzZXRfYXJnKGNvZGVzdHIsIGksIGdldF9hcmcoY29kZXN0ciwgdGd0KSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgc2Vjb25kIGp1bXAgaXMgbm90IHRha2VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZmlyc3QgaXMgKHNvIGp1bXAgcGFzdApAQCAtNjAwLDEyICs2NTQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZXkncmUgbm90IHRha2VuIChzbyBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCBqdW1wIHRvIHBvcCBpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50IHdoZW4gaXQncyB0YWtlbikuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSlVNUFNfT05fVFJVRShvcGNvZGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9UUlVFOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBQT1BfSlVNUF9JRl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCAodGd0ICsgMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZW9wdGltaXplX2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoID0gc2V0X2FyZyhjb2Rlc3RyLCBpLCB0Z3QgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBvcGNvZGUgPT0gSlVNUF9JRl9UUlVFX09SX1BPUCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9QX0pVTVBfSUZfVFJVRSA6IFBPUF9KVU1QX0lGX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGkgPSBoOworICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cltuZXh0aV0gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KQEAgLTYyMiw3MyArNjc5LDczIEBACiAgICAgICAgICAgICBjYXNlIFNFVFVQX0ZJTkFMTFk6CiAgICAgICAgICAgICBjYXNlIFNFVFVQX1dJVEg6CiAgICAgICAgICAgICBjYXNlIFNFVFVQX0FTWU5DX1dJVEg6Ci0gICAgICAgICAgICAgICAgdGd0ID0gR0VUSlVNUFRHVChjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICBoID0gR0VUSlVNUFRHVChjb2Rlc3RyLCBpKTsKKyAgICAgICAgICAgICAgICB0Z3QgPSBmaW5kX29wKGNvZGVzdHIsIGgpOwogICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgSlVNUF8qIHRvIGEgUkVUVVJOIGludG8ganVzdCBhIFJFVFVSTiAqLwogICAgICAgICAgICAgICAgIGlmIChVTkNPTkRJVElPTkFMX0pVTVAob3Bjb2RlKSAmJgogICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW3RndF0gPT0gUkVUVVJOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbaV0gPSBSRVRVUk5fVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJbb3Bfc3RhcnRdID0gUkVUVVJOX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICBjb2Rlc3RyW29wX3N0YXJ0ICsgMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoY29kZXN0ciArIG9wX3N0YXJ0ICsgMiwgTk9QLCBpIC0gb3Bfc3RhcnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVU5DT05ESVRJT05BTF9KVU1QKGNvZGVzdHJbdGd0XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBKVU1QX0ZPUldBUkQpIHsgLyogSk1QX0FCUyBjYW4gZ28gYmFja3dhcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBKVU1QX0FCU09MVVRFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFBQlNPTFVURV9KVU1QKG9wY29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoUHlfc3NpemVfdClqIDwgaSArIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgIC8qIE5vIGJhY2t3YXJkIHJlbGF0aXZlIGp1bXBzICovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBqIC09IGkgKyAyOyAgICAgICAgICAvKiBDYWxjIHJlbGF0aXZlIGp1bXAgYWRkciAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvcHlfb3BfYXJnKGNvZGVzdHIsIG9wX3N0YXJ0LCBvcGNvZGUsIGosIGkrMik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghVU5DT05ESVRJT05BTF9KVU1QKGNvZGVzdHJbdGd0XSkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHRndHRndCA9IEdFVEpVTVBUR1QoY29kZXN0ciwgdGd0KTsKLSAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IEpVTVBfRk9SV0FSRCkgLyogSk1QX0FCUyBjYW4gZ28gYmFja3dhcmRzICovCi0gICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IEpVTVBfQUJTT0xVVEU7Ci0gICAgICAgICAgICAgICAgaWYgKCFBQlNPTFVURV9KVU1QKG9wY29kZSkpCi0gICAgICAgICAgICAgICAgICAgIHRndHRndCAtPSBpICsgMzsgICAgIC8qIENhbGMgcmVsYXRpdmUganVtcCBhZGRyICovCi0gICAgICAgICAgICAgICAgaWYgKHRndHRndCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYmFja3dhcmQgcmVsYXRpdmUganVtcHMgKi8KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY29kZXN0cltpXSA9IG9wY29kZTsKLSAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgdGd0dGd0KTsKICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgY2FzZSBFWFRFTkRFRF9BUkc6Ci0gICAgICAgICAgICAgICAgaWYgKGNvZGVzdHJbaSszXSAhPSBNQUtFX0ZVTkNUSU9OKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRVbmNoYW5nZWQ7Ci0gICAgICAgICAgICAgICAgLyogZG9uJ3QgdmlzaXQgTUFLRV9GVU5DVElPTiBhcyBHRVRBUkcgd2lsbCBiZSB3cm9uZyAqLwotICAgICAgICAgICAgICAgIGkgKz0gMzsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIC8qIFJlcGxhY2UgUkVUVVJOIExPQURfQ09OU1QgTm9uZSBSRVRVUk4gd2l0aCBqdXN0IFJFVFVSTiAqLwotICAgICAgICAgICAgICAgIC8qIFJlbW92ZSB1bnJlYWNoYWJsZSBKVU1QcyBhZnRlciBSRVRVUk4gKi8KKyAgICAgICAgICAgICAgICAvKiBSZW1vdmUgdW5yZWFjaGFibGUgb3BzIGFmdGVyIFJFVFVSTiAqLwogICAgICAgICAgICAgY2FzZSBSRVRVUk5fVkFMVUU6Ci0gICAgICAgICAgICAgICAgaWYgKGkrNCA+PSBjb2RlbGVuKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZXN0cltpKzRdID09IFJFVFVSTl9WQUxVRSAmJgotICAgICAgICAgICAgICAgICAgICBJU0JBU0lDQkxPQ0soYmxvY2tzLGksNSkpCi0gICAgICAgICAgICAgICAgICAgIG1lbXNldChjb2Rlc3RyK2krMSwgTk9QLCA0KTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChVTkNPTkRJVElPTkFMX0pVTVAoY29kZXN0cltpKzFdKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIElTQkFTSUNCTE9DSyhibG9ja3MsaSw0KSkKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIraSsxLCBOT1AsIDMpOworICAgICAgICAgICAgICAgIGggPSBpICsgMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaCArIDIgPCBjb2RlbGVuICYmIElTQkFTSUNCTE9DSyhibG9ja3MsIGksIGggKyAyKSkgeworICAgICAgICAgICAgICAgICAgICBoICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoID4gaSArIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVzdHIgKyBpICsgMiwgTk9QLCBoIC0gaSk7CisgICAgICAgICAgICAgICAgICAgIG5leHRpID0gZmluZF9vcChjb2Rlc3RyLCBoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBGaXh1cCBsaW5lbm90YWIgKi8KLSAgICBmb3IgKGk9MCwgbm9wcz0wIDsgaTxjb2RlbGVuIDsgaSArPSBDT0RFU0laRShjb2Rlc3RyW2ldKSkgeworICAgIC8qIEZpeHVwIGxub3RhYiAqLworICAgIGZvciAoaT0wLCBub3BzPTAgOyBpPGNvZGVsZW4gOyBpICs9IDIpIHsKICAgICAgICAgYXNzZXJ0KGkgLSBub3BzIDw9IElOVF9NQVgpOwotICAgICAgICBhZGRybWFwW2ldID0gKGludCkoaSAtIG5vcHMpOworICAgICAgICAvKiBvcmlnaW5hbCBjb2RlIG9mZnNldCA9PiBuZXcgY29kZSBvZmZzZXQgKi8KKyAgICAgICAgYmxvY2tzW2ldID0gaSAtIG5vcHM7CiAgICAgICAgIGlmIChjb2Rlc3RyW2ldID09IE5PUCkKLSAgICAgICAgICAgIG5vcHMrKzsKKyAgICAgICAgICAgIG5vcHMgKz0gMjsKICAgICB9Ci0gICAgY3VtX29yaWdfbGluZSA9IDA7Ci0gICAgbGFzdF9saW5lID0gMDsKKyAgICBjdW1fb3JpZ19vZmZzZXQgPSAwOworICAgIGxhc3Rfb2Zmc2V0ID0gMDsKICAgICBmb3IgKGk9MCA7IGkgPCB0YWJzaXogOyBpKz0yKSB7Ci0gICAgICAgIGN1bV9vcmlnX2xpbmUgKz0gbGluZW5vW2ldOwotICAgICAgICBuZXdfbGluZSA9IGFkZHJtYXBbY3VtX29yaWdfbGluZV07Ci0gICAgICAgIGFzc2VydCAobmV3X2xpbmUgLSBsYXN0X2xpbmUgPCAyNTUpOwotICAgICAgICBsaW5lbm9baV0gPSgodW5zaWduZWQgY2hhcikobmV3X2xpbmUgLSBsYXN0X2xpbmUpKTsKLSAgICAgICAgbGFzdF9saW5lID0gbmV3X2xpbmU7CisgICAgICAgIHVuc2lnbmVkIGludCBvZmZzZXRfZGVsdGEsIG5ld19vZmZzZXQ7CisgICAgICAgIGN1bV9vcmlnX29mZnNldCArPSBsbm90YWJbaV07CisgICAgICAgIGFzc2VydCgoY3VtX29yaWdfb2Zmc2V0ICYgMSkgPT0gMCk7CisgICAgICAgIG5ld19vZmZzZXQgPSBibG9ja3NbY3VtX29yaWdfb2Zmc2V0XTsKKyAgICAgICAgb2Zmc2V0X2RlbHRhID0gbmV3X29mZnNldCAtIGxhc3Rfb2Zmc2V0OworICAgICAgICBhc3NlcnQob2Zmc2V0X2RlbHRhIDw9IDI1NSk7CisgICAgICAgIGxub3RhYltpXSA9ICh1bnNpZ25lZCBjaGFyKW9mZnNldF9kZWx0YTsKKyAgICAgICAgbGFzdF9vZmZzZXQgPSBuZXdfb2Zmc2V0OwogICAgIH0KIAogICAgIC8qIFJlbW92ZSBOT1BzIGFuZCBmaXh1cCBqdW1wIHRhcmdldHMgKi8KLSAgICBmb3IgKGk9MCwgaD0wIDsgaTxjb2RlbGVuIDsgKSB7CisgICAgZm9yIChvcF9zdGFydD0wLCBpPTAsIGg9MCA7IGk8Y29kZWxlbiA7IGkrPTIsIG9wX3N0YXJ0PWkpIHsKKyAgICAgICAgaiA9IGNvZGVzdHJbaSsxXTsKKyAgICAgICAgd2hpbGUgKGNvZGVzdHJbaV0gPT0gRVhURU5ERURfQVJHKSB7CisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICBqID0gajw8OCB8IGNvZGVzdHJbaSsxXTsKKyAgICAgICAgfQogICAgICAgICBvcGNvZGUgPSBjb2Rlc3RyW2ldOwogICAgICAgICBzd2l0Y2ggKG9wY29kZSkgewotICAgICAgICAgICAgY2FzZSBOT1A6Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSBOT1A6Y29udGludWU7CiAKICAgICAgICAgICAgIGNhc2UgSlVNUF9BQlNPTFVURToKICAgICAgICAgICAgIGNhc2UgQ09OVElOVUVfTE9PUDoKQEAgLTY5Niw4ICs3NTMsNyBAQAogICAgICAgICAgICAgY2FzZSBQT1BfSlVNUF9JRl9UUlVFOgogICAgICAgICAgICAgY2FzZSBKVU1QX0lGX0ZBTFNFX09SX1BPUDoKICAgICAgICAgICAgIGNhc2UgSlVNUF9JRl9UUlVFX09SX1BPUDoKLSAgICAgICAgICAgICAgICBqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSldOwotICAgICAgICAgICAgICAgIFNFVEFSRyhjb2Rlc3RyLCBpLCBqKTsKKyAgICAgICAgICAgICAgICBqID0gYmxvY2tzW2pdOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEZPUl9JVEVSOgpAQCAtNzA3LDM0ICs3NjMsMzEgQEAKICAgICAgICAgICAgIGNhc2UgU0VUVVBfRklOQUxMWToKICAgICAgICAgICAgIGNhc2UgU0VUVVBfV0lUSDoKICAgICAgICAgICAgIGNhc2UgU0VUVVBfQVNZTkNfV0lUSDoKLSAgICAgICAgICAgICAgICBqID0gYWRkcm1hcFtHRVRBUkcoY29kZXN0ciwgaSkgKyBpICsgM10gLSBhZGRybWFwW2ldIC0gMzsKLSAgICAgICAgICAgICAgICBTRVRBUkcoY29kZXN0ciwgaSwgaik7CisgICAgICAgICAgICAgICAgaiA9IGJsb2Nrc1tqICsgaSArIDJdIC0gYmxvY2tzW2ldIC0gMjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBhZGogPSBDT0RFU0laRShvcGNvZGUpOwotICAgICAgICB3aGlsZSAoYWRqLS0pCi0gICAgICAgICAgICBjb2Rlc3RyW2grK10gPSBjb2Rlc3RyW2krK107CisgICAgICAgIG5leHRpID0gaSAtIG9wX3N0YXJ0ICsgMjsKKyAgICAgICAgaWYgKGluc3Ryc2l6ZShqKSA+IG5leHRpKQorICAgICAgICAgICAgZ290byBleGl0VW5jaGFuZ2VkOworICAgICAgICAvKiBJZiBpbnN0cnNpemUoaikgPCBuZXh0aSwgd2UnbGwgZW1pdCBFWFRFTkRFRF9BUkcgMCAqLworICAgICAgICB3cml0ZV9vcF9hcmcoY29kZXN0ciArIGgsIG9wY29kZSwgaiwgbmV4dGkpOworICAgICAgICBoICs9IG5leHRpOwogICAgIH0KLSAgICBhc3NlcnQoaCArIG5vcHMgPT0gY29kZWxlbik7CisgICAgYXNzZXJ0KGggKyAoUHlfc3NpemVfdClub3BzID09IGNvZGVsZW4pOwogCi0gICAgY29kZSA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKiljb2Rlc3RyLCBoKTsKICAgICBDT05TVF9TVEFDS19ERUxFVEUoKTsKLSAgICBQeU1lbV9GcmVlKGFkZHJtYXApOwotICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CiAgICAgUHlNZW1fRnJlZShibG9ja3MpOworICAgIGNvZGUgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopY29kZXN0ciwgaCk7CisgICAgUHlNZW1fRnJlZShjb2Rlc3RyKTsKICAgICByZXR1cm4gY29kZTsKIAogIGV4aXRFcnJvcjoKICAgICBjb2RlID0gTlVMTDsKIAogIGV4aXRVbmNoYW5nZWQ6Ci0gICAgQ09OU1RfU1RBQ0tfREVMRVRFKCk7Ci0gICAgaWYgKGJsb2NrcyAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGJsb2Nrcyk7Ci0gICAgaWYgKGFkZHJtYXAgIT0gTlVMTCkKLSAgICAgICAgUHlNZW1fRnJlZShhZGRybWFwKTsKLSAgICBpZiAoY29kZXN0ciAhPSBOVUxMKQotICAgICAgICBQeU1lbV9GcmVlKGNvZGVzdHIpOwogICAgIFB5X1hJTkNSRUYoY29kZSk7CisgICAgQ09OU1RfU1RBQ0tfREVMRVRFKCk7CisgICAgUHlNZW1fRnJlZShibG9ja3MpOworICAgIFB5TWVtX0ZyZWUoY29kZXN0cik7CiAgICAgcmV0dXJuIGNvZGU7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcHlsaWZlY3ljbGUuYyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCmluZGV4IGNlNTI5OTAuLjJkMmRjYmEgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWxpZmVjeWNsZS5jCisrKyBiL1B5dGhvbi9weWxpZmVjeWNsZS5jCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogR2xvYmFsIGluaXRpYWxpemF0aW9ucy4gIENhbiBiZSB1bmRvbmUgYnkgUHlfRmluYWxpemUoKS4gIERvbid0Ci0gICBjYWxsIHRoaXMgdHdpY2Ugd2l0aG91dCBhbiBpbnRlcnZlbmluZyBQeV9GaW5hbGl6ZSgpIGNhbGwuICBXaGVuCisvKiBHbG9iYWwgaW5pdGlhbGl6YXRpb25zLiAgQ2FuIGJlIHVuZG9uZSBieSBQeV9GaW5hbGl6ZUV4KCkuICBEb24ndAorICAgY2FsbCB0aGlzIHR3aWNlIHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgUHlfRmluYWxpemVFeCgpIGNhbGwuICBXaGVuCiAgICBpbml0aWFsaXphdGlvbnMgZmFpbCwgYSBmYXRhbCBlcnJvciBpcyBpc3N1ZWQgYW5kIHRoZSBmdW5jdGlvbiBkb2VzCiAgICBub3QgcmV0dXJuLiAgT24gcmV0dXJuLCB0aGUgZmlyc3QgdGhyZWFkIGFuZCBpbnRlcnByZXRlciBzdGF0ZSBoYXZlCiAgICBiZWVuIGNyZWF0ZWQuCkBAIC0yMjMsNiArMjIzLDggQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBnZXRfY29kZWNfbmFtZShjb2Rlc2V0KTsKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pCisgICAgcmV0dXJuIGdldF9jb2RlY19uYW1lKCJVVEYtOCIpOwogI2Vsc2UKICAgICBQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOwogICAgIHJldHVybiBOVUxMOwpAQCAtMzI3LDExICszMjksMTEgQEAKICAgICAodm9pZCkgUHlUaHJlYWRTdGF0ZV9Td2FwKHRzdGF0ZSk7CiAKICNpZmRlZiBXSVRIX1RIUkVBRAotICAgIC8qIFdlIGNhbid0IGNhbGwgX1B5RXZhbF9GaW5pVGhyZWFkcygpIGluIFB5X0ZpbmFsaXplIGJlY2F1c2UKKyAgICAvKiBXZSBjYW4ndCBjYWxsIF9QeUV2YWxfRmluaVRocmVhZHMoKSBpbiBQeV9GaW5hbGl6ZUV4IGJlY2F1c2UKICAgICAgICBkZXN0cm95aW5nIHRoZSBHSUwgbWlnaHQgZmFpbCB3aGVuIGl0IGlzIGJlaW5nIHJlZmVyZW5jZWQgZnJvbQogICAgICAgIGFub3RoZXIgcnVubmluZyB0aHJlYWQgKHNlZSBpc3N1ZSAjOTkwMSkuCiAgICAgICAgSW5zdGVhZCB3ZSBkZXN0cm95IHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgR0lMIGhlcmUsIHdoaWNoIGVuc3VyZXMKLSAgICAgICB0aGF0IHdlIGNhbiBjYWxsIFB5X0luaXRpYWxpemUgLyBQeV9GaW5hbGl6ZSBtdWx0aXBsZSB0aW1lcy4gKi8KKyAgICAgICB0aGF0IHdlIGNhbiBjYWxsIFB5X0luaXRpYWxpemUgLyBQeV9GaW5hbGl6ZUV4IG11bHRpcGxlIHRpbWVzLiAqLwogICAgIF9QeUV2YWxfRmluaVRocmVhZHMoKTsKIAogICAgIC8qIEF1dG8tdGhyZWFkLXN0YXRlIEFQSSAqLwpAQCAtNDc3LDI4ICs0NzksMzUgQEAKICAgICByZXR1cm4gciA+IDA7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBmbHVzaF9zdGRfZmlsZXModm9pZCkKIHsKICAgICBQeU9iamVjdCAqZm91dCA9IF9QeVN5c19HZXRPYmplY3RJZCgmUHlJZF9zdGRvdXQpOwogICAgIFB5T2JqZWN0ICpmZXJyID0gX1B5U3lzX0dldE9iamVjdElkKCZQeUlkX3N0ZGVycik7CiAgICAgUHlPYmplY3QgKnRtcDsKKyAgICBpbnQgc3RhdHVzID0gMDsKIAogICAgIGlmIChmb3V0ICE9IE5VTEwgJiYgZm91dCAhPSBQeV9Ob25lICYmICFmaWxlX2lzX2Nsb3NlZChmb3V0KSkgewogICAgICAgICB0bXAgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGZvdXQsICZQeUlkX2ZsdXNoLCAiIik7Ci0gICAgICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoZm91dCk7CisgICAgICAgICAgICBzdGF0dXMgPSAtMTsKKyAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKICAgICB9CiAKICAgICBpZiAoZmVyciAhPSBOVUxMICYmIGZlcnIgIT0gUHlfTm9uZSAmJiAhZmlsZV9pc19jbG9zZWQoZmVycikpIHsKICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0NhbGxNZXRob2RJZChmZXJyLCAmUHlJZF9mbHVzaCwgIiIpOwotICAgICAgICBpZiAodG1wID09IE5VTEwpCisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IC0xOworICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOwogICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qIFVuZG8gdGhlIGVmZmVjdCBvZiBQeV9Jbml0aWFsaXplKCkuCkBAIC01MTUsMTQgKzUyNCwxNSBAQAogCiAqLwogCi12b2lkCi1QeV9GaW5hbGl6ZSh2b2lkKQoraW50CitQeV9GaW5hbGl6ZUV4KHZvaWQpCiB7CiAgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworICAgIGludCBzdGF0dXMgPSAwOwogCiAgICAgaWYgKCFpbml0aWFsaXplZCkKLSAgICAgICAgcmV0dXJuOworICAgICAgICByZXR1cm4gc3RhdHVzOwogCiAgICAgd2FpdF9mb3JfdGhyZWFkX3NodXRkb3duKCk7CiAKQEAgLTU0Nyw3ICs1NTcsOSBAQAogICAgIGluaXRpYWxpemVkID0gMDsKIAogICAgIC8qIEZsdXNoIHN5cy5zdGRvdXQgYW5kIHN5cy5zdGRlcnIgKi8KLSAgICBmbHVzaF9zdGRfZmlsZXMoKTsKKyAgICBpZiAoZmx1c2hfc3RkX2ZpbGVzKCkgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KIAogICAgIC8qIERpc2FibGUgc2lnbmFsIGhhbmRsaW5nICovCiAgICAgUHlPU19GaW5pSW50ZXJydXB0cygpOwpAQCAtNTc2LDcgKzU4OCw5IEBACiAgICAgUHlJbXBvcnRfQ2xlYW51cCgpOwogCiAgICAgLyogRmx1c2ggc3lzLnN0ZG91dCBhbmQgc3lzLnN0ZGVyciAoYWdhaW4sIGluIGNhc2UgbW9yZSB3YXMgcHJpbnRlZCkgKi8KLSAgICBmbHVzaF9zdGRfZmlsZXMoKTsKKyAgICBpZiAoZmx1c2hfc3RkX2ZpbGVzKCkgPCAwKSB7CisgICAgICAgIHN0YXR1cyA9IC0xOworICAgIH0KIAogICAgIC8qIENvbGxlY3QgZmluYWwgZ2FyYmFnZS4gIFRoaXMgZGlzcG9zZXMgb2YgY3ljbGVzIGNyZWF0ZWQgYnkKICAgICAgKiBjbGFzcyBkZWZpbml0aW9ucywgZm9yIGV4YW1wbGUuCkBAIC02MTIsNyArNjI2LDcgQEAKIAogICAgIC8qIERlYnVnZ2luZyBzdHVmZiAqLwogI2lmZGVmIENPVU5UX0FMTE9DUwotICAgIGR1bXBfY291bnRzKHN0ZG91dCk7CisgICAgZHVtcF9jb3VudHMoc3RkZXJyKTsKICNlbmRpZgogICAgIC8qIGR1bXAgaGFzaCBzdGF0cyAqLwogICAgIF9QeUhhc2hfRmluaSgpOwpAQCAtNjgwLDYgKzY5NCw3IEBACiAKICAgICAvKiBEZWxldGUgY3VycmVudCB0aHJlYWQuIEFmdGVyIHRoaXMsIG1hbnkgQyBBUEkgY2FsbHMgYmVjb21lIGNyYXNoeS4gKi8KICAgICBQeVRocmVhZFN0YXRlX1N3YXAoTlVMTCk7CisKICAgICBQeUludGVycHJldGVyU3RhdGVfRGVsZXRlKGludGVycCk7CiAKICNpZmRlZiBQeV9UUkFDRV9SRUZTCkBAIC02OTAsMTIgKzcwNSwyMiBAQAogICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTkRVTVBSRUZTIikpCiAgICAgICAgIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhzdGRlcnIpOwogI2VuZGlmIC8qIFB5X1RSQUNFX1JFRlMgKi8KLSNpZmRlZiBQWU1BTExPQ19ERUJVRwotICAgIGlmIChQeV9HRVRFTlYoIlBZVEhPTk1BTExPQ1NUQVRTIikpCi0gICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHN0ZGVycik7CisjaWZkZWYgV0lUSF9QWU1BTExPQworICAgIGlmIChfUHlNZW1fUHltYWxsb2NFbmFibGVkKCkpIHsKKyAgICAgICAgY2hhciAqb3B0ID0gUHlfR0VURU5WKCJQWVRIT05NQUxMT0NTVEFUUyIpOworICAgICAgICBpZiAob3B0ICE9IE5VTEwgJiYgKm9wdCAhPSAnXDAnKQorICAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jU3RhdHMoc3RkZXJyKTsKKyAgICB9CiAjZW5kaWYKIAogICAgIGNhbGxfbGxfZXhpdGZ1bmNzKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZAorUHlfRmluYWxpemUodm9pZCkKK3sKKyAgICBQeV9GaW5hbGl6ZUV4KCk7CiB9CiAKIC8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbnRlcnByZXRlciBhbmQgdGhyZWFkLCBhbmQgcmV0dXJuIHRoZQpAQCAtNzIxLDYgKzc0NiwxMiBAQAogICAgIGlmICghaW5pdGlhbGl6ZWQpCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIlB5X05ld0ludGVycHJldGVyOiBjYWxsIFB5X0luaXRpYWxpemUgZmlyc3QiKTsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgLyogSXNzdWUgIzEwOTE1LCAjMTU3NTE6IFRoZSBHSUwgQVBJIGRvZXNuJ3Qgd29yayB3aXRoIG11bHRpcGxlCisgICAgICAgaW50ZXJwcmV0ZXJzOiBkaXNhYmxlIFB5R0lMU3RhdGVfQ2hlY2soKS4gKi8KKyAgICBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkID0gMDsKKyNlbmRpZgorCiAgICAgaW50ZXJwID0gUHlJbnRlcnByZXRlclN0YXRlX05ldygpOwogICAgIGlmIChpbnRlcnAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC03NzcsNyArODA4LDcgQEAKIAogICAgICAgICBpZiAoaW5pdHN0ZGlvKCkgPCAwKQogICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigKLSAgICAgICAgICAgICJQeV9Jbml0aWFsaXplOiBjYW4ndCBpbml0aWFsaXplIHN5cyBzdGFuZGFyZCBzdHJlYW1zIik7CisgICAgICAgICAgICAgICAgIlB5X0luaXRpYWxpemU6IGNhbid0IGluaXRpYWxpemUgc3lzIHN0YW5kYXJkIHN0cmVhbXMiKTsKICAgICAgICAgaW5pdG1haW4oaW50ZXJwKTsKICAgICAgICAgaWYgKCFQeV9Ob1NpdGVGbGFnKQogICAgICAgICAgICAgaW5pdHNpdGUoKTsKQEAgLTgwMyw3ICs4MzQsNyBAQAogICAgZnJhbWVzLCBhbmQgdGhhdCBpdCBpcyBpdHMgaW50ZXJwcmV0ZXIncyBvbmx5IHJlbWFpbmluZyB0aHJlYWQuCiAgICBJdCBpcyBhIGZhdGFsIGVycm9yIHRvIHZpb2xhdGUgdGhlc2UgY29uc3RyYWludHMuCiAKLSAgIChQeV9GaW5hbGl6ZSgpIGRvZXNuJ3QgaGF2ZSB0aGVzZSBjb25zdHJhaW50cyAtLSBpdCB6YXBzCisgICAoUHlfRmluYWxpemVFeCgpIGRvZXNuJ3QgaGF2ZSB0aGVzZSBjb25zdHJhaW50cyAtLSBpdCB6YXBzCiAgICBldmVyeXRoaW5nLCByZWdhcmRsZXNzLikKIAogICAgTG9ja2luZzogYXMgYWJvdmUuCkBAIC05NzIsNiArMTAwMyw5IEBACiAgICAgaWYgKGZkIDwgMCB8fCAhX1B5VmVyaWZ5X2ZkKGZkKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgX1B5X0JFR0lOX1NVUFBSRVNTX0lQSAorICAgIC8qIFByZWZlciBkdXAoKSBvdmVyIGZzdGF0KCkuIGZzdGF0KCkgY2FuIHJlcXVpcmUgaW5wdXQvb3V0cHV0IHdoZXJlYXMKKyAgICAgICBkdXAoKSBkb2Vzbid0LCB0aGVyZSBpcyBhIGxvdyByaXNrIG9mIEVNRklMRS9FTkZJTEUgYXQgUHl0aG9uCisgICAgICAgc3RhcnR1cC4gKi8KICAgICBmZDIgPSBkdXAoZmQpOwogICAgIGlmIChmZDIgPj0gMCkKICAgICAgICAgY2xvc2UoZmQyKTsKQEAgLTk4Miw4ICsxMDE2LDggQEAKIC8qIHJldHVybnMgUHlfTm9uZSBpZiB0aGUgZmQgaXMgbm90IHZhbGlkICovCiBzdGF0aWMgUHlPYmplY3QqCiBjcmVhdGVfc3RkaW8oUHlPYmplY3QqIGlvLAotICAgIGludCBmZCwgaW50IHdyaXRlX21vZGUsIGNoYXIqIG5hbWUsCi0gICAgY2hhciogZW5jb2RpbmcsIGNoYXIqIGVycm9ycykKKyAgICBpbnQgZmQsIGludCB3cml0ZV9tb2RlLCBjb25zdCBjaGFyKiBuYW1lLAorICAgIGNvbnN0IGNoYXIqIGVuY29kaW5nLCBjb25zdCBjaGFyKiBlcnJvcnMpCiB7CiAgICAgUHlPYmplY3QgKmJ1ZiA9IE5VTEwsICpzdHJlYW0gPSBOVUxMLCAqdGV4dCA9IE5VTEwsICpyYXcgPSBOVUxMLCAqcmVzOwogICAgIGNvbnN0IGNoYXIqIG1vZGU7CkBAIC0xMDEzLDcgKzEwNDcsOCBAQAogICAgICAgICBtb2RlID0gInJiIjsKICAgICBidWYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKGlvLCAmUHlJZF9vcGVuLCAiaXNpT09PaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgbW9kZSwgYnVmZmVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSwgUHlfTm9uZSwgUHlfTm9uZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCBQeV9Ob25lLCAvKiBlbmNvZGluZywgZXJyb3JzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lLCAwKTsgLyogbmV3bGluZSwgY2xvc2VmZCAqLwogICAgIGlmIChidWYgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKIApAQCAtMTI0MywyNSArMTI3OCwxMSBAQAogc3RhdGljIHZvaWQKIF9QeV9GYXRhbEVycm9yX0R1bXBUcmFjZWJhY2tzKGludCBmZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGU7Ci0KLSNpZmRlZiBXSVRIX1RIUkVBRAotICAgIC8qIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCkgd29ya3MgZXZlbiBpZiB0aGUgR0lMIHdhcyByZWxlYXNlZCAqLwotICAgIHRzdGF0ZSA9IFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKCk7Ci0jZWxzZQotICAgIHRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7Ci0jZW5kaWYKLSAgICBpZiAodHN0YXRlID09IE5VTEwpIHsKLSAgICAgICAgLyogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKCkgcmVxdWlyZXMgdGhlIHRocmVhZCBzdGF0ZSB0byBkaXNwbGF5Ci0gICAgICAgICAqIGZyYW1lcyAqLwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgZnB1dGMoJ1xuJywgc3RkZXJyKTsKICAgICBmZmx1c2goc3RkZXJyKTsKIAogICAgIC8qIGRpc3BsYXkgdGhlIGN1cnJlbnQgUHl0aG9uIHN0YWNrICovCi0gICAgX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGZkLCB0c3RhdGUtPmludGVycCwgdHN0YXRlKTsKKyAgICBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIE5VTEwpOwogfQogCiAvKiBQcmludCB0aGUgY3VycmVudCBleGNlcHRpb24gKGlmIGFuIGV4Y2VwdGlvbiBpcyBzZXQpIHdpdGggaXRzIHRyYWNlYmFjaywKQEAgLTEzODgsNyArMTQwOSw3IEBACiAvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLwogCiAjaWZkZWYgV0lUSF9USFJFQUQKLSNpbmNsdWRlICJweXRocmVhZC5oIgorIyAgaW5jbHVkZSAicHl0aHJlYWQuaCIKICNlbmRpZgogCiBzdGF0aWMgdm9pZCAoKnB5ZXhpdGZ1bmMpKHZvaWQpID0gTlVMTDsKQEAgLTE0NjIsNyArMTQ4Myw5IEBACiB2b2lkCiBQeV9FeGl0KGludCBzdHMpCiB7Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiAgICAgZXhpdChzdHMpOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RhdGUuYyBiL1B5dGhvbi9weXN0YXRlLmMKaW5kZXggNmQxYzZkMC4uYmE0ZGQ0YyAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RhdGUuYworKysgYi9QeXRob24vcHlzdGF0ZS5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaWZkZWYgSEFWRV9ETEZDTl9ICiAjaW5jbHVkZSA8ZGxmY24uaD4KICNlbmRpZgotI2lmbmRlZiBSVExEX0xBWlkKKyNpZiAhSEFWRV9ERUNMX1JUTERfTEFaWQogI2RlZmluZSBSVExEX0xBWlkgMQogI2VuZGlmCiAjZW5kaWYKQEAgLTM0LDYgKzM0LDggQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKK2ludCBfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkID0gMTsKKwogI2lmZGVmIFdJVEhfVEhSRUFECiAjaW5jbHVkZSAicHl0aHJlYWQuaCIKIHN0YXRpYyBQeVRocmVhZF90eXBlX2xvY2sgaGVhZF9tdXRleCA9IE5VTEw7IC8qIFByb3RlY3RzIGludGVycC0+dHN0YXRlX2hlYWQgKi8KQEAgLTQ1LDcgKzQ3LDcgQEAKICAgIEdJTFN0YXRlIGltcGxlbWVudGF0aW9uCiAqLwogc3RhdGljIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqYXV0b0ludGVycHJldGVyU3RhdGUgPSBOVUxMOwotc3RhdGljIGludCBhdXRvVExTa2V5ID0gMDsKK3N0YXRpYyBpbnQgYXV0b1RMU2tleSA9IC0xOwogI2Vsc2UKICNkZWZpbmUgSEVBRF9JTklUKCkgLyogTm90aGluZyAqLwogI2RlZmluZSBIRUFEX0xPQ0soKSAvKiBOb3RoaW5nICovCkBAIC04OSw3ICs5MSw3IEBACiAgICAgICAgIGludGVycC0+ZnNjb2RlY19pbml0aWFsaXplZCA9IDA7CiAgICAgICAgIGludGVycC0+aW1wb3J0bGliID0gTlVMTDsKICNpZmRlZiBIQVZFX0RMT1BFTgotI2lmZGVmIFJUTERfTk9XCisjaWYgSEFWRV9ERUNMX1JUTERfTk9XCiAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX05PVzsKICNlbHNlCiAgICAgICAgIGludGVycC0+ZGxvcGVuZmxhZ3MgPSBSVExEX0xBWlk7CkBAIC00NDksMTAgKzQ1MSwxMCBAQAogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKICAgICAgICAgUHlfRmF0YWxFcnJvcigKICAgICAgICAgICAgICJQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ6IG5vIGN1cnJlbnQgdHN0YXRlIik7Ci0gICAgU0VUX1RTVEFURShOVUxMKTsKKyAgICB0c3RhdGVfZGVsZXRlX2NvbW1vbih0c3RhdGUpOwogICAgIGlmIChhdXRvSW50ZXJwcmV0ZXJTdGF0ZSAmJiBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGF1dG9UTFNrZXkpID09IHRzdGF0ZSkKICAgICAgICAgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShhdXRvVExTa2V5KTsKLSAgICB0c3RhdGVfZGVsZXRlX2NvbW1vbih0c3RhdGUpOworICAgIFNFVF9UU1RBVEUoTlVMTCk7CiAgICAgUHlFdmFsX1JlbGVhc2VMb2NrKCk7CiB9CiAjZW5kaWYgLyogV0lUSF9USFJFQUQgKi8KQEAgLTY5Niw3ICs2OTgsNyBAQAogfQogCiAvKiBJbnRlcm5hbCBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb25zIGNhbGxlZCBieQotICAgUHlfSW5pdGlhbGl6ZS9QeV9GaW5hbGl6ZQorICAgUHlfSW5pdGlhbGl6ZS9QeV9GaW5hbGl6ZUV4CiAqLwogdm9pZAogX1B5R0lMU3RhdGVfSW5pdChQeUludGVycHJldGVyU3RhdGUgKmksIFB5VGhyZWFkU3RhdGUgKnQpCkBAIC03MTIsMTAgKzcxNCwxNyBAQAogICAgIF9QeUdJTFN0YXRlX05vdGVUaHJlYWRTdGF0ZSh0KTsKIH0KIAorUHlJbnRlcnByZXRlclN0YXRlICoKK19QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUodm9pZCkKK3sKKyAgICByZXR1cm4gYXV0b0ludGVycHJldGVyU3RhdGU7Cit9CisKIHZvaWQKIF9QeUdJTFN0YXRlX0Zpbmkodm9pZCkKIHsKICAgICBQeVRocmVhZF9kZWxldGVfa2V5KGF1dG9UTFNrZXkpOworICAgIGF1dG9UTFNrZXkgPSAtMTsKICAgICBhdXRvSW50ZXJwcmV0ZXJTdGF0ZSA9IE5VTEw7CiB9CiAKQEAgLTc4NCw4ICs3OTMsMTkgQEAKIGludAogUHlHSUxTdGF0ZV9DaGVjayh2b2lkKQogewotICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IEdFVF9UU1RBVEUoKTsKLSAgICByZXR1cm4gdHN0YXRlICYmICh0c3RhdGUgPT0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKSk7CisgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOworCisgICAgaWYgKCFfUHlHSUxTdGF0ZV9jaGVja19lbmFibGVkKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmIChhdXRvVExTa2V5ID09IC0xKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHRzdGF0ZSA9IEdFVF9UU1RBVEUoKTsKKyAgICBpZiAodHN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuICh0c3RhdGUgPT0gUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKSk7CiB9CiAKIFB5R0lMU3RhdGVfU1RBVEUKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXN0cnRvZC5jIGIvUHl0aG9uL3B5c3RydG9kLmMKaW5kZXggMjA5YzkwOC4uNWYzYWY5MiAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RydG9kLmMKKysrIGIvUHl0aG9uL3B5c3RydG9kLmMKQEAgLTg4MSwxMiArODgxLDEyIEBACiAjZGVmaW5lIE9GU19FIDIKIAogLyogVGhlIGxlbmd0aHMgb2YgdGhlc2UgYXJlIGtub3duIHRvIHRoZSBjb2RlIGJlbG93LCBzbyBkb24ndCBjaGFuZ2UgdGhlbSAqLwotc3RhdGljIGNoYXIgKmxjX2Zsb2F0X3N0cmluZ3NbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNfZmxvYXRfc3RyaW5nc1tdID0gewogICAgICJpbmYiLAogICAgICJuYW4iLAogICAgICJlIiwKIH07Ci1zdGF0aWMgY2hhciAqdWNfZmxvYXRfc3RyaW5nc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1Y19mbG9hdF9zdHJpbmdzW10gPSB7CiAgICAgIklORiIsCiAgICAgIk5BTiIsCiAgICAgIkUiLApAQCAtOTI1LDcgKzkyNSw4IEBACiBmb3JtYXRfZmxvYXRfc2hvcnQoZG91YmxlIGQsIGNoYXIgZm9ybWF0X2NvZGUsCiAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGludCBwcmVjaXNpb24sCiAgICAgICAgICAgICAgICAgICAgaW50IGFsd2F5c19hZGRfc2lnbiwgaW50IGFkZF9kb3RfMF9pZl9pbnRlZ2VyLAotICAgICAgICAgICAgICAgICAgIGludCB1c2VfYWx0X2Zvcm1hdHRpbmcsIGNoYXIgKipmbG9hdF9zdHJpbmdzLCBpbnQgKnR5cGUpCisgICAgICAgICAgICAgICAgICAgaW50IHVzZV9hbHRfZm9ybWF0dGluZywgY29uc3QgY2hhciAqIGNvbnN0ICpmbG9hdF9zdHJpbmdzLAorICAgICAgICAgICAgICAgICAgIGludCAqdHlwZSkKIHsKICAgICBjaGFyICpidWYgPSBOVUxMOwogICAgIGNoYXIgKnAgPSBOVUxMOwpAQCAtMTE3Niw3ICsxMTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnR5cGUpCiB7Ci0gICAgY2hhciAqKmZsb2F0X3N0cmluZ3MgPSBsY19mbG9hdF9zdHJpbmdzOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqZmxvYXRfc3RyaW5ncyA9IGxjX2Zsb2F0X3N0cmluZ3M7CiAgICAgaW50IG1vZGU7CiAKICAgICAvKiBWYWxpZGF0ZSBmb3JtYXRfY29kZSwgYW5kIG1hcCB1cHBlciBhbmQgbG93ZXIgY2FzZS4gQ29tcHV0ZSB0aGUKZGlmZiAtLWdpdCBhL1B5dGhvbi9weXRob25ydW4uYyBiL1B5dGhvbi9weXRob25ydW4uYwppbmRleCA3ZmJmMDZlLi42NzhlYmZlIDEwMDY0NAotLS0gYS9QeXRob24vcHl0aG9ucnVuLmMKKysrIGIvUHl0aG9uL3B5dGhvbnJ1bi5jCkBAIC00MzEsNyArNDMxLDcgQEAKIHBhcnNlX3N5bnRheF9lcnJvcihQeU9iamVjdCAqZXJyLCBQeU9iamVjdCAqKm1lc3NhZ2UsIFB5T2JqZWN0ICoqZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgaW50ICpsaW5lbm8sIGludCAqb2Zmc2V0LCBQeU9iamVjdCAqKnRleHQpCiB7Ci0gICAgbG9uZyBob2xkOworICAgIGludCBob2xkOwogICAgIFB5T2JqZWN0ICp2OwogICAgIF9QeV9JREVOVElGSUVSKG1zZyk7CiAgICAgX1B5X0lERU5USUZJRVIoZmlsZW5hbWUpOwpAQCAtNDY0LDExICs0NjQsMTEgQEAKICAgICB2ID0gX1B5T2JqZWN0X0dldEF0dHJJZChlcnIsICZQeUlkX2xpbmVubyk7CiAgICAgaWYgKCF2KQogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgaG9sZCA9IFB5TG9uZ19Bc0xvbmcodik7CisgICAgaG9sZCA9IF9QeUxvbmdfQXNJbnQodik7CiAgICAgUHlfREVDUkVGKHYpOwogICAgIGlmIChob2xkIDwgMCAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgKmxpbmVubyA9IChpbnQpaG9sZDsKKyAgICAqbGluZW5vID0gaG9sZDsKIAogICAgIHYgPSBfUHlPYmplY3RfR2V0QXR0cklkKGVyciwgJlB5SWRfb2Zmc2V0KTsKICAgICBpZiAoIXYpCkBAIC00NzcsMTEgKzQ3NywxMSBAQAogICAgICAgICAqb2Zmc2V0ID0gLTE7CiAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICB9IGVsc2UgewotICAgICAgICBob2xkID0gUHlMb25nX0FzTG9uZyh2KTsKKyAgICAgICAgaG9sZCA9IF9QeUxvbmdfQXNJbnQodik7CiAgICAgICAgIFB5X0RFQ1JFRih2KTsKICAgICAgICAgaWYgKGhvbGQgPCAwICYmIFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICBnb3RvIGZpbmFsbHk7Ci0gICAgICAgICpvZmZzZXQgPSAoaW50KWhvbGQ7CisgICAgICAgICpvZmZzZXQgPSBob2xkOwogICAgIH0KIAogICAgIHYgPSBfUHlPYmplY3RfR2V0QXR0cklkKGVyciwgJlB5SWRfdGV4dCk7CkBAIC03OTEsMTEgKzc5MSwxMSBAQAogICAgICAgICBQeUVycl9DbGVhcigpOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqY2F1c2VfbWVzc2FnZSA9CitzdGF0aWMgY29uc3QgY2hhciBjYXVzZV9tZXNzYWdlW10gPQogICAgICJcblRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2UgIgogICAgICJvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuIjsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnRleHRfbWVzc2FnZSA9CitzdGF0aWMgY29uc3QgY2hhciBjb250ZXh0X21lc3NhZ2VbXSA9CiAgICAgIlxuRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sICIKICAgICAiYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6XG5cbiI7CiAKQEAgLTExNDQsOCArMTE0NCw4IEBACiAKIG1vZF90eQogUHlQYXJzZXJfQVNURnJvbUZpbGVPYmplY3QoRklMRSAqZnAsIFB5T2JqZWN0ICpmaWxlbmFtZSwgY29uc3QgY2hhciogZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjaGFyICpwczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgY29uc3QgY2hhciAqcHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHMyLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLCBpbnQgKmVycmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSkKIHsKICAgICBtb2RfdHkgbW9kOwpAQCAtMTE3Nyw4ICsxMTc3LDggQEAKIAogbW9kX3R5CiBQeVBhcnNlcl9BU1RGcm9tRmlsZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWVfc3RyLCBjb25zdCBjaGFyKiBlbmMsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGNoYXIgKnBzMSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzMiwgUHlDb21waWxlckZsYWdzICpmbGFncywgaW50ICplcnJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LCBjb25zdCBjaGFyICpwczEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwczIsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsIGludCAqZXJyY29kZSwKICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKQogewogICAgIG1vZF90eSBtb2Q7CmRpZmYgLS1naXQgYS9QeXRob24vcHl0aW1lLmMgYi9QeXRob24vcHl0aW1lLmMKaW5kZXggN2Y2NTgyNC4uODE2ODJjYSAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGltZS5jCisrKyBiL1B5dGhvbi9weXRpbWUuYwpAQCAtNyw2ICs3LDExIEBACiAjaW5jbHVkZSA8bWFjaC9tYWNoX3RpbWUuaD4gICAvKiBtYWNoX2Fic29sdXRlX3RpbWUoKSwgbWFjaF90aW1lYmFzZV9pbmZvKCkgKi8KICNlbmRpZgogCisjZGVmaW5lIF9QeVRpbWVfY2hlY2tfbXVsX292ZXJmbG93KGEsIGIpIFwKKyAgICAoYXNzZXJ0KGIgPiAwKSwgXAorICAgICAoX1B5VGltZV90KShhKSA8IF9QeVRpbWVfTUlOIC8gKF9QeVRpbWVfdCkoYikgXAorICAgICB8fCBfUHlUaW1lX01BWCAvIChfUHlUaW1lX3QpKGIpIDwgKF9QeVRpbWVfdCkoYSkpCisKIC8qIFRvIG1pbGxpc2Vjb25kICgxMF4tMykgKi8KICNkZWZpbmUgU0VDX1RPX01TIDEwMDAKIApAQCAtMzgsNyArNDMsNyBAQAogICAgIHZhbCA9IFB5TG9uZ19Bc0xvbmdMb25nKG9iaik7CiAjZWxzZQogICAgIGxvbmcgdmFsOwotICAgIGFzc2VydChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodGltZV90KSA8PSBzaXplb2YobG9uZykpOwogICAgIHZhbCA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKICNlbmRpZgogICAgIGlmICh2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNTUsNTUgKzYwLDg4IEBACiAjaWYgZGVmaW5lZChIQVZFX0xPTkdfTE9ORykgJiYgU0laRU9GX1RJTUVfVCA9PSBTSVpFT0ZfTE9OR19MT05HCiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl0KTsKICNlbHNlCi0gICAgYXNzZXJ0KHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aW1lX3QpIDw9IHNpemVvZihsb25nKSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl0KTsKICNlbmRpZgogfQogCisvKiBSb3VuZCB0byBuZWFyZXN0IHdpdGggdGllcyBnb2luZyB0byBuZWFyZXN0IGV2ZW4gaW50ZWdlcgorICAgKF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSAqLworc3RhdGljIGRvdWJsZQorX1B5VGltZV9Sb3VuZEhhbGZFdmVuKGRvdWJsZSB4KQoreworICAgIGRvdWJsZSByb3VuZGVkID0gcm91bmQoeCk7CisgICAgaWYgKGZhYnMoeC1yb3VuZGVkKSA9PSAwLjUpCisgICAgICAgIC8qIGhhbGZ3YXkgY2FzZTogcm91bmQgdG8gZXZlbiAqLworICAgICAgICByb3VuZGVkID0gMi4wKnJvdW5kKHgvMi4wKTsKKyAgICByZXR1cm4gcm91bmRlZDsKK30KKworc3RhdGljIGRvdWJsZQorX1B5VGltZV9Sb3VuZChkb3VibGUgeCwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQoreworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIGQgPSB4OworICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikKKyAgICAgICAgZCA9IF9QeVRpbWVfUm91bmRIYWxmRXZlbihkKTsKKyAgICBlbHNlIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCisgICAgICAgIGQgPSBjZWlsKGQpOworICAgIGVsc2UKKyAgICAgICAgZCA9IGZsb29yKGQpOworICAgIHJldHVybiBkOworfQorCitzdGF0aWMgaW50CitfUHlUaW1lX0RvdWJsZVRvRGVub21pbmF0b3IoZG91YmxlIGQsIHRpbWVfdCAqc2VjLCBsb25nICpudW1lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRlbm9taW5hdG9yLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCit7CisgICAgZG91YmxlIGludHBhcnQsIGVycjsKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGZsb2F0cGFydDsKKworICAgIGZsb2F0cGFydCA9IG1vZGYoZCwgJmludHBhcnQpOworCisgICAgZmxvYXRwYXJ0ICo9IGRlbm9taW5hdG9yOworICAgIGZsb2F0cGFydCA9IF9QeVRpbWVfUm91bmQoZmxvYXRwYXJ0LCByb3VuZCk7CisgICAgaWYgKGZsb2F0cGFydCA+PSBkZW5vbWluYXRvcikgeworICAgICAgICBmbG9hdHBhcnQgLT0gZGVub21pbmF0b3I7CisgICAgICAgIGludHBhcnQgKz0gMS4wOworICAgIH0KKyAgICBlbHNlIGlmIChmbG9hdHBhcnQgPCAwKSB7CisgICAgICAgIGZsb2F0cGFydCArPSBkZW5vbWluYXRvcjsKKyAgICAgICAgaW50cGFydCAtPSAxLjA7CisgICAgfQorICAgIGFzc2VydCgwLjAgPD0gZmxvYXRwYXJ0ICYmIGZsb2F0cGFydCA8IGRlbm9taW5hdG9yKTsKKworICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7CisgICAgKm51bWVyYXRvciA9IChsb25nKWZsb2F0cGFydDsKKworICAgIGVyciA9IGludHBhcnQgLSAoZG91YmxlKSpzZWM7CisgICAgaWYgKGVyciA8PSAtMS4wIHx8IGVyciA+PSAxLjApIHsKKyAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihQeU9iamVjdCAqb2JqLCB0aW1lX3QgKnNlYywgbG9uZyAqbnVtZXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZW5vbWluYXRvciwgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewotICAgIGFzc2VydChkZW5vbWluYXRvciA8PSBMT05HX01BWCk7CisgICAgYXNzZXJ0KGRlbm9taW5hdG9yIDw9IChkb3VibGUpTE9OR19NQVgpOworCiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICBkb3VibGUgZCwgaW50cGFydCwgZXJyOwotICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgdW5zYWZlIG9wdGltaXphdGlvbiBvbiBmbG9hdCBlbmFibGVkIGJ5IGdjYyAtTzMgKi8KLSAgICAgICAgdm9sYXRpbGUgZG91YmxlIGZsb2F0cGFydDsKLQotICAgICAgICBkID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwotICAgICAgICBmbG9hdHBhcnQgPSBtb2RmKGQsICZpbnRwYXJ0KTsKLSAgICAgICAgaWYgKGZsb2F0cGFydCA8IDApIHsKLSAgICAgICAgICAgIGZsb2F0cGFydCA9IDEuMCArIGZsb2F0cGFydDsKLSAgICAgICAgICAgIGludHBhcnQgLT0gMS4wOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXRwYXJ0ICo9IGRlbm9taW5hdG9yOwotICAgICAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKSB7Ci0gICAgICAgICAgICBmbG9hdHBhcnQgPSBjZWlsKGZsb2F0cGFydCk7Ci0gICAgICAgICAgICBpZiAoZmxvYXRwYXJ0ID49IGRlbm9taW5hdG9yKSB7Ci0gICAgICAgICAgICAgICAgZmxvYXRwYXJ0ID0gMC4wOwotICAgICAgICAgICAgICAgIGludHBhcnQgKz0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgZmxvYXRwYXJ0ID0gZmxvb3IoZmxvYXRwYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7Ci0gICAgICAgIGVyciA9IGludHBhcnQgLSAoZG91YmxlKSpzZWM7Ci0gICAgICAgIGlmIChlcnIgPD0gLTEuMCB8fCBlcnIgPj0gMS4wKSB7Ci0gICAgICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgICpudW1lcmF0b3IgPSAobG9uZylmbG9hdHBhcnQ7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBkb3VibGUgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKKyAgICAgICAgcmV0dXJuIF9QeVRpbWVfRG91YmxlVG9EZW5vbWluYXRvcihkLCBzZWMsIG51bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciwgcm91bmQpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgKnNlYyA9IF9QeUxvbmdfQXNUaW1lX3Qob2JqKTsKKyAgICAgICAgKm51bWVyYXRvciA9IDA7CiAgICAgICAgIGlmICgqc2VjID09ICh0aW1lX3QpLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgKm51bWVyYXRvciA9IDA7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KQEAgLTExMiwxMyArMTUwLDEyIEBACiBfUHlUaW1lX09iamVjdFRvVGltZV90KFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7CiAgICAgaWYgKFB5RmxvYXRfQ2hlY2sob2JqKSkgewotICAgICAgICBkb3VibGUgZCwgaW50cGFydCwgZXJyOworICAgICAgICBkb3VibGUgaW50cGFydCwgZXJyOworICAgICAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgICAgIHZvbGF0aWxlIGRvdWJsZSBkOwogCiAgICAgICAgIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7Ci0gICAgICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0NFSUxJTkcpCi0gICAgICAgICAgICBkID0gY2VpbChkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZCA9IGZsb29yKGQpOworICAgICAgICBkID0gX1B5VGltZV9Sb3VuZChkLCByb3VuZCk7CiAgICAgICAgICh2b2lkKW1vZGYoZCwgJmludHBhcnQpOwogCiAgICAgICAgICpzZWMgPSAodGltZV90KWludHBhcnQ7CkBAIC0xNDEsMTQgKzE3OCwyMCBAQAogX1B5VGltZV9PYmplY3RUb1RpbWVzcGVjKFB5T2JqZWN0ICpvYmosIHRpbWVfdCAqc2VjLCBsb25nICpuc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgIF9QeVRpbWVfcm91bmRfdCByb3VuZCkKIHsKLSAgICByZXR1cm4gX1B5VGltZV9PYmplY3RUb0Rlbm9taW5hdG9yKG9iaiwgc2VjLCBuc2VjLCAxZTksIHJvdW5kKTsKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgbnNlYywgMWU5LCByb3VuZCk7CisgICAgYXNzZXJ0KDAgPD0gKm5zZWMgJiYgKm5zZWMgPCBTRUNfVE9fTlMpOworICAgIHJldHVybiByZXM7CiB9CiAKIGludAogX1B5VGltZV9PYmplY3RUb1RpbWV2YWwoUHlPYmplY3QgKm9iaiwgdGltZV90ICpzZWMsIGxvbmcgKnVzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICBfUHlUaW1lX3JvdW5kX3Qgcm91bmQpCiB7Ci0gICAgcmV0dXJuIF9QeVRpbWVfT2JqZWN0VG9EZW5vbWluYXRvcihvYmosIHNlYywgdXNlYywgMWU2LCByb3VuZCk7CisgICAgaW50IHJlczsKKyAgICByZXMgPSBfUHlUaW1lX09iamVjdFRvRGVub21pbmF0b3Iob2JqLCBzZWMsIHVzZWMsIDFlNiwgcm91bmQpOworICAgIGFzc2VydCgwIDw9ICp1c2VjICYmICp1c2VjIDwgU0VDX1RPX1VTKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMTYyLDEyICsyMDUsMTUgQEAKIF9QeVRpbWVfRnJvbVNlY29uZHMoaW50IHNlY29uZHMpCiB7CiAgICAgX1B5VGltZV90IHQ7CisgICAgdCA9IChfUHlUaW1lX3Qpc2Vjb25kczsKICAgICAvKiBlbnN1cmUgdGhhdCBpbnRlZ2VyIG92ZXJmbG93IGNhbm5vdCBoYXBwZW4sIGludCB0eXBlIHNob3VsZCBoYXZlIDMyCiAgICAgICAgYml0cywgd2hlcmVhcyBfUHlUaW1lX3QgdHlwZSBoYXMgYXQgbGVhc3QgNjQgYml0cyAoU0VDX1RPX01TIHRha2VzIDMwCiAgICAgICAgYml0cykuICovCi0gICAgYXNzZXJ0KChzZWNvbmRzID49IDAgJiYgc2Vjb25kcyA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUykKLSAgICAgICAgICAgfHwgKHNlY29uZHMgPCAwICYmIHNlY29uZHMgPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpKTsKLSAgICB0ID0gKF9QeVRpbWVfdClzZWNvbmRzICogU0VDX1RPX05TOworICAgIFB5X0JVSUxEX0FTU0VSVChJTlRfTUFYIDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoSU5UX01JTiA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUyk7CisgICAgYXNzZXJ0KCh0ID49IDAgJiYgdCA8PSBfUHlUaW1lX01BWCAvIFNFQ19UT19OUykKKyAgICAgICAgICAgfHwgKHQgPCAwICYmIHQgPj0gX1B5VGltZV9NSU4gLyBTRUNfVE9fTlMpKTsKKyAgICB0ICo9IFNFQ19UT19OUzsKICAgICByZXR1cm4gdDsKIH0KIApAQCAtMTc1LDcgKzIyMSw3IEBACiBfUHlUaW1lX0Zyb21OYW5vc2Vjb25kcyhQWV9MT05HX0xPTkcgbnMpCiB7CiAgICAgX1B5VGltZV90IHQ7Ci0gICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOwogICAgIHQgPSBQeV9TQUZFX0RPV05DQVNUKG5zLCBQWV9MT05HX0xPTkcsIF9QeVRpbWVfdCk7CiAgICAgcmV0dXJuIHQ7CiB9CkBAIC0xODcsMTIgKzIzMywxNSBAQAogICAgIF9QeVRpbWVfdCB0OwogICAgIGludCByZXMgPSAwOwogCi0gICAgdCA9IChfUHlUaW1lX3QpdHMtPnR2X3NlYyAqIFNFQ19UT19OUzsKLSAgICBpZiAodCAvIFNFQ19UT19OUyAhPSB0cy0+dHZfc2VjKSB7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0cy0+dHZfc2VjKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgdCA9IChfUHlUaW1lX3QpdHMtPnR2X3NlYzsKKworICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyh0LCBTRUNfVE9fTlMpKSB7CiAgICAgICAgIGlmIChyYWlzZSkKICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgcmVzID0gLTE7CiAgICAgfQorICAgIHQgPSB0ICogU0VDX1RPX05TOwogCiAgICAgdCArPSB0cy0+dHZfbnNlYzsKIApAQCAtMjA2LDEyICsyNTUsMTUgQEAKICAgICBfUHlUaW1lX3QgdDsKICAgICBpbnQgcmVzID0gMDsKIAotICAgIHQgPSAoX1B5VGltZV90KXR2LT50dl9zZWMgKiBTRUNfVE9fTlM7Ci0gICAgaWYgKHQgLyBTRUNfVE9fTlMgIT0gdHYtPnR2X3NlYykgeworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YodHYtPnR2X3NlYykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSAoX1B5VGltZV90KXR2LT50dl9zZWM7CisKKyAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3codCwgU0VDX1RPX05TKSkgewogICAgICAgICBpZiAocmFpc2UpCiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgIHJlcyA9IC0xOwogICAgIH0KKyAgICB0ID0gdCAqIFNFQ19UT19OUzsKIAogICAgIHQgKz0gKF9QeVRpbWVfdCl0di0+dHZfdXNlYyAqIFVTX1RPX05TOwogCkBAIC0yMjEsNTAgKzI3Myw1OSBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKK19QeVRpbWVfRnJvbUZsb2F0T2JqZWN0KF9QeVRpbWVfdCAqdCwgZG91YmxlIHZhbHVlLCBfUHlUaW1lX3JvdW5kX3Qgcm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVuaXRfdG9fbnMpCit7CisgICAgZG91YmxlIGVycjsKKyAgICAvKiB2b2xhdGlsZSBhdm9pZHMgb3B0aW1pemF0aW9uIGNoYW5naW5nIGhvdyBudW1iZXJzIGFyZSByb3VuZGVkICovCisgICAgdm9sYXRpbGUgZG91YmxlIGQ7CisKKyAgICAvKiBjb252ZXJ0IHRvIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzICovCisgICAgZCA9IHZhbHVlOworICAgIGQgKj0gKGRvdWJsZSl1bml0X3RvX25zOworICAgIGQgPSBfUHlUaW1lX1JvdW5kKGQsIHJvdW5kKTsKKworICAgICp0ID0gKF9QeVRpbWVfdClkOworICAgIGVyciA9IGQgLSAoZG91YmxlKSp0OworICAgIGlmIChmYWJzKGVycikgPj0gMS4wKSB7CisgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAogX1B5VGltZV9Gcm9tT2JqZWN0KF9QeVRpbWVfdCAqdCwgUHlPYmplY3QgKm9iaiwgX1B5VGltZV9yb3VuZF90IHJvdW5kLAotICAgICAgICAgICAgICAgICAgIGxvbmcgdG9fbmFub3NlY29uZHMpCisgICAgICAgICAgICAgICAgICAgbG9uZyB1bml0X3RvX25zKQogewogICAgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKLSAgICAgICAgLyogdm9sYXRpbGUgYXZvaWRzIHVuc2FmZSBvcHRpbWl6YXRpb24gb24gZmxvYXQgZW5hYmxlZCBieSBnY2MgLU8zICovCi0gICAgICAgIHZvbGF0aWxlIGRvdWJsZSBkLCBlcnI7Ci0KLSAgICAgICAgLyogY29udmVydCB0byBhIG51bWJlciBvZiBuYW5vc2Vjb25kcyAqLworICAgICAgICBkb3VibGUgZDsKICAgICAgICAgZCA9IFB5RmxvYXRfQXNEb3VibGUob2JqKTsKLSAgICAgICAgZCAqPSB0b19uYW5vc2Vjb25kczsKLQotICAgICAgICBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKQotICAgICAgICAgICAgZCA9IGNlaWwoZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGQgPSBmbG9vcihkKTsKLQotICAgICAgICAqdCA9IChfUHlUaW1lX3QpZDsKLSAgICAgICAgZXJyID0gZCAtIChkb3VibGUpKnQ7Ci0gICAgICAgIGlmIChmYWJzKGVycikgPj0gMS4wKSB7Ci0gICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBfUHlUaW1lX0Zyb21GbG9hdE9iamVjdCh0LCBkLCByb3VuZCwgdW5pdF90b19ucyk7CiAgICAgfQogICAgIGVsc2UgewogI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgIFBZX0xPTkdfTE9ORyBzZWM7CisgICAgICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YoUFlfTE9OR19MT05HKSA8PSBzaXplb2YoX1B5VGltZV90KSk7CisKICAgICAgICAgc2VjID0gUHlMb25nX0FzTG9uZ0xvbmcob2JqKTsKLSAgICAgICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKICNlbHNlCiAgICAgICAgIGxvbmcgc2VjOworICAgICAgICBQeV9CVUlMRF9BU1NFUlQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworCiAgICAgICAgIHNlYyA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKLSAgICAgICAgYXNzZXJ0KHNpemVvZihQWV9MT05HX0xPTkcpIDw9IHNpemVvZihfUHlUaW1lX3QpKTsKICNlbmRpZgogICAgICAgICBpZiAoc2VjID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKQogICAgICAgICAgICAgICAgIF9QeVRpbWVfb3ZlcmZsb3coKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICAqdCA9IHNlYyAqIHRvX25hbm9zZWNvbmRzOwotICAgICAgICBpZiAoKnQgLyB0b19uYW5vc2Vjb25kcyAhPSBzZWMpIHsKKworICAgICAgICBpZiAoX1B5VGltZV9jaGVja19tdWxfb3ZlcmZsb3coc2VjLCB1bml0X3RvX25zKSkgewogICAgICAgICAgICAgX1B5VGltZV9vdmVyZmxvdygpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CisgICAgICAgICp0ID0gc2VjICogdW5pdF90b19uczsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQpAQCAtMjg0LDIyICszNDUsMzEgQEAKIGRvdWJsZQogX1B5VGltZV9Bc1NlY29uZHNEb3VibGUoX1B5VGltZV90IHQpCiB7Ci0gICAgX1B5VGltZV90IHNlYywgbnM7Ci0gICAgLyogRGl2aWRlIHVzaW5nIGludGVnZXJzIHRvIGF2b2lkIHJvdW5kaW5nIGlzc3VlcyBvbiB0aGUgaW50ZWdlciBwYXJ0LgotICAgICAgIDFlLTkgY2Fubm90IGJlIHN0b3JlZCBleGFjdGx5IGluIElFRUUgNjQtYml0LiAqLwotICAgIHNlYyA9IHQgLyBTRUNfVE9fTlM7Ci0gICAgbnMgPSB0ICUgU0VDX1RPX05TOwotICAgIHJldHVybiAoZG91YmxlKXNlYyArIChkb3VibGUpbnMgKiAxZS05OworICAgIC8qIHZvbGF0aWxlIGF2b2lkcyBvcHRpbWl6YXRpb24gY2hhbmdpbmcgaG93IG51bWJlcnMgYXJlIHJvdW5kZWQgKi8KKyAgICB2b2xhdGlsZSBkb3VibGUgZDsKKworICAgIGlmICh0ICUgU0VDX1RPX05TID09IDApIHsKKyAgICAgICAgX1B5VGltZV90IHNlY3M7CisgICAgICAgIC8qIERpdmlkZSB1c2luZyBpbnRlZ2VycyB0byBhdm9pZCByb3VuZGluZyBpc3N1ZXMgb24gdGhlIGludGVnZXIgcGFydC4KKyAgICAgICAgICAgMWUtOSBjYW5ub3QgYmUgc3RvcmVkIGV4YWN0bHkgaW4gSUVFRSA2NC1iaXQuICovCisgICAgICAgIHNlY3MgPSB0IC8gU0VDX1RPX05TOworICAgICAgICBkID0gKGRvdWJsZSlzZWNzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZCA9IChkb3VibGUpdDsKKyAgICAgICAgZCAvPSAxZTk7CisgICAgfQorICAgIHJldHVybiBkOwogfQogCiBQeU9iamVjdCAqCiBfUHlUaW1lX0FzTmFub3NlY29uZHNPYmplY3QoX1B5VGltZV90IHQpCiB7CiAjaWZkZWYgSEFWRV9MT05HX0xPTkcKLSAgICBhc3NlcnQoc2l6ZW9mKFBZX0xPTkdfTE9ORykgPj0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2YoUFlfTE9OR19MT05HKSA+PSBzaXplb2YoX1B5VGltZV90KSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZ0xvbmcoKFBZX0xPTkdfTE9ORyl0KTsKICNlbHNlCi0gICAgYXNzZXJ0KHNpemVvZihsb25nKSA+PSBzaXplb2YoX1B5VGltZV90KSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihsb25nKSA+PSBzaXplb2YoX1B5VGltZV90KSk7CiAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZygobG9uZyl0KTsKICNlbmRpZgogfQpAQCAtMzA5LDcgKzM3OSwyMCBAQAogICAgICAgICAgICAgICAgY29uc3QgX1B5VGltZV9yb3VuZF90IHJvdW5kKQogewogICAgIGFzc2VydChrID4gMSk7Ci0gICAgaWYgKHJvdW5kID09IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgeworICAgIGlmIChyb3VuZCA9PSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgeworICAgICAgICBfUHlUaW1lX3QgeCwgciwgYWJzX3I7CisgICAgICAgIHggPSB0IC8gazsKKyAgICAgICAgciA9IHQgJSBrOworICAgICAgICBhYnNfciA9IFB5X0FCUyhyKTsKKyAgICAgICAgaWYgKGFic19yID4gayAvIDIgfHwgKGFic19yID09IGsgLyAyICYmIChQeV9BQlMoeCkgJiAxKSkpIHsKKyAgICAgICAgICAgIGlmICh0ID49IDApCisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geDsKKyAgICB9CisgICAgZWxzZSBpZiAocm91bmQgPT0gX1B5VGltZV9ST1VORF9DRUlMSU5HKSB7CiAgICAgICAgIGlmICh0ID49IDApCiAgICAgICAgICAgICByZXR1cm4gKHQgKyBrIC0gMSkgLyBrOwogICAgICAgICBlbHNlCkBAIC0zNzMsNyArNDU2LDcgQEAKIF9QeVRpbWVfQXNUaW1ldmFsU3RydWN0X2ltcGwoX1B5VGltZV90IHQsIHN0cnVjdCB0aW1ldmFsICp0diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5VGltZV9yb3VuZF90IHJvdW5kLCBpbnQgcmFpc2UpCiB7Ci0gICAgX1B5VGltZV90IHNlY3M7CisgICAgX1B5VGltZV90IHNlY3MsIHNlY3MyOwogICAgIGludCB1czsKICAgICBpbnQgcmVzOwogCkBAIC0zODYsNyArNDY5LDggQEAKICNlbmRpZgogICAgIHR2LT50dl91c2VjID0gdXM7CiAKLSAgICBpZiAocmVzIDwgMCB8fCAoX1B5VGltZV90KXR2LT50dl9zZWMgIT0gc2VjcykgeworICAgIHNlY3MyID0gKF9QeVRpbWVfdCl0di0+dHZfc2VjOworICAgIGlmIChyZXMgPCAwIHx8IHNlY3MyICE9IHNlY3MpIHsKICAgICAgICAgaWYgKHJhaXNlKQogICAgICAgICAgICAgZXJyb3JfdGltZV90X292ZXJmbG93KCk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTQyNCw2ICs1MDgsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKICNpZiBkZWZpbmVkKEhBVkVfQ0xPQ0tfR0VUVElNRSkgfHwgZGVmaW5lZChIQVZFX0tRVUVVRSkKIGludAogX1B5VGltZV9Bc1RpbWVzcGVjKF9QeVRpbWVfdCB0LCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQpAQCAtNDM3LDEzICs1MjIsMTMgQEAKICAgICAgICAgc2VjcyAtPSAxOwogICAgIH0KICAgICB0cy0+dHZfc2VjID0gKHRpbWVfdClzZWNzOwotICAgIGlmICgoX1B5VGltZV90KXRzLT50dl9zZWMgIT0gc2VjcykgewotICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CisgICAgYXNzZXJ0KDAgPD0gbnNlYyAmJiBuc2VjIDwgU0VDX1RPX05TKTsKICAgICB0cy0+dHZfbnNlYyA9IG5zZWM7CiAKLSAgICBhc3NlcnQoMCA8PSB0cy0+dHZfbnNlYyAmJiB0cy0+dHZfbnNlYyA8PSA5OTk5OTk5OTkpOworICAgIGlmICgoX1B5VGltZV90KXRzLT50dl9zZWMgIT0gc2VjcykgeworICAgICAgICBlcnJvcl90aW1lX3Rfb3ZlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNTU3LDE5ICs2NDIsMjAgQEAKICAgICByZXR1cm4gcHlnZXR0aW1lb2ZkYXkodCwgaW5mbywgMSk7CiB9CiAKLQogc3RhdGljIGludAogcHltb25vdG9uaWMoX1B5VGltZV90ICp0cCwgX1B5X2Nsb2NrX2luZm9fdCAqaW5mbywgaW50IHJhaXNlKQogewogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKLSAgICBVTE9OR0xPTkcgcmVzdWx0OworICAgIFVMT05HTE9ORyB0aWNrczsKKyAgICBfUHlUaW1lX3QgdDsKIAogICAgIGFzc2VydChpbmZvID09IE5VTEwgfHwgcmFpc2UpOwogCi0gICAgcmVzdWx0ID0gR2V0VGlja0NvdW50NjQoKTsKKyAgICB0aWNrcyA9IEdldFRpY2tDb3VudDY0KCk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZih0aWNrcykgPD0gc2l6ZW9mKF9QeVRpbWVfdCkpOworICAgIHQgPSAoX1B5VGltZV90KXRpY2tzOwogCi0gICAgKnRwID0gcmVzdWx0ICogTVNfVE9fTlM7Ci0gICAgaWYgKCp0cCAvIE1TX1RPX05TICE9IHJlc3VsdCkgeworICAgIGlmIChfUHlUaW1lX2NoZWNrX211bF9vdmVyZmxvdyh0LCBNU19UT19OUykpIHsKICAgICAgICAgaWYgKHJhaXNlKSB7CiAgICAgICAgICAgICBfUHlUaW1lX292ZXJmbG93KCk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC01NzcsNiArNjYzLDcgQEAKICAgICAgICAgLyogSGVsbG8sIHRpbWUgdHJhdmVsZXIhICovCiAgICAgICAgIGFzc2VydCgwKTsKICAgICB9CisgICAgKnRwID0gdCAqIE1TX1RPX05TOwogCiAgICAgaWYgKGluZm8pIHsKICAgICAgICAgRFdPUkQgdGltZUFkanVzdG1lbnQsIHRpbWVJbmNyZW1lbnQ7CkBAIC02ODksOCArNzc2LDUgQEAKICAgICBpZiAoX1B5VGltZV9HZXRNb25vdG9uaWNDbG9ja1dpdGhJbmZvKCZ0LCBOVUxMKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIC8qIGNoZWNrIHRoYXQgX1B5VGltZV9Gcm9tU2Vjb25kcygpIGNhbm5vdCBvdmVyZmxvdyAqLwotICAgIGFzc2VydChJTlRfTUFYIDw9IF9QeVRpbWVfTUFYIC8gU0VDX1RPX05TKTsKLSAgICBhc3NlcnQoSU5UX01JTiA+PSBfUHlUaW1lX01JTiAvIFNFQ19UT19OUyk7CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9QeXRob24vcmFuZG9tLmMgYi9QeXRob24vcmFuZG9tLmMKaW5kZXggMzExOTg3Mi4uYzhlODQ0ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL3JhbmRvbS5jCisrKyBiL1B5dGhvbi9yYW5kb20uYwpAQCAtMTMyLDExICsxMzIsMTQgQEAKICAgICAgKiBzZWUgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNjgzOS4gVG8gYXZvaWQgdGhpcywgdXNlIHRoZQogICAgICAqIEdSTkRfTk9OQkxPQ0sgZmxhZy4gKi8KICAgICBjb25zdCBpbnQgZmxhZ3MgPSBHUk5EX05PTkJMT0NLOworCisgICAgY2hhciAqZGVzdDsKICAgICBsb25nIG47CiAKICAgICBpZiAoIWdldHJhbmRvbV93b3JrcykKICAgICAgICAgcmV0dXJuIDA7CiAKKyAgICBkZXN0ID0gYnVmZmVyOwogICAgIHdoaWxlICgwIDwgc2l6ZSkgewogI2lmZGVmIHN1bgogICAgICAgICAvKiBJc3N1ZSAjMjY3MzU6IE9uIFNvbGFyaXMsIGdldHJhbmRvbSgpIGlzIGxpbWl0ZWQgdG8gcmV0dXJuaW5nIHVwCkBAIC0xNTAsMTEgKzE1MywxMSBAQAogI2lmZGVmIEhBVkVfR0VUUkFORE9NCiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgbiA9IGdldHJhbmRvbShidWZmZXIsIG4sIGZsYWdzKTsKKyAgICAgICAgICAgIG4gPSBnZXRyYW5kb20oZGVzdCwgbiwgZmxhZ3MpOwogICAgICAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIG4gPSBnZXRyYW5kb20oYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gZ2V0cmFuZG9tKGRlc3QsIG4sIGZsYWdzKTsKICAgICAgICAgfQogI2Vsc2UKICAgICAgICAgLyogT24gTGludXgsIHVzZSB0aGUgc3lzY2FsbCgpIGZ1bmN0aW9uIGJlY2F1c2UgdGhlIEdOVSBsaWJjIGRvZXNuJ3QKQEAgLTE2MiwxMSArMTY1LDExIEBACiAgICAgICAgICAqIGh0dHBzOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE3MjUyICovCiAgICAgICAgIGlmIChyYWlzZSkgewogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotICAgICAgICAgICAgbiA9IHN5c2NhbGwoU1lTX2dldHJhbmRvbSwgYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBkZXN0LCBuLCBmbGFncyk7CiAgICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgbiA9IHN5c2NhbGwoU1lTX2dldHJhbmRvbSwgYnVmZmVyLCBuLCBmbGFncyk7CisgICAgICAgICAgICBuID0gc3lzY2FsbChTWVNfZ2V0cmFuZG9tLCBkZXN0LCBuLCBmbGFncyk7CiAgICAgICAgIH0KICNlbmRpZgogCkBAIC0yMDQsNyArMjA3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGJ1ZmZlciArPSBuOworICAgICAgICBkZXN0ICs9IG47CiAgICAgICAgIHNpemUgLT0gbjsKICAgICB9CiAgICAgcmV0dXJuIDE7CkBAIC00MDQsNyArNDA3LDcgQEAKICAgICBjaGFyICplbnY7CiAgICAgdW5zaWduZWQgY2hhciAqc2VjcmV0ID0gKHVuc2lnbmVkIGNoYXIgKikmX1B5X0hhc2hTZWNyZXQudWM7CiAgICAgUHlfc3NpemVfdCBzZWNyZXRfc2l6ZSA9IHNpemVvZihfUHlfSGFzaFNlY3JldF90KTsKLSAgICBhc3NlcnQoc2VjcmV0X3NpemUgPT0gc2l6ZW9mKF9QeV9IYXNoU2VjcmV0LnVjKSk7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihfUHlfSGFzaFNlY3JldF90KSA9PSBzaXplb2YoX1B5X0hhc2hTZWNyZXQudWMpKTsKIAogICAgIGlmIChfUHlfSGFzaFNlY3JldF9Jbml0aWFsaXplZCkKICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5bXRhYmxlLmMgYi9QeXRob24vc3ltdGFibGUuYwppbmRleCAxNTkxYTIwLi4zZjAzMTg0IDEwMDY0NAotLS0gYS9QeXRob24vc3ltdGFibGUuYworKysgYi9QeXRob24vc3ltdGFibGUuYwpAQCAtMTYwLDcgKzE2MCw3IEBACiB9OwogCiBzdGF0aWMgaW50IHN5bXRhYmxlX2FuYWx5emUoc3RydWN0IHN5bXRhYmxlICpzdCk7Ci1zdGF0aWMgaW50IHN5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY2hhciAqbXNnLCBpbnQgbGluZW5vKTsKK3N0YXRpYyBpbnQgc3ltdGFibGVfd2FybihzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBjb25zdCBjaGFyICptc2csIGludCBsaW5lbm8pOwogc3RhdGljIGludCBzeW10YWJsZV9lbnRlcl9ibG9jayhzdHJ1Y3Qgc3ltdGFibGUgKnN0LCBpZGVudGlmaWVyIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9ibG9ja190eSBibG9jaywgdm9pZCAqYXN0LCBpbnQgbGluZW5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCk7CkBAIC05MDgsNyArOTA4LDcgQEAKIAogCiBzdGF0aWMgaW50Ci1zeW10YWJsZV93YXJuKHN0cnVjdCBzeW10YWJsZSAqc3QsIGNoYXIgKm1zZywgaW50IGxpbmVubykKK3N5bXRhYmxlX3dhcm4oc3RydWN0IHN5bXRhYmxlICpzdCwgY29uc3QgY2hhciAqbXNnLCBpbnQgbGluZW5vKQogewogICAgIFB5T2JqZWN0ICptZXNzYWdlID0gUHlVbmljb2RlX0Zyb21TdHJpbmcobXNnKTsKICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKQpAQCAtMTQ0Nyw2ICsxNDQ3LDE1IEBACiAgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5DYWxsLmFyZ3MpOwogICAgICAgICBWSVNJVF9TRVFfV0lUSF9OVUxMKHN0LCBrZXl3b3JkLCBlLT52LkNhbGwua2V5d29yZHMpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcm1hdHRlZFZhbHVlX2tpbmQ6CisgICAgICAgIFZJU0lUKHN0LCBleHByLCBlLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlKTsKKyAgICAgICAgaWYgKGUtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICBWSVNJVChzdCwgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIFZJU0lUX1NFUShzdCwgZXhwciwgZS0+di5Kb2luZWRTdHIudmFsdWVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDb25zdGFudF9raW5kOgogICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgY2FzZSBTdHJfa2luZDoKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CmRpZmYgLS1naXQgYS9QeXRob24vc3lzbW9kdWxlLmMgYi9QeXRob24vc3lzbW9kdWxlLmMKaW5kZXggOGQ3ZTA1YS4uNTYxNzVkOSAxMDA2NDQKLS0tIGEvUHl0aG9uL3N5c21vZHVsZS5jCisrKyBiL1B5dGhvbi9zeXNtb2R1bGUuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgInB5dGhyZWFkLmgiCiAKICNpbmNsdWRlICJvc2RlZnMuaCIKKyNpbmNsdWRlIDxsb2NhbGUuaD4KIAogI2lmZGVmIE1TX1dJTkRPV1MKICNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTgpAQCAtMzMsNyArMzQsNiBAQAogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xBTkdJTkZPX0gKLSNpbmNsdWRlIDxsb2NhbGUuaD4KICNpbmNsdWRlIDxsYW5naW5mby5oPgogI2VuZGlmCiAKQEAgLTM0Niw4ICszNDYsMTAgQEAKIHN0YXRpYyBpbnQKIHRyYWNlX2luaXQodm9pZCkKIHsKLSAgICBzdGF0aWMgY2hhciAqd2hhdG5hbWVzWzddID0geyJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY19jYWxsIiwgImNfZXhjZXB0aW9uIiwgImNfcmV0dXJuIn07CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB3aGF0bmFtZXNbN10gPSB7CisgICAgICAgICJjYWxsIiwgImV4Y2VwdGlvbiIsICJsaW5lIiwgInJldHVybiIsCisgICAgICAgICJjX2NhbGwiLCAiY19leGNlcHRpb24iLCAiY19yZXR1cm4iCisgICAgfTsKICAgICBQeU9iamVjdCAqbmFtZTsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7CkBAIC00MzQsMTAgKzQzNiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBQeV9Ob25lKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gZnJhbWUtPmZfdHJhY2U7Ci0gICAgICAgIGZyYW1lLT5mX3RyYWNlID0gTlVMTDsKLSAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKLSAgICAgICAgZnJhbWUtPmZfdHJhY2UgPSByZXN1bHQ7CisgICAgICAgIFB5X1hTRVRSRUYoZnJhbWUtPmZfdHJhY2UsIHJlc3VsdCk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKQEAgLTExNTIsOCArMTE1MSwxMCBAQAogc3lzX2RlYnVnbWFsbG9jc3RhdHMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewogI2lmZGVmIFdJVEhfUFlNQUxMT0MKLSAgICBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyhzdGRlcnIpOwotICAgIGZwdXRjKCdcbicsIHN0ZGVycik7CisgICAgaWYgKF9QeU1lbV9QeW1hbGxvY0VuYWJsZWQoKSkgeworICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyhzdGRlcnIpOworICAgICAgICBmcHV0YygnXG4nLCBzdGRlcnIpOworICAgIH0KICNlbmRpZgogICAgIF9QeU9iamVjdF9EZWJ1Z1R5cGVTdGF0cyhzdGRlcnIpOwogCkBAIC0xNjQzLDE1ICsxNjQ0LDExIEBACiAvKiBzeXMuaW1wbGVtZW50YXRpb24gdmFsdWVzICovCiAjZGVmaW5lIE5BTUUgImNweXRob24iCiBjb25zdCBjaGFyICpfUHlTeXNfSW1wbE5hbWUgPSBOQU1FOwotI2RlZmluZSBRVU9URShhcmcpICNhcmcKLSNkZWZpbmUgU1RSSUZZKG5hbWUpIFFVT1RFKG5hbWUpCi0jZGVmaW5lIE1BSk9SIFNUUklGWShQWV9NQUpPUl9WRVJTSU9OKQotI2RlZmluZSBNSU5PUiBTVFJJRlkoUFlfTUlOT1JfVkVSU0lPTikKKyNkZWZpbmUgTUFKT1IgUHlfU1RSSU5HSUZZKFBZX01BSk9SX1ZFUlNJT04pCisjZGVmaW5lIE1JTk9SIFB5X1NUUklOR0lGWShQWV9NSU5PUl9WRVJTSU9OKQogI2RlZmluZSBUQUcgTkFNRSAiLSIgTUFKT1IgTUlOT1IKIGNvbnN0IGNoYXIgKl9QeVN5c19JbXBsQ2FjaGVUYWcgPSBUQUc7CiAjdW5kZWYgTkFNRQotI3VuZGVmIFFVT1RFCi0jdW5kZWYgU1RSSUZZCiAjdW5kZWYgTUFKT1IKICN1bmRlZiBNSU5PUgogI3VuZGVmIFRBRwpAQCAtMTY5Niw2ICsxNjkzLDE2IEBACiAgICAgaWYgKHJlcyA8IDApCiAgICAgICAgIGdvdG8gZXJyb3I7CiAKKyNpZmRlZiBNVUxUSUFSQ0gKKyAgICB2YWx1ZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKE1VTFRJQVJDSCk7CisgICAgaWYgKHZhbHVlID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgcmVzID0gUHlEaWN0X1NldEl0ZW1TdHJpbmcoaW1wbF9pbmZvLCAiX211bHRpYXJjaCIsIHZhbHVlKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworI2VuZGlmCisKICAgICAvKiBkaWN0IHJlYWR5ICovCiAKICAgICBucyA9IF9QeU5hbWVzcGFjZV9OZXcoaW1wbF9pbmZvKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi90cmFjZWJhY2suYyBiL1B5dGhvbi90cmFjZWJhY2suYwppbmRleCA5NDFkMWNiLi41OTU1MmNhIDEwMDY0NAotLS0gYS9QeXRob24vdHJhY2ViYWNrLmMKKysrIGIvUHl0aG9uL3RyYWNlYmFjay5jCkBAIC00NzksNDAgKzQ3OSwyNiBAQAogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLwogCi1zdGF0aWMgdm9pZAotcmV2ZXJzZV9zdHJpbmcoY2hhciAqdGV4dCwgY29uc3Qgc2l6ZV90IGxlbikKK3ZvaWQKK19QeV9EdW1wRGVjaW1hbChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCiB7Ci0gICAgY2hhciB0bXA7Ci0gICAgc2l6ZV90IGksIGo7Ci0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yIChpPTAsIGo9bGVuLTE7IGkgPCBqOyBpKyssIGotLSkgewotICAgICAgICB0bXAgPSB0ZXh0W2ldOwotICAgICAgICB0ZXh0W2ldID0gdGV4dFtqXTsKLSAgICAgICAgdGV4dFtqXSA9IHRtcDsKLSAgICB9Ci19CisgICAgLyogbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCBmb3Igb3V0cHV0IG9mICVsbGQgb3IgJXAuCisgICAgICAgV2UgbmVlZCBhdCBtb3N0IGNlaWwobG9nMTAoMjU2KSpTSVpFT0ZfTE9OR19MT05HKSBkaWdpdHMsCisgICAgICAgcGx1cyAxIGZvciB0aGUgbnVsbCBieXRlLiAgNTMvMjIgaXMgYW4gdXBwZXIgYm91bmQgZm9yIGxvZzEwKDI1NikuICovCisgICAgY2hhciBidWZmZXJbMSArIChzaXplb2YodW5zaWduZWQgbG9uZykqNTMtMSkgLyAyMiArIDFdOworICAgIGNoYXIgKnB0ciwgKmVuZDsKIAotLyogRm9ybWF0IGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDk5OTk5OV0gdG8gZGVjaW1hbCwKLSAgIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBmaWxlIGZkLgotCi0gICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLwotCi1zdGF0aWMgdm9pZAotZHVtcF9kZWNpbWFsKGludCBmZCwgaW50IHZhbHVlKQotewotICAgIGNoYXIgYnVmZmVyWzddOwotICAgIGludCBsZW47Ci0gICAgaWYgKHZhbHVlIDwgMCB8fCA5OTk5OTkgPCB2YWx1ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGxlbiA9IDA7CisgICAgZW5kID0gJmJ1ZmZlcltQeV9BUlJBWV9MRU5HVEgoYnVmZmVyKSAtIDFdOworICAgIHB0ciA9IGVuZDsKKyAgICAqcHRyID0gJ1wwJzsKICAgICBkbyB7Ci0gICAgICAgIGJ1ZmZlcltsZW5dID0gJzAnICsgKHZhbHVlICUgMTApOworICAgICAgICAtLXB0cjsKKyAgICAgICAgYXNzZXJ0KHB0ciA+PSBidWZmZXIpOworICAgICAgICAqcHRyID0gJzAnICsgKHZhbHVlICUgMTApOwogICAgICAgICB2YWx1ZSAvPSAxMDsKLSAgICAgICAgbGVuKys7CiAgICAgfSB3aGlsZSAodmFsdWUpOwotICAgIHJldmVyc2Vfc3RyaW5nKGJ1ZmZlciwgbGVuKTsKLSAgICBfUHlfd3JpdGVfbm9yYWlzZShmZCwgYnVmZmVyLCBsZW4pOworCisgICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIHB0ciwgZW5kIC0gcHRyKTsKIH0KIAogLyogRm9ybWF0IGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDB4ZmZmZmZmZmZdIHRvIGhleGFkZWNpbWFsIG9mICd3aWR0aCcgZGlnaXRzLApAQCAtNTIwLDI3ICs1MDYsMzEgQEAKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KIAotc3RhdGljIHZvaWQKLWR1bXBfaGV4YWRlY2ltYWwoaW50IGZkLCB1bnNpZ25lZCBsb25nIHZhbHVlLCBpbnQgd2lkdGgpCit2b2lkCitfUHlfRHVtcEhleGFkZWNpbWFsKGludCBmZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSwgUHlfc3NpemVfdCB3aWR0aCkKIHsKLSAgICBpbnQgbGVuOwotICAgIGNoYXIgYnVmZmVyW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDIgKyAxXTsKLSAgICBsZW4gPSAwOworICAgIGNoYXIgYnVmZmVyW3NpemVvZih1bnNpZ25lZCBsb25nKSAqIDIgKyAxXSwgKnB0ciwgKmVuZDsKKyAgICBjb25zdCBQeV9zc2l6ZV90IHNpemUgPSBQeV9BUlJBWV9MRU5HVEgoYnVmZmVyKSAtIDE7CisKKyAgICBpZiAod2lkdGggPiBzaXplKQorICAgICAgICB3aWR0aCA9IHNpemU7CisgICAgLyogaXQncyBvayBpZiB3aWR0aCBpcyBuZWdhdGl2ZSAqLworCisgICAgZW5kID0gJmJ1ZmZlcltzaXplXTsKKyAgICBwdHIgPSBlbmQ7CisgICAgKnB0ciA9ICdcMCc7CiAgICAgZG8gewotICAgICAgICBidWZmZXJbbGVuXSA9IFB5X2hleGRpZ2l0c1t2YWx1ZSAmIDE1XTsKKyAgICAgICAgLS1wdHI7CisgICAgICAgIGFzc2VydChwdHIgPj0gYnVmZmVyKTsKKyAgICAgICAgKnB0ciA9IFB5X2hleGRpZ2l0c1t2YWx1ZSAmIDE1XTsKICAgICAgICAgdmFsdWUgPj49IDQ7Ci0gICAgICAgIGxlbisrOwotICAgIH0gd2hpbGUgKGxlbiA8IHdpZHRoIHx8IHZhbHVlKTsKLSAgICByZXZlcnNlX3N0cmluZyhidWZmZXIsIGxlbik7Ci0gICAgX1B5X3dyaXRlX25vcmFpc2UoZmQsIGJ1ZmZlciwgbGVuKTsKKyAgICB9IHdoaWxlICgoZW5kIC0gcHRyKSA8IHdpZHRoIHx8IHZhbHVlKTsKKworICAgIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBwdHIsIGVuZCAtIHB0cik7CiB9CiAKLS8qIFdyaXRlIGFuIHVuaWNvZGUgb2JqZWN0IGludG8gdGhlIGZpbGUgZmQgdXNpbmcgYXNjaWkrYmFja3NsYXNocmVwbGFjZS4KLQotICAgVGhpcyBmdW5jdGlvbiBpcyBzaWduYWwgc2FmZS4gKi8KLQotc3RhdGljIHZvaWQKLWR1bXBfYXNjaWkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCkKK3ZvaWQKK19QeV9EdW1wQVNDSUkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCkKIHsKICAgICBQeUFTQ0lJT2JqZWN0ICphc2NpaSA9IChQeUFTQ0lJT2JqZWN0ICopdGV4dDsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7CkBAIC01NTAsMzIgKzU0MCwzNiBAQAogICAgIHdjaGFyX3QgKndzdHIgPSBOVUxMOwogICAgIFB5X1VDUzQgY2g7CiAKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayh0ZXh0KSkKKyAgICAgICAgcmV0dXJuOworCiAgICAgc2l6ZSA9IGFzY2lpLT5sZW5ndGg7CiAgICAga2luZCA9IGFzY2lpLT5zdGF0ZS5raW5kOwotICAgIGlmIChhc2NpaS0+c3RhdGUuY29tcGFjdCkgeworICAgIGlmIChraW5kID09IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSB7CisgICAgICAgIHdzdHIgPSAoKFB5QVNDSUlPYmplY3QgKil0ZXh0KS0+d3N0cjsKKyAgICAgICAgaWYgKHdzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc2l6ZSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCAqKXRleHQpLT53c3RyX2xlbmd0aDsKKyAgICB9CisgICAgZWxzZSBpZiAoYXNjaWktPnN0YXRlLmNvbXBhY3QpIHsKICAgICAgICAgaWYgKGFzY2lpLT5zdGF0ZS5hc2NpaSkKICAgICAgICAgICAgIGRhdGEgPSAoKFB5QVNDSUlPYmplY3QqKXRleHQpICsgMTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZGF0YSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCopdGV4dCkgKyAxOwogICAgIH0KLSAgICBlbHNlIGlmIChraW5kICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKSB7CisgICAgZWxzZSB7CiAgICAgICAgIGRhdGEgPSAoKFB5VW5pY29kZU9iamVjdCAqKXRleHQpLT5kYXRhLmFueTsKICAgICAgICAgaWYgKGRhdGEgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHdzdHIgPSAoKFB5QVNDSUlPYmplY3QgKil0ZXh0KS0+d3N0cjsKLSAgICAgICAgaWYgKHdzdHIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc2l6ZSA9ICgoUHlDb21wYWN0VW5pY29kZU9iamVjdCAqKXRleHQpLT53c3RyX2xlbmd0aDsKLSAgICB9CiAKICAgICBpZiAoTUFYX1NUUklOR19MRU5HVEggPCBzaXplKSB7CiAgICAgICAgIHNpemUgPSBNQVhfU1RSSU5HX0xFTkdUSDsKICAgICAgICAgdHJ1bmNhdGVkID0gMTsKICAgICB9Ci0gICAgZWxzZQorICAgIGVsc2UgewogICAgICAgICB0cnVuY2F0ZWQgPSAwOworICAgIH0KIAogICAgIGZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChraW5kICE9IFB5VW5pY29kZV9XQ0hBUl9LSU5EKQpAQCAtNTg5LDE5ICs1ODMsMjAgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChjaCA8PSAweGZmKSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFx4Iik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgMik7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgMik7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPD0gMHhmZmZmKSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFx1Iik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgNCk7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgNCk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBQVVRTKGZkLCAiXFxVIik7Ci0gICAgICAgICAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCBjaCwgOCk7CisgICAgICAgICAgICBfUHlfRHVtcEhleGFkZWNpbWFsKGZkLCBjaCwgOCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHRydW5jYXRlZCkKKyAgICBpZiAodHJ1bmNhdGVkKSB7CiAgICAgICAgIFBVVFMoZmQsICIuLi4iKTsKKyAgICB9CiB9CiAKIC8qIFdyaXRlIGEgZnJhbWUgaW50byB0aGUgZmlsZSBmZDogIkZpbGUgInh4eCIsIGxpbmUgeHh4IGluIHh4eCIuCkBAIC02MjAsNyArNjE1LDcgQEAKICAgICAgICAgJiYgUHlVbmljb2RlX0NoZWNrKGNvZGUtPmNvX2ZpbGVuYW1lKSkKICAgICB7CiAgICAgICAgIFBVVFMoZmQsICJcIiIpOwotICAgICAgICBkdW1wX2FzY2lpKGZkLCBjb2RlLT5jb19maWxlbmFtZSk7CisgICAgICAgIF9QeV9EdW1wQVNDSUkoZmQsIGNvZGUtPmNvX2ZpbGVuYW1lKTsKICAgICAgICAgUFVUUyhmZCwgIlwiIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUFVUUyhmZCwgIj8/PyIpOwpAQCAtNjI5LDE0ICs2MjQsMjEgQEAKICAgICAvKiBQeUZyYW1lX0dldExpbmVOdW1iZXIoKSB3YXMgaW50cm9kdWNlZCBpbiBQeXRob24gMi43LjAgYW5kIDMuMi4wICovCiAgICAgbGluZW5vID0gUHlDb2RlX0FkZHIyTGluZShjb2RlLCBmcmFtZS0+Zl9sYXN0aSk7CiAgICAgUFVUUyhmZCwgIiwgbGluZSAiKTsKLSAgICBkdW1wX2RlY2ltYWwoZmQsIGxpbmVubyk7CisgICAgaWYgKGxpbmVubyA+PSAwKSB7CisgICAgICAgIF9QeV9EdW1wRGVjaW1hbChmZCwgKHVuc2lnbmVkIGxvbmcpbGluZW5vKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKKyAgICB9CiAgICAgUFVUUyhmZCwgIiBpbiAiKTsKIAogICAgIGlmIChjb2RlICE9IE5VTEwgJiYgY29kZS0+Y29fbmFtZSAhPSBOVUxMCi0gICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19uYW1lKSkKLSAgICAgICAgZHVtcF9hc2NpaShmZCwgY29kZS0+Y29fbmFtZSk7Ci0gICAgZWxzZQorICAgICAgICYmIFB5VW5pY29kZV9DaGVjayhjb2RlLT5jb19uYW1lKSkgeworICAgICAgICBfUHlfRHVtcEFTQ0lJKGZkLCBjb2RlLT5jb19uYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CiAgICAgICAgIFBVVFMoZmQsICI/Pz8iKTsKKyAgICB9CiAKICAgICBQVVRTKGZkLCAiXG4iKTsKIH0KQEAgLTY5Miw3ICs2OTQsOSBAQAogICAgICAgICBQVVRTKGZkLCAiQ3VycmVudCB0aHJlYWQgMHgiKTsKICAgICBlbHNlCiAgICAgICAgIFBVVFMoZmQsICJUaHJlYWQgMHgiKTsKLSAgICBkdW1wX2hleGFkZWNpbWFsKGZkLCAodW5zaWduZWQgbG9uZyl0c3RhdGUtPnRocmVhZF9pZCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjIpOworICAgIF9QeV9EdW1wSGV4YWRlY2ltYWwoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyl0c3RhdGUtPnRocmVhZF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDIpOwogICAgIFBVVFMoZmQsICIgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuIik7CiB9CiAKQEAgLTcwNCwxMSArNzA4LDU2IEBACiAgICBoYW5kbGVycyBpZiBzaWduYWxzIHdlcmUgcmVjZWl2ZWQuICovCiBjb25zdCBjaGFyKgogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKGludCBmZCwgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90aHJlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90c3RhdGUpCiB7CiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlOwogICAgIHVuc2lnbmVkIGludCBudGhyZWFkczsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgaWYgKGN1cnJlbnRfdHN0YXRlID09IE5VTEwpIHsKKyAgICAgICAgLyogX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKCkgaXMgY2FsbGVkIGZyb20gc2lnbmFsIGhhbmRsZXJzIGJ5CisgICAgICAgICAgIGZhdWx0aGFuZGxlci4KKworICAgICAgICAgICBTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQsIFNJR0JVUyBhbmQgU0lHSUxMIGFyZSBzeW5jaHJvbm91cyBzaWduYWxzCisgICAgICAgICAgIGFuZCBhcmUgdGh1cyBkZWxpdmVyZWQgdG8gdGhlIHRocmVhZCB0aGF0IGNhdXNlZCB0aGUgZmF1bHQuIEdldCB0aGUKKyAgICAgICAgICAgUHl0aG9uIHRocmVhZCBzdGF0ZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuCisKKyAgICAgICAgICAgUHlUaHJlYWRTdGF0ZV9HZXQoKSBkb2Vzbid0IGdpdmUgdGhlIHN0YXRlIG9mIHRoZSB0aHJlYWQgdGhhdCBjYXVzZWQKKyAgICAgICAgICAgdGhlIGZhdWx0IGlmIHRoZSB0aHJlYWQgcmVsZWFzZWQgdGhlIEdJTCwgYW5kIHNvIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgY2Fubm90IGJlIHVzZWQuIFJlYWQgdGhlIHRocmVhZCBsb2NhbCBzdG9yYWdlIChUTFMpIGluc3RlYWQ6IGNhbGwKKyAgICAgICAgICAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKS4gKi8KKyAgICAgICAgY3VycmVudF90c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOworICAgIH0KKworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgaW50ZXJwID0gX1B5R0lMU3RhdGVfR2V0SW50ZXJwcmV0ZXJTdGF0ZVVuc2FmZSgpOworICAgICAgICAgICAgaWYgKGludGVycCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogV2UgbmVlZCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgdG8gZ2V0IFB5dGhvbiB0aHJlYWRzICovCisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmFibGUgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpbnRlcnAgPSBjdXJyZW50X3RzdGF0ZS0+aW50ZXJwOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAvKiBDYWxsIF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpIGluc3RlYWQgb2YgUHlUaHJlYWRTdGF0ZV9HZXQoKQorICAgICAgICAgICB0byBub3QgZmFpbCB3aXRoIGEgZmF0YWwgZXJyb3IgaWYgdGhlIHRocmVhZCBzdGF0ZSBpcyBOVUxMLiAqLworICAgICAgICBjdXJyZW50X3RzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOworICAgIH0KKworICAgIGlmIChpbnRlcnAgPT0gTlVMTCkgeworICAgICAgICBpZiAoY3VycmVudF90c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAgICAgLyogV2UgbmVlZCB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgdG8gZ2V0IFB5dGhvbiB0aHJlYWRzICovCisgICAgICAgICAgICByZXR1cm4gInVuYWJsZSB0byBnZXQgdGhlIGludGVycHJldGVyIHN0YXRlIjsKKyAgICAgICAgfQorICAgICAgICBpbnRlcnAgPSBjdXJyZW50X3RzdGF0ZS0+aW50ZXJwOworICAgIH0KKyNlbmRpZgorICAgIGFzc2VydChpbnRlcnAgIT0gTlVMTCk7CisKICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIgZnJvbSB0aGUgY3VycmVudCB0aHJlYWQgKi8KICAgICB0c3RhdGUgPSBQeUludGVycHJldGVyU3RhdGVfVGhyZWFkSGVhZChpbnRlcnApOwogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkKQEAgLTcyNiw3ICs3NzUsNyBAQAogICAgICAgICAgICAgUFVUUyhmZCwgIi4uLlxuIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICB3cml0ZV90aHJlYWRfaWQoZmQsIHRzdGF0ZSwgdHN0YXRlID09IGN1cnJlbnRfdGhyZWFkKTsKKyAgICAgICAgd3JpdGVfdGhyZWFkX2lkKGZkLCB0c3RhdGUsIHRzdGF0ZSA9PSBjdXJyZW50X3RzdGF0ZSk7CiAgICAgICAgIGR1bXBfdHJhY2ViYWNrKGZkLCB0c3RhdGUsIDApOwogICAgICAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX05leHQodHN0YXRlKTsKICAgICAgICAgbnRocmVhZHMrKzsKZGlmZiAtLWdpdCBhL1B5dGhvbi93b3JkY29kZV9oZWxwZXJzLmggYi9QeXRob24vd29yZGNvZGVfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9QeXRob24vd29yZGNvZGVfaGVscGVycy5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIHNoYXJlZCBieSB0aGUgY29tcGlsZXIgYW5kIHRoZSBwZWVwaG9sZQorICAgb3B0aW1pemVyLgorICovCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIGJ5dGVzIG5lY2Vzc2FyeSB0byBlbmNvZGUgaW5zdHJ1Y3Rpb24gd2l0aCBFWFRFTkRFRF9BUkdzICovCitzdGF0aWMgaW50CitpbnN0cnNpemUodW5zaWduZWQgaW50IG9wYXJnKQoreworICAgIHJldHVybiBvcGFyZyA8PSAweGZmID8gMiA6CisgICAgICAgIG9wYXJnIDw9IDB4ZmZmZiA/IDQgOgorICAgICAgICBvcGFyZyA8PSAweGZmZmZmZiA/IDYgOgorICAgICAgICA4OworfQorCisvKiBTcGl0cyBvdXQgb3Avb3BhcmcgcGFpciB1c2luZyBpbGVuIGJ5dGVzLiBjb2Rlc3RyIHNob3VsZCBiZSBwb2ludGVkIGF0IHRoZQorICAgZGVzaXJlZCBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgRVhURU5ERURfQVJHICovCitzdGF0aWMgdm9pZAord3JpdGVfb3BfYXJnKHVuc2lnbmVkIGNoYXIgKmNvZGVzdHIsIHVuc2lnbmVkIGNoYXIgb3Bjb2RlLAorICAgIHVuc2lnbmVkIGludCBvcGFyZywgaW50IGlsZW4pCit7CisgICAgc3dpdGNoIChpbGVuKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDI0KSAmIDB4ZmY7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBFWFRFTkRFRF9BUkc7CisgICAgICAgICAgICAqY29kZXN0cisrID0gKG9wYXJnID4+IDgpICYgMHhmZjsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgKmNvZGVzdHIrKyA9IG9wY29kZTsKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBvcGFyZyAmIDB4ZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggNDgzMTM0ZC4uMWIxNWI3YyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLVRoaXMgaXMgUHl0aG9uIHZlcnNpb24gMy41LjMgcmVsZWFzZSBjYW5kaWRhdGUgMQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNi4wIGFscGhhIDIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsCiAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTI4LDkgKzI4LDkgQEAKIGVsc2V3aGVyZSBpdCdzIGp1c3QgcHl0aG9uLgogCiBPbiBNYWMgT1MgWCwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBQeXRob24gd2l0aCAtLWVuYWJsZS1mcmFtZXdvcmssIHlvdSBzaG91bGQKLXVzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB0byBkbyB0aGUgaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaW5zdGFsbHMKLXRoZSBQeXRob24gZXhlY3V0YWJsZSBpbiBhIHBsYWNlIHRoYXQgaXMgbm90IG5vcm1hbGx5IG9uIHlvdXIgUEFUSCwgeW91IG1heQotd2FudCB0byBzZXQgdXAgYSBzeW1saW5rIGluIC91c3IvbG9jYWwvYmluLgordXNlICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgdGhpcyBpbnN0YWxscyB0aGUKK1B5dGhvbiBleGVjdXRhYmxlIGluIGEgcGxhY2UgdGhhdCBpcyBub3Qgbm9ybWFsbHkgb24geW91ciBQQVRILCB5b3UgbWF5IHdhbnQgdG8KK3NldCB1cCBhIHN5bWxpbmsgaW4gL3Vzci9sb2NhbC9iaW4uCiAKIE9uIFdpbmRvd3MsIHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQuCiAKQEAgLTc5LDkgKzc5LDkgQEAKIC0tLS0tLS0tLS0KIAogV2UgaGF2ZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXMgaW4gdGhlICJXaGF0J3MgTmV3IGluCi1QeXRob24gMy41IiBkb2N1bWVudCwgZm91bmQgYXQKK1B5dGhvbiAzLjYiIGRvY3VtZW50LCBmb3VuZCBhdAogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvd2hhdHNuZXcvMy41Lmh0bWwKKyAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvd2hhdHNuZXcvMy42Lmh0bWwKIAogRm9yIGEgbW9yZSBkZXRhaWxlZCBjaGFuZ2UgbG9nLCByZWFkIE1pc2MvTkVXUyAodGhvdWdoIHRoaXMgZmlsZSwgdG9vLAogaXMgaW5jb21wbGV0ZSwgYW5kIGFsc28gZG9lc24ndCBsaXN0IGFueXRoaW5nIG1lcmdlZCBpbiBmcm9tIHRoZSAyLjcKQEAgLTk0LDkgKzk0LDkgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotRG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDMuNSBpcyBvbmxpbmUsIHVwZGF0ZWQgZGFpbHk6CitEb2N1bWVudGF0aW9uIGZvciBQeXRob24gMy42IGlzIG9ubGluZSwgdXBkYXRlZCBkYWlseToKIAotICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy41LworICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuNi8KIAogSXQgY2FuIGFsc28gYmUgZG93bmxvYWRlZCBpbiBtYW55IGZvcm1hdHMgZm9yIGZhc3RlciBhY2Nlc3MuICBUaGUgZG9jdW1lbnRhdGlvbgogaXMgZG93bmxvYWRhYmxlIGluIEhUTUwsIFBERiwgYW5kIHJlU3RydWN0dXJlZFRleHQgZm9ybWF0czsgdGhlIGxhdHRlciB2ZXJzaW9uCkBAIC0xMDYsNyArMTA2LDcgQEAKIElmIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiwgcmVsZXZhbnQKIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0OgogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KKyAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KIAogRm9yIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFB5dGhvbidzIGRvY3VtZW50YXRpb24sIHJlZmVyIHRvIERvYy9SRUFETUUudHh0LgogCkBAIC0xMjEsNyArMTIxLDcgQEAKIEEgc291cmNlLXRvLXNvdXJjZSB0cmFuc2xhdGlvbiB0b29sLCAiMnRvMyIsIGNhbiB0YWtlIGNhcmUgb2YgdGhlIG11bmRhbmUgdGFzawogb2YgY29udmVydGluZyBsYXJnZSBhbW91bnRzIG9mIHNvdXJjZSBjb2RlLiAgSXQgaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gYnV0CiBpcyBjb21wbGVtZW50ZWQgYnkgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIDIuNi4gIFNlZQotaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAogVGVzdGluZwpAQCAtMTUxLDE2ICsxNTEsMTYgQEAKIAogT24gVW5peCBhbmQgTWFjIHN5c3RlbXMgaWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbgogdXNpbmcgdGhlIHNhbWUgaW5zdGFsbGF0aW9uIHByZWZpeCAoLS1wcmVmaXggYXJndW1lbnQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQpCi15b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5Ci10aGUgaW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZAotdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKLXNpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzCi10byAke3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZwotdGhlIHNhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiCi12ZXJzaW9uLiAgSW5zdGFsbCB0aGF0IHZlcnNpb24gdXNpbmcgIm1ha2UgaW5zdGFsbCIuICBJbnN0YWxsIGFsbCBvdGhlcgotdmVyc2lvbnMgdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIuCit5b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5IHRoZQoraW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZCB1c2luZworIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKK3NpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzIHRvCiske3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZyB0aGUKK3NhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiIHZlcnNpb24uCitJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyIHZlcnNpb25zIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIi4KIAotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgUHl0aG9uIDIuNiwgMi43IGFuZCAzLjUgd2l0aCAyLjcgYmVpbmcgdGhlCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNiB3aXRoIDIuNyBiZWluZyB0aGUKIHByaW1hcnkgdmVyc2lvbiwgeW91IHdvdWxkIGV4ZWN1dGUgIm1ha2UgaW5zdGFsbCIgaW4geW91ciAyLjcgYnVpbGQgZGlyZWN0b3J5CiBhbmQgIm1ha2UgYWx0aW5zdGFsbCIgaW4gdGhlIG90aGVycy4KIApAQCAtMTcxLDcgKzE3MSw3IEBACiBXZSdyZSBzb2xpY2l0aW5nIGJ1ZyByZXBvcnRzIGFib3V0IGFsbCBhc3BlY3RzIG9mIHRoZSBsYW5ndWFnZS4gIEZpeGVzIGFyZSBhbHNvCiB3ZWxjb21lLCBwcmVmZXJhYmx5IGluIHVuaWZpZWQgZGlmZiBmb3JtYXQuICBQbGVhc2UgdXNlIHRoZSBpc3N1ZSB0cmFja2VyOgogCi0gICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy8KKyAgICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy8KIAogSWYgeW91J3JlIG5vdCBzdXJlIHdoZXRoZXIgeW91J3JlIGRlYWxpbmcgd2l0aCBhIGJ1ZyBvciBhIGZlYXR1cmUsIHVzZSB0aGUKIG1haWxpbmcgbGlzdDoKQEAgLTE4MCwyMyArMTgwLDIzIEBACiAKIFRvIHN1YnNjcmliZSB0byB0aGUgbGlzdCwgdXNlIHRoZSBtYWlsbWFuIGZvcm06CiAKLSAgICBodHRwOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vcHl0aG9uLWRldi8KKyAgICBodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1kZXYvCiAKIAogUHJvcG9zYWxzIGZvciBlbmhhbmNlbWVudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgaGF2ZSBhIHByb3Bvc2FsIHRvIGNoYW5nZSBQeXRob24sIHlvdSBtYXkgd2FudCB0byBzZW5kIGFuIGVtYWlsIHRvIHRoZQotY29tcC5sYW5nLnB5dGhvbiBvciBweXRob24taWRlYXMgbWFpbGluZyBsaXN0cyBmb3IgaW5pdGFsIGZlZWRiYWNrLiAgQSBQeXRob24KK2NvbXAubGFuZy5weXRob24gb3IgcHl0aG9uLWlkZWFzIG1haWxpbmcgbGlzdHMgZm9yIGluaXRpYWwgZmVlZGJhY2suICBBIFB5dGhvbgogRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkgbWF5IGJlIHN1Ym1pdHRlZCBpZiB5b3VyIGlkZWEgZ2FpbnMgZ3JvdW5kLiAgQWxsCiBjdXJyZW50IFBFUHMsIGFzIHdlbGwgYXMgZ3VpZGVsaW5lcyBmb3Igc3VibWl0dGluZyBhIG5ldyBQRVAsIGFyZSBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy8uCitodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzLy4KIAogCiBSZWxlYXNlIFNjaGVkdWxlCiAtLS0tLS0tLS0tLS0tLS0tCiAKLVNlZSBQRVAgNDc4IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3OC8KK1NlZSBQRVAgNDk0IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0OTQvCiAKIAogQ29weXJpZ2h0IGFuZCBMaWNlbnNlIEluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC90ZXN0LmJhdCBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CmluZGV4IGZmN2QxNjcuLjU5NzJkNWUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CkBAIC00LDcgKzQsNyBAQAogDQogc2V0IGhlcmU9JX5kcDANCiBzZXQgcnRfb3B0cz0tcSAtZA0KLXNldCByZWdydGVzdF9hcmdzPQ0KK3NldCByZWdydGVzdF9hcmdzPS1qMQ0KIA0KIDpDaGVja09wdHMNCiBpZiAiJTEiPT0iLXg2NCIgKHNldCBydF9vcHRzPSVydF9vcHRzJSAlMSkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzDQpAQCAtMTYsNCArMTYsNCBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RfYXJncz0lcmVncnRlc3RfYXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIGVjaG8gb24NCi1jYWxsICIlaGVyZSUuLlwuLlxQQ2J1aWxkXHJ0LmJhdCIgJXJ0X29wdHMlIC11YWxsIC1yd1cgLS10aW1lb3V0PTM2MDAgJXJlZ3J0ZXN0X2FyZ3MlDQorY2FsbCAiJWhlcmUlLi5cLi5cUENidWlsZFxydC5iYXQiICVydF9vcHRzJSAtdWFsbCAtcndXIC0tdGltZW91dD05MDAgJXJlZ3J0ZXN0X2FyZ3MlDQpkaWZmIC0tZ2l0IGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weSBiL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkKaW5kZXggMWQ4NTFkYS4uYzk2NDA5MyAxMDA3NTUKLS0tIGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weQorKysgYi9Ub29scy9jbGluaWMvY2xpbmljLnB5CkBAIC02NDQsNyArNjQ0LDcgQEAKICAgICAgICAgZGVmYXVsdF9yZXR1cm5fY29udmVydGVyID0gKG5vdCBmLnJldHVybl9jb252ZXJ0ZXIgb3IKICAgICAgICAgICAgIGYucmV0dXJuX2NvbnZlcnRlci50eXBlID09ICdQeU9iamVjdCAqJykKIAotICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgKHBhcmFtZXRlcnNbLTFdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgcGFyYW1ldGVyc1stMV0uaXNfcG9zaXRpb25hbF9vbmx5KCkKICAgICAgICAgYWxsX2JvcmluZ19vYmplY3RzID0gRmFsc2UgIyB5ZXMsIHRoaXMgd2lsbCBiZSBmYWxzZSBpZiB0aGVyZSBhcmUgMCBwYXJhbWV0ZXJzLCBpdCdzIGZpbmUKICAgICAgICAgZmlyc3Rfb3B0aW9uYWwgPSBsZW4ocGFyYW1ldGVycykKICAgICAgICAgZm9yIGksIHAgaW4gZW51bWVyYXRlKHBhcmFtZXRlcnMpOgpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgIG5ld19vcl9pbml0ID0gZi5raW5kIGluIChNRVRIT0RfTkVXLCBNRVRIT0RfSU5JVCkKIAogICAgICAgICBtZXRoX28gPSAobGVuKHBhcmFtZXRlcnMpID09IDEgYW5kCi0gICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkgYW5kCisgICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0uaXNfcG9zaXRpb25hbF9vbmx5KCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBjb252ZXJ0ZXJzWzBdLmlzX29wdGlvbmFsKCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBuZXdfb3JfaW5pdCkKIApAQCAtNzk3LDggKzc5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICIiIiAlIGFyZ25hbWUpCiAKICAgICAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAiIiIgJSBhcmduYW1lLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgZWxpZiBoYXNfb3B0aW9uX2dyb3VwczoKQEAgLTgyMiw4ICs4MjMsOSBAQAogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBwYXJzZXJfYm9keShwYXJzZXJfcHJvdG90eXBlLCBub3JtYWxpemVfc25pcHBldCgiIiIKICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ7bmFtZX0iLAogICAgICAgICAgICAgICAgICAgICB7dW5wYWNrX21pbn0sIHt1bnBhY2tfbWF4fSwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsaWYgcG9zaXRpb25hbDoKQEAgLTgzNSw4ICs4MzcsOSBAQAogCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsc2U6CkBAIC04NDcsMTMgKzg1MCwxNSBAQAogCiAgICAgICAgICAgICBib2R5ID0gbm9ybWFsaXplX3NuaXBwZXQoIiIiCiAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwgX2tleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIF9rZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBpbnNlcnRfa2V5d29yZHMocGFyc2VyX2RlZmluaXRpb24pCiAKQEAgLTg3OCwxMyArODgzLDE1IEBACiAKICAgICAgICAgICAgIGlmIG5vdCBwYXJzZXNfa2V5d29yZHM6CiAgICAgICAgICAgICAgICAgZmllbGRzLmluc2VydCgwLCBub3JtYWxpemVfc25pcHBldCgiIiIKLSAgICAgICAgICAgICAgICAgICAgaWYgKHtzZWxmX3R5cGVfY2hlY2t9IV9QeUFyZ19Ob0tleXdvcmRzKCJ7bmFtZX0iLCBrd2FyZ3MpKQorICAgICAgICAgICAgICAgICAgICBpZiAoe3NlbGZfdHlwZV9jaGVja30hX1B5QXJnX05vS2V5d29yZHMoIntuYW1lfSIsIGt3YXJncykpIHt7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJzZXNfcG9zaXRpb25hbDoKICAgICAgICAgICAgICAgICAgICAgZmllbGRzLmluc2VydCgwLCBub3JtYWxpemVfc25pcHBldCgiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJ7bmFtZX0iLCBhcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJ7bmFtZX0iLCBhcmdzKSkge3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgICAgIHBhcnNlcl9kZWZpbml0aW9uID0gcGFyc2VyX2JvZHkocGFyc2VyX3Byb3RvdHlwZSwgKmZpZWxkcykKQEAgLTEwMzIsOCArMTAzOSw5IEBACiAKICAgICAgICAgICAgIHMgPSAiIiIKICAgICBjYXNlIHtjb3VudH06Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfX0KICAgICAgICAge2dyb3VwX2Jvb2xlYW5zfQogICAgICAgICBicmVhazsKICIiIlsxOl0KQEAgLTEwNjcsNyArMTA3NSw3IEBACiAKICAgICAgICAgbGFzdF9ncm91cCA9IDAKICAgICAgICAgZmlyc3Rfb3B0aW9uYWwgPSBsZW4oc2VsZmxlc3MpCi0gICAgICAgIHBvc2l0aW9uYWwgPSBzZWxmbGVzcyBhbmQgc2VsZmxlc3NbLTFdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZCisgICAgICAgIHBvc2l0aW9uYWwgPSBzZWxmbGVzcyBhbmQgc2VsZmxlc3NbLTFdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIG5ld19vcl9pbml0ID0gZi5raW5kIGluIChNRVRIT0RfTkVXLCBNRVRIT0RfSU5JVCkKICAgICAgICAgZGVmYXVsdF9yZXR1cm5fY29udmVydGVyID0gKG5vdCBmLnJldHVybl9jb252ZXJ0ZXIgb3IKICAgICAgICAgICAgIGYucmV0dXJuX2NvbnZlcnRlci50eXBlID09ICdQeU9iamVjdCAqJykKQEAgLTIzNTksNyArMjM2NywxMCBAQAogICAgICAgICAgICAgZGF0YS5tb2RpZmljYXRpb25zLmFwcGVuZCgnLyogbW9kaWZpY2F0aW9ucyBmb3IgJyArIG5hbWUgKyAnICovXG4nICsgbW9kaWZpY2F0aW9ucy5yc3RyaXAoKSkKIAogICAgICAgICAjIGtleXdvcmRzCi0gICAgICAgIGRhdGEua2V5d29yZHMuYXBwZW5kKHBhcmFtZXRlci5uYW1lKQorICAgICAgICBpZiBwYXJhbWV0ZXIuaXNfcG9zaXRpb25hbF9vbmx5KCk6CisgICAgICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZCgnJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEua2V5d29yZHMuYXBwZW5kKHBhcmFtZXRlci5uYW1lKQogCiAgICAgICAgICMgZm9ybWF0X3VuaXRzCiAgICAgICAgIGlmIHNlbGYuaXNfb3B0aW9uYWwoKSBhbmQgJ3wnIG5vdCBpbiBkYXRhLmZvcm1hdF91bml0czoKQEAgLTI2NzYsNyArMjY4Nyw3IEBACiAgICAgZGVmIGNsZWFudXAoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgICBuYW1lID0gZW5zdXJlX2xlZ2FsX2NfaWRlbnRpZmllcihzZWxmLm5hbWUpCi0gICAgICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiKVxuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbiJdKQorICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oWyJpZiAoIiwgbmFtZSwgIikge1xuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAjCiAjIFRoaXMgaXMgdGhlIGZvdXJ0aCBvciBmaWZ0aCByZXdyaXRlIG9mIHJlZ2lzdGVyaW5nIGFsbCB0aGUKQEAgLTI3ODYsNyArMjc5Nyw3IEBACiAKICAgICBkZWYgY2xlYW51cChzZWxmKToKICAgICAgICAgbmFtZSA9IGVuc3VyZV9sZWdhbF9jX2lkZW50aWZpZXIoc2VsZi5uYW1lKQotICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiLm9iailcbiAgIFB5QnVmZmVyX1JlbGVhc2UoJiIsIG5hbWUsICIpO1xuIl0pCisgICAgICAgIHJldHVybiAiIi5qb2luKFsiaWYgKCIsIG5hbWUsICIub2JqKSB7XG4gICBQeUJ1ZmZlcl9SZWxlYXNlKCYiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAKIGRlZiBjb3JyZWN0X25hbWVfZm9yX3NlbGYoZik6CkBAIC0yOTU5LDEwICsyOTcwLDEwIEBACiAgICAgICAgIGRhdGEucmV0dXJuX3ZhbHVlID0gbmFtZQogCiAgICAgZGVmIGVycl9vY2N1cnJlZF9pZihzZWxmLCBleHByLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICgoe30pICYmIFB5RXJyX09jY3VycmVkKCkpXG4gICAgZ290byBleGl0O1xuJy5mb3JtYXQoZXhwcikpCisgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoKHt9KSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdChleHByKSkKIAogICAgIGRlZiBlcnJfb2NjdXJyZWRfaWZfbnVsbF9wb2ludGVyKHNlbGYsIHZhcmlhYmxlLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKVxuICAgIGdvdG8gZXhpdDtcbicuZm9ybWF0KHZhcmlhYmxlKSkKKyAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdCh2YXJpYWJsZSkpCiAKICAgICBkZWYgcmVuZGVyKHNlbGYsIGZ1bmN0aW9uLCBkYXRhKToKICAgICAgICAgIiIiCkBAIC0yOTc3LDggKzI5ODgsOSBAQAogICAgIGRlZiByZW5kZXIoc2VsZiwgZnVuY3Rpb24sIGRhdGEpOgogICAgICAgICBzZWxmLmRlY2xhcmUoZGF0YSkKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJycnCi1pZiAoX3JldHVybl92YWx1ZSAhPSBQeV9Ob25lKQoraWYgKF9yZXR1cm5fdmFsdWUgIT0gUHlfTm9uZSkgewogICAgIGdvdG8gZXhpdDsKK30KIHJldHVybl92YWx1ZSA9IFB5X05vbmU7CiBQeV9JTkNSRUYoUHlfTm9uZSk7CiAnJycuc3RyaXAoKSkKQEAgLTMxODMsNiArMzE5NSw3IEBACiAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlX2RzbF9zdGFydAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9pbmRlbnQgPSBOb25lCiAgICAgICAgIHNlbGYua2V5d29yZF9vbmx5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5wb3NpdGlvbmFsX29ubHkgPSBGYWxzZQogICAgICAgICBzZWxmLmdyb3VwID0gMAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9zdGF0ZSA9IHNlbGYucHNfc3RhcnQKICAgICAgICAgc2VsZi5zZWVuX3Bvc2l0aW9uYWxfd2l0aF9kZWZhdWx0ID0gRmFsc2UKQEAgLTM1NjEsOCArMzU3NCw4IEBACiAgICAgIyAicGFyYW1ldGVyX3N0YXRlIi4gIChQcmV2aW91c2x5IHRoZSBjb2RlIHdhcyBhIG1pYXNtYSBvZiBpZnMgYW5kCiAgICAgIyBzZXBhcmF0ZSBib29sZWFuIHN0YXRlIHZhcmlhYmxlcy4pICBUaGUgc3RhdGVzIGFyZToKICAgICAjCi0gICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAvICAgPC0gbGluZQotICAgICMgMDEgICAyICAgICAgICAgIDMgICAgICAgNCAgICA1ICAgICAgICAgICA2ICAgNyAgIDwtIHN0YXRlIHRyYW5zaXRpb25zCisgICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAgIDwtIGxpbmUKKyAgICAjIDAxICAgMiAgICAgICAgICAzICAgICAgIDQgICAgNSAgICAgICAgICAgNiAgICAgPC0gc3RhdGUgdHJhbnNpdGlvbnMKICAgICAjCiAgICAgIyAwOiBwc19zdGFydC4gIGJlZm9yZSB3ZSd2ZSBzZWVuIGFueXRoaW5nLiAgbGVnYWwgdHJhbnNpdGlvbnMgYXJlIHRvIDEgb3IgMy4KICAgICAjIDE6IHBzX2xlZnRfc3F1YXJlX2JlZm9yZS4gIGxlZnQgc3F1YXJlIGJyYWNrZXRzIGJlZm9yZSByZXF1aXJlZCBwYXJhbWV0ZXJzLgpAQCAtMzU3Myw5ICszNTg2LDggQEAKICAgICAjICAgIG5vdyBtdXN0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgIyA1OiBwc19ncm91cF9hZnRlci4gIGluIGEgZ3JvdXAsIGFmdGVyIHJlcXVpcmVkIHBhcmFtZXRlcnMuCiAgICAgIyA2OiBwc19yaWdodF9zcXVhcmVfYWZ0ZXIuICByaWdodCBzcXVhcmUgYnJhY2tldHMgYWZ0ZXIgcmVxdWlyZWQgcGFyYW1ldGVycy4KLSAgICAjIDc6IHBzX3NlZW5fc2xhc2guICBzZWVuIHNsYXNoLgogICAgIHBzX3N0YXJ0LCBwc19sZWZ0X3NxdWFyZV9iZWZvcmUsIHBzX2dyb3VwX2JlZm9yZSwgcHNfcmVxdWlyZWQsIFwKLSAgICBwc19vcHRpb25hbCwgcHNfZ3JvdXBfYWZ0ZXIsIHBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgcHNfc2Vlbl9zbGFzaCA9IHJhbmdlKDgpCisgICAgcHNfb3B0aW9uYWwsIHBzX2dyb3VwX2FmdGVyLCBwc19yaWdodF9zcXVhcmVfYWZ0ZXIgPSByYW5nZSg3KQogCiAgICAgZGVmIHN0YXRlX3BhcmFtZXRlcnNfc3RhcnQoc2VsZiwgbGluZSk6CiAgICAgICAgIGlmIHNlbGYuaWdub3JlX2xpbmUobGluZSk6CkBAIC0zODU0LDkgKzM4NjYsNiBAQAogICAgICAgICByZXR1cm4gbmFtZSwgRmFsc2UsIGt3YXJncwogCiAgICAgZGVmIHBhcnNlX3NwZWNpYWxfc3ltYm9sKHNlbGYsIHN5bWJvbCk6Ci0gICAgICAgIGlmIHNlbGYucGFyYW1ldGVyX3N0YXRlID09IHNlbGYucHNfc2Vlbl9zbGFzaDoKLSAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIHNwZWNpZmllcyAiICsgc3ltYm9sICsgIiBhZnRlciAvLCB3aGljaCBpcyB1bnN1cHBvcnRlZC4iKQotCiAgICAgICAgIGlmIHN5bWJvbCA9PSAnKic6CiAgICAgICAgICAgICBpZiBzZWxmLmtleXdvcmRfb25seToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiB1c2VzICcqJyBtb3JlIHRoYW4gb25jZS4iKQpAQCAtMzg4MywxMyArMzg5MiwxNSBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiBoYXMgYW4gdW5zdXBwb3J0ZWQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKFVuZXhwZWN0ZWQgc3RhdGUgIiArIHN0cihzZWxmLnBhcmFtZXRlcl9zdGF0ZSkgKyAiLmMpIikKICAgICAgICAgZWxpZiBzeW1ib2wgPT0gJy8nOgorICAgICAgICAgICAgaWYgc2VsZi5wb3NpdGlvbmFsX29ubHk6CisgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgdXNlcyAnLycgbW9yZSB0aGFuIG9uY2UuIikKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQogICAgICAgICAgICAgIyBwc19yZXF1aXJlZCBhbmQgcHNfb3B0aW9uYWwgYXJlIGFsbG93ZWQgaGVyZSwgdGhhdCBhbGxvd3MgcG9zaXRpb25hbC1vbmx5IHdpdGhvdXQgb3B0aW9uIGdyb3VwcwogICAgICAgICAgICAgIyB0byB3b3JrIChhbmQgaGF2ZSBkZWZhdWx0IHZhbHVlcyEpCiAgICAgICAgICAgICBpZiAoc2VsZi5wYXJhbWV0ZXJfc3RhdGUgbm90IGluIChzZWxmLnBzX3JlcXVpcmVkLCBzZWxmLnBzX29wdGlvbmFsLCBzZWxmLnBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgc2VsZi5wc19ncm91cF9iZWZvcmUpKSBvciBzZWxmLmdyb3VwOgogICAgICAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIGhhcyBhbiB1bnN1cHBvcnRlZCBncm91cCBjb25maWd1cmF0aW9uLiAoVW5leHBlY3RlZCBzdGF0ZSAiICsgc3RyKHNlbGYucGFyYW1ldGVyX3N0YXRlKSArICIuZCkiKQogICAgICAgICAgICAgaWYgc2VsZi5rZXl3b3JkX29ubHk6CiAgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgbWl4ZXMga2V5d29yZC1vbmx5IGFuZCBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycywgd2hpY2ggaXMgdW5zdXBwb3J0ZWQuIikKLSAgICAgICAgICAgIHNlbGYucGFyYW1ldGVyX3N0YXRlID0gc2VsZi5wc19zZWVuX3NsYXNoCiAgICAgICAgICAgICAjIGZpeHVwIHByZWNlZGluZyBwYXJhbWV0ZXJzCiAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmZ1bmN0aW9uLnBhcmFtZXRlcnMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgaWYgKHAua2luZCAhPSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09SX0tFWVdPUkQgYW5kIG5vdCBpc2luc3RhbmNlKHAuY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikpOgpAQCAtMzk3NywyMyArMzk4OCwyMCBAQAogICAgICAgICAjIHBvcHVsYXRlICJyaWdodF9icmFja2V0X2NvdW50IiBmaWVsZCBmb3IgZXZlcnkgcGFyYW1ldGVyCiAgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLCAiV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VsZiBwYXJhbWV0ZXIuICIgKyByZXByKGYpCiAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcmFtZXRlcnNbMF0uY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikKKyAgICAgICAgIyBzZWxmIGlzIGFsd2F5cyBwb3NpdGlvbmFsLW9ubHkuCisgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzWzBdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIHBhcmFtZXRlcnNbMF0ucmlnaHRfYnJhY2tldF9jb3VudCA9IDAKLSAgICAgICAgcGFyYW1ldGVyc19hZnRlcl9zZWxmID0gcGFyYW1ldGVyc1sxOl0KLSAgICAgICAgaWYgcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgIyBmb3Igbm93LCB0aGUgb25seSB3YXkgQ2xpbmljIHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAjIGlzIGlmIGFsbCBvZiB0aGVtIGFyZSBwb3NpdGlvbmFsLW9ubHkuLi4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgLi4uIGV4Y2VwdCBmb3Igc2VsZiEgIHNlbGYgaXMgYWx3YXlzIHBvc2l0aW9uYWwtb25seS4KLQotICAgICAgICAgICAgcG9zaXRpb25hbF9vbmx5X3BhcmFtZXRlcnMgPSBbcC5raW5kID09IGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSBmb3IgcCBpbiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZdCi0gICAgICAgICAgICBpZiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFk6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGFsbChwb3NpdGlvbmFsX29ubHlfcGFyYW1ldGVycykKLSAgICAgICAgICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKKyAgICAgICAgcG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQorICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzWzE6XToKKyAgICAgICAgICAgIGlmIG5vdCBwLmlzX3Bvc2l0aW9uYWxfb25seSgpOgorICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxfb25seSA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBwb3NpdGlvbmFsX29ubHkKKyAgICAgICAgICAgIGlmIHBvc2l0aW9uYWxfb25seToKKyAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBwdXQgYW55IHJpZ2h0IGJyYWNrZXRzIGFyb3VuZCBub24tcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMsIGV2ZXIuCi0gICAgICAgICAgICAgICAgZm9yIHAgaW4gcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCisgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gMAogCiAgICAgICAgIHJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkgYi9Ub29scy9mcmVlemUvZnJlZXplLnB5CmluZGV4IGMwNzU4MDcuLjM4OWZmZmQgMTAwNzU1Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKKysrIGIvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQpAQCAtMjE4LDcgKzIxOCw3IEBACiAgICAgaXNob21lID0gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHByZWZpeCwgJ1B5dGhvbicsICdjZXZhbC5jJykpCiAKICAgICAjIGxvY2F0aW9ucyBkZXJpdmVkIGZyb20gb3B0aW9ucwotICAgIHZlcnNpb24gPSBzeXMudmVyc2lvbls6M10KKyAgICB2ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgZmxhZ2dlZF92ZXJzaW9uID0gdmVyc2lvbiArIHN5cy5hYmlmbGFncwogICAgIGlmIHdpbjoKICAgICAgICAgZXh0ZW5zaW9uc19jID0gJ2Zyb3plbl9leHRlbnNpb25zLmMnCmRpZmYgLS1naXQgYS9Ub29scy9pMThuL3B5Z2V0dGV4dC5weSBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CmluZGV4IDNjNmMxNGMuLmJlOTQxYzcgMTAwNzU1Ci0tLSBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CisrKyBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CkBAIC0xNTYsNyArMTU2LDggQEAKICIiIikKIAogaW1wb3J0IG9zCi1pbXBvcnQgaW1wCitpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoraW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgogaW1wb3J0IHRpbWUKQEAgLTI2Myw4ICsyNjQsNyBAQAogICAgICMgZ2V0IGV4dGVuc2lvbiBmb3IgcHl0aG9uIHNvdXJjZSBmaWxlcwogICAgIGlmICdfcHlfZXh0JyBub3QgaW4gZ2xvYmFscygpOgogICAgICAgICBnbG9iYWwgX3B5X2V4dAotICAgICAgICBfcHlfZXh0ID0gW3RyaXBsZVswXSBmb3IgdHJpcGxlIGluIGltcC5nZXRfc3VmZml4ZXMoKQotICAgICAgICAgICAgICAgICAgIGlmIHRyaXBsZVsyXSA9PSBpbXAuUFlfU09VUkNFXVswXQorICAgICAgICBfcHlfZXh0ID0gaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVNbMF0KIAogICAgICMgZG9uJ3QgcmVjdXJzZSBpbnRvIENWUyBkaXJlY3RvcmllcwogICAgIGlmICdDVlMnIGluIG5hbWVzOgpAQCAtMjc3LDQ1ICsyNzcsNiBAQAogICAgICAgICApCiAKIAotZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgotICAgICIiIkdldCB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBhIG1vZHVsZSBvciBhIHBhY2thZ2UuCi0KLSAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggdG8gYSBmaWxlIGZvciBhIG1vZHVsZSwgYW5kIHRvIGEgZGlyZWN0b3J5IGZvcgotICAgIGEgcGFja2FnZS4gUmV0dXJuIE5vbmUgaWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvciBpcyBhIGJ1aWx0aW4gb3IKLSAgICBleHRlbnNpb24gbW9kdWxlLgotICAgICIiIgotICAgICMgc3BsaXQgb2ZmIHRvcC1tb3N0IG5hbWUKLSAgICBwYXJ0cyA9IGRvdHRlZF9uYW1lLnNwbGl0KCcuJywgMSkKLQotICAgIGlmIGxlbihwYXJ0cykgPiAxOgotICAgICAgICAjIHdlIGhhdmUgYSBkb3R0ZWQgcGF0aCwgaW1wb3J0IHRvcC1sZXZlbCBwYWNrYWdlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShwYXJ0c1swXSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOiBmaWxlLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICAjIGNoZWNrIGlmIGl0J3MgaW5kZWVkIGEgcGFja2FnZQotICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgICMgcmVjdXJzaXZlbHkgaGFuZGxlIHRoZSByZW1haW5pbmcgbmFtZSBwYXJ0cwotICAgICAgICAgICAgcGF0aG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKHBhcnRzWzFdLCBbcGF0aG5hbWVdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgZWxzZToKLSAgICAgICAgIyBwbGFpbiBuYW1lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZSgKLSAgICAgICAgICAgICAgICBkb3R0ZWRfbmFtZSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOgotICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQotICAgICAgICAgICAgaWYgZGVzY3JpcHRpb25bMl0gbm90IGluIFtpbXAuUFlfU09VUkNFLCBpbXAuUEtHX0RJUkVDVE9SWV06Ci0gICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQotCi0gICAgcmV0dXJuIHBhdGhuYW1lCi0KLQogZGVmIGdldEZpbGVzRm9yTmFtZShuYW1lKToKICAgICAiIiJHZXQgYSBsaXN0IG9mIG1vZHVsZSBmaWxlcyBmb3IgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLAogICAgIG9yIGEgZGlyZWN0b3J5LgpAQCAtMzMwLDcgKzI5MSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGxpc3QKIAogICAgICAgICAjIHRyeSB0byBmaW5kIG1vZHVsZSBvciBwYWNrYWdlCi0gICAgICAgIG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgICAgICAgICAgIG5hbWUgPSBzcGVjLm9yaWdpbgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBuYW1lID0gTm9uZQogICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIHJldHVybiBbXQogCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMgYi9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKaW5kZXggZmE3OWE4ZC4uODA0YWIwMSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCisrKyBiL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cwpAQCAtNjQsMTYgKzY0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIEtleT0iUHl0aG9uUGF0aCIgVHlwZT0ic3RyaW5nIiBWYWx1ZT0iW0xpYl07W0RMTHNdIiAvPgogICAgICAgICAgICAgICAgIDwvUmVnaXN0cnlLZXk+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzX1JFQURNRSIgRGlyZWN0b3J5PSJMaWJfc2l0ZV9wYWNrYWdlcyIgR3VpZD0iKiI+Ci0gICAgICAgICAgICAgICAgPEZpbGUgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzX1JFQURNRSIgTmFtZT0iUkVBRE1FLnR4dCIgU291cmNlPSIhKGJpbmRwYXRoLnNyYylMaWJcc2l0ZS1wYWNrYWdlc1xSRUFETUUiIEtleVBhdGg9InllcyIgLz4KLSAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlIiBEaXJlY3Rvcnk9IkxpYl9saWIydG8zIiBHdWlkPSIkKHZhci5SZW1vdmVMaWIydG8zUGlja2xlQ29tcG9uZW50R3VpZCkiPgogICAgICAgICAgICAgICAgIDxSZW1vdmVGaWxlIElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmVfZmlsZXMiIE5hbWU9IioucGlja2xlIiBPbj0idW5pbnN0YWxsIiAvPgogICAgICAgICAgICAgICAgIDxSZW1vdmVGb2xkZXIgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZV9mb2xkZXIiIE9uPSJ1bmluc3RhbGwiIC8+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgPC9Db21wb25lbnRHcm91cD4KLSAgICAgICAgPERpcmVjdG9yeVJlZiBJZD0iTGliIj4KLSAgICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzIiBOYW1lPSJzaXRlLXBhY2thZ2VzIiAvPgotICAgICAgICA8L0RpcmVjdG9yeVJlZj4KICAgICA8L0ZyYWdtZW50PgogPC9XaXg+CmRpZmYgLS1naXQgYS9Ub29scy9wYXJzZXIvdW5wYXJzZS5weSBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CmluZGV4IDI4NTAzMGUuLjcyMDMwNTcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CisrKyBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CkBAIC0zMjIsOSArMzIyLDcyIEBACiAgICAgZGVmIF9TdHIoc2VsZiwgdHJlZSk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0cmVlLnMpKQogCisgICAgZGVmIF9Kb2luZWRTdHIoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfSm9pbmVkU3RyKHQsIHN0cmluZy53cml0ZSkKKyAgICAgICAgc2VsZi53cml0ZShyZXByKHN0cmluZy5nZXR2YWx1ZSgpKSkKKworICAgIGRlZiBfRm9ybWF0dGVkVmFsdWUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfRm9ybWF0dGVkVmFsdWUodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9mc3RyaW5nX0pvaW5lZFN0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIGZvciB2YWx1ZSBpbiB0LnZhbHVlczoKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICJfZnN0cmluZ18iICsgdHlwZSh2YWx1ZSkuX19uYW1lX18pCisgICAgICAgICAgICBtZXRoKHZhbHVlLCB3cml0ZSkKKworICAgIGRlZiBfZnN0cmluZ19TdHIoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICB2YWx1ZSA9IHQucy5yZXBsYWNlKCJ7IiwgInt7IikucmVwbGFjZSgifSIsICJ9fSIpCisgICAgICAgIHdyaXRlKHZhbHVlKQorCisgICAgZGVmIF9mc3RyaW5nX0NvbnN0YW50KHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodC52YWx1ZSwgc3RyKQorICAgICAgICB2YWx1ZSA9IHQudmFsdWUucmVwbGFjZSgieyIsICJ7eyIpLnJlcGxhY2UoIn0iLCAifX0iKQorICAgICAgICB3cml0ZSh2YWx1ZSkKKworICAgIGRlZiBfZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHdyaXRlKCJ7IikKKyAgICAgICAgZXhwciA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgVW5wYXJzZXIodC52YWx1ZSwgZXhwcikKKyAgICAgICAgZXhwciA9IGV4cHIuZ2V0dmFsdWUoKS5yc3RyaXAoIlxuIikKKyAgICAgICAgaWYgZXhwci5zdGFydHN3aXRoKCJ7Iik6CisgICAgICAgICAgICB3cml0ZSgiICIpICAjIFNlcGFyYXRlIHBhaXIgb2Ygb3BlbmluZyBicmFja2V0cyBhcyAieyB7IgorICAgICAgICB3cml0ZShleHByKQorICAgICAgICBpZiB0LmNvbnZlcnNpb24gIT0gLTE6CisgICAgICAgICAgICBjb252ZXJzaW9uID0gY2hyKHQuY29udmVyc2lvbikKKyAgICAgICAgICAgIGFzc2VydCBjb252ZXJzaW9uIGluICJzcmEiCisgICAgICAgICAgICB3cml0ZShmIiF7Y29udmVyc2lvbn0iKQorICAgICAgICBpZiB0LmZvcm1hdF9zcGVjOgorICAgICAgICAgICAgd3JpdGUoIjoiKQorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHQuZm9ybWF0X3NwZWMpLl9fbmFtZV9fKQorICAgICAgICAgICAgbWV0aCh0LmZvcm1hdF9zcGVjLCB3cml0ZSkKKyAgICAgICAgd3JpdGUoIn0iKQorCiAgICAgZGVmIF9OYW1lKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKHQuaWQpCiAKKyAgICBkZWYgX3dyaXRlX2NvbnN0YW50KHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGZsb2F0LCBjb21wbGV4KSk6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpLnJlcGxhY2UoImluZiIsIElORlNUUikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpKQorCisgICAgZGVmIF9Db25zdGFudChzZWxmLCB0KToKKyAgICAgICAgdmFsdWUgPSB0LnZhbHVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIigiKQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2NvbnN0YW50KHZhbHVlWzBdKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnRlcmxlYXZlKGxhbWJkYTogc2VsZi53cml0ZSgiLCAiKSwgc2VsZi5fd3JpdGVfY29uc3RhbnQsIHZhbHVlKQorICAgICAgICAgICAgc2VsZi53cml0ZSgiKSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9jb25zdGFudCh0LnZhbHVlKQorCiAgICAgZGVmIF9OYW1lQ29uc3RhbnQoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0LnZhbHVlKSkKIApAQCAtNDEzLDcgKzQ3Niw3IEBACiAgICAgZGVmIF9UdXBsZShzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSgiKCIpCiAgICAgICAgIGlmIGxlbih0LmVsdHMpID09IDE6Ci0gICAgICAgICAgICAoZWx0LCkgPSB0LmVsdHMKKyAgICAgICAgICAgIGVsdCA9IHQuZWx0c1swXQogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChlbHQpCiAgICAgICAgICAgICBzZWxmLndyaXRlKCIsIikKICAgICAgICAgZWxzZToKQEAgLTQ2MCw3ICs1MjMsOCBAQAogICAgICAgICAjIFNwZWNpYWwgY2FzZTogMy5fX2Fic19fKCkgaXMgYSBzeW50YXggZXJyb3IsIHNvIGlmIHQudmFsdWUKICAgICAgICAgIyBpcyBhbiBpbnRlZ2VyIGxpdGVyYWwgdGhlbiB3ZSBuZWVkIHRvIGVpdGhlciBwYXJlbnRoZXNpemUKICAgICAgICAgIyBpdCBvciBhZGQgYW4gZXh0cmEgc3BhY2UgdG8gZ2V0IDMgLl9fYWJzX18oKS4KLSAgICAgICAgaWYgaXNpbnN0YW5jZSh0LnZhbHVlLCBhc3QuTnVtKSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLm4sIGludCk6CisgICAgICAgIGlmICgoaXNpbnN0YW5jZSh0LnZhbHVlLCBhc3QuTnVtKSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLm4sIGludCkpCisgICAgICAgICAgIG9yIChpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5Db25zdGFudCkgYW5kIGlzaW5zdGFuY2UodC52YWx1ZS52YWx1ZSwgaW50KSkpOgogICAgICAgICAgICAgc2VsZi53cml0ZSgiICIpCiAgICAgICAgIHNlbGYud3JpdGUoIi4iKQogICAgICAgICBzZWxmLndyaXRlKHQuYXR0cikKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkgYi9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CmluZGV4IGUxMGU0OWEuLjdjYTk1MjYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQpAQCAtNiw3ICs2LDcgQEAKIEEgaGVscGVyIGZvciBhbmFseXppbmcgUFlUSE9ORFVNUFJFRlMgb3V0cHV0LgogCiBXaGVuIHRoZSBQWVRIT05EVU1QUkVGUyBlbnZhciBpcyBzZXQgaW4gYSBkZWJ1ZyBidWlsZCwgYXQgUHl0aG9uIHNodXRkb3duCi10aW1lIFB5X0ZpbmFsaXplKCkgcHJpbnRzIHRoZSBsaXN0IG9mIGFsbCBsaXZlIG9iamVjdHMgdHdpY2U6ICBmaXJzdCBpdAordGltZSBQeV9GaW5hbGl6ZUV4KCkgcHJpbnRzIHRoZSBsaXN0IG9mIGFsbCBsaXZlIG9iamVjdHMgdHdpY2U6ICBmaXJzdCBpdAogcHJpbnRzIHRoZSByZXByKCkgb2YgZWFjaCBvYmplY3Qgd2hpbGUgdGhlIGludGVycHJldGVyIGlzIHN0aWxsIGZ1bGx5IGludGFjdC4KIEFmdGVyIGNsZWFuaW5nIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuLCBpdCBwcmludHMgYWxsIHJlbWFpbmluZyBsaXZlIG9iamVjdHMKIGFnYWluLCBidXQgdGhlIHNlY29uZCB0aW1lIGp1c3QgcHJpbnRzIHRoZWlyIGFkZHJlc3NlcywgcmVmY291bnRzLCBhbmQgdHlwZQpAQCAtNDEsNyArNDEsNyBAQAogb2JqZWN0cyBzaG93biBpbiB0aGUgcmVwcjogIHRoZSByZXByIHdhcyBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBvdXRwdXQgYmxvY2ssCiBhbmQgc29tZSBvZiB0aGUgY29udGFpbmVlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHNpbmNlIHRoZW4uICBGb3IgZXhhbXBsZSwKIGl0J3MgY29tbW9uIGZvciB0aGUgbGluZSBzaG93aW5nIHRoZSBkaWN0IG9mIGludGVybmVkIHN0cmluZ3MgdG8gZGlzcGxheQotc3RyaW5ncyB0aGF0IG5vIGxvbmdlciBleGlzdCBhdCB0aGUgZW5kIG9mIFB5X0ZpbmFsaXplOyB0aGlzIGNhbiBiZSByZWNvZ25pemVkCitzdHJpbmdzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoZSBlbmQgb2YgUHlfRmluYWxpemVFeDsgdGhpcyBjYW4gYmUgcmVjb2duaXplZAogKGFsYmVpdCBwYWluZnVsbHkpIGJlY2F1c2Ugc3VjaCBjb250YWluZWVzIGRvbid0IGhhdmUgYSBsaW5lIG9mIHRoZWlyIG93bi4KIAogVGhlIG9iamVjdHMgYXJlIGxpc3RlZCBpbiBhbGxvY2F0aW9uIG9yZGVyLCB3aXRoIG1vc3QtcmVjZW50bHkgYWxsb2NhdGVkCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2RpZmYucHkgYi9Ub29scy9zY3JpcHRzL2RpZmYucHkKaW5kZXggOTcyMGE0My4uOTYxOTliOCAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9kaWZmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvZGlmZi5weQpAQCAtOCw3ICs4LDcgQEAKIAogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCB0aW1lLCBkaWZmbGliLCBhcmdwYXJzZQoraW1wb3J0IHN5cywgb3MsIGRpZmZsaWIsIGFyZ3BhcnNlCiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmUKIAogZGVmIGZpbGVfbXRpbWUocGF0aCk6CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lkbGUzIGIvVG9vbHMvc2NyaXB0cy9pZGxlMwppbmRleCA4ZWU5MmMyLi5kNzMzMmJjIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lkbGUzCisrKyBiL1Rvb2xzL3NjcmlwdHMvaWRsZTMKQEAgLTEsNSArMSw1IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgbWFpbgorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IG1haW4KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL25tMmRlZi5weSBiL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CmluZGV4IDhmMDc1NTkuLjgzYmJjZDcgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CkBAIC0zNiw4ICszNiw4IEBACiAiIiIKIGltcG9ydCBvcywgc3lzCiAKLVBZVEhPTkxJQiA9ICdsaWJweXRob24nK3N5cy52ZXJzaW9uWzozXSsnLmEnCi1QQ19QWVRIT05MSUIgPSAnUHl0aG9uJytzeXMudmVyc2lvblswXStzeXMudmVyc2lvblsyXSsnLmRsbCcKK1BZVEhPTkxJQiA9ICdsaWJweXRob24lZC4lZC5hJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCitQQ19QWVRIT05MSUIgPSAnUHl0aG9uJWQlZC5kbGwnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIE5NID0gJ25tIC1wIC1nICVzJyAgICAgICAgICAgICAgICAgICAgICAjIEZvciBMaW51eCwgdXNlICJubSAtZyAlcyIKIAogZGVmIHN5bWJvbHMobGliPVBZVEhPTkxJQix0eXBlcz0oJ1QnLCdDJywnRCcpKToKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvcHl2ZW52IGIvVG9vbHMvc2NyaXB0cy9weXZlbnYKaW5kZXggOTc4ZDY5MS4uMWZiNDJjNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9weXZlbnYKKysrIGIvVG9vbHMvc2NyaXB0cy9weXZlbnYKQEAgLTEsNiArMSwxMiBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IHBhdGhsaWIKKworICAgIGV4ZWN1dGFibGUgPSBwYXRobGliLlBhdGgoc3lzLmV4ZWN1dGFibGUgb3IgJ3B5dGhvbjMnKS5uYW1lCisgICAgcHJpbnQoJ1dBUk5JTkc6IHRoZSBweWVudiBzY3JpcHQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgJworICAgICAgICAgIGYnYHtleGVjdXRhYmxlfSAtbSB2ZW52YCcsIGZpbGU9c3lzLnN0ZGVycikKKwogICAgIHJjID0gMQogICAgIHRyeToKICAgICAgICAgaW1wb3J0IHZlbnYKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBjODkyYTk5Li43YjAyNTMwIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xLDYgKzEsNiBAQAogIyEgL2Jpbi9zaAogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIHB5dGhvbiAzLjUuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNi4KICMKICMgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvPi4KICMKQEAgLTU4MCw4ICs1ODAsOCBAQAogIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCiBQQUNLQUdFX05BTUU9J3B5dGhvbicKIFBBQ0tBR0VfVEFSTkFNRT0ncHl0aG9uJwotUEFDS0FHRV9WRVJTSU9OPSczLjUnCi1QQUNLQUdFX1NUUklORz0ncHl0aG9uIDMuNScKK1BBQ0tBR0VfVkVSU0lPTj0nMy42JworUEFDS0FHRV9TVFJJTkc9J3B5dGhvbiAzLjYnCiBQQUNLQUdFX0JVR1JFUE9SVD0naHR0cDovL2J1Z3MucHl0aG9uLm9yZy8nCiBQQUNLQUdFX1VSTD0nJwogCkBAIC03MDQsNiArNzA0LDcgQEAKIEJVSUxERVhFRVhUCiBFR1JFUAogTk9fQVNfTkVFREVECitNVUxUSUFSQ0hfQ1BQRkxBR1MKIFBMQVRGT1JNX1RSSVBMRVQKIFBMQVRESVIKIE1VTFRJQVJDSApAQCAtNzc2LDYgKzc3Nyw3IEBACiBkb2NkaXIKIG9sZGluY2x1ZGVkaXIKIGluY2x1ZGVkaXIKK3J1bnN0YXRlZGlyCiBsb2NhbHN0YXRlZGlyCiBzaGFyZWRzdGF0ZWRpcgogc3lzY29uZmRpcgpAQCAtODg2LDYgKzg4OCw3IEBACiBzeXNjb25mZGlyPScke3ByZWZpeH0vZXRjJwogc2hhcmVkc3RhdGVkaXI9JyR7cHJlZml4fS9jb20nCiBsb2NhbHN0YXRlZGlyPScke3ByZWZpeH0vdmFyJworcnVuc3RhdGVkaXI9JyR7bG9jYWxzdGF0ZWRpcn0vcnVuJwogaW5jbHVkZWRpcj0nJHtwcmVmaXh9L2luY2x1ZGUnCiBvbGRpbmNsdWRlZGlyPScvdXNyL2luY2x1ZGUnCiBkb2NkaXI9JyR7ZGF0YXJvb3RkaXJ9L2RvYy8ke1BBQ0tBR0VfVEFSTkFNRX0nCkBAIC0xMTM4LDYgKzExNDEsMTUgQEAKICAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwpCiAgICAgc2lsZW50PXllcyA7OwogCisgIC1ydW5zdGF0ZWRpciB8IC0tcnVuc3RhdGVkaXIgfCAtLXJ1bnN0YXRlZGkgfCAtLXJ1bnN0YXRlZCBcCisgIHwgLS1ydW5zdGF0ZSB8IC0tcnVuc3RhdCB8IC0tcnVuc3RhIHwgLS1ydW5zdCB8IC0tcnVucyBcCisgIHwgLS1ydW4gfCAtLXJ1IHwgLS1yKQorICAgIGFjX3ByZXY9cnVuc3RhdGVkaXIgOzsKKyAgLXJ1bnN0YXRlZGlyPSogfCAtLXJ1bnN0YXRlZGlyPSogfCAtLXJ1bnN0YXRlZGk9KiB8IC0tcnVuc3RhdGVkPSogXAorICB8IC0tcnVuc3RhdGU9KiB8IC0tcnVuc3RhdD0qIHwgLS1ydW5zdGE9KiB8IC0tcnVuc3Q9KiB8IC0tcnVucz0qIFwKKyAgfCAtLXJ1bj0qIHwgLS1ydT0qIHwgLS1yPSopCisgICAgcnVuc3RhdGVkaXI9JGFjX29wdGFyZyA7OworCiAgIC1zYmluZGlyIHwgLS1zYmluZGlyIHwgLS1zYmluZGkgfCAtLXNiaW5kIHwgLS1zYmluIHwgLS1zYmkgfCAtLXNiKQogICAgIGFjX3ByZXY9c2JpbmRpciA7OwogICAtc2JpbmRpcj0qIHwgLS1zYmluZGlyPSogfCAtLXNiaW5kaT0qIHwgLS1zYmluZD0qIHwgLS1zYmluPSogXApAQCAtMTI3NSw3ICsxMjg3LDcgQEAKIGZvciBhY192YXIgaW4JZXhlY19wcmVmaXggcHJlZml4IGJpbmRpciBzYmluZGlyIGxpYmV4ZWNkaXIgZGF0YXJvb3RkaXIgXAogCQlkYXRhZGlyIHN5c2NvbmZkaXIgc2hhcmVkc3RhdGVkaXIgbG9jYWxzdGF0ZWRpciBpbmNsdWRlZGlyIFwKIAkJb2xkaW5jbHVkZWRpciBkb2NkaXIgaW5mb2RpciBodG1sZGlyIGR2aWRpciBwZGZkaXIgcHNkaXIgXAotCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpcgorCQlsaWJkaXIgbG9jYWxlZGlyIG1hbmRpciBydW5zdGF0ZWRpcgogZG8KICAgZXZhbCBhY192YWw9XCQkYWNfdmFyCiAgICMgUmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMuCkBAIC0xMzg4LDcgKzE0MDAsNyBAQAogICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KICAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgogICBjYXQgPDxfQUNFT0YKLVxgY29uZmlndXJlJyBjb25maWd1cmVzIHB5dGhvbiAzLjUgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgorXGBjb25maWd1cmUnIGNvbmZpZ3VyZXMgcHl0aG9uIDMuNiB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCiAKIFVzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgogCkBAIC0xNDI4LDYgKzE0NDAsNyBAQAogICAtLXN5c2NvbmZkaXI9RElSICAgICAgICByZWFkLW9ubHkgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL2V0Y10KICAgLS1zaGFyZWRzdGF0ZWRpcj1ESVIgICAgbW9kaWZpYWJsZSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbUFJFRklYL2NvbV0KICAgLS1sb2NhbHN0YXRlZGlyPURJUiAgICAgbW9kaWZpYWJsZSBzaW5nbGUtbWFjaGluZSBkYXRhIFtQUkVGSVgvdmFyXQorICAtLXJ1bnN0YXRlZGlyPURJUiAgICAgICBtb2RpZmlhYmxlIHBlci1wcm9jZXNzIGRhdGEgW0xPQ0FMU1RBVEVESVIvcnVuXQogICAtLWxpYmRpcj1ESVIgICAgICAgICAgICBvYmplY3QgY29kZSBsaWJyYXJpZXMgW0VQUkVGSVgvbGliXQogICAtLWluY2x1ZGVkaXI9RElSICAgICAgICBDIGhlYWRlciBmaWxlcyBbUFJFRklYL2luY2x1ZGVdCiAgIC0tb2xkaW5jbHVkZWRpcj1ESVIgICAgIEMgaGVhZGVyIGZpbGVzIGZvciBub24tZ2NjIFsvdXNyL2luY2x1ZGVdCkBAIC0xNDUzLDcgKzE0NjYsNyBAQAogCiBpZiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIjsgdGhlbgogICBjYXNlICRhY19pbml0X2hlbHAgaW4KLSAgICAgc2hvcnQgfCByZWN1cnNpdmUgKSBlY2hvICJDb25maWd1cmF0aW9uIG9mIHB5dGhvbiAzLjU6Ijs7CisgICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBweXRob24gMy42OiI7OwogICAgZXNhYwogICBjYXQgPDxcX0FDRU9GCiAKQEAgLTE2MTAsNyArMTYyMyw3IEBACiB0ZXN0IC1uICIkYWNfaW5pdF9oZWxwIiAmJiBleGl0ICRhY19zdGF0dXMKIGlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KICAgY2F0IDw8XF9BQ0VPRgotcHl0aG9uIGNvbmZpZ3VyZSAzLjUKK3B5dGhvbiBjb25maWd1cmUgMy42CiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkKIAogQ29weXJpZ2h0IChDKSAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpAQCAtMjQ0OSw3ICsyNDYyLDcgQEAKIFRoaXMgZmlsZSBjb250YWlucyBhbnkgbWVzc2FnZXMgcHJvZHVjZWQgYnkgY29tcGlsZXJzIHdoaWxlCiBydW5uaW5nIGNvbmZpZ3VyZSwgdG8gYWlkIGRlYnVnZ2luZyBpZiBjb25maWd1cmUgbWFrZXMgYSBtaXN0YWtlLgogCi1JdCB3YXMgY3JlYXRlZCBieSBweXRob24gJGFzX21lIDMuNSwgd2hpY2ggd2FzCitJdCB3YXMgY3JlYXRlZCBieSBweXRob24gJGFzX21lIDMuNiwgd2hpY2ggd2FzCiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICAkICQwICRACkBAIC0zMDIzLDcgKzMwMzYsNyBAQAogbXYgY29uZmRlZnMuaC5uZXcgY29uZmRlZnMuaAogCiAKLVZFUlNJT049My41CitWRVJTSU9OPTMuNgogCiAjIFZlcnNpb24gbnVtYmVyIG9mIFB5dGhvbidzIG93biBzaGFyZWQgbGlicmFyeSBmaWxlLgogCkBAIC01MzMyLDkgKzUzNDUsMTYgQEAKICAgICBhc19mbl9lcnJvciAkPyAiaW50ZXJuYWwgY29uZmlndXJlIGVycm9yIGZvciB0aGUgcGxhdGZvcm0gdHJpcGxldCwgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IiAiJExJTkVOTyIgNQogICBmaQogZmkKLVBMQVRESVI9cGxhdC0kTUFDSERFUAoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIFBMQVRESVI9cGxhdC0kTUFDSERFUAorZWxzZQorICBQTEFURElSPXBsYXQtJFBMQVRGT1JNX1RSSVBMRVQKK2ZpCiAKIAoraWYgdGVzdCB4JE1VTFRJQVJDSCAhPSB4OyB0aGVuCisgIE1VTFRJQVJDSF9DUFBGTEFHUz0iLURNVUxUSUFSQ0g9XFxcIiRNVUxUSUFSQ0hcXFwiIgorZmkKIAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtV2wsLS1uby1hcy1uZWVkZWQiID4mNQpAQCAtNzk5Nyw2ICs4MDE3LDExIEBACiAgIHVzZV9sZnM9bm8KIGZpCiAKKyMgRG9uJ3QgdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGZvciBHTlUvSHVyZAorY2FzZSAkYWNfc3lzX3N5c3RlbSBpbiBHTlUqKQorICB1c2VfbGZzPW5vCitlc2FjCisKIGlmIHRlc3QgIiR1c2VfbGZzIiA9ICJ5ZXMiOyB0aGVuCiAjIFR3byBkZWZpbmVzIG5lZWRlZCB0byBlbmFibGUgbGFyZ2VmaWxlIHN1cHBvcnQgb24gdmFyaW91cyBwbGF0Zm9ybXMKICMgVGhlc2UgbWF5IGFmZmVjdCBzb21lIHR5cGVkZWZzCkBAIC0xMjkxOSw2ICsxMjk0NCwzMyBAQAogCiBmaQogCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBwYXNzd2QiICJwd19nZWNvcyIgImFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X2dlY29zIiAiCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X2dlY29zIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1BBU1NXRF9QV19HRUNPUyAxCitfQUNFT0YKKworCitmaQorYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3QgcGFzc3dkIiAicHdfcGFzc3dkIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9wYXNzd2RfcHdfcGFzc3dkIiAiCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X3Bhc3N3ZCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dEIDEKK19BQ0VPRgorCisKK2ZpCisKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUuLi4gIiA+JjY7IH0KQEAgLTE0MjI5LDYgKzE0MjgxLDg1IEBACiAKIGZpCiAKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTEFaWSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0xBWlkiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTEFaWSIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTEFaWSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9XIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9XIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PVyIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9XICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9HTE9CQUwiICJhY19jdl9oYXZlX2RlY2xfUlRMRF9HTE9CQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfR0xPQkFMIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9HTE9CQUwgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX0xPQ0FMIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX0xPQ0FMICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9OT0RFTEVURSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9MT0FEIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9MT0FEIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PTE9BRCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9MT0FEICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9ERUVQQklORCIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9ERUVQQklORCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworCiAjIGRldGVybWluZSB3aGF0IHNpemUgZGlnaXQgdG8gdXNlIGZvciBQeXRob24ncyBsb25ncwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncy4uLiAiID4mNjsgfQpAQCAtMTQ2NjIsNyArMTQ3OTMsMTEgQEAKICRhc19lY2hvICIkTERWRVJTSU9OIiA+JjY7IH0KIAogCi1MSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2Vsc2UKKyAgTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0tJHtQTEFURk9STV9UUklQTEVUfSIKK2ZpCiAKIAogIyBDaGVjayB3aGV0aGVyIHJpZ2h0IHNoaWZ0aW5nIGEgbmVnYXRpdmUgaW50ZWdlciBleHRlbmRzIHRoZSBzaWduIGJpdApAQCAtMTY5MDQsNyArMTcwMzksNyBAQAogIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCiAjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgogYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjUsIHdoaWNoIHdhcworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBweXRob24gJGFzX21lIDMuNiwgd2hpY2ggd2FzCiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCkBAIC0xNjk2Niw3ICsxNzEwMSw3IEBACiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIGFjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCiBhY19jc192ZXJzaW9uPSJcXAotcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy41CitweXRob24gY29uZmlnLnN0YXR1cyAzLjYKIGNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSwKICAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCAxYzA3YzA1Li4zOWQxMmU5IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0zLDcgKzMsNyBAQAogZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICMgU2V0IFZFUlNJT04gc28gd2Ugb25seSBuZWVkIHRvIGVkaXQgaW4gb25lIHBsYWNlIChpLmUuLCBoZXJlKQotbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjUpCittNF9kZWZpbmUoUFlUSE9OX1ZFUlNJT04sIDMuNikKIAogQUNfUFJFUkVRKDIuNjUpCiAKQEAgLTg3MiwxMCArODcyLDE3IEBACiAgICAgQUNfTVNHX0VSUk9SKFtpbnRlcm5hbCBjb25maWd1cmUgZXJyb3IgZm9yIHRoZSBwbGF0Zm9ybSB0cmlwbGV0LCBwbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnRdKQogICBmaQogZmkKLVBMQVRESVI9cGxhdC0kTUFDSERFUAoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIFBMQVRESVI9cGxhdC0kTUFDSERFUAorZWxzZQorICBQTEFURElSPXBsYXQtJFBMQVRGT1JNX1RSSVBMRVQKK2ZpCiBBQ19TVUJTVChQTEFURElSKQogQUNfU1VCU1QoUExBVEZPUk1fVFJJUExFVCkKLQoraWYgdGVzdCB4JE1VTFRJQVJDSCAhPSB4OyB0aGVuCisgIE1VTFRJQVJDSF9DUFBGTEFHUz0iLURNVUxUSUFSQ0g9XFxcIiRNVUxUSUFSQ0hcXFwiIgorZmkKK0FDX1NVQlNUKE1VTFRJQVJDSF9DUFBGTEFHUykKIAogQUNfTVNHX0NIRUNLSU5HKFtmb3IgLVdsLC0tbm8tYXMtbmVlZGVkXSkKIHNhdmVfTERGTEFHUz0iJExERkxBR1MiCkBAIC0xOTc5LDYgKzE5ODYsMTEgQEAKICAgdXNlX2xmcz1ubwogZmkKIAorIyBEb24ndCB1c2UgbGFyZ2VmaWxlIHN1cHBvcnQgZm9yIEdOVS9IdXJkCitjYXNlICRhY19zeXNfc3lzdGVtIGluIEdOVSopCisgIHVzZV9sZnM9bm8KK2VzYWMKKwogaWYgdGVzdCAiJHVzZV9sZnMiID0gInllcyI7IHRoZW4KICMgVHdvIGRlZmluZXMgbmVlZGVkIHRvIGVuYWJsZSBsYXJnZWZpbGUgc3VwcG9ydCBvbiB2YXJpb3VzIHBsYXRmb3JtcwogIyBUaGVzZSBtYXkgYWZmZWN0IHNvbWUgdHlwZWRlZnMKQEAgLTM3NjIsNiArMzc3NCwxMCBAQAogQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfZ2VuXSkKIEFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2JpcnRodGltZV0pCiBBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9ibG9ja3NdKQorQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHBhc3N3ZC5wd19nZWNvcywgc3RydWN0IHBhc3N3ZC5wd19wYXNzd2RdLCBbXSwgW10sIFtbCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorXV0pCiAKIEFDX01TR19DSEVDS0lORyhmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lKQogQUNfQ0FDSEVfVkFMKGFjX2N2X2hlYWRlcl90aW1lX2FsdHpvbmUsWwpAQCAtNDMzOCw2ICs0MzU0LDggQEAKICAgW2RlZmluZSB0byAxIGlmIHlvdXIgc2VtX2dldHZhbHVlIGlzIGJyb2tlbi5dKQogZmkKIAorQUNfQ0hFQ0tfREVDTFMoW1JUTERfTEFaWSwgUlRMRF9OT1csIFJUTERfR0xPQkFMLCBSVExEX0xPQ0FMLCBSVExEX05PREVMRVRFLCBSVExEX05PTE9BRCwgUlRMRF9ERUVQQklORF0sIFtdLCBbXSwgW1sjaW5jbHVkZSA8ZGxmY24uaD5dXSkKKwogIyBkZXRlcm1pbmUgd2hhdCBzaXplIGRpZ2l0IHRvIHVzZSBmb3IgUHl0aG9uJ3MgbG9uZ3MKIEFDX01TR19DSEVDS0lORyhbZGlnaXQgc2l6ZSBmb3IgUHl0aG9uJ3MgbG9uZ3NdKQogQUNfQVJHX0VOQUJMRShiaWctZGlnaXRzLApAQCAtNDQ1Niw3ICs0NDc0LDExIEBACiAKIGRubCBkZWZpbmUgTElCUEwgYWZ0ZXIgQUJJRkxBR1MgYW5kIExEVkVSU0lPTiBpcyBkZWZpbmVkLgogQUNfU1VCU1QoUFlfRU5BQkxFX1NIQVJFRCkKLUxJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIExJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059IgorZWxzZQorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfS0ke1BMQVRGT1JNX1RSSVBMRVR9IgorZmkKIEFDX1NVQlNUKExJQlBMKQogCiAjIENoZWNrIHdoZXRoZXIgcmlnaHQgc2hpZnRpbmcgYSBuZWdhdGl2ZSBpbnRlZ2VyIGV4dGVuZHMgdGhlIHNpZ24gYml0CmRpZmYgLS1naXQgYS9weWNvbmZpZy5oLmluIGIvcHljb25maWcuaC5pbgppbmRleCA3ODk1NTM1Li5lYWVlMTZmIDEwMDY0NAotLS0gYS9weWNvbmZpZy5oLmluCisrKyBiL3B5Y29uZmlnLmguaW4KQEAgLTE2Nyw2ICsxNjcsMzQgQEAKICAgICovCiAjdW5kZWYgSEFWRV9ERUNMX0lTTkFOCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9ERUVQQklORCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfREVFUEJJTkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX0dMT0JBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfR0xPQkFMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MQVpZJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9MQVpZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MT0NBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTE9DQUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PREVMRVRFJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfTk9MT0FEJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0xPQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PVycsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTk9XCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgdHpuYW1lJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgogICAgKi8KICN1bmRlZiBIQVZFX0RFQ0xfVFpOQU1FCkBAIC05MTksNiArOTQ3LDEyIEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9TVFJPUFRTX0gKIAorLyogRGVmaW5lIHRvIDEgaWYgYHB3X2dlY29zJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHBhc3N3ZCcuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TCisKKy8qIERlZmluZSB0byAxIGlmIGBwd19wYXNzd2QnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgcGFzc3dkJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dECisKIC8qIERlZmluZSB0byAxIGlmIGBzdF9iaXJ0aHRpbWUnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCiAjdW5kZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CSVJUSFRJTUUKIApkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCAxNzRjZTcyLi4wMDZlY2RkIDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtMjAwNyw3ICsyMDA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGZmaV9saWIgPSBOb25lCiAgICAgICAgIGlmIGZmaV9pbmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBmb3IgbGliX25hbWUgaW4gKCdmZmlfY29udmVuaWVuY2UnLCAnZmZpX3BpYycsICdmZmknKToKKyAgICAgICAgICAgIGZvciBsaWJfbmFtZSBpbiAoJ2ZmaScsICdmZmlfcGljJyk6CiAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIGxpYl9uYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgIGZmaV9saWIgPSBsaWJfbmFtZQogICAgICAgICAgICAgICAgICAgICBicmVhawpAQCAtMjA2MCw3ICsyMDYwLDcgQEAKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL2ZudC5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL2ZvdXJzdGVwLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvaW8uaCcsCi0gICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuaCcsCisgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9tcGFsbG9jLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbnVtYmVydGhlb3J5LmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvc2l4c3RlcC5oJywKQEAgLTIyNTUsNyArMjI1NSw3IEBACiAgICAgc2V0dXAoIyBQeVBJIE1ldGFkYXRhIChQRVAgMzAxKQogICAgICAgICAgIG5hbWUgPSAiUHl0aG9uIiwKICAgICAgICAgICB2ZXJzaW9uID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXSwKLSAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyVzIiAlIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyVkLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgIG1haW50YWluZXIgPSAiR3VpZG8gdmFuIFJvc3N1bSBhbmQgdGhlIFB5dGhvbiBjb21tdW5pdHkiLAogICAgICAgICAgIG1haW50YWluZXJfZW1haWwgPSAicHl0aG9uLWRldkBweXRob24ub3JnIiwKICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJBIGhpZ2gtbGV2ZWwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlIiwK